[med-svn] [mypy] 02/06: New upstream version 0.470-complete
Michael Crusoe
misterc-guest at moszumanska.debian.org
Thu Feb 2 08:22:55 UTC 2017
This is an automated email from the git hooks/post-receive script.
misterc-guest pushed a commit to branch master
in repository mypy.
commit 51ba11b4ca96939e5ae8d1f10f61da6722b79de9
Author: Michael R. Crusoe <michael.crusoe at gmail.com>
Date: Wed Feb 1 00:51:35 2017 -0800
New upstream version 0.470-complete
---
.gitignore | 29 -
.gitmodules | 3 -
.travis.yml | 20 -
CONTRIBUTING.md | 152 -
CREDITS | 101 -
LICENSE | 228 --
PKG-INFO | 30 +
README.md | 307 --
appveyor.yml | 32 -
build-requirements.txt | 2 -
conftest.py | 4 -
docs/Makefile | 177 -
docs/README.md | 49 -
docs/make.bat | 242 --
docs/requirements-docs.txt | 2 -
docs/source/additional_features.rst | 9 -
docs/source/basics.rst | 194 --
docs/source/builtin_types.rst | 37 -
docs/source/casts.rst | 39 -
docs/source/cheat_sheet.rst | 241 --
docs/source/cheat_sheet_py3.rst | 288 --
docs/source/class_basics.rst | 157 -
docs/source/command_line.rst | 402 ---
docs/source/common_issues.rst | 386 ---
docs/source/conf.py | 268 --
docs/source/config_file.rst | 184 --
docs/source/duck_type_compatibility.rst | 40 -
docs/source/dynamic_typing.rst | 86 -
docs/source/faq.rst | 270 --
docs/source/function_overloading.rst | 60 -
docs/source/generics.rst | 390 ---
docs/source/getting_started.rst | 24 -
docs/source/index.rst | 42 -
docs/source/introduction.rst | 30 -
docs/source/kinds_of_types.rst | 1002 ------
docs/source/python2.rst | 136 -
docs/source/python36.rst | 100 -
docs/source/revision_history.rst | 176 -
docs/source/supported_python_features.rst | 20 -
docs/source/type_inference_and_annotations.rst | 172 -
extensions/README.md | 6 -
extensions/mypy_extensions.py | 97 -
extensions/setup.py | 44 -
lib-typing/2.7/setup.py | 46 -
lib-typing/2.7/test_typing.py | 1629 ----------
lib-typing/2.7/typing.py | 2016 ------------
lib-typing/3.2/test_typing.py | 2063 ------------
lib-typing/3.2/typing.py | 2160 -------------
misc/actions_stubs.py | 111 -
misc/analyze_cache.py | 189 --
misc/async_matrix.py | 120 -
misc/fix_annotate.py | 219 --
misc/incremental_checker.py | 356 --
misc/macs.el | 22 -
misc/perf_checker.py | 93 -
misc/remove-eol-whitespace.sh | 8 -
misc/test_case_to_actual.py | 71 -
misc/touch_checker.py | 151 -
misc/variadics.py | 54 -
mypy.egg-info/PKG-INFO | 30 +
mypy.egg-info/SOURCES.txt | 984 ++++++
mypy.egg-info/dependency_links.txt | 1 +
mypy.egg-info/requires.txt | 1 +
mypy.egg-info/top_level.txt | 1 +
mypy/myunit/__init__.py | 380 ---
mypy/myunit/__main__.py | 18 -
mypy/test/config.py | 19 -
mypy/test/data.py | 468 ---
mypy/test/helpers.py | 285 --
mypy/test/testargs.py | 18 -
mypy/test/testcheck.py | 332 --
mypy/test/testcmdline.py | 104 -
mypy/test/testextensions.py | 125 -
mypy/test/testgraph.py | 69 -
mypy/test/testinfer.py | 223 --
mypy/test/testlex.py | 466 ---
mypy/test/testmoduleinfo.py | 14 -
mypy/test/testparse.py | 79 -
mypy/test/testpythoneval.py | 135 -
mypy/test/testreports.py | 40 -
mypy/test/testsemanal.py | 224 --
mypy/test/testsolve.py | 156 -
mypy/test/teststubgen.py | 186 --
mypy/test/testsubtypes.py | 208 --
mypy/test/testtransform.py | 85 -
mypy/test/testtypegen.py | 128 -
mypy/test/testtypes.py | 847 -----
mypy_self_check.ini | 15 -
mypy_strict_optional.ini | 5 -
pinfer/.gitignore | 3 -
pinfer/LICENSE | 27 -
pinfer/README | 47 -
pinfer/inspect3.py | 122 -
pinfer/p.py | 83 -
pinfer/pinfer.py | 686 ----
pinfer/test_pinfer.py | 302 --
pinfer/test_pinfer3.py | 31 -
pinfer/unparse.py | 610 ----
pinfer/unparse3.py | 610 ----
pytest.ini | 14 -
runtests.py | 428 ---
scripts/myunit | 9 -
setup.cfg | 54 +-
test-data/.flake8 | 1 -
test-data/samples/bottles.py | 13 -
test-data/samples/class.py | 18 -
test-data/samples/cmdline.py | 8 -
test-data/samples/crawl.py | 863 -----
test-data/samples/crawl2.py | 852 -----
test-data/samples/dict.py | 8 -
test-data/samples/fib.py | 5 -
test-data/samples/files.py | 14 -
test-data/samples/for.py | 4 -
test-data/samples/generators.py | 24 -
test-data/samples/greet.py | 8 -
test-data/samples/guess.py | 32 -
test-data/samples/hello.py | 2 -
test-data/samples/input.py | 3 -
test-data/samples/itertool.py | 16 -
test-data/samples/readme.txt | 25 -
test-data/samples/regexp.py | 7 -
test-data/stdlib-samples/3.2/base64.py | 411 ---
test-data/stdlib-samples/3.2/fnmatch.py | 112 -
test-data/stdlib-samples/3.2/genericpath.py | 112 -
test-data/stdlib-samples/3.2/getopt.py | 220 --
test-data/stdlib-samples/3.2/glob.py | 84 -
.../3.2/incomplete/logging/__init__.py | 1873 -----------
.../stdlib-samples/3.2/incomplete/urllib/parse.py | 980 ------
test-data/stdlib-samples/3.2/posixpath.py | 466 ---
test-data/stdlib-samples/3.2/pprint.py | 380 ---
test-data/stdlib-samples/3.2/random.py | 743 -----
test-data/stdlib-samples/3.2/shutil.py | 790 -----
test-data/stdlib-samples/3.2/subprocess.py | 1703 ----------
test-data/stdlib-samples/3.2/tempfile.py | 717 -----
test-data/stdlib-samples/3.2/test/randv2_32.pck | 633 ----
test-data/stdlib-samples/3.2/test/randv2_64.pck | 633 ----
test-data/stdlib-samples/3.2/test/randv3.pck | 633 ----
.../3.2/test/subprocessdata/fd_status.py | 24 -
.../3.2/test/subprocessdata/input_reader.py | 7 -
.../stdlib-samples/3.2/test/subprocessdata/qcat.py | 7 -
.../3.2/test/subprocessdata/qgrep.py | 10 -
.../3.2/test/subprocessdata/sigchild_ignore.py | 6 -
test-data/stdlib-samples/3.2/test/support.py | 1602 ---------
test-data/stdlib-samples/3.2/test/test_base64.py | 267 --
test-data/stdlib-samples/3.2/test/test_fnmatch.py | 93 -
.../stdlib-samples/3.2/test/test_genericpath.py | 313 --
test-data/stdlib-samples/3.2/test/test_getopt.py | 190 --
test-data/stdlib-samples/3.2/test/test_glob.py | 122 -
.../stdlib-samples/3.2/test/test_posixpath.py | 531 ---
test-data/stdlib-samples/3.2/test/test_pprint.py | 488 ---
test-data/stdlib-samples/3.2/test/test_random.py | 533 ---
test-data/stdlib-samples/3.2/test/test_set.py | 1884 -----------
test-data/stdlib-samples/3.2/test/test_shutil.py | 978 ------
.../stdlib-samples/3.2/test/test_subprocess.py | 1764 ----------
test-data/stdlib-samples/3.2/test/test_tempfile.py | 1122 -------
test-data/stdlib-samples/3.2/test/test_textwrap.py | 601 ----
.../stdlib-samples/3.2/test/tf_inherit_check.py | 25 -
test-data/stdlib-samples/3.2/textwrap.py | 391 ---
test-data/unit/check-abstract.test | 734 -----
test-data/unit/check-async-await.test | 376 ---
test-data/unit/check-basic.test | 310 --
test-data/unit/check-bound.test | 203 --
test-data/unit/check-callable.test | 345 --
test-data/unit/check-class-namedtuple.test | 378 ---
test-data/unit/check-classes.test | 2430 --------------
test-data/unit/check-columns.test | 68 -
test-data/unit/check-dynamic-typing.test | 676 ----
test-data/unit/check-expressions.test | 1652 ----------
test-data/unit/check-fastparse.test | 191 --
test-data/unit/check-flags.test | 242 --
test-data/unit/check-functions.test | 1666 ----------
test-data/unit/check-generic-subtyping.test | 749 -----
test-data/unit/check-generics.test | 1419 --------
test-data/unit/check-ignore.test | 218 --
test-data/unit/check-incremental.test | 1780 ----------
test-data/unit/check-inference-context.test | 820 -----
test-data/unit/check-inference.test | 1765 ----------
test-data/unit/check-isinstance.test | 1330 --------
test-data/unit/check-kwargs.test | 339 --
test-data/unit/check-lists.test | 72 -
test-data/unit/check-modules.test | 1408 --------
test-data/unit/check-multiple-inheritance.test | 242 --
test-data/unit/check-namedtuple.test | 429 ---
test-data/unit/check-newsyntax.test | 87 -
test-data/unit/check-newtype.test | 319 --
test-data/unit/check-optional.test | 527 ---
test-data/unit/check-overloading.test | 759 -----
test-data/unit/check-python2.test | 221 --
test-data/unit/check-selftype.test | 358 ---
test-data/unit/check-semanal-error.test | 81 -
test-data/unit/check-statements.test | 1322 --------
test-data/unit/check-super.test | 109 -
test-data/unit/check-tuples.test | 927 ------
test-data/unit/check-type-aliases.test | 74 -
test-data/unit/check-type-checks.test | 113 -
test-data/unit/check-type-promotion.test | 39 -
test-data/unit/check-typeddict.test | 462 ---
test-data/unit/check-typevar-values.test | 505 ---
test-data/unit/check-underscores.test | 16 -
test-data/unit/check-unions.test | 140 -
test-data/unit/check-unreachable-code.test | 459 ---
test-data/unit/check-unsupported.test | 15 -
test-data/unit/check-varargs.test | 590 ----
test-data/unit/check-warnings.test | 132 -
test-data/unit/cmdline.test | 479 ---
test-data/unit/fixtures/__new__.pyi | 14 -
test-data/unit/fixtures/alias.pyi | 12 -
test-data/unit/fixtures/args.pyi | 29 -
test-data/unit/fixtures/async_await.pyi | 9 -
test-data/unit/fixtures/bool.pyi | 14 -
test-data/unit/fixtures/callable.pyi | 26 -
test-data/unit/fixtures/classmethod.pyi | 22 -
test-data/unit/fixtures/complex.pyi | 11 -
test-data/unit/fixtures/dict.pyi | 34 -
test-data/unit/fixtures/exception.pyi | 12 -
test-data/unit/fixtures/for.pyi | 19 -
test-data/unit/fixtures/function.pyi | 10 -
test-data/unit/fixtures/isinstance.pyi | 22 -
test-data/unit/fixtures/isinstancelist.pyi | 44 -
test-data/unit/fixtures/list.pyi | 30 -
test-data/unit/fixtures/module.pyi | 18 -
test-data/unit/fixtures/module_all.pyi | 15 -
test-data/unit/fixtures/module_all_python2.pyi | 16 -
test-data/unit/fixtures/ops.pyi | 56 -
test-data/unit/fixtures/primitives.pyi | 17 -
test-data/unit/fixtures/property.pyi | 17 -
test-data/unit/fixtures/python2.pyi | 18 -
test-data/unit/fixtures/set.pyi | 21 -
test-data/unit/fixtures/slice.pyi | 13 -
test-data/unit/fixtures/staticmethod.pyi | 18 -
test-data/unit/fixtures/transform.pyi | 30 -
test-data/unit/fixtures/tuple-simple.pyi | 20 -
test-data/unit/fixtures/tuple.pyi | 28 -
test-data/unit/fixtures/union.pyi | 18 -
test-data/unit/lib-stub/__builtin__.pyi | 27 -
test-data/unit/lib-stub/abc.pyi | 3 -
test-data/unit/lib-stub/builtins.pyi | 23 -
test-data/unit/lib-stub/collections.pyi | 3 -
test-data/unit/lib-stub/mypy_extensions.pyi | 6 -
test-data/unit/lib-stub/sys.pyi | 2 -
test-data/unit/lib-stub/types.pyi | 4 -
test-data/unit/lib-stub/typing.pyi | 90 -
test-data/unit/parse-errors.test | 496 ---
test-data/unit/parse-python2.test | 399 ---
test-data/unit/parse.test | 3401 --------------------
test-data/unit/python2eval.test | 471 ---
test-data/unit/pythoneval-asyncio.test | 486 ---
test-data/unit/pythoneval-enum.test | 134 -
test-data/unit/pythoneval.test | 1214 -------
test-data/unit/semanal-abstractclasses.test | 119 -
test-data/unit/semanal-basic.test | 459 ---
test-data/unit/semanal-classes.test | 623 ----
test-data/unit/semanal-errors.test | 1323 --------
test-data/unit/semanal-expressions.test | 395 ---
test-data/unit/semanal-modules.test | 877 -----
test-data/unit/semanal-namedtuple.test | 177 -
test-data/unit/semanal-python2.test | 76 -
test-data/unit/semanal-statements.test | 925 ------
test-data/unit/semanal-symtable.test | 52 -
test-data/unit/semanal-typealiases.test | 440 ---
test-data/unit/semanal-typeddict.test | 81 -
test-data/unit/semanal-typeinfo.test | 80 -
test-data/unit/semanal-types.test | 1476 ---------
test-data/unit/stubgen.test | 565 ----
test-data/unit/typexport-basic.test | 1159 -------
test-requirements.txt | 9 -
tmp-test-dirs/.gitignore | 4 -
typeshed/stdlib/2/BaseHTTPServer.pyi | 47 +
typeshed/stdlib/2/ConfigParser.pyi | 96 +
typeshed/stdlib/2/Cookie.pyi | 44 +
typeshed/stdlib/2/HTMLParser.pyi | 31 +
typeshed/stdlib/2/Queue.pyi | 29 +
typeshed/stdlib/2/SocketServer.pyi | 93 +
typeshed/stdlib/2/StringIO.pyi | 30 +
typeshed/stdlib/2/UserDict.pyi | 38 +
typeshed/stdlib/2/UserList.pyi | 3 +
typeshed/stdlib/2/UserString.pyi | 4 +
typeshed/stdlib/2/__builtin__.pyi | 947 ++++++
typeshed/stdlib/2/__future__.pyi | 13 +
typeshed/stdlib/2/_ast.pyi | 328 ++
typeshed/stdlib/2/_codecs.pyi | 55 +
typeshed/stdlib/2/_collections.pyi | 41 +
typeshed/stdlib/2/_functools.pyi | 20 +
typeshed/stdlib/2/_hotshot.pyi | 34 +
typeshed/stdlib/2/_io.pyi | 107 +
typeshed/stdlib/2/_json.pyi | 19 +
typeshed/stdlib/2/_md5.pyi | 13 +
typeshed/stdlib/2/_random.pyi | 13 +
typeshed/stdlib/2/_sha.pyi | 15 +
typeshed/stdlib/2/_sha256.pyi | 23 +
typeshed/stdlib/2/_sha512.pyi | 23 +
typeshed/stdlib/2/_socket.pyi | 287 ++
typeshed/stdlib/2/_sre.pyi | 53 +
typeshed/stdlib/2/_struct.pyi | 22 +
typeshed/stdlib/2/_symtable.pyi | 39 +
typeshed/stdlib/2/_warnings.pyi | 11 +
typeshed/stdlib/2/_weakref.pyi | 21 +
typeshed/stdlib/2/_weakrefset.pyi | 14 +
typeshed/stdlib/2/abc.pyi | 37 +
typeshed/stdlib/2/array.pyi | 56 +
typeshed/stdlib/2/ast.pyi | 40 +
typeshed/stdlib/2/atexit.pyi | 5 +
typeshed/stdlib/2/base64.pyi | 25 +
typeshed/stdlib/2/binascii.pyi | 21 +
typeshed/stdlib/2/builtins.pyi | 947 ++++++
typeshed/stdlib/2/cPickle.pyi | 32 +
typeshed/stdlib/2/cStringIO.pyi | 50 +
typeshed/stdlib/2/calendar.pyi | 92 +
typeshed/stdlib/2/codecs.pyi | 203 ++
typeshed/stdlib/2/collections.pyi | 108 +
typeshed/stdlib/2/commands.pyi | 5 +
typeshed/stdlib/2/compileall.pyi | 7 +
typeshed/stdlib/2/cookielib.pyi | 110 +
typeshed/stdlib/2/copy.pyi | 10 +
typeshed/stdlib/2/csv.pyi | 88 +
typeshed/stdlib/2/datetime.pyi | 212 ++
typeshed/stdlib/2/decimal.pyi | 245 ++
typeshed/stdlib/2/difflib.pyi | 64 +
.../stdlib/2/distutils/__init__.pyi | 0
typeshed/stdlib/2/distutils/emxccompiler.pyi | 5 +
typeshed/stdlib/2/doctest.pyi | 9 +
typeshed/stdlib/2/email/MIMEText.pyi | 8 +
typeshed/stdlib/2/email/__init__.pyi | 6 +
typeshed/stdlib/2/email/_parseaddr.pyi | 44 +
.../stdlib/2/email/mime/__init__.pyi | 0
typeshed/stdlib/2/email/mime/base.pyi | 10 +
typeshed/stdlib/2/email/mime/multipart.pyi | 8 +
typeshed/stdlib/2/email/mime/nonmultipart.pyi | 8 +
typeshed/stdlib/2/email/mime/text.pyi | 8 +
typeshed/stdlib/2/email/utils.pyi | 22 +
typeshed/stdlib/2/encodings/__init__.pyi | 6 +
typeshed/stdlib/2/encodings/utf_8.pyi | 14 +
typeshed/stdlib/2/exceptions.pyi | 80 +
typeshed/stdlib/2/fcntl.pyi | 87 +
typeshed/stdlib/2/fileinput.pyi | 46 +
typeshed/stdlib/2/fnmatch.pyi | 6 +
typeshed/stdlib/2/functools.pyi | 34 +
typeshed/stdlib/2/future_builtins.pyi | 14 +
typeshed/stdlib/2/gc.pyi | 29 +
typeshed/stdlib/2/genericpath.pyi | 14 +
typeshed/stdlib/2/getopt.pyi | 17 +
typeshed/stdlib/2/getpass.pyi | 8 +
typeshed/stdlib/2/gettext.pyi | 43 +
typeshed/stdlib/2/glob.pyi | 4 +
typeshed/stdlib/2/grp.pyi | 11 +
typeshed/stdlib/2/gzip.pyi | 41 +
typeshed/stdlib/2/hashlib.pyi | 27 +
typeshed/stdlib/2/heapq.pyi | 15 +
typeshed/stdlib/2/htmlentitydefs.pyi | 9 +
typeshed/stdlib/2/httplib.pyi | 189 ++
typeshed/stdlib/2/imp.pyi | 35 +
typeshed/stdlib/2/importlib.pyi | 3 +
typeshed/stdlib/2/inspect.pyi | 88 +
typeshed/stdlib/2/io.pyi | 105 +
typeshed/stdlib/2/itertools.pyi | 87 +
typeshed/stdlib/2/json.pyi | 97 +
typeshed/stdlib/2/linecache.pyi | 7 +
typeshed/stdlib/2/markupbase.pyi | 9 +
typeshed/stdlib/2/md5.pyi | 11 +
typeshed/stdlib/2/mimetools.pyi | 31 +
typeshed/stdlib/2/multiprocessing/__init__.pyi | 32 +
typeshed/stdlib/2/multiprocessing/process.pyi | 39 +
typeshed/stdlib/2/multiprocessing/util.pyi | 33 +
typeshed/stdlib/2/optparse.pyi | 249 ++
typeshed/stdlib/2/os/__init__.pyi | 303 ++
typeshed/stdlib/2/os/path.pyi | 65 +
typeshed/stdlib/2/pdb.pyi | 30 +
typeshed/stdlib/2/pickle.pyi | 38 +
typeshed/stdlib/2/pipes.pyi | 13 +
typeshed/stdlib/2/platform.pyi | 45 +
typeshed/stdlib/2/posix.pyi | 205 ++
typeshed/stdlib/2/posixpath.pyi | 50 +
typeshed/stdlib/2/pprint.pyi | 24 +
typeshed/stdlib/2/pwd.pyi | 17 +
typeshed/stdlib/2/quopri.pyi | 8 +
typeshed/stdlib/2/random.pyi | 76 +
typeshed/stdlib/2/re.pyi | 99 +
typeshed/stdlib/2/resource.pyi | 33 +
typeshed/stdlib/2/rfc822.pyi | 79 +
typeshed/stdlib/2/robotparser.pyi | 7 +
typeshed/stdlib/2/runpy.pyi | 21 +
typeshed/stdlib/2/select.pyi | 100 +
typeshed/stdlib/2/sha.pyi | 11 +
typeshed/stdlib/2/shelve.pyi | 33 +
typeshed/stdlib/2/shlex.pyi | 27 +
typeshed/stdlib/2/shutil.pyi | 30 +
typeshed/stdlib/2/signal.pyi | 62 +
typeshed/stdlib/2/smtplib.pyi | 90 +
typeshed/stdlib/2/socket.pyi | 362 +++
typeshed/stdlib/2/spwd.pyi | 15 +
typeshed/stdlib/2/sqlite3/__init__.pyi | 5 +
typeshed/stdlib/2/sqlite3/dbapi2.pyi | 256 ++
typeshed/stdlib/2/ssl.pyi | 204 ++
typeshed/stdlib/2/stat.pyi | 59 +
typeshed/stdlib/2/string.pyi | 74 +
typeshed/stdlib/2/strop.pyi | 72 +
typeshed/stdlib/2/struct.pyi | 28 +
typeshed/stdlib/2/subprocess.pyi | 109 +
typeshed/stdlib/2/sys.pyi | 137 +
typeshed/stdlib/2/syslog.pyi | 38 +
typeshed/stdlib/2/tempfile.pyi | 104 +
typeshed/stdlib/2/textwrap.pyi | 33 +
typeshed/stdlib/2/thread.pyi | 33 +
typeshed/stdlib/2/time.pyi | 51 +
typeshed/stdlib/2/token.pyi | 62 +
typeshed/stdlib/2/tokenize.pyi | 143 +
typeshed/stdlib/2/types.pyi | 161 +
typeshed/stdlib/2/typing.pyi | 360 +++
typeshed/stdlib/2/unicodedata.pyi | 40 +
typeshed/stdlib/2/unittest.pyi | 176 +
typeshed/stdlib/2/urllib.pyi | 135 +
typeshed/stdlib/2/urllib2.pyi | 160 +
typeshed/stdlib/2/urlparse.pyi | 68 +
typeshed/stdlib/2/uuid.pyi | 36 +
typeshed/stdlib/2/weakref.pyi | 47 +
.../stdlib/2/wsgiref/__init__.pyi | 0
typeshed/stdlib/2/wsgiref/validate.pyi | 47 +
.../stdlib/2/xml/__init__.pyi | 0
typeshed/stdlib/2/xml/etree/ElementInclude.pyi | 19 +
typeshed/stdlib/2/xml/etree/ElementPath.pyi | 35 +
typeshed/stdlib/2/xml/etree/ElementTree.pyi | 116 +
.../stdlib/2/xml/etree/__init__.pyi | 0
typeshed/stdlib/2/xml/etree/cElementTree.pyi | 5 +
typeshed/stdlib/2/xxsubtype.pyi | 17 +
typeshed/stdlib/2/zlib.pyi | 42 +
typeshed/stdlib/2and3/_bisect.pyi | 11 +
typeshed/stdlib/2and3/_heapq.pyi | 15 +
typeshed/stdlib/2and3/argparse.pyi | 155 +
typeshed/stdlib/2and3/asynchat.pyi | 41 +
typeshed/stdlib/2and3/asyncore.pyi | 132 +
typeshed/stdlib/2and3/bisect.pyi | 22 +
typeshed/stdlib/2and3/bz2.pyi | 33 +
typeshed/stdlib/2and3/cProfile.pyi | 18 +
typeshed/stdlib/2and3/cmath.pyi | 34 +
typeshed/stdlib/2and3/code.pyi | 27 +
typeshed/stdlib/2and3/colorsys.pyi | 15 +
typeshed/stdlib/2and3/contextlib.pyi | 53 +
.../stdlib/2and3/distutils/__init__.pyi | 0
typeshed/stdlib/2and3/distutils/archive_util.pyi | 12 +
typeshed/stdlib/2and3/distutils/bcppcompiler.pyi | 6 +
typeshed/stdlib/2and3/distutils/ccompiler.pyi | 119 +
typeshed/stdlib/2and3/distutils/cmd.pyi | 15 +
.../stdlib/2and3/distutils/command/__init__.pyi | 0
.../stdlib/2and3/distutils/command/bdist.pyi | 0
.../stdlib/2and3/distutils/command/bdist_dumb.pyi | 0
.../stdlib/2and3/distutils/command/bdist_msi.pyi | 5 +
.../2and3/distutils/command/bdist_packager.pyi | 0
.../stdlib/2and3/distutils/command/bdist_rpm.pyi | 0
.../2and3/distutils/command/bdist_wininst.pyi | 0
.../stdlib/2and3/distutils/command/build.pyi | 0
.../stdlib/2and3/distutils/command/build_clib.pyi | 0
.../stdlib/2and3/distutils/command/build_ext.pyi | 0
.../stdlib/2and3/distutils/command/build_py.pyi | 8 +
.../2and3/distutils/command/build_scripts.pyi | 0
.../stdlib/2and3/distutils/command/check.pyi | 0
.../stdlib/2and3/distutils/command/clean.pyi | 0
.../stdlib/2and3/distutils/command/config.pyi | 0
.../stdlib/2and3/distutils/command/install.pyi | 0
.../2and3/distutils/command/install_data.pyi | 0
.../2and3/distutils/command/install_headers.pyi | 0
.../stdlib/2and3/distutils/command/install_lib.pyi | 0
.../2and3/distutils/command/install_scripts.pyi | 0
.../stdlib/2and3/distutils/command/register.pyi | 0
.../stdlib/2and3/distutils/command/sdist.pyi | 0
typeshed/stdlib/2and3/distutils/core.pyi | 35 +
.../stdlib/2and3/distutils/cygwinccompiler.pyi | 7 +
typeshed/stdlib/2and3/distutils/debug.pyi | 3 +
typeshed/stdlib/2and3/distutils/dep_util.pyi | 8 +
typeshed/stdlib/2and3/distutils/dir_util.pyi | 15 +
typeshed/stdlib/2and3/distutils/dist.pyi | 7 +
typeshed/stdlib/2and3/distutils/errors.pyi | 4 +
typeshed/stdlib/2and3/distutils/extension.pyi | 39 +
typeshed/stdlib/2and3/distutils/fancy_getopt.pyi | 27 +
typeshed/stdlib/2and3/distutils/file_util.pyi | 12 +
typeshed/stdlib/2and3/distutils/filelist.pyi | 3 +
.../stdlib/2and3/distutils/log.pyi | 0
typeshed/stdlib/2and3/distutils/msvccompiler.pyi | 6 +
typeshed/stdlib/2and3/distutils/spawn.pyi | 8 +
typeshed/stdlib/2and3/distutils/sysconfig.pyi | 19 +
typeshed/stdlib/2and3/distutils/text_file.pyi | 18 +
typeshed/stdlib/2and3/distutils/unixccompiler.pyi | 6 +
typeshed/stdlib/2and3/distutils/util.pyi | 20 +
typeshed/stdlib/2and3/distutils/version.pyi | 35 +
typeshed/stdlib/2and3/errno.pyi | 129 +
typeshed/stdlib/2and3/fractions.pyi | 94 +
typeshed/stdlib/2and3/hmac.pyi | 35 +
typeshed/stdlib/2and3/keyword.pyi | 6 +
typeshed/stdlib/2and3/locale.pyi | 104 +
typeshed/stdlib/2and3/logging/__init__.pyi | 397 +++
typeshed/stdlib/2and3/logging/config.pyi | 25 +
typeshed/stdlib/2and3/logging/handlers.pyi | 200 ++
typeshed/stdlib/2and3/marshal.pyi | 8 +
typeshed/stdlib/2and3/math.pyi | 66 +
typeshed/stdlib/2and3/mimetypes.pyi | 38 +
typeshed/stdlib/2and3/mmap.pyi | 79 +
typeshed/stdlib/2and3/numbers.pyi | 140 +
typeshed/stdlib/2and3/operator.pyi | 227 ++
typeshed/stdlib/2and3/pkgutil.pyi | 31 +
typeshed/stdlib/2and3/plistlib.pyi | 60 +
typeshed/stdlib/2and3/profile.pyi | 21 +
typeshed/stdlib/2and3/pstats.pyi | 33 +
typeshed/stdlib/2and3/readline.pyi | 41 +
typeshed/stdlib/2and3/rlcompleter.pyi | 13 +
typeshed/stdlib/2and3/site.pyi | 17 +
typeshed/stdlib/2and3/tarfile.pyi | 178 +
typeshed/stdlib/2and3/termios.pyi | 246 ++
typeshed/stdlib/2and3/threading.pyi | 191 ++
typeshed/stdlib/2and3/traceback.pyi | 100 +
typeshed/stdlib/2and3/warnings.pyi | 39 +
typeshed/stdlib/2and3/webbrowser.pyi | 100 +
typeshed/stdlib/2and3/xml/__init__.pyi | 20 +
typeshed/stdlib/2and3/xml/sax/__init__.pyi | 34 +
typeshed/stdlib/2and3/xml/sax/handler.pyi | 50 +
typeshed/stdlib/2and3/xml/sax/saxutils.pyi | 58 +
typeshed/stdlib/2and3/xml/sax/xmlreader.pyi | 75 +
typeshed/stdlib/2and3/zipfile.pyi | 94 +
typeshed/stdlib/2and3/zipimport.pyi | 18 +
.../stdlib/3.2/xml/__init__.pyi | 0
typeshed/stdlib/3.2/xml/etree/ElementInclude.pyi | 19 +
typeshed/stdlib/3.2/xml/etree/ElementPath.pyi | 35 +
typeshed/stdlib/3.2/xml/etree/ElementTree.pyi | 120 +
.../stdlib/3.2/xml/etree/__init__.pyi | 0
typeshed/stdlib/3.2/xml/etree/cElementTree.pyi | 5 +
typeshed/stdlib/3.3/ipaddress.pyi | 200 ++
.../stdlib/3.3/xml/__init__.pyi | 0
typeshed/stdlib/3.3/xml/etree/ElementInclude.pyi | 19 +
typeshed/stdlib/3.3/xml/etree/ElementPath.pyi | 35 +
typeshed/stdlib/3.3/xml/etree/ElementTree.pyi | 113 +
.../stdlib/3.3/xml/etree/__init__.pyi | 0
typeshed/stdlib/3.3/xml/etree/cElementTree.pyi | 5 +
typeshed/stdlib/3.4/_stat.pyi | 69 +
typeshed/stdlib/3.4/_tracemalloc.pyi | 26 +
typeshed/stdlib/3.4/asyncio/__init__.pyi | 97 +
typeshed/stdlib/3.4/asyncio/coroutines.pyi | 9 +
typeshed/stdlib/3.4/asyncio/events.pyi | 177 +
typeshed/stdlib/3.4/asyncio/futures.pyi | 46 +
typeshed/stdlib/3.4/asyncio/locks.pyi | 59 +
typeshed/stdlib/3.4/asyncio/protocols.pyi | 24 +
typeshed/stdlib/3.4/asyncio/queues.pyi | 46 +
typeshed/stdlib/3.4/asyncio/streams.pyi | 105 +
typeshed/stdlib/3.4/asyncio/subprocess.pyi | 60 +
typeshed/stdlib/3.4/asyncio/tasks.pyi | 55 +
typeshed/stdlib/3.4/asyncio/transports.pyi | 38 +
typeshed/stdlib/3.4/enum.pyi | 50 +
typeshed/stdlib/3.4/pathlib.pyi | 111 +
typeshed/stdlib/3.4/selectors.pyi | 90 +
.../stdlib/3.4/xml/__init__.pyi | 0
typeshed/stdlib/3.4/xml/etree/ElementInclude.pyi | 19 +
typeshed/stdlib/3.4/xml/etree/ElementPath.pyi | 35 +
typeshed/stdlib/3.4/xml/etree/ElementTree.pyi | 118 +
.../stdlib/3.4/xml/etree/__init__.pyi | 0
typeshed/stdlib/3.4/xml/etree/cElementTree.pyi | 5 +
.../stdlib/3.5/xml/__init__.pyi | 0
typeshed/stdlib/3.5/xml/etree/ElementInclude.pyi | 19 +
typeshed/stdlib/3.5/xml/etree/ElementPath.pyi | 35 +
typeshed/stdlib/3.5/xml/etree/ElementTree.pyi | 118 +
.../stdlib/3.5/xml/etree/__init__.pyi | 0
typeshed/stdlib/3.5/xml/etree/cElementTree.pyi | 5 +
typeshed/stdlib/3.6/secrets.pyi | 14 +
typeshed/stdlib/3/__future__.pyi | 16 +
typeshed/stdlib/3/_ast.pyi | 358 +++
typeshed/stdlib/3/_codecs.pyi | 51 +
typeshed/stdlib/3/_compression.pyi | 20 +
typeshed/stdlib/3/_curses.pyi | 297 ++
typeshed/stdlib/3/_dummy_thread.pyi | 11 +
typeshed/stdlib/3/_importlib_modulespec.pyi | 43 +
typeshed/stdlib/3/_json.pyi | 30 +
typeshed/stdlib/3/_markupbase.pyi | 9 +
typeshed/stdlib/3/_operator.pyi | 71 +
typeshed/stdlib/3/_posixsubprocess.pyi | 13 +
typeshed/stdlib/3/_random.pyi | 12 +
typeshed/stdlib/3/_subprocess.pyi | 38 +
typeshed/stdlib/3/_thread.pyi | 15 +
typeshed/stdlib/3/_warnings.pyi | 11 +
typeshed/stdlib/3/abc.pyi | 13 +
typeshed/stdlib/3/array.pyi | 49 +
typeshed/stdlib/3/ast.pyi | 39 +
typeshed/stdlib/3/atexit.pyi | 9 +
typeshed/stdlib/3/base64.pyi | 42 +
typeshed/stdlib/3/binascii.pyi | 26 +
typeshed/stdlib/3/builtins.pyi | 908 ++++++
typeshed/stdlib/3/calendar.pyi | 92 +
typeshed/stdlib/3/cgi.pyi | 4 +
typeshed/stdlib/3/codecs.pyi | 194 ++
typeshed/stdlib/3/collections/__init__.pyi | 178 +
typeshed/stdlib/3/collections/abc.pyi | 38 +
.../stdlib/3/concurrent/__init__.pyi | 0
typeshed/stdlib/3/concurrent/futures/__init__.pyi | 3 +
typeshed/stdlib/3/concurrent/futures/_base.pyi | 44 +
typeshed/stdlib/3/concurrent/futures/process.pyi | 14 +
typeshed/stdlib/3/concurrent/futures/thread.pyi | 10 +
typeshed/stdlib/3/configparser.pyi | 188 ++
typeshed/stdlib/3/copy.pyi | 10 +
typeshed/stdlib/3/csv.pyi | 77 +
typeshed/stdlib/3/curses/__init__.pyi | 12 +
typeshed/stdlib/3/datetime.pyi | 223 ++
typeshed/stdlib/3/decimal.pyi | 256 ++
typeshed/stdlib/3/difflib.pyi | 62 +
typeshed/stdlib/3/dis.pyi | 63 +
typeshed/stdlib/3/doctest.pyi | 9 +
typeshed/stdlib/3/email/__init__.pyi | 46 +
typeshed/stdlib/3/email/charset.pyi | 27 +
typeshed/stdlib/3/email/contentmanager.pyi | 22 +
typeshed/stdlib/3/email/encoders.pyi | 8 +
typeshed/stdlib/3/email/errors.pyi | 22 +
typeshed/stdlib/3/email/feedparser.pyi | 28 +
typeshed/stdlib/3/email/generator.pyi | 45 +
typeshed/stdlib/3/email/header.pyi | 25 +
typeshed/stdlib/3/email/headerregistry.pyi | 102 +
typeshed/stdlib/3/email/iterators.pyi | 8 +
typeshed/stdlib/3/email/message.pyi | 130 +
.../stdlib/3/email/mime}/__init__.py | 0
typeshed/stdlib/3/email/mime/application.pyi | 11 +
typeshed/stdlib/3/email/mime/audio.pyi | 11 +
typeshed/stdlib/3/email/mime/base.pyi | 10 +
typeshed/stdlib/3/email/mime/image.pyi | 11 +
typeshed/stdlib/3/email/mime/message.pyi | 7 +
typeshed/stdlib/3/email/mime/multipart.pyi | 12 +
typeshed/stdlib/3/email/mime/nonmultipart.pyi | 5 +
typeshed/stdlib/3/email/mime/text.pyi | 8 +
typeshed/stdlib/3/email/parser.pyi | 61 +
typeshed/stdlib/3/email/policy.pyi | 69 +
typeshed/stdlib/3/email/utils.pyi | 33 +
typeshed/stdlib/3/encodings/__init__.pyi | 6 +
typeshed/stdlib/3/encodings/utf_8.pyi | 14 +
typeshed/stdlib/3/fcntl.pyi | 96 +
typeshed/stdlib/3/fileinput.pyi | 48 +
typeshed/stdlib/3/fnmatch.pyi | 11 +
typeshed/stdlib/3/functools.pyi | 64 +
typeshed/stdlib/3/gc.pyi | 28 +
typeshed/stdlib/3/getopt.pyi | 19 +
typeshed/stdlib/3/getpass.pyi | 13 +
typeshed/stdlib/3/gettext.pyi | 44 +
typeshed/stdlib/3/glob.pyi | 15 +
typeshed/stdlib/3/grp.pyi | 13 +
typeshed/stdlib/3/gzip.pyi | 51 +
typeshed/stdlib/3/hashlib.pyi | 40 +
typeshed/stdlib/3/heapq.pyi | 23 +
typeshed/stdlib/3/html/__init__.pyi | 4 +
typeshed/stdlib/3/html/entities.pyi | 10 +
typeshed/stdlib/3/html/parser.pyi | 33 +
typeshed/stdlib/3/http/__init__.pyi | 68 +
typeshed/stdlib/3/http/client.pyi | 194 ++
typeshed/stdlib/3/http/cookiejar.pyi | 112 +
typeshed/stdlib/3/http/cookies.pyi | 31 +
typeshed/stdlib/3/http/server.pyi | 63 +
typeshed/stdlib/3/imp.pyi | 10 +
typeshed/stdlib/3/importlib/__init__.pyi | 18 +
typeshed/stdlib/3/importlib/abc.pyi | 89 +
typeshed/stdlib/3/importlib/machinery.pyi | 185 ++
typeshed/stdlib/3/importlib/util.pyi | 55 +
typeshed/stdlib/3/inspect.pyi | 289 ++
typeshed/stdlib/3/io.pyi | 259 ++
typeshed/stdlib/3/itertools.pyi | 63 +
typeshed/stdlib/3/json.pyi | 88 +
typeshed/stdlib/3/linecache.pyi | 5 +
typeshed/stdlib/3/msvcrt.pyi | 8 +
typeshed/stdlib/3/multiprocessing/__init__.pyi | 99 +
typeshed/stdlib/3/multiprocessing/managers.pyi | 10 +
typeshed/stdlib/3/multiprocessing/pool.pyi | 58 +
typeshed/stdlib/3/multiprocessing/process.pyi | 5 +
typeshed/stdlib/3/opcode.pyi | 18 +
typeshed/stdlib/3/os/__init__.pyi | 386 +++
typeshed/stdlib/3/os/path.pyi | 65 +
typeshed/stdlib/3/pdb.pyi | 30 +
typeshed/stdlib/3/pickle.pyi | 67 +
typeshed/stdlib/3/pipes.pyi | 19 +
typeshed/stdlib/3/platform.pyi | 34 +
typeshed/stdlib/3/posix.pyi | 6 +
typeshed/stdlib/3/posixpath.pyi | 46 +
typeshed/stdlib/3/pprint.pyi | 23 +
typeshed/stdlib/3/pwd.pyi | 18 +
typeshed/stdlib/3/pyclbr.pyi | 40 +
typeshed/stdlib/3/queue.pyi | 24 +
typeshed/stdlib/3/random.pyi | 67 +
typeshed/stdlib/3/re.pyi | 106 +
typeshed/stdlib/3/resource.pyi | 32 +
typeshed/stdlib/3/runpy.pyi | 21 +
typeshed/stdlib/3/select.pyi | 27 +
typeshed/stdlib/3/shelve.pyi | 31 +
typeshed/stdlib/3/shlex.pyi | 39 +
typeshed/stdlib/3/shutil.pyi | 51 +
typeshed/stdlib/3/signal.pyi | 180 ++
typeshed/stdlib/3/smtplib.pyi | 94 +
typeshed/stdlib/3/socket.pyi | 361 +++
typeshed/stdlib/3/socketserver.pyi | 93 +
typeshed/stdlib/3/sqlite3/__init__.pyi | 5 +
typeshed/stdlib/3/sqlite3/dbapi2.pyi | 256 ++
typeshed/stdlib/3/ssl.pyi | 285 ++
typeshed/stdlib/3/stat.pyi | 73 +
typeshed/stdlib/3/string.pyi | 42 +
typeshed/stdlib/3/struct.pyi | 30 +
typeshed/stdlib/3/subprocess.pyi | 249 ++
typeshed/stdlib/3/sys.pyi | 161 +
typeshed/stdlib/3/sysconfig.pyi | 8 +
typeshed/stdlib/3/tempfile.pyi | 51 +
typeshed/stdlib/3/textwrap.pyi | 122 +
typeshed/stdlib/3/time.pyi | 84 +
typeshed/stdlib/3/tkinter/__init__.pyi | 660 ++++
typeshed/stdlib/3/tkinter/constants.pyi | 83 +
typeshed/stdlib/3/tkinter/ttk.pyi | 158 +
typeshed/stdlib/3/token.pyi | 63 +
typeshed/stdlib/3/tokenize.pyi | 99 +
typeshed/stdlib/3/types.pyi | 151 +
typeshed/stdlib/3/typing.pyi | 449 +++
typeshed/stdlib/3/unicodedata.pyi | 37 +
typeshed/stdlib/3/unittest/__init__.pyi | 333 ++
typeshed/stdlib/3/unittest/mock.pyi | 163 +
.../stdlib/3/urllib/__init__.pyi | 0
typeshed/stdlib/3/urllib/error.pyi | 11 +
typeshed/stdlib/3/urllib/parse.pyi | 152 +
typeshed/stdlib/3/urllib/request.pyi | 201 ++
typeshed/stdlib/3/urllib/response.pyi | 8 +
typeshed/stdlib/3/urllib/robotparser.pyi | 18 +
typeshed/stdlib/3/uuid.pyi | 73 +
typeshed/stdlib/3/weakref.pyi | 120 +
.../stdlib/3/wsgiref/__init__.pyi | 0
typeshed/stdlib/3/wsgiref/validate.pyi | 47 +
typeshed/stdlib/3/xml/etree/ElementInclude.pyi | 19 +
typeshed/stdlib/3/xml/etree/ElementPath.pyi | 25 +
typeshed/stdlib/3/xml/etree/ElementTree.pyi | 98 +
.../stdlib/3/xml/etree/__init__.pyi | 0
typeshed/stdlib/3/xml/etree/cElementTree.pyi | 5 +
typeshed/stdlib/3/zlib.pyi | 46 +
typeshed/tests/mypy_test.py | 149 +
typeshed/tests/pytype_test.py | 109 +
.../third_party/2/OpenSSL/__init__.pyi | 0
typeshed/third_party/2/OpenSSL/crypto.pyi | 6 +
.../third_party/2/concurrent/__init__.pyi | 0
.../third_party/2/concurrent/futures/__init__.pyi | 37 +
typeshed/third_party/2/croniter.pyi | 27 +
.../third_party/2/dateutil/__init__.pyi | 0
typeshed/third_party/2/dateutil/parser.pyi | 39 +
typeshed/third_party/2/dateutil/relativedelta.pyi | 86 +
typeshed/third_party/2/enum.pyi | 19 +
typeshed/third_party/2/fb303/FacebookService.pyi | 301 ++
.../third_party/2/fb303/__init__.pyi | 0
typeshed/third_party/2/gflags.pyi | 214 ++
.../third_party/2/google/__init__.pyi | 0
.../third_party/2/google/protobuf/__init__.pyi | 1 +
.../third_party/2/google/protobuf/descriptor.pyi | 165 +
.../2/google/protobuf/descriptor_pb2.pyi | 2 +
.../2/google/protobuf/descriptor_pool.pyi | 22 +
.../2/google/protobuf/internal/__init__.pyi | 0
.../2/google/protobuf/internal/decoder.pyi | 34 +
.../2/google/protobuf/internal/encoder.pyi | 38 +
.../google/protobuf/internal/enum_type_wrapper.pyi | 11 +
.../2/google/protobuf/internal/wire_format.pyi | 54 +
typeshed/third_party/2/google/protobuf/message.pyi | 36 +
.../2/google/protobuf/message_factory.pyi | 17 +
.../third_party/2/google/protobuf/reflection.pyi | 10 +
.../2/google/protobuf/symbol_database.pyi | 18 +
typeshed/third_party/2/itsdangerous.pyi | 153 +
typeshed/third_party/2/kazoo/__init__.pyi | 3 +
typeshed/third_party/2/kazoo/client.pyi | 100 +
typeshed/third_party/2/kazoo/exceptions.pyi | 62 +
typeshed/third_party/2/kazoo/recipe/__init__.pyi | 3 +
typeshed/third_party/2/kazoo/recipe/watchers.pyi | 25 +
typeshed/third_party/2/pycurl.pyi | 378 +++
typeshed/third_party/2/pymssql.pyi | 48 +
typeshed/third_party/2/redis/__init__.pyi | 28 +
typeshed/third_party/2/redis/client.pyi | 293 ++
typeshed/third_party/2/redis/connection.pyi | 135 +
typeshed/third_party/2/redis/exceptions.pyi | 21 +
typeshed/third_party/2/redis/utils.pyi | 12 +
typeshed/third_party/2/requests/__init__.pyi | 39 +
typeshed/third_party/2/requests/adapters.pyi | 72 +
typeshed/third_party/2/requests/api.pyi | 21 +
typeshed/third_party/2/requests/auth.pyi | 41 +
typeshed/third_party/2/requests/compat.pyi | 6 +
typeshed/third_party/2/requests/cookies.pyi | 61 +
typeshed/third_party/2/requests/exceptions.pyi | 26 +
typeshed/third_party/2/requests/hooks.pyi | 8 +
typeshed/third_party/2/requests/models.pyi | 135 +
.../third_party/2/requests/packages/__init__.pyi | 8 +
.../2/requests/packages/urllib3/__init__.pyi | 12 +
.../2/requests/packages/urllib3/_collections.pyi | 51 +
.../2/requests/packages/urllib3/connection.pyi | 51 +
.../2/requests/packages/urllib3/connectionpool.pyi | 87 +
.../requests/packages/urllib3/contrib/__init__.pyi | 3 +
.../2/requests/packages/urllib3/exceptions.pyi | 54 +
.../2/requests/packages/urllib3/fields.pyi | 16 +
.../2/requests/packages/urllib3/filepost.pyi | 19 +
.../packages/urllib3/packages/__init__.pyi | 3 +
.../packages/ssl_match_hostname/__init__.pyi | 1 +
.../ssl_match_hostname/_implementation.pyi | 7 +
.../2/requests/packages/urllib3/poolmanager.pyi | 31 +
.../2/requests/packages/urllib3/request.pyi | 13 +
.../2/requests/packages/urllib3/response.pyi | 58 +
.../2/requests/packages/urllib3/util/__init__.pyi | 6 +
.../requests/packages/urllib3/util/connection.pyi | 11 +
.../2/requests/packages/urllib3/util/request.pyi | 12 +
.../2/requests/packages/urllib3/util/response.pyi | 5 +
.../2/requests/packages/urllib3/util/retry.pyi | 36 +
.../2/requests/packages/urllib3/util/timeout.pyi | 24 +
.../2/requests/packages/urllib3/util/url.pyi | 26 +
typeshed/third_party/2/requests/sessions.pyi | 106 +
typeshed/third_party/2/requests/status_codes.pyi | 8 +
typeshed/third_party/2/requests/structures.pyi | 12 +
typeshed/third_party/2/requests/utils.pyi | 52 +
typeshed/third_party/2/routes/__init__.pyi | 19 +
typeshed/third_party/2/routes/mapper.pyi | 70 +
typeshed/third_party/2/routes/util.pyi | 24 +
.../third_party/2/scribe/__init__.pyi | 0
typeshed/third_party/2/scribe/scribe.pyi | 43 +
typeshed/third_party/2/scribe/ttypes.pyi | 22 +
.../2/selenium/webdriver/remote/webdriver.pyi | 111 +
.../2/selenium/webdriver/remote/webelement.pyi | 65 +
typeshed/third_party/2/simplejson/__init__.pyi | 10 +
typeshed/third_party/2/simplejson/decoder.pyi | 6 +
typeshed/third_party/2/simplejson/encoder.pyi | 9 +
typeshed/third_party/2/simplejson/scanner.pyi | 7 +
typeshed/third_party/2/six/__init__.pyi | 91 +
typeshed/third_party/2/six/moves/__init__.pyi | 31 +
typeshed/third_party/2/six/moves/cPickle.pyi | 6 +
.../third_party/2/six/moves/urllib/__init__.pyi | 10 +
typeshed/third_party/2/six/moves/urllib/error.pyi | 8 +
typeshed/third_party/2/six/moves/urllib/parse.pyi | 30 +
.../third_party/2/six/moves/urllib/request.pyi | 38 +
.../third_party/2/six/moves/urllib/response.pyi | 9 +
.../third_party/2/six/moves/urllib/robotparser.pyi | 6 +
typeshed/third_party/2/six/moves/urllib_error.pyi | 10 +
typeshed/third_party/2/six/moves/urllib_parse.pyi | 28 +
.../third_party/2/six/moves/urllib_request.pyi | 40 +
.../third_party/2/six/moves/urllib_response.pyi | 11 +
.../third_party/2/six/moves/urllib_robotparser.pyi | 8 +
typeshed/third_party/2/sqlalchemy/__init__.pyi | 124 +
.../2/sqlalchemy/databases/__init__.pyi | 12 +
.../third_party/2/sqlalchemy/databases/mysql.pyi | 1 +
.../third_party/2/sqlalchemy/dialects/__init__.pyi | 12 +
.../2/sqlalchemy/dialects/mysql/__init__.pyi | 40 +
.../2/sqlalchemy/dialects/mysql/base.pyi | 413 +++
.../third_party/2/sqlalchemy/engine/__init__.pyi | 11 +
typeshed/third_party/2/sqlalchemy/engine/base.pyi | 21 +
.../third_party/2/sqlalchemy/engine/strategies.pyi | 39 +
typeshed/third_party/2/sqlalchemy/engine/url.pyi | 27 +
typeshed/third_party/2/sqlalchemy/exc.pyi | 77 +
typeshed/third_party/2/sqlalchemy/inspection.pyi | 5 +
typeshed/third_party/2/sqlalchemy/log.pyi | 14 +
typeshed/third_party/2/sqlalchemy/orm/__init__.pyi | 95 +
typeshed/third_party/2/sqlalchemy/orm/session.pyi | 93 +
typeshed/third_party/2/sqlalchemy/pool.pyi | 118 +
typeshed/third_party/2/sqlalchemy/schema.pyi | 50 +
typeshed/third_party/2/sqlalchemy/sql/__init__.pyi | 66 +
.../third_party/2/sqlalchemy/sql/annotation.pyi | 11 +
typeshed/third_party/2/sqlalchemy/sql/base.pyi | 42 +
typeshed/third_party/2/sqlalchemy/sql/ddl.pyi | 25 +
typeshed/third_party/2/sqlalchemy/sql/dml.pyi | 20 +
typeshed/third_party/2/sqlalchemy/sql/elements.pyi | 60 +
.../third_party/2/sqlalchemy/sql/expression.pyi | 87 +
.../third_party/2/sqlalchemy/sql/functions.pyi | 47 +
typeshed/third_party/2/sqlalchemy/sql/naming.pyi | 1 +
.../third_party/2/sqlalchemy/sql/operators.pyi | 99 +
typeshed/third_party/2/sqlalchemy/sql/schema.pyi | 126 +
.../third_party/2/sqlalchemy/sql/selectable.pyi | 74 +
typeshed/third_party/2/sqlalchemy/sql/sqltypes.pyi | 57 +
typeshed/third_party/2/sqlalchemy/sql/type_api.pyi | 16 +
typeshed/third_party/2/sqlalchemy/sql/visitors.pyi | 33 +
typeshed/third_party/2/sqlalchemy/types.pyi | 51 +
.../third_party/2/sqlalchemy/util/__init__.pyi | 133 +
.../third_party/2/sqlalchemy/util/_collections.pyi | 214 ++
typeshed/third_party/2/sqlalchemy/util/compat.pyi | 67 +
.../third_party/2/sqlalchemy/util/deprecations.pyi | 13 +
.../third_party/2/sqlalchemy/util/langhelpers.pyi | 134 +
typeshed/third_party/2/thrift/Thrift.pyi | 55 +
.../third_party/2/thrift/__init__.pyi | 0
.../2/thrift/protocol/TBinaryProtocol.pyi | 66 +
.../third_party/2/thrift/protocol/TProtocol.pyi | 80 +
.../third_party/2/thrift/protocol/__init__.pyi | 11 +
.../third_party/2/thrift/transport/TSocket.pyi | 33 +
.../third_party/2/thrift/transport/TTransport.pyi | 111 +
.../third_party/2/thrift/transport/__init__.pyi | 9 +
.../third_party/2/tornado/__init__.pyi | 0
typeshed/third_party/2/tornado/concurrent.pyi | 47 +
typeshed/third_party/2/tornado/gen.pyi | 113 +
typeshed/third_party/2/tornado/httpclient.pyi | 112 +
typeshed/third_party/2/tornado/httpserver.pyi | 45 +
typeshed/third_party/2/tornado/httputil.pyi | 93 +
typeshed/third_party/2/tornado/ioloop.pyi | 88 +
typeshed/third_party/2/tornado/locks.pyi | 49 +
typeshed/third_party/2/tornado/netutil.pyi | 49 +
typeshed/third_party/2/tornado/tcpserver.pyi | 21 +
typeshed/third_party/2/tornado/testing.pyi | 64 +
typeshed/third_party/2/tornado/util.pyi | 50 +
typeshed/third_party/2/tornado/web.pyi | 261 ++
typeshed/third_party/2/werkzeug/__init__.pyi | 155 +
typeshed/third_party/2/werkzeug/_compat.pyi | 47 +
typeshed/third_party/2/werkzeug/_internal.pyi | 22 +
typeshed/third_party/2/werkzeug/_reloader.pyi | 33 +
.../third_party/2/werkzeug/contrib/__init__.pyi | 3 +
typeshed/third_party/2/werkzeug/contrib/atom.pyi | 54 +
typeshed/third_party/2/werkzeug/contrib/cache.pyi | 77 +
typeshed/third_party/2/werkzeug/contrib/fixers.pyi | 41 +
typeshed/third_party/2/werkzeug/contrib/iterio.pyi | 42 +
.../third_party/2/werkzeug/contrib/jsrouting.pyi | 14 +
.../third_party/2/werkzeug/contrib/limiter.pyi | 11 +
typeshed/third_party/2/werkzeug/contrib/lint.pyi | 47 +
.../third_party/2/werkzeug/contrib/profiler.pyi | 18 +
.../2/werkzeug/contrib/securecookie.pyi | 30 +
.../third_party/2/werkzeug/contrib/sessions.pyi | 58 +
.../third_party/2/werkzeug/contrib/testtools.pyi | 13 +
.../third_party/2/werkzeug/contrib/wrappers.pyi | 31 +
typeshed/third_party/2/werkzeug/datastructures.pyi | 389 +++
typeshed/third_party/2/werkzeug/debug/__init__.pyi | 40 +
typeshed/third_party/2/werkzeug/debug/console.pyi | 48 +
typeshed/third_party/2/werkzeug/debug/repr.pyi | 37 +
typeshed/third_party/2/werkzeug/debug/tbtools.pyi | 67 +
typeshed/third_party/2/werkzeug/exceptions.pyi | 140 +
typeshed/third_party/2/werkzeug/filesystem.pyi | 11 +
typeshed/third_party/2/werkzeug/formparser.pyi | 44 +
typeshed/third_party/2/werkzeug/http.pyi | 41 +
typeshed/third_party/2/werkzeug/local.pyi | 104 +
typeshed/third_party/2/werkzeug/posixemulation.pyi | 11 +
typeshed/third_party/2/werkzeug/routing.pyi | 181 ++
typeshed/third_party/2/werkzeug/script.pyi | 16 +
typeshed/third_party/2/werkzeug/security.pyi | 16 +
typeshed/third_party/2/werkzeug/serving.pyi | 83 +
typeshed/third_party/2/werkzeug/test.pyi | 85 +
typeshed/third_party/2/werkzeug/testapp.pyi | 13 +
typeshed/third_party/2/werkzeug/urls.pyi | 69 +
typeshed/third_party/2/werkzeug/useragents.pyi | 18 +
typeshed/third_party/2/werkzeug/utils.pyi | 53 +
typeshed/third_party/2/werkzeug/wrappers.pyi | 194 ++
typeshed/third_party/2/werkzeug/wsgi.pyi | 88 +
typeshed/third_party/2/yaml/__init__.pyi | 51 +
typeshed/third_party/2/yaml/composer.pyi | 21 +
typeshed/third_party/2/yaml/constructor.pyi | 70 +
typeshed/third_party/2/yaml/dumper.pyi | 17 +
typeshed/third_party/2/yaml/emitter.pyi | 110 +
typeshed/third_party/2/yaml/error.pyi | 25 +
typeshed/third_party/2/yaml/events.pyi | 66 +
typeshed/third_party/2/yaml/loader.pyi | 19 +
typeshed/third_party/2/yaml/nodes.pyi | 35 +
typeshed/third_party/2/yaml/parser.pyi | 48 +
typeshed/third_party/2/yaml/reader.pyi | 38 +
typeshed/third_party/2/yaml/representer.pyi | 56 +
typeshed/third_party/2/yaml/resolver.pyi | 26 +
typeshed/third_party/2/yaml/scanner.pyi | 100 +
typeshed/third_party/2/yaml/serializer.pyi | 27 +
typeshed/third_party/2/yaml/tokens.pyi | 97 +
typeshed/third_party/2and3/Crypto/Cipher/AES.pyi | 23 +
typeshed/third_party/2and3/Crypto/Cipher/ARC2.pyi | 23 +
typeshed/third_party/2and3/Crypto/Cipher/ARC4.pyi | 19 +
.../third_party/2and3/Crypto/Cipher/Blowfish.pyi | 23 +
typeshed/third_party/2and3/Crypto/Cipher/CAST.pyi | 23 +
typeshed/third_party/2and3/Crypto/Cipher/DES.pyi | 23 +
typeshed/third_party/2and3/Crypto/Cipher/DES3.pyi | 24 +
.../third_party/2and3/Crypto/Cipher/PKCS1_OAEP.pyi | 17 +
.../third_party/2and3/Crypto/Cipher/PKCS1_v1_5.pyi | 17 +
typeshed/third_party/2and3/Crypto/Cipher/XOR.pyi | 20 +
.../third_party/2and3/Crypto/Cipher/__init__.pyi | 15 +
.../third_party/2and3/Crypto/Cipher/blockalgo.pyi | 21 +
typeshed/third_party/2and3/Crypto/Hash/HMAC.pyi | 20 +
typeshed/third_party/2and3/Crypto/Hash/MD2.pyi | 17 +
typeshed/third_party/2and3/Crypto/Hash/MD4.pyi | 17 +
typeshed/third_party/2and3/Crypto/Hash/MD5.pyi | 17 +
typeshed/third_party/2and3/Crypto/Hash/RIPEMD.pyi | 17 +
typeshed/third_party/2and3/Crypto/Hash/SHA.pyi | 17 +
typeshed/third_party/2and3/Crypto/Hash/SHA224.pyi | 17 +
typeshed/third_party/2and3/Crypto/Hash/SHA256.pyi | 17 +
typeshed/third_party/2and3/Crypto/Hash/SHA384.pyi | 17 +
typeshed/third_party/2and3/Crypto/Hash/SHA512.pyi | 17 +
.../third_party/2and3/Crypto/Hash/__init__.pyi | 15 +
.../third_party/2and3/Crypto/Hash/hashalgo.pyi | 15 +
.../2and3/Crypto/Protocol/AllOrNothing.pyi | 14 +
.../third_party/2and3/Crypto/Protocol/Chaffing.pyi | 9 +
typeshed/third_party/2and3/Crypto/Protocol/KDF.pyi | 11 +
.../third_party/2and3/Crypto/Protocol/__init__.pyi | 8 +
.../third_party/2and3/Crypto/PublicKey/DSA.pyi | 31 +
.../third_party/2and3/Crypto/PublicKey/ElGamal.pyi | 23 +
.../third_party/2and3/Crypto/PublicKey/RSA.pyi | 36 +
.../2and3/Crypto/PublicKey/__init__.pyi | 8 +
.../third_party/2and3/Crypto/PublicKey/pubkey.pyi | 25 +
.../Crypto/Random/Fortuna/FortunaAccumulator.pyi | 29 +
.../Crypto/Random/Fortuna/FortunaGenerator.pyi | 20 +
.../2and3/Crypto/Random/Fortuna/SHAd256.pyi | 17 +
.../2and3/Crypto/Random/Fortuna/__init__.pyi | 3 +
.../2and3/Crypto/Random/OSRNG/__init__.pyi | 5 +
.../2and3/Crypto/Random/OSRNG/fallback.pyi | 9 +
.../2and3/Crypto/Random/OSRNG/posix.pyi | 10 +
.../2and3/Crypto/Random/OSRNG/rng_base.pyi | 15 +
.../third_party/2and3/Crypto/Random/__init__.pyi | 5 +
.../third_party/2and3/Crypto/Random/random.pyi | 21 +
.../2and3/Crypto/Signature/PKCS1_PSS.pyi | 13 +
.../2and3/Crypto/Signature/PKCS1_v1_5.pyi | 12 +
.../2and3/Crypto/Signature/__init__.pyi | 7 +
typeshed/third_party/2and3/Crypto/Util/Counter.pyi | 7 +
typeshed/third_party/2and3/Crypto/Util/RFC1751.pyi | 13 +
.../third_party/2and3/Crypto/Util/__init__.pyi | 10 +
typeshed/third_party/2and3/Crypto/Util/asn1.pyi | 49 +
typeshed/third_party/2and3/Crypto/Util/number.pyi | 26 +
.../third_party/2and3/Crypto/Util/randpool.pyi | 20 +
typeshed/third_party/2and3/Crypto/Util/strxor.pyi | 6 +
typeshed/third_party/2and3/Crypto/__init__.pyi | 11 +
typeshed/third_party/2and3/Crypto/pct_warnings.pyi | 11 +
.../third_party/2and3/atomicwrites/__init__.pyi | 16 +
.../third_party/2and3/backports/__init__.pyi | 0
.../2and3/backports/ssl_match_hostname.pyi | 3 +
typeshed/third_party/2and3/backports_abc.pyi | 19 +
typeshed/third_party/2and3/boto/__init__.pyi | 80 +
typeshed/third_party/2and3/boto/auth.pyi | 112 +
typeshed/third_party/2and3/boto/auth_handler.pyi | 13 +
typeshed/third_party/2and3/boto/compat.pyi | 14 +
typeshed/third_party/2and3/boto/connection.pyi | 119 +
typeshed/third_party/2and3/boto/ec2/__init__.pyi | 11 +
typeshed/third_party/2and3/boto/elb/__init__.pyi | 43 +
typeshed/third_party/2and3/boto/exception.pyi | 150 +
typeshed/third_party/2and3/boto/plugin.pyi | 13 +
typeshed/third_party/2and3/boto/regioninfo.pyi | 20 +
typeshed/third_party/2and3/boto/s3/__init__.pyi | 16 +
typeshed/third_party/2and3/boto/s3/acl.pyi | 43 +
typeshed/third_party/2and3/boto/s3/bucket.pyi | 98 +
.../2and3/boto/s3/bucketlistresultset.pyi | 44 +
.../third_party/2and3/boto/s3/bucketlogging.pyi | 15 +
typeshed/third_party/2and3/boto/s3/connection.pyi | 71 +
typeshed/third_party/2and3/boto/s3/cors.pyi | 23 +
.../third_party/2and3/boto/s3/deletemarker.pyi | 16 +
typeshed/third_party/2and3/boto/s3/key.pyi | 91 +
typeshed/third_party/2and3/boto/s3/keyfile.pyi | 33 +
typeshed/third_party/2and3/boto/s3/lifecycle.pyi | 55 +
typeshed/third_party/2and3/boto/s3/multidelete.pyi | 31 +
typeshed/third_party/2and3/boto/s3/multipart.pyi | 53 +
typeshed/third_party/2and3/boto/s3/prefix.pyi | 14 +
typeshed/third_party/2and3/boto/s3/tagging.pyi | 26 +
typeshed/third_party/2and3/boto/s3/user.pyi | 14 +
typeshed/third_party/2and3/boto/s3/website.pyi | 66 +
typeshed/third_party/2and3/certifi.pyi | 2 +
.../third_party/2and3/characteristic/__init__.pyi | 34 +
typeshed/third_party/2and3/jinja2/__init__.pyi | 11 +
typeshed/third_party/2and3/jinja2/_compat.pyi | 38 +
typeshed/third_party/2and3/jinja2/_stringdefs.pyi | 44 +
typeshed/third_party/2and3/jinja2/bccache.pyi | 48 +
typeshed/third_party/2and3/jinja2/compiler.pyi | 180 ++
typeshed/third_party/2and3/jinja2/constants.pyi | 5 +
typeshed/third_party/2and3/jinja2/debug.pyi | 41 +
typeshed/third_party/2and3/jinja2/defaults.pyi | 25 +
typeshed/third_party/2and3/jinja2/environment.pyi | 109 +
typeshed/third_party/2and3/jinja2/exceptions.pyi | 37 +
typeshed/third_party/2and3/jinja2/ext.pyi | 62 +
typeshed/third_party/2and3/jinja2/filters.pyi | 61 +
typeshed/third_party/2and3/jinja2/lexer.pyi | 121 +
typeshed/third_party/2and3/jinja2/loaders.pyi | 74 +
typeshed/third_party/2and3/jinja2/meta.pyi | 15 +
typeshed/third_party/2and3/jinja2/nodes.pyi | 254 ++
typeshed/third_party/2and3/jinja2/optimizer.pyi | 33 +
typeshed/third_party/2and3/jinja2/parser.pyi | 64 +
typeshed/third_party/2and3/jinja2/runtime.pyi | 134 +
typeshed/third_party/2and3/jinja2/sandbox.pyi | 38 +
typeshed/third_party/2and3/jinja2/tests.pyi | 28 +
typeshed/third_party/2and3/jinja2/utils.pyi | 64 +
typeshed/third_party/2and3/jinja2/visitor.pyi | 12 +
typeshed/third_party/2and3/markupsafe/__init__.pyi | 58 +
typeshed/third_party/2and3/markupsafe/_compat.pyi | 23 +
.../third_party/2and3/markupsafe/_constants.pyi | 7 +
typeshed/third_party/2and3/markupsafe/_native.pyi | 11 +
.../third_party/2and3/markupsafe/_speedups.pyi | 11 +
typeshed/third_party/2and3/mypy_extensions.pyi | 11 +
typeshed/third_party/2and3/pytz/__init__.pyi | 26 +
typeshed/third_party/2and3/pytz/lazy.pyi | 13 +
typeshed/third_party/2and3/singledispatch.pyi | 17 +
typeshed/third_party/2and3/ujson.pyi | 51 +
typeshed/third_party/3.6/click/__init__.pyi | 98 +
typeshed/third_party/3.6/click/core.pyi | 435 +++
typeshed/third_party/3.6/click/decorators.pyi | 218 ++
typeshed/third_party/3.6/click/exceptions.pyi | 91 +
typeshed/third_party/3.6/click/formatting.pyi | 89 +
typeshed/third_party/3.6/click/globals.pyi | 17 +
typeshed/third_party/3.6/click/parser.pyi | 102 +
typeshed/third_party/3.6/click/termui.pyi | 147 +
typeshed/third_party/3.6/click/types.pyi | 283 ++
typeshed/third_party/3.6/click/utils.pyi | 118 +
.../third_party/3/dateutil/__init__.pyi | 0
typeshed/third_party/3/dateutil/parser.pyi | 52 +
typeshed/third_party/3/dateutil/relativedelta.pyi | 112 +
typeshed/third_party/3/docutils/__init__.pyi | 1 +
typeshed/third_party/3/docutils/examples.pyi | 3 +
typeshed/third_party/3/docutils/nodes.pyi | 8 +
.../third_party/3/docutils/parsers/__init__.pyi | 1 +
.../3/docutils/parsers/rst/__init__.pyi | 0
.../third_party/3/docutils/parsers/rst/nodes.pyi | 1 +
.../third_party/3/docutils/parsers/rst/roles.pyi | 10 +
.../third_party/3/docutils/parsers/rst/states.pyi | 5 +
typeshed/third_party/3/enum.pyi | 50 +
typeshed/third_party/3/itsdangerous.pyi | 156 +
.../third_party/3/lxml/__init__.pyi | 0
typeshed/third_party/3/lxml/etree.pyi | 169 +
typeshed/third_party/3/lxml/objectify.pyi | 13 +
typeshed/third_party/3/pkg_resources.pyi | 313 ++
typeshed/third_party/3/requests/__init__.pyi | 39 +
typeshed/third_party/3/requests/adapters.pyi | 72 +
typeshed/third_party/3/requests/api.pyi | 18 +
typeshed/third_party/3/requests/auth.pyi | 41 +
typeshed/third_party/3/requests/compat.pyi | 6 +
typeshed/third_party/3/requests/cookies.pyi | 65 +
typeshed/third_party/3/requests/exceptions.pyi | 26 +
typeshed/third_party/3/requests/hooks.pyi | 8 +
typeshed/third_party/3/requests/models.pyi | 136 +
.../third_party/3/requests/packages/__init__.pyi | 8 +
.../3/requests/packages/urllib3/__init__.pyi | 35 +
.../3/requests/packages/urllib3/_collections.pyi | 51 +
.../3/requests/packages/urllib3/connection.pyi | 64 +
.../3/requests/packages/urllib3/connectionpool.pyi | 89 +
.../requests/packages/urllib3/contrib/__init__.pyi | 3 +
.../3/requests/packages/urllib3/exceptions.pyi | 54 +
.../3/requests/packages/urllib3/fields.pyi | 16 +
.../3/requests/packages/urllib3/filepost.pyi | 19 +
.../packages/urllib3/packages/__init__.pyi | 3 +
.../packages/ssl_match_hostname/__init__.pyi | 8 +
.../ssl_match_hostname/_implementation.pyi | 7 +
.../3/requests/packages/urllib3/poolmanager.pyi | 31 +
.../3/requests/packages/urllib3/request.pyi | 13 +
.../3/requests/packages/urllib3/response.pyi | 58 +
.../3/requests/packages/urllib3/util/__init__.pyi | 29 +
.../requests/packages/urllib3/util/connection.pyi | 11 +
.../3/requests/packages/urllib3/util/request.pyi | 12 +
.../3/requests/packages/urllib3/util/response.pyi | 5 +
.../3/requests/packages/urllib3/util/retry.pyi | 36 +
.../3/requests/packages/urllib3/util/ssl_.pyi | 24 +
.../3/requests/packages/urllib3/util/timeout.pyi | 24 +
.../3/requests/packages/urllib3/util/url.pyi | 26 +
typeshed/third_party/3/requests/sessions.pyi | 108 +
typeshed/third_party/3/requests/status_codes.pyi | 8 +
typeshed/third_party/3/requests/structures.pyi | 12 +
typeshed/third_party/3/requests/utils.pyi | 52 +
typeshed/third_party/3/six/__init__.pyi | 103 +
typeshed/third_party/3/six/moves/__init__.pyi | 34 +
typeshed/third_party/3/six/moves/cPickle.pyi | 6 +
.../third_party/3/six/moves/urllib/__init__.pyi | 10 +
typeshed/third_party/3/six/moves/urllib/error.pyi | 8 +
typeshed/third_party/3/six/moves/urllib/parse.pyi | 22 +
.../third_party/3/six/moves/urllib/request.pyi | 40 +
.../third_party/3/six/moves/urllib/response.pyi | 1 +
.../third_party/3/six/moves/urllib/robotparser.pyi | 6 +
typeshed/third_party/3/six/moves/urllib_error.pyi | 10 +
typeshed/third_party/3/six/moves/urllib_parse.pyi | 20 +
.../third_party/3/six/moves/urllib_request.pyi | 41 +
.../third_party/3/six/moves/urllib_response.pyi | 1 +
.../third_party/3/six/moves/urllib_robotparser.pyi | 8 +
typeshed/third_party/3/typed_ast/__init__.pyi | 2 +
typeshed/third_party/3/typed_ast/ast27.pyi | 360 +++
typeshed/third_party/3/typed_ast/ast35.pyi | 392 +++
typeshed/third_party/3/typed_ast/conversions.pyi | 4 +
typeshed/third_party/3/werkzeug/__init__.pyi | 154 +
typeshed/third_party/3/werkzeug/_compat.pyi | 47 +
typeshed/third_party/3/werkzeug/_internal.pyi | 22 +
typeshed/third_party/3/werkzeug/_reloader.pyi | 33 +
.../third_party/3/werkzeug/contrib/__init__.pyi | 3 +
typeshed/third_party/3/werkzeug/contrib/atom.pyi | 54 +
typeshed/third_party/3/werkzeug/contrib/cache.pyi | 87 +
typeshed/third_party/3/werkzeug/contrib/fixers.pyi | 41 +
typeshed/third_party/3/werkzeug/contrib/iterio.pyi | 42 +
.../third_party/3/werkzeug/contrib/jsrouting.pyi | 14 +
.../third_party/3/werkzeug/contrib/limiter.pyi | 11 +
typeshed/third_party/3/werkzeug/contrib/lint.pyi | 47 +
.../third_party/3/werkzeug/contrib/profiler.pyi | 18 +
.../3/werkzeug/contrib/securecookie.pyi | 30 +
.../third_party/3/werkzeug/contrib/sessions.pyi | 58 +
.../third_party/3/werkzeug/contrib/testtools.pyi | 13 +
.../third_party/3/werkzeug/contrib/wrappers.pyi | 31 +
typeshed/third_party/3/werkzeug/datastructures.pyi | 389 +++
typeshed/third_party/3/werkzeug/debug/__init__.pyi | 43 +
typeshed/third_party/3/werkzeug/debug/console.pyi | 48 +
typeshed/third_party/3/werkzeug/debug/repr.pyi | 37 +
typeshed/third_party/3/werkzeug/debug/tbtools.pyi | 67 +
typeshed/third_party/3/werkzeug/exceptions.pyi | 152 +
typeshed/third_party/3/werkzeug/filesystem.pyi | 11 +
typeshed/third_party/3/werkzeug/formparser.pyi | 44 +
typeshed/third_party/3/werkzeug/http.pyi | 42 +
typeshed/third_party/3/werkzeug/local.pyi | 104 +
typeshed/third_party/3/werkzeug/posixemulation.pyi | 11 +
typeshed/third_party/3/werkzeug/routing.pyi | 182 ++
typeshed/third_party/3/werkzeug/script.pyi | 16 +
typeshed/third_party/3/werkzeug/security.pyi | 16 +
typeshed/third_party/3/werkzeug/serving.pyi | 84 +
typeshed/third_party/3/werkzeug/test.pyi | 85 +
typeshed/third_party/3/werkzeug/testapp.pyi | 13 +
typeshed/third_party/3/werkzeug/urls.pyi | 71 +
typeshed/third_party/3/werkzeug/useragents.pyi | 18 +
typeshed/third_party/3/werkzeug/utils.pyi | 53 +
typeshed/third_party/3/werkzeug/wrappers.pyi | 194 ++
typeshed/third_party/3/werkzeug/wsgi.pyi | 88 +
1181 files changed, 53894 insertions(+), 90333 deletions(-)
diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index 731180e..0000000
--- a/.gitignore
+++ /dev/null
@@ -1,29 +0,0 @@
-build/
-__pycache__
-*.py[cod]
-*~
-@*
-/build
-/env
-docs/build/
-*.iml
-/out/
-.venv/
-.mypy_cache/
-.incremental_checker_cache.json
-.cache
-
-# Packages
-*.egg
-*.egg-info
-
-# IDEs
-.idea
-*.swp
-
-# Operating Systems
-.DS_store
-
-# Coverage Files
-htmlcov
-.coverage*
diff --git a/.gitmodules b/.gitmodules
deleted file mode 100644
index 6b366ad..0000000
--- a/.gitmodules
+++ /dev/null
@@ -1,3 +0,0 @@
-[submodule "typeshed"]
- path = typeshed
- url = http://github.com/python/typeshed
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 4c25d0e..0000000
--- a/.travis.yml
+++ /dev/null
@@ -1,20 +0,0 @@
-sudo: false
-language: python
-python:
- - "3.3"
- - "3.4"
- # Specifically request 3.5.1 because we need to be compatible with that.
- - "3.5.1"
- - "3.6"
- - "3.7-dev"
- # Pypy build is disabled because it doubles the travis build time, and it rarely fails
- # unless one one of the other builds fails.
- # - "pypy3"
-
-install:
- - pip install -r test-requirements.txt
- - python setup.py install
-
-script:
- - python runtests.py -x lint
- - if [[ $TRAVIS_PYTHON_VERSION == '3.6' ]]; then flake8; fi
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
deleted file mode 100644
index c01af3b..0000000
--- a/CONTRIBUTING.md
+++ /dev/null
@@ -1,152 +0,0 @@
-Contributing to Mypy
-====================
-
-Welcome! Mypy is a community project that aims to work for a wide
-range of Python users and Python codebases. If you're trying Mypy on
-your Python code, your experience and what you can contribute are
-important to the project's success.
-
-
-Getting started, building, and testing
---------------------------------------
-
-If you haven't already, take a look at the project's
-[README.md file](README.md)
-and the [Mypy documentation](http://mypy.readthedocs.io/en/latest/),
-and try adding type annotations to your file and type-checking it with Mypy.
-
-
-Discussion
-----------
-
-If you've run into behavior in Mypy you don't understand, or you're
-having trouble working out a good way to apply it to your code, or
-you've found a bug or would like a feature it doesn't have, we want to
-hear from you!
-
-Our main forum for discussion is the project's [GitHub issue
-tracker](https://github.com/python/mypy/issues). This is the right
-place to start a discussion of any of the above or most any other
-topic concerning the project.
-
-For less formal discussion we have a chat room on
-[gitter.im](https://gitter.im/python/mypy). Some Mypy core developers
-are almost always present; feel free to find us there and we're happy
-to chat. Substantive technical discussion will be directed to the
-issue tracker.
-
-(We also have an IRC channel, `#python-mypy` on irc.freenode.net.
-This is lightly used, we have mostly switched to the gitter room
-mentioned above.)
-
-#### Code of Conduct
-
-Everyone participating in the Mypy community, and in particular in our
-issue tracker, pull requests, and IRC channel, is expected to treat
-other people with respect and more generally to follow the guidelines
-articulated in the [Python Community Code of
-Conduct](https://www.python.org/psf/codeofconduct/).
-
-
-Submitting Changes
-------------------
-
-Even more excellent than a good bug report is a fix for a bug, or the
-implementation of a much-needed new feature. (*) We'd love to have
-your contributions.
-
-(*) If your new feature will be a lot of work, we recommend talking to
- us early -- see below.
-
-We use the usual GitHub pull-request flow, which may be familiar to
-you if you've contributed to other projects on GitHub. For the mechanics,
-see [our git and GitHub workflow help page](https://github.com/python/mypy/wiki/Using-Git-And-GitHub),
-or [GitHub's own documentation](https://help.github.com/articles/using-pull-requests/).
-
-Anyone interested in Mypy may review your code. One of the Mypy core
-developers will merge your pull request when they think it's ready.
-For every pull request, we aim to promptly either merge it or say why
-it's not yet ready; if you go a few days without a reply, please feel
-free to ping the thread by adding a new comment.
-
-At present the core developers are (alphabetically):
-* David Fisher (@ddfisher)
-* Jukka Lehtosalo (@JukkaL)
-* Greg Price (@gnprice)
-* Guido van Rossum (@gvanrossum)
-
-
-Preparing Changes
------------------
-
-Before you begin: if your change will be a significant amount of work
-to write, we highly recommend starting by opening an issue laying out
-what you want to do. That lets a conversation happen early in case
-other contributors disagree with what you'd like to do or have ideas
-that will help you do it.
-
-The best pull requests are focused, clearly describe what they're for
-and why they're correct, and contain tests for whatever changes they
-make to the code's behavior. As a bonus these are easiest for someone
-to review, which helps your pull request get merged quickly! Standard
-advice about good pull requests for open-source projects applies; we
-have [our own writeup](https://github.com/python/mypy/wiki/Good-Pull-Request)
-of this advice.
-
-See also our [coding conventions](https://github.com/python/mypy/wiki/Code-Conventions) --
-which consist mainly of a reference to
-[PEP 8](https://www.python.org/dev/peps/pep-0008/) -- for the code you
-put in the pull request.
-
-You may also find other pages in the
-[Mypy developer guide](https://github.com/python/mypy/wiki/Developer-Guides)
-helpful in developing your change.
-
-
-Issue-tracker conventions
--------------------------
-
-We aim to reply to all new issues promptly. We'll assign a milestone
-to help us track which issues we intend to get to when, and may apply
-labels to carry some other information. Here's what our milestones
-and labels mean.
-
-### Task priority and sizing
-
-We use GitHub "labels" ([see our
-list](https://github.com/python/mypy/labels)) to roughly order what we
-want to do soon and less soon. There's two dimensions taken into
-account: **priority** (does it matter to our users) and **size** (how
-long will it take to complete).
-
-Bugs that aren't a huge deal but do matter to users and don't seem
-like a lot of work to fix generally will be dealt with sooner; things
-that will take longer may go further out.
-
-We are trying to keep the backlog at a manageable size, an issue that is
-unlikely to be acted upon in foreseeable future is going to be
-respectfully closed. This doesn't mean the issue is not important, but
-rather reflects the limits of the team.
-
-The **question** label is for issue threads where a user is asking a
-question but it isn't yet clear that it represents something to actually
-change. We use the issue tracker as the preferred venue for such
-questions, even when they aren't literally issues, to keep down the
-number of distinct discussion venues anyone needs to track. These might
-evolve into a bug or feature request.
-
-Issues **without a priority or size** haven't been triaged. We aim to
-triage all new issues promptly, but there are some issues from previous
-years that we haven't yet re-reviewed since adopting these conventions.
-
-### Other labels
-
-* **needs discussion**: This issue needs agreement on some kind of
- design before it makes sense to implement it, and it either doesn't
- yet have a design or doesn't yet have agreement on one.
-* **feature**, **bug**, **crash**, **refactoring**, **documentation**:
- These classify the user-facing impact of the change. Specifically
- "refactoring" means there should be no user-facing effect.
-* **topic-** labels group issues touching a similar aspect of the
- project, for example PEP 484 compatibility, a specific command-line
- option or dependency.
diff --git a/CREDITS b/CREDITS
deleted file mode 100644
index d4fe9ee..0000000
--- a/CREDITS
+++ /dev/null
@@ -1,101 +0,0 @@
-Credits
--------
-
-Lead developer:
-
- Jukka Lehtosalo <jukka.lehtosalo at iki.fi>
-
-Core team:
-
- Guido <guido at dropbox.com>
- David Fisher <ddfisher at dropbox.com>
- Greg Price <gregprice at dropbox.com>
-
-Contributors (in alphabetical order, including typeshed):
-
- Tim Abbott
- Steven Allen (@Stebalien)
- Della Anjeh
- Reid Barton (@rwbarton)
- Matthias Bussonnier
- Anup Chenthamarakshan
- Kyle Consalus
- Ian Cordasco
- ctcutler
- Ben Darnell
- Miguel Garcia (@rockneurotiko)
- Mihnea Giurgea
- Ryan Gonzalez (@kirbyfan64)
- James Guthrie
- Jared Hance
- Ashley Hewson (@ashleyh)
- icoxfog417
- Bob Ippolito (@etrepum)
- ismail-s
- Sander Kersten (@spkersten)
- Matthias Kramm
- Ian Kronquist (@iankronquist)
- Yuval Langer
- Howard Lee
- Tad Leonard
- Li Haoyi
- Darjus Loktevic
- Ben Longbons
- Florian Ludwig (@FlorianLudwig)
- Robert T. McGibbon
- Ron Murawski <ron at horizonchess.com>
- Motoki Naruse
- Jared Pochtar (@jaredp)
- Michal Pokorný
- Eric Price (@ecprice)
- Brodie Rao
- Sebastian Reuße
- Sebastian Riikonen
- Seo Sanghyeon
- Marek Sapota
- Gigi Sayfan
- Vlad Shcherbina
- Anders Schuller
- Daniel Shaulov
- David Shea
- Vita Smid
- Schuyler Smith
- Marcell Vazquez-Chanlatte (@mvcisback)
- Prayag Verma
- Igor Vuk (@ivuk)
- Jeff Walden (@jswalden)
- Michael Walter
- Jing Wang
- Wen Zhang
- Roy Williams
- wizzardx
- Matthew Wright
- Yuanchao Zhu (@yczhu)
- Gennadiy Zlobin (@gennad)
-
-Additional thanks to:
-
- Alex Allain
- Max Bolingbroke
- Peter Calvert
- Kannan Goundan
- Kathy Gray
- David J Greaves
- Riitta Ikonen
- Terho Ikonen
- Stephen Kell
- Łukasz Langa
- Laura Lehtosalo
- Peter Ludemann
- Seppo Mattila
- Robin Message
- Alan Mycroft
- Dominic Orchard
- Pekka Rapinoja
- Matt Robben
- Satnam Singh
- Juha Sorva
- Clay Sweetser
- Jorma Tarhio
- Jussi Tuovila
- Andrey Vlasovskikh
diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index 8145cc3..0000000
--- a/LICENSE
+++ /dev/null
@@ -1,228 +0,0 @@
-Mypy is licensed under the terms of the MIT license, reproduced below.
-
-= = = = =
-
-The MIT License
-
-Copyright (c) 2015-2016 Jukka Lehtosalo and contributors
-
-Permission is hereby granted, free of charge, to any person obtaining a
-copy of this software and associated documentation files (the "Software"),
-to deal in the Software without restriction, including without limitation
-the rights to use, copy, modify, merge, publish, distribute, sublicense,
-and/or sell copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-= = = = =
-
-Portions of mypy are licensed under different licenses. The files
-under stdlib-samples and lib-typing are licensed under the PSF 2
-License, reproduced below.
-
-= = = = =
-
-PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
---------------------------------------------
-
-1. This LICENSE AGREEMENT is between the Python Software Foundation
-("PSF"), and the Individual or Organization ("Licensee") accessing and
-otherwise using this software ("Python") in source or binary form and
-its associated documentation.
-
-2. Subject to the terms and conditions of this License Agreement, PSF hereby
-grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce,
-analyze, test, perform and/or display publicly, prepare derivative works,
-distribute, and otherwise use Python alone or in any derivative version,
-provided, however, that PSF's License Agreement and PSF's notice of copyright,
-i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
-2011, 2012 Python Software Foundation; All Rights Reserved" are retained in Python
-alone or in any derivative version prepared by Licensee.
-
-3. In the event Licensee prepares a derivative work that is based on
-or incorporates Python or any part thereof, and wants to make
-the derivative work available to others as provided herein, then
-Licensee hereby agrees to include in any such work a brief summary of
-the changes made to Python.
-
-4. PSF is making Python available to Licensee on an "AS IS"
-basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
-IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
-DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
-FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT
-INFRINGE ANY THIRD PARTY RIGHTS.
-
-5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
-FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
-A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON,
-OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
-
-6. This License Agreement will automatically terminate upon a material
-breach of its terms and conditions.
-
-7. Nothing in this License Agreement shall be deemed to create any
-relationship of agency, partnership, or joint venture between PSF and
-Licensee. This License Agreement does not grant permission to use PSF
-trademarks or trade name in a trademark sense to endorse or promote
-products or services of Licensee, or any third party.
-
-8. By copying, installing or otherwise using Python, Licensee
-agrees to be bound by the terms and conditions of this License
-Agreement.
-
-
-BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0
--------------------------------------------
-
-BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1
-
-1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an
-office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the
-Individual or Organization ("Licensee") accessing and otherwise using
-this software in source or binary form and its associated
-documentation ("the Software").
-
-2. Subject to the terms and conditions of this BeOpen Python License
-Agreement, BeOpen hereby grants Licensee a non-exclusive,
-royalty-free, world-wide license to reproduce, analyze, test, perform
-and/or display publicly, prepare derivative works, distribute, and
-otherwise use the Software alone or in any derivative version,
-provided, however, that the BeOpen Python License is retained in the
-Software, alone or in any derivative version prepared by Licensee.
-
-3. BeOpen is making the Software available to Licensee on an "AS IS"
-basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
-IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND
-DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
-FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT
-INFRINGE ANY THIRD PARTY RIGHTS.
-
-4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE
-SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS
-AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY
-DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
-
-5. This License Agreement will automatically terminate upon a material
-breach of its terms and conditions.
-
-6. This License Agreement shall be governed by and interpreted in all
-respects by the law of the State of California, excluding conflict of
-law provisions. Nothing in this License Agreement shall be deemed to
-create any relationship of agency, partnership, or joint venture
-between BeOpen and Licensee. This License Agreement does not grant
-permission to use BeOpen trademarks or trade names in a trademark
-sense to endorse or promote products or services of Licensee, or any
-third party. As an exception, the "BeOpen Python" logos available at
-http://www.pythonlabs.com/logos.html may be used according to the
-permissions granted on that web page.
-
-7. By copying, installing or otherwise using the software, Licensee
-agrees to be bound by the terms and conditions of this License
-Agreement.
-
-
-CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1
----------------------------------------
-
-1. This LICENSE AGREEMENT is between the Corporation for National
-Research Initiatives, having an office at 1895 Preston White Drive,
-Reston, VA 20191 ("CNRI"), and the Individual or Organization
-("Licensee") accessing and otherwise using Python 1.6.1 software in
-source or binary form and its associated documentation.
-
-2. Subject to the terms and conditions of this License Agreement, CNRI
-hereby grants Licensee a nonexclusive, royalty-free, world-wide
-license to reproduce, analyze, test, perform and/or display publicly,
-prepare derivative works, distribute, and otherwise use Python 1.6.1
-alone or in any derivative version, provided, however, that CNRI's
-License Agreement and CNRI's notice of copyright, i.e., "Copyright (c)
-1995-2001 Corporation for National Research Initiatives; All Rights
-Reserved" are retained in Python 1.6.1 alone or in any derivative
-version prepared by Licensee. Alternately, in lieu of CNRI's License
-Agreement, Licensee may substitute the following text (omitting the
-quotes): "Python 1.6.1 is made available subject to the terms and
-conditions in CNRI's License Agreement. This Agreement together with
-Python 1.6.1 may be located on the Internet using the following
-unique, persistent identifier (known as a handle): 1895.22/1013. This
-Agreement may also be obtained from a proxy server on the Internet
-using the following URL: http://hdl.handle.net/1895.22/1013".
-
-3. In the event Licensee prepares a derivative work that is based on
-or incorporates Python 1.6.1 or any part thereof, and wants to make
-the derivative work available to others as provided herein, then
-Licensee hereby agrees to include in any such work a brief summary of
-the changes made to Python 1.6.1.
-
-4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS"
-basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
-IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND
-DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
-FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT
-INFRINGE ANY THIRD PARTY RIGHTS.
-
-5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
-1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
-A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1,
-OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
-
-6. This License Agreement will automatically terminate upon a material
-breach of its terms and conditions.
-
-7. This License Agreement shall be governed by the federal
-intellectual property law of the United States, including without
-limitation the federal copyright law, and, to the extent such
-U.S. federal law does not apply, by the law of the Commonwealth of
-Virginia, excluding Virginia's conflict of law provisions.
-Notwithstanding the foregoing, with regard to derivative works based
-on Python 1.6.1 that incorporate non-separable material that was
-previously distributed under the GNU General Public License (GPL), the
-law of the Commonwealth of Virginia shall govern this License
-Agreement only as to issues arising under or with respect to
-Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this
-License Agreement shall be deemed to create any relationship of
-agency, partnership, or joint venture between CNRI and Licensee. This
-License Agreement does not grant permission to use CNRI trademarks or
-trade name in a trademark sense to endorse or promote products or
-services of Licensee, or any third party.
-
-8. By clicking on the "ACCEPT" button where indicated, or by copying,
-installing or otherwise using Python 1.6.1, Licensee agrees to be
-bound by the terms and conditions of this License Agreement.
-
- ACCEPT
-
-
-CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2
---------------------------------------------------
-
-Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam,
-The Netherlands. All rights reserved.
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the name of Stichting Mathematisch
-Centrum or CWI not be used in advertising or publicity pertaining to
-distribution of the software without specific, written prior
-permission.
-
-STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
-THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
-FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-= = = = =
\ No newline at end of file
diff --git a/PKG-INFO b/PKG-INFO
new file mode 100644
index 0000000..c9cf741
--- /dev/null
+++ b/PKG-INFO
@@ -0,0 +1,30 @@
+Metadata-Version: 1.1
+Name: mypy
+Version: 0.470
+Summary: Optional static typing for Python
+Home-page: http://www.mypy-lang.org/
+Author: Jukka Lehtosalo
+Author-email: jukka.lehtosalo at iki.fi
+License: MIT License
+Description: Mypy -- Optional Static Typing for Python
+ =========================================
+
+ Add type annotations to your Python programs, and use mypy to type
+ check them. Mypy is essentially a Python linter on steroids, and it
+ can catch many programming errors by analyzing your program, without
+ actually having to run it. Mypy has a powerful type system with
+ features such as type inference, gradual typing, generics and union
+ types.
+
+Platform: POSIX
+Classifier: Development Status :: 2 - Pre-Alpha
+Classifier: Environment :: Console
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Operating System :: POSIX
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.3
+Classifier: Programming Language :: Python :: 3.4
+Classifier: Programming Language :: Python :: 3.5
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Topic :: Software Development
diff --git a/README.md b/README.md
deleted file mode 100644
index d4db725..0000000
--- a/README.md
+++ /dev/null
@@ -1,307 +0,0 @@
-Mypy: Optional Static Typing for Python
-=======================================
-
-[![Build Status](https://travis-ci.org/python/mypy.svg)](https://travis-ci.org/python/mypy)
-[![Chat at https://gitter.im/python/mypy](https://badges.gitter.im/python/mypy.svg)](https://gitter.im/python/mypy?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
-
-
-Got a question? File an issue!
-------------------------------
-
-We don't have a mailing list; but we are always happy to answer
-questions on [gitter chat](https://gitter.im/python/mypy) or filed as
-issues in our trackers:
-
-- [mypy tracker](https://github.com/python/mypy/issues)
- for mypy isues
-- [typeshed tracker](https://github.com/python/typeshed/issues)
- for issues with specific modules
-- [typing tracker](https://github.com/python/typing/issues)
- for discussion of new type system features (PEP 484 changes) and
- runtime bugs in the typing module
-
-What is mypy?
--------------
-
-Mypy is an optional static type checker for Python. You can add type
-hints to your Python programs using the standard for type
-annotations introduced in Python 3.5 ([PEP 484](https://www.python.org/dev/peps/pep-0484/)), and use mypy to
-type check them statically. Find bugs in your programs without even
-running them!
-
-The type annotation standard has also been backported to earlier
-Python 3.x versions. Mypy supports Python 3.3 and later.
-
-For Python 2.7, you can add annotations as comments (this is also
-specified in [PEP 484](https://www.python.org/dev/peps/pep-0484/)).
-
-You can mix dynamic and static typing in your programs. You can always
-fall back to dynamic typing when static typing is not convenient, such
-as for legacy code.
-
-Here is a small example to whet your appetite:
-
-```python
-from typing import Iterator
-
-def fib(n: int) -> Iterator[int]:
- a, b = 0, 1
- while a < n:
- yield a
- a, b = b, a + b
-```
-
-Mypy is in development; some features are missing and there are bugs.
-See 'Development status' below.
-
-
-Requirements
-------------
-
-You need Python 3.3 or later to run mypy. You can have multiple Python
-versions (2.x and 3.x) installed on the same system without problems.
-
-In Ubuntu, Mint and Debian you can install Python 3 like this:
-
- $ sudo apt-get install python3 python3-pip
-
-For other Linux flavors, OS X and Windows, packages are available at
-
- http://www.python.org/getit/
-
-
-Quick start
------------
-
-Mypy can be installed using pip:
-
- $ python3 -m pip install -U mypy
-
-If you want to run the latest version of the code, you can install from git:
-
- $ python3 -m pip install -U git+git://github.com/python/mypy.git
-
-
-Now, if Python on your system is configured properly (else see
-"Troubleshooting" below), you can type-check a program like this:
-
- $ mypy PROGRAM
-
-You can always use a Python interpreter to run your statically typed
-programs, even if they have type errors:
-
- $ python3 PROGRAM
-
-
-Web site and documentation
---------------------------
-
-Documentation and additional information is available at the web site:
-
- http://www.mypy-lang.org/
-
-Or you can jump straight to the documentation:
-
- http://mypy.readthedocs.io/
-
-
-Troubleshooting
----------------
-
-Depending on your configuration, you may have to run `pip3` like
-this:
-
- $ python3 -m pip install -U mypy
-
-Except on Windows, it's best to always use the `--fast-parser`
-option to mypy; this requires installing `typed-ast`:
-
- $ python3 -m pip install -U typed-ast
-
-If the `mypy` command isn't found after installation: After either
-`pip3 install` or `setup.py install`, the `mypy` script and
-dependencies, including the `typing` module, will be installed to
-system-dependent locations. Sometimes the script directory will not
-be in `PATH`, and you have to add the target directory to `PATH`
-manually or create a symbolic link to the script. In particular, on
-Mac OS X, the script may be installed under `/Library/Frameworks`:
-
- /Library/Frameworks/Python.framework/Versions/<version>/bin
-
-In Windows, the script is generally installed in
-`\PythonNN\Scripts`. So, type check a program like this (replace
-`\Python34` with your Python installation path):
-
- C:\>\Python34\python \Python34\Scripts\mypy PROGRAM
-
-### Working with `virtualenv`
-
-If you are using [`virtualenv`](https://virtualenv.pypa.io/en/stable/),
-make sure you are running a python3 environment. Installing via `pip3`
-in a v2 environment will not configure the environment to run installed
-modules from the command line.
-
- $ python3 -m pip install -U virtualenv
- $ python3 -m virtualenv env
-
-
-Quick start for contributing to mypy
-------------------------------------
-
-If you want to contribute, first clone the mypy git repository:
-
- $ git clone --recurse-submodules https://github.com/python/mypy.git
-
-From the mypy directory, use pip to install mypy:
-
- $ cd mypy
- $ python3 -m pip install -U .
-
-Replace `python3` with your Python 3 interpreter. You may have to do
-the above as root. For example, in Ubuntu:
-
- $ sudo python3 -m pip install -U .
-
-Now you can use the `mypy` program just as above. In case of trouble
-see "Troubleshooting" above.
-
-The mypy wiki contains some useful information for contributors:
-
- https://github.com/python/mypy/wiki/Developer-Guides
-
-Working with the git version of mypy
-------------------------------------
-
-mypy contains a submodule, "typeshed". See http://github.com/python/typeshed.
-This submodule contains types for the Python standard library.
-
-Due to the way git submodules work, you'll have to do
-```
- git submodule update typeshed
-```
-whenever you change branches, merge, rebase, or pull.
-
-(It's possible to automate this: Search Google for "git hook update submodule")
-
-Running tests and linting
--------------------------
-
-First install any additional dependencies needed for testing:
-
- $ python3 -m pip install -U -r test-requirements.txt
-
-To run all tests, run the script `runtests.py` in the mypy repository:
-
- $ ./runtests.py
-
-Note that some tests will be disabled for older python versions.
-
-This will run all tests, including integration and regression tests,
-and will type check mypy and verify that all stubs are valid.
-
-You can run a subset of test suites by passing positive or negative
-filters:
-
- $ ./runtests.py lex parse -x lint -x stub
-
-For example, to run unit tests only, which run pretty quickly:
-
- $ ./runtests.py unit-test pytest
-
-The unit test suites are driven by a mixture of test frameworks:
-mypy's own `myunit` framework, and `pytest`, which we're in the
-process of migrating to. For finer control over which unit tests are
-run and how, you can run `py.test` or `scripts/myunit` directly, or
-pass inferior arguments via `-a`:
-
- $ py.test mypy/test/testcheck.py -v -k MethodCall
- $ ./runtests.py -v 'pytest mypy/test/testcheck' -a -v -a -k -a MethodCall
-
- $ PYTHONPATH=$PWD scripts/myunit -m mypy.test.testlex -v '*backslash*'
- $ ./runtests.py mypy.test.testlex -a -v -a '*backslash*'
-
-You can also run the type checker for manual testing without
-installing anything by setting up the Python module search path
-suitably (the lib-typing/3.2 path entry is not needed for Python 3.5
-or when you have manually installed the `typing` module):
-
- $ export PYTHONPATH=$PWD:$PWD/lib-typing/3.2
- $ python<version> -m mypy PROGRAM.py
-
-You can add the entry scripts to PATH for a single python3 version:
-
- $ export PATH=$PWD/scripts
- $ mypy PROGRAM.py
-
-You can check a module or string instead of a file:
-
- $ mypy PROGRAM.py
- $ mypy -m MODULE
- $ mypy -c 'import MODULE'
-
-To run the linter:
-
- $ ./runtests.py lint
-
-
-Coverage reports
-----------------
-
-There is an experimental feature to generate coverage reports. To use
-this feature, you need to `pip install -U lxml`. This is an extension
-module and requires various library headers to install; on a
-Debian-derived system the command
- `apt-get install python3-dev libxml2-dev libxslt1-dev`
-may provide the necessary dependencies.
-
-To use the feature, pass e.g. `--txt-report "$(mktemp -d)"`.
-
-
-Development status
-------------------
-
-Mypy is work in progress and is not yet production quality, though
-mypy development has been done using mypy for a while!
-
-Here are some of the more significant Python features not supported
-right now (but all of these will improve):
-
- - properties with setters not supported
- - limited metaclass support
- - only a subset of Python standard library modules are supported, and some
- only partially
- - 3rd party module support is limited
-
-The current development focus is to have a good coverage of Python
-features and the standard library (both 3.x and 2.7).
-
-
-Issue tracker
--------------
-
-Please report any bugs and enhancement ideas using the mypy issue
-tracker:
-
- https://github.com/python/mypy/issues
-
-Feel free to also ask questions on the tracker.
-
-
-Help wanted
------------
-
-Any help in testing, development, documentation and other tasks is
-highly appreciated and useful to the project. There are tasks for
-contributors of all experience levels. If you're just getting started,
-check out the
-[difficulty/easy](https://github.com/python/mypy/labels/difficulty%2Feasy)
-label.
-
-For more details, see the file [CONTRIBUTING.md](CONTRIBUTING.md).
-
-
-License
--------
-
-Mypy is licensed under the terms of the MIT License (see the file
-LICENSE).
diff --git a/appveyor.yml b/appveyor.yml
deleted file mode 100644
index 80fd0f8..0000000
--- a/appveyor.yml
+++ /dev/null
@@ -1,32 +0,0 @@
-environment:
- matrix:
-
- - PYTHON: "C:\\Python35"
- PYTHON_VERSION: "3.5.1"
- PYTHON_ARCH: "32"
-
- - PYTHON: "C:\\Python35-x64"
- PYTHON_VERSION: "3.5.1"
- PYTHON_ARCH: "64"
-
- - PYTHON: "C:\\Python36"
- PYTHON_VERSION: "3.6.x"
- PYTHON_ARCH: "32"
-
- - PYTHON: "C:\\Python36-x64"
- PYTHON_VERSION: "3.6.x"
- PYTHON_ARCH: "64"
-
-
-install:
- - "%PYTHON%\\python.exe -m pip install -r test-requirements.txt"
- - "git submodule update --init typeshed"
- - "%PYTHON%\\python.exe setup.py -q install"
-
-build: off
-
-test_script:
- # Ignore lint (it's run separately below), reports (since we don't have lxml),
- # and cmdline (since one of its tests depend on lxml)
- - "%PYTHON%\\python.exe runtests.py -x lint -x reports -x cmdline"
- - ps: if ($env:PYTHON_VERSION -Match "3.6.x" -And $env:PYTHON_ARCH -Match "64") { iex "$env:PYTHON\\python.exe -m flake8" }
diff --git a/build-requirements.txt b/build-requirements.txt
deleted file mode 100644
index 0a8547b..0000000
--- a/build-requirements.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-setuptools
-wheel
diff --git a/conftest.py b/conftest.py
deleted file mode 100644
index b2f3824..0000000
--- a/conftest.py
+++ /dev/null
@@ -1,4 +0,0 @@
-pytest_plugins = [
- 'mypy.test.data',
- 'pytest_cov',
-]
diff --git a/docs/Makefile b/docs/Makefile
deleted file mode 100644
index be69e9d..0000000
--- a/docs/Makefile
+++ /dev/null
@@ -1,177 +0,0 @@
-# Makefile for Sphinx documentation
-#
-
-# You can set these variables from the command line.
-SPHINXOPTS =
-SPHINXBUILD = sphinx-build
-PAPER =
-BUILDDIR = build
-
-# User-friendly check for sphinx-build
-ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1)
-$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/)
-endif
-
-# Internal variables.
-PAPEROPT_a4 = -D latex_paper_size=a4
-PAPEROPT_letter = -D latex_paper_size=letter
-ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
-# the i18n builder cannot share the environment and doctrees with the others
-I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
-
-.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
-
-help:
- @echo "Please use \`make <target>' where <target> is one of"
- @echo " html to make standalone HTML files"
- @echo " dirhtml to make HTML files named index.html in directories"
- @echo " singlehtml to make a single large HTML file"
- @echo " pickle to make pickle files"
- @echo " json to make JSON files"
- @echo " htmlhelp to make HTML files and a HTML help project"
- @echo " qthelp to make HTML files and a qthelp project"
- @echo " devhelp to make HTML files and a Devhelp project"
- @echo " epub to make an epub"
- @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
- @echo " latexpdf to make LaTeX files and run them through pdflatex"
- @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
- @echo " text to make text files"
- @echo " man to make manual pages"
- @echo " texinfo to make Texinfo files"
- @echo " info to make Texinfo files and run them through makeinfo"
- @echo " gettext to make PO message catalogs"
- @echo " changes to make an overview of all changed/added/deprecated items"
- @echo " xml to make Docutils-native XML files"
- @echo " pseudoxml to make pseudoxml-XML files for display purposes"
- @echo " linkcheck to check all external links for integrity"
- @echo " doctest to run all doctests embedded in the documentation (if enabled)"
-
-clean:
- rm -rf $(BUILDDIR)/*
-
-html:
- $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
- @echo
- @echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
-
-dirhtml:
- $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
- @echo
- @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
-
-singlehtml:
- $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
- @echo
- @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
-
-pickle:
- $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
- @echo
- @echo "Build finished; now you can process the pickle files."
-
-json:
- $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
- @echo
- @echo "Build finished; now you can process the JSON files."
-
-htmlhelp:
- $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
- @echo
- @echo "Build finished; now you can run HTML Help Workshop with the" \
- ".hhp project file in $(BUILDDIR)/htmlhelp."
-
-qthelp:
- $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
- @echo
- @echo "Build finished; now you can run "qcollectiongenerator" with the" \
- ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
- @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Mypy.qhcp"
- @echo "To view the help file:"
- @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Mypy.qhc"
-
-devhelp:
- $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
- @echo
- @echo "Build finished."
- @echo "To view the help file:"
- @echo "# mkdir -p $$HOME/.local/share/devhelp/Mypy"
- @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Mypy"
- @echo "# devhelp"
-
-epub:
- $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
- @echo
- @echo "Build finished. The epub file is in $(BUILDDIR)/epub."
-
-latex:
- $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
- @echo
- @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
- @echo "Run \`make' in that directory to run these through (pdf)latex" \
- "(use \`make latexpdf' here to do that automatically)."
-
-latexpdf:
- $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
- @echo "Running LaTeX files through pdflatex..."
- $(MAKE) -C $(BUILDDIR)/latex all-pdf
- @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
-
-latexpdfja:
- $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
- @echo "Running LaTeX files through platex and dvipdfmx..."
- $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
- @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
-
-text:
- $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
- @echo
- @echo "Build finished. The text files are in $(BUILDDIR)/text."
-
-man:
- $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
- @echo
- @echo "Build finished. The manual pages are in $(BUILDDIR)/man."
-
-texinfo:
- $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
- @echo
- @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
- @echo "Run \`make' in that directory to run these through makeinfo" \
- "(use \`make info' here to do that automatically)."
-
-info:
- $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
- @echo "Running Texinfo files through makeinfo..."
- make -C $(BUILDDIR)/texinfo info
- @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
-
-gettext:
- $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
- @echo
- @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
-
-changes:
- $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
- @echo
- @echo "The overview file is in $(BUILDDIR)/changes."
-
-linkcheck:
- $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
- @echo
- @echo "Link check complete; look for any errors in the above output " \
- "or in $(BUILDDIR)/linkcheck/output.txt."
-
-doctest:
- $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
- @echo "Testing of doctests in the sources finished, look at the " \
- "results in $(BUILDDIR)/doctest/output.txt."
-
-xml:
- $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
- @echo
- @echo "Build finished. The XML files are in $(BUILDDIR)/xml."
-
-pseudoxml:
- $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
- @echo
- @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."
diff --git a/docs/README.md b/docs/README.md
deleted file mode 100644
index 2122eef..0000000
--- a/docs/README.md
+++ /dev/null
@@ -1,49 +0,0 @@
-Mypy Documentation
-==================
-
-What's this?
-------------
-
-This directory contains the source code for Mypy documentation (under `source/`)
-and build scripts. The documentation uses Sphinx and reStructuredText. We use
-`sphinx-rtd-theme` as the documentation theme.
-
-Building the documentation
---------------------------
-
-Install Sphinx and other dependencies (i.e. theme) needed for the documentation.
-From the `docs` directory, use `pip`:
-
-```
-$ pip install -r requirements-docs.txt
-```
-
-Build the documentation like this:
-
-```
-$ make html
-```
-
-The built documentation will be placed in the `docs/build` directory. Open
-`docs/build/index.html` to view the documentation.
-
-Helpful documentation build commands
-------------------------------------
-
-Clean the documentation build:
-
-```
-$ make clean
-```
-
-Test and check the links found in the documentation:
-
-```
-$ make linkcheck
-```
-
-Documentation on Read The Docs
-------------------------------
-
-The mypy documentation is hosted on Read The Docs, and the latest version
-can be found at https://mypy.readthedocs.io/en/latest.
diff --git a/docs/make.bat b/docs/make.bat
deleted file mode 100755
index 1e3d843..0000000
--- a/docs/make.bat
+++ /dev/null
@@ -1,242 +0,0 @@
- at ECHO OFF
-
-REM Command file for Sphinx documentation
-
-if "%SPHINXBUILD%" == "" (
- set SPHINXBUILD=sphinx-build
-)
-set BUILDDIR=build
-set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% source
-set I18NSPHINXOPTS=%SPHINXOPTS% source
-if NOT "%PAPER%" == "" (
- set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%
- set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS%
-)
-
-if "%1" == "" goto help
-
-if "%1" == "help" (
- :help
- echo.Please use `make ^<target^>` where ^<target^> is one of
- echo. html to make standalone HTML files
- echo. dirhtml to make HTML files named index.html in directories
- echo. singlehtml to make a single large HTML file
- echo. pickle to make pickle files
- echo. json to make JSON files
- echo. htmlhelp to make HTML files and a HTML help project
- echo. qthelp to make HTML files and a qthelp project
- echo. devhelp to make HTML files and a Devhelp project
- echo. epub to make an epub
- echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter
- echo. text to make text files
- echo. man to make manual pages
- echo. texinfo to make Texinfo files
- echo. gettext to make PO message catalogs
- echo. changes to make an overview over all changed/added/deprecated items
- echo. xml to make Docutils-native XML files
- echo. pseudoxml to make pseudoxml-XML files for display purposes
- echo. linkcheck to check all external links for integrity
- echo. doctest to run all doctests embedded in the documentation if enabled
- goto end
-)
-
-if "%1" == "clean" (
- for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i
- del /q /s %BUILDDIR%\*
- goto end
-)
-
-
-%SPHINXBUILD% 2> nul
-if errorlevel 9009 (
- echo.
- echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
- echo.installed, then set the SPHINXBUILD environment variable to point
- echo.to the full path of the 'sphinx-build' executable. Alternatively you
- echo.may add the Sphinx directory to PATH.
- echo.
- echo.If you don't have Sphinx installed, grab it from
- echo.http://sphinx-doc.org/
- exit /b 1
-)
-
-if "%1" == "html" (
- %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished. The HTML pages are in %BUILDDIR%/html.
- goto end
-)
-
-if "%1" == "dirhtml" (
- %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml.
- goto end
-)
-
-if "%1" == "singlehtml" (
- %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml.
- goto end
-)
-
-if "%1" == "pickle" (
- %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished; now you can process the pickle files.
- goto end
-)
-
-if "%1" == "json" (
- %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished; now you can process the JSON files.
- goto end
-)
-
-if "%1" == "htmlhelp" (
- %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished; now you can run HTML Help Workshop with the ^
-.hhp project file in %BUILDDIR%/htmlhelp.
- goto end
-)
-
-if "%1" == "qthelp" (
- %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished; now you can run "qcollectiongenerator" with the ^
-.qhcp project file in %BUILDDIR%/qthelp, like this:
- echo.^> qcollectiongenerator %BUILDDIR%\qthelp\Mypy.qhcp
- echo.To view the help file:
- echo.^> assistant -collectionFile %BUILDDIR%\qthelp\Mypy.ghc
- goto end
-)
-
-if "%1" == "devhelp" (
- %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished.
- goto end
-)
-
-if "%1" == "epub" (
- %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished. The epub file is in %BUILDDIR%/epub.
- goto end
-)
-
-if "%1" == "latex" (
- %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished; the LaTeX files are in %BUILDDIR%/latex.
- goto end
-)
-
-if "%1" == "latexpdf" (
- %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
- cd %BUILDDIR%/latex
- make all-pdf
- cd %BUILDDIR%/..
- echo.
- echo.Build finished; the PDF files are in %BUILDDIR%/latex.
- goto end
-)
-
-if "%1" == "latexpdfja" (
- %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
- cd %BUILDDIR%/latex
- make all-pdf-ja
- cd %BUILDDIR%/..
- echo.
- echo.Build finished; the PDF files are in %BUILDDIR%/latex.
- goto end
-)
-
-if "%1" == "text" (
- %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished. The text files are in %BUILDDIR%/text.
- goto end
-)
-
-if "%1" == "man" (
- %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished. The manual pages are in %BUILDDIR%/man.
- goto end
-)
-
-if "%1" == "texinfo" (
- %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo.
- goto end
-)
-
-if "%1" == "gettext" (
- %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished. The message catalogs are in %BUILDDIR%/locale.
- goto end
-)
-
-if "%1" == "changes" (
- %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes
- if errorlevel 1 exit /b 1
- echo.
- echo.The overview file is in %BUILDDIR%/changes.
- goto end
-)
-
-if "%1" == "linkcheck" (
- %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck
- if errorlevel 1 exit /b 1
- echo.
- echo.Link check complete; look for any errors in the above output ^
-or in %BUILDDIR%/linkcheck/output.txt.
- goto end
-)
-
-if "%1" == "doctest" (
- %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest
- if errorlevel 1 exit /b 1
- echo.
- echo.Testing of doctests in the sources finished, look at the ^
-results in %BUILDDIR%/doctest/output.txt.
- goto end
-)
-
-if "%1" == "xml" (
- %SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished. The XML files are in %BUILDDIR%/xml.
- goto end
-)
-
-if "%1" == "pseudoxml" (
- %SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml.
- goto end
-)
-
-:end
diff --git a/docs/requirements-docs.txt b/docs/requirements-docs.txt
deleted file mode 100644
index d20641e..0000000
--- a/docs/requirements-docs.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Sphinx >= 1.4.4
-sphinx-rtd-theme >= 0.1.9
diff --git a/docs/source/additional_features.rst b/docs/source/additional_features.rst
deleted file mode 100644
index b9dd07f..0000000
--- a/docs/source/additional_features.rst
+++ /dev/null
@@ -1,9 +0,0 @@
-Additional features
--------------------
-
-Several mypy features are not currently covered by this tutorial,
-including the following:
-
-- inheritance between generic classes
-- compatibility and subtyping of generic types, including covariance of generic types
-- ``super()``
diff --git a/docs/source/basics.rst b/docs/source/basics.rst
deleted file mode 100644
index 572364d..0000000
--- a/docs/source/basics.rst
+++ /dev/null
@@ -1,194 +0,0 @@
-Basics
-======
-
-This chapter introduces some core concepts of mypy, including function
-annotations, the ``typing`` module and library stubs. Read it carefully,
-as the rest of documentation may not make much sense otherwise.
-
-Function signatures
-*******************
-
-A function without a type annotation is considered dynamically typed:
-
-.. code-block:: python
-
- def greeting(name):
- return 'Hello, {}'.format(name)
-
-You can declare the signature of a function using the Python 3
-annotation syntax (Python 2 is discussed later in :ref:`python2`).
-This makes the the function statically typed, and that causes type
-checker report type errors within the function.
-
-Here's a version of the above function that is statically typed and
-will be type checked:
-
-.. code-block:: python
-
- def greeting(name: str) -> str:
- return 'Hello, {}'.format(name)
-
-If a function does not explicitly return a value we give the return
-type as ``None``. Using a ``None`` result in a statically typed
-context results in a type check error:
-
-.. code-block:: python
-
- def p() -> None:
- print('hello')
-
- a = p() # Type check error: p has None return value
-
-Arguments with default values can be annotated as follows:
-
-.. code-block:: python
-
- def greeting(name: str, prefix: str = 'Mr.') -> str:
- return 'Hello, {} {}'.format(name, prefix)
-
-Mixing dynamic and static typing
-********************************
-
-Mixing dynamic and static typing within a single file is often
-useful. For example, if you are migrating existing Python code to
-static typing, it may be easiest to do this incrementally, such as by
-migrating a few functions at a time. Also, when prototyping a new
-feature, you may decide to first implement the relevant code using
-dynamic typing and only add type signatures later, when the code is
-more stable.
-
-.. code-block:: python
-
- def f():
- 1 + 'x' # No static type error (dynamically typed)
-
- def g() -> None:
- 1 + 'x' # Type check error (statically typed)
-
-.. note::
-
- The earlier stages of mypy, known as the semantic analysis, may
- report errors even for dynamically typed functions. However, you
- should not rely on this, as this may change in the future.
-
-The typing module
-*****************
-
-The ``typing`` module contains many definitions that are useful in
-statically typed code. You typically use ``from ... import`` to import
-them (we'll explain ``Iterable`` later in this document):
-
-.. code-block:: python
-
- from typing import Iterable
-
- def greet_all(names: Iterable[str]) -> None:
- for name in names:
- print('Hello, {}'.format(name))
-
-For brevity, we often omit the ``typing`` import in code examples, but
-you should always include it in modules that contain statically typed
-code.
-
-The presence or absence of the ``typing`` module does not affect
-whether your code is type checked; it is only required when you use
-one or more special features it defines.
-
-Type checking programs
-**********************
-
-You can type check a program by using the ``mypy`` tool, which is
-basically a linter -- it checks your program for errors without actually
-running it::
-
- $ mypy program.py
-
-All errors reported by mypy are essentially warnings that you are free
-to ignore, if you so wish.
-
-The next chapter explains how to download and install mypy:
-:ref:`getting-started`.
-
-More command line options are documented in :ref:`command-line`.
-
-.. note::
-
- Depending on how mypy is configured, you may have to explicitly use
- the Python 3 interpreter to run mypy. The mypy tool is an ordinary
- mypy (and so also Python) program. For example::
-
- $ python3 -m mypy program.py
-
-.. _library-stubs:
-
-Library stubs and the Typeshed repo
-***********************************
-
-In order to type check code that uses library modules such as those
-included in the Python standard library, you need to have library
-*stubs*. A library stub defines a skeleton of the public interface
-of the library, including classes, variables and functions and
-their types, but dummy function bodies.
-
-For example, consider this code:
-
-.. code-block:: python
-
- x = chr(4)
-
-Without a library stub, the type checker would have no way of
-inferring the type of ``x`` and checking that the argument to ``chr``
-has a valid type. Mypy incorporates the `typeshed
-<https://github.com/python/typeshed>`_ project, which contains library
-stubs for the Python builtins and the standard library. The stub for
-the builtins contains a definition like this for ``chr``:
-
-.. code-block:: python
-
- def chr(code: int) -> str: ...
-
-In stub files we don't care about the function bodies, so we use
-an ellipsis instead. That ``...`` is three literal dots!
-
-Mypy complains if it can't find a stub (or a real module) for a
-library module that you import. You can create a stub easily; here is
-an overview:
-
-* Write a stub file for the library and store it as a ``.pyi`` file in
- the same directory as the library module.
-* Alternatively, put your stubs (``.pyi`` files) in a directory
- reserved for stubs (e.g., ``myproject/stubs``). In this case you
- have to set the environment variable ``MYPYPATH`` to refer to the
- directory. For example::
-
- $ export MYPYPATH=~/work/myproject/stubs
-
-Use the normal Python file name conventions for modules, e.g. ``csv.pyi``
-for module ``csv``. Use a subdirectory with ``__init__.pyi`` for packages.
-
-If a directory contains both a ``.py`` and a ``.pyi`` file for the
-same module, the ``.pyi`` file takes precedence. This way you can
-easily add annotations for a module even if you don't want to modify
-the source code. This can be useful, for example, if you use 3rd party
-open source libraries in your program (and there are no stubs in
-typeshed yet).
-
-That's it! Now you can access the module in mypy programs and type check
-code that uses the library. If you write a stub for a library module,
-consider making it available for other programmers that use mypy
-by contributing it back to the typeshed repo.
-
-There is more information about creating stubs in the
-`mypy wiki <https://github.com/python/mypy/wiki/Creating-Stubs-For-Python-Modules>`_.
-The following sections explain the kinds of type annotations you can use
-in your programs and stub files.
-
-.. note::
-
- You may be tempted to point ``MYPYPATH`` to the standard library or
- to the ``site-packages`` directory where your 3rd party packages
- are installed. This is almost always a bad idea -- you will likely
- get tons of error messages about code you didn't write and that
- mypy can't analyze all that well yet, and in the worst case
- scenario mypy may crash due to some construct in a 3rd party
- package that it didn't expect.
diff --git a/docs/source/builtin_types.rst b/docs/source/builtin_types.rst
deleted file mode 100644
index 4426df7..0000000
--- a/docs/source/builtin_types.rst
+++ /dev/null
@@ -1,37 +0,0 @@
-Built-in types
-==============
-
-These are examples of some of the most common built-in types:
-
-=================== ===============================
-Type Description
-=================== ===============================
-``int`` integer of arbitrary size
-``float`` floating point number
-``bool`` boolean value
-``str`` unicode string
-``bytes`` 8-bit string
-``object`` an arbitrary object (``object`` is the common base class)
-``List[str]`` list of ``str`` objects
-``Dict[str, int]`` dictionary from ``str`` keys to ``int`` values
-``Iterable[int]`` iterable object containing ints
-``Sequence[bool]`` sequence of booleans
-``Any`` dynamically typed value with an arbitrary type
-=================== ===============================
-
-The type ``Any`` and type constructors ``List``, ``Dict``,
-``Iterable`` and ``Sequence`` are defined in the ``typing`` module.
-
-The type ``Dict`` is a *generic* class, signified by type arguments within
-``[...]``. For example, ``Dict[int, str]`` is a dictionary from integers to
-strings and and ``Dict[Any, Any]`` is a dictionary of dynamically typed
-(arbitrary) values and keys. ``List`` is another generic class. ``Dict`` and
-``List`` are aliases for the built-ins ``dict`` and ``list``, respectively.
-
-``Iterable`` and ``Sequence`` are generic abstract base classes that
-correspond to Python protocols. For example, a ``str`` object or a
-``List[str]`` object is valid
-when ``Iterable[str]`` or ``Sequence[str]`` is expected. Note that even though
-they are similar to abstract base classes defined in ``abc.collections``
-(formerly ``collections``), they are not identical, since the built-in
-collection type objects do not support indexing.
diff --git a/docs/source/casts.rst b/docs/source/casts.rst
deleted file mode 100644
index 900ee0c..0000000
--- a/docs/source/casts.rst
+++ /dev/null
@@ -1,39 +0,0 @@
-.. _casts:
-
-Casts
-=====
-
-Mypy supports type casts that are usually used to coerce a statically
-typed value to a subtype. Unlike languages such as Java or C#,
-however, mypy casts are only used as hints for the type checker, and they
-don't perform a runtime type check. Use the function ``cast`` to perform a
-cast:
-
-.. code-block:: python
-
- from typing import cast, List
-
- o = [1] # type: object
- x = cast(List[int], o) # OK
- y = cast(List[str], o) # OK (cast performs no actual runtime check)
-
-To support runtime checking of casts such as the above, we'd have to check
-the types of all list items, which would be very inefficient for large lists.
-Use assertions if you want to
-perform an actual runtime check. Casts are used to silence spurious
-type checker warnings and give the type checker a little help when it can't
-quite understand what is going on.
-
-You don't need a cast for expressions with type ``Any``, or when
-assigning to a variable with type ``Any``, as was explained earlier.
-You can also use ``Any`` as the cast target type -- this lets you perform
-any operations on the result. For example:
-
-.. code-block:: python
-
- from typing import cast, Any
-
- x = 1
- x + 'x' # Type check error
- y = cast(Any, x)
- y + 'x' # Type check OK (runtime error)
diff --git a/docs/source/cheat_sheet.rst b/docs/source/cheat_sheet.rst
deleted file mode 100644
index 3c74d6f..0000000
--- a/docs/source/cheat_sheet.rst
+++ /dev/null
@@ -1,241 +0,0 @@
-.. _cheat-sheet-py2:
-
-Mypy syntax cheat sheet (Python 2)
-==================================
-
-This document is a quick cheat sheet showing how the `PEP 484 <https://www.python.org/dev/peps/pep-0484/>`_ type
-language represents various common types in Python 2.
-
-.. note::
-
- Technically many of the type annotations shown below are redundant,
- because mypy can derive them from the type of the expression. So
- many of the examples have a dual purpose: show how to write the
- annotation, and show the inferred types.
-
-
-Built-in types
-**************
-
-.. code-block:: python
-
- from typing import List, Set, Dict, Tuple, Text, Optional
-
- # For simple built-in types, just use the name of the type.
- x = 1 # type: int
- x = 1.0 # type: float
- x = True # type: bool
- x = "test" # type: str
- x = u"test" # type: unicode
-
- # For collections, the name of the type is capitalized, and the
- # name of the type inside the collection is in brackets.
- x = [1] # type: List[int]
- x = set([6, 7]) # type: Set[int]
-
- # For mappings, we need the types of both keys and values.
- x = dict(field=2.0) # type: Dict[str, float]
-
- # For tuples, we specify the types of all the elements.
- x = (3, "yes", 7.5) # type: Tuple[int, str, float]
-
- # For textual data, use Text.
- # This is `unicode` in Python 2 and `str` in Python 3.
- x = ["string", u"unicode"] # type: List[Text]
-
- # Use Optional for values that could be None.
- input_str = f() # type: Optional[str]
- if input_str is not None:
- print input_str
-
-
-Functions
-*********
-
-.. code-block:: python
-
- from typing import Callable, Iterable
-
- # This is how you annotate a function definition.
- def stringify(num):
- # type: (int) -> str
- """Your function docstring goes here after the type definition."""
- return str(num)
-
- # This function has no parameters and also returns nothing. Annotations
- # can also be placed on the same line as their function headers.
- def greet_world(): # type: () -> None
- print "Hello, world!"
-
- # And here's how you specify multiple arguments.
- def plus(num1, num2):
- # type: (int, int) -> int
- return num1 + num2
-
- # Add type annotations for kwargs as though they were positional args.
- def f(num1, my_float=3.5):
- # type: (int, float) -> float
- return num1 + my_float
-
- # An argument can be declared positional-only by giving it a name
- # starting with two underscores:
- def quux(__x):
- # type: (int) -> None
- pass
- quux(3) # Fine
- quux(__x=3) # Error
-
- # This is how you annotate a function value.
- x = f # type: Callable[[int, float], float]
-
- # A generator function that yields ints is secretly just a function that
- # returns an iterable (see below) of ints, so that's how we annotate it.
- def f(n):
- # type: (int) -> Iterable[int]
- i = 0
- while i < n:
- yield i
- i += 1
-
- # There's alternative syntax for functions with many arguments.
- def send_email(address, # type: Union[str, List[str]]
- sender, # type: str
- cc, # type: Optional[List[str]]
- bcc, # type: Optional[List[str]]
- subject='',
- body=None # type: List[str]
- ):
- # type: (...) -> bool
- <code>
-
-
-When you're puzzled or when things are complicated
-**************************************************
-
-.. code-block:: python
-
- from typing import Union, Any, cast
-
- # To find out what type mypy infers for an expression anywhere in
- # your program, wrap it in reveal_type. Mypy will print an error
- # message with the type; remove it again before running the code.
- reveal_type(1) # -> error: Revealed type is 'builtins.int'
-
- # Use Union when something could be one of a few types.
- x = [3, 5, "test", "fun"] # type: List[Union[int, str]]
-
- # Use Any if you don't know the type of something or it's too
- # dynamic to write a type for.
- x = mystery_function() # type: Any
-
- # This is how to deal with varargs.
- # This makes each positional arg and each keyword arg a 'str'.
- def call(self, *args, **kwargs):
- # type: (*str, **str) -> str
- request = make_request(*args, **kwargs)
- return self.do_api_query(request)
-
-
- # Use `ignore` to suppress type-checking on a given line, when your
- # code confuses mypy or runs into an outright bug in mypy.
- # Good practice is to comment every `ignore` with a bug link
- # (in mypy, typeshed, or your own code) or an explanation of the issue.
- x = confusing_function() # type: ignore # https://github.com/python/mypy/issues/1167
-
- # cast is a helper function for mypy that allows for guidance of how to convert types.
- # it does not cast at runtime
- a = [4]
- b = cast(List[int], a) # passes fine
- c = cast(List[str], a) # passes fine (no runtime check)
- reveal_type(c) # -> error: Revealed type is 'builtins.list[builtins.str]'
- print(c) # -> [4] the object is not cast
-
- # TODO: explain "Need type annotation for variable" when
- # initializing with None or an empty container
-
-
-Standard duck types
-*******************
-
-In typical Python code, many functions that can take a list or a dict
-as an argument only need their argument to be somehow "list-like" or
-"dict-like". A specific meaning of "list-like" or "dict-like" (or
-something-else-like) is called a "duck type", and several duck types
-that are common in idiomatic Python are standardized.
-
-.. code-block:: python
-
- from typing import Mapping, MutableMapping, Sequence, Iterator
-
- # Use Iterable for generic iterables (anything usable in `for`),
- # and Sequence where a sequence (supporting `len` and `__getitem__`) is required.
- def f(iterable_of_ints):
- # type: (Iterable[int]) -> List[str]
- return [str(x) for x in iterator_of_ints]
- f(range(1, 3))
-
- # Mapping describes a dict-like object (with `__getitem__`) that we won't mutate,
- # and MutableMapping one (with `__setitem__`) that we might.
- def f(my_dict):
- # type: (Mapping[int, str]) -> List[int]
- return list(my_dict.keys())
- f({3: 'yes', 4: 'no'})
- def f(my_mapping):
- # type: (MutableMapping[int, str]) -> Set[str]
- my_dict[5] = 'maybe'
- return set(my_dict.values())
- f({3: 'yes', 4: 'no'})
-
-
-Classes
-*******
-
-.. code-block:: python
-
- class MyClass(object):
-
- # For instance methods, omit `self`.
- def my_class_method(self, num, str1):
- # type: (int, str) -> str
- return num * str1
-
- # The __init__ method doesn't return anything, so it gets return
- # type None just like any other method that doesn't return anything.
- def __init__(self):
- # type: () -> None
- pass
-
- # User-defined classes are written with just their own names.
- x = MyClass() # type: MyClass
-
-
-Other stuff
-***********
-
-.. code-block:: python
-
- import sys
- # typing.Match describes regex matches from the re module.
- from typing import Match, AnyStr, IO
- x = re.match(r'[0-9]+', "15") # type: Match[str]
-
- # Use AnyStr for functions that should accept any kind of string
- # without allowing different kinds of strings to mix.
- def concat(a: AnyStr, b: AnyStr) -> AnyStr:
- return a + b
- concat(u"foo", u"bar") # type: unicode
- concat(b"foo", b"bar") # type: bytes
-
- # Use IO[] for functions that should accept or return any
- # object that comes from an open() call. The IO[] does not
- # distinguish between reading, writing or other modes.
- def get_sys_IO(mode='w') -> IO[str]:
- if mode == 'w':
- return sys.stdout
- elif mode == 'r':
- return sys.stdin
- else:
- return sys.stdout
-
- # TODO: add TypeVar and a simple generic function
-
diff --git a/docs/source/cheat_sheet_py3.rst b/docs/source/cheat_sheet_py3.rst
deleted file mode 100644
index cc9fef3..0000000
--- a/docs/source/cheat_sheet_py3.rst
+++ /dev/null
@@ -1,288 +0,0 @@
-.. _cheat-sheet-py3:
-
-Mypy syntax cheat sheet (Python 3)
-==================================
-
-This document is a quick cheat sheet showing how the `PEP 484 <https://www.python.org/dev/peps/pep-0484/>`_ type
-language represents various common types in Python 3. Unless otherwise noted, the syntax is valid on all versions of Python 3.
-
-.. note::
-
- Technically many of the type annotations shown below are redundant,
- because mypy can derive them from the type of the expression. So
- many of the examples have a dual purpose: show how to write the
- annotation, and show the inferred types.
-
-
-Built-in types
-**************
-
-.. code-block:: python
-
- from typing import List, Set, Dict, Tuple, Text, Optional, AnyStr
-
- # For simple built-in types, just use the name of the type.
- x = 1 # type: int
- x = 1.0 # type: float
- x = True # type: bool
- x = "test" # type: str
- x = u"test" # type: str
- x = b"test" # type: bytes
-
- # For collections, the name of the type is capitalized, and the
- # name of the type inside the collection is in brackets.
- x = [1] # type: List[int]
- x = {6, 7} # type: Set[int]
-
- # For mappings, we need the types of both keys and values.
- x = {'field': 2.0} # type: Dict[str, float]
-
- # For tuples, we specify the types of all the elements.
- x = (3, "yes", 7.5) # type: Tuple[int, str, float]
-
- # For textual data, use Text.
- # This is `unicode` in Python 2 and `str` in Python 3.
- x = ["string", u"unicode"] # type: List[Text]
-
-
-
- # Use Optional for values that could be None.
- input_str = f() # type: Optional[str]
- if input_str is not None:
- print(input_str)
-
-
-Functions
-*********
-
-Python 3 introduces an annotation syntax for function declarations in `PEP 3107 <https://www.python.org/dev/peps/pep-3107/>`_.
-
-.. code-block:: python
-
- from typing import Callable, Iterable, Union, Optional, List
-
- # This is how you annotate a function definition.
- def stringify(num: int) -> str:
- return str(num)
-
- # And here's how you specify multiple arguments.
- def plus(num1: int, num2: int) -> int:
- return num1 + num2
-
- # Add type annotations for kwargs as though they were positional args.
- def f(num1: int, my_float: float = 3.5) -> float:
- return num1 + my_float
-
- # An argument can be declared positional-only by giving it a name
- # starting with two underscores:
- def quux(__x: int) -> None:
- pass
- quux(3) # Fine
- quux(__x=3) # Error
-
- # This is how you annotate a function value.
- x = f # type: Callable[[int, float], float]
-
- # A generator function that yields ints is secretly just a function that
- # returns an iterable (see below) of ints, so that's how we annotate it.
- def f(n: int) -> Iterable[int]:
- i = 0
- while i < n:
- yield i
- i += 1
-
- # For a function with many arguments, you can of course split it over multiple lines
- def send_email(address: Union[str, List[str]],
- sender: str,
- cc: Optional[List[str]],
- bcc: Optional[List[str]],
- subject='',
- body: List[str] = None
- ) -> bool:
-
- ...
-
-
-When you're puzzled or when things are complicated
-**************************************************
-
-.. code-block:: python
-
- from typing import Union, Any, List, cast
-
- # To find out what type mypy infers for an expression anywhere in
- # your program, wrap it in reveal_type. Mypy will print an error
- # message with the type; remove it again before running the code.
- reveal_type(1) # -> error: Revealed type is 'builtins.int'
-
- # Use Union when something could be one of a few types.
- x = [3, 5, "test", "fun"] # type: List[Union[int, str]]
-
- # Use Any if you don't know the type of something or it's too
- # dynamic to write a type for.
- x = mystery_function() # type: Any
-
- # Use `ignore` to suppress type-checking on a given line, when your
- # code confuses mypy or runs into an outright bug in mypy.
- # Good practice is to comment every `ignore` with a bug link
- # (in mypy, typeshed, or your own code) or an explanation of the issue.
- x = confusing_function() # type: ignore # https://github.com/python/mypy/issues/1167
-
- # cast is a helper function for mypy that allows for guidance of how to convert types.
- # it does not cast at runtime
- a = [4]
- b = cast(List[int], a) # passes fine
- c = cast(List[str], a) # passes fine (no runtime check)
- reveal_type(c) # -> error: Revealed type is 'builtins.list[builtins.str]'
- print(c) # -> [4] the object is not cast
-
- # TODO: explain "Need type annotation for variable" when
- # initializing with None or an empty container
-
-
-Standard duck types
-*******************
-
-In typical Python code, many functions that can take a list or a dict
-as an argument only need their argument to be somehow "list-like" or
-"dict-like". A specific meaning of "list-like" or "dict-like" (or
-something-else-like) is called a "duck type", and several duck types
-that are common in idiomatic Python are standardized.
-
-.. code-block:: python
-
- from typing import Mapping, MutableMapping, Sequence, Iterable, List, Set
-
- # Use Iterable for generic iterables (anything usable in `for`),
- # and Sequence where a sequence (supporting `len` and `__getitem__`) is required.
- def f(iterable_of_ints: Iterable[int]) -> List[str]:
- return [str(x) for x in iterable_of_ints]
- f(range(1, 3))
-
- # Mapping describes a dict-like object (with `__getitem__`) that we won't mutate,
- # and MutableMapping one (with `__setitem__`) that we might.
- def f(my_dict: Mapping[int, str])-> List[int]:
- return list(my_dict.keys())
- f({3: 'yes', 4: 'no'})
- def f(my_mapping: MutableMapping[int, str]) -> Set[str]:
- my_mapping[5] = 'maybe'
- return set(my_mapping.values())
- f({3: 'yes', 4: 'no'})
-
-
-Classes
-*******
-
-.. code-block:: python
-
- class MyClass:
- # The __init__ method doesn't return anything, so it gets return
- # type None just like any other method that doesn't return anything.
- def __init__(self) -> None:
- ...
- # For instance methods, omit `self`.
- def my_class_method(self, num: int, str1: str) -> str:
- return num * str1
-
-
-
- # User-defined classes are written with just their own names.
- x = MyClass() # type: MyClass
-
-
-Other stuff
-***********
-
-.. code-block:: python
-
- import sys
- import re
- # typing.Match describes regex matches from the re module.
- from typing import Match, AnyStr, IO
- x = re.match(r'[0-9]+', "15") # type: Match[str]
-
- # You can use AnyStr to indicate that any string type will work
- # but not to mix types
- def full_name(first: AnyStr, last: AnyStr) -> AnyStr:
- return first+last
- full_name('Jon','Doe') # same str ok
- full_name(b'Bill', b'Bit') # same binary ok
- full_name(b'Terry', 'Trouble') # different str types, fails
-
- # Use IO[] for functions that should accept or return any
- # object that comes from an open() call. The IO[] does not
- # distinguish between reading, writing or other modes.
- def get_sys_IO(mode='w') -> IO[str]:
- if mode == 'w':
- return sys.stdout
- elif mode == 'r':
- return sys.stdin
- else:
- return sys.stdout
-
- # forward references are useful if you want to referemce a class before it is designed
-
- def f(foo: A) -> int: # this will fail
- ...
-
- class A:
- ...
-
- # however, using the string 'A', it will pass as long as there is a class of that name later on
- def f(foo: 'A') -> int:
- ...
-
- # TODO: add TypeVar and a simple generic function
-
-Variable Annotation in Python 3.6 with PEP 526
-**********************************************
-
-Python 3.6 brings new syntax for annotating variables with `PEP 526 <https://www.python.org/dev/peps/pep-0526/>`_.
-Mypy brings limited support for PEP 526 annotations.
-
-
-.. code-block:: python
-
- # annotation is similar to arguments to functions
- name: str = "Eric Idle"
-
- # class instances can be annotated as follows
- mc : MyClass = MyClass()
-
- # tuple packing can be done as follows
- tu: Tuple[str, ...] = ('a', 'b', 'c')
-
- # annotations are not checked at runtime
- year: int = '1972' # error in type checking, but works at runtime
-
- # these are all equivalent
- hour = 24 # type: int
- hour: int; hour = 24
- hour: int = 24
-
- # you do not (!) need to initialize a variable to annotate it
- a: int # ok for type checking and runtime
-
- # which is useful in conditional branches
- child: bool
- if age < 18:
- child = True
- else:
- child = False
-
- # annotations for classes are for instance variables (those created in __init__ or __new__)
- class Battery:
- charge_percent: int = 100 # this is an instance variable with a default value
- capacity: int # an instance variable without a default
-
- # you can use the ClassVar annotation to make the variable a class variable instead of an instance variable.
- class Car:
- seats: ClassVar[int] = 4
- passengers: ClassVar[List[str]]
-
- # You can also declare the type of an attribute in __init__
- class Box:
- def __init__(self) -> None:
- self.items: List[str] = []
-
-Please see :ref:`python-36` for more on mypy's compatability with Python 3.6's new features.
diff --git a/docs/source/class_basics.rst b/docs/source/class_basics.rst
deleted file mode 100644
index dc778d3..0000000
--- a/docs/source/class_basics.rst
+++ /dev/null
@@ -1,157 +0,0 @@
-Class basics
-============
-
-Instance and class attributes
-*****************************
-
-Mypy type checker detects if you are trying to access a missing
-attribute, which is a very common programming error. For this to work
-correctly, instance and class attributes must be defined or
-initialized within the class. Mypy infers the types of attributes:
-
-.. code-block:: python
-
- class A:
- def __init__(self, x: int) -> None:
- self.x = x # Attribute x of type int
-
- a = A(1)
- a.x = 2 # OK
- a.y = 3 # Error: A has no attribute y
-
-This is a bit like each class having an implicitly defined
-``__slots__`` attribute. This is only enforced during type
-checking and not when your program is running.
-
-You can declare types of variables in the class body explicitly using
-a type comment:
-
-.. code-block:: python
-
- class A:
- x = None # type: List[int] # Declare attribute x of type List[int]
-
- a = A()
- a.x = [1] # OK
-
-As in Python, a variable defined in the class body can used as a class
-or an instance variable.
-
-Similarly, you can give explicit types to instance variables defined
-in a method:
-
-.. code-block:: python
-
- class A:
- def __init__(self) -> None:
- self.x = [] # type: List[int]
-
- def f(self) -> None:
- self.y = 0 # type: Any
-
-You can only define an instance variable within a method if you assign
-to it explicitly using ``self``:
-
-.. code-block:: python
-
- class A:
- def __init__(self) -> None:
- self.y = 1 # Define y
- a = self
- a.x = 1 # Error: x not defined
-
-Overriding statically typed methods
-***********************************
-
-When overriding a statically typed method, mypy checks that the
-override has a compatible signature:
-
-.. code-block:: python
-
- class A:
- def f(self, x: int) -> None:
- ...
-
- class B(A):
- def f(self, x: str) -> None: # Error: type of x incompatible
- ...
-
- class C(A):
- def f(self, x: int, y: int) -> None: # Error: too many arguments
- ...
-
- class D(A):
- def f(self, x: int) -> None: # OK
- ...
-
-.. note::
-
- You can also vary return types **covariantly** in overriding. For
- example, you could override the return type ``object`` with a subtype
- such as ``int``.
-
-You can also override a statically typed method with a dynamically
-typed one. This allows dynamically typed code to override methods
-defined in library classes without worrying about their type
-signatures.
-
-There is no runtime enforcement that the method override returns a
-value that is compatible with the original return type, since
-annotations have no effect at runtime:
-
-.. code-block:: python
-
- class A:
- def inc(self, x: int) -> int:
- return x + 1
-
- class B(A):
- def inc(self, x): # Override, dynamically typed
- return 'hello'
-
- b = B()
- print(b.inc(1)) # hello
- a = b # type: A
- print(a.inc(1)) # hello
-
-Abstract base classes and multiple inheritance
-**********************************************
-
-Mypy uses Python abstract base classes for protocol types. There are
-several built-in abstract base classes types (for example,
-``Sequence``, ``Iterable`` and ``Iterator``). You can define abstract
-base classes using the ``abc.ABCMeta`` metaclass and the
-``abc.abstractmethod`` function decorator.
-
-.. code-block:: python
-
- from abc import ABCMeta, abstractmethod
- import typing
-
- class A(metaclass=ABCMeta):
- @abstractmethod
- def foo(self, x: int) -> None: pass
-
- @abstractmethod
- def bar(self) -> str: pass
-
- class B(A):
- def foo(self, x: int) -> None: ...
- def bar(self) -> str:
- return 'x'
-
- a = A() # Error: A is abstract
- b = B() # OK
-
-Unlike most Python code, abstract base classes are likely to play a
-significant role in many complex mypy programs.
-
-A class can inherit any number of classes, both abstract and
-concrete. As with normal overrides, a dynamically typed method can
-implement a statically typed abstract method defined in an abstract
-base class.
-
-.. note::
-
- There are also plans to support more Python-style "duck typing" in
- the type system. The details are still open.
diff --git a/docs/source/command_line.rst b/docs/source/command_line.rst
deleted file mode 100644
index e5d1a80..0000000
--- a/docs/source/command_line.rst
+++ /dev/null
@@ -1,402 +0,0 @@
-.. _command-line:
-
-The mypy command line
-=====================
-
-This section documents many of mypy's command line flags. A quick
-summary of command line flags can always be printed using the ``-h``
-flag (or its long form ``--help``)::
-
- $ mypy -h
- usage: mypy [-h] [-v] [-V] [--python-version x.y] [--platform PLATFORM] [-2]
- [--ignore-missing-imports]
- [--follow-imports {normal,silent,skip,error}]
- [--disallow-untyped-calls] [--disallow-untyped-defs]
- [--check-untyped-defs] [--disallow-subclassing-any]
- [--warn-incomplete-stub] [--warn-redundant-casts]
- [--warn-no-return] [--warn-unused-ignores] [--show-error-context]
- [--fast-parser] [-i] [--cache-dir DIR] [--strict-optional]
- [--strict-optional-whitelist [GLOB [GLOB ...]]]
- [--junit-xml JUNIT_XML] [--pdb] [--show-traceback] [--stats]
- [--inferstats] [--custom-typing MODULE]
- [--custom-typeshed-dir DIR] [--scripts-are-modules]
- [--config-file CONFIG_FILE] [--show-column-numbers]
- [--find-occurrences CLASS.MEMBER] [--cobertura-xml-report DIR]
- [--html-report DIR] [--linecount-report DIR]
- [--linecoverage-report DIR] [--memory-xml-report DIR]
- [--old-html-report DIR] [--txt-report DIR] [--xml-report DIR]
- [--xslt-html-report DIR] [--xslt-txt-report DIR] [-m MODULE]
- [-c PROGRAM_TEXT] [-p PACKAGE]
- [files [files ...]]
-
- (etc., too long to show everything here)
-
-Specifying files and directories to be checked
-**********************************************
-
-You've already seen ``mypy program.py`` as a way to type check the
-file ``program.py``. More generally you can pass any number of files
-and directories on the command line and they will all be type checked
-together.
-
-- Files ending in ``.py`` (and stub files ending in ``.pyi``) are
- checked as Python modules.
-
-- Files not ending in ``.py`` or ``.pyi`` are assumed to be Python
- scripts and checked as such.
-
-- Directories representing Python packages (i.e. containing a
- ``__init__.py[i]`` file) are checked as Python packages; all
- submodules and subpackages will be checked (subpackages must
- themselves have a ``__init__.py[i]`` file).
-
-- Directories that don't represent Python packages (i.e. not directly
- containing an ``__init__.py[i]`` file) are checked as follows:
-
- - All ``*.py[i]`` files contained directly therein are checked as
- toplevel Python modules;
-
- - All packages contained directly therein (i.e. immediate
- subdirectories with an ``__init__.py[i]`` file) are checked as
- toplevel Python packages.
-
-One more thing about checking modules and packages: if the directory
-*containing* a module or package specified on the command line has an
-``__init__.py[i]`` file, mypy assigns these an absolute module name by
-crawling up the path until no ``__init__.py[i]`` file is found. For
-example, suppose we run the command ``mypy foo/bar/baz.py`` where
-``foo/bar/__init__.py`` exists but ``foo/__init__.py`` does not. Then
-the module name assumed is ``bar.baz`` and the directory ``foo`` is
-added to mypy's module search path. On the other hand, if
-``foo/bar/__init__.py`` did not exist, ``foo/bar`` would be added to
-the module search path instead, and the module name assumed is just
-``baz``.
-
-If a script (a file not ending in ``.py[i]``) is processed, the module
-name assumed is always ``__main__`` (matching the behavior of the
-Python interpreter).
-
-Other ways of specifying code to be checked
-*******************************************
-
-The flag ``-m`` (long form: ``--module``) lets you specify a module
-name to be found using the default module search path. The module
-name may contain dots. For example::
-
- $ mypy -m html.parser
-
-will type check the module ``html.parser`` (this happens to be a
-library stub).
-
-The flag ``-p`` (long form: ``--package``) is similar to ``-m`` but
-you give it a package name and it will type check all submodules and
-subpackages (recursively) of that package. (If you pass a package
-name to ``-m`` it will just type check the package's ``__init__.py``
-and anything imported from there.) For example::
-
- $ mypy -p html
-
-will type check the entire ``html`` package (of library stubs).
-
-Finally the flag ``-c`` (long form: ``--command``) will take a string
-from the command line and type check it as a small program. For
-example::
-
- $ mypy -c 'x = [1, 2]; print(x())'
-
-will type check that little program (and complain that ``List[int]``
-is not callable).
-
-Reading a list of files from a file
-***********************************
-
-Finally, any command-line argument starting with ``@`` reads additional
-command-line arguments from the file following the ``@`` character.
-This is primarily useful if you have a file containing a list of files
-that you want to be type-checked: instead of using shell syntax like::
-
- mypy $(cat file_of_files)
-
-you can use this instead::
-
- mypy @file_of_files
-
-Such a file can also contain other flags, but a preferred way of
-reading flags (not files) from a file is to use a
-:ref:`configuration file <config-file>`.
-
-
-.. _finding-imports:
-
-How imports are found
-*********************
-
-When mypy encounters an `import` statement it tries to find the module
-on the file system, similar to the way Python finds it.
-However, there are some differences.
-
-First, mypy has its own search path.
-This is computed from the following items:
-
-- The ``MYPYPATH`` environment variable
- (a colon-separated list of directories).
-- The directories containing the sources given on the command line
- (see below).
-- The relevant directories of the
- `typeshed <https://github.com/python/typeshed>`_ repo.
-
-For sources given on the command line, the path is adjusted by crawling
-up from the given file or package to the nearest directory that does not
-contain an ``__init__.py`` or ``__init__.pyi`` file.
-
-Second, mypy searches for stub files in addition to regular Python files
-and packages.
-The rules for searching a module ``foo`` are as follows:
-
-- The search looks in each of the directories in the search path
- (see above) until a match is found.
-- If a package named ``foo`` is found (i.e. a directory
- ``foo`` containing an ``__init__.py`` or ``__init__.pyi`` file)
- that's a match.
-- If a stub file named ``foo.pyi`` is found, that's a match.
-- If a Python module named ``foo.py`` is found, that's a match.
-
-These matches are tried in order, so that if multiple matches are found
-in the same directory on the search path
-(e.g. a package and a Python file, or a stub file and a Python file)
-the first one in the above list wins.
-
-In particular, if a Python file and a stub file are both present in the
-same directory on the search path, only the stub file is used.
-(However, if the files are in different directories, the one found
-in the earlier directory is used.)
-
-NOTE: These rules are relevant to the following section too:
-the ``--follow-imports`` flag described below is applied _after_ the
-above algorithm has determined which package, stub or module to use.
-
-.. _follow-imports:
-
-Following imports or not?
-*************************
-
-When you're first attacking a large existing codebase with mypy, you
-may only want to check selected files. For example, you may only want
-to check those files to which you have already added annotations.
-This is easily accomplished using a shell pipeline like this::
-
- mypy $(find . -name \*.py | xargs grep -l '# type:')
-
-(While there are many improvements possible to make this example more
-robust, this is not the place for a tutorial in shell programming.)
-
-However, by default mypy doggedly tries to :ref:`follow imports
-<finding-imports>`. This may cause several types of problems that you
-may want to silence during your initial conquest:
-
-- Your code may import library modules for which no stub files exist
- yet. This can cause a lot of errors like the following::
-
- main.py:1: error: No library stub file for standard library module 'antigravity'
- main.py:2: error: No library stub file for module 'flask'
- main.py:3: error: Cannot find module named 'sir_not_appearing_in_this_film'
-
- If you see only a few of these you may be able to silence them by
- putting ``# type: ignore`` on the respective ``import`` statements,
- but it's usually easier to silence all such errors by using
- :ref:`--ignore-missing-imports <ignore-missing-imports>`.
-
-- Your project's directory structure may hinder mypy in finding
- certain modules that are part of your project, e.g. modules hidden
- away in a subdirectory that's not a package. You can usually deal
- with this by setting the ``MYPYPATH`` variable (see
- :ref:`finding-imports`).
-
-- When following imports mypy may find a module that's part of your
- project but which you haven't annotated yet, mypy may report errors
- for the top level code in that module (where the top level includes
- class bodies and function/method default values). Here the
- ``--follow-imports`` flag comes in handy.
-
-The ``--follow-imports`` flag takes a mandatory string value that can
-take one of four values. It only applies to modules for which a
-``.py`` file is found (but no corresponding ``.pyi`` stub file) and
-that are not given on the command line. Passing a package or
-directory on the command line implies all modules in that package or
-directory. The four possible values are:
-
-- ``normal`` (the default) follow imports normally and type check all
- top level code (as well as the bodies of all functions and methods
- with at least one type annotation in the signature).
-
-- ``silent`` follow imports normally and even "type check" them
- normally, but *suppress any error messages*. This is typically the
- best option for a new codebase.
-
-- ``skip`` *don't* follow imports, silently replacing the module (and
- everything imported *from* it) with an object of type ``Any``.
- (This option used to be known as ``--silent-imports`` and while it
- is very powerful it can also cause hard-to-debug errors, hence the
- recommendation of using ``silent`` instead.)
-
-- ``error`` the same behavior as ``skip`` but not quite as silent --
- it flags the import as an error, like this::
-
- main.py:1: note: Import of 'submodule' ignored
- main.py:1: note: (Using --follow-imports=error, module not passed on command line)
-
-
-Additional command line flags
-*****************************
-
-Here are some more useful flags:
-
-.. _ignore-missing-imports:
-
-- ``--ignore-missing-imports`` suppresses error messages about imports
- that cannot be resolved (see :ref:`follow-imports` for some examples).
-
-- ``--strict-optional`` enables experimental strict checking of ``Optional[...]``
- types and ``None`` values. Without this option, mypy doesn't generally check the
- use of ``None`` values -- they are valid everywhere. See :ref:`strict_optional` for
- more about this feature.
-
-- ``--strict-optional-whitelist`` attempts to suppress strict Optional-related
- errors in non-whitelisted files. Takes an arbitrary number of globs as the
- whitelist. This option is intended to be used to incrementally roll out
- ``--strict-optional`` to a large codebase that already has mypy annotations.
- However, this flag comes with some significant caveats. It does not suppress
- all errors caused by turning on ``--strict-optional``, only most of them, so
- there may still be a bit of upfront work to be done before it can be used in
- CI. It will also suppress some errors that would be caught in a
- non-strict-Optional run. Therefore, when using this flag, you should also
- re-check your code without ``--strict-optional`` to ensure new type errors
- are not introduced.
-
-- ``--disallow-untyped-defs`` reports an error whenever it encounters
- a function definition without type annotations.
-
-- ``--check-untyped-defs`` is less severe than the previous option --
- it type checks the body of every function, regardless of whether it
- has type annotations. (By default the bodies of functions without
- annotations are not type checked.) It will assume all arguments
- have type ``Any`` and always infer ``Any`` as the return type.
-
-- ``--disallow-untyped-calls`` reports an error whenever a function
- with type annotations calls a function defined without annotations.
-
-.. _disallow-subclassing-any:
-
-- ``--disallow-subclassing-any`` reports an error whenever a class
- subclasses a value of type ``Any``. This may occur when the base
- class is imported from a module that doesn't exist (when using
- :ref:`--ignore-missing-imports <ignore-missing-imports>`) or is
- ignored due to :ref:`--follow-imports=skip <follow-imports>` or a
- ``# type: ignore`` comment on the ``import`` statement. Since the
- module is silenced, the imported class is given a type of ``Any``.
- By default mypy will assume that the subclass correctly inherited
- the base class even though that may not actually be the case. This
- flag makes mypy raise an error instead.
-
-- ``--incremental`` is an experimental option that enables incremental
- type checking. When enabled, mypy caches results from previous runs
- to speed up type checking. Incremental mode can help when most parts
- of your program haven't changed since the previous mypy run.
-
-- ``--fast-parser`` enables an experimental parser implemented in C that
- is faster than the default parser and supports multi-line comment
- function annotations (see :ref:`multi_line_annotation` for the details).
-
-- ``--python-version X.Y`` will make mypy typecheck your code as if it were
- run under Python version X.Y. Without this option, mypy will default to using
- whatever version of Python is running mypy. Note that the ``-2`` and
- ``--py2`` flags are aliases for ``--python-version 2.7``. See
- :ref:`version_and_platform_checks` for more about this feature.
-
-- ``--platform PLATFORM`` will make mypy typecheck your code as if it were
- run under the the given operating system. Without this option, mypy will
- default to using whatever operating system you are currently using. See
- :ref:`version_and_platform_checks` for more about this feature.
-
-- ``--show-column-numbers`` will add column offsets to error messages,
- for example, the following indicates an error in line 12, column 9
- (note that column offsets are 0-based):
-
- .. code-block:: python
-
- main.py:12:9: error: Unsupported operand types for / ("int" and "str")
-
-- ``--scripts-are-modules`` will give command line arguments that
- appear to be scripts (i.e. files whose name does not end in ``.py``)
- a module name derived from the script name rather than the fixed
- name ``__main__``. This allows checking more than one script in a
- single mypy invocation. (The default ``__main__`` is technically
- more correct, but if you have many scripts that import a large
- package, the behavior enabled by this flag is often more
- convenient.)
-
-- ``--custom-typeshed-dir DIR`` specifies the directory where mypy looks for
- typeshed stubs, instead of the typeshed that ships with mypy. This is
- primarily intended to make it easier to test typeshed changes before
- submitting them upstream, but also allows you to use a forked version of
- typeshed.
-
-.. _config-file-flag:
-
-- ``--config-file CONFIG_FILE`` causes configuration settings to be
- read from the given file. By default settings are read from ``mypy.ini``
- in the current directory. Settings override mypy's built-in defaults
- and command line flags can override settings. See :ref:`config-file`
- for the syntax of configuration files.
-
-- ``--junit-xml JUNIT_XML`` will make mypy generate a JUnit XML test
- result document with type checking results. This can make it easier
- to integrate mypy with continuous integration (CI) tools.
-
-- ``--find-occurrences CLASS.MEMBER`` will make mypy print out all
- usages of a class member based on static type information. This
- feature is experimental.
-
-- ``--cobertura-xml-report DIR`` causes mypy to generate a Cobertura
- XML type checking coverage report.
-
-- ``--warn-no-return`` causes mypy to generate errors for missing return
- statements on some execution paths. Mypy doesn't generate these errors
- for functions with ``None`` or ``Any`` return types. Mypy
- also currently ignores functions with an empty body or a body that is
- just ellipsis (``...``), since these can be valid as abstract methods.
-
-For the remaining flags you can read the full ``mypy -h`` output.
-
-.. note::
-
- Command line flags are liable to change between releases.
-
-.. _integrating-mypy:
-
-Integrating mypy into another Python application
-************************************************
-
-It is possible to integrate mypy into another Python 3 application by
-importing ``mypy.api`` and calling the ``run`` function with exactly the string
-you would have passed to mypy from the command line.
-
-Function ``run`` returns a tuple of strings:
-``(<normal_report>, <error_report>)``, in which ``<normal_report>`` is what mypy
-normally writes to ``sys.stdout`` and ``<error_report>`` is what mypy normally
-writes to ``sys.stderr``.
-
-A trivial example of this is the following::
-
- import sys
- from mypy import api
-
- result = api.run(' '.join(sys.argv[1:]))
-
- if result[0]:
- print('\nType checking report:\n')
- print(result[0]) # stdout
-
- if result[1]:
- print('\nError report:\n')
- print(result[1]) # stderr
diff --git a/docs/source/common_issues.rst b/docs/source/common_issues.rst
deleted file mode 100644
index 3477d90..0000000
--- a/docs/source/common_issues.rst
+++ /dev/null
@@ -1,386 +0,0 @@
-.. _common_issues:
-
-Common issues
-=============
-
-This section has examples of cases when you need to update your code
-to use static typing, and ideas for working around issues if mypy
-doesn't work as expected. Statically typed code is often identical to
-normal Python code, but sometimes you need to do things slightly
-differently.
-
-Can't install mypy using pip
-----------------------------
-
-If installation fails, you've probably hit one of these issues:
-
-* Mypy needs Python 3.3 or later to run.
-* You may have to run pip like this:
- ``python3 -m pip install mypy``.
-
-.. _annotations_needed:
-
-No errors reported for obviously wrong code
--------------------------------------------
-
-There are several common reasons why obviously wrong code is not
-flagged as an error.
-
-- **The function containing the error is not annotated.** Functions that
- do not have any annotations (neither for any argument nor for the
- return type) are not type-checked, and even the most blatant type
- errors (e.g. ``2 + 'a'``) pass silently. The solution is to add
- annotations.
-
- Example:
-
- .. code-block:: python
-
- def foo(a):
- return '(' + a.split() + ')' # No error!
-
- This gives no error even though ``a.split()`` is "obviously" a list
- (the author probably meant ``a.strip()``). The error is reported
- once you add annotations:
-
- .. code-block:: python
-
- def foo(a: str) -> str:
- return '(' + a.split() + ')'
- # error: Unsupported operand types for + ("str" and List[str])
-
- If you don't know what types to add, you can use ``Any``, but beware:
-
-- **One of the values involved has type ``Any``.** Extending the above
- example, if we were to leave out the annotation for ``a``, we'd get
- no error:
-
- .. code-block:: python
-
- def foo(a) -> str:
- return '(' + a.split() + ')' # No error!
-
- The reason is that if the type of ``a`` is unknown, the type of
- ``a.split()`` is also unknown, so it is inferred as having type
- ``Any``, and it is no error to add a string to an ``Any``.
-
- If you're having trouble debugging such situations,
- :ref:`reveal_type() <reveal-type>` might come in handy.
-
- Note that sometimes library stubs have imprecise type information,
- e.g. the ``pow()`` builtin returns ``Any`` (see `typeshed issue 285
- <https://github.com/python/typeshed/issues/285>`_ for the reason).
-
-- **Some imports may be silently ignored**. Another source of
- unexpected ``Any`` values are the :ref:`"--ignore-missing-imports"
- <ignore-missing-imports>` and :ref:`"--follow-imports=skip"
- <follow-imports>` flags. When you use ``--ignore-missing-imports``,
- any imported module that cannot be found is silently replaced with
- ``Any``. When using ``--follow-imports=skip`` the same is true for
- modules for which a ``.py`` file is found but that are not specified
- on the command line. (If a ``.pyi`` stub is found it is always
- processed normally, regardless of the value of
- ``--follow-imports``.) To help debug the former situation (no
- module found at all) leave out ``--ignore-missing-imports``; to get
- clarity about the latter use ``--follow-imports=error``. You can
- read up about these and other useful flags in :ref:`command-line`.
-
-.. _silencing_checker:
-
-Spurious errors and locally silencing the checker
--------------------------------------------------
-
-You can use a ``# type: ignore`` comment to silence the type checker
-on a particular line. For example, let's say our code is using
-the C extension module ``frobnicate``, and there's no stub available.
-Mypy will complain about this, as it has no information about the
-module:
-
-.. code-block:: python
-
- import frobnicate # Error: No module "frobnicate"
- frobnicate.start()
-
-You can add a ``# type: ignore`` comment to tell mypy to ignore this
-error:
-
-.. code-block:: python
-
- import frobnicate # type: ignore
- frobnicate.start() # Okay!
-
-The second line is now fine, since the ignore comment causes the name
-``frobnicate`` to get an implicit ``Any`` type.
-
-.. note::
-
- The ``# type: ignore`` comment will only assign the implicit ``Any``
- type if mypy cannot find information about that particular module. So,
- if we did have a stub available for ``frobnicate`` then mypy would
- ignore the ``# type: ignore`` comment and typecheck the stub as usual.
-
-Types of empty collections
---------------------------
-
-You often need to specify the type when you assign an empty list or
-dict to a new variable, as mentioned earlier:
-
-.. code-block:: python
-
- a = [] # type: List[int]
-
-Without the annotation mypy can't always figure out the
-precise type of ``a``.
-
-You can use a simple empty list literal in a dynamically typed function (as the
-type of ``a`` would be implicitly ``Any`` and need not be inferred), if type
-of the variable has been declared or inferred before, or if you perform a simple
-modification operation in the same scope (such as ``append`` for a list):
-
-.. code-block:: python
-
- a = [] # Okay because followed by append, inferred type List[int]
- for i in range(n):
- a.append(i * i)
-
-However, in more complex cases an explicit type annotation can be
-required (mypy will tell you this). Often the annotation can
-make your code easier to understand, so it doesn't only help mypy but
-everybody who is reading the code!
-
-Redefinitions with incompatible types
--------------------------------------
-
-Each name within a function only has a single 'declared' type. You can
-reuse for loop indices etc., but if you want to use a variable with
-multiple types within a single function, you may need to declare it
-with the ``Any`` type.
-
-.. code-block:: python
-
- def f() -> None:
- n = 1
- ...
- n = 'x' # Type error: n has type int
-
-.. note::
-
- This limitation could be lifted in a future mypy
- release.
-
-Note that you can redefine a variable with a more *precise* or a more
-concrete type. For example, you can redefine a sequence (which does
-not support ``sort()``) as a list and sort it in-place:
-
-.. code-block:: python
-
- def f(x: Sequence[int]) -> None:
- # Type of x is Sequence[int] here; we don't know the concrete type.
- x = list(x)
- # Type of x is List[int] here.
- x.sort() # Okay!
-
-Declaring a supertype as variable type
---------------------------------------
-
-Sometimes the inferred type is a subtype (subclass) of the desired
-type. The type inference uses the first assignment to infer the type
-of a name (assume here that ``Shape`` is the base class of both
-``Circle`` and ``Triangle``):
-
-.. code-block:: python
-
- shape = Circle() # Infer shape to be Circle
- ...
- shape = Triangle() # Type error: Triangle is not a Circle
-
-You can just give an explicit type for the variable in cases such the
-above example:
-
-.. code-block:: python
-
- shape = Circle() # type: Shape # The variable s can be any Shape,
- # not just Circle
- ...
- shape = Triangle() # OK
-
-Complex type tests
-------------------
-
-Mypy can usually infer the types correctly when using ``isinstance()``
-type tests, but for other kinds of checks you may need to add an
-explicit type cast:
-
-.. code-block:: python
-
- def f(o: object) -> None:
- if type(o) is int:
- o = cast(int, o)
- g(o + 1) # This would be an error without the cast
- ...
- else:
- ...
-
-.. note::
-
- Note that the ``object`` type used in the above example is similar
- to ``Object`` in Java: it only supports operations defined for *all*
- objects, such as equality and ``isinstance()``. The type ``Any``,
- in contrast, supports all operations, even if they may fail at
- runtime. The cast above would have been unnecessary if the type of
- ``o`` was ``Any``.
-
-Mypy can't infer the type of ``o`` after the ``type()`` check
-because it only knows about ``isinstance()`` (and the latter is better
-style anyway). We can write the above code without a cast by using
-``isinstance()``:
-
-.. code-block:: python
-
- def f(o: object) -> None:
- if isinstance(o, int): # Mypy understands isinstance checks
- g(o + 1) # Okay; type of o is inferred as int here
- ...
-
-Type inference in mypy is designed to work well in common cases, to be
-predictable and to let the type checker give useful error
-messages. More powerful type inference strategies often have complex
-and difficult-to-predict failure modes and could result in very
-confusing error messages. The tradeoff is that you as a programmer
-sometimes have to give the type checker a little help.
-
-.. _version_and_platform_checks:
-
-Python version and system platform checks
------------------------------------------
-
-Mypy supports the ability to perform Python version checks and platform
-checks (e.g. Windows vs Posix), ignoring code paths that won't be run on
-the targeted Python version or platform. This allows you to more effectively
-typecheck code that supports multiple versions of Python or multiple operating
-systems.
-
-More specifically, mypy will understand the use of ``sys.version_info`` and
-``sys.platform`` checks within ``if/elif/else`` statements. For example:
-
-.. code-block:: python
-
- import sys
-
- # Distinguishing between different versions of Python:
- if sys.version_info >= (3, 5):
- # Python 3.5+ specific definitions and imports
- elif sys.version_info[0] >= 3:
- # Python 3 specific definitions and imports
- else:
- # Python 2 specific definitions and imports
-
- # Distinguishing between different operating systems:
- if sys.platform.startswith("linux"):
- # Linux-specific code
- elif sys.platform == "darwin":
- # Mac-specific code
- elif sys.platform == "win32":
- # Windows-specific code
- else:
- # Other systems
-
-.. note::
-
- Mypy currently does not support more complex checks, and does not assign
- any special meaning when assigning a ``sys.version_info`` or ``sys.platform``
- check to a variable. This may change in future versions of mypy.
-
-By default, mypy will use your current version of Python and your current
-operating system as default values for ``sys.version_info`` and
-``sys.platform``.
-
-To target a different Python version, use the ``--python-version X.Y`` flag.
-For example, to verify your code typechecks if were run using Python 2, pass
-in ``--python-version 2.7`` from the command line. Note that you do not need
-to have Python 2.7 installed to perform this check.
-
-To target a different operating system, use the ``--platform PLATFORM`` flag.
-For example, to verify your code typechecks if it were run in Windows, pass
-in ``--platform win32``. See the documentation for
-`sys.platform <https://docs.python.org/3/library/sys.html#sys.platform>`_
-for examples of valid platform parameters.
-
-.. _reveal-type:
-
-Displaying the type of an expression
-------------------------------------
-
-You can use ``reveal_type(expr)`` to ask mypy to display the inferred
-static type of an expression. This can be useful when you don't quite
-understand how mypy handles a particular piece of code. Example:
-
-.. code-block:: python
-
- reveal_type((1, 'hello')) # Revealed type is 'Tuple[builtins.int, builtins.str]'
-
-.. note::
-
- ``reveal_type`` is only understood by mypy and doesn't exist
- in Python, if you try to run your program. You'll have to remove
- any ``reveal_type`` calls before you can run your code.
- ``reveal_type`` is always available and you don't need to import it.
-
-.. _import-cycles:
-
-Import cycles
--------------
-
-An import cycle occurs where module A imports module B and module B
-imports module A (perhaps indirectly, e.g. ``A -> B -> C -> A``).
-Sometimes in order to add type annotations you have to add extra
-imports to a module and those imports cause cycles that didn't exist
-before. If those cycles become a problem when running your program,
-there's a trick: if the import is only needed for type annotations in
-forward references (string literals) or comments, you can write the
-imports inside ``if TYPE_CHECKING:`` so that they are not executed at runtime.
-Example:
-
-File ``foo.py``:
-
-.. code-block:: python
-
- from typing import List, TYPE_CHECKING
-
- if TYPE_CHECKING:
- import bar
-
- def listify(arg: 'bar.BarClass') -> 'List[bar.BarClass]':
- return [arg]
-
-File ``bar.py``:
-
-.. code-block:: python
-
- from typing import List
- from foo import listify
-
- class BarClass:
- def listifyme(self) -> 'List[BarClass]':
- return listify(self)
-
-.. note::
-
- The ``TYPE_CHECKING`` constant defined by the ``typing`` module
- is ``False`` at runtime but ``True`` while type checking.
-
-Python 3.5.1 doesn't have ``typing.TYPE_CHECKING``. An alternative is
-to define a constant named ``MYPY`` that has the value ``False``
-at runtime. Mypy considers it to be ``True`` when type checking.
-Here's the above example modified to use ``MYPY``:
-
-.. code-block:: python
-
- from typing import List
-
- MYPY = False
- if MYPY:
- import bar
-
- def listify(arg: 'bar.BarClass') -> 'List[bar.BarClass]':
- return [arg]
diff --git a/docs/source/conf.py b/docs/source/conf.py
deleted file mode 100644
index cf64842..0000000
--- a/docs/source/conf.py
+++ /dev/null
@@ -1,268 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Mypy documentation build configuration file, created by
-# sphinx-quickstart on Sun Sep 14 19:50:35 2014.
-#
-# This file is execfile()d with the current directory set to its
-# containing dir.
-#
-# Note that not all possible configuration values are present in this
-# autogenerated file.
-#
-# All configuration values have a default; values that are commented out
-# serve to show the default.
-
-import sys
-import os
-
-# If extensions (or modules to document with autodoc) are in another directory,
-# add these directories to sys.path here. If the directory is relative to the
-# documentation root, use os.path.abspath to make it absolute, like shown here.
-sys.path.insert(0, os.path.abspath('../..'))
-
-from mypy.version import __version__ as mypy_version
-
-# -- General configuration ------------------------------------------------
-
-# If your documentation needs a minimal Sphinx version, state it here.
-#needs_sphinx = '1.0'
-
-# Add any Sphinx extension module names here, as strings. They can be
-# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
-# ones.
-extensions = []
-
-# Add any paths that contain templates here, relative to this directory.
-templates_path = ['_templates']
-
-# The suffix of source filenames.
-source_suffix = '.rst'
-
-# The encoding of source files.
-#source_encoding = 'utf-8-sig'
-
-# The master toctree document.
-master_doc = 'index'
-
-# General information about the project.
-project = u'Mypy'
-copyright = u'2016, Jukka Lehtosalo'
-
-# The version info for the project you're documenting, acts as replacement for
-# |version| and |release|, also used in various other places throughout the
-# built documents.
-#
-# The short X.Y version.
-version = mypy_version.split('-')[0]
-# The full version, including alpha/beta/rc tags.
-release = mypy_version
-
-# The language for content autogenerated by Sphinx. Refer to documentation
-# for a list of supported languages.
-#language = None
-
-# There are two options for replacing |today|: either, you set today to some
-# non-false value, then it is used:
-#today = ''
-# Else, today_fmt is used as the format for a strftime call.
-#today_fmt = '%B %d, %Y'
-
-# List of patterns, relative to source directory, that match files and
-# directories to ignore when looking for source files.
-exclude_patterns = []
-
-# The reST default role (used for this markup: `text`) to use for all
-# documents.
-#default_role = None
-
-# If true, '()' will be appended to :func: etc. cross-reference text.
-#add_function_parentheses = True
-
-# If true, the current module name will be prepended to all description
-# unit titles (such as .. function::).
-#add_module_names = True
-
-# If true, sectionauthor and moduleauthor directives will be shown in the
-# output. They are ignored by default.
-#show_authors = False
-
-# The name of the Pygments (syntax highlighting) style to use.
-pygments_style = 'sphinx'
-
-# A list of ignored prefixes for module index sorting.
-#modindex_common_prefix = []
-
-# If true, keep warnings as "system message" paragraphs in the built documents.
-#keep_warnings = False
-
-
-# -- Options for HTML output ----------------------------------------------
-
-# The theme to use for HTML and HTML Help pages. See the documentation for
-# a list of builtin themes.
-try:
- import sphinx_rtd_theme
-except:
- html_theme = 'default'
-else:
- html_theme = 'sphinx_rtd_theme'
- html_theme_path = [sphinx_rtd_theme.get_html_theme_path()]
-
-# Theme options are theme-specific and customize the look and feel of a theme
-# further. For a list of options available for each theme, see the
-# documentation.
-#html_theme_options = {}
-
-# Add any paths that contain custom themes here, relative to this directory.
-#html_theme_path = []
-
-# The name for this set of Sphinx documents. If None, it defaults to
-# "<project> v<release> documentation".
-#html_title = None
-
-# A shorter title for the navigation bar. Default is the same as html_title.
-#html_short_title = None
-
-# The name of an image file (relative to this directory) to place at the top
-# of the sidebar.
-#html_logo = None
-
-# The name of an image file (within the static path) to use as favicon of the
-# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
-# pixels large.
-#html_favicon = None
-
-# Add any paths that contain custom static files (such as style sheets) here,
-# relative to this directory. They are copied after the builtin static files,
-# so a file named "default.css" will overwrite the builtin "default.css".
-#html_static_path = ['_static']
-
-# Add any extra paths that contain custom files (such as robots.txt or
-# .htaccess) here, relative to this directory. These files are copied
-# directly to the root of the documentation.
-#html_extra_path = []
-
-# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
-# using the given strftime format.
-#html_last_updated_fmt = '%b %d, %Y'
-
-# If true, SmartyPants will be used to convert quotes and dashes to
-# typographically correct entities.
-#html_use_smartypants = True
-
-# Custom sidebar templates, maps document names to template names.
-#html_sidebars = {}
-
-# Additional templates that should be rendered to pages, maps page names to
-# template names.
-#html_additional_pages = {}
-
-# If false, no module index is generated.
-#html_domain_indices = True
-
-# If false, no index is generated.
-#html_use_index = True
-
-# If true, the index is split into individual pages for each letter.
-#html_split_index = False
-
-# If true, links to the reST sources are added to the pages.
-#html_show_sourcelink = True
-
-# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
-#html_show_sphinx = True
-
-# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
-#html_show_copyright = True
-
-# If true, an OpenSearch description file will be output, and all pages will
-# contain a <link> tag referring to it. The value of this option must be the
-# base URL from which the finished HTML is served.
-#html_use_opensearch = ''
-
-# This is the file name suffix for HTML files (e.g. ".xhtml").
-#html_file_suffix = None
-
-# Output file base name for HTML help builder.
-htmlhelp_basename = 'Mypydoc'
-
-
-# -- Options for LaTeX output ---------------------------------------------
-
-latex_elements = {
-# The paper size ('letterpaper' or 'a4paper').
-#'papersize': 'letterpaper',
-
-# The font size ('10pt', '11pt' or '12pt').
-#'pointsize': '10pt',
-
-# Additional stuff for the LaTeX preamble.
-#'preamble': '',
-}
-
-# Grouping the document tree into LaTeX files. List of tuples
-# (source start file, target name, title,
-# author, documentclass [howto, manual, or own class]).
-latex_documents = [
- ('index', 'Mypy.tex', u'Mypy Documentation',
- u'Jukka', 'manual'),
-]
-
-# The name of an image file (relative to this directory) to place at the top of
-# the title page.
-#latex_logo = None
-
-# For "manual" documents, if this is true, then toplevel headings are parts,
-# not chapters.
-#latex_use_parts = False
-
-# If true, show page references after internal links.
-#latex_show_pagerefs = False
-
-# If true, show URL addresses after external links.
-#latex_show_urls = False
-
-# Documents to append as an appendix to all manuals.
-#latex_appendices = []
-
-# If false, no module index is generated.
-#latex_domain_indices = True
-
-
-# -- Options for manual page output ---------------------------------------
-
-# One entry per manual page. List of tuples
-# (source start file, name, description, authors, manual section).
-man_pages = [
- ('index', 'mypy', u'Mypy Documentation',
- [u'Jukka Lehtosalo'], 1)
-]
-
-# If true, show URL addresses after external links.
-#man_show_urls = False
-
-
-# -- Options for Texinfo output -------------------------------------------
-
-# Grouping the document tree into Texinfo files. List of tuples
-# (source start file, target name, title, author,
-# dir menu entry, description, category)
-texinfo_documents = [
- ('index', 'Mypy', u'Mypy Documentation',
- u'Jukka', 'Mypy', 'One line description of project.',
- 'Miscellaneous'),
-]
-
-# Documents to append as an appendix to all manuals.
-#texinfo_appendices = []
-
-# If false, no module index is generated.
-#texinfo_domain_indices = True
-
-# How to display URL addresses: 'footnote', 'no', or 'inline'.
-#texinfo_show_urls = 'footnote'
-
-# If true, do not generate a @detailmenu in the "Top" node's menu.
-#texinfo_no_detailmenu = False
-
-rst_prolog = '.. |...| unicode:: U+2026 .. ellipsis\n'
diff --git a/docs/source/config_file.rst b/docs/source/config_file.rst
deleted file mode 100644
index 001f6c9..0000000
--- a/docs/source/config_file.rst
+++ /dev/null
@@ -1,184 +0,0 @@
-.. _config-file:
-
-The mypy configuration file
-===========================
-
-Mypy supports reading configuration settings from a file. By default
-it uses the file ``mypy.ini`` in the current directory; the
-``--config-file`` command-line flag can be used to read a different
-file instead (see :ref:`--config-file <config-file-flag>`).
-
-Most flags correspond closely to :ref:`command-line flags
-<command-line>` but there are some differences in flag names and some
-flags may take a different value based on the module being processed.
-
-The configuration file format is the usual
-`ini file <https://docs.python.org/3.6/library/configparser.html>`_
-format. It should contain section names in square brackets and flag
-settings of the form `NAME = VALUE`. Comments start with ``#``
-characters.
-
-- A section named ``[mypy]`` must be present. This specifies
- the global flags.
-
-- Additional sections named ``[mypy-PATTERN1,PATTERN2,...]`` may be
- present, where ``PATTERN1``, ``PATTERN2`` etc. are `fnmatch patterns
- <https://docs.python.org/3.6/library/fnmatch.html>`_
- separated by commas. These sections specify additional flags that
- only apply to *modules* whose name matches at least one of the patterns.
-
-Global flags
-************
-
-The following global flags may only be set in the global section
-(``[mypy]``).
-
-- ``python_version`` (string) specifies the Python version used to
- parse and check the target program. The format is ``DIGIT.DIGIT``
- for example ``2.7``. The default is the version of the Python
- interpreter used to run mypy.
-
-- ``platform`` (string) specifies the OS platform for the target
- program, for example ``darwin`` or ``win32`` (meaning OS X or
- Windows, respectively). The default is the current platform as
- revealed by Python's ``sys.platform`` variable.
-
-- ``custom_typing_module`` (string) specifies the name of an
- alternative module which is to be considered equivalent to the
- ``typing`` module.
-
-- ``custom_typeshed_dir`` (string) specifies the name of an
- alternative directory which is used to look for stubs instead of the
- default ``typeshed`` directory.
-
-- ``mypy_path`` (string) specifies the paths to use, after trying the paths
- from ``MYPYPATH`` environment variable. Useful if you'd like to keep stubs
- in your repo, along with the config file.
-
-- ``warn_incomplete_stub`` (Boolean, default False) warns for missing
- type annotation in typeshed. This is only relevant in combination
- with ``check_untyped_defs``.
-
-- ``warn_redundant_casts`` (Boolean, default False) warns about
- casting an expression to its inferred type.
-
-- ``warn_unused_ignores`` (Boolean, default False) warns about
- unneeded ``# type: ignore`` comments.
-
-- ``strict_optional`` (Boolean, default False) enables experimental
- strict Optional checks.
-
-- ``scripts_are_modules`` (Boolean, default False) makes script ``x``
- become module ``x`` instead of ``__main__``. This is useful when
- checking multiple scripts in a single run.
-
-- ``verbosity`` (integer, default 0) controls how much debug output
- will be generated. Higher numbers are more verbose.
-
-- ``pdb`` (Boolean, default False) invokes pdb on fatal error.
-
-- ``show_traceback`` (Boolean, default False) shows traceback on fatal
- error.
-
-- ``dump_type_stats`` (Boolean, default False) dumps stats about type
- definitions.
-
-- ``dump_inference_stats`` (Boolean, default False) dumps stats about
- type inference.
-
-- ``fast_parser`` (Boolean, default False) enables the experimental
- fast parser.
-
-- ``incremental`` (Boolean, default False) enables the experimental
- module cache.
-
-- ``cache_dir`` (string, default ``.mypy_cache``) stores module cache
- info in the given folder in incremental mode.
-
-- ``show_error_context`` (Boolean, default False) shows
- context notes before errors.
-
-- ``show_column_numbers`` (Boolean, default False) shows column numbers in
- error messages.
-
-
-.. _per-module-flags:
-
-Per-module flags
-****************
-
-The following flags may vary per module. They may also be specified in
-the global section; the global section provides defaults which are
-overridden by the pattern sections matching the module name.
-
-.. note::
-
- If multiple pattern sections match a module they are processed in
- unspecified order.
-
-- ``follow_imports`` (string, default ``normal``) directs what to do
- with imports when the imported module is found as a ``.py`` file and
- not part of the files, modules and packages on the command line.
- The four possible values are ``normal``, ``silent``, ``skip`` and
- ``error``. For explanations see the discussion for the
- :ref:`--follow-imports <follow-imports>` command line flag. Note
- that if pattern matching is used, the pattern should match the name
- of the _imported_ module, not the module containing the import
- statement.
-
-- ``ignore_missing_imports`` (Boolean, default False) suppress error
- messages about imports that cannot be resolved. Note that if
- pattern matching is used, the pattern should match the name of the
- _imported_ module, not the module containing the import statement.
-
-- ``silent_imports`` (Boolean, deprecated) equivalent to
- ``follow_imports=skip`` plus ``ignore_missing_imports=True``.
-
-- ``almost_silent`` (Boolean, deprecated) equivalent to
- ``follow_imports=skip``.
-
-- ``disallow_untyped_calls`` (Boolean, default False) disallows
- calling functions without type annotations from functions with type
- annotations.
-
-- ``disallow_untyped_defs`` (Boolean, default False) disallows
- defining functions without type annotations or with incomplete type
- annotations.
-
-- ``check_untyped_defs`` (Boolean, default False) type-checks the
- interior of functions without type annotations.
-
-- ``debug_cache`` (Boolean, default False) writes the incremental
- cache JSON files using a more readable, but slower format.
-
-- ``show_none_errors`` (Boolean, default True) shows errors related
- to strict ``None`` checking, if the global ``strict_optional`` flag
- is enabled.
-
-- ``ignore_errors`` (Boolean, default False) ignores all non-fatal
- errors.
-
-- ``warn_no_return`` (Boolean, default False) shows errors for
- missing return statements on some execution paths.
-
-Example
-*******
-
-You might put this in your ``mypy.ini`` file at the root of your repo:
-
-.. code-block:: text
-
- [mypy]
- python_version = 2.7
- [mypy-foo.*]
- disallow_untyped_defs = True
-
-This automatically sets ``--python-version 2.7`` (a.k.a. ``--py2``)
-for all mypy runs in this tree, and also selectively turns on the
-``--disallow-untyped-defs`` flag for all modules in the ``foo``
-package. This issues an error for function definitions without
-type annotations in that subdirectory only.
-
-.. note::
-
- Configuration flags are liable to change between releases.
diff --git a/docs/source/duck_type_compatibility.rst b/docs/source/duck_type_compatibility.rst
deleted file mode 100644
index a128b69..0000000
--- a/docs/source/duck_type_compatibility.rst
+++ /dev/null
@@ -1,40 +0,0 @@
-Duck type compatibility
------------------------
-
-In Python, certain types are compatible even though they aren't subclasses of
-each other. For example, ``int`` objects are valid whenever ``float`` objects
-are expected. Mypy supports this idiom via *duck type compatibility*. As of
-now, this is only supported for a small set of built-in types:
-
-* ``int`` is duck type compatible with ``float`` and ``complex``.
-* ``float`` is duck type compatible with ``complex``.
-* In Python 2, ``str`` is duck type compatible with ``unicode``.
-
-.. note::
-
- Mypy support for Python 2 is still work in progress.
-
-For example, mypy considers an ``int`` object to be valid whenever a
-``float`` object is expected. Thus code like this is nice and clean
-and also behaves as expected:
-
-.. code-block:: python
-
- def degrees_to_radians(x: float) -> float:
- return math.pi * degrees / 180
-
- n = 90 # Inferred type 'int'
- print(degrees_to_radians(n)) # Okay!
-
-.. note::
-
- Note that in Python 2 a ``str`` object with non-ASCII characters is
- often *not valid* when a unicode string is expected. The mypy type
- system does not consider a string with non-ASCII values as a
- separate type so some programs with this kind of error will
- silently pass type checking. In Python 3 ``str`` and ``bytes`` are
- separate, unrelated types and this kind of error is easy to
- detect. This a good reason for preferring Python 3 over Python 2!
-
- See :ref:`text-and-anystr` for details on how to enforce that a
- value must be a unicode string in a cross-compatible way.
diff --git a/docs/source/dynamic_typing.rst b/docs/source/dynamic_typing.rst
deleted file mode 100644
index ba76442..0000000
--- a/docs/source/dynamic_typing.rst
+++ /dev/null
@@ -1,86 +0,0 @@
-.. _dynamic_typing:
-
-
-Dynamically typed code
-======================
-
-As mentioned earlier, bodies of functions that don't have have any
-explicit types in their function annotation are dynamically typed
-(operations are checked at runtime). Code outside functions is
-statically typed by default, and types of variables are inferred. This
-does usually the right thing, but you can also make any variable
-dynamically typed by defining it explicitly with the type ``Any``:
-
-.. code-block:: python
-
- from typing import Any
-
- s = 1 # Statically typed (type int)
- d = 1 # type: Any # Dynamically typed (type Any)
- s = 'x' # Type check error
- d = 'x' # OK
-
-Operations on Any values
-------------------------
-
-You can do anything using a value with type ``Any``, and type checker
-does not complain:
-
-.. code-block:: python
-
- def f(x: Any) -> int:
- # All of these are valid!
- x.foobar(1, y=2)
- print(x[3] + 'f')
- if x:
- x.z = x(2)
- open(x).read()
- return x
-
-Values derived from an ``Any`` value also often have the type ``Any``
-implicitly, as mypy can't infer a more precise result type. For
-example, if you get the attribute of an ``Any`` value or call a
-``Any`` value the result is ``Any``:
-
-.. code-block:: python
-
- def f(x: Any) -> None:
- y = x.foo() # y has type Any
- y.bar() # Okay as well!
-
-``Any`` types may propagate through your program, making type checking
-less effective, unless you are careful.
-
-Any vs. object
---------------
-
-The type ``object`` is another type that can have an instance of arbitrary
-type as a value. Unlike ``Any``, ``object`` is an ordinary static type (it
-is similar to ``Object`` in Java), and only operations valid for *all*
-types are accepted for ``object`` values. These are all valid:
-
-.. code-block:: python
-
- def f(o: object) -> None:
- if o:
- print(o)
- print(isinstance(o, int))
- o = 2
- o = 'foo'
-
-These are, however, flagged as errors, since not all objects support these
-operations:
-
-.. code-block:: python
-
- def f(o: object) -> None:
- o.foo() # Error!
- o + 2 # Error!
- open(o) # Error!
- n = 1 # type: int
- n = o # Error!
-
-You can use ``cast()`` (see chapter :ref:`casts`) or ``isinstance`` to
-go from a general type such as ``object`` to a more specific
-type (subtype) such as ``int``. ``cast()`` is not needed with
-dynamically typed values (values with type ``Any``).
diff --git a/docs/source/faq.rst b/docs/source/faq.rst
deleted file mode 100644
index 9fd73b4..0000000
--- a/docs/source/faq.rst
+++ /dev/null
@@ -1,270 +0,0 @@
-Frequently Asked Questions
-==========================
-
-Why have both dynamic and static typing?
-****************************************
-
-Dynamic typing can be flexible, powerful, convenient and easy. But
-it's not always the best approach; there are good reasons why many
-developers choose to use statically typed languages.
-
-Here are some potential benefits of mypy-style static typing:
-
-- Static typing can make programs easier to understand and
- maintain. Type declarations can serve as machine-checked
- documentation. This is important as code is typically read much more
- often than modified, and this is especially important for large and
- complex programs.
-
-- Static typing can help you find bugs earlier and with less testing
- and debugging. Especially in large and complex projects this can be
- a major time-saver.
-
-- Static typing can help you find difficult-to-find bugs before your
- code goes into production. This can improve reliability and reduce
- the number of security issues.
-
-- Static typing makes it practical to build very useful development
- tools that can improve programming productivity or software quality,
- including IDEs with precise and reliable code completion, static
- analysis tools, etc.
-
-- You can get the benefits of both dynamic and static typing in a
- single language. Dynamic typing can be perfect for a small project
- or for writing the UI of your program, for example. As your program
- grows, you can adapt tricky application logic to static typing to
- help maintenance.
-
-See also the `front page <http://www.mypy-lang.org>`_ of the mypy web
-site.
-
-Would my project benefit from static typing?
-********************************************
-
-For many projects dynamic typing is perfectly fine (we think that
-Python is a great language). But sometimes your projects demand bigger
-guns, and that's when mypy may come in handy.
-
-If some of these ring true for your projects, mypy (and static typing)
-may be useful:
-
-- Your project is large or complex.
-
-- Your codebase must be maintained for a long time.
-
-- Multiple developers are working on the same code.
-
-- Running tests takes a lot of time or work (type checking may help
- you find errors early in development, reducing the number of testing
- iterations).
-
-- Some project members (devs or management) don't like dynamic typing,
- but others prefer dynamic typing and Python syntax. Mypy could be a
- solution that everybody finds easy to accept.
-
-- You want to future-proof your project even if currently none of the
- above really apply.
-
-Can I use mypy to type check my existing Python code?
-*****************************************************
-
-It depends. Compatibility is pretty good, but some Python features are
-not yet implemented or fully supported. The ultimate goal is to make
-using mypy practical for most Python code. Code that uses complex
-introspection or metaprogramming may be impractical to type check, but
-it should still be possible to use static typing in other parts of a
-program.
-
-Will static typing make my programs run faster?
-***********************************************
-
-Mypy only does static type checking and it does not improve
-performance. It has a minimal performance impact. In the future, there
-could be other tools that can compile statically typed mypy code to C
-modules or to efficient JVM bytecode, for example, but this is outside
-the scope of the mypy project. It may also be possible to modify
-existing Python VMs to take advantage of static type information, but
-whether this is feasible is still unknown. This is nontrivial since
-the runtime types do not necessarily correspond to the static types.
-
-How do I type check my Python 2 code?
-*************************************
-
-You can use a `comment-based function annotation syntax
-<https://www.python.org/dev/peps/pep-0484/#suggested-syntax-for-python-2-7-and-straddling-code>`_
-and use the ``--py2`` command-line option to type check your Python 2 code.
-You'll also need to install ``typing`` for Python 2 via ``pip install typing``.
-
-Is mypy free?
-*************
-
-Yes. Mypy is free software, and it can also be used for commercial and
-proprietary projects. Mypy is available under the MIT license.
-
-Why not use structural subtyping?
-*********************************
-
-Mypy primarily uses `nominal subtyping
-<https://en.wikipedia.org/wiki/Nominative_type_system>`_ instead of
-`structural subtyping
-<https://en.wikipedia.org/wiki/Structural_type_system>`_. Some argue
-that structural subtyping is better suited for languages with duck
-typing such as Python.
-
-Here are some reasons why mypy uses nominal subtyping:
-
-1. It is easy to generate short and informative error messages when
- using a nominal type system. This is especially important when
- using type inference.
-
-2. Python supports basically nominal isinstance tests and they are
- widely used in programs. It is not clear how to support isinstance
- in a purely structural type system while remaining compatible with
- Python idioms.
-
-3. Many programmers are already familiar with nominal subtyping and it
- has been successfully used in languages such as Java, C++ and
- C#. Only few languages use structural subtyping.
-
-However, structural subtyping can also be useful. Structural subtyping
-is a likely feature to be added to mypy in the future, even though we
-expect that most mypy programs will still primarily use nominal
-subtyping.
-
-I like Python and I have no need for static typing
-**************************************************
-
-That wasn't really a question, was it? Mypy is not aimed at replacing
-Python. The goal is to give more options for Python programmers, to
-make Python a more competitive alternative to other statically typed
-languages in large projects, to improve programmer productivity and to
-improve software quality.
-
-How are mypy programs different from normal Python?
-***************************************************
-
-Since you use a vanilla Python implementation to run mypy programs,
-mypy programs are also Python programs. The type checker may give
-warnings for some valid Python code, but the code is still always
-runnable. Also, some Python features and syntax are still not
-supported by mypy, but this is gradually improving.
-
-The obvious difference is the availability of static type
-checking. The section :ref:`common_issues` mentions some
-modifications to Python code that may be required to make code type
-check without errors. Also, your code must make attributes explicit and
-use a explicit protocol representation. For example, you may want to
-subclass an Abstract Base Class such as ``typing.Iterable``.
-
-Mypy will support modular, efficient type checking, and this seems to
-rule out type checking some language features, such as arbitrary
-runtime addition of methods. However, it is likely that many of these
-features will be supported in a restricted form (for example, runtime
-modification is only supported for classes or methods registered as
-dynamic or 'patchable').
-
-How is mypy different from PyPy?
-********************************
-
-*This answer relates to PyPy as a Python implementation. See also the answer related to RPython below.*
-
-Mypy and PyPy are orthogonal. Mypy does static type checking, i.e. it
-is basically a linter, but static typing has no runtime effect,
-whereas the PyPy is an Python implementation. You can use PyPy to run
-mypy programs.
-
-How is mypy different from Cython?
-**********************************
-
-`Cython <http://cython.org/>`_ is a variant of Python that supports
-compilation to CPython C modules. It can give major speedups to
-certain classes of programs compared to CPython, and it provides
-static typing (though this is different from mypy). Mypy differs in
-the following aspects, among others:
-
-- Cython is much more focused on performance than mypy. Mypy is only
- about static type checking, and increasing performance is not a
- direct goal.
-
-- The mypy syntax is arguably simpler and more "Pythonic" (no cdef/cpdef, etc.) for statically typed code.
-
-- The mypy syntax is compatible with Python. Mypy programs are normal
- Python programs that can be run using any Python
- implementation. Cython has many incompatible extensions to Python
- syntax, and Cython programs generally cannot be run without first
- compiling them to CPython extension modules via C. Cython also has a
- pure Python mode, but it seems to support only a subset of Cython
- functionality, and the syntax is quite verbose.
-
-- Mypy has a different set of type system features. For example, mypy
- has genericity (parametric polymorphism), function types and
- bidirectional type inference, which are not supported by
- Cython. (Cython has fused types that are different but related to
- mypy generics. Mypy also has a similar feature as an extension of
- generics.)
-
-- The mypy type checker knows about the static types of many Python
- stdlib modules and can effectively type check code that uses them.
-
-- Cython supports accessing C functions directly and many features are
- defined in terms of translating them to C or C++. Mypy just uses
- Python semantics, and mypy does not deal with accessing C library
- functionality.
-
-How is mypy different from Nuitka?
-**********************************
-
-`Nuitka <http://nuitka.net/>`_ is a static compiler that can translate
-Python programs to C++. Nuitka integrates with the CPython
-runtime. Nuitka has additional future goals, such as using type
-inference and whole-program analysis to further speed up code. Here
-are some differences:
-
-- Nuitka is primarily focused on speeding up Python code. Mypy focuses
- on static type checking and facilitating better tools.
-
-- Whole-program analysis tends to be slow and scale poorly to large or
- complex programs. It is still unclear if Nuitka can solve these
- issues. Mypy does not use whole-program analysis and will support
- modular type checking (though this has not been implemented yet).
-
-How is mypy different from RPython or Shed Skin?
-************************************************
-
-`RPython <http://doc.pypy.org/en/latest/coding-guide.html>`_ and `Shed
-Skin <http://shed-skin.blogspot.co.uk/>`_ are basically statically
-typed subsets of Python. Mypy does the following important things
-differently:
-
-- RPython is primarily designed for implementing virtual machines;
- mypy is a general-purpose tool.
-
-- Mypy supports both static and dynamic typing. Dynamically typed and
- statically typed code can be freely mixed and can interact
- seamlessly.
-
-- Mypy aims to support (in the future) fast and modular type
- checking. Both RPython and Shed Skin use whole-program type
- inference which is very slow, does not scale well to large programs
- and often produces confusing error messages. Mypy can support
- modularity since it only uses local type inference; static type
- checking depends on having type annotations for functions
- signatures.
-
-- Mypy will support introspection, dynamic loading of code and many
- other dynamic language features (though using these may make static
- typing less effective). RPython and Shed Skin only support a
- restricted Python subset without several of these features.
-
-- Mypy supports user-defined generic types.
-
-Mypy is a cool project. Can I help?
-***********************************
-
-Any help is much appreciated! `Contact
-<http://www.mypy-lang.org/contact.html>`_ the developers if you would
-like to contribute. Any help related to development, design,
-publicity, documentation, testing, web site maintenance, financing,
-etc. can be helpful. You can learn a lot by contributing, and anybody
-can help, even beginners! However, some knowledge of compilers and/or
-type systems is essential if you want to work on mypy internals.
diff --git a/docs/source/function_overloading.rst b/docs/source/function_overloading.rst
deleted file mode 100644
index b55cddd..0000000
--- a/docs/source/function_overloading.rst
+++ /dev/null
@@ -1,60 +0,0 @@
-Function overloading in stubs
-=============================
-
-Sometimes you have a library function that seems to call for two or
-more signatures. That's okay -- you can define multiple *overloaded*
-instances of a function with the same name but different signatures in
-a stub file (this feature is not supported for user code, at least not
-yet) using the ``@overload`` decorator. For example, we can define an
-``abs`` function that works for both ``int`` and ``float`` arguments:
-
-.. code-block:: python
-
- # This is a stub file!
-
- from typing import overload
-
- @overload
- def abs(n: int) -> int: pass
-
- @overload
- def abs(n: float) -> float: pass
-
-Note that we can't use ``Union[int, float]`` as the argument type,
-since this wouldn't allow us to express that the return
-type depends on the argument type.
-
-Now if we import ``abs`` as defined in the above library stub, we can
-write code like this, and the types are inferred correctly:
-
-.. code-block:: python
-
- n = abs(-2) # 2 (int)
- f = abs(-1.5) # 1.5 (float)
-
-Overloaded function variants are still ordinary Python functions and
-they still define a single runtime object. The following code is
-thus valid:
-
-.. code-block:: python
-
- my_abs = abs
- my_abs(-2) # 2 (int)
- my_abs(-1.5) # 1.5 (float)
-
-The overload variants must be adjacent in the code. This makes code
-clearer, as you don't have to hunt for overload variants across the
-file.
-
-.. note::
-
- As generic type variables are erased at runtime when constructing
- instances of generic types, an overloaded function cannot have
- variants that only differ in a generic type argument,
- e.g. ``List[int]`` versus ``List[str]``.
-
-.. note::
-
- If you are writing a regular module rather than a stub, you can
- often use a type variable with a value restriction to represent
- functions as ``abs`` above (see :ref:`type-variable-value-restriction`).
diff --git a/docs/source/generics.rst b/docs/source/generics.rst
deleted file mode 100644
index f6c0640..0000000
--- a/docs/source/generics.rst
+++ /dev/null
@@ -1,390 +0,0 @@
-Generics
-========
-
-Defining generic classes
-************************
-
-The built-in collection classes are generic classes. Generic types
-have one or more type parameters, which can be arbitrary types. For
-example, ``Dict[int, str]`` has the type parameters ``int`` and
-``str``, and ``List[int]`` has a type parameter ``int``.
-
-Programs can also define new generic classes. Here is a very simple
-generic class that represents a stack:
-
-.. code-block:: python
-
- from typing import TypeVar, Generic
-
- T = TypeVar('T')
-
- class Stack(Generic[T]):
- def __init__(self) -> None:
- # Create an empty list with items of type T
- self.items = [] # type: List[T]
-
- def push(self, item: T) -> None:
- self.items.append(item)
-
- def pop(self) -> T:
- return self.items.pop()
-
- def empty(self) -> bool:
- return not self.items
-
-The ``Stack`` class can be used to represent a stack of any type:
-``Stack[int]``, ``Stack[Tuple[int, str]]``, etc.
-
-Using ``Stack`` is similar to built-in container types:
-
-.. code-block:: python
-
- # Construct an empty Stack[int] instance
- stack = Stack[int]()
- stack.push(2)
- stack.pop()
- stack.push('x') # Type error
-
-Type inference works for user-defined generic types as well:
-
-.. code-block:: python
-
- def process(stack: Stack[int]) -> None: ...
-
- process(Stack()) # Argument has inferred type Stack[int]
-
-Construction of instances of generic types is also type checked:
-
-.. code-block:: python
-
- class Box(Generic[T]):
- def __init__(self, content: T) -> None:
- self.content = content
-
- Box(1) # OK, inferred type is Box[int]
- Box[int](1) # Also OK
- s = 'some string'
- Box[int](s) # Type error
-
-Generic class internals
-***********************
-
-You may wonder what happens at runtime when you index
-``Stack``. Actually, indexing ``Stack`` returns essentially a copy
-of ``Stack`` that returns instances of the original class on
-instantiation:
-
->>> print(Stack)
-__main__.Stack
->>> print(Stack[int])
-__main__.Stack[int]
->>> print(Stack[int]().__class__)
-__main__.Stack
-
-Note that built-in types ``list``, ``dict`` and so on do not support
-indexing in Python. This is why we have the aliases ``List``, ``Dict``
-and so on in the ``typing`` module. Indexing these aliases gives
-you a class that directly inherits from the target class in Python:
-
->>> from typing import List
->>> List[int]
-typing.List[int]
->>> List[int].__bases__
-(<class 'list'>, typing.MutableSequence)
-
-Generic types could be instantiated or subclassed as usual classes,
-but the above examples illustrate that type variables are erased at
-runtime. Generic ``Stack`` instances are just ordinary
-Python objects, and they have no extra runtime overhead or magic due
-to being generic, other than a metaclass that overloads the indexing
-operator.
-
-.. _generic-functions:
-
-Generic functions
-*****************
-
-Generic type variables can also be used to define generic functions:
-
-.. code-block:: python
-
- from typing import TypeVar, Sequence
-
- T = TypeVar('T') # Declare type variable
-
- def first(seq: Sequence[T]) -> T: # Generic function
- return seq[0]
-
-As with generic classes, the type variable can be replaced with any
-type. That means ``first`` can be used with any sequence type, and the
-return type is derived from the sequence item type. For example:
-
-.. code-block:: python
-
- # Assume first defined as above.
-
- s = first('foo') # s has type str.
- n = first([1, 2, 3]) # n has type int.
-
-Note also that a single definition of a type variable (such as ``T``
-above) can be used in multiple generic functions or classes. In this
-example we use the same type variable in two generic functions:
-
-.. code-block:: python
-
- from typing import TypeVar, Sequence
-
- T = TypeVar('T') # Declare type variable
-
- def first(seq: Sequence[T]) -> T:
- return seq[0]
-
- def last(seq: Sequence[T]) -> T:
- return seq[-1]
-
-.. _generic-methods-and-generic-self:
-
-Generic methods and generic self
-********************************
-
-You can also define generic methods — just use a type variable in the
-method signature that is different from class type variables. In particular,
-``self`` may also be generic, allowing a method to return the most precise
-type known at the point of access.
-
-.. note::
-
- This feature is experimental. Checking code with type annotations for self
- arguments is still not fully implemented. Mypy may disallow valid code or
- allow unsafe code.
-
-In this way, for example, you can typecheck chaining of setter methods:
-
-.. code-block:: python
-
- from typing import TypeVar
-
- T = TypeVar('T', bound='Shape')
-
- class Shape:
- def set_scale(self: T, scale: float) -> T:
- self.scale = scale
- return self
-
- class Circle(Shape):
- def set_radius(self, r: float) -> 'Circle':
- self.radius = r
- return self
-
- class Square(Shape):
- def set_width(self, w: float) -> 'Square':
- self.width = w
- return self
-
- circle = Circle().set_scale(0.5).set_radius(2.7) # type: Circle
- square = Square().set_scale(0.5).set_width(3.2) # type: Square
-
-Without using generic ``self``, the last two lines could not be type-checked properly.
-
-Other uses are factory methods, such as copy and deserialization.
-For class methods, you can also define generic ``cls``, using ``Type[T]``:
-
-.. code-block:: python
-
- from typing import TypeVar, Tuple, Type
-
- T = TypeVar('T', bound='Friend')
-
- class Friend:
- other = None # type: Friend
-
- @classmethod
- def make_pair(cls: Type[T]) -> Tuple[T, T]:
- a, b = cls(), cls()
- a.other = b
- b.other = a
- return a, b
-
- class SuperFriend(Friend):
- pass
-
- a, b = SuperFriend.make_pair()
-
-Note that when overriding a method with generic ``self``, you must either
-return a generic ``self`` too, or return an instance of the current class.
-In the latter case, you must implement this method in all future subclasses.
-
-Note also that mypy cannot always verify that the implementation of a copy
-or a deserialization method returns the actual type of self. Therefore
-you may need to silence mypy inside these methods (but not at the call site),
-possibly by making use of the ``Any`` type.
-
-.. _type-variable-value-restriction:
-
-Type variables with value restriction
-*************************************
-
-By default, a type variable can be replaced with any type. However, sometimes
-it's useful to have a type variable that can only have some specific types
-as its value. A typical example is a type variable that can only have values
-``str`` and ``bytes``:
-
-.. code-block:: python
-
- from typing import TypeVar
-
- AnyStr = TypeVar('AnyStr', str, bytes)
-
-This is actually such a common type variable that ``AnyStr`` is
-defined in ``typing`` and we don't need to define it ourselves.
-
-We can use ``AnyStr`` to define a function that can concatenate
-two strings or bytes objects, but it can't be called with other
-argument types:
-
-.. code-block:: python
-
- from typing import AnyStr
-
- def concat(x: AnyStr, y: AnyStr) -> AnyStr:
- return x + y
-
- concat('a', 'b') # Okay
- concat(b'a', b'b') # Okay
- concat(1, 2) # Error!
-
-Note that this is different from a union type, since combinations
-of ``str`` and ``bytes`` are not accepted:
-
-.. code-block:: python
-
- concat('string', b'bytes') # Error!
-
-In this case, this is exactly what we want, since it's not possible
-to concatenate a string and a bytes object! The type checker
-will reject this function:
-
-.. code-block:: python
-
- def union_concat(x: Union[str, bytes], y: Union[str, bytes]) -> Union[str, bytes]:
- return x + y # Error: can't concatenate str and bytes
-
-Another interesting special case is calling ``concat()`` with a
-subtype of ``str``:
-
-.. code-block:: python
-
- class S(str): pass
-
- ss = concat(S('foo'), S('bar')))
-
-You may expect that the type of ``ss`` is ``S``, but the type is
-actually ``str``: a subtype gets promoted to one of the valid values
-for the type variable, which in this case is ``str``. This is thus
-subtly different from *bounded quantification* in languages such as
-Java, where the return type would be ``S``. The way mypy implements
-this is correct for ``concat``, since ``concat`` actually returns a
-``str`` instance in the above example:
-
-.. code-block:: python
-
- >>> print(type(ss))
- <class 'str'>
-
-You can also use a ``TypeVar`` with a restricted set of possible
-values when defining a generic class. For example, mypy uses the type
-``typing.Pattern[AnyStr]`` for the return value of ``re.compile``,
-since regular expressions can be based on a string or a bytes pattern.
-
-.. _type-variable-upper-bound:
-
-Type variables with upper bounds
-********************************
-
-A type variable can also be restricted to having values that are
-subtypes of a specific type. This type is called the upper bound of
-the type variable, and is specified with the ``bound=...`` keyword
-argument to ``TypeVar``.
-
-.. code-block:: python
-
- from typing import TypeVar, SupportsAbs
-
- T = TypeVar('T', bound=SupportsAbs[float])
-
-In the definition of a generic function that uses such a type variable
-``T``, the type represented by ``T`` is assumed to be a subtype of
-its upper bound, so the function can use methods of the upper bound on
-values of type ``T``.
-
-.. code-block:: python
-
- def largest_in_absolute_value(*xs: T) -> T:
- return max(xs, key=abs) # Okay, because T is a subtype of SupportsAbs[float].
-
-In a call to such a function, the type ``T`` must be replaced by a
-type that is a subtype of its upper bound. Continuing the example
-above,
-
-.. code-block:: python
-
- largest_in_absolute_value(-3.5, 2) # Okay, has type float.
- largest_in_absolute_value(5+6j, 7) # Okay, has type complex.
- largest_in_absolute_value('a', 'b') # Error: 'str' is not a subtype of SupportsAbs[float].
-
-Type parameters of generic classes may also have upper bounds, which
-restrict the valid values for the type parameter in the same way.
-
-A type variable may not have both a value restriction (see
-:ref:`type-variable-value-restriction`) and an upper bound.
-
-.. _declaring-decorators:
-
-Declaring decorators
-********************
-
-One common application of type variable upper bounds is in declaring a
-decorator that preserves the signature of the function it decorates,
-regardless of that signature. Here's a complete example:
-
-.. code-block:: python
-
- from typing import Any, Callable, TypeVar, Tuple, cast
-
- FuncType = Callable[..., Any]
- F = TypeVar('F', bound=FuncType)
-
- # A decorator that preserves the signature.
- def my_decorator(func: F) -> F:
- def wrapper(*args, **kwds):
- print("Calling", func)
- return func(*args, **kwds)
- return cast(F, wrapper)
-
- # A decorated function.
- @my_decorator
- def foo(a: int) -> str:
- return str(a)
-
- # Another.
- @my_decorator
- def bar(x: float, y: float) -> Tuple[float, float, bool]:
- return (x, y, x > y)
-
- a = foo(12)
- reveal_type(a) # str
- b = bar(3.14, 0)
- reveal_type(b) # Tuple[float, float, bool]
- foo('x') # Type check error: incompatible type "str"; expected "int"
-
-From the final block we see that the signatures of the decorated
-functions ``foo()`` and ``bar()`` are the same as those of the original
-functions (before the decorator is applied).
-
-The bound on ``F`` is used so that calling the decorator on a
-non-function (e.g. ``my_decorator(1)``) will be rejected.
-
-Also note that the ``wrapper()`` function is not type-checked. Wrapper
-functions are typically small enough that this is not a big
-problem. This is also the reason for the ``cast()`` call in the
-``return`` statement in ``my_decorator()``. See :ref:`casts`.
diff --git a/docs/source/getting_started.rst b/docs/source/getting_started.rst
deleted file mode 100644
index a41c125..0000000
--- a/docs/source/getting_started.rst
+++ /dev/null
@@ -1,24 +0,0 @@
-.. _getting-started:
-
-Getting started
-===============
-
-Installation
-************
-
-Mypy requires Python 3.3 or later. Once you've `installed Python 3 <https://www.python.org/downloads/>`_, you can install mypy with:
-
-.. code-block:: text
-
- $ python3 -m pip install mypy
-
-Installing from source
-**********************
-
-To install mypy from source, clone the github repository and then run pip install locally:
-
-.. code-block:: text
-
- $ git clone https://github.com/python/mypy.git
- $ cd mypy
- $ sudo python3 -m pip install --upgrade .
diff --git a/docs/source/index.rst b/docs/source/index.rst
deleted file mode 100644
index 90cc749..0000000
--- a/docs/source/index.rst
+++ /dev/null
@@ -1,42 +0,0 @@
-.. Mypy documentation master file, created by
- sphinx-quickstart on Sun Sep 14 19:50:35 2014.
- You can adapt this file completely to your liking, but it should at least
- contain the root `toctree` directive.
-
-Welcome to Mypy documentation!
-==============================
-
-Mypy is a static type checker for Python.
-
-.. toctree::
- :maxdepth: 2
-
- introduction
- basics
- getting_started
- builtin_types
- python2
- type_inference_and_annotations
- kinds_of_types
- class_basics
- dynamic_typing
- function_overloading
- casts
- duck_type_compatibility
- common_issues
- generics
- supported_python_features
- additional_features
- command_line
- config_file
- python36
- faq
- cheat_sheet
- cheat_sheet_py3
- revision_history
-
-Indices and tables
-==================
-
-* :ref:`genindex`
-* :ref:`search`
diff --git a/docs/source/introduction.rst b/docs/source/introduction.rst
deleted file mode 100644
index 3bcd0ad..0000000
--- a/docs/source/introduction.rst
+++ /dev/null
@@ -1,30 +0,0 @@
-Introduction
-============
-
-Mypy is a static type checker for Python. If you sprinkle your code
-with type annotations, mypy can type check your code and find common bugs.
-As mypy is a static analyzer, or a lint-like tool, your code's type
-annotations are just hints and don't interfere when running your program.
-You run your program with a standard Python interpreter, and the annotations
-are treated primarily as comments.
-
-Using the Python 3 function annotation syntax (using the PEP 484 notation) or
-a comment-based annotation syntax for Python 2 code, you will be able to
-efficiently annotate your code and use mypy to check the code for common
-errors. Mypy has a powerful, easy-to-use, type system with modern features
-such as type inference, generics, function types, tuple types and
-union types.
-
-As a developer, you decide how to use mypy in your workflow. You can always
-escape to dynamic typing as mypy's approach to static typing doesn't restrict
-what you can do in your programs. Using mypy will make your programs easier to
-debug, maintain, and understand.
-
-This documentation provides a short introduction to mypy. It will help you
-get started writing statically typed code. Knowledge of Python and a
-statically typed object-oriented language, such as Java, are assumed.
-
-.. note::
-
- Mypy is still experimental. There will be changes
- that break backward compatibility.
diff --git a/docs/source/kinds_of_types.rst b/docs/source/kinds_of_types.rst
deleted file mode 100644
index dc639d9..0000000
--- a/docs/source/kinds_of_types.rst
+++ /dev/null
@@ -1,1002 +0,0 @@
-Kinds of types
-==============
-
-User-defined types
-******************
-
-Each class is also a type. Any instance of a subclass is also
-compatible with all superclasses. All values are compatible with the
-``object`` type (and also the ``Any`` type).
-
-.. code-block:: python
-
- class A:
- def f(self) -> int: # Type of self inferred (A)
- return 2
-
- class B(A):
- def f(self) -> int:
- return 3
- def g(self) -> int:
- return 4
-
- a = B() # type: A # OK (explicit type for a; override type inference)
- print(a.f()) # 3
- a.g() # Type check error: A has no method g
-
-The Any type
-************
-
-A value with the ``Any`` type is dynamically typed. Mypy doesn't know
-anything about the possible runtime types of such value. Any
-operations are permitted on the value, and the operations are checked
-at runtime, similar to normal Python code without type annotations.
-
-``Any`` is compatible with every other type, and vice versa. No
-implicit type check is inserted when assigning a value of type ``Any``
-to a variable with a more precise type:
-
-.. code-block:: python
-
- a = None # type: Any
- s = '' # type: str
- a = 2 # OK
- s = a # OK
-
-Declared (and inferred) types are *erased* at runtime. They are
-basically treated as comments, and thus the above code does not
-generate a runtime error, even though ``s`` gets an ``int`` value when
-the program is run. Note that the declared type of ``s`` is actually
-``str``!
-
-If you do not define a function return value or argument types, these
-default to ``Any``:
-
-.. code-block:: python
-
- def show_heading(s) -> None:
- print('=== ' + s + ' ===') # No static type checking, as s has type Any
-
- show_heading(1) # OK (runtime error only; mypy won't generate an error)
-
-You should give a statically typed function an explicit ``None``
-return type even if it doesn't return a value, as this lets mypy catch
-additional type errors:
-
-.. code-block:: python
-
- def wait(t: float): # Implicit Any return value
- print('Waiting...')
- time.sleep(t)
-
- if wait(2) > 1: # Mypy doesn't catch this error!
- ...
-
-If we had used an explicit ``None`` return type, mypy would have caught
-the error:
-
-.. code-block:: python
-
- def wait(t: float) -> None:
- print('Waiting...')
- time.sleep(t)
-
- if wait(2) > 1: # Error: can't compare None and int
- ...
-
-The ``Any`` type is discussed in more detail in section :ref:`dynamic_typing`.
-
-.. note::
-
- A function without any types in the signature is dynamically
- typed. The body of a dynamically typed function is not checked
- statically, and local variables have implicit ``Any`` types.
- This makes it easier to migrate legacy Python code to mypy, as
- mypy won't complain about dynamically typed functions.
-
-.. _tuple-types:
-
-Tuple types
-***********
-
-The type ``Tuple[T1, ..., Tn]`` represents a tuple with the item types ``T1``, ..., ``Tn``:
-
-.. code-block:: python
-
- def f(t: Tuple[int, str]) -> None:
- t = 1, 'foo' # OK
- t = 'foo', 1 # Type check error
-
-A tuple type of this kind has exactly a specific number of items (2 in
-the above example). Tuples can also be used as immutable,
-varying-length sequences. You can use the type ``Tuple[T, ...]`` (with
-a literal ``...`` -- it's part of the syntax) for this
-purpose. Example:
-
-.. code-block:: python
-
- def print_squared(t: Tuple[int, ...]) -> None:
- for n in t:
- print(n, n ** 2)
-
- print_squared(()) # OK
- print_squared((1, 3, 5)) # OK
- print_squared([1, 2]) # Error: only a tuple is valid
-
-.. note::
-
- Usually it's a better idea to use ``Sequence[T]`` instead of ``Tuple[T, ...]``, as
- ``Sequence`` is also compatible with lists and other non-tuple sequences.
-
-.. note::
-
- ``Tuple[...]`` is not valid as a base class outside stub files. This is a
- limitation of the ``typing`` module. One way to work around
- this is to use a named tuple as a base class (see section :ref:`named-tuples`).
-
-.. _callable-types:
-
-Callable types (and lambdas)
-****************************
-
-You can pass around function objects and bound methods in statically
-typed code. The type of a function that accepts arguments ``A1``, ..., ``An``
-and returns ``Rt`` is ``Callable[[A1, ..., An], Rt]``. Example:
-
-.. code-block:: python
-
- from typing import Callable
-
- def twice(i: int, next: Callable[[int], int]) -> int:
- return next(next(i))
-
- def add(i: int) -> int:
- return i + 1
-
- print(twice(3, add)) # 5
-
-You can only have positional arguments, and only ones without default
-values, in callable types. These cover the vast majority of uses of
-callable types, but sometimes this isn't quite enough. Mypy recognizes
-a special form ``Callable[..., T]`` (with a literal ``...``) which can
-be used in less typical cases. It is compatible with arbitrary
-callable objects that return a type compatible with ``T``, independent
-of the number, types or kinds of arguments. Mypy lets you call such
-callable values with arbitrary arguments, without any checking -- in
-this respect they are treated similar to a ``(*args: Any, **kwargs:
-Any)`` function signature. Example:
-
-.. code-block:: python
-
- from typing import Callable
-
- def arbitrary_call(f: Callable[..., int]) -> int:
- return f('x') + f(y=2) # OK
-
- arbitrary_call(ord) # No static error, but fails at runtime
- arbitrary_call(open) # Error: does not return an int
- arbitrary_call(1) # Error: 'int' is not callable
-
-Lambdas are also supported. The lambda argument and return value types
-cannot be given explicitly; they are always inferred based on context
-using bidirectional type inference:
-
-.. code-block:: python
-
- l = map(lambda x: x + 1, [1, 2, 3]) # Infer x as int and l as List[int]
-
-If you want to give the argument or return value types explicitly, use
-an ordinary, perhaps nested function definition.
-
-.. _union-types:
-
-Union types
-***********
-
-Python functions often accept values of two or more different
-types. You can use overloading to model this in statically typed code,
-but union types can make code like this easier to write.
-
-Use the ``Union[T1, ..., Tn]`` type constructor to construct a union
-type. For example, the type ``Union[int, str]`` is compatible with
-both integers and strings. You can use an ``isinstance()`` check to
-narrow down the type to a specific type:
-
-.. code-block:: python
-
- from typing import Union
-
- def f(x: Union[int, str]) -> None:
- x + 1 # Error: str + int is not valid
- if isinstance(x, int):
- # Here type of x is int.
- x + 1 # OK
- else:
- # Here type of x is str.
- x + 'a' # OK
-
- f(1) # OK
- f('x') # OK
- f(1.1) # Error
-
-.. _optional:
-
-The type of None and optional types
-***********************************
-
-Mypy treats the type of ``None`` as special. ``None`` is a valid value
-for every type, which resembles ``null`` in Java. Unlike Java, mypy
-doesn't treat primitives types
-specially: ``None`` is also valid for primitive types such as ``int``
-and ``float``.
-
-.. note::
-
- See :ref:`strict_optional` for an experimental mode which allows
- mypy to check ``None`` values precisely.
-
-When initializing a variable as ``None``, ``None`` is usually an
-empty place-holder value, and the actual value has a different type.
-This is why you need to annotate an attribute in a case like this:
-
-.. code-block:: python
-
- class A:
- def __init__(self) -> None:
- self.count = None # type: int
-
-Mypy will complain if you omit the type annotation, as it wouldn't be
-able to infer a non-trivial type for the ``count`` attribute
-otherwise.
-
-Mypy generally uses the first assignment to a variable to
-infer the type of the variable. However, if you assign both a ``None``
-value and a non-``None`` value in the same scope, mypy can often do
-the right thing:
-
-.. code-block:: python
-
- def f(i: int) -> None:
- n = None # Inferred type int because of the assignment below
- if i > 0:
- n = i
- ...
-
-Often it's useful to know whether a variable can be
-``None``. For example, this function accepts a ``None`` argument,
-but it's not obvious from its signature:
-
-.. code-block:: python
-
- def greeting(name: str) -> str:
- if name:
- return 'Hello, {}'.format(name)
- else:
- return 'Hello, stranger'
-
- print(greeting('Python')) # Okay!
- print(greeting(None)) # Also okay!
-
-Mypy lets you use ``Optional[t]`` to document that ``None`` is a
-valid argument type:
-
-.. code-block:: python
-
- from typing import Optional
-
- def greeting(name: Optional[str]) -> str:
- if name:
- return 'Hello, {}'.format(name)
- else:
- return 'Hello, stranger'
-
-Mypy treats this as semantically equivalent to the previous example,
-since ``None`` is implicitly valid for any type, but it's much more
-useful for a programmer who is reading the code. You can equivalently
-use ``Union[str, None]``, but ``Optional`` is shorter and more
-idiomatic.
-
-.. note::
-
- ``None`` is also used as the return type for functions that don't
- return a value, i.e. that implicitly return ``None``. Mypy doesn't
- use ``NoneType`` for this, since it would
- look awkward, even though that is the real name of the type of ``None``
- (try ``type(None)`` in the interactive interpreter to see for yourself).
-
-.. _strict_optional:
-
-Experimental strict optional type and None checking
-***************************************************
-
-Currently, ``None`` is a valid value for each type, similar to
-``null`` or ``NULL`` in many languages. However, you can use the
-experimental ``--strict-optional`` command line option to tell mypy
-that types should not include ``None``
-by default. The ``Optional`` type modifier is then used to define
-a type variant that includes ``None``, such as ``Optional[int]``:
-
-.. code-block:: python
-
- from typing import Optional
-
- def f() -> Optional[int]:
- return None # OK
-
- def g() -> int:
- ...
- return None # Error: None not compatible with int
-
-Also, most operations will not be allowed on unguarded ``None``
-or ``Optional`` values:
-
-.. code-block:: python
-
- def f(x: Optional[int]) -> int:
- return x + 1 # Error: Cannot add None and int
-
-Instead, an explicit ``None`` check is required. Mypy has
-powerful type inference that lets you use regular Python
-idioms to guard against ``None`` values. For example, mypy
-recognizes ``is None`` checks:
-
-.. code-block:: python
-
- def f(x: Optional[int]) -> int:
- if x is None:
- return 0
- else:
- # The inferred type of x is just int here.
- return x + 1
-
-Mypy will infer the type of ``x`` to be ``int`` in the else block due to the
-check against ``None`` in the if condition.
-
-.. note::
-
- ``--strict-optional`` is experimental and still has known issues.
-
-Class name forward references
-*****************************
-
-Python does not allow references to a class object before the class is
-defined. Thus this code does not work as expected:
-
-.. code-block:: python
-
- def f(x: A) -> None: # Error: Name A not defined
- ....
-
- class A:
- ...
-
-In cases like these you can enter the type as a string literal — this
-is a *forward reference*:
-
-.. code-block:: python
-
- def f(x: 'A') -> None: # OK
- ...
-
- class A:
- ...
-
-Of course, instead of using a string literal type, you could move the
-function definition after the class definition. This is not always
-desirable or even possible, though.
-
-Any type can be entered as a string literal, and you can combine
-string-literal types with non-string-literal types freely:
-
-.. code-block:: python
-
- def f(a: List['A']) -> None: ... # OK
- def g(n: 'int') -> None: ... # OK, though not useful
-
- class A: pass
-
-String literal types are never needed in ``# type:`` comments.
-
-String literal types must be defined (or imported) later *in the same
-module*. They cannot be used to leave cross-module references
-unresolved. (For dealing with import cycles, see
-:ref:`import-cycles`.)
-
-.. _type-aliases:
-
-Type aliases
-************
-
-In certain situations, type names may end up being long and painful to type:
-
-.. code-block:: python
-
- def f() -> Union[List[Dict[Tuple[int, str], Set[int]]], Tuple[str, List[str]]]:
- ...
-
-When cases like this arise, you can define a type alias by simply
-assigning the type to a variable:
-
-.. code-block:: python
-
- AliasType = Union[List[Dict[Tuple[int, str], Set[int]]], Tuple[str, List[str]]]
-
- # Now we can use AliasType in place of the full name:
-
- def f() -> AliasType:
- ...
-
-Type aliases can be generic, in this case they could be used in two variants:
-Subscripted aliases are equivalent to original types with substituted type variables,
-number of type arguments must match the number of free type variables
-in generic type alias. Unsubscripted aliases are treated as original types with free
-variables replaced with ``Any``. Examples (following `PEP 484
-<https://www.python.org/dev/peps/pep-0484/#type-aliases>`_):
-
-.. code-block:: python
-
- from typing import TypeVar, Iterable, Tuple, Union, Callable
- S = TypeVar('S')
- TInt = Tuple[int, S]
- UInt = Union[S, int]
- CBack = Callable[..., S]
-
- def response(query: str) -> UInt[str]: # Same as Union[str, int]
- ...
- def activate(cb: CBack[S]) -> S: # Same as Callable[..., S]
- ...
- table_entry: TInt # Same as Tuple[int, Any]
-
- T = TypeVar('T', int, float, complex)
- Vec = Iterable[Tuple[T, T]]
-
- def inproduct(v: Vec[T]) -> T:
- return sum(x*y for x, y in v)
-
- def dilate(v: Vec[T], scale: T) -> Vec[T]:
- return ((x * scale, y * scale) for x, y in v)
-
- v1: Vec[int] = [] # Same as Iterable[Tuple[int, int]]
- v2: Vec = [] # Same as Iterable[Tuple[Any, Any]]
- v3: Vec[int, int] = [] # Error: Invalid alias, too many type arguments!
-
-Type aliases can be imported from modules like any names. Aliases can target another
-aliases (although building complex chains of aliases is not recommended, this
-impedes code readability, thus defeating the purpose of using aliases).
-Following previous examples:
-
-.. code-block:: python
-
- from typing import TypeVar, Generic, Optional
- from first_example import AliasType
- from second_example import Vec
-
- def fun() -> AliasType:
- ...
-
- T = TypeVar('T')
- class NewVec(Generic[T], Vec[T]):
- ...
- for i, j in NewVec[int]():
- ...
-
- OIntVec = Optional[Vec[int]]
-
-.. note::
-
- A type alias does not create a new type. It's just a shorthand notation for
- another type -- it's equivalent to the target type. For generic type aliases
- this means that variance of type variables used for alias definition does not
- apply to aliases. A parameterized generic alias is treated simply as an original
- type with the corresponding type variables substituted.
-
-.. _newtypes:
-
-NewTypes
-********
-
-(Freely after `PEP 484
-<https://www.python.org/dev/peps/pep-0484/#newtype-helper-function>`_.)
-
-There are also situations where a programmer might want to avoid logical errors by
-creating simple classes. For example:
-
-.. code-block:: python
-
- class UserId(int):
- pass
-
- get_by_user_id(user_id: UserId):
- ...
-
-However, this approach introduces some runtime overhead. To avoid this, the typing
-module provides a helper function ``NewType`` that creates simple unique types with
-almost zero runtime overhead. Mypy will treat the statement
-``Derived = NewType('Derived', Base)`` as being roughly equivalent to the following
-definition:
-
-.. code-block:: python
-
- class Derived(Base):
- def __init__(self, _x: Base) -> None:
- ...
-
-However, at runtime, ``NewType('Derived', Base)`` will return a dummy function that
-simply returns its argument:
-
-.. code-block:: python
-
- def Derived(_x):
- return _x
-
-Mypy will require explicit casts from ``int`` where ``UserId`` is expected, while
-implicitly casting from ``UserId`` where ``int`` is expected. Examples:
-
-.. code-block:: python
-
- from typing import NewType
-
- UserId = NewType('UserId', int)
-
- def name_by_id(user_id: UserId) -> str:
- ...
-
- UserId('user') # Fails type check
-
- name_by_id(42) # Fails type check
- name_by_id(UserId(42)) # OK
-
- num = UserId(5) + 1 # type: int
-
-``NewType`` accepts exactly two arguments. The first argument must be a string literal
-containing the name of the new type and must equal the name of the variable to which the new
-type is assigned. The second argument must be a properly subclassable class, i.e.,
-not a type construct like ``Union``, etc.
-
-The function returned by ``NewType`` accepts only one argument; this is equivalent to
-supporting only one constructor accepting an instance of the base class (see above).
-Example:
-
-.. code-block:: python
-
- from typing import NewType
-
- class PacketId:
- def __init__(self, major: int, minor: int) -> None:
- self._major = major
- self._minor = minor
-
- TcpPacketId = NewType('TcpPacketId', PacketId)
-
- packet = PacketId(100, 100)
- tcp_packet = TcpPacketId(packet) # OK
-
- tcp_packet = TcpPacketId(127, 0) # Fails in type checker and at runtime
-
-Both ``isinstance`` and ``issubclass``, as well as subclassing will fail for
-``NewType('Derived', Base)`` since function objects don't support these operations.
-
-.. note::
-
- Note that unlike type aliases, ``NewType`` will create an entirely new and
- unique type when used. The intended purpose of ``NewType`` is to help you
- detect cases where you accidentally mixed together the old base type and the
- new derived type.
-
- For example, the following will successfully typecheck when using type
- aliases:
-
- .. code-block:: python
-
- UserId = int
-
- def name_by_id(user_id: UserId) -> str:
- ...
-
- name_by_id(3) # ints and UserId are synonymous
-
- But a similar example using ``NewType`` will not typecheck:
-
- .. code-block:: python
-
- from typing import NewType
-
- UserId = NewType('UserId', int)
-
- def name_by_id(user_id: UserId) -> str:
- ...
-
- name_by_id(3) # int is not the same as UserId
-
-.. _named-tuples:
-
-Named tuples
-************
-
-Mypy recognizes named tuples and can type check code that defines or
-uses them. In this example, we can detect code trying to access a
-missing attribute:
-
-.. code-block:: python
-
- Point = namedtuple('Point', ['x', 'y'])
- p = Point(x=1, y=2)
- print(p.z) # Error: Point has no attribute 'z'
-
-If you use ``namedtuple`` to define your named tuple, all the items
-are assumed to have ``Any`` types. That is, mypy doesn't know anything
-about item types. You can use ``typing.NamedTuple`` to also define
-item types:
-
-.. code-block:: python
-
- from typing import NamedTuple
-
- Point = NamedTuple('Point', [('x', int),
- ('y', int)])
- p = Point(x=1, y='x') # Argument has incompatible type "str"; expected "int"
-
-Python 3.6 will have an alternative, class-based syntax for named tuples with types.
-Mypy supports it already:
-
-.. code-block:: python
-
- from typing import NamedTuple
-
- class Point(NamedTuple):
- x: int
- y: int
-
- p = Point(x=1, y='x') # Argument has incompatible type "str"; expected "int"
-
-.. note::
-
- The Python 3.6 syntax requires the ``--fast-parser`` flag. You must also have the
- `typed_ast <https://pypi.python.org/pypi/typed-ast>`_ package
- installed and have at least version 0.6.1. Use ``pip3 install -U typed_ast``.
-
-.. _type-of-class:
-
-The type of class objects
-*************************
-
-(Freely after `PEP 484
-<https://www.python.org/dev/peps/pep-0484/#the-type-of-class-objects>`_.)
-
-Sometimes you want to talk about class objects that inherit from a
-given class. This can be spelled as ``Type[C]`` where ``C`` is a
-class. In other words, when ``C`` is the name of a class, using ``C``
-to annotate an argument declares that the argument is an instance of
-``C`` (or of a subclass of ``C``), but using ``Type[C]`` as an
-argument annotation declares that the argument is a class object
-deriving from ``C`` (or ``C`` itself).
-
-For example, assume the following classes:
-
-.. code-block:: python
-
- class User:
- # Defines fields like name, email
-
- class BasicUser(User):
- def upgrade(self):
- """Upgrade to Pro"""
-
- class ProUser(User):
- def pay(self):
- """Pay bill"""
-
-Note that ``ProUser`` doesn't inherit from ``BasicUser``.
-
-Here's a function that creates an instance of one of these classes if
-you pass it the right class object:
-
-.. code-block:: python
-
- def new_user(user_class):
- user = user_class()
- # (Here we could write the user object to a database)
- return user
-
-How would we annotate this function? Without ``Type[]`` the best we
-could do would be:
-
-.. code-block:: python
-
- def new_user(user_class: type) -> User:
- # Same implementation as before
-
-This seems reasonable, except that in the following example, mypy
-doesn't see that the ``buyer`` variable has type ``ProUser``:
-
-.. code-block:: python
-
- buyer = new_user(ProUser)
- buyer.pay() # Rejected, not a method on User
-
-However, using ``Type[]`` and a type variable with an upper bound (see
-:ref:`type-variable-upper-bound`) we can do better:
-
-.. code-block:: python
-
- U = TypeVar('U', bound=User)
-
- def new_user(user_class: Type[U]) -> U:
- # Same implementation as before
-
-Now mypy will infer the correct type of the result when we call
-``new_user()`` with a specific subclass of ``User``:
-
-.. code-block:: python
-
- beginner = new_user(BasicUser) # Inferred type is BasicUser
- beginner.upgrade() # OK
-
-.. note::
-
- The value corresponding to ``Type[C]`` must be an actual class
- object that's a subtype of ``C``. Its constructor must be
- compatible with the constructor of ``C``. If ``C`` is a type
- variable, its upper bound must be a class object.
-
-For more details about ``Type[]`` see `PEP 484
-<https://www.python.org/dev/peps/pep-0484/#the-type-of-class-objects>`_.
-
-.. _text-and-anystr:
-
-Text and AnyStr
-***************
-
-Sometimes you may want to write a function which will accept only unicode
-strings. This can be challenging to do in a codebase intended to run in
-both Python 2 and Python 3 since ``str`` means something different in both
-versions and ``unicode`` is not a keyword in Python 3.
-
-To help solve this issue, use ``typing.Text`` which is aliased to
-``unicode`` in Python 2 and to ``str`` in Python 3. This allows you to
-indicate that a function should accept only unicode strings in a
-cross-compatible way:
-
-.. code-block:: python
-
- from typing import Text
-
- def unicode_only(s: Text) -> Text:
- return s + u'\u2713'
-
-In other cases, you may want to write a function that will work with any
-kind of string but will not let you mix two different string types. To do
-so use ``typing.AnyStr``:
-
-.. code-block:: python
-
- from typing import AnyStr
-
- def concat(x: AnyStr, y: AnyStr) -> AnyStr:
- return x + y
-
- concat('a', 'b') # Okay
- concat(b'a', b'b') # Okay
- concat('a', b'b') # Error: cannot mix bytes and unicode
-
-For more details, see :ref:`type-variable-value-restriction`.
-
-.. note::
-
- How ``bytes``, ``str``, and ``unicode`` are handled between Python 2 and
- Python 3 may change in future versions of mypy.
-
-.. _generators:
-
-Generators
-**********
-
-A basic generator that only yields values can be annotated as having a return
-type of either ``Iterator[YieldType]`` or ``Iterable[YieldType]``. For example:
-
-.. code-block:: python
-
- def squares(n: int) -> Iterator[int]:
- for i in range(n):
- yield i * i
-
-If you want your generator to accept values via the ``send`` method or return
-a value, you should use the
-``Generator[YieldType, SendType, ReturnType]`` generic type instead. For example:
-
-.. code-block:: python
-
- def echo_round() -> Generator[int, float, str]:
- sent = yield 0
- while sent >= 0:
- sent = yield round(sent)
- return 'Done'
-
-Note that unlike many other generics in the typing module, the ``SendType`` of
-``Generator`` behaves contravariantly, not covariantly or invariantly.
-
-If you do not plan on recieving or returning values, then set the ``SendType``
-or ``ReturnType`` to ``None``, as appropriate. For example, we could have
-annotated the first example as the following:
-
-.. code-block:: python
-
- def squares(n: int) -> Generator[int, None, None]:
- for i in range(n):
- yield i * i
-
-.. _async-and-await:
-
-Typing async/await
-******************
-
-.. note::
-
- Currently, you must pass in the ``--fast-parser`` flag if you want to run
- mypy against code containing the ``async/await`` keywords. The fast parser
- will be enabled by default in a future version of mypy.
-
- Note that mypy will understand coroutines created using the ``@asyncio.coroutine``
- decorator both with and without the fast parser enabled.
-
-Mypy supports the ability to type coroutines that use the ``async/await``
-syntax introduced in Python 3.5. For more information regarding coroutines and
-this new syntax, see `PEP 492 <https://www.python.org/dev/peps/pep-0492/>`_.
-
-Functions defined using ``async def`` are typed just like normal functions.
-The return type annotation should be the same as the type of the value you
-expect to get back when ``await``-ing the coroutine.
-
-.. code-block:: python
-
- import asyncio
-
- async def format_string(tag: str, count: int) -> str:
- return 'T-minus {} ({})'.format(count, tag)
-
- async def countdown_1(tag: str, count: int) -> str:
- while count > 0:
- my_str = await format_string(tag, count) # has type 'str'
- print(my_str)
- await asyncio.sleep(0.1)
- count -= 1
- return "Blastoff!"
-
- loop = asyncio.get_event_loop()
- loop.run_until_complete(countdown_1("Millennium Falcon", 5))
- loop.close()
-
-The result of calling an ``async def`` function *without awaiting* will be a
-value of type ``Awaitable[T]``:
-
-.. code-block:: python
-
- my_coroutine = countdown_1("Millennium Falcon", 5)
- reveal_type(my_coroutine) # has type 'Awaitable[str]'
-
-If you want to use coroutines in older versions of Python that do not support
-the ``async def`` syntax, you can instead use the ``@asyncio.coroutine``
-decorator to convert a generator into a coroutine.
-
-Note that we set the ``YieldType`` of the generator to be ``Any`` in the
-following example. This is because the exact yield type is an implementation
-detail of the coroutine runner (e.g. the ``asyncio`` event loop) and your
-coroutine shouldn't have to know or care about what precisely that type is.
-
-.. code-block:: python
-
- from typing import Any, Generator
- import asyncio
-
- @asyncio.coroutine
- def countdown_2(tag: str, count: int) -> Generator[Any, None, str]:
- while count > 0:
- print('T-minus {} ({})'.format(count, tag))
- yield from asyncio.sleep(0.1)
- count -= 1
- return "Blastoff!"
-
- loop = asyncio.get_event_loop()
- loop.run_until_complete(countdown_2("USS Enterprise", 5))
- loop.close()
-
-As before, the result of calling a generator decorated with ``@asyncio.coroutine``
-will be a value of type ``Awaitable[T]``.
-
-.. note::
-
- At runtime, you are allowed to add the ``@asyncio.coroutine`` decorator to
- both functions and generators. This is useful when you want to mark a
- work-in-progress function as a coroutine, but have not yet added ``yield`` or
- ``yield from`` statements:
-
- .. code-block:: python
-
- import asyncio
-
- @asyncio.coroutine
- def serialize(obj: object) -> str:
- # todo: add yield/yield from to turn this into a generator
- return "placeholder"
-
- However, mypy currently does not support converting functions into
- coroutines. Support for this feature will be added in a future version, but
- for now, you can manually force the function to be a generator by doing
- something like this:
-
- .. code-block:: python
-
- from typing import Generator
- import asyncio
-
- @asyncio.coroutine
- def serialize(obj: object) -> Generator[None, None, str]:
- # todo: add yield/yield from to turn this into a generator
- if False:
- yield
- return "placeholder"
-
-You may also choose to create a subclass of ``Awaitable`` instead:
-
-.. code-block:: python
-
- from typing import Any, Awaitable, Generator
- import asyncio
-
- class MyAwaitable(Awaitable[str]):
- def __init__(self, tag: str, count: int) -> None:
- self.tag = tag
- self.count = count
-
- def __await__(self) -> Generator[Any, None, str]:
- for i in range(n, 0, -1):
- print('T-minus {} ({})'.format(i, tag))
- yield from asyncio.sleep(0.1)
- return "Blastoff!"
-
- def countdown_3(tag: str, count: int) -> Awaitable[str]:
- return MyAwaitable(tag, count)
-
- loop = asyncio.get_event_loop()
- loop.run_until_complete(countdown_3("Heart of Gold", 5))
- loop.close()
-
-To create an iterable coroutine, subclass ``AsyncIterator``:
-
-.. code-block:: python
-
- from typing import Optional, AsyncIterator
- import asyncio
-
- class arange(AsyncIterator[int]):
- def __init__(self, start: int, stop: int, step: int) -> None:
- self.start = start
- self.stop = stop
- self.step = step
- self.count = start - step
-
- def __aiter__(self) -> AsyncIterator[int]:
- return self
-
- async def __anext__(self) -> int:
- self.count += self.step
- if self.count == self.stop:
- raise StopAsyncIteration
- else:
- return self.count
-
- async def countdown_4(tag: str, n: int) -> str:
- async for i in arange(n, 0, -1):
- print('T-minus {} ({})'.format(i, tag))
- await asyncio.sleep(0.1)
- return "Blastoff!"
-
- loop = asyncio.get_event_loop()
- loop.run_until_complete(countdown_4("Serenity", 5))
- loop.close()
-
-For a more concrete example, the mypy repo has a toy webcrawler that
-demonstrates how to work with coroutines. One version
-`uses async/await <https://github.com/python/mypy/blob/master/test-data/samples/crawl2.py>`_
-and one
-`uses yield from <https://github.com/python/mypy/blob/master/test-data/samples/crawl.py>`_.
diff --git a/docs/source/python2.rst b/docs/source/python2.rst
deleted file mode 100644
index 2cb8f32..0000000
--- a/docs/source/python2.rst
+++ /dev/null
@@ -1,136 +0,0 @@
-.. _python2:
-
-Type checking Python 2 code
-===========================
-
-For code that needs to be Python 2.7 compatible, function type
-annotations are given in comments, since the function annotation
-syntax was introduced in Python 3. The comment-based syntax is
-specified in `PEP 484 <https://www.python.org/dev/peps/pep-0484>`_.
-
-Run mypy in Python 2 mode by using the ``--py2`` option::
-
- $ mypy --py2 program.py
-
-To run your program, you must have the ``typing`` module in your
-Python 2 module search path. Use ``pip install typing`` to install the
-module. This also works for Python 3 versions prior to 3.5 that don't
-include ``typing`` in the standard library.
-
-The example below illustrates the Python 2 function type annotation
-syntax. This syntax is also valid in Python 3 mode:
-
-.. code-block:: python
-
- from typing import List
-
- def hello(): # type: () -> None
- print 'hello'
-
- class Example:
- def method(self, lst, opt=0, *args, **kwargs):
- # type: (List[str], int, *str, **bool) -> int
- """Docstring comes after type comment."""
- ...
-
-It's worth going through these details carefully to avoid surprises:
-
-- You don't provide an annotation for the ``self`` / ``cls`` variable of
- methods.
-
-- Docstring always comes *after* the type comment.
-
-- For ``*args`` and ``**kwargs`` the type should be prefixed with
- ``*`` or ``**``, respectively (except when using the multi-line
- annotation syntax described below). Again, the above example
- illustrates this.
-
-- Things like ``Any`` must be imported from ``typing``, even if they
- are only used in comments.
-
-- In Python 2 mode ``str`` is implicitly promoted to ``unicode``, similar
- to how ``int`` is compatible with ``float``. This is unlike ``bytes`` and
- ``str`` in Python 3, which are incompatible. ``bytes`` in Python 2 is
- equivalent to ``str``. (This might change in the future.)
-
-.. _multi_line_annotation:
-
-Multi-line Python 2 function annotations
-----------------------------------------
-
-Mypy also supports a multi-line comment annotation syntax. You
-can provide a separate annotation for each argument using the variable
-annotation syntax. When using the single-line annotation syntax
-described above, functions with long argument lists tend to result in
-overly long type comments and it's often tricky to see which argument
-type corresponds to which argument. The alternative, multi-line
-annotation syntax makes long annotations easier to read and write.
-
-.. note::
-
- Multi-line comment annotations currently only work when using the
- ``--fast-parser`` command line option. This is not enabled by
- default because the option isn’t supported on Windows yet.
-
-Here is an example (from PEP 484):
-
-.. code-block:: python
-
- def send_email(address, # type: Union[str, List[str]]
- sender, # type: str
- cc, # type: Optional[List[str]]
- bcc, # type: Optional[List[str]]
- subject='',
- body=None # type: List[str]
- ):
- # type: (...) -> bool
- """Send an email message. Return True if successful."""
- <code>
-
-You write a separate annotation for each function argument on the same
-line as the argument. Each annotation must be on a separate line. If
-you leave out an annotation for an argument, it defaults to
-``Any``. You provide a return type annotation in the body of the
-function using the form ``# type: (...) -> rt``, where ``rt`` is the
-return type. Note that the return type annotation contains literal
-three dots.
-
-Note that when using multi-line comments, you do not need to prefix the
-types of your ``*arg`` and ``**kwarg`` parameters with ``*`` or ``**``.
-For example, here is how you would annotate the first example using
-multi-line comments.
-
-.. code-block:: python
-
- from typing import List
-
- class Example:
- def method(self,
- lst, # type: List[str]
- opt=0, # type: int
- *args, # type: str
- **kwargs # type: bool
- ):
- # type: (...) -> int
- """Docstring comes after type comment."""
- ...
-
-
-Additional notes
-----------------
-
-- You should include types for arguments with default values in the
- annotation. The ``opt`` argument of ``method`` in the example at the
- beginning of this section is an example of this.
-
-- The annotation can be on the same line as the function header or on
- the following line.
-
-- The type syntax for variables is the same as for Python 3.
-
-- You don't need to use string literal escapes for forward references
- within comments.
-
-- Mypy uses a separate set of library stub files in `typeshed
- <https://github.com/python/typeshed>`_ for Python 2. Library support
- may vary between Python 2 and Python 3.
diff --git a/docs/source/python36.rst b/docs/source/python36.rst
deleted file mode 100644
index f676864..0000000
--- a/docs/source/python36.rst
+++ /dev/null
@@ -1,100 +0,0 @@
-.. _python-36:
-
-New features in Python 3.6
-==========================
-
-Python 3.6 will be `released
-<https://www.python.org/dev/peps/pep-0494>`_ in December 2016. The
-`first beta <https://www.python.org/downloads/release/python-360b1/>`_
-came out in September and adds some exciting features. Here's the
-support matrix for these in mypy (to be updated with each new mypy
-release). The intention is to support all of these by the time Python
-3.6 is released.
-
-.. note::
-
- Mypy only understands Python 3.6 syntax if you use the ``--fast-parser`` flag.
- This requires that the `typed_ast <https://pypi.python.org/pypi/typed-ast>`_ package is
- installed and has at least version 0.6.1. Use ``pip3 install -U typed_ast``.
- If running mypy on an earlier Python version, you also need to enable 3.6 support
- through ``--python-version 3.6``.
-
- Example command line (or use :ref:`config-file`):
-
- .. code-block:: text
-
- $ pip3 install -U typed_ast
- $ mypy --fast-parser --python-version 3.6 program.py
-
-Syntax for variable annotations (`PEP 526 <https://www.python.org/dev/peps/pep-0526>`_)
----------------------------------------------------------------------------------------
-
-Python 3.6 feature: variables (in global, class or local scope) can
-now have type annotations using either of the two forms:
-
-.. code-block:: python
-
- foo: Optional[int]
- bar: List[str] = []
-
-Mypy fully supports this syntax, interpreting them as equivalent to
-
-.. code-block:: python
-
- foo = None # type: Optional[int]
- bar = [] # type: List[str]
-
-.. note::
-
- See above for how to enable Python 3.6 syntax.
-
-Literal string formatting (`PEP 498 <https://www.python.org/dev/peps/pep-0498>`_)
----------------------------------------------------------------------------------
-
-Python 3.6 feature: string literals of the form
-``f"text {expression} text"`` evaluate ``expression`` using the
-current evaluation context (locals and globals).
-
-Mypy does not yet support this.
-
-Underscores in numeric literals (`PEP 515 <https://www.python.org/dev/peps/pep-0515>`_)
----------------------------------------------------------------------------------------
-
-Python 3.6 feature: numeric literals can contain underscores,
-e.g. ``1_000_000``.
-
-Mypy fully supports this syntax:
-
-.. code-block:: python
-
- precise_val = 1_000_000.000_000_1
- hexes: List[int] = []
- hexes.append(0x_FF_FF_FF_FF)
-
-.. note::
-
- This requires the ``--fast-parser`` flag and it requires that the
- `typed_ast <https://pypi.python.org/pypi/typed-ast>`_ package is
- installed and has at least version 0.6.2. Use ``pip3 install -U typed_ast``.
-
-Asynchronous generators (`PEP 525 <https://www.python.org/dev/peps/pep-0525>`_)
--------------------------------------------------------------------------------
-
-Python 3.6 feature: coroutines defined with ``async def`` (PEP 492)
-can now also be generators, i.e. contain ``yield`` expressions.
-
-Mypy does not yet support this.
-
-Asynchronous comprehensions (`PEP 530 <https://www.python.org/dev/peps/pep-0530>`_)
------------------------------------------------------------------------------------
-
-Python 3.6 feature: coroutines defined with ``async def`` (PEP 492)
-can now also contain list, set and dict comprehensions that use
-``async for`` syntax.
-
-Mypy does not yet support this.
-
-New named tuple syntax
-----------------------
-
-Python 3.6 supports an alternative syntax for named tuples. See :ref:`named-tuples`.
diff --git a/docs/source/revision_history.rst b/docs/source/revision_history.rst
deleted file mode 100644
index 2537c51..0000000
--- a/docs/source/revision_history.rst
+++ /dev/null
@@ -1,176 +0,0 @@
-Revision history
-================
-
-List of major changes to this document:
-
-- January 2017
- * Publish ``mypy`` version 0.470 on PyPI.
-
- * Change package name from ``mypy-lang`` to ``mypy``.
-
- * Add :ref:`integrating-mypy`.
-
- * Add :ref:`cheat-sheet-py3`.
-
- * Major update to :ref:`finding-imports`.
-
- * Add :ref:`--ignore-missing-imports <ignore-missing-imports>`.
-
- * Updates to :ref:`config-file`.
-
- * Document underscore support in numeric literals.
-
- * Document that arguments prefixed with ``__`` are positional-only.
-
- * Document that ``--hide-error-context`` is now on by default,
- and there is a new flag ``--show-error-context``.
-
- * Add ``ignore_errors`` to :ref:`per-module-flags`.
-
-- November 2016
- * Publish ``mypy-lang`` version 0.4.6 on PyPI.
-
- * Add :ref:`getting-started`.
-
- * Add :ref:`generic-methods-and-generic-self` (experimental).
-
- * Add :ref:`declaring-decorators`.
-
- * Discuss generic type aliases in :ref:`type-aliases`.
-
- * Discuss Python 3.6 named tuple syntax in :ref:`named-tuples`.
-
- * Updates to :ref:`common_issues`.
-
- * Updates to :ref:`python-36`.
-
- * Updates to :ref:`command-line`:
-
- * ``--custom-typeshed-dir``
-
- * ``--junit-xml``
-
- * ``--find-occurrences``
-
- * ``--cobertura-xml-report``
-
- * ``--warn-no-return``
-
- * Updates to :ref:`config-file`:
-
- * Sections with fnmatch patterns now use
- module name patterns (previously they were path patterns).
- * Added ``custom_typeshed_dir``, ``mypy_path`` and ``show_column_numbers``.
-
- * Mention the magic ``MYPY`` constant in :ref:`import-cycles`.
-
-- October 2016
- * Publish ``mypy-lang`` version 0.4.5 on PyPI.
-
- * Add :ref:`python-36`.
-
- * Add :ref:`config-file`.
-
- * Updates to :ref:`command-line`: ``--strict-optional-white-list``,
- ``--disallow-subclassing-any``, ``--config-file``, ``@flagfile``,
- ``--hide-error-context`` (replaces ``--suppress-error-context``),
- ``--show-column-numbers`` and ``--scripts-are-modules``.
-
- * Mention ``typing.TYPE_CHECKING`` in :ref:`import-cycles`.
-
-- August 2016
- * Publish ``mypy-lang`` version 0.4.4 on PyPI.
-
- * Add :ref:`newtypes`.
-
- * Add :ref:`async-and-await`.
-
- * Add :ref:`text-and-anystr`.
-
- * Add :ref:`version_and_platform_checks`.
-
-- July 2016
- * Publish ``mypy-lang`` version 0.4.3 on PyPI.
-
- * Add :ref:`strict_optional`.
-
- * Add :ref:`multi_line_annotation`.
-
-- June 2016
- * Publish ``mypy-lang`` version 0.4.2 on PyPI.
-
- * Add :ref:`type-of-class`.
-
- * Add :ref:`cheat-sheet-py2`.
-
- * Add :ref:`reveal-type`.
-
-- May 2016
- * Publish ``mypy-lang`` version 0.4 on PyPI.
-
- * Add :ref:`type-variable-upper-bound`.
-
- * Document :ref:`command-line`.
-
-- Feb 2016
- * Publish ``mypy-lang`` version 0.3.1 on PyPI.
-
- * Document Python 2 support.
-
-- Nov 2015
- Add :ref:`library-stubs`.
-
-- Jun 2015
- Remove ``Undefined`` and ``Dynamic``, as they are not in PEP 484.
-
-- Apr 2015
- Publish ``mypy-lang`` version 0.2.0 on PyPI.
-
-- Mar 2015
- Update documentation to reflect PEP 484:
-
- * Add :ref:`named-tuples` and :ref:`optional`.
-
- * Do not mention type application syntax (for
- example, ``List[int]()``), as it's no longer supported,
- due to PEP 484 compatibility.
-
- * Rename ``typevar`` to ``TypeVar``.
-
- * Document ``# type: ignore`` which allows
- locally ignoring spurious errors (:ref:`silencing_checker`).
-
- * No longer mention
- ``Any(x)`` as a valid cast, as it will be phased out soon.
-
- * Mention the new ``.pyi`` stub file extension. Stubs can live
- in the same directory as the rest of the program.
-
-- Jan 2015
- Mypy moves closer to PEP 484:
-
- * Add :ref:`type-aliases`.
-
- * Update discussion of overloading -- it's now only supported in stubs.
-
- * Rename ``Function[...]`` to ``Callable[...]``.
-
-- Dec 2014
- Publish mypy version 0.1.0 on PyPI.
-
-- Oct 2014
- Major restructuring.
- Split the HTML documentation into
- multiple pages.
-
-- Sep 2014
- Migrated docs to Sphinx.
-
-- Aug 2014
- Don't discuss native semantics. There is only Python
- semantics.
-
-- Jul 2013
- Rewrite to use new syntax. Shift focus to discussing
- Python semantics. Add more content, including short discussions of
- :ref:`generic-functions` and :ref:`union-types`.
diff --git a/docs/source/supported_python_features.rst b/docs/source/supported_python_features.rst
deleted file mode 100644
index ca68d4c..0000000
--- a/docs/source/supported_python_features.rst
+++ /dev/null
@@ -1,20 +0,0 @@
-Supported Python features and modules
-=====================================
-
-A list of unsupported Python features is maintained in the mypy wiki:
-
-- `Unsupported Python features <https://github.com/python/mypy/wiki/Unsupported-Python-Features>`_
-
-Runtime definition of methods and functions
-*******************************************
-
-By default, mypy will complain if you add a function to a class
-or module outside its definition -- but only if this is visible to the
-type checker. This only affects static checking, as mypy performs no
-additional type checking at runtime. You can easily work around
-this. For example, you can use dynamically typed code or values with
-``Any`` types, or you can use ``setattr`` or other introspection
-features. However, you need to be careful if you decide to do this. If
-used indiscriminately, you may have difficulty using static typing
-effectively, since the type checker cannot see functions defined at
-runtime.
diff --git a/docs/source/type_inference_and_annotations.rst b/docs/source/type_inference_and_annotations.rst
deleted file mode 100644
index 76e9cf9..0000000
--- a/docs/source/type_inference_and_annotations.rst
+++ /dev/null
@@ -1,172 +0,0 @@
-Type inference and type annotations
-===================================
-
-Type inference
-**************
-
-The initial assignment defines a variable. If you do not explicitly
-specify the type of the variable, mypy infers the type based on the
-static type of the value expression:
-
-.. code-block:: python
-
- i = 1 # Infer type int for i
- l = [1, 2] # Infer type List[int] for l
-
-Type inference is bidirectional and takes context into account. For
-example, the following is valid:
-
-.. code-block:: python
-
- def f(l: List[object]) -> None:
- l = [1, 2] # Infer type List[object] for [1, 2]
-
-In an assignment, the type context is determined by the assignment
-target. In this case this is ``l``, which has the type
-``List[object]``. The value expression ``[1, 2]`` is type checked in
-this context and given the type ``List[object]``. In the previous
-example we introduced a new variable ``l``, and here the type context
-was empty.
-
-Note that the following is not valid, since ``List[int]`` is not
-compatible with ``List[object]``:
-
-.. code-block:: python
-
- def f(l: List[object], k: List[int]) -> None:
- l = k # Type check error: incompatible types in assignment
-
-The reason why the above assignment is disallowed is that allowing the
-assignment could result in non-int values stored in a list of ``int``:
-
-.. code-block:: python
-
- def f(l: List[object], k: List[int]) -> None:
- l = k
- l.append('x')
- print(k[-1]) # Ouch; a string in List[int]
-
-You can still run the above program; it prints ``x``. This illustrates
-the fact that static types are used during type checking, but they do
-not affect the runtime behavior of programs. You can run programs with
-type check failures, which is often very handy when performing a large
-refactoring. Thus you can always 'work around' the type system, and it
-doesn't really limit what you can do in your program.
-
-Type inference is not used in dynamically typed functions (those
-without an explicit return type) — every local variable type defaults
-to ``Any``, which is discussed later.
-
-Explicit types for variables
-****************************
-
-You can override the inferred type of a variable by using a
-special type comment after an assignment statement:
-
-.. code-block:: python
-
- x = 1 # type: Union[int, str]
-
-Without the type comment, the type of ``x`` would be just ``int``. We
-use an annotation to give it a more general type ``Union[int, str]``.
-Mypy checks that the type of the initializer is compatible with the
-declared type. The following example is not valid, since the initializer is
-a floating point number, and this is incompatible with the declared
-type:
-
-.. code-block:: python
-
- x = 1.1 # type: Union[int, str] # Error!
-
-.. note::
-
- The best way to think about this is that the type comment sets the
- type of the variable, not the type of the expression. To force the
- type of an expression you can use ``cast(<type>, <expression>)``.
-
-Explicit types for collections
-******************************
-
-The type checker cannot always infer the type of a list or a
-dictionary. This often arises when creating an empty list or
-dictionary and assigning it to a new variable that doesn't have an explicit
-variable type. In these cases you can give the type explicitly using
-a type annotation comment:
-
-.. code-block:: python
-
- l = [] # type: List[int] # Create empty list with type List[int]
- d = {} # type: Dict[str, int] # Create empty dictionary (str -> int)
-
-Similarly, you can also give an explicit type when creating an empty set:
-
-.. code-block:: python
-
- s = set() # type: Set[int]
-
-Declaring multiple variable types at a time
-*******************************************
-
-You can declare more than a single variable at a time. In order to
-nicely work with multiple assignment, you must give each variable a
-type separately:
-
-.. code-block:: python
-
- i, found = 0, False # type: int, bool
-
-You can optionally use parentheses around the types, assignment targets
-and assigned expression:
-
-.. code-block:: python
-
- i, found = 0, False # type: (int, bool) # OK
- (i, found) = 0, False # type: int, bool # OK
- i, found = (0, False) # type: int, bool # OK
- (i, found) = (0, False) # type: (int, bool) # OK
-
-Starred expressions
-*******************
-
-In most cases, mypy can infer the type of starred expressions from the
-right-hand side of an assignment, but not always:
-
-.. code-block:: python
-
- a, *bs = 1, 2, 3 # OK
- p, q, *rs = 1, 2 # Error: Type of rs cannot be inferred
-
-On first line, the type of ``bs`` is inferred to be
-``List[int]``. However, on the second line, mypy cannot infer the type
-of ``rs``, because there is no right-hand side value for ``rs`` to
-infer the type from. In cases like these, the starred expression needs
-to be annotated with a starred type:
-
-.. code-block:: python
-
- p, q, *rs = 1, 2 # type: int, int, *List[int]
-
-Here, the type of ``rs`` is set to ``List[int]``.
-
-Types in stub files
-*******************
-
-:ref:`Stub files <library-stubs>` are written in normal Python 3
-syntax, but generally leaving out runtime logic like variable
-initializers, function bodies, and default arguments, replacing them
-with ellipses.
-
-In this example, each ellipsis ``...`` is literally written in the
-stub file as three dots:
-
-.. code-block:: python
-
- x = ... # type: int
- def afunc(code: str) -> int: ...
- def afunc(a: int, b: int=...) -> int: ...
-
-.. note::
-
- The ellipsis ``...`` is also used with a different meaning in
- :ref:`callable types <callable-types>` and :ref:`tuple types
- <tuple-types>`.
diff --git a/extensions/README.md b/extensions/README.md
deleted file mode 100644
index 73b786b..0000000
--- a/extensions/README.md
+++ /dev/null
@@ -1,6 +0,0 @@
-Mypy Extensions
-===============
-
-The "mypy_extensions" module defines experimental extensions to the
-standard "typing" module that are supported by the mypy typechecker.
-
diff --git a/extensions/mypy_extensions.py b/extensions/mypy_extensions.py
deleted file mode 100644
index 26e568c..0000000
--- a/extensions/mypy_extensions.py
+++ /dev/null
@@ -1,97 +0,0 @@
-"""Defines experimental extensions to the standard "typing" module that are
-supported by the mypy typechecker.
-
-Example usage:
- from mypy_extensions import TypedDict
-"""
-
-# NOTE: This module must support Python 2.7 in addition to Python 3.x
-
-import sys
-# _type_check is NOT a part of public typing API, it is used here only to mimic
-# the (convenient) behavior of types provided by typing module.
-from typing import _type_check # type: ignore
-
-
-def _check_fails(cls, other):
- try:
- if sys._getframe(1).f_globals['__name__'] not in ['abc', 'functools', 'typing']:
- # Typed dicts are only for static structural subtyping.
- raise TypeError('TypedDict does not support instance and class checks')
- except (AttributeError, ValueError):
- pass
- return False
-
-
-def _dict_new(cls, *args, **kwargs):
- return dict(*args, **kwargs)
-
-
-def _typeddict_new(cls, _typename, _fields=None, **kwargs):
- if _fields is None:
- _fields = kwargs
- elif kwargs:
- raise TypeError("TypedDict takes either a dict or keyword arguments,"
- " but not both")
- return _TypedDictMeta(_typename, (), {'__annotations__': dict(_fields)})
-
-
-class _TypedDictMeta(type):
- def __new__(cls, name, bases, ns):
- # Create new typed dict class object.
- # This method is called directly when TypedDict is subclassed,
- # or via _typeddict_new when TypedDict is instantiated. This way
- # TypedDict supports all three syntaxes described in its docstring.
- # Subclasses and instanes of TypedDict return actual dictionaries
- # via _dict_new.
- ns['__new__'] = _typeddict_new if name == 'TypedDict' else _dict_new
- tp_dict = super(_TypedDictMeta, cls).__new__(cls, name, (dict,), ns)
- try:
- # Setting correct module is necessary to make typed dict classes pickleable.
- tp_dict.__module__ = sys._getframe(2).f_globals.get('__name__', '__main__')
- except (AttributeError, ValueError):
- pass
- anns = ns.get('__annotations__', {})
- msg = "TypedDict('Name', {f0: t0, f1: t1, ...}); each t must be a type"
- anns = {n: _type_check(tp, msg) for n, tp in anns.items()}
- for base in bases:
- anns.update(base.__dict__.get('__annotations__', {}))
- tp_dict.__annotations__ = anns
- return tp_dict
-
- __instancecheck__ = __subclasscheck__ = _check_fails
-
-
-TypedDict = _TypedDictMeta('TypedDict', (dict,), {})
-TypedDict.__module__ = __name__
-TypedDict.__doc__ = \
- """A simple typed name space. At runtime it is equivalent to a plain dict.
-
- TypedDict creates a dictionary type that expects all of its
- instances to have a certain set of keys, with each key
- associated with a value of a consistent type. This expectation
- is not checked at runtime but is only enforced by typecheckers.
- Usage::
-
- Point2D = TypedDict('Point2D', {'x': int, 'y': int, 'label': str})
- a: Point2D = {'x': 1, 'y': 2, 'label': 'good'} # OK
- b: Point2D = {'z': 3, 'label': 'bad'} # Fails type check
- assert Point2D(x=1, y=2, label='first') == dict(x=1, y=2, label='first')
-
- The type info could be accessed via Point2D.__annotations__. TypedDict
- supports two additional equivalent forms::
-
- Point2D = TypedDict('Point2D', x=int, y=int, label=str)
-
- class Point2D(TypedDict):
- x: int
- y: int
- label: str
-
- The latter syntax is only supported in Python 3.6+, while two other
- syntax forms work for Python 2.7 and 3.2+
- """
-
-
-# Return type that indicates a function does not return
-class NoReturn: pass
diff --git a/extensions/setup.py b/extensions/setup.py
deleted file mode 100644
index 3490840..0000000
--- a/extensions/setup.py
+++ /dev/null
@@ -1,44 +0,0 @@
-#!/usr/bin/env python
-
-# NOTE: This package must support Python 2.7 in addition to Python 3.x
-
-from distutils.core import setup
-
-version = '0.2.0-dev'
-description = 'Experimental type system extensions for programs checked with the mypy typechecker.'
-long_description = '''
-Mypy Extensions
-===============
-
-The "mypy_extensions" module defines experimental extensions to the
-standard "typing" module that are supported by the mypy typechecker.
-'''.lstrip()
-
-classifiers = [
- 'Development Status :: 2 - Pre-Alpha',
- 'Environment :: Console',
- 'Intended Audience :: Developers',
- 'License :: OSI Approved :: MIT License',
- 'Operating System :: POSIX',
- 'Programming Language :: Python :: 2',
- 'Programming Language :: Python :: 2.7',
- 'Programming Language :: Python :: 3',
- 'Programming Language :: Python :: 3.3',
- 'Programming Language :: Python :: 3.4',
- 'Programming Language :: Python :: 3.5',
- 'Topic :: Software Development',
-]
-
-setup(
- name='mypy_extensions',
- version=version,
- description=description,
- long_description=long_description,
- author='David Foster',
- author_email='david at dafoster.net',
- url='http://www.mypy-lang.org/',
- license='MIT License',
- platforms=['POSIX'],
- py_modules=['mypy_extensions'],
- classifiers=classifiers,
-)
diff --git a/lib-typing/2.7/setup.py b/lib-typing/2.7/setup.py
deleted file mode 100644
index 18c34d8..0000000
--- a/lib-typing/2.7/setup.py
+++ /dev/null
@@ -1,46 +0,0 @@
-#!/usr/bin/env python
-
-"""setup.py for Python 2.x typing module"""
-
-import glob
-import os
-import os.path
-import sys
-
-from distutils.core import setup
-
-if sys.version_info >= (3, 0, 0):
- sys.stderr.write("ERROR: You need Python 2.x to install this module.\n")
- exit(1)
-
-version = '0.0.1.dev1'
-description = 'typing (Python 2.x)'
-long_description = '''
-typing (Python 2.x)
-===================
-
-This module is part of mypy, a static type checker for Python.
-'''.lstrip()
-
-classifiers = [
- 'Development Status :: 2 - Pre-Alpha',
- 'Environment :: Console',
- 'Intended Audience :: Developers',
- 'License :: OSI Approved :: MIT License',
- 'Operating System :: POSIX',
- 'Programming Language :: Python :: 2.7',
- 'Topic :: Software Development',
-]
-
-setup(name='typing',
- version=version,
- description=description,
- long_description=long_description,
- author='Jukka Lehtosalo',
- author_email='jukka.lehtosalo at iki.fi',
- url='http://www.mypy-lang.org/',
- license='MIT License',
- platforms=['POSIX'],
- py_modules=['typing'],
- classifiers=classifiers,
- )
diff --git a/lib-typing/2.7/test_typing.py b/lib-typing/2.7/test_typing.py
deleted file mode 100644
index 39eb7c1..0000000
--- a/lib-typing/2.7/test_typing.py
+++ /dev/null
@@ -1,1629 +0,0 @@
-from __future__ import absolute_import, unicode_literals
-
-import collections
-import pickle
-import re
-import sys
-from unittest import TestCase, main, SkipTest
-from copy import copy, deepcopy
-
-from typing import Any
-from typing import TypeVar, AnyStr
-from typing import T, KT, VT # Not in __all__.
-from typing import Union, Optional
-from typing import Tuple, List, MutableMapping
-from typing import Callable
-from typing import Generic, ClassVar
-from typing import cast
-from typing import Type
-from typing import NewType
-from typing import NamedTuple
-from typing import IO, TextIO, BinaryIO
-from typing import Pattern, Match
-import abc
-import typing
-try:
- import collections.abc as collections_abc
-except ImportError:
- import collections as collections_abc # Fallback for PY3.2.
-
-
-class BaseTestCase(TestCase):
-
- def assertIsSubclass(self, cls, class_or_tuple, msg=None):
- if not issubclass(cls, class_or_tuple):
- message = '%r is not a subclass of %r' % (cls, class_or_tuple)
- if msg is not None:
- message += ' : %s' % msg
- raise self.failureException(message)
-
- def assertNotIsSubclass(self, cls, class_or_tuple, msg=None):
- if issubclass(cls, class_or_tuple):
- message = '%r is a subclass of %r' % (cls, class_or_tuple)
- if msg is not None:
- message += ' : %s' % msg
- raise self.failureException(message)
-
- def clear_caches(self):
- for f in typing._cleanups:
- f()
-
-
-class Employee(object):
- pass
-
-
-class Manager(Employee):
- pass
-
-
-class Founder(Employee):
- pass
-
-
-class ManagingFounder(Manager, Founder):
- pass
-
-
-class AnyTests(BaseTestCase):
-
- def test_any_instance_type_error(self):
- with self.assertRaises(TypeError):
- isinstance(42, Any)
-
- def test_any_subclass_type_error(self):
- with self.assertRaises(TypeError):
- issubclass(Employee, Any)
- with self.assertRaises(TypeError):
- issubclass(Any, Employee)
-
- def test_repr(self):
- self.assertEqual(repr(Any), 'typing.Any')
-
- def test_errors(self):
- with self.assertRaises(TypeError):
- issubclass(42, Any)
- with self.assertRaises(TypeError):
- Any[int] # Any is not a generic type.
-
- def test_cannot_subclass(self):
- with self.assertRaises(TypeError):
- class A(Any):
- pass
- with self.assertRaises(TypeError):
- class A(type(Any)):
- pass
-
- def test_cannot_instantiate(self):
- with self.assertRaises(TypeError):
- Any()
- with self.assertRaises(TypeError):
- type(Any)()
-
- def test_cannot_subscript(self):
- with self.assertRaises(TypeError):
- Any[int]
-
- def test_any_is_subclass(self):
- # These expressions must simply not fail.
- typing.Match[Any]
- typing.Pattern[Any]
- typing.IO[Any]
-
-
-class TypeVarTests(BaseTestCase):
-
- def test_basic_plain(self):
- T = TypeVar('T')
- # T equals itself.
- self.assertEqual(T, T)
- # T is an instance of TypeVar
- self.assertIsInstance(T, TypeVar)
-
- def test_typevar_instance_type_error(self):
- T = TypeVar('T')
- with self.assertRaises(TypeError):
- isinstance(42, T)
-
- def test_typevar_subclass_type_error(self):
- T = TypeVar('T')
- with self.assertRaises(TypeError):
- issubclass(int, T)
- with self.assertRaises(TypeError):
- issubclass(T, int)
-
- def test_constrained_error(self):
- with self.assertRaises(TypeError):
- X = TypeVar('X', int)
- X
-
- def test_union_unique(self):
- X = TypeVar('X')
- Y = TypeVar('Y')
- self.assertNotEqual(X, Y)
- self.assertEqual(Union[X], X)
- self.assertNotEqual(Union[X], Union[X, Y])
- self.assertEqual(Union[X, X], X)
- self.assertNotEqual(Union[X, int], Union[X])
- self.assertNotEqual(Union[X, int], Union[int])
- self.assertEqual(Union[X, int].__args__, (X, int))
- self.assertEqual(Union[X, int].__parameters__, (X,))
- self.assertIs(Union[X, int].__origin__, Union)
-
- def test_union_constrained(self):
- A = TypeVar('A', str, bytes)
- self.assertNotEqual(Union[A, str], Union[A])
-
- def test_repr(self):
- self.assertEqual(repr(T), '~T')
- self.assertEqual(repr(KT), '~KT')
- self.assertEqual(repr(VT), '~VT')
- self.assertEqual(repr(AnyStr), '~AnyStr')
- T_co = TypeVar('T_co', covariant=True)
- self.assertEqual(repr(T_co), '+T_co')
- T_contra = TypeVar('T_contra', contravariant=True)
- self.assertEqual(repr(T_contra), '-T_contra')
-
- def test_no_redefinition(self):
- self.assertNotEqual(TypeVar('T'), TypeVar('T'))
- self.assertNotEqual(TypeVar('T', int, str), TypeVar('T', int, str))
-
- def test_cannot_subclass_vars(self):
- with self.assertRaises(TypeError):
- class V(TypeVar('T')):
- pass
-
- def test_cannot_subclass_var_itself(self):
- with self.assertRaises(TypeError):
- class V(TypeVar):
- pass
-
- def test_cannot_instantiate_vars(self):
- with self.assertRaises(TypeError):
- TypeVar('A')()
-
- def test_bound_errors(self):
- with self.assertRaises(TypeError):
- TypeVar('X', bound=42)
- with self.assertRaises(TypeError):
- TypeVar('X', str, float, bound=Employee)
-
-
-class UnionTests(BaseTestCase):
-
- def test_basics(self):
- u = Union[int, float]
- self.assertNotEqual(u, Union)
-
- def test_subclass_error(self):
- with self.assertRaises(TypeError):
- issubclass(int, Union)
- with self.assertRaises(TypeError):
- issubclass(Union, int)
- with self.assertRaises(TypeError):
- issubclass(int, Union[int, str])
- with self.assertRaises(TypeError):
- issubclass(Union[int, str], int)
-
- def test_union_any(self):
- u = Union[Any]
- self.assertEqual(u, Any)
- u1 = Union[int, Any]
- u2 = Union[Any, int]
- u3 = Union[Any, object]
- self.assertEqual(u1, u2)
- self.assertNotEqual(u1, Any)
- self.assertNotEqual(u2, Any)
- self.assertNotEqual(u3, Any)
-
- def test_union_object(self):
- u = Union[object]
- self.assertEqual(u, object)
- u = Union[int, object]
- self.assertEqual(u, object)
- u = Union[object, int]
- self.assertEqual(u, object)
-
- def test_unordered(self):
- u1 = Union[int, float]
- u2 = Union[float, int]
- self.assertEqual(u1, u2)
-
- def test_single_class_disappears(self):
- t = Union[Employee]
- self.assertIs(t, Employee)
-
- def test_base_class_disappears(self):
- u = Union[Employee, Manager, int]
- self.assertEqual(u, Union[int, Employee])
- u = Union[Manager, int, Employee]
- self.assertEqual(u, Union[int, Employee])
- u = Union[Employee, Manager]
- self.assertIs(u, Employee)
-
- def test_union_union(self):
- u = Union[int, float]
- v = Union[u, Employee]
- self.assertEqual(v, Union[int, float, Employee])
-
- def test_repr(self):
- self.assertEqual(repr(Union), 'typing.Union')
- u = Union[Employee, int]
- self.assertEqual(repr(u), 'typing.Union[%s.Employee, int]' % __name__)
- u = Union[int, Employee]
- self.assertEqual(repr(u), 'typing.Union[int, %s.Employee]' % __name__)
-
- def test_cannot_subclass(self):
- with self.assertRaises(TypeError):
- class C(Union):
- pass
- with self.assertRaises(TypeError):
- class C(type(Union)):
- pass
- with self.assertRaises(TypeError):
- class C(Union[int, str]):
- pass
-
- def test_cannot_instantiate(self):
- with self.assertRaises(TypeError):
- Union()
- u = Union[int, float]
- with self.assertRaises(TypeError):
- u()
- with self.assertRaises(TypeError):
- type(u)()
-
- def test_union_generalization(self):
- self.assertFalse(Union[str, typing.Iterable[int]] == str)
- self.assertFalse(Union[str, typing.Iterable[int]] == typing.Iterable[int])
- self.assertTrue(Union[str, typing.Iterable] == typing.Iterable)
-
- def test_optional(self):
- o = Optional[int]
- u = Union[int, None]
- self.assertEqual(o, u)
-
- def test_empty(self):
- with self.assertRaises(TypeError):
- Union[()]
-
- def test_union_instance_type_error(self):
- with self.assertRaises(TypeError):
- isinstance(42, Union[int, str])
-
- def test_union_str_pattern(self):
- # Shouldn't crash; see http://bugs.python.org/issue25390
- A = Union[str, Pattern]
- A
-
- def test_etree(self):
- # See https://github.com/python/typing/issues/229
- # (Only relevant for Python 2.)
- try:
- from xml.etree.cElementTree import Element
- except ImportError:
- raise SkipTest("cElementTree not found")
- Union[Element, str] # Shouldn't crash
-
- def Elem(*args):
- return Element(*args)
-
- Union[Elem, str] # Nor should this
-
-
-class TupleTests(BaseTestCase):
-
- def test_basics(self):
- with self.assertRaises(TypeError):
- issubclass(Tuple, Tuple[int, str])
- with self.assertRaises(TypeError):
- issubclass(tuple, Tuple[int, str])
-
- class TP(tuple): pass
- self.assertTrue(issubclass(tuple, Tuple))
- self.assertTrue(issubclass(TP, Tuple))
-
- def test_equality(self):
- self.assertEqual(Tuple[int], Tuple[int])
- self.assertEqual(Tuple[int, ...], Tuple[int, ...])
- self.assertNotEqual(Tuple[int], Tuple[int, int])
- self.assertNotEqual(Tuple[int], Tuple[int, ...])
-
- def test_tuple_subclass(self):
- class MyTuple(tuple):
- pass
- self.assertTrue(issubclass(MyTuple, Tuple))
-
- def test_tuple_instance_type_error(self):
- with self.assertRaises(TypeError):
- isinstance((0, 0), Tuple[int, int])
- isinstance((0, 0), Tuple)
-
- def test_repr(self):
- self.assertEqual(repr(Tuple), 'typing.Tuple')
- self.assertEqual(repr(Tuple[()]), 'typing.Tuple[()]')
- self.assertEqual(repr(Tuple[int, float]), 'typing.Tuple[int, float]')
- self.assertEqual(repr(Tuple[int, ...]), 'typing.Tuple[int, ...]')
-
- def test_errors(self):
- with self.assertRaises(TypeError):
- issubclass(42, Tuple)
- with self.assertRaises(TypeError):
- issubclass(42, Tuple[int])
-
-
-class CallableTests(BaseTestCase):
-
- def test_self_subclass(self):
- with self.assertRaises(TypeError):
- self.assertTrue(issubclass(type(lambda x: x), Callable[[int], int]))
- self.assertTrue(issubclass(type(lambda x: x), Callable))
-
- def test_eq_hash(self):
- self.assertEqual(Callable[[int], int], Callable[[int], int])
- self.assertEqual(len({Callable[[int], int], Callable[[int], int]}), 1)
- self.assertNotEqual(Callable[[int], int], Callable[[int], str])
- self.assertNotEqual(Callable[[int], int], Callable[[str], int])
- self.assertNotEqual(Callable[[int], int], Callable[[int, int], int])
- self.assertNotEqual(Callable[[int], int], Callable[[], int])
- self.assertNotEqual(Callable[[int], int], Callable)
-
- def test_cannot_instantiate(self):
- with self.assertRaises(TypeError):
- Callable()
- with self.assertRaises(TypeError):
- type(Callable)()
- c = Callable[[int], str]
- with self.assertRaises(TypeError):
- c()
- with self.assertRaises(TypeError):
- type(c)()
-
- def test_callable_wrong_forms(self):
- with self.assertRaises(TypeError):
- Callable[(), int]
- with self.assertRaises(TypeError):
- Callable[[()], int]
- with self.assertRaises(TypeError):
- Callable[[int, 1], 2]
-
- def test_callable_instance_works(self):
- def f():
- pass
- self.assertIsInstance(f, Callable)
- self.assertNotIsInstance(None, Callable)
-
- def test_callable_instance_type_error(self):
- def f():
- pass
- with self.assertRaises(TypeError):
- self.assertIsInstance(f, Callable[[], None])
- with self.assertRaises(TypeError):
- self.assertIsInstance(f, Callable[[], Any])
- with self.assertRaises(TypeError):
- self.assertNotIsInstance(None, Callable[[], None])
- with self.assertRaises(TypeError):
- self.assertNotIsInstance(None, Callable[[], Any])
-
- def test_repr(self):
- ct0 = Callable[[], bool]
- self.assertEqual(repr(ct0), 'typing.Callable[[], bool]')
- ct2 = Callable[[str, float], int]
- self.assertEqual(repr(ct2), 'typing.Callable[[str, float], int]')
- ctv = Callable[..., str]
- self.assertEqual(repr(ctv), 'typing.Callable[..., str]')
-
- def test_ellipsis_in_generic(self):
- # Shouldn't crash; see https://github.com/python/typing/issues/259
- typing.List[Callable[..., str]]
-
-
-XK = TypeVar('XK', unicode, bytes)
-XV = TypeVar('XV')
-
-
-class SimpleMapping(Generic[XK, XV]):
-
- def __getitem__(self, key):
- pass
-
- def __setitem__(self, key, value):
- pass
-
- def get(self, key, default=None):
- pass
-
-
-class MySimpleMapping(SimpleMapping[XK, XV]):
-
- def __init__(self):
- self.store = {}
-
- def __getitem__(self, key):
- return self.store[key]
-
- def __setitem__(self, key, value):
- self.store[key] = value
-
- def get(self, key, default=None):
- try:
- return self.store[key]
- except KeyError:
- return default
-
-
-class ProtocolTests(BaseTestCase):
-
- def test_supports_int(self):
- self.assertIsSubclass(int, typing.SupportsInt)
- self.assertNotIsSubclass(str, typing.SupportsInt)
-
- def test_supports_float(self):
- self.assertIsSubclass(float, typing.SupportsFloat)
- self.assertNotIsSubclass(str, typing.SupportsFloat)
-
- def test_supports_complex(self):
-
- # Note: complex itself doesn't have __complex__.
- class C(object):
- def __complex__(self):
- return 0j
-
- self.assertIsSubclass(C, typing.SupportsComplex)
- self.assertNotIsSubclass(str, typing.SupportsComplex)
-
- def test_supports_abs(self):
- self.assertIsSubclass(float, typing.SupportsAbs)
- self.assertIsSubclass(int, typing.SupportsAbs)
- self.assertNotIsSubclass(str, typing.SupportsAbs)
-
- def test_reversible(self):
- self.assertIsSubclass(list, typing.Reversible)
- self.assertNotIsSubclass(int, typing.Reversible)
-
- def test_protocol_instance_type_error(self):
- with self.assertRaises(TypeError):
- isinstance(0, typing.SupportsAbs)
- class C1(typing.SupportsInt):
- def __int__(self):
- return 42
- class C2(C1):
- pass
- c = C2()
- self.assertIsInstance(c, C1)
-
-class GenericTests(BaseTestCase):
-
- def test_basics(self):
- X = SimpleMapping[str, Any]
- self.assertEqual(X.__parameters__, ())
- with self.assertRaises(TypeError):
- X[unicode]
- with self.assertRaises(TypeError):
- X[unicode, unicode]
- Y = SimpleMapping[XK, unicode]
- self.assertEqual(Y.__parameters__, (XK,))
- Y[unicode]
- with self.assertRaises(TypeError):
- Y[unicode, unicode]
-
- def test_generic_errors(self):
- T = TypeVar('T')
- with self.assertRaises(TypeError):
- Generic[T]()
- with self.assertRaises(TypeError):
- isinstance([], List[int])
- with self.assertRaises(TypeError):
- issubclass(list, List[int])
-
- def test_init(self):
- T = TypeVar('T')
- S = TypeVar('S')
- with self.assertRaises(TypeError):
- Generic[T, T]
- with self.assertRaises(TypeError):
- Generic[T, S, T]
-
- def test_repr(self):
- self.assertEqual(repr(SimpleMapping),
- __name__ + '.' + 'SimpleMapping')
- self.assertEqual(repr(MySimpleMapping),
- __name__ + '.' + 'MySimpleMapping')
-
- def test_chain_repr(self):
- T = TypeVar('T')
- S = TypeVar('S')
-
- class C(Generic[T]):
- pass
-
- X = C[Tuple[S, T]]
- self.assertEqual(X, C[Tuple[S, T]])
- self.assertNotEqual(X, C[Tuple[T, S]])
-
- Y = X[T, int]
- self.assertEqual(Y, X[T, int])
- self.assertNotEqual(Y, X[S, int])
- self.assertNotEqual(Y, X[T, str])
-
- Z = Y[str]
- self.assertEqual(Z, Y[str])
- self.assertNotEqual(Z, Y[int])
- self.assertNotEqual(Z, Y[T])
-
- self.assertTrue(str(Z).endswith(
- '.C[typing.Tuple[str, int]]'))
-
- def test_new_repr(self):
- T = TypeVar('T')
- U = TypeVar('U', covariant=True)
- S = TypeVar('S')
-
- self.assertEqual(repr(List), 'typing.List')
- self.assertEqual(repr(List[T]), 'typing.List[~T]')
- self.assertEqual(repr(List[U]), 'typing.List[+U]')
- self.assertEqual(repr(List[S][T][int]), 'typing.List[int]')
- self.assertEqual(repr(List[int]), 'typing.List[int]')
-
- def test_new_repr_complex(self):
- T = TypeVar('T')
- TS = TypeVar('TS')
-
- self.assertEqual(repr(typing.Mapping[T, TS][TS, T]), 'typing.Mapping[~TS, ~T]')
- self.assertEqual(repr(List[Tuple[T, TS]][int, T]),
- 'typing.List[typing.Tuple[int, ~T]]')
- self.assertEqual(repr(List[Tuple[T, T]][List[int]]),
- 'typing.List[typing.Tuple[typing.List[int], typing.List[int]]]')
-
- def test_new_repr_bare(self):
- T = TypeVar('T')
- self.assertEqual(repr(Generic[T]), 'typing.Generic[~T]')
- self.assertEqual(repr(typing._Protocol[T]), 'typing.Protocol[~T]')
- class C(typing.Dict[Any, Any]): pass
- # this line should just work
- repr(C.__mro__)
-
- def test_dict(self):
- T = TypeVar('T')
-
- class B(Generic[T]):
- pass
-
- b = B()
- b.foo = 42
- self.assertEqual(b.__dict__, {'foo': 42})
-
- class C(B[int]):
- pass
-
- c = C()
- c.bar = 'abc'
- self.assertEqual(c.__dict__, {'bar': 'abc'})
-
- def test_false_subclasses(self):
- class MyMapping(MutableMapping[str, str]): pass
- self.assertNotIsInstance({}, MyMapping)
- self.assertNotIsSubclass(dict, MyMapping)
-
- def test_abc_bases(self):
- class MM(MutableMapping[str, str]):
- def __getitem__(self, k):
- return None
- def __setitem__(self, k, v):
- pass
- def __delitem__(self, k):
- pass
- def __iter__(self):
- return iter(())
- def __len__(self):
- return 0
- # this should just work
- MM().update()
- self.assertIsInstance(MM(), collections_abc.MutableMapping)
- self.assertIsInstance(MM(), MutableMapping)
- self.assertNotIsInstance(MM(), List)
- self.assertNotIsInstance({}, MM)
-
- def test_multiple_bases(self):
- class MM1(MutableMapping[str, str], collections_abc.MutableMapping):
- pass
- with self.assertRaises(TypeError):
- # consistent MRO not possible
- class MM2(collections_abc.MutableMapping, MutableMapping[str, str]):
- pass
-
- def test_orig_bases(self):
- T = TypeVar('T')
- class C(typing.Dict[str, T]): pass
- self.assertEqual(C.__orig_bases__, (typing.Dict[str, T],))
-
- def test_naive_runtime_checks(self):
- def naive_dict_check(obj, tp):
- # Check if a dictionary conforms to Dict type
- if len(tp.__parameters__) > 0:
- raise NotImplementedError
- if tp.__args__:
- KT, VT = tp.__args__
- return all(isinstance(k, KT) and isinstance(v, VT)
- for k, v in obj.items())
- self.assertTrue(naive_dict_check({'x': 1}, typing.Dict[typing.Text, int]))
- self.assertFalse(naive_dict_check({1: 'x'}, typing.Dict[typing.Text, int]))
- with self.assertRaises(NotImplementedError):
- naive_dict_check({1: 'x'}, typing.Dict[typing.Text, T])
-
- def naive_generic_check(obj, tp):
- # Check if an instance conforms to the generic class
- if not hasattr(obj, '__orig_class__'):
- raise NotImplementedError
- return obj.__orig_class__ == tp
- class Node(Generic[T]): pass
- self.assertTrue(naive_generic_check(Node[int](), Node[int]))
- self.assertFalse(naive_generic_check(Node[str](), Node[int]))
- self.assertFalse(naive_generic_check(Node[str](), List))
- with self.assertRaises(NotImplementedError):
- naive_generic_check([1,2,3], Node[int])
-
- def naive_list_base_check(obj, tp):
- # Check if list conforms to a List subclass
- return all(isinstance(x, tp.__orig_bases__[0].__args__[0])
- for x in obj)
- class C(List[int]): pass
- self.assertTrue(naive_list_base_check([1, 2, 3], C))
- self.assertFalse(naive_list_base_check(['a', 'b'], C))
-
- def test_multi_subscr_base(self):
- T = TypeVar('T')
- U = TypeVar('U')
- V = TypeVar('V')
- class C(List[T][U][V]): pass
- class D(C, List[T][U][V]): pass
- self.assertEqual(C.__parameters__, (V,))
- self.assertEqual(D.__parameters__, (V,))
- self.assertEqual(C[int].__parameters__, ())
- self.assertEqual(D[int].__parameters__, ())
- self.assertEqual(C[int].__args__, (int,))
- self.assertEqual(D[int].__args__, (int,))
- self.assertEqual(C.__bases__, (List,))
- self.assertEqual(D.__bases__, (C, List))
- self.assertEqual(C.__orig_bases__, (List[T][U][V],))
- self.assertEqual(D.__orig_bases__, (C, List[T][U][V]))
-
- def test_extended_generic_rules_eq(self):
- T = TypeVar('T')
- U = TypeVar('U')
- self.assertEqual(Tuple[T, T][int], Tuple[int, int])
- self.assertEqual(typing.Iterable[Tuple[T, T]][T], typing.Iterable[Tuple[T, T]])
- with self.assertRaises(TypeError):
- Tuple[T, int][()]
- with self.assertRaises(TypeError):
- Tuple[T, U][T, ...]
-
- self.assertEqual(Union[T, int][int], int)
- self.assertEqual(Union[T, U][int, Union[int, str]], Union[int, str])
- class Base(object): pass
- class Derived(Base): pass
- self.assertEqual(Union[T, Base][Derived], Base)
- with self.assertRaises(TypeError):
- Union[T, int][1]
-
- self.assertEqual(Callable[[T], T][KT], Callable[[KT], KT])
- self.assertEqual(Callable[..., List[T]][int], Callable[..., List[int]])
- with self.assertRaises(TypeError):
- Callable[[T], U][..., int]
- with self.assertRaises(TypeError):
- Callable[[T], U][[], int]
-
- def test_extended_generic_rules_repr(self):
- T = TypeVar('T')
- self.assertEqual(repr(Union[Tuple, Callable]).replace('typing.', ''),
- 'Union[Tuple, Callable]')
- self.assertEqual(repr(Union[Tuple, Tuple[int]]).replace('typing.', ''),
- 'Tuple')
- self.assertEqual(repr(Callable[..., Optional[T]][int]).replace('typing.', ''),
- 'Callable[..., Union[int, NoneType]]')
- self.assertEqual(repr(Callable[[], List[T]][int]).replace('typing.', ''),
- 'Callable[[], List[int]]')
-
- def test_generic_forvard_ref(self):
- LLT = List[List['CC']]
- class CC: pass
- self.assertEqual(typing._eval_type(LLT, globals(), locals()), List[List[CC]])
- T = TypeVar('T')
- AT = Tuple[T, ...]
- self.assertIs(typing._eval_type(AT, globals(), locals()), AT)
- CT = Callable[..., List[T]]
- self.assertIs(typing._eval_type(CT, globals(), locals()), CT)
-
- def test_extended_generic_rules_subclassing(self):
- class T1(Tuple[T, KT]): pass
- class T2(Tuple[T, ...]): pass
- class C1(Callable[[T], T]): pass
- class C2(Callable[..., int]):
- def __call__(self):
- return None
-
- self.assertEqual(T1.__parameters__, (T, KT))
- self.assertEqual(T1[int, str].__args__, (int, str))
- self.assertEqual(T1[int, T].__origin__, T1)
-
- self.assertEqual(T2.__parameters__, (T,))
- with self.assertRaises(TypeError):
- T1[int]
- with self.assertRaises(TypeError):
- T2[int, str]
-
- self.assertEqual(repr(C1[int]).split('.')[-1], 'C1[int]')
- self.assertEqual(C2.__parameters__, ())
- self.assertIsInstance(C2(), collections_abc.Callable)
- self.assertIsSubclass(C2, collections_abc.Callable)
- self.assertIsSubclass(C1, collections_abc.Callable)
- self.assertIsInstance(T1(), tuple)
- self.assertIsSubclass(T2, tuple)
- self.assertIsSubclass(Tuple[int, ...], typing.Sequence)
- self.assertIsSubclass(Tuple[int, ...], typing.Iterable)
-
- def test_fail_with_bare_union(self):
- with self.assertRaises(TypeError):
- List[Union]
- with self.assertRaises(TypeError):
- Tuple[Optional]
- with self.assertRaises(TypeError):
- ClassVar[ClassVar]
- with self.assertRaises(TypeError):
- List[ClassVar[int]]
-
- def test_fail_with_bare_generic(self):
- T = TypeVar('T')
- with self.assertRaises(TypeError):
- List[Generic]
- with self.assertRaises(TypeError):
- Tuple[Generic[T]]
- with self.assertRaises(TypeError):
- List[typing._Protocol]
-
- def test_type_erasure_special(self):
- T = TypeVar('T')
- # this is the only test that checks type caching
- self.clear_caches()
- class MyTup(Tuple[T, T]): pass
- self.assertIs(MyTup[int]().__class__, MyTup)
- self.assertIs(MyTup[int]().__orig_class__, MyTup[int])
- class MyCall(Callable[..., T]):
- def __call__(self): return None
- self.assertIs(MyCall[T]().__class__, MyCall)
- self.assertIs(MyCall[T]().__orig_class__, MyCall[T])
- class MyDict(typing.Dict[T, T]): pass
- self.assertIs(MyDict[int]().__class__, MyDict)
- self.assertIs(MyDict[int]().__orig_class__, MyDict[int])
- class MyDef(typing.DefaultDict[str, T]): pass
- self.assertIs(MyDef[int]().__class__, MyDef)
- self.assertIs(MyDef[int]().__orig_class__, MyDef[int])
-
- def test_all_repr_eq_any(self):
- objs = (getattr(typing, el) for el in typing.__all__)
- for obj in objs:
- self.assertNotEqual(repr(obj), '')
- self.assertEqual(obj, obj)
- if getattr(obj, '__parameters__', None) and len(obj.__parameters__) == 1:
- self.assertEqual(obj[Any].__args__, (Any,))
- if isinstance(obj, type):
- for base in obj.__mro__:
- self.assertNotEqual(repr(base), '')
- self.assertEqual(base, base)
-
- def test_pickle(self):
- global C # pickle wants to reference the class by name
- T = TypeVar('T')
-
- class B(Generic[T]):
- pass
-
- class C(B[int]):
- pass
-
- c = C()
- c.foo = 42
- c.bar = 'abc'
- for proto in range(pickle.HIGHEST_PROTOCOL + 1):
- z = pickle.dumps(c, proto)
- x = pickle.loads(z)
- self.assertEqual(x.foo, 42)
- self.assertEqual(x.bar, 'abc')
- self.assertEqual(x.__dict__, {'foo': 42, 'bar': 'abc'})
- simples = [Any, Union, Tuple, Callable, ClassVar, List, typing.Iterable]
- for s in simples:
- for proto in range(pickle.HIGHEST_PROTOCOL + 1):
- z = pickle.dumps(s, proto)
- x = pickle.loads(z)
- self.assertEqual(s, x)
-
- def test_copy_and_deepcopy(self):
- T = TypeVar('T')
- class Node(Generic[T]): pass
- things = [Any, Union[T, int], Tuple[T, int], Callable[..., T], Callable[[int], int],
- Tuple[Any, Any], Node[T], Node[int], Node[Any], typing.Iterable[T],
- typing.Iterable[Any], typing.Iterable[int], typing.Dict[int, str],
- typing.Dict[T, Any], ClassVar[int], ClassVar[List[T]], Tuple['T', 'T'],
- Union['T', int], List['T'], typing.Mapping['T', int]]
- for t in things:
- self.assertEqual(t, deepcopy(t))
- self.assertEqual(t, copy(t))
-
- def test_parameterized_slots(self):
- T = TypeVar('T')
- class C(Generic[T]):
- __slots__ = ('potato',)
-
- c = C()
- c_int = C[int]()
- self.assertEqual(C.__slots__, C[str].__slots__)
-
- c.potato = 0
- c_int.potato = 0
- with self.assertRaises(AttributeError):
- c.tomato = 0
- with self.assertRaises(AttributeError):
- c_int.tomato = 0
-
- self.assertEqual(typing._eval_type(C['C'], globals(), locals()), C[C])
- self.assertEqual(typing._eval_type(C['C'], globals(), locals()).__slots__,
- C.__slots__)
- self.assertEqual(copy(C[int]), deepcopy(C[int]))
-
- def test_parameterized_slots_dict(self):
- T = TypeVar('T')
- class D(Generic[T]):
- __slots__ = {'banana': 42}
-
- d = D()
- d_int = D[int]()
- self.assertEqual(D.__slots__, D[str].__slots__)
-
- d.banana = 'yes'
- d_int.banana = 'yes'
- with self.assertRaises(AttributeError):
- d.foobar = 'no'
- with self.assertRaises(AttributeError):
- d_int.foobar = 'no'
-
- def test_errors(self):
- with self.assertRaises(TypeError):
- B = SimpleMapping[XK, Any]
-
- class C(Generic[B]):
- pass
-
- def test_repr_2(self):
- PY32 = sys.version_info[:2] < (3, 3)
-
- class C(Generic[T]):
- pass
-
- self.assertEqual(C.__module__, __name__)
- if not PY32:
- self.assertEqual(C.__qualname__,
- 'GenericTests.test_repr_2.<locals>.C')
- self.assertEqual(repr(C).split('.')[-1], 'C')
- X = C[int]
- self.assertEqual(X.__module__, __name__)
- if not PY32:
- self.assertTrue(X.__qualname__.endswith('.<locals>.C'))
- self.assertEqual(repr(X).split('.')[-1], 'C[int]')
-
- class Y(C[int]):
- pass
-
- self.assertEqual(Y.__module__, __name__)
- if not PY32:
- self.assertEqual(Y.__qualname__,
- 'GenericTests.test_repr_2.<locals>.Y')
- self.assertEqual(repr(Y).split('.')[-1], 'Y')
-
- def test_eq_1(self):
- self.assertEqual(Generic, Generic)
- self.assertEqual(Generic[T], Generic[T])
- self.assertNotEqual(Generic[KT], Generic[VT])
-
- def test_eq_2(self):
-
- class A(Generic[T]):
- pass
-
- class B(Generic[T]):
- pass
-
- self.assertEqual(A, A)
- self.assertNotEqual(A, B)
- self.assertEqual(A[T], A[T])
- self.assertNotEqual(A[T], B[T])
-
- def test_multiple_inheritance(self):
-
- class A(Generic[T, VT]):
- pass
-
- class B(Generic[KT, T]):
- pass
-
- class C(A[T, VT], Generic[VT, T, KT], B[KT, T]):
- pass
-
- self.assertEqual(C.__parameters__, (VT, T, KT))
-
- def test_nested(self):
-
- G = Generic
-
- class Visitor(G[T]):
-
- a = None
-
- def set(self, a):
- self.a = a
-
- def get(self):
- return self.a
-
- def visit(self):
- return self.a
-
- V = Visitor[typing.List[int]]
-
- class IntListVisitor(V):
-
- def append(self, x):
- self.a.append(x)
-
- a = IntListVisitor()
- a.set([])
- a.append(1)
- a.append(42)
- self.assertEqual(a.get(), [1, 42])
-
- def test_type_erasure(self):
- T = TypeVar('T')
-
- class Node(Generic[T]):
- def __init__(self, label,
- left = None,
- right = None):
- self.label = label # type: T
- self.left = left # type: Optional[Node[T]]
- self.right = right # type: Optional[Node[T]]
-
- def foo(x):
- a = Node(x)
- b = Node[T](x)
- c = Node[Any](x)
- self.assertIs(type(a), Node)
- self.assertIs(type(b), Node)
- self.assertIs(type(c), Node)
- self.assertEqual(a.label, x)
- self.assertEqual(b.label, x)
- self.assertEqual(c.label, x)
-
- foo(42)
-
- def test_implicit_any(self):
- T = TypeVar('T')
-
- class C(Generic[T]):
- pass
-
- class D(C):
- pass
-
- self.assertEqual(D.__parameters__, ())
-
- with self.assertRaises(Exception):
- D[int]
- with self.assertRaises(Exception):
- D[Any]
- with self.assertRaises(Exception):
- D[T]
-
-class ClassVarTests(BaseTestCase):
-
- def test_basics(self):
- with self.assertRaises(TypeError):
- ClassVar[1]
- with self.assertRaises(TypeError):
- ClassVar[int, str]
- with self.assertRaises(TypeError):
- ClassVar[int][str]
-
- def test_repr(self):
- self.assertEqual(repr(ClassVar), 'typing.ClassVar')
- cv = ClassVar[int]
- self.assertEqual(repr(cv), 'typing.ClassVar[int]')
- cv = ClassVar[Employee]
- self.assertEqual(repr(cv), 'typing.ClassVar[%s.Employee]' % __name__)
-
- def test_cannot_subclass(self):
- with self.assertRaises(TypeError):
- class C(type(ClassVar)):
- pass
- with self.assertRaises(TypeError):
- class C(type(ClassVar[int])):
- pass
-
- def test_cannot_init(self):
- with self.assertRaises(TypeError):
- ClassVar()
- with self.assertRaises(TypeError):
- type(ClassVar)()
- with self.assertRaises(TypeError):
- type(ClassVar[Optional[int]])()
-
- def test_no_isinstance(self):
- with self.assertRaises(TypeError):
- isinstance(1, ClassVar[int])
- with self.assertRaises(TypeError):
- issubclass(int, ClassVar)
-
-
-class CastTests(BaseTestCase):
-
- def test_basics(self):
- self.assertEqual(cast(int, 42), 42)
- self.assertEqual(cast(float, 42), 42)
- self.assertIs(type(cast(float, 42)), int)
- self.assertEqual(cast(Any, 42), 42)
- self.assertEqual(cast(list, 42), 42)
- self.assertEqual(cast(Union[str, float], 42), 42)
- self.assertEqual(cast(AnyStr, 42), 42)
- self.assertEqual(cast(None, 42), 42)
-
- def test_errors(self):
- # Bogus calls are not expected to fail.
- cast(42, 42)
- cast('hello', 42)
-
-
-class ForwardRefTests(BaseTestCase):
-
- def test_forwardref_instance_type_error(self):
- fr = typing._ForwardRef('int')
- with self.assertRaises(TypeError):
- isinstance(42, fr)
-
- def test_syntax_error(self):
-
- with self.assertRaises(SyntaxError):
- Generic['/T']
-
-
-class OverloadTests(BaseTestCase):
-
- def test_overload_exists(self):
- from typing import overload
-
- def test_overload_fails(self):
- from typing import overload
-
- with self.assertRaises(RuntimeError):
-
- @overload
- def blah():
- pass
-
- blah()
-
- def test_overload_succeeds(self):
- from typing import overload
-
- @overload
- def blah():
- pass
-
- def blah():
- pass
-
- blah()
-
-
-class CollectionsAbcTests(BaseTestCase):
-
- def test_hashable(self):
- self.assertIsInstance(42, typing.Hashable)
- self.assertNotIsInstance([], typing.Hashable)
-
- def test_iterable(self):
- self.assertIsInstance([], typing.Iterable)
- # Due to ABC caching, the second time takes a separate code
- # path and could fail. So call this a few times.
- self.assertIsInstance([], typing.Iterable)
- self.assertIsInstance([], typing.Iterable)
- self.assertNotIsInstance(42, typing.Iterable)
- # Just in case, also test issubclass() a few times.
- self.assertIsSubclass(list, typing.Iterable)
- self.assertIsSubclass(list, typing.Iterable)
-
- def test_iterator(self):
- it = iter([])
- self.assertIsInstance(it, typing.Iterator)
- self.assertNotIsInstance(42, typing.Iterator)
-
- def test_sized(self):
- self.assertIsInstance([], typing.Sized)
- self.assertNotIsInstance(42, typing.Sized)
-
- def test_container(self):
- self.assertIsInstance([], typing.Container)
- self.assertNotIsInstance(42, typing.Container)
-
- def test_abstractset(self):
- self.assertIsInstance(set(), typing.AbstractSet)
- self.assertNotIsInstance(42, typing.AbstractSet)
-
- def test_mutableset(self):
- self.assertIsInstance(set(), typing.MutableSet)
- self.assertNotIsInstance(frozenset(), typing.MutableSet)
-
- def test_mapping(self):
- self.assertIsInstance({}, typing.Mapping)
- self.assertNotIsInstance(42, typing.Mapping)
-
- def test_mutablemapping(self):
- self.assertIsInstance({}, typing.MutableMapping)
- self.assertNotIsInstance(42, typing.MutableMapping)
-
- def test_sequence(self):
- self.assertIsInstance([], typing.Sequence)
- self.assertNotIsInstance(42, typing.Sequence)
-
- def test_mutablesequence(self):
- self.assertIsInstance([], typing.MutableSequence)
- self.assertNotIsInstance((), typing.MutableSequence)
-
- def test_bytestring(self):
- self.assertIsInstance(b'', typing.ByteString)
- self.assertIsInstance(bytearray(b''), typing.ByteString)
-
- def test_list(self):
- self.assertIsSubclass(list, typing.List)
-
- def test_set(self):
- self.assertIsSubclass(set, typing.Set)
- self.assertNotIsSubclass(frozenset, typing.Set)
-
- def test_frozenset(self):
- self.assertIsSubclass(frozenset, typing.FrozenSet)
- self.assertNotIsSubclass(set, typing.FrozenSet)
-
- def test_dict(self):
- self.assertIsSubclass(dict, typing.Dict)
-
- def test_no_list_instantiation(self):
- with self.assertRaises(TypeError):
- typing.List()
- with self.assertRaises(TypeError):
- typing.List[T]()
- with self.assertRaises(TypeError):
- typing.List[int]()
-
- def test_list_subclass(self):
-
- class MyList(typing.List[int]):
- pass
-
- a = MyList()
- self.assertIsInstance(a, MyList)
- self.assertIsInstance(a, typing.Sequence)
-
- self.assertIsSubclass(MyList, list)
- self.assertNotIsSubclass(list, MyList)
-
- def test_no_dict_instantiation(self):
- with self.assertRaises(TypeError):
- typing.Dict()
- with self.assertRaises(TypeError):
- typing.Dict[KT, VT]()
- with self.assertRaises(TypeError):
- typing.Dict[str, int]()
-
- def test_dict_subclass(self):
-
- class MyDict(typing.Dict[str, int]):
- pass
-
- d = MyDict()
- self.assertIsInstance(d, MyDict)
- self.assertIsInstance(d, typing.MutableMapping)
-
- self.assertIsSubclass(MyDict, dict)
- self.assertNotIsSubclass(dict, MyDict)
-
- def test_no_defaultdict_instantiation(self):
- with self.assertRaises(TypeError):
- typing.DefaultDict()
- with self.assertRaises(TypeError):
- typing.DefaultDict[KT, VT]()
- with self.assertRaises(TypeError):
- typing.DefaultDict[str, int]()
-
- def test_defaultdict_subclass(self):
-
- class MyDefDict(typing.DefaultDict[str, int]):
- pass
-
- dd = MyDefDict()
- self.assertIsInstance(dd, MyDefDict)
-
- self.assertIsSubclass(MyDefDict, collections.defaultdict)
- self.assertNotIsSubclass(collections.defaultdict, MyDefDict)
-
- def test_no_set_instantiation(self):
- with self.assertRaises(TypeError):
- typing.Set()
- with self.assertRaises(TypeError):
- typing.Set[T]()
- with self.assertRaises(TypeError):
- typing.Set[int]()
-
- def test_set_subclass_instantiation(self):
-
- class MySet(typing.Set[int]):
- pass
-
- d = MySet()
- self.assertIsInstance(d, MySet)
-
- def test_no_frozenset_instantiation(self):
- with self.assertRaises(TypeError):
- typing.FrozenSet()
- with self.assertRaises(TypeError):
- typing.FrozenSet[T]()
- with self.assertRaises(TypeError):
- typing.FrozenSet[int]()
-
- def test_frozenset_subclass_instantiation(self):
-
- class MyFrozenSet(typing.FrozenSet[int]):
- pass
-
- d = MyFrozenSet()
- self.assertIsInstance(d, MyFrozenSet)
-
- def test_no_tuple_instantiation(self):
- with self.assertRaises(TypeError):
- Tuple()
- with self.assertRaises(TypeError):
- Tuple[T]()
- with self.assertRaises(TypeError):
- Tuple[int]()
-
- def test_generator(self):
- def foo():
- yield 42
- g = foo()
- self.assertIsSubclass(type(g), typing.Generator)
-
- def test_no_generator_instantiation(self):
- with self.assertRaises(TypeError):
- typing.Generator()
- with self.assertRaises(TypeError):
- typing.Generator[T, T, T]()
- with self.assertRaises(TypeError):
- typing.Generator[int, int, int]()
-
- def test_subclassing(self):
-
- class MMA(typing.MutableMapping):
- pass
-
- with self.assertRaises(TypeError): # It's abstract
- MMA()
-
- class MMC(MMA):
- def __getitem__(self, k):
- return None
- def __setitem__(self, k, v):
- pass
- def __delitem__(self, k):
- pass
- def __iter__(self):
- return iter(())
- def __len__(self):
- return 0
-
- self.assertEqual(len(MMC()), 0)
- assert callable(MMC.update)
- self.assertIsInstance(MMC(), typing.Mapping)
-
- class MMB(typing.MutableMapping[KT, VT]):
- def __getitem__(self, k):
- return None
- def __setitem__(self, k, v):
- pass
- def __delitem__(self, k):
- pass
- def __iter__(self):
- return iter(())
- def __len__(self):
- return 0
-
- self.assertEqual(len(MMB()), 0)
- self.assertEqual(len(MMB[str, str]()), 0)
- self.assertEqual(len(MMB[KT, VT]()), 0)
-
- self.assertNotIsSubclass(dict, MMA)
- self.assertNotIsSubclass(dict, MMB)
-
- self.assertIsSubclass(MMA, typing.Mapping)
- self.assertIsSubclass(MMB, typing.Mapping)
- self.assertIsSubclass(MMC, typing.Mapping)
-
- self.assertIsInstance(MMB[KT, VT](), typing.Mapping)
- self.assertIsInstance(MMB[KT, VT](), collections.Mapping)
-
- self.assertIsSubclass(MMA, collections.Mapping)
- self.assertIsSubclass(MMB, collections.Mapping)
- self.assertIsSubclass(MMC, collections.Mapping)
-
- self.assertIsSubclass(MMB[str, str], typing.Mapping)
- self.assertIsSubclass(MMC, MMA)
-
- class I(typing.Iterable): pass
- self.assertNotIsSubclass(list, I)
-
- class G(typing.Generator[int, int, int]): pass
- def g(): yield 0
- self.assertIsSubclass(G, typing.Generator)
- self.assertIsSubclass(G, typing.Iterable)
- if hasattr(collections, 'Generator'):
- self.assertIsSubclass(G, collections.Generator)
- self.assertIsSubclass(G, collections.Iterable)
- self.assertNotIsSubclass(type(g), G)
-
- def test_subclassing_subclasshook(self):
-
- class Base(typing.Iterable):
- @classmethod
- def __subclasshook__(cls, other):
- if other.__name__ == 'Foo':
- return True
- else:
- return False
-
- class C(Base): pass
- class Foo: pass
- class Bar: pass
- self.assertIsSubclass(Foo, Base)
- self.assertIsSubclass(Foo, C)
- self.assertNotIsSubclass(Bar, C)
-
- def test_subclassing_register(self):
-
- class A(typing.Container): pass
- class B(A): pass
-
- class C: pass
- A.register(C)
- self.assertIsSubclass(C, A)
- self.assertNotIsSubclass(C, B)
-
- class D: pass
- B.register(D)
- self.assertIsSubclass(D, A)
- self.assertIsSubclass(D, B)
-
- class M(): pass
- collections.MutableMapping.register(M)
- self.assertIsSubclass(M, typing.Mapping)
-
- def test_collections_as_base(self):
-
- class M(collections.Mapping): pass
- self.assertIsSubclass(M, typing.Mapping)
- self.assertIsSubclass(M, typing.Iterable)
-
- class S(collections.MutableSequence): pass
- self.assertIsSubclass(S, typing.MutableSequence)
- self.assertIsSubclass(S, typing.Iterable)
-
- class I(collections.Iterable): pass
- self.assertIsSubclass(I, typing.Iterable)
-
- class A(collections.Mapping): pass
- class B: pass
- A.register(B)
- self.assertIsSubclass(B, typing.Mapping)
-
-class TypeTests(BaseTestCase):
-
- def test_type_basic(self):
-
- class User(object): pass
- class BasicUser(User): pass
- class ProUser(User): pass
-
- def new_user(user_class):
- # type: (Type[User]) -> User
- return user_class()
-
- joe = new_user(BasicUser)
-
- def test_type_typevar(self):
-
- class User(object): pass
- class BasicUser(User): pass
- class ProUser(User): pass
-
- global U
- U = TypeVar('U', bound=User)
-
- def new_user(user_class):
- # type: (Type[U]) -> U
- return user_class()
-
- joe = new_user(BasicUser)
-
- def test_type_optional(self):
- A = Optional[Type[BaseException]]
-
- def foo(a):
- # type: (A) -> Optional[BaseException]
- if a is None:
- return None
- else:
- return a()
-
- assert isinstance(foo(KeyboardInterrupt), KeyboardInterrupt)
- assert foo(None) is None
-
-
-class NewTypeTests(BaseTestCase):
-
- def test_basic(self):
- UserId = NewType('UserId', int)
- UserName = NewType('UserName', str)
- self.assertIsInstance(UserId(5), int)
- self.assertIsInstance(UserName('Joe'), type('Joe'))
- self.assertEqual(UserId(5) + 1, 6)
-
- def test_errors(self):
- UserId = NewType('UserId', int)
- UserName = NewType('UserName', str)
- with self.assertRaises(TypeError):
- issubclass(UserId, int)
- with self.assertRaises(TypeError):
- class D(UserName):
- pass
-
-
-class NamedTupleTests(BaseTestCase):
-
- def test_basics(self):
- Emp = NamedTuple('Emp', [('name', str), ('id', int)])
- self.assertIsSubclass(Emp, tuple)
- joe = Emp('Joe', 42)
- jim = Emp(name='Jim', id=1)
- self.assertIsInstance(joe, Emp)
- self.assertIsInstance(joe, tuple)
- self.assertEqual(joe.name, 'Joe')
- self.assertEqual(joe.id, 42)
- self.assertEqual(jim.name, 'Jim')
- self.assertEqual(jim.id, 1)
- self.assertEqual(Emp.__name__, 'Emp')
- self.assertEqual(Emp._fields, ('name', 'id'))
- self.assertEqual(Emp._field_types, dict(name=str, id=int))
-
- def test_pickle(self):
- global Emp # pickle wants to reference the class by name
- Emp = NamedTuple('Emp', [('name', str), ('id', int)])
- jane = Emp('jane', 37)
- for proto in range(pickle.HIGHEST_PROTOCOL + 1):
- z = pickle.dumps(jane, proto)
- jane2 = pickle.loads(z)
- self.assertEqual(jane2, jane)
-
-
-class IOTests(BaseTestCase):
-
- def test_io_submodule(self):
- from typing.io import IO, TextIO, BinaryIO, __all__, __name__
- self.assertIs(IO, typing.IO)
- self.assertIs(TextIO, typing.TextIO)
- self.assertIs(BinaryIO, typing.BinaryIO)
- self.assertEqual(set(__all__), set(['IO', 'TextIO', 'BinaryIO']))
- self.assertEqual(__name__, 'typing.io')
-
-
-class RETests(BaseTestCase):
- # Much of this is really testing _TypeAlias.
-
- def test_basics(self):
- pat = re.compile('[a-z]+', re.I)
- self.assertIsSubclass(pat.__class__, Pattern)
- self.assertIsSubclass(type(pat), Pattern)
- self.assertIsInstance(pat, Pattern)
-
- mat = pat.search('12345abcde.....')
- self.assertIsSubclass(mat.__class__, Match)
- self.assertIsSubclass(type(mat), Match)
- self.assertIsInstance(mat, Match)
-
- # these should just work
- p = Pattern[Union[str, bytes]]
- m = Match[Union[bytes, str]]
-
- def test_errors(self):
- with self.assertRaises(TypeError):
- # Doesn't fit AnyStr.
- Pattern[int]
- with self.assertRaises(TypeError):
- # Can't change type vars?
- Match[T]
- m = Match[Union[str, bytes]]
- with self.assertRaises(TypeError):
- # Too complicated?
- m[str]
- with self.assertRaises(TypeError):
- # We don't support isinstance().
- isinstance(42, Pattern[str])
-
- def test_repr(self):
- self.assertEqual(repr(Pattern), 'Pattern[~AnyStr]')
- self.assertEqual(repr(Pattern[unicode]), 'Pattern[unicode]')
- self.assertEqual(repr(Pattern[str]), 'Pattern[str]')
- self.assertEqual(repr(Match), 'Match[~AnyStr]')
- self.assertEqual(repr(Match[unicode]), 'Match[unicode]')
- self.assertEqual(repr(Match[str]), 'Match[str]')
-
- def test_re_submodule(self):
- from typing.re import Match, Pattern, __all__, __name__
- self.assertIs(Match, typing.Match)
- self.assertIs(Pattern, typing.Pattern)
- self.assertEqual(set(__all__), set(['Match', 'Pattern']))
- self.assertEqual(__name__, 'typing.re')
-
- def test_cannot_subclass(self):
- with self.assertRaises(TypeError) as ex:
-
- class A(typing.Match):
- pass
-
- self.assertEqual(str(ex.exception),
- "Cannot subclass typing._TypeAlias")
-
-
-class AllTests(BaseTestCase):
- """Tests for __all__."""
-
- def test_all(self):
- from typing import __all__ as a
- # Just spot-check the first and last of every category.
- self.assertIn('AbstractSet', a)
- self.assertIn('ValuesView', a)
- self.assertIn('cast', a)
- self.assertIn('overload', a)
- # Check that io and re are not exported.
- self.assertNotIn('io', a)
- self.assertNotIn('re', a)
- # Spot-check that stdlib modules aren't exported.
- self.assertNotIn('os', a)
- self.assertNotIn('sys', a)
- # Check that Text is defined.
- self.assertIn('Text', a)
-
- def test_respect_no_type_check(self):
- @typing.no_type_check
- class NoTpCheck(object):
- class Inn(object):
- def __init__(self, x): pass
- # type: (this is not actualy a type) -> None
- self.assertTrue(NoTpCheck.__no_type_check__)
- self.assertTrue(NoTpCheck.Inn.__init__.__no_type_check__)
-
- def test_get_type_hints_dummy(self):
-
- def foo(x):
- # type: (int) -> int
- return x + 1
-
- self.assertIsNone(typing.get_type_hints(foo))
-
-
-if __name__ == '__main__':
- main()
diff --git a/lib-typing/2.7/typing.py b/lib-typing/2.7/typing.py
deleted file mode 100644
index 5627697..0000000
--- a/lib-typing/2.7/typing.py
+++ /dev/null
@@ -1,2016 +0,0 @@
-from __future__ import absolute_import, unicode_literals
-
-import abc
-from abc import abstractmethod, abstractproperty
-import collections
-import functools
-import re as stdlib_re # Avoid confusion with the re we export.
-import sys
-import types
-try:
- import collections.abc as collections_abc
-except ImportError:
- import collections as collections_abc # Fallback for PY3.2.
-
-
-# Please keep __all__ alphabetized within each category.
-__all__ = [
- # Super-special typing primitives.
- 'Any',
- 'Callable',
- 'ClassVar',
- 'Generic',
- 'Optional',
- 'Tuple',
- 'Type',
- 'TypeVar',
- 'Union',
-
- # ABCs (from collections.abc).
- 'AbstractSet', # collections.abc.Set.
- 'ByteString',
- 'Container',
- 'Hashable',
- 'ItemsView',
- 'Iterable',
- 'Iterator',
- 'KeysView',
- 'Mapping',
- 'MappingView',
- 'MutableMapping',
- 'MutableSequence',
- 'MutableSet',
- 'Sequence',
- 'Sized',
- 'ValuesView',
-
- # Structural checks, a.k.a. protocols.
- 'Reversible',
- 'SupportsAbs',
- 'SupportsFloat',
- 'SupportsInt',
-
- # Concrete collection types.
- 'Dict',
- 'DefaultDict',
- 'List',
- 'Set',
- 'FrozenSet',
- 'NamedTuple', # Not really a type.
- 'Generator',
-
- # One-off things.
- 'AnyStr',
- 'cast',
- 'get_type_hints',
- 'NewType',
- 'no_type_check',
- 'no_type_check_decorator',
- 'overload',
- 'Text',
- 'TYPE_CHECKING',
-]
-
-# The pseudo-submodules 're' and 'io' are part of the public
-# namespace, but excluded from __all__ because they might stomp on
-# legitimate imports of those modules.
-
-
-def _qualname(x):
- if sys.version_info[:2] >= (3, 3):
- return x.__qualname__
- else:
- # Fall back to just name.
- return x.__name__
-
-def _trim_name(nm):
- if nm.startswith('_') and nm not in ('_TypeAlias',
- '_ForwardRef', '_TypingBase', '_FinalTypingBase'):
- nm = nm[1:]
- return nm
-
-
-class TypingMeta(type):
- """Metaclass for most types defined in typing module
- (not a part of public API).
-
- This also defines a dummy constructor (all the work for most typing
- constructs is done in __new__) and a nicer repr().
- """
-
- _is_protocol = False
-
- def __new__(cls, name, bases, namespace):
- return super(TypingMeta, cls).__new__(cls, str(name), bases, namespace)
-
- @classmethod
- def assert_no_subclassing(cls, bases):
- for base in bases:
- if isinstance(base, cls):
- raise TypeError("Cannot subclass %s" %
- (', '.join(map(_type_repr, bases)) or '()'))
-
- def __init__(self, *args, **kwds):
- pass
-
- def _eval_type(self, globalns, localns):
- """Override this in subclasses to interpret forward references.
-
- For example, List['C'] is internally stored as
- List[_ForwardRef('C')], which should evaluate to List[C],
- where C is an object found in globalns or localns (searching
- localns first, of course).
- """
- return self
-
- def _get_type_vars(self, tvars):
- pass
-
- def __repr__(self):
- qname = _trim_name(_qualname(self))
- return '%s.%s' % (self.__module__, qname)
-
-
-class _TypingBase(object):
- """Internal indicator of special typing constructs."""
- __metaclass__ = TypingMeta
- __slots__ = ()
-
- def __init__(self, *args, **kwds):
- pass
-
- def __new__(cls, *args, **kwds):
- """Constructor.
-
- This only exists to give a better error message in case
- someone tries to subclass a special typing object (not a good idea).
- """
- if (len(args) == 3 and
- isinstance(args[0], str) and
- isinstance(args[1], tuple)):
- # Close enough.
- raise TypeError("Cannot subclass %r" % cls)
- return super(_TypingBase, cls).__new__(cls)
-
- # Things that are not classes also need these.
- def _eval_type(self, globalns, localns):
- return self
-
- def _get_type_vars(self, tvars):
- pass
-
- def __repr__(self):
- cls = type(self)
- qname = _trim_name(_qualname(cls))
- return '%s.%s' % (cls.__module__, qname)
-
- def __call__(self, *args, **kwds):
- raise TypeError("Cannot instantiate %r" % type(self))
-
-
-class _FinalTypingBase(_TypingBase):
- """Internal mix-in class to prevent instantiation.
-
- Prevents instantiation unless _root=True is given in class call.
- It is used to create pseudo-singleton instances Any, Union, Optional, etc.
- """
-
- __slots__ = ()
-
- def __new__(cls, *args, **kwds):
- self = super(_FinalTypingBase, cls).__new__(cls, *args, **kwds)
- if '_root' in kwds and kwds['_root'] is True:
- return self
- raise TypeError("Cannot instantiate %r" % cls)
-
- def __reduce__(self):
- return _trim_name(type(self).__name__)
-
-
-class _ForwardRef(_TypingBase):
- """Internal wrapper to hold a forward reference."""
-
- __slots__ = ('__forward_arg__', '__forward_code__',
- '__forward_evaluated__', '__forward_value__')
-
- def __init__(self, arg):
- super(_ForwardRef, self).__init__(arg)
- if not isinstance(arg, basestring):
- raise TypeError('Forward reference must be a string -- got %r' % (arg,))
- try:
- code = compile(arg, '<string>', 'eval')
- except SyntaxError:
- raise SyntaxError('Forward reference must be an expression -- got %r' %
- (arg,))
- self.__forward_arg__ = arg
- self.__forward_code__ = code
- self.__forward_evaluated__ = False
- self.__forward_value__ = None
-
- def _eval_type(self, globalns, localns):
- if not self.__forward_evaluated__ or localns is not globalns:
- if globalns is None and localns is None:
- globalns = localns = {}
- elif globalns is None:
- globalns = localns
- elif localns is None:
- localns = globalns
- self.__forward_value__ = _type_check(
- eval(self.__forward_code__, globalns, localns),
- "Forward references must evaluate to types.")
- self.__forward_evaluated__ = True
- return self.__forward_value__
-
- def __instancecheck__(self, obj):
- raise TypeError("Forward references cannot be used with isinstance().")
-
- def __subclasscheck__(self, cls):
- raise TypeError("Forward references cannot be used with issubclass().")
-
- def __repr__(self):
- return '_ForwardRef(%r)' % (self.__forward_arg__,)
-
-
-class _TypeAlias(_TypingBase):
- """Internal helper class for defining generic variants of concrete types.
-
- Note that this is not a type; let's call it a pseudo-type. It cannot
- be used in instance and subclass checks in parameterized form, i.e.
- ``isinstance(42, Match[str])`` raises ``TypeError`` instead of returning
- ``False``.
- """
-
- __slots__ = ('name', 'type_var', 'impl_type', 'type_checker')
-
-
- def __init__(self, name, type_var, impl_type, type_checker):
- """Initializer.
-
- Args:
- name: The name, e.g. 'Pattern'.
- type_var: The type parameter, e.g. AnyStr, or the
- specific type, e.g. str.
- impl_type: The implementation type.
- type_checker: Function that takes an impl_type instance.
- and returns a value that should be a type_var instance.
- """
- assert isinstance(name, basestring), repr(name)
- assert isinstance(impl_type, type), repr(impl_type)
- assert not isinstance(impl_type, TypingMeta), repr(impl_type)
- assert isinstance(type_var, (type, _TypingBase)), repr(type_var)
- self.name = name
- self.type_var = type_var
- self.impl_type = impl_type
- self.type_checker = type_checker
-
- def __repr__(self):
- return "%s[%s]" % (self.name, _type_repr(self.type_var))
-
- def __getitem__(self, parameter):
- if not isinstance(self.type_var, TypeVar):
- raise TypeError("%s cannot be further parameterized." % self)
- if self.type_var.__constraints__ and isinstance(parameter, type):
- if not issubclass(parameter, self.type_var.__constraints__):
- raise TypeError("%s is not a valid substitution for %s." %
- (parameter, self.type_var))
- if isinstance(parameter, TypeVar) and parameter is not self.type_var:
- raise TypeError("%s cannot be re-parameterized." % self)
- return self.__class__(self.name, parameter,
- self.impl_type, self.type_checker)
-
- def __instancecheck__(self, obj):
- if not isinstance(self.type_var, TypeVar):
- raise TypeError("Parameterized type aliases cannot be used "
- "with isinstance().")
- return isinstance(obj, self.impl_type)
-
- def __subclasscheck__(self, cls):
- if not isinstance(self.type_var, TypeVar):
- raise TypeError("Parameterized type aliases cannot be used "
- "with issubclass().")
- return issubclass(cls, self.impl_type)
-
-
-def _get_type_vars(types, tvars):
- for t in types:
- if isinstance(t, TypingMeta) or isinstance(t, _TypingBase):
- t._get_type_vars(tvars)
-
-
-def _type_vars(types):
- tvars = []
- _get_type_vars(types, tvars)
- return tuple(tvars)
-
-
-def _eval_type(t, globalns, localns):
- if isinstance(t, TypingMeta) or isinstance(t, _TypingBase):
- return t._eval_type(globalns, localns)
- return t
-
-
-def _type_check(arg, msg):
- """Check that the argument is a type, and return it (internal helper).
-
- As a special case, accept None and return type(None) instead.
- Also, _TypeAlias instances (e.g. Match, Pattern) are acceptable.
-
- The msg argument is a human-readable error message, e.g.
-
- "Union[arg, ...]: arg should be a type."
-
- We append the repr() of the actual value (truncated to 100 chars).
- """
- if arg is None:
- return type(None)
- if isinstance(arg, basestring):
- arg = _ForwardRef(arg)
- if (isinstance(arg, _TypingBase) and type(arg).__name__ == '_ClassVar' or
- not isinstance(arg, (type, _TypingBase)) and not callable(arg)):
- raise TypeError(msg + " Got %.100r." % (arg,))
- # Bare Union etc. are not valid as type arguments
- if (type(arg).__name__ in ('_Union', '_Optional')
- and not getattr(arg, '__origin__', None)
- or isinstance(arg, TypingMeta) and _gorg(arg) in (Generic, _Protocol)):
- raise TypeError("Plain %s is not valid as type argument" % arg)
- return arg
-
-
-def _type_repr(obj):
- """Return the repr() of an object, special-casing types (internal helper).
-
- If obj is a type, we return a shorter version than the default
- type.__repr__, based on the module and qualified name, which is
- typically enough to uniquely identify a type. For everything
- else, we fall back on repr(obj).
- """
- if isinstance(obj, type) and not isinstance(obj, TypingMeta):
- if obj.__module__ == '__builtin__':
- return _qualname(obj)
- return '%s.%s' % (obj.__module__, _qualname(obj))
- if obj is Ellipsis:
- return('...')
- if isinstance(obj, types.FunctionType):
- return obj.__name__
- return repr(obj)
-
-
-class ClassVarMeta(TypingMeta):
- """Metaclass for _ClassVar"""
-
- def __new__(cls, name, bases, namespace):
- cls.assert_no_subclassing(bases)
- self = super(ClassVarMeta, cls).__new__(cls, name, bases, namespace)
- return self
-
-
-class _ClassVar(_FinalTypingBase):
- """Special type construct to mark class variables.
-
- An annotation wrapped in ClassVar indicates that a given
- attribute is intended to be used as a class variable and
- should not be set on instances of that class. Usage::
-
- class Starship:
- stats = {} # type: ClassVar[Dict[str, int]] # class variable
- damage = 10 # type: int # instance variable
-
- ClassVar accepts only types and cannot be further subscribed.
-
- Note that ClassVar is not a class itself, and should not
- be used with isinstance() or issubclass().
- """
-
- __metaclass__ = ClassVarMeta
- __slots__ = ('__type__',)
-
- def __init__(self, tp=None, _root=False):
- self.__type__ = tp
-
- def __getitem__(self, item):
- cls = type(self)
- if self.__type__ is None:
- return cls(_type_check(item,
- '{} accepts only types.'.format(cls.__name__[1:])),
- _root=True)
- raise TypeError('{} cannot be further subscripted'
- .format(cls.__name__[1:]))
-
- def _eval_type(self, globalns, localns):
- return type(self)(_eval_type(self.__type__, globalns, localns),
- _root=True)
-
- def __repr__(self):
- r = super(_ClassVar, self).__repr__()
- if self.__type__ is not None:
- r += '[{}]'.format(_type_repr(self.__type__))
- return r
-
- def __hash__(self):
- return hash((type(self).__name__, self.__type__))
-
- def __eq__(self, other):
- if not isinstance(other, _ClassVar):
- return NotImplemented
- if self.__type__ is not None:
- return self.__type__ == other.__type__
- return self is other
-
-ClassVar = _ClassVar(_root=True)
-
-
-class AnyMeta(TypingMeta):
- """Metaclass for Any."""
-
- def __new__(cls, name, bases, namespace):
- cls.assert_no_subclassing(bases)
- self = super(AnyMeta, cls).__new__(cls, name, bases, namespace)
- return self
-
-
-class _Any(_FinalTypingBase):
- """Special type indicating an unconstrained type.
-
- - Any is compatible with every type.
- - Any assumed to have all methods.
- - All values assumed to be instances of Any.
-
- Note that all the above statements are true from the point of view of
- static type checkers. At runtime, Any should not be used with instance
- or class checks.
- """
- __metaclass__ = AnyMeta
- __slots__ = ()
-
- def __instancecheck__(self, obj):
- raise TypeError("Any cannot be used with isinstance().")
-
- def __subclasscheck__(self, cls):
- raise TypeError("Any cannot be used with issubclass().")
-
-
-Any = _Any(_root=True)
-
-
-class TypeVarMeta(TypingMeta):
- def __new__(cls, name, bases, namespace):
- cls.assert_no_subclassing(bases)
- return super(TypeVarMeta, cls).__new__(cls, name, bases, namespace)
-
-
-class TypeVar(_TypingBase):
- """Type variable.
-
- Usage::
-
- T = TypeVar('T') # Can be anything
- A = TypeVar('A', str, bytes) # Must be str or bytes
-
- Type variables exist primarily for the benefit of static type
- checkers. They serve as the parameters for generic types as well
- as for generic function definitions. See class Generic for more
- information on generic types. Generic functions work as follows:
-
- def repeat(x: T, n: int) -> List[T]:
- '''Return a list containing n references to x.'''
- return [x]*n
-
- def longest(x: A, y: A) -> A:
- '''Return the longest of two strings.'''
- return x if len(x) >= len(y) else y
-
- The latter example's signature is essentially the overloading
- of (str, str) -> str and (bytes, bytes) -> bytes. Also note
- that if the arguments are instances of some subclass of str,
- the return type is still plain str.
-
- At runtime, isinstance(x, T) and issubclass(C, T) will raise TypeError.
-
- Type variables defined with covariant=True or contravariant=True
- can be used do declare covariant or contravariant generic types.
- See PEP 484 for more details. By default generic types are invariant
- in all type variables.
-
- Type variables can be introspected. e.g.:
-
- T.__name__ == 'T'
- T.__constraints__ == ()
- T.__covariant__ == False
- T.__contravariant__ = False
- A.__constraints__ == (str, bytes)
- """
-
- __metaclass__ = TypeVarMeta
- __slots__ = ('__name__', '__bound__', '__constraints__',
- '__covariant__', '__contravariant__')
-
- def __init__(self, name, *constraints, **kwargs):
- super(TypeVar, self).__init__(name, *constraints, **kwargs)
- bound = kwargs.get('bound', None)
- covariant = kwargs.get('covariant', False)
- contravariant = kwargs.get('contravariant', False)
- self.__name__ = name
- if covariant and contravariant:
- raise ValueError("Bivariant types are not supported.")
- self.__covariant__ = bool(covariant)
- self.__contravariant__ = bool(contravariant)
- if constraints and bound is not None:
- raise TypeError("Constraints cannot be combined with bound=...")
- if constraints and len(constraints) == 1:
- raise TypeError("A single constraint is not allowed")
- msg = "TypeVar(name, constraint, ...): constraints must be types."
- self.__constraints__ = tuple(_type_check(t, msg) for t in constraints)
- if bound:
- self.__bound__ = _type_check(bound, "Bound must be a type.")
- else:
- self.__bound__ = None
-
- def _get_type_vars(self, tvars):
- if self not in tvars:
- tvars.append(self)
-
- def __repr__(self):
- if self.__covariant__:
- prefix = '+'
- elif self.__contravariant__:
- prefix = '-'
- else:
- prefix = '~'
- return prefix + self.__name__
-
- def __instancecheck__(self, instance):
- raise TypeError("Type variables cannot be used with isinstance().")
-
- def __subclasscheck__(self, cls):
- raise TypeError("Type variables cannot be used with issubclass().")
-
-
-# Some unconstrained type variables. These are used by the container types.
-# (These are not for export.)
-T = TypeVar('T') # Any type.
-KT = TypeVar('KT') # Key type.
-VT = TypeVar('VT') # Value type.
-T_co = TypeVar('T_co', covariant=True) # Any type covariant containers.
-V_co = TypeVar('V_co', covariant=True) # Any type covariant containers.
-VT_co = TypeVar('VT_co', covariant=True) # Value type covariant containers.
-T_contra = TypeVar('T_contra', contravariant=True) # Ditto contravariant.
-
-# A useful type variable with constraints. This represents string types.
-# (This one *is* for export!)
-AnyStr = TypeVar('AnyStr', bytes, unicode)
-
-
-def _replace_arg(arg, tvars, args):
- """An internal helper function: replace arg if it is a type variable
- found in tvars with corresponding substitution from args or
- with corresponding substitution sub-tree if arg is a generic type.
- """
-
- if tvars is None:
- tvars = []
- if hasattr(arg, '_subs_tree'):
- return arg._subs_tree(tvars, args)
- if isinstance(arg, TypeVar):
- for i, tvar in enumerate(tvars):
- if arg == tvar:
- return args[i]
- return arg
-
-
-def _subs_tree(cls, tvars=None, args=None):
- """An internal helper function: calculate substitution tree
- for generic cls after replacing its type parameters with
- substitutions in tvars -> args (if any).
- Repeat the same following __origin__'s.
-
- Return a list of arguments with all possible substitutions
- performed. Arguments that are generic classes themselves are represented
- as tuples (so that no new classes are created by this function).
- For example: _subs_tree(List[Tuple[int, T]][str]) == [(Tuple, int, str)]
- """
-
- if cls.__origin__ is None:
- return cls
- # Make of chain of origins (i.e. cls -> cls.__origin__)
- current = cls.__origin__
- orig_chain = []
- while current.__origin__ is not None:
- orig_chain.append(current)
- current = current.__origin__
- # Replace type variables in __args__ if asked ...
- tree_args = []
- for arg in cls.__args__:
- tree_args.append(_replace_arg(arg, tvars, args))
- # ... then continue replacing down the origin chain.
- for ocls in orig_chain:
- new_tree_args = []
- for i, arg in enumerate(ocls.__args__):
- new_tree_args.append(_replace_arg(arg, ocls.__parameters__, tree_args))
- tree_args = new_tree_args
- return tree_args
-
-
-def _remove_dups_flatten(parameters):
- """An internal helper for Union creation and substitution: flatten Union's
- among parameters, then remove duplicates and strict subclasses.
- """
-
- # Flatten out Union[Union[...], ...].
- params = []
- for p in parameters:
- if isinstance(p, _Union) and p.__origin__ is Union:
- params.extend(p.__args__)
- elif isinstance(p, tuple) and len(p) > 0 and p[0] is Union:
- params.extend(p[1:])
- else:
- params.append(p)
- # Weed out strict duplicates, preserving the first of each occurrence.
- all_params = set(params)
- if len(all_params) < len(params):
- new_params = []
- for t in params:
- if t in all_params:
- new_params.append(t)
- all_params.remove(t)
- params = new_params
- assert not all_params, all_params
- # Weed out subclasses.
- # E.g. Union[int, Employee, Manager] == Union[int, Employee].
- # If object is present it will be sole survivor among proper classes.
- # Never discard type variables.
- # (In particular, Union[str, AnyStr] != AnyStr.)
- all_params = set(params)
- for t1 in params:
- if not isinstance(t1, type):
- continue
- if any(isinstance(t2, type) and issubclass(t1, t2)
- for t2 in all_params - {t1}
- if not (isinstance(t2, GenericMeta) and
- t2.__origin__ is not None)):
- all_params.remove(t1)
- return tuple(t for t in params if t in all_params)
-
-
-def _check_generic(cls, parameters):
- # Check correct count for parameters of a generic cls (internal helper).
- if not cls.__parameters__:
- raise TypeError("%s is not a generic class" % repr(cls))
- alen = len(parameters)
- elen = len(cls.__parameters__)
- if alen != elen:
- raise TypeError("Too %s parameters for %s; actual %s, expected %s" %
- ("many" if alen > elen else "few", repr(cls), alen, elen))
-
-
-_cleanups = []
-
-
-def _tp_cache(func):
- maxsize = 128
- cache = {}
- _cleanups.append(cache.clear)
-
- @functools.wraps(func)
- def inner(*args):
- key = args
- try:
- return cache[key]
- except TypeError:
- # Assume it's an unhashable argument.
- return func(*args)
- except KeyError:
- value = func(*args)
- if len(cache) >= maxsize:
- # If the cache grows too much, just start over.
- cache.clear()
- cache[key] = value
- return value
-
- return inner
-
-
-class UnionMeta(TypingMeta):
- """Metaclass for Union."""
-
- def __new__(cls, name, bases, namespace):
- cls.assert_no_subclassing(bases)
- return super(UnionMeta, cls).__new__(cls, name, bases, namespace)
-
-
-class _Union(_FinalTypingBase):
- """Union type; Union[X, Y] means either X or Y.
-
- To define a union, use e.g. Union[int, str]. Details:
-
- - The arguments must be types and there must be at least one.
-
- - None as an argument is a special case and is replaced by
- type(None).
-
- - Unions of unions are flattened, e.g.::
-
- Union[Union[int, str], float] == Union[int, str, float]
-
- - Unions of a single argument vanish, e.g.::
-
- Union[int] == int # The constructor actually returns int
-
- - Redundant arguments are skipped, e.g.::
-
- Union[int, str, int] == Union[int, str]
-
- - When comparing unions, the argument order is ignored, e.g.::
-
- Union[int, str] == Union[str, int]
-
- - When two arguments have a subclass relationship, the least
- derived argument is kept, e.g.::
-
- class Employee: pass
- class Manager(Employee): pass
- Union[int, Employee, Manager] == Union[int, Employee]
- Union[Manager, int, Employee] == Union[int, Employee]
- Union[Employee, Manager] == Employee
-
- - Similar for object::
-
- Union[int, object] == object
-
- - You cannot subclass or instantiate a union.
-
- - You can use Optional[X] as a shorthand for Union[X, None].
- """
-
- __metaclass__ = UnionMeta
- __slots__ = ('__parameters__', '__args__', '__origin__', '__tree_hash__')
-
- def __new__(cls, parameters=None, origin=None, *args, **kwds):
- self = super(_Union, cls).__new__(cls, parameters, origin, *args, **kwds)
- if origin is None:
- self.__parameters__ = None
- self.__args__ = None
- self.__origin__ = None
- self.__tree_hash__ = hash(frozenset(('Union',)))
- return self
- if not isinstance(parameters, tuple):
- raise TypeError("Expected parameters=<tuple>")
- if origin is Union:
- parameters = _remove_dups_flatten(parameters)
- # It's not a union if there's only one type left.
- if len(parameters) == 1:
- return parameters[0]
- self.__parameters__ = _type_vars(parameters)
- self.__args__ = parameters
- self.__origin__ = origin
- # Pre-calculate the __hash__ on instantiation.
- # This improves speed for complex substitutions.
- subs_tree = self._subs_tree()
- if isinstance(subs_tree, tuple):
- self.__tree_hash__ = hash(frozenset(subs_tree))
- else:
- self.__tree_hash__ = hash(subs_tree)
- return self
-
- def _eval_type(self, globalns, localns):
- if self.__args__ is None:
- return self
- ev_args = tuple(_eval_type(t, globalns, localns) for t in self.__args__)
- ev_origin = _eval_type(self.__origin__, globalns, localns)
- if ev_args == self.__args__ and ev_origin == self.__origin__:
- # Everything is already evaluated.
- return self
- return self.__class__(ev_args, ev_origin, _root=True)
-
- def _get_type_vars(self, tvars):
- if self.__origin__ and self.__parameters__:
- _get_type_vars(self.__parameters__, tvars)
-
- def __repr__(self):
- if self.__origin__ is None:
- return super(_Union, self).__repr__()
- tree = self._subs_tree()
- if not isinstance(tree, tuple):
- return repr(tree)
- return tree[0]._tree_repr(tree)
-
- def _tree_repr(self, tree):
- arg_list = []
- for arg in tree[1:]:
- if not isinstance(arg, tuple):
- arg_list.append(_type_repr(arg))
- else:
- arg_list.append(arg[0]._tree_repr(arg))
- return super(_Union, self).__repr__() + '[%s]' % ', '.join(arg_list)
-
- @_tp_cache
- def __getitem__(self, parameters):
- if parameters == ():
- raise TypeError("Cannot take a Union of no types.")
- if not isinstance(parameters, tuple):
- parameters = (parameters,)
- if self.__origin__ is None:
- msg = "Union[arg, ...]: each arg must be a type."
- else:
- msg = "Parameters to generic types must be types."
- parameters = tuple(_type_check(p, msg) for p in parameters)
- if self is not Union:
- _check_generic(self, parameters)
- return self.__class__(parameters, origin=self, _root=True)
-
- def _subs_tree(self, tvars=None, args=None):
- if self is Union:
- return Union # Nothing to substitute
- tree_args = _subs_tree(self, tvars, args)
- tree_args = _remove_dups_flatten(tree_args)
- if len(tree_args) == 1:
- return tree_args[0] # Union of a single type is that type
- return (Union,) + tree_args
-
- def __eq__(self, other):
- if not isinstance(other, _Union):
- return self._subs_tree() == other
- return self.__tree_hash__ == other.__tree_hash__
-
- def __hash__(self):
- return self.__tree_hash__
-
- def __instancecheck__(self, obj):
- raise TypeError("Unions cannot be used with isinstance().")
-
- def __subclasscheck__(self, cls):
- raise TypeError("Unions cannot be used with issubclass().")
-
-
-Union = _Union(_root=True)
-
-
-class OptionalMeta(TypingMeta):
- """Metaclass for Optional."""
-
- def __new__(cls, name, bases, namespace):
- cls.assert_no_subclassing(bases)
- return super(OptionalMeta, cls).__new__(cls, name, bases, namespace)
-
-
-class _Optional(_FinalTypingBase):
- """Optional type.
-
- Optional[X] is equivalent to Union[X, None].
- """
-
- __metaclass__ = OptionalMeta
- __slots__ = ()
-
- @_tp_cache
- def __getitem__(self, arg):
- arg = _type_check(arg, "Optional[t] requires a single type.")
- return Union[arg, type(None)]
-
-
-Optional = _Optional(_root=True)
-
-
-def _gorg(a):
- """Return the farthest origin of a generic class (internal helper)."""
- assert isinstance(a, GenericMeta)
- while a.__origin__ is not None:
- a = a.__origin__
- return a
-
-
-def _geqv(a, b):
- """Return whether two generic classes are equivalent (internal helper).
-
- The intention is to consider generic class X and any of its
- parameterized forms (X[T], X[int], etc.) as equivalent.
-
- However, X is not equivalent to a subclass of X.
-
- The relation is reflexive, symmetric and transitive.
- """
- assert isinstance(a, GenericMeta) and isinstance(b, GenericMeta)
- # Reduce each to its origin.
- return _gorg(a) is _gorg(b)
-
-
-def _next_in_mro(cls):
- """Helper for Generic.__new__.
-
- Returns the class after the last occurrence of Generic or
- Generic[...] in cls.__mro__.
- """
- next_in_mro = object
- # Look for the last occurrence of Generic or Generic[...].
- for i, c in enumerate(cls.__mro__[:-1]):
- if isinstance(c, GenericMeta) and _gorg(c) is Generic:
- next_in_mro = cls.__mro__[i+1]
- return next_in_mro
-
-
-def _valid_for_check(cls):
- """An internal helper to prohibit isinstance([1], List[str]) etc."""
- if cls is Generic:
- raise TypeError("Class %r cannot be used with class "
- "or instance checks" % cls)
- if (cls.__origin__ is not None and
- sys._getframe(3).f_globals['__name__'] not in ['abc', 'functools']):
- raise TypeError("Parameterized generics cannot be used with class "
- "or instance checks")
-
-
-def _make_subclasshook(cls):
- """Construct a __subclasshook__ callable that incorporates
- the associated __extra__ class in subclass checks performed
- against cls.
- """
- if isinstance(cls.__extra__, abc.ABCMeta):
- # The logic mirrors that of ABCMeta.__subclasscheck__.
- # Registered classes need not be checked here because
- # cls and its extra share the same _abc_registry.
- def __extrahook__(cls, subclass):
- _valid_for_check(cls)
- res = cls.__extra__.__subclasshook__(subclass)
- if res is not NotImplemented:
- return res
- if cls.__extra__ in getattr(subclass, '__mro__', ()):
- return True
- for scls in cls.__extra__.__subclasses__():
- if isinstance(scls, GenericMeta):
- continue
- if issubclass(subclass, scls):
- return True
- return NotImplemented
- else:
- # For non-ABC extras we'll just call issubclass().
- def __extrahook__(cls, subclass):
- _valid_for_check(cls)
- if cls.__extra__ and issubclass(subclass, cls.__extra__):
- return True
- return NotImplemented
- return classmethod(__extrahook__)
-
-
-class GenericMeta(TypingMeta, abc.ABCMeta):
- """Metaclass for generic types."""
-
- def __new__(cls, name, bases, namespace,
- tvars=None, args=None, origin=None, extra=None, orig_bases=None):
- if tvars is not None:
- # Called from __getitem__() below.
- assert origin is not None
- assert all(isinstance(t, TypeVar) for t in tvars), tvars
- else:
- # Called from class statement.
- assert tvars is None, tvars
- assert args is None, args
- assert origin is None, origin
-
- # Get the full set of tvars from the bases.
- tvars = _type_vars(bases)
- # Look for Generic[T1, ..., Tn].
- # If found, tvars must be a subset of it.
- # If not found, tvars is it.
- # Also check for and reject plain Generic,
- # and reject multiple Generic[...].
- gvars = None
- for base in bases:
- if base is Generic:
- raise TypeError("Cannot inherit from plain Generic")
- if (isinstance(base, GenericMeta) and
- base.__origin__ is Generic):
- if gvars is not None:
- raise TypeError(
- "Cannot inherit from Generic[...] multiple types.")
- gvars = base.__parameters__
- if gvars is None:
- gvars = tvars
- else:
- tvarset = set(tvars)
- gvarset = set(gvars)
- if not tvarset <= gvarset:
- raise TypeError(
- "Some type variables (%s) "
- "are not listed in Generic[%s]" %
- (", ".join(str(t) for t in tvars if t not in gvarset),
- ", ".join(str(g) for g in gvars)))
- tvars = gvars
-
- initial_bases = bases
- if extra is None:
- extra = namespace.get('__extra__')
- if extra is not None and type(extra) is abc.ABCMeta and extra not in bases:
- bases = (extra,) + bases
- bases = tuple(_gorg(b) if isinstance(b, GenericMeta) else b for b in bases)
-
- # remove bare Generic from bases if there are other generic bases
- if any(isinstance(b, GenericMeta) and b is not Generic for b in bases):
- bases = tuple(b for b in bases if b is not Generic)
- self = super(GenericMeta, cls).__new__(cls, name, bases, namespace)
-
- self.__parameters__ = tvars
- # Be prepared that GenericMeta will be subclassed by TupleMeta
- # and CallableMeta, those two allow ..., (), or [] in __args___.
- self.__args__ = tuple(Ellipsis if a is _TypingEllipsis else
- () if a is _TypingEmpty else
- a for a in args) if args else None
- self.__origin__ = origin
- self.__extra__ = extra
- # Speed hack (https://github.com/python/typing/issues/196).
- self.__next_in_mro__ = _next_in_mro(self)
- # Preserve base classes on subclassing (__bases__ are type erased now).
- if orig_bases is None:
- self.__orig_bases__ = initial_bases
-
- # This allows unparameterized generic collections to be used
- # with issubclass() and isinstance() in the same way as their
- # collections.abc counterparts (e.g., isinstance([], Iterable)).
- if ('__subclasshook__' not in namespace and extra # allow overriding
- or hasattr(self.__subclasshook__, '__name__') and
- self.__subclasshook__.__name__ == '__extrahook__'):
- self.__subclasshook__ = _make_subclasshook(self)
-
- if origin and hasattr(origin, '__qualname__'): # Fix for Python 3.2.
- self.__qualname__ = origin.__qualname__
- self.__tree_hash__ = hash(self._subs_tree()) if origin else hash((self.__name__,))
- return self
-
- def __init__(self, *args, **kwargs):
- super(GenericMeta, self).__init__(*args, **kwargs)
- if isinstance(self.__extra__, abc.ABCMeta):
- self._abc_registry = self.__extra__._abc_registry
-
- def _get_type_vars(self, tvars):
- if self.__origin__ and self.__parameters__:
- _get_type_vars(self.__parameters__, tvars)
-
- def _eval_type(self, globalns, localns):
- ev_origin = (self.__origin__._eval_type(globalns, localns)
- if self.__origin__ else None)
- ev_args = tuple(_eval_type(a, globalns, localns) for a
- in self.__args__) if self.__args__ else None
- if ev_origin == self.__origin__ and ev_args == self.__args__:
- return self
- return self.__class__(self.__name__,
- self.__bases__,
- dict(self.__dict__),
- tvars=_type_vars(ev_args) if ev_args else None,
- args=ev_args,
- origin=ev_origin,
- extra=self.__extra__,
- orig_bases=self.__orig_bases__)
-
- def __repr__(self):
- if self.__origin__ is None:
- return super(GenericMeta, self).__repr__()
- return self._tree_repr(self._subs_tree())
-
- def _tree_repr(self, tree):
- arg_list = []
- for arg in tree[1:]:
- if arg == ():
- arg_list.append('()')
- elif not isinstance(arg, tuple):
- arg_list.append(_type_repr(arg))
- else:
- arg_list.append(arg[0]._tree_repr(arg))
- return super(GenericMeta, self).__repr__() + '[%s]' % ', '.join(arg_list)
-
- def _subs_tree(self, tvars=None, args=None):
- if self.__origin__ is None:
- return self
- tree_args = _subs_tree(self, tvars, args)
- return (_gorg(self),) + tuple(tree_args)
-
- def __eq__(self, other):
- if not isinstance(other, GenericMeta):
- return NotImplemented
- if self.__origin__ is None or other.__origin__ is None:
- return self is other
- return self.__tree_hash__ == other.__tree_hash__
-
- def __hash__(self):
- return self.__tree_hash__
-
- @_tp_cache
- def __getitem__(self, params):
- if not isinstance(params, tuple):
- params = (params,)
- if not params and not _gorg(self) is Tuple:
- raise TypeError(
- "Parameter list to %s[...] cannot be empty" % _qualname(self))
- msg = "Parameters to generic types must be types."
- params = tuple(_type_check(p, msg) for p in params)
- if self is Generic:
- # Generic can only be subscripted with unique type variables.
- if not all(isinstance(p, TypeVar) for p in params):
- raise TypeError(
- "Parameters to Generic[...] must all be type variables")
- if len(set(params)) != len(params):
- raise TypeError(
- "Parameters to Generic[...] must all be unique")
- tvars = params
- args = params
- elif self in (Tuple, Callable):
- tvars = _type_vars(params)
- args = params
- elif self is _Protocol:
- # _Protocol is internal, don't check anything.
- tvars = params
- args = params
- elif self.__origin__ in (Generic, _Protocol):
- # Can't subscript Generic[...] or _Protocol[...].
- raise TypeError("Cannot subscript already-subscripted %s" %
- repr(self))
- else:
- # Subscripting a regular Generic subclass.
- _check_generic(self, params)
- tvars = _type_vars(params)
- args = params
- return self.__class__(self.__name__,
- self.__bases__,
- dict(self.__dict__),
- tvars=tvars,
- args=args,
- origin=self,
- extra=self.__extra__,
- orig_bases=self.__orig_bases__)
-
- def __instancecheck__(self, instance):
- # Since we extend ABC.__subclasscheck__ and
- # ABC.__instancecheck__ inlines the cache checking done by the
- # latter, we must extend __instancecheck__ too. For simplicity
- # we just skip the cache check -- instance checks for generic
- # classes are supposed to be rare anyways.
- if not isinstance(instance, type):
- return issubclass(instance.__class__, self)
- return False
-
- def __copy__(self):
- return self.__class__(self.__name__, self.__bases__, dict(self.__dict__),
- self.__parameters__, self.__args__, self.__origin__,
- self.__extra__, self.__orig_bases__)
-
-
-# Prevent checks for Generic to crash when defining Generic.
-Generic = None
-
-
-def _generic_new(base_cls, cls, *args, **kwds):
- # Assure type is erased on instantiation,
- # but attempt to store it in __orig_class__
- if cls.__origin__ is None:
- return base_cls.__new__(cls)
- else:
- origin = _gorg(cls)
- obj = base_cls.__new__(origin)
- try:
- obj.__orig_class__ = cls
- except AttributeError:
- pass
- obj.__init__(*args, **kwds)
- return obj
-
-
-class Generic(object):
- """Abstract base class for generic types.
-
- A generic type is typically declared by inheriting from
- this class parameterized with one or more type variables.
- For example, a generic mapping type might be defined as::
-
- class Mapping(Generic[KT, VT]):
- def __getitem__(self, key: KT) -> VT:
- ...
- # Etc.
-
- This class can then be used as follows::
-
- def lookup_name(mapping: Mapping[KT, VT], key: KT, default: VT) -> VT:
- try:
- return mapping[key]
- except KeyError:
- return default
- """
-
- __metaclass__ = GenericMeta
- __slots__ = ()
-
- def __new__(cls, *args, **kwds):
- if _geqv(cls, Generic):
- raise TypeError("Type Generic cannot be instantiated; "
- "it can be used only as a base class")
- return _generic_new(cls.__next_in_mro__, cls, *args, **kwds)
-
-
-class _TypingEmpty(object):
- """Internal placeholder for () or []. Used by TupleMeta and CallableMeta
- to allow empty list/tuple in specific places, without allowing them
- to sneak in where prohibited.
- """
-
-
-class _TypingEllipsis(object):
- """Internal placeholder for ... (ellipsis)."""
-
-
-class TupleMeta(GenericMeta):
- """Metaclass for Tuple (internal)."""
-
- @_tp_cache
- def __getitem__(self, parameters):
- if self.__origin__ is not None or not _geqv(self, Tuple):
- # Normal generic rules apply if this is not the first subscription
- # or a subscription of a subclass.
- return super(TupleMeta, self).__getitem__(parameters)
- if parameters == ():
- return super(TupleMeta, self).__getitem__((_TypingEmpty,))
- if not isinstance(parameters, tuple):
- parameters = (parameters,)
- if len(parameters) == 2 and parameters[1] is Ellipsis:
- msg = "Tuple[t, ...]: t must be a type."
- p = _type_check(parameters[0], msg)
- return super(TupleMeta, self).__getitem__((p, _TypingEllipsis))
- msg = "Tuple[t0, t1, ...]: each t must be a type."
- parameters = tuple(_type_check(p, msg) for p in parameters)
- return super(TupleMeta, self).__getitem__(parameters)
-
- def __instancecheck__(self, obj):
- if self.__args__ == None:
- return isinstance(obj, tuple)
- raise TypeError("Parameterized Tuple cannot be used "
- "with isinstance().")
-
- def __subclasscheck__(self, cls):
- if self.__args__ == None:
- return issubclass(cls, tuple)
- raise TypeError("Parameterized Tuple cannot be used "
- "with issubclass().")
-
-
-class Tuple(tuple):
- """Tuple type; Tuple[X, Y] is the cross-product type of X and Y.
-
- Example: Tuple[T1, T2] is a tuple of two elements corresponding
- to type variables T1 and T2. Tuple[int, float, str] is a tuple
- of an int, a float and a string.
-
- To specify a variable-length tuple of homogeneous type, use Tuple[T, ...].
- """
-
- __metaclass__ = TupleMeta
- __extra__ = tuple
- __slots__ = ()
-
- def __new__(cls, *args, **kwds):
- if _geqv(cls, Tuple):
- raise TypeError("Type Tuple cannot be instantiated; "
- "use tuple() instead")
- return _generic_new(tuple, cls, *args, **kwds)
-
-
-class CallableMeta(GenericMeta):
- """ Metaclass for Callable."""
-
- def __repr__(self):
- if self.__origin__ is None:
- return super(CallableMeta, self).__repr__()
- return self._tree_repr(self._subs_tree())
-
- def _tree_repr(self, tree):
- if _gorg(self) is not Callable:
- return super(CallableMeta, self)._tree_repr(tree)
- # For actual Callable (not its subclass) we override
- # super(CallableMeta, self)._tree_repr() for nice formatting.
- arg_list = []
- for arg in tree[1:]:
- if not isinstance(arg, tuple):
- arg_list.append(_type_repr(arg))
- else:
- arg_list.append(arg[0]._tree_repr(arg))
- if arg_list[0] == '...':
- return repr(tree[0]) + '[..., %s]' % arg_list[1]
- return (repr(tree[0]) +
- '[[%s], %s]' % (', '.join(arg_list[:-1]), arg_list[-1]))
-
- def __getitem__(self, parameters):
- """A thin wrapper around __getitem_inner__ to provide the latter
- with hashable arguments to improve speed.
- """
-
- if self.__origin__ is not None or not _geqv(self, Callable):
- return super(CallableMeta, self).__getitem__(parameters)
- if not isinstance(parameters, tuple) or len(parameters) != 2:
- raise TypeError("Callable must be used as "
- "Callable[[arg, ...], result].")
- args, result = parameters
- if args is Ellipsis:
- parameters = (Ellipsis, result)
- else:
- if not isinstance(args, list):
- raise TypeError("Callable[args, result]: args must be a list."
- " Got %.100r." % (args,))
- parameters = (tuple(args), result)
- return self.__getitem_inner__(parameters)
-
- @_tp_cache
- def __getitem_inner__(self, parameters):
- args, result = parameters
- msg = "Callable[args, result]: result must be a type."
- result = _type_check(result, msg)
- if args is Ellipsis:
- return super(CallableMeta, self).__getitem__((_TypingEllipsis, result))
- msg = "Callable[[arg, ...], result]: each arg must be a type."
- args = tuple(_type_check(arg, msg) for arg in args)
- parameters = args + (result,)
- return super(CallableMeta, self).__getitem__(parameters)
-
-
-class Callable(object):
- """Callable type; Callable[[int], str] is a function of (int) -> str.
-
- The subscription syntax must always be used with exactly two
- values: the argument list and the return type. The argument list
- must be a list of types or ellipsis; the return type must be a single type.
-
- There is no syntax to indicate optional or keyword arguments,
- such function types are rarely used as callback types.
- """
-
- __metaclass__ = CallableMeta
- __extra__ = collections_abc.Callable
- __slots__ = ()
-
- def __new__(cls, *args, **kwds):
- if _geqv(cls, Callable):
- raise TypeError("Type Callable cannot be instantiated; "
- "use a non-abstract subclass instead")
- return _generic_new(cls.__next_in_mro__, cls, *args, **kwds)
-
-
-def cast(typ, val):
- """Cast a value to a type.
-
- This returns the value unchanged. To the type checker this
- signals that the return value has the designated type, but at
- runtime we intentionally don't check anything (we want this
- to be as fast as possible).
- """
- return val
-
-
-def _get_defaults(func):
- """Internal helper to extract the default arguments, by name."""
- code = func.__code__
- pos_count = code.co_argcount
- arg_names = code.co_varnames
- arg_names = arg_names[:pos_count]
- defaults = func.__defaults__ or ()
- kwdefaults = func.__kwdefaults__
- res = dict(kwdefaults) if kwdefaults else {}
- pos_offset = pos_count - len(defaults)
- for name, value in zip(arg_names[pos_offset:], defaults):
- assert name not in res
- res[name] = value
- return res
-
-
-def get_type_hints(obj, globalns=None, localns=None):
- """In Python 2 this is not supported and always returns None."""
- return None
-
-
-def no_type_check(arg):
- """Decorator to indicate that annotations are not type hints.
-
- The argument must be a class or function; if it is a class, it
- applies recursively to all methods and classes defined in that class
- (but not to methods defined in its superclasses or subclasses).
-
- This mutates the function(s) or class(es) in place.
- """
- if isinstance(arg, type):
- arg_attrs = arg.__dict__.copy()
- for attr, val in arg.__dict__.items():
- if val in arg.__bases__:
- arg_attrs.pop(attr)
- for obj in arg_attrs.values():
- if isinstance(obj, types.FunctionType):
- obj.__no_type_check__ = True
- if isinstance(obj, type):
- no_type_check(obj)
- try:
- arg.__no_type_check__ = True
- except TypeError: # built-in classes
- pass
- return arg
-
-
-def no_type_check_decorator(decorator):
- """Decorator to give another decorator the @no_type_check effect.
-
- This wraps the decorator with something that wraps the decorated
- function in @no_type_check.
- """
-
- @functools.wraps(decorator)
- def wrapped_decorator(*args, **kwds):
- func = decorator(*args, **kwds)
- func = no_type_check(func)
- return func
-
- return wrapped_decorator
-
-
-def _overload_dummy(*args, **kwds):
- """Helper for @overload to raise when called."""
- raise NotImplementedError(
- "You should not call an overloaded function. "
- "A series of @overload-decorated functions "
- "outside a stub module should always be followed "
- "by an implementation that is not @overload-ed.")
-
-
-def overload(func):
- """Decorator for overloaded functions/methods.
-
- In a stub file, place two or more stub definitions for the same
- function in a row, each decorated with @overload. For example:
-
- @overload
- def utf8(value: None) -> None: ...
- @overload
- def utf8(value: bytes) -> bytes: ...
- @overload
- def utf8(value: str) -> bytes: ...
-
- In a non-stub file (i.e. a regular .py file), do the same but
- follow it with an implementation. The implementation should *not*
- be decorated with @overload. For example:
-
- @overload
- def utf8(value: None) -> None: ...
- @overload
- def utf8(value: bytes) -> bytes: ...
- @overload
- def utf8(value: str) -> bytes: ...
- def utf8(value):
- # implementation goes here
- """
- return _overload_dummy
-
-
-class _ProtocolMeta(GenericMeta):
- """Internal metaclass for _Protocol.
-
- This exists so _Protocol classes can be generic without deriving
- from Generic.
- """
-
- def __instancecheck__(self, obj):
- if _Protocol not in self.__bases__:
- return super(_ProtocolMeta, self).__instancecheck__(obj)
- raise TypeError("Protocols cannot be used with isinstance().")
-
- def __subclasscheck__(self, cls):
- if not self._is_protocol:
- # No structural checks since this isn't a protocol.
- return NotImplemented
-
- if self is _Protocol:
- # Every class is a subclass of the empty protocol.
- return True
-
- # Find all attributes defined in the protocol.
- attrs = self._get_protocol_attrs()
-
- for attr in attrs:
- if not any(attr in d.__dict__ for d in cls.__mro__):
- return False
- return True
-
- def _get_protocol_attrs(self):
- # Get all Protocol base classes.
- protocol_bases = []
- for c in self.__mro__:
- if getattr(c, '_is_protocol', False) and c.__name__ != '_Protocol':
- protocol_bases.append(c)
-
- # Get attributes included in protocol.
- attrs = set()
- for base in protocol_bases:
- for attr in base.__dict__.keys():
- # Include attributes not defined in any non-protocol bases.
- for c in self.__mro__:
- if (c is not base and attr in c.__dict__ and
- not getattr(c, '_is_protocol', False)):
- break
- else:
- if (not attr.startswith('_abc_') and
- attr != '__abstractmethods__' and
- attr != '_is_protocol' and
- attr != '__dict__' and
- attr != '__args__' and
- attr != '__slots__' and
- attr != '_get_protocol_attrs' and
- attr != '__next_in_mro__' and
- attr != '__parameters__' and
- attr != '__origin__' and
- attr != '__orig_bases__' and
- attr != '__extra__' and
- attr != '__tree_hash__' and
- attr != '__module__'):
- attrs.add(attr)
-
- return attrs
-
-
-class _Protocol(object):
- """Internal base class for protocol classes.
-
- This implements a simple-minded structural issubclass check
- (similar but more general than the one-offs in collections.abc
- such as Hashable).
- """
-
- __metaclass__ = _ProtocolMeta
- __slots__ = ()
-
- _is_protocol = True
-
-
-# Various ABCs mimicking those in collections.abc.
-# A few are simply re-exported for completeness.
-
-Hashable = collections_abc.Hashable # Not generic.
-
-
-class Iterable(Generic[T_co]):
- __slots__ = ()
- __extra__ = collections_abc.Iterable
-
-
-class Iterator(Iterable[T_co]):
- __slots__ = ()
- __extra__ = collections_abc.Iterator
-
-
-class SupportsInt(_Protocol):
- __slots__ = ()
-
- @abstractmethod
- def __int__(self):
- pass
-
-
-class SupportsFloat(_Protocol):
- __slots__ = ()
-
- @abstractmethod
- def __float__(self):
- pass
-
-
-class SupportsComplex(_Protocol):
- __slots__ = ()
-
- @abstractmethod
- def __complex__(self):
- pass
-
-
-class SupportsAbs(_Protocol[T_co]):
- __slots__ = ()
-
- @abstractmethod
- def __abs__(self):
- pass
-
-
-if hasattr(collections_abc, 'Reversible'):
- class Reversible(Iterable[T_co]):
- __slots__ = ()
- __extra__ = collections_abc.Reversible
-else:
- class Reversible(_Protocol[T_co]):
- __slots__ = ()
-
- @abstractmethod
- def __reversed__(self):
- pass
-
-
-Sized = collections_abc.Sized # Not generic.
-
-
-class Container(Generic[T_co]):
- __slots__ = ()
- __extra__ = collections_abc.Container
-
-
-# Callable was defined earlier.
-
-
-class AbstractSet(Sized, Iterable[T_co], Container[T_co]):
- __slots__ = ()
- __extra__ = collections_abc.Set
-
-
-class MutableSet(AbstractSet[T]):
- __slots__ = ()
- __extra__ = collections_abc.MutableSet
-
-
-# NOTE: It is only covariant in the value type.
-class Mapping(Sized, Iterable[KT], Container[KT], Generic[KT, VT_co]):
- __slots__ = ()
- __extra__ = collections_abc.Mapping
-
-
-class MutableMapping(Mapping[KT, VT]):
- __slots__ = ()
- __extra__ = collections_abc.MutableMapping
-
-
-if hasattr(collections_abc, 'Reversible'):
- class Sequence(Sized, Reversible[T_co], Container[T_co]):
- __slots__ = ()
- __extra__ = collections_abc.Sequence
-else:
- class Sequence(Sized, Iterable[T_co], Container[T_co]):
- __slots__ = ()
- __extra__ = collections_abc.Sequence
-
-
-class MutableSequence(Sequence[T]):
- __slots__ = ()
- __extra__ = collections_abc.MutableSequence
-
-
-class ByteString(Sequence[int]):
- pass
-
-
-ByteString.register(str)
-ByteString.register(bytearray)
-
-
-class List(list, MutableSequence[T]):
- __slots__ = ()
- __extra__ = list
-
- def __new__(cls, *args, **kwds):
- if _geqv(cls, List):
- raise TypeError("Type List cannot be instantiated; "
- "use list() instead")
- return _generic_new(list, cls, *args, **kwds)
-
-
-class Set(set, MutableSet[T]):
- __slots__ = ()
- __extra__ = set
-
- def __new__(cls, *args, **kwds):
- if _geqv(cls, Set):
- raise TypeError("Type Set cannot be instantiated; "
- "use set() instead")
- return _generic_new(set, cls, *args, **kwds)
-
-
-class FrozenSet(frozenset, AbstractSet[T_co]):
- __slots__ = ()
- __extra__ = frozenset
-
- def __new__(cls, *args, **kwds):
- if _geqv(cls, FrozenSet):
- raise TypeError("Type FrozenSet cannot be instantiated; "
- "use frozenset() instead")
- return _generic_new(frozenset, cls, *args, **kwds)
-
-
-class MappingView(Sized, Iterable[T_co]):
- __slots__ = ()
- __extra__ = collections_abc.MappingView
-
-
-class KeysView(MappingView[KT], AbstractSet[KT]):
- __slots__ = ()
- __extra__ = collections_abc.KeysView
-
-
-class ItemsView(MappingView[Tuple[KT, VT_co]],
- AbstractSet[Tuple[KT, VT_co]],
- Generic[KT, VT_co]):
- __slots__ = ()
- __extra__ = collections_abc.ItemsView
-
-
-class ValuesView(MappingView[VT_co]):
- __slots__ = ()
- __extra__ = collections_abc.ValuesView
-
-
-class Dict(dict, MutableMapping[KT, VT]):
- __slots__ = ()
- __extra__ = dict
-
- def __new__(cls, *args, **kwds):
- if _geqv(cls, Dict):
- raise TypeError("Type Dict cannot be instantiated; "
- "use dict() instead")
- return _generic_new(dict, cls, *args, **kwds)
-
-
-class DefaultDict(collections.defaultdict, MutableMapping[KT, VT]):
- __slots__ = ()
- __extra__ = collections.defaultdict
-
- def __new__(cls, *args, **kwds):
- if _geqv(cls, DefaultDict):
- raise TypeError("Type DefaultDict cannot be instantiated; "
- "use collections.defaultdict() instead")
- return _generic_new(collections.defaultdict, cls, *args, **kwds)
-
-
-# Determine what base class to use for Generator.
-if hasattr(collections_abc, 'Generator'):
- # Sufficiently recent versions of 3.5 have a Generator ABC.
- _G_base = collections_abc.Generator
-else:
- # Fall back on the exact type.
- _G_base = types.GeneratorType
-
-
-class Generator(Iterator[T_co], Generic[T_co, T_contra, V_co]):
- __slots__ = ()
- __extra__ = _G_base
-
- def __new__(cls, *args, **kwds):
- if _geqv(cls, Generator):
- raise TypeError("Type Generator cannot be instantiated; "
- "create a subclass instead")
- return _generic_new(_G_base, cls, *args, **kwds)
-
-
-# Internal type variable used for Type[].
-CT_co = TypeVar('CT_co', covariant=True, bound=type)
-
-
-# This is not a real generic class. Don't use outside annotations.
-class Type(Generic[CT_co]):
- """A special construct usable to annotate class objects.
-
- For example, suppose we have the following classes::
-
- class User: ... # Abstract base for User classes
- class BasicUser(User): ...
- class ProUser(User): ...
- class TeamUser(User): ...
-
- And a function that takes a class argument that's a subclass of
- User and returns an instance of the corresponding class::
-
- U = TypeVar('U', bound=User)
- def new_user(user_class: Type[U]) -> U:
- user = user_class()
- # (Here we could write the user object to a database)
- return user
-
- joe = new_user(BasicUser)
-
- At this point the type checker knows that joe has type BasicUser.
- """
- __slots__ = ()
- __extra__ = type
-
-
-def NamedTuple(typename, fields):
- """Typed version of namedtuple.
-
- Usage::
-
- Employee = typing.NamedTuple('Employee', [('name', str), 'id', int)])
-
- This is equivalent to::
-
- Employee = collections.namedtuple('Employee', ['name', 'id'])
-
- The resulting class has one extra attribute: _field_types,
- giving a dict mapping field names to types. (The field names
- are in the _fields attribute, which is part of the namedtuple
- API.)
- """
- fields = [(n, t) for n, t in fields]
- cls = collections.namedtuple(typename, [n for n, t in fields])
- cls._field_types = dict(fields)
- # Set the module to the caller's module (otherwise it'd be 'typing').
- try:
- cls.__module__ = sys._getframe(1).f_globals.get('__name__', '__main__')
- except (AttributeError, ValueError):
- pass
- return cls
-
-
-def NewType(name, tp):
- """NewType creates simple unique types with almost zero
- runtime overhead. NewType(name, tp) is considered a subtype of tp
- by static type checkers. At runtime, NewType(name, tp) returns
- a dummy function that simply returns its argument. Usage::
-
- UserId = NewType('UserId', int)
-
- def name_by_id(user_id):
- # type: (UserId) -> str
- ...
-
- UserId('user') # Fails type check
-
- name_by_id(42) # Fails type check
- name_by_id(UserId(42)) # OK
-
- num = UserId(5) + 1 # type: int
- """
-
- def new_type(x):
- return x
-
- # Some versions of Python 2 complain because of making all strings unicode
- new_type.__name__ = str(name)
- new_type.__supertype__ = tp
- return new_type
-
-
-# Python-version-specific alias (Python 2: unicode; Python 3: str)
-Text = unicode
-
-
-# Constant that's True when type checking, but False here.
-TYPE_CHECKING = False
-
-
-class IO(Generic[AnyStr]):
- """Generic base class for TextIO and BinaryIO.
-
- This is an abstract, generic version of the return of open().
-
- NOTE: This does not distinguish between the different possible
- classes (text vs. binary, read vs. write vs. read/write,
- append-only, unbuffered). The TextIO and BinaryIO subclasses
- below capture the distinctions between text vs. binary, which is
- pervasive in the interface; however we currently do not offer a
- way to track the other distinctions in the type system.
- """
-
- __slots__ = ()
-
- @abstractproperty
- def mode(self):
- pass
-
- @abstractproperty
- def name(self):
- pass
-
- @abstractmethod
- def close(self):
- pass
-
- @abstractmethod
- def closed(self):
- pass
-
- @abstractmethod
- def fileno(self):
- pass
-
- @abstractmethod
- def flush(self):
- pass
-
- @abstractmethod
- def isatty(self):
- pass
-
- @abstractmethod
- def read(self, n = -1):
- pass
-
- @abstractmethod
- def readable(self):
- pass
-
- @abstractmethod
- def readline(self, limit = -1):
- pass
-
- @abstractmethod
- def readlines(self, hint = -1):
- pass
-
- @abstractmethod
- def seek(self, offset, whence = 0):
- pass
-
- @abstractmethod
- def seekable(self):
- pass
-
- @abstractmethod
- def tell(self):
- pass
-
- @abstractmethod
- def truncate(self, size = None):
- pass
-
- @abstractmethod
- def writable(self):
- pass
-
- @abstractmethod
- def write(self, s):
- pass
-
- @abstractmethod
- def writelines(self, lines):
- pass
-
- @abstractmethod
- def __enter__(self):
- pass
-
- @abstractmethod
- def __exit__(self, type, value, traceback):
- pass
-
-
-class BinaryIO(IO[bytes]):
- """Typed version of the return of open() in binary mode."""
-
- __slots__ = ()
-
- @abstractmethod
- def write(self, s):
- pass
-
- @abstractmethod
- def __enter__(self):
- pass
-
-
-class TextIO(IO[unicode]):
- """Typed version of the return of open() in text mode."""
-
- __slots__ = ()
-
- @abstractproperty
- def buffer(self):
- pass
-
- @abstractproperty
- def encoding(self):
- pass
-
- @abstractproperty
- def errors(self):
- pass
-
- @abstractproperty
- def line_buffering(self):
- pass
-
- @abstractproperty
- def newlines(self):
- pass
-
- @abstractmethod
- def __enter__(self):
- pass
-
-
-class io(object):
- """Wrapper namespace for IO generic classes."""
-
- __all__ = ['IO', 'TextIO', 'BinaryIO']
- IO = IO
- TextIO = TextIO
- BinaryIO = BinaryIO
-
-io.__name__ = __name__ + b'.io'
-sys.modules[io.__name__] = io
-
-
-Pattern = _TypeAlias('Pattern', AnyStr, type(stdlib_re.compile('')),
- lambda p: p.pattern)
-Match = _TypeAlias('Match', AnyStr, type(stdlib_re.match('', '')),
- lambda m: m.re.pattern)
-
-
-class re(object):
- """Wrapper namespace for re type aliases."""
-
- __all__ = ['Pattern', 'Match']
- Pattern = Pattern
- Match = Match
-
-re.__name__ = __name__ + b'.re'
-sys.modules[re.__name__] = re
diff --git a/lib-typing/3.2/test_typing.py b/lib-typing/3.2/test_typing.py
deleted file mode 100644
index d203ce3..0000000
--- a/lib-typing/3.2/test_typing.py
+++ /dev/null
@@ -1,2063 +0,0 @@
-import contextlib
-import collections
-import pickle
-import re
-import sys
-from unittest import TestCase, main, skipUnless, SkipTest
-from copy import copy, deepcopy
-
-from typing import Any
-from typing import TypeVar, AnyStr
-from typing import T, KT, VT # Not in __all__.
-from typing import Union, Optional
-from typing import Tuple, List, MutableMapping
-from typing import Callable
-from typing import Generic, ClassVar
-from typing import cast
-from typing import get_type_hints
-from typing import no_type_check, no_type_check_decorator
-from typing import Type
-from typing import NewType
-from typing import NamedTuple
-from typing import IO, TextIO, BinaryIO
-from typing import Pattern, Match
-import abc
-import typing
-try:
- import collections.abc as collections_abc
-except ImportError:
- import collections as collections_abc # Fallback for PY3.2.
-
-
-class BaseTestCase(TestCase):
-
- def assertIsSubclass(self, cls, class_or_tuple, msg=None):
- if not issubclass(cls, class_or_tuple):
- message = '%r is not a subclass of %r' % (cls, class_or_tuple)
- if msg is not None:
- message += ' : %s' % msg
- raise self.failureException(message)
-
- def assertNotIsSubclass(self, cls, class_or_tuple, msg=None):
- if issubclass(cls, class_or_tuple):
- message = '%r is a subclass of %r' % (cls, class_or_tuple)
- if msg is not None:
- message += ' : %s' % msg
- raise self.failureException(message)
-
- def clear_caches(self):
- for f in typing._cleanups:
- f()
-
-
-class Employee:
- pass
-
-
-class Manager(Employee):
- pass
-
-
-class Founder(Employee):
- pass
-
-
-class ManagingFounder(Manager, Founder):
- pass
-
-
-class AnyTests(BaseTestCase):
-
- def test_any_instance_type_error(self):
- with self.assertRaises(TypeError):
- isinstance(42, Any)
-
- def test_any_subclass_type_error(self):
- with self.assertRaises(TypeError):
- issubclass(Employee, Any)
- with self.assertRaises(TypeError):
- issubclass(Any, Employee)
-
- def test_repr(self):
- self.assertEqual(repr(Any), 'typing.Any')
-
- def test_errors(self):
- with self.assertRaises(TypeError):
- issubclass(42, Any)
- with self.assertRaises(TypeError):
- Any[int] # Any is not a generic type.
-
- def test_cannot_subclass(self):
- with self.assertRaises(TypeError):
- class A(Any):
- pass
- with self.assertRaises(TypeError):
- class A(type(Any)):
- pass
-
- def test_cannot_instantiate(self):
- with self.assertRaises(TypeError):
- Any()
- with self.assertRaises(TypeError):
- type(Any)()
-
- def test_cannot_subscript(self):
- with self.assertRaises(TypeError):
- Any[int]
-
- def test_any_works_with_alias(self):
- # These expressions must simply not fail.
- typing.Match[Any]
- typing.Pattern[Any]
- typing.IO[Any]
-
-
-class TypeVarTests(BaseTestCase):
-
- def test_basic_plain(self):
- T = TypeVar('T')
- # T equals itself.
- self.assertEqual(T, T)
- # T is an instance of TypeVar
- self.assertIsInstance(T, TypeVar)
-
- def test_typevar_instance_type_error(self):
- T = TypeVar('T')
- with self.assertRaises(TypeError):
- isinstance(42, T)
-
- def test_typevar_subclass_type_error(self):
- T = TypeVar('T')
- with self.assertRaises(TypeError):
- issubclass(int, T)
- with self.assertRaises(TypeError):
- issubclass(T, int)
-
- def test_constrained_error(self):
- with self.assertRaises(TypeError):
- X = TypeVar('X', int)
- X
-
- def test_union_unique(self):
- X = TypeVar('X')
- Y = TypeVar('Y')
- self.assertNotEqual(X, Y)
- self.assertEqual(Union[X], X)
- self.assertNotEqual(Union[X], Union[X, Y])
- self.assertEqual(Union[X, X], X)
- self.assertNotEqual(Union[X, int], Union[X])
- self.assertNotEqual(Union[X, int], Union[int])
- self.assertEqual(Union[X, int].__args__, (X, int))
- self.assertEqual(Union[X, int].__parameters__, (X,))
- self.assertIs(Union[X, int].__origin__, Union)
-
- def test_union_constrained(self):
- A = TypeVar('A', str, bytes)
- self.assertNotEqual(Union[A, str], Union[A])
-
- def test_repr(self):
- self.assertEqual(repr(T), '~T')
- self.assertEqual(repr(KT), '~KT')
- self.assertEqual(repr(VT), '~VT')
- self.assertEqual(repr(AnyStr), '~AnyStr')
- T_co = TypeVar('T_co', covariant=True)
- self.assertEqual(repr(T_co), '+T_co')
- T_contra = TypeVar('T_contra', contravariant=True)
- self.assertEqual(repr(T_contra), '-T_contra')
-
- def test_no_redefinition(self):
- self.assertNotEqual(TypeVar('T'), TypeVar('T'))
- self.assertNotEqual(TypeVar('T', int, str), TypeVar('T', int, str))
-
- def test_cannot_subclass_vars(self):
- with self.assertRaises(TypeError):
- class V(TypeVar('T')):
- pass
-
- def test_cannot_subclass_var_itself(self):
- with self.assertRaises(TypeError):
- class V(TypeVar):
- pass
-
- def test_cannot_instantiate_vars(self):
- with self.assertRaises(TypeError):
- TypeVar('A')()
-
- def test_bound_errors(self):
- with self.assertRaises(TypeError):
- TypeVar('X', bound=42)
- with self.assertRaises(TypeError):
- TypeVar('X', str, float, bound=Employee)
-
-
-class UnionTests(BaseTestCase):
-
- def test_basics(self):
- u = Union[int, float]
- self.assertNotEqual(u, Union)
-
- def test_subclass_error(self):
- with self.assertRaises(TypeError):
- issubclass(int, Union)
- with self.assertRaises(TypeError):
- issubclass(Union, int)
- with self.assertRaises(TypeError):
- issubclass(int, Union[int, str])
- with self.assertRaises(TypeError):
- issubclass(Union[int, str], int)
-
- def test_union_any(self):
- u = Union[Any]
- self.assertEqual(u, Any)
- u1 = Union[int, Any]
- u2 = Union[Any, int]
- u3 = Union[Any, object]
- self.assertEqual(u1, u2)
- self.assertNotEqual(u1, Any)
- self.assertNotEqual(u2, Any)
- self.assertNotEqual(u3, Any)
-
- def test_union_object(self):
- u = Union[object]
- self.assertEqual(u, object)
- u = Union[int, object]
- self.assertEqual(u, object)
- u = Union[object, int]
- self.assertEqual(u, object)
-
- def test_unordered(self):
- u1 = Union[int, float]
- u2 = Union[float, int]
- self.assertEqual(u1, u2)
-
- def test_single_class_disappears(self):
- t = Union[Employee]
- self.assertIs(t, Employee)
-
- def test_base_class_disappears(self):
- u = Union[Employee, Manager, int]
- self.assertEqual(u, Union[int, Employee])
- u = Union[Manager, int, Employee]
- self.assertEqual(u, Union[int, Employee])
- u = Union[Employee, Manager]
- self.assertIs(u, Employee)
-
- def test_union_union(self):
- u = Union[int, float]
- v = Union[u, Employee]
- self.assertEqual(v, Union[int, float, Employee])
-
- def test_repr(self):
- self.assertEqual(repr(Union), 'typing.Union')
- u = Union[Employee, int]
- self.assertEqual(repr(u), 'typing.Union[%s.Employee, int]' % __name__)
- u = Union[int, Employee]
- self.assertEqual(repr(u), 'typing.Union[int, %s.Employee]' % __name__)
-
- def test_cannot_subclass(self):
- with self.assertRaises(TypeError):
- class C(Union):
- pass
- with self.assertRaises(TypeError):
- class C(type(Union)):
- pass
- with self.assertRaises(TypeError):
- class C(Union[int, str]):
- pass
-
- def test_cannot_instantiate(self):
- with self.assertRaises(TypeError):
- Union()
- with self.assertRaises(TypeError):
- type(Union)()
- u = Union[int, float]
- with self.assertRaises(TypeError):
- u()
- with self.assertRaises(TypeError):
- type(u)()
-
- def test_union_generalization(self):
- self.assertFalse(Union[str, typing.Iterable[int]] == str)
- self.assertFalse(Union[str, typing.Iterable[int]] == typing.Iterable[int])
- self.assertTrue(Union[str, typing.Iterable] == typing.Iterable)
-
- def test_optional(self):
- o = Optional[int]
- u = Union[int, None]
- self.assertEqual(o, u)
-
- def test_empty(self):
- with self.assertRaises(TypeError):
- Union[()]
-
- def test_union_instance_type_error(self):
- with self.assertRaises(TypeError):
- isinstance(42, Union[int, str])
-
- def test_union_str_pattern(self):
- # Shouldn't crash; see http://bugs.python.org/issue25390
- A = Union[str, Pattern]
- A
-
- def test_etree(self):
- # See https://github.com/python/typing/issues/229
- # (Only relevant for Python 2.)
- try:
- from xml.etree.cElementTree import Element
- except ImportError:
- raise SkipTest("cElementTree not found")
- Union[Element, str] # Shouldn't crash
-
- def Elem(*args):
- return Element(*args)
-
- Union[Elem, str] # Nor should this
-
-
-class TupleTests(BaseTestCase):
-
- def test_basics(self):
- with self.assertRaises(TypeError):
- issubclass(Tuple, Tuple[int, str])
- with self.assertRaises(TypeError):
- issubclass(tuple, Tuple[int, str])
-
- class TP(tuple): ...
- self.assertTrue(issubclass(tuple, Tuple))
- self.assertTrue(issubclass(TP, Tuple))
-
- def test_equality(self):
- self.assertEqual(Tuple[int], Tuple[int])
- self.assertEqual(Tuple[int, ...], Tuple[int, ...])
- self.assertNotEqual(Tuple[int], Tuple[int, int])
- self.assertNotEqual(Tuple[int], Tuple[int, ...])
-
- def test_tuple_subclass(self):
- class MyTuple(tuple):
- pass
- self.assertTrue(issubclass(MyTuple, Tuple))
-
- def test_tuple_instance_type_error(self):
- with self.assertRaises(TypeError):
- isinstance((0, 0), Tuple[int, int])
- self.assertIsInstance((0, 0), Tuple)
-
- def test_repr(self):
- self.assertEqual(repr(Tuple), 'typing.Tuple')
- self.assertEqual(repr(Tuple[()]), 'typing.Tuple[()]')
- self.assertEqual(repr(Tuple[int, float]), 'typing.Tuple[int, float]')
- self.assertEqual(repr(Tuple[int, ...]), 'typing.Tuple[int, ...]')
-
- def test_errors(self):
- with self.assertRaises(TypeError):
- issubclass(42, Tuple)
- with self.assertRaises(TypeError):
- issubclass(42, Tuple[int])
-
-
-class CallableTests(BaseTestCase):
-
- def test_self_subclass(self):
- with self.assertRaises(TypeError):
- self.assertTrue(issubclass(type(lambda x: x), Callable[[int], int]))
- self.assertTrue(issubclass(type(lambda x: x), Callable))
-
- def test_eq_hash(self):
- self.assertEqual(Callable[[int], int], Callable[[int], int])
- self.assertEqual(len({Callable[[int], int], Callable[[int], int]}), 1)
- self.assertNotEqual(Callable[[int], int], Callable[[int], str])
- self.assertNotEqual(Callable[[int], int], Callable[[str], int])
- self.assertNotEqual(Callable[[int], int], Callable[[int, int], int])
- self.assertNotEqual(Callable[[int], int], Callable[[], int])
- self.assertNotEqual(Callable[[int], int], Callable)
-
- def test_cannot_instantiate(self):
- with self.assertRaises(TypeError):
- Callable()
- with self.assertRaises(TypeError):
- type(Callable)()
- c = Callable[[int], str]
- with self.assertRaises(TypeError):
- c()
- with self.assertRaises(TypeError):
- type(c)()
-
- def test_callable_wrong_forms(self):
- with self.assertRaises(TypeError):
- Callable[[...], int]
- with self.assertRaises(TypeError):
- Callable[(), int]
- with self.assertRaises(TypeError):
- Callable[[()], int]
- with self.assertRaises(TypeError):
- Callable[[int, 1], 2]
-
- def test_callable_instance_works(self):
- def f():
- pass
- self.assertIsInstance(f, Callable)
- self.assertNotIsInstance(None, Callable)
-
- def test_callable_instance_type_error(self):
- def f():
- pass
- with self.assertRaises(TypeError):
- self.assertIsInstance(f, Callable[[], None])
- with self.assertRaises(TypeError):
- self.assertIsInstance(f, Callable[[], Any])
- with self.assertRaises(TypeError):
- self.assertNotIsInstance(None, Callable[[], None])
- with self.assertRaises(TypeError):
- self.assertNotIsInstance(None, Callable[[], Any])
-
- def test_repr(self):
- ct0 = Callable[[], bool]
- self.assertEqual(repr(ct0), 'typing.Callable[[], bool]')
- ct2 = Callable[[str, float], int]
- self.assertEqual(repr(ct2), 'typing.Callable[[str, float], int]')
- ctv = Callable[..., str]
- self.assertEqual(repr(ctv), 'typing.Callable[..., str]')
-
- def test_callable_with_ellipsis(self):
-
- def foo(a: Callable[..., T]):
- pass
-
- self.assertEqual(get_type_hints(foo, globals(), locals()),
- {'a': Callable[..., T]})
-
- def test_ellipsis_in_generic(self):
- # Shouldn't crash; see https://github.com/python/typing/issues/259
- typing.List[Callable[..., str]]
-
-
-XK = TypeVar('XK', str, bytes)
-XV = TypeVar('XV')
-
-
-class SimpleMapping(Generic[XK, XV]):
-
- def __getitem__(self, key: XK) -> XV:
- ...
-
- def __setitem__(self, key: XK, value: XV):
- ...
-
- def get(self, key: XK, default: XV = None) -> XV:
- ...
-
-
-class MySimpleMapping(SimpleMapping[XK, XV]):
-
- def __init__(self):
- self.store = {}
-
- def __getitem__(self, key: str):
- return self.store[key]
-
- def __setitem__(self, key: str, value):
- self.store[key] = value
-
- def get(self, key: str, default=None):
- try:
- return self.store[key]
- except KeyError:
- return default
-
-
-class ProtocolTests(BaseTestCase):
-
- def test_supports_int(self):
- self.assertIsSubclass(int, typing.SupportsInt)
- self.assertNotIsSubclass(str, typing.SupportsInt)
-
- def test_supports_float(self):
- self.assertIsSubclass(float, typing.SupportsFloat)
- self.assertNotIsSubclass(str, typing.SupportsFloat)
-
- def test_supports_complex(self):
-
- # Note: complex itself doesn't have __complex__.
- class C:
- def __complex__(self):
- return 0j
-
- self.assertIsSubclass(C, typing.SupportsComplex)
- self.assertNotIsSubclass(str, typing.SupportsComplex)
-
- def test_supports_bytes(self):
-
- # Note: bytes itself doesn't have __bytes__.
- class B:
- def __bytes__(self):
- return b''
-
- self.assertIsSubclass(B, typing.SupportsBytes)
- self.assertNotIsSubclass(str, typing.SupportsBytes)
-
- def test_supports_abs(self):
- self.assertIsSubclass(float, typing.SupportsAbs)
- self.assertIsSubclass(int, typing.SupportsAbs)
- self.assertNotIsSubclass(str, typing.SupportsAbs)
-
- def test_supports_round(self):
- issubclass(float, typing.SupportsRound)
- self.assertIsSubclass(float, typing.SupportsRound)
- self.assertIsSubclass(int, typing.SupportsRound)
- self.assertNotIsSubclass(str, typing.SupportsRound)
-
- def test_reversible(self):
- self.assertIsSubclass(list, typing.Reversible)
- self.assertNotIsSubclass(int, typing.Reversible)
-
- def test_protocol_instance_type_error(self):
- with self.assertRaises(TypeError):
- isinstance(0, typing.SupportsAbs)
- class C1(typing.SupportsInt):
- def __int__(self) -> int:
- return 42
- class C2(C1):
- pass
- c = C2()
- self.assertIsInstance(c, C1)
-
-
-class GenericTests(BaseTestCase):
-
- def test_basics(self):
- X = SimpleMapping[str, Any]
- self.assertEqual(X.__parameters__, ())
- with self.assertRaises(TypeError):
- X[str]
- with self.assertRaises(TypeError):
- X[str, str]
- Y = SimpleMapping[XK, str]
- self.assertEqual(Y.__parameters__, (XK,))
- Y[str]
- with self.assertRaises(TypeError):
- Y[str, str]
-
- def test_generic_errors(self):
- T = TypeVar('T')
- with self.assertRaises(TypeError):
- Generic[T]()
- with self.assertRaises(TypeError):
- isinstance([], List[int])
- with self.assertRaises(TypeError):
- issubclass(list, List[int])
-
- def test_init(self):
- T = TypeVar('T')
- S = TypeVar('S')
- with self.assertRaises(TypeError):
- Generic[T, T]
- with self.assertRaises(TypeError):
- Generic[T, S, T]
-
- def test_repr(self):
- self.assertEqual(repr(SimpleMapping),
- __name__ + '.' + 'SimpleMapping')
- self.assertEqual(repr(MySimpleMapping),
- __name__ + '.' + 'MySimpleMapping')
-
- def test_chain_repr(self):
- T = TypeVar('T')
- S = TypeVar('S')
-
- class C(Generic[T]):
- pass
-
- X = C[Tuple[S, T]]
- self.assertEqual(X, C[Tuple[S, T]])
- self.assertNotEqual(X, C[Tuple[T, S]])
-
- Y = X[T, int]
- self.assertEqual(Y, X[T, int])
- self.assertNotEqual(Y, X[S, int])
- self.assertNotEqual(Y, X[T, str])
-
- Z = Y[str]
- self.assertEqual(Z, Y[str])
- self.assertNotEqual(Z, Y[int])
- self.assertNotEqual(Z, Y[T])
-
- self.assertTrue(str(Z).endswith(
- '.C[typing.Tuple[str, int]]'))
-
- def test_new_repr(self):
- T = TypeVar('T')
- U = TypeVar('U', covariant=True)
- S = TypeVar('S')
-
- self.assertEqual(repr(List), 'typing.List')
- self.assertEqual(repr(List[T]), 'typing.List[~T]')
- self.assertEqual(repr(List[U]), 'typing.List[+U]')
- self.assertEqual(repr(List[S][T][int]), 'typing.List[int]')
- self.assertEqual(repr(List[int]), 'typing.List[int]')
-
- def test_new_repr_complex(self):
- T = TypeVar('T')
- TS = TypeVar('TS')
-
- self.assertEqual(repr(typing.Mapping[T, TS][TS, T]), 'typing.Mapping[~TS, ~T]')
- self.assertEqual(repr(List[Tuple[T, TS]][int, T]),
- 'typing.List[typing.Tuple[int, ~T]]')
- self.assertEqual(repr(List[Tuple[T, T]][List[int]]),
- 'typing.List[typing.Tuple[typing.List[int], typing.List[int]]]')
-
- def test_new_repr_bare(self):
- T = TypeVar('T')
- self.assertEqual(repr(Generic[T]), 'typing.Generic[~T]')
- self.assertEqual(repr(typing._Protocol[T]), 'typing.Protocol[~T]')
- class C(typing.Dict[Any, Any]): ...
- # this line should just work
- repr(C.__mro__)
-
- def test_dict(self):
- T = TypeVar('T')
-
- class B(Generic[T]):
- pass
-
- b = B()
- b.foo = 42
- self.assertEqual(b.__dict__, {'foo': 42})
-
- class C(B[int]):
- pass
-
- c = C()
- c.bar = 'abc'
- self.assertEqual(c.__dict__, {'bar': 'abc'})
-
- def test_false_subclasses(self):
- class MyMapping(MutableMapping[str, str]): pass
- self.assertNotIsInstance({}, MyMapping)
- self.assertNotIsSubclass(dict, MyMapping)
-
- def test_abc_bases(self):
- class MM(MutableMapping[str, str]):
- def __getitem__(self, k):
- return None
- def __setitem__(self, k, v):
- pass
- def __delitem__(self, k):
- pass
- def __iter__(self):
- return iter(())
- def __len__(self):
- return 0
- # this should just work
- MM().update()
- self.assertIsInstance(MM(), collections_abc.MutableMapping)
- self.assertIsInstance(MM(), MutableMapping)
- self.assertNotIsInstance(MM(), List)
- self.assertNotIsInstance({}, MM)
-
- def test_multiple_bases(self):
- class MM1(MutableMapping[str, str], collections_abc.MutableMapping):
- pass
- with self.assertRaises(TypeError):
- # consistent MRO not possible
- class MM2(collections_abc.MutableMapping, MutableMapping[str, str]):
- pass
-
- def test_orig_bases(self):
- T = TypeVar('T')
- class C(typing.Dict[str, T]): ...
- self.assertEqual(C.__orig_bases__, (typing.Dict[str, T],))
-
- def test_naive_runtime_checks(self):
- def naive_dict_check(obj, tp):
- # Check if a dictionary conforms to Dict type
- if len(tp.__parameters__) > 0:
- raise NotImplementedError
- if tp.__args__:
- KT, VT = tp.__args__
- return all(isinstance(k, KT) and isinstance(v, VT)
- for k, v in obj.items())
- self.assertTrue(naive_dict_check({'x': 1}, typing.Dict[str, int]))
- self.assertFalse(naive_dict_check({1: 'x'}, typing.Dict[str, int]))
- with self.assertRaises(NotImplementedError):
- naive_dict_check({1: 'x'}, typing.Dict[str, T])
-
- def naive_generic_check(obj, tp):
- # Check if an instance conforms to the generic class
- if not hasattr(obj, '__orig_class__'):
- raise NotImplementedError
- return obj.__orig_class__ == tp
- class Node(Generic[T]): ...
- self.assertTrue(naive_generic_check(Node[int](), Node[int]))
- self.assertFalse(naive_generic_check(Node[str](), Node[int]))
- self.assertFalse(naive_generic_check(Node[str](), List))
- with self.assertRaises(NotImplementedError):
- naive_generic_check([1,2,3], Node[int])
-
- def naive_list_base_check(obj, tp):
- # Check if list conforms to a List subclass
- return all(isinstance(x, tp.__orig_bases__[0].__args__[0])
- for x in obj)
- class C(List[int]): ...
- self.assertTrue(naive_list_base_check([1, 2, 3], C))
- self.assertFalse(naive_list_base_check(['a', 'b'], C))
-
- def test_multi_subscr_base(self):
- T = TypeVar('T')
- U = TypeVar('U')
- V = TypeVar('V')
- class C(List[T][U][V]): ...
- class D(C, List[T][U][V]): ...
- self.assertEqual(C.__parameters__, (V,))
- self.assertEqual(D.__parameters__, (V,))
- self.assertEqual(C[int].__parameters__, ())
- self.assertEqual(D[int].__parameters__, ())
- self.assertEqual(C[int].__args__, (int,))
- self.assertEqual(D[int].__args__, (int,))
- self.assertEqual(C.__bases__, (List,))
- self.assertEqual(D.__bases__, (C, List))
- self.assertEqual(C.__orig_bases__, (List[T][U][V],))
- self.assertEqual(D.__orig_bases__, (C, List[T][U][V]))
-
- def test_extended_generic_rules_eq(self):
- T = TypeVar('T')
- U = TypeVar('U')
- self.assertEqual(Tuple[T, T][int], Tuple[int, int])
- self.assertEqual(typing.Iterable[Tuple[T, T]][T], typing.Iterable[Tuple[T, T]])
- with self.assertRaises(TypeError):
- Tuple[T, int][()]
- with self.assertRaises(TypeError):
- Tuple[T, U][T, ...]
-
- self.assertEqual(Union[T, int][int], int)
- self.assertEqual(Union[T, U][int, Union[int, str]], Union[int, str])
- class Base: ...
- class Derived(Base): ...
- self.assertEqual(Union[T, Base][Derived], Base)
- with self.assertRaises(TypeError):
- Union[T, int][1]
-
- self.assertEqual(Callable[[T], T][KT], Callable[[KT], KT])
- self.assertEqual(Callable[..., List[T]][int], Callable[..., List[int]])
- with self.assertRaises(TypeError):
- Callable[[T], U][..., int]
- with self.assertRaises(TypeError):
- Callable[[T], U][[], int]
-
- def test_extended_generic_rules_repr(self):
- T = TypeVar('T')
- self.assertEqual(repr(Union[Tuple, Callable]).replace('typing.', ''),
- 'Union[Tuple, Callable]')
- self.assertEqual(repr(Union[Tuple, Tuple[int]]).replace('typing.', ''),
- 'Tuple')
- self.assertEqual(repr(Callable[..., Optional[T]][int]).replace('typing.', ''),
- 'Callable[..., Union[int, NoneType]]')
- self.assertEqual(repr(Callable[[], List[T]][int]).replace('typing.', ''),
- 'Callable[[], List[int]]')
-
- def test_generic_forward_ref(self):
- def foobar(x: List[List['CC']]): ...
- class CC: ...
- self.assertEqual(get_type_hints(foobar, globals(), locals()), {'x': List[List[CC]]})
- T = TypeVar('T')
- AT = Tuple[T, ...]
- def barfoo(x: AT): ...
- self.assertIs(get_type_hints(barfoo, globals(), locals())['x'], AT)
- CT = Callable[..., List[T]]
- def barfoo2(x: CT): ...
- self.assertIs(get_type_hints(barfoo2, globals(), locals())['x'], CT)
-
- def test_extended_generic_rules_subclassing(self):
- class T1(Tuple[T, KT]): ...
- class T2(Tuple[T, ...]): ...
- class C1(Callable[[T], T]): ...
- class C2(Callable[..., int]):
- def __call__(self):
- return None
-
- self.assertEqual(T1.__parameters__, (T, KT))
- self.assertEqual(T1[int, str].__args__, (int, str))
- self.assertEqual(T1[int, T].__origin__, T1)
-
- self.assertEqual(T2.__parameters__, (T,))
- with self.assertRaises(TypeError):
- T1[int]
- with self.assertRaises(TypeError):
- T2[int, str]
-
- self.assertEqual(repr(C1[int]).split('.')[-1], 'C1[int]')
- self.assertEqual(C2.__parameters__, ())
- self.assertIsInstance(C2(), collections_abc.Callable)
- self.assertIsSubclass(C2, collections_abc.Callable)
- self.assertIsSubclass(C1, collections_abc.Callable)
- self.assertIsInstance(T1(), tuple)
- self.assertIsSubclass(T2, tuple)
- self.assertIsSubclass(Tuple[int, ...], typing.Sequence)
- self.assertIsSubclass(Tuple[int, ...], typing.Iterable)
-
- def test_fail_with_bare_union(self):
- with self.assertRaises(TypeError):
- List[Union]
- with self.assertRaises(TypeError):
- Tuple[Optional]
- with self.assertRaises(TypeError):
- ClassVar[ClassVar]
- with self.assertRaises(TypeError):
- List[ClassVar[int]]
-
- def test_fail_with_bare_generic(self):
- T = TypeVar('T')
- with self.assertRaises(TypeError):
- List[Generic]
- with self.assertRaises(TypeError):
- Tuple[Generic[T]]
- with self.assertRaises(TypeError):
- List[typing._Protocol]
-
- def test_type_erasure_special(self):
- T = TypeVar('T')
- # this is the only test that checks type caching
- self.clear_caches()
- class MyTup(Tuple[T, T]): ...
- self.assertIs(MyTup[int]().__class__, MyTup)
- self.assertIs(MyTup[int]().__orig_class__, MyTup[int])
- class MyCall(Callable[..., T]):
- def __call__(self): return None
- self.assertIs(MyCall[T]().__class__, MyCall)
- self.assertIs(MyCall[T]().__orig_class__, MyCall[T])
- class MyDict(typing.Dict[T, T]): ...
- self.assertIs(MyDict[int]().__class__, MyDict)
- self.assertIs(MyDict[int]().__orig_class__, MyDict[int])
- class MyDef(typing.DefaultDict[str, T]): ...
- self.assertIs(MyDef[int]().__class__, MyDef)
- self.assertIs(MyDef[int]().__orig_class__, MyDef[int])
-
- def test_all_repr_eq_any(self):
- objs = (getattr(typing, el) for el in typing.__all__)
- for obj in objs:
- self.assertNotEqual(repr(obj), '')
- self.assertEqual(obj, obj)
- if getattr(obj, '__parameters__', None) and len(obj.__parameters__) == 1:
- self.assertEqual(obj[Any].__args__, (Any,))
- if isinstance(obj, type):
- for base in obj.__mro__:
- self.assertNotEqual(repr(base), '')
- self.assertEqual(base, base)
-
- def test_substitution_helper(self):
- T = TypeVar('T')
- KT = TypeVar('KT')
- VT = TypeVar('VT')
- class Map(Generic[KT, VT]):
- def meth(self, k: KT, v: VT): ...
- StrMap = Map[str, T]
- obj = StrMap[int]()
-
- new_args = typing._subs_tree(obj.__orig_class__)
- new_annots = {k: typing._replace_arg(v, type(obj).__parameters__, new_args)
- for k, v in obj.meth.__annotations__.items()}
-
- self.assertEqual(new_annots, {'k': str, 'v': int})
-
- def test_pickle(self):
- global C # pickle wants to reference the class by name
- T = TypeVar('T')
-
- class B(Generic[T]):
- pass
-
- class C(B[int]):
- pass
-
- c = C()
- c.foo = 42
- c.bar = 'abc'
- for proto in range(pickle.HIGHEST_PROTOCOL + 1):
- z = pickle.dumps(c, proto)
- x = pickle.loads(z)
- self.assertEqual(x.foo, 42)
- self.assertEqual(x.bar, 'abc')
- self.assertEqual(x.__dict__, {'foo': 42, 'bar': 'abc'})
- simples = [Any, Union, Tuple, Callable, ClassVar, List, typing.Iterable]
- for s in simples:
- for proto in range(pickle.HIGHEST_PROTOCOL + 1):
- z = pickle.dumps(s, proto)
- x = pickle.loads(z)
- self.assertEqual(s, x)
-
- def test_copy_and_deepcopy(self):
- T = TypeVar('T')
- class Node(Generic[T]): ...
- things = [Union[T, int], Tuple[T, int], Callable[..., T], Callable[[int], int],
- Tuple[Any, Any], Node[T], Node[int], Node[Any], typing.Iterable[T],
- typing.Iterable[Any], typing.Iterable[int], typing.Dict[int, str],
- typing.Dict[T, Any], ClassVar[int], ClassVar[List[T]], Tuple['T', 'T'],
- Union['T', int], List['T'], typing.Mapping['T', int]]
- for t in things + [Any]:
- self.assertEqual(t, copy(t))
- self.assertEqual(t, deepcopy(t))
-
- def test_parameterized_slots(self):
- T = TypeVar('T')
- class C(Generic[T]):
- __slots__ = ('potato',)
-
- c = C()
- c_int = C[int]()
- self.assertEqual(C.__slots__, C[str].__slots__)
-
- c.potato = 0
- c_int.potato = 0
- with self.assertRaises(AttributeError):
- c.tomato = 0
- with self.assertRaises(AttributeError):
- c_int.tomato = 0
-
- def foo(x: C['C']): ...
- self.assertEqual(get_type_hints(foo, globals(), locals())['x'], C[C])
- self.assertEqual(get_type_hints(foo, globals(), locals())['x'].__slots__,
- C.__slots__)
- self.assertEqual(copy(C[int]), deepcopy(C[int]))
-
- def test_parameterized_slots_dict(self):
- T = TypeVar('T')
- class D(Generic[T]):
- __slots__ = {'banana': 42}
-
- d = D()
- d_int = D[int]()
- self.assertEqual(D.__slots__, D[str].__slots__)
-
- d.banana = 'yes'
- d_int.banana = 'yes'
- with self.assertRaises(AttributeError):
- d.foobar = 'no'
- with self.assertRaises(AttributeError):
- d_int.foobar = 'no'
-
- def test_errors(self):
- with self.assertRaises(TypeError):
- B = SimpleMapping[XK, Any]
-
- class C(Generic[B]):
- pass
-
- def test_repr_2(self):
- PY32 = sys.version_info[:2] < (3, 3)
-
- class C(Generic[T]):
- pass
-
- self.assertEqual(C.__module__, __name__)
- if not PY32:
- self.assertEqual(C.__qualname__,
- 'GenericTests.test_repr_2.<locals>.C')
- self.assertEqual(repr(C).split('.')[-1], 'C')
- X = C[int]
- self.assertEqual(X.__module__, __name__)
- if not PY32:
- self.assertTrue(X.__qualname__.endswith('.<locals>.C'))
- self.assertEqual(repr(X).split('.')[-1], 'C[int]')
-
- class Y(C[int]):
- pass
-
- self.assertEqual(Y.__module__, __name__)
- if not PY32:
- self.assertEqual(Y.__qualname__,
- 'GenericTests.test_repr_2.<locals>.Y')
- self.assertEqual(repr(Y).split('.')[-1], 'Y')
-
- def test_eq_1(self):
- self.assertEqual(Generic, Generic)
- self.assertEqual(Generic[T], Generic[T])
- self.assertNotEqual(Generic[KT], Generic[VT])
-
- def test_eq_2(self):
-
- class A(Generic[T]):
- pass
-
- class B(Generic[T]):
- pass
-
- self.assertEqual(A, A)
- self.assertNotEqual(A, B)
- self.assertEqual(A[T], A[T])
- self.assertNotEqual(A[T], B[T])
-
- def test_multiple_inheritance(self):
-
- class A(Generic[T, VT]):
- pass
-
- class B(Generic[KT, T]):
- pass
-
- class C(A[T, VT], Generic[VT, T, KT], B[KT, T]):
- pass
-
- self.assertEqual(C.__parameters__, (VT, T, KT))
-
- def test_nested(self):
-
- G = Generic
-
- class Visitor(G[T]):
-
- a = None
-
- def set(self, a: T):
- self.a = a
-
- def get(self):
- return self.a
-
- def visit(self) -> T:
- return self.a
-
- V = Visitor[typing.List[int]]
-
- class IntListVisitor(V):
-
- def append(self, x: int):
- self.a.append(x)
-
- a = IntListVisitor()
- a.set([])
- a.append(1)
- a.append(42)
- self.assertEqual(a.get(), [1, 42])
-
- def test_type_erasure(self):
- T = TypeVar('T')
-
- class Node(Generic[T]):
- def __init__(self, label: T,
- left: 'Node[T]' = None,
- right: 'Node[T]' = None):
- self.label = label # type: T
- self.left = left # type: Optional[Node[T]]
- self.right = right # type: Optional[Node[T]]
-
- def foo(x: T):
- a = Node(x)
- b = Node[T](x)
- c = Node[Any](x)
- self.assertIs(type(a), Node)
- self.assertIs(type(b), Node)
- self.assertIs(type(c), Node)
- self.assertEqual(a.label, x)
- self.assertEqual(b.label, x)
- self.assertEqual(c.label, x)
-
- foo(42)
-
- def test_implicit_any(self):
- T = TypeVar('T')
-
- class C(Generic[T]):
- pass
-
- class D(C):
- pass
-
- self.assertEqual(D.__parameters__, ())
-
- with self.assertRaises(Exception):
- D[int]
- with self.assertRaises(Exception):
- D[Any]
- with self.assertRaises(Exception):
- D[T]
-
-class ClassVarTests(BaseTestCase):
-
- def test_basics(self):
- with self.assertRaises(TypeError):
- ClassVar[1]
- with self.assertRaises(TypeError):
- ClassVar[int, str]
- with self.assertRaises(TypeError):
- ClassVar[int][str]
-
- def test_repr(self):
- self.assertEqual(repr(ClassVar), 'typing.ClassVar')
- cv = ClassVar[int]
- self.assertEqual(repr(cv), 'typing.ClassVar[int]')
- cv = ClassVar[Employee]
- self.assertEqual(repr(cv), 'typing.ClassVar[%s.Employee]' % __name__)
-
- def test_cannot_subclass(self):
- with self.assertRaises(TypeError):
- class C(type(ClassVar)):
- pass
- with self.assertRaises(TypeError):
- class C(type(ClassVar[int])):
- pass
-
- def test_cannot_init(self):
- with self.assertRaises(TypeError):
- ClassVar()
- with self.assertRaises(TypeError):
- type(ClassVar)()
- with self.assertRaises(TypeError):
- type(ClassVar[Optional[int]])()
-
- def test_no_isinstance(self):
- with self.assertRaises(TypeError):
- isinstance(1, ClassVar[int])
- with self.assertRaises(TypeError):
- issubclass(int, ClassVar)
-
-
-class CastTests(BaseTestCase):
-
- def test_basics(self):
- self.assertEqual(cast(int, 42), 42)
- self.assertEqual(cast(float, 42), 42)
- self.assertIs(type(cast(float, 42)), int)
- self.assertEqual(cast(Any, 42), 42)
- self.assertEqual(cast(list, 42), 42)
- self.assertEqual(cast(Union[str, float], 42), 42)
- self.assertEqual(cast(AnyStr, 42), 42)
- self.assertEqual(cast(None, 42), 42)
-
- def test_errors(self):
- # Bogus calls are not expected to fail.
- cast(42, 42)
- cast('hello', 42)
-
-
-class ForwardRefTests(BaseTestCase):
-
- def test_basics(self):
-
- class Node(Generic[T]):
-
- def __init__(self, label: T):
- self.label = label
- self.left = self.right = None
-
- def add_both(self,
- left: 'Optional[Node[T]]',
- right: 'Node[T]' = None,
- stuff: int = None,
- blah=None):
- self.left = left
- self.right = right
-
- def add_left(self, node: Optional['Node[T]']):
- self.add_both(node, None)
-
- def add_right(self, node: 'Node[T]' = None):
- self.add_both(None, node)
-
- t = Node[int]
- both_hints = get_type_hints(t.add_both, globals(), locals())
- self.assertEqual(both_hints['left'], Optional[Node[T]])
- self.assertEqual(both_hints['right'], Optional[Node[T]])
- self.assertEqual(both_hints['left'], both_hints['right'])
- self.assertEqual(both_hints['stuff'], Optional[int])
- self.assertNotIn('blah', both_hints)
-
- left_hints = get_type_hints(t.add_left, globals(), locals())
- self.assertEqual(left_hints['node'], Optional[Node[T]])
-
- right_hints = get_type_hints(t.add_right, globals(), locals())
- self.assertEqual(right_hints['node'], Optional[Node[T]])
-
- def test_forwardref_instance_type_error(self):
- fr = typing._ForwardRef('int')
- with self.assertRaises(TypeError):
- isinstance(42, fr)
-
- def test_union_forward(self):
-
- def foo(a: Union['T']):
- pass
-
- self.assertEqual(get_type_hints(foo, globals(), locals()),
- {'a': Union[T]})
-
- def test_tuple_forward(self):
-
- def foo(a: Tuple['T']):
- pass
-
- self.assertEqual(get_type_hints(foo, globals(), locals()),
- {'a': Tuple[T]})
-
- def test_callable_forward(self):
-
- def foo(a: Callable[['T'], 'T']):
- pass
-
- self.assertEqual(get_type_hints(foo, globals(), locals()),
- {'a': Callable[[T], T]})
-
- def test_callable_with_ellipsis_forward(self):
-
- def foo(a: 'Callable[..., T]'):
- pass
-
- self.assertEqual(get_type_hints(foo, globals(), locals()),
- {'a': Callable[..., T]})
-
- def test_syntax_error(self):
-
- with self.assertRaises(SyntaxError):
- Generic['/T']
-
- def test_delayed_syntax_error(self):
-
- def foo(a: 'Node[T'):
- pass
-
- with self.assertRaises(SyntaxError):
- get_type_hints(foo)
-
- def test_type_error(self):
-
- def foo(a: Tuple['42']):
- pass
-
- with self.assertRaises(TypeError):
- get_type_hints(foo)
-
- def test_name_error(self):
-
- def foo(a: 'Noode[T]'):
- pass
-
- with self.assertRaises(NameError):
- get_type_hints(foo, locals())
-
- def test_no_type_check(self):
-
- @no_type_check
- def foo(a: 'whatevers') -> {}:
- pass
-
- th = get_type_hints(foo)
- self.assertEqual(th, {})
-
- def test_no_type_check_class(self):
-
- @no_type_check
- class C:
- def foo(a: 'whatevers') -> {}:
- pass
-
- cth = get_type_hints(C.foo)
- self.assertEqual(cth, {})
- ith = get_type_hints(C().foo)
- self.assertEqual(ith, {})
-
- def test_meta_no_type_check(self):
-
- @no_type_check_decorator
- def magic_decorator(deco):
- return deco
-
- self.assertEqual(magic_decorator.__name__, 'magic_decorator')
-
- @magic_decorator
- def foo(a: 'whatevers') -> {}:
- pass
-
- @magic_decorator
- class C:
- def foo(a: 'whatevers') -> {}:
- pass
-
- self.assertEqual(foo.__name__, 'foo')
- th = get_type_hints(foo)
- self.assertEqual(th, {})
- cth = get_type_hints(C.foo)
- self.assertEqual(cth, {})
- ith = get_type_hints(C().foo)
- self.assertEqual(ith, {})
-
- def test_default_globals(self):
- code = ("class C:\n"
- " def foo(self, a: 'C') -> 'D': pass\n"
- "class D:\n"
- " def bar(self, b: 'D') -> C: pass\n"
- )
- ns = {}
- exec(code, ns)
- hints = get_type_hints(ns['C'].foo)
- self.assertEqual(hints, {'a': ns['C'], 'return': ns['D']})
-
-
-class OverloadTests(BaseTestCase):
-
- def test_overload_exists(self):
- from typing import overload
-
- def test_overload_fails(self):
- from typing import overload
-
- with self.assertRaises(RuntimeError):
-
- @overload
- def blah():
- pass
-
- blah()
-
- def test_overload_succeeds(self):
- from typing import overload
-
- @overload
- def blah():
- pass
-
- def blah():
- pass
-
- blah()
-
-
-ASYNCIO = sys.version_info[:2] >= (3, 5)
-
-ASYNCIO_TESTS = """
-import asyncio
-
-T_a = TypeVar('T_a')
-
-class AwaitableWrapper(typing.Awaitable[T_a]):
-
- def __init__(self, value):
- self.value = value
-
- def __await__(self) -> typing.Iterator[T_a]:
- yield
- return self.value
-
-class AsyncIteratorWrapper(typing.AsyncIterator[T_a]):
-
- def __init__(self, value: typing.Iterable[T_a]):
- self.value = value
-
- def __aiter__(self) -> typing.AsyncIterator[T_a]:
- return self
-
- @asyncio.coroutine
- def __anext__(self) -> T_a:
- data = yield from self.value
- if data:
- return data
- else:
- raise StopAsyncIteration
-"""
-
-if ASYNCIO:
- try:
- exec(ASYNCIO_TESTS)
- except ImportError:
- ASYNCIO = False
-
-PY36 = sys.version_info[:2] >= (3, 6)
-
-PY36_TESTS = """
-from test import ann_module, ann_module2, ann_module3
-
-class A:
- y: float
-class B(A):
- x: ClassVar[Optional['B']] = None
- y: int
-class CSub(B):
- z: ClassVar['CSub'] = B()
-class G(Generic[T]):
- lst: ClassVar[List[T]] = []
-
-class CoolEmployee(NamedTuple):
- name: str
- cool: int
-"""
-
-if PY36:
- exec(PY36_TESTS)
-
-gth = get_type_hints
-
-class GetTypeHintTests(BaseTestCase):
- def test_get_type_hints_from_various_objects(self):
- # For invalid objects should fail with TypeError (not AttributeError etc).
- with self.assertRaises(TypeError):
- gth(123)
- with self.assertRaises(TypeError):
- gth('abc')
- with self.assertRaises(TypeError):
- gth(None)
-
- @skipUnless(PY36, 'Python 3.6 required')
- def test_get_type_hints_modules(self):
- self.assertEqual(gth(ann_module), {1: 2, 'f': Tuple[int, int], 'x': int, 'y': str})
- self.assertEqual(gth(ann_module2), {})
- self.assertEqual(gth(ann_module3), {})
-
- @skipUnless(PY36, 'Python 3.6 required')
- def test_get_type_hints_classes(self):
- self.assertEqual(gth(ann_module.C, ann_module.__dict__),
- {'y': Optional[ann_module.C]})
- self.assertIsInstance(gth(ann_module.j_class), dict)
- self.assertEqual(gth(ann_module.M), {'123': 123, 'o': type})
- self.assertEqual(gth(ann_module.D),
- {'j': str, 'k': str, 'y': Optional[ann_module.C]})
- self.assertEqual(gth(ann_module.Y), {'z': int})
- self.assertEqual(gth(ann_module.h_class),
- {'y': Optional[ann_module.C]})
- self.assertEqual(gth(ann_module.S), {'x': str, 'y': str})
- self.assertEqual(gth(ann_module.foo), {'x': int})
-
- @skipUnless(PY36, 'Python 3.6 required')
- def test_respect_no_type_check(self):
- @no_type_check
- class NoTpCheck:
- class Inn:
- def __init__(self, x: 'not a type'): ...
- self.assertTrue(NoTpCheck.__no_type_check__)
- self.assertTrue(NoTpCheck.Inn.__init__.__no_type_check__)
- self.assertEqual(gth(ann_module2.NTC.meth), {})
- class ABase(Generic[T]):
- def meth(x: int): ...
- @no_type_check
- class Der(ABase): ...
- self.assertEqual(gth(ABase.meth), {'x': int})
-
- def test_get_type_hints_for_builins(self):
- # Should not fail for built-in classes and functions.
- self.assertEqual(gth(int), {})
- self.assertEqual(gth(type), {})
- self.assertEqual(gth(dir), {})
- self.assertEqual(gth(len), {})
-
- def test_previous_behavior(self):
- def testf(x, y): ...
- testf.__annotations__['x'] = 'int'
- self.assertEqual(gth(testf), {'x': int})
-
- def test_get_type_hints_for_object_with_annotations(self):
- class A: ...
- class B: ...
- b = B()
- b.__annotations__ = {'x': 'A'}
- self.assertEqual(gth(b, locals()), {'x': A})
-
- @skipUnless(PY36, 'Python 3.6 required')
- def test_get_type_hints_ClassVar(self):
- self.assertEqual(gth(ann_module2.CV, ann_module2.__dict__),
- {'var': typing.ClassVar[ann_module2.CV]})
- self.assertEqual(gth(B, globals()),
- {'y': int, 'x': ClassVar[Optional[B]]})
- self.assertEqual(gth(CSub, globals()),
- {'z': ClassVar[CSub], 'y': int, 'x': ClassVar[Optional[B]]})
- self.assertEqual(gth(G), {'lst': ClassVar[List[T]]})
-
-
-class CollectionsAbcTests(BaseTestCase):
-
- def test_hashable(self):
- self.assertIsInstance(42, typing.Hashable)
- self.assertNotIsInstance([], typing.Hashable)
-
- def test_iterable(self):
- self.assertIsInstance([], typing.Iterable)
- # Due to ABC caching, the second time takes a separate code
- # path and could fail. So call this a few times.
- self.assertIsInstance([], typing.Iterable)
- self.assertIsInstance([], typing.Iterable)
- self.assertNotIsInstance(42, typing.Iterable)
- # Just in case, also test issubclass() a few times.
- self.assertIsSubclass(list, typing.Iterable)
- self.assertIsSubclass(list, typing.Iterable)
-
- def test_iterator(self):
- it = iter([])
- self.assertIsInstance(it, typing.Iterator)
- self.assertNotIsInstance(42, typing.Iterator)
-
- @skipUnless(ASYNCIO, 'Python 3.5 and multithreading required')
- def test_awaitable(self):
- ns = {}
- exec(
- "async def foo() -> typing.Awaitable[int]:\n"
- " return await AwaitableWrapper(42)\n",
- globals(), ns)
- foo = ns['foo']
- g = foo()
- self.assertIsInstance(g, typing.Awaitable)
- self.assertNotIsInstance(foo, typing.Awaitable)
- g.send(None) # Run foo() till completion, to avoid warning.
-
- @skipUnless(ASYNCIO, 'Python 3.5 and multithreading required')
- def test_coroutine(self):
- ns = {}
- exec(
- "async def foo():\n"
- " return\n",
- globals(), ns)
- foo = ns['foo']
- g = foo()
- self.assertIsInstance(g, typing.Coroutine)
- with self.assertRaises(TypeError):
- isinstance(g, typing.Coroutine[int])
- self.assertNotIsInstance(foo, typing.Coroutine)
- try:
- g.send(None)
- except StopIteration:
- pass
-
- @skipUnless(ASYNCIO, 'Python 3.5 and multithreading required')
- def test_async_iterable(self):
- base_it = range(10) # type: Iterator[int]
- it = AsyncIteratorWrapper(base_it)
- self.assertIsInstance(it, typing.AsyncIterable)
- self.assertIsInstance(it, typing.AsyncIterable)
- self.assertNotIsInstance(42, typing.AsyncIterable)
-
- @skipUnless(ASYNCIO, 'Python 3.5 and multithreading required')
- def test_async_iterator(self):
- base_it = range(10) # type: Iterator[int]
- it = AsyncIteratorWrapper(base_it)
- self.assertIsInstance(it, typing.AsyncIterator)
- self.assertNotIsInstance(42, typing.AsyncIterator)
-
- def test_sized(self):
- self.assertIsInstance([], typing.Sized)
- self.assertNotIsInstance(42, typing.Sized)
-
- def test_container(self):
- self.assertIsInstance([], typing.Container)
- self.assertNotIsInstance(42, typing.Container)
-
- def test_collection(self):
- if hasattr(typing, 'Collection'):
- self.assertIsInstance(tuple(), typing.Collection)
- self.assertIsInstance(frozenset(), typing.Collection)
- self.assertIsSubclass(dict, typing.Collection)
- self.assertNotIsInstance(42, typing.Collection)
-
- def test_abstractset(self):
- self.assertIsInstance(set(), typing.AbstractSet)
- self.assertNotIsInstance(42, typing.AbstractSet)
-
- def test_mutableset(self):
- self.assertIsInstance(set(), typing.MutableSet)
- self.assertNotIsInstance(frozenset(), typing.MutableSet)
-
- def test_mapping(self):
- self.assertIsInstance({}, typing.Mapping)
- self.assertNotIsInstance(42, typing.Mapping)
-
- def test_mutablemapping(self):
- self.assertIsInstance({}, typing.MutableMapping)
- self.assertNotIsInstance(42, typing.MutableMapping)
-
- def test_sequence(self):
- self.assertIsInstance([], typing.Sequence)
- self.assertNotIsInstance(42, typing.Sequence)
-
- def test_mutablesequence(self):
- self.assertIsInstance([], typing.MutableSequence)
- self.assertNotIsInstance((), typing.MutableSequence)
-
- def test_bytestring(self):
- self.assertIsInstance(b'', typing.ByteString)
- self.assertIsInstance(bytearray(b''), typing.ByteString)
-
- def test_list(self):
- self.assertIsSubclass(list, typing.List)
-
- def test_set(self):
- self.assertIsSubclass(set, typing.Set)
- self.assertNotIsSubclass(frozenset, typing.Set)
-
- def test_frozenset(self):
- self.assertIsSubclass(frozenset, typing.FrozenSet)
- self.assertNotIsSubclass(set, typing.FrozenSet)
-
- def test_dict(self):
- self.assertIsSubclass(dict, typing.Dict)
-
- def test_no_list_instantiation(self):
- with self.assertRaises(TypeError):
- typing.List()
- with self.assertRaises(TypeError):
- typing.List[T]()
- with self.assertRaises(TypeError):
- typing.List[int]()
-
- def test_list_subclass(self):
-
- class MyList(typing.List[int]):
- pass
-
- a = MyList()
- self.assertIsInstance(a, MyList)
- self.assertIsInstance(a, typing.Sequence)
-
- self.assertIsSubclass(MyList, list)
- self.assertNotIsSubclass(list, MyList)
-
- def test_no_dict_instantiation(self):
- with self.assertRaises(TypeError):
- typing.Dict()
- with self.assertRaises(TypeError):
- typing.Dict[KT, VT]()
- with self.assertRaises(TypeError):
- typing.Dict[str, int]()
-
- def test_dict_subclass(self):
-
- class MyDict(typing.Dict[str, int]):
- pass
-
- d = MyDict()
- self.assertIsInstance(d, MyDict)
- self.assertIsInstance(d, typing.MutableMapping)
-
- self.assertIsSubclass(MyDict, dict)
- self.assertNotIsSubclass(dict, MyDict)
-
- def test_no_defaultdict_instantiation(self):
- with self.assertRaises(TypeError):
- typing.DefaultDict()
- with self.assertRaises(TypeError):
- typing.DefaultDict[KT, VT]()
- with self.assertRaises(TypeError):
- typing.DefaultDict[str, int]()
-
- def test_defaultdict_subclass(self):
-
- class MyDefDict(typing.DefaultDict[str, int]):
- pass
-
- dd = MyDefDict()
- self.assertIsInstance(dd, MyDefDict)
-
- self.assertIsSubclass(MyDefDict, collections.defaultdict)
- self.assertNotIsSubclass(collections.defaultdict, MyDefDict)
-
- def test_no_set_instantiation(self):
- with self.assertRaises(TypeError):
- typing.Set()
- with self.assertRaises(TypeError):
- typing.Set[T]()
- with self.assertRaises(TypeError):
- typing.Set[int]()
-
- def test_set_subclass_instantiation(self):
-
- class MySet(typing.Set[int]):
- pass
-
- d = MySet()
- self.assertIsInstance(d, MySet)
-
- def test_no_frozenset_instantiation(self):
- with self.assertRaises(TypeError):
- typing.FrozenSet()
- with self.assertRaises(TypeError):
- typing.FrozenSet[T]()
- with self.assertRaises(TypeError):
- typing.FrozenSet[int]()
-
- def test_frozenset_subclass_instantiation(self):
-
- class MyFrozenSet(typing.FrozenSet[int]):
- pass
-
- d = MyFrozenSet()
- self.assertIsInstance(d, MyFrozenSet)
-
- def test_no_tuple_instantiation(self):
- with self.assertRaises(TypeError):
- Tuple()
- with self.assertRaises(TypeError):
- Tuple[T]()
- with self.assertRaises(TypeError):
- Tuple[int]()
-
- def test_generator(self):
- def foo():
- yield 42
- g = foo()
- self.assertIsSubclass(type(g), typing.Generator)
-
- def test_no_generator_instantiation(self):
- with self.assertRaises(TypeError):
- typing.Generator()
- with self.assertRaises(TypeError):
- typing.Generator[T, T, T]()
- with self.assertRaises(TypeError):
- typing.Generator[int, int, int]()
-
- def test_subclassing(self):
-
- class MMA(typing.MutableMapping):
- pass
-
- with self.assertRaises(TypeError): # It's abstract
- MMA()
-
- class MMC(MMA):
- def __getitem__(self, k):
- return None
- def __setitem__(self, k, v):
- pass
- def __delitem__(self, k):
- pass
- def __iter__(self):
- return iter(())
- def __len__(self):
- return 0
-
- self.assertEqual(len(MMC()), 0)
- assert callable(MMC.update)
- self.assertIsInstance(MMC(), typing.Mapping)
-
- class MMB(typing.MutableMapping[KT, VT]):
- def __getitem__(self, k):
- return None
- def __setitem__(self, k, v):
- pass
- def __delitem__(self, k):
- pass
- def __iter__(self):
- return iter(())
- def __len__(self):
- return 0
-
- self.assertEqual(len(MMB()), 0)
- self.assertEqual(len(MMB[str, str]()), 0)
- self.assertEqual(len(MMB[KT, VT]()), 0)
-
- self.assertNotIsSubclass(dict, MMA)
- self.assertNotIsSubclass(dict, MMB)
-
- self.assertIsSubclass(MMA, typing.Mapping)
- self.assertIsSubclass(MMB, typing.Mapping)
- self.assertIsSubclass(MMC, typing.Mapping)
-
- self.assertIsInstance(MMB[KT, VT](), typing.Mapping)
- self.assertIsInstance(MMB[KT, VT](), collections.Mapping)
-
- self.assertIsSubclass(MMA, collections.Mapping)
- self.assertIsSubclass(MMB, collections.Mapping)
- self.assertIsSubclass(MMC, collections.Mapping)
-
- self.assertIsSubclass(MMB[str, str], typing.Mapping)
- self.assertIsSubclass(MMC, MMA)
-
- class I(typing.Iterable): ...
- self.assertNotIsSubclass(list, I)
-
- class G(typing.Generator[int, int, int]): ...
- def g(): yield 0
- self.assertIsSubclass(G, typing.Generator)
- self.assertIsSubclass(G, typing.Iterable)
- if hasattr(collections, 'Generator'):
- self.assertIsSubclass(G, collections.Generator)
- self.assertIsSubclass(G, collections.Iterable)
- self.assertNotIsSubclass(type(g), G)
-
- def test_subclassing_subclasshook(self):
-
- class Base(typing.Iterable):
- @classmethod
- def __subclasshook__(cls, other):
- if other.__name__ == 'Foo':
- return True
- else:
- return False
-
- class C(Base): ...
- class Foo: ...
- class Bar: ...
- self.assertIsSubclass(Foo, Base)
- self.assertIsSubclass(Foo, C)
- self.assertNotIsSubclass(Bar, C)
-
- def test_subclassing_register(self):
-
- class A(typing.Container): ...
- class B(A): ...
-
- class C: ...
- A.register(C)
- self.assertIsSubclass(C, A)
- self.assertNotIsSubclass(C, B)
-
- class D: ...
- B.register(D)
- self.assertIsSubclass(D, A)
- self.assertIsSubclass(D, B)
-
- class M(): ...
- collections.MutableMapping.register(M)
- self.assertIsSubclass(M, typing.Mapping)
-
- def test_collections_as_base(self):
-
- class M(collections.Mapping): ...
- self.assertIsSubclass(M, typing.Mapping)
- self.assertIsSubclass(M, typing.Iterable)
-
- class S(collections.MutableSequence): ...
- self.assertIsSubclass(S, typing.MutableSequence)
- self.assertIsSubclass(S, typing.Iterable)
-
- class I(collections.Iterable): ...
- self.assertIsSubclass(I, typing.Iterable)
-
- class A(collections.Mapping, metaclass=abc.ABCMeta): ...
- class B: ...
- A.register(B)
- self.assertIsSubclass(B, typing.Mapping)
-
-
-class OtherABCTests(BaseTestCase):
-
- @skipUnless(hasattr(typing, 'ContextManager'),
- 'requires typing.ContextManager')
- def test_contextmanager(self):
- @contextlib.contextmanager
- def manager():
- yield 42
-
- cm = manager()
- self.assertIsInstance(cm, typing.ContextManager)
- self.assertNotIsInstance(42, typing.ContextManager)
-
-
-class TypeTests(BaseTestCase):
-
- def test_type_basic(self):
-
- class User: pass
- class BasicUser(User): pass
- class ProUser(User): pass
-
- def new_user(user_class: Type[User]) -> User:
- return user_class()
-
- joe = new_user(BasicUser)
-
- def test_type_typevar(self):
-
- class User: pass
- class BasicUser(User): pass
- class ProUser(User): pass
-
- U = TypeVar('U', bound=User)
-
- def new_user(user_class: Type[U]) -> U:
- return user_class()
-
- joe = new_user(BasicUser)
-
- def test_type_optional(self):
- A = Optional[Type[BaseException]]
-
- def foo(a: A) -> Optional[BaseException]:
- if a is None:
- return None
- else:
- return a()
-
- assert isinstance(foo(KeyboardInterrupt), KeyboardInterrupt)
- assert foo(None) is None
-
-
-class NewTypeTests(BaseTestCase):
-
- def test_basic(self):
- UserId = NewType('UserId', int)
- UserName = NewType('UserName', str)
- self.assertIsInstance(UserId(5), int)
- self.assertIsInstance(UserName('Joe'), str)
- self.assertEqual(UserId(5) + 1, 6)
-
- def test_errors(self):
- UserId = NewType('UserId', int)
- UserName = NewType('UserName', str)
- with self.assertRaises(TypeError):
- issubclass(UserId, int)
- with self.assertRaises(TypeError):
- class D(UserName):
- pass
-
-
-class NamedTupleTests(BaseTestCase):
-
- def test_basics(self):
- Emp = NamedTuple('Emp', [('name', str), ('id', int)])
- self.assertIsSubclass(Emp, tuple)
- joe = Emp('Joe', 42)
- jim = Emp(name='Jim', id=1)
- self.assertIsInstance(joe, Emp)
- self.assertIsInstance(joe, tuple)
- self.assertEqual(joe.name, 'Joe')
- self.assertEqual(joe.id, 42)
- self.assertEqual(jim.name, 'Jim')
- self.assertEqual(jim.id, 1)
- self.assertEqual(Emp.__name__, 'Emp')
- self.assertEqual(Emp._fields, ('name', 'id'))
- self.assertEqual(Emp._field_types, dict(name=str, id=int))
-
- @skipUnless(PY36, 'Python 3.6 required')
- def test_annotation_usage(self):
- tim = CoolEmployee('Tim', 9000)
- self.assertIsInstance(tim, CoolEmployee)
- self.assertIsInstance(tim, tuple)
- self.assertEqual(tim.name, 'Tim')
- self.assertEqual(tim.cool, 9000)
- self.assertEqual(CoolEmployee.__name__, 'CoolEmployee')
- self.assertEqual(CoolEmployee._fields, ('name', 'cool'))
- self.assertEqual(CoolEmployee._field_types, dict(name=str, cool=int))
-
- @skipUnless(PY36, 'Python 3.6 required')
- def test_namedtuple_keyword_usage(self):
- LocalEmployee = NamedTuple("LocalEmployee", name=str, age=int)
- nick = LocalEmployee('Nick', 25)
- self.assertIsInstance(nick, tuple)
- self.assertEqual(nick.name, 'Nick')
- self.assertEqual(LocalEmployee.__name__, 'LocalEmployee')
- self.assertEqual(LocalEmployee._fields, ('name', 'age'))
- self.assertEqual(LocalEmployee._field_types, dict(name=str, age=int))
- with self.assertRaises(TypeError):
- NamedTuple('Name', [('x', int)], y=str)
- with self.assertRaises(TypeError):
- NamedTuple('Name', x=1, y='a')
-
- def test_pickle(self):
- global Emp # pickle wants to reference the class by name
- Emp = NamedTuple('Emp', [('name', str), ('id', int)])
- jane = Emp('jane', 37)
- for proto in range(pickle.HIGHEST_PROTOCOL + 1):
- z = pickle.dumps(jane, proto)
- jane2 = pickle.loads(z)
- self.assertEqual(jane2, jane)
-
-
-class IOTests(BaseTestCase):
-
- def test_io(self):
-
- def stuff(a: IO) -> AnyStr:
- return a.readline()
-
- a = stuff.__annotations__['a']
- self.assertEqual(a.__parameters__, (AnyStr,))
-
- def test_textio(self):
-
- def stuff(a: TextIO) -> str:
- return a.readline()
-
- a = stuff.__annotations__['a']
- self.assertEqual(a.__parameters__, ())
-
- def test_binaryio(self):
-
- def stuff(a: BinaryIO) -> bytes:
- return a.readline()
-
- a = stuff.__annotations__['a']
- self.assertEqual(a.__parameters__, ())
-
- def test_io_submodule(self):
- from typing.io import IO, TextIO, BinaryIO, __all__, __name__
- self.assertIs(IO, typing.IO)
- self.assertIs(TextIO, typing.TextIO)
- self.assertIs(BinaryIO, typing.BinaryIO)
- self.assertEqual(set(__all__), set(['IO', 'TextIO', 'BinaryIO']))
- self.assertEqual(__name__, 'typing.io')
-
-
-class RETests(BaseTestCase):
- # Much of this is really testing _TypeAlias.
-
- def test_basics(self):
- pat = re.compile('[a-z]+', re.I)
- self.assertIsSubclass(pat.__class__, Pattern)
- self.assertIsSubclass(type(pat), Pattern)
- self.assertIsInstance(pat, Pattern)
-
- mat = pat.search('12345abcde.....')
- self.assertIsSubclass(mat.__class__, Match)
- self.assertIsSubclass(type(mat), Match)
- self.assertIsInstance(mat, Match)
-
- # these should just work
- p = Pattern[Union[str, bytes]]
- m = Match[Union[bytes, str]]
-
- def test_errors(self):
- with self.assertRaises(TypeError):
- # Doesn't fit AnyStr.
- Pattern[int]
- with self.assertRaises(TypeError):
- # Can't change type vars?
- Match[T]
- m = Match[Union[str, bytes]]
- with self.assertRaises(TypeError):
- # Too complicated?
- m[str]
- with self.assertRaises(TypeError):
- # We don't support isinstance().
- isinstance(42, Pattern[str])
-
- def test_repr(self):
- self.assertEqual(repr(Pattern), 'Pattern[~AnyStr]')
- self.assertEqual(repr(Pattern[str]), 'Pattern[str]')
- self.assertEqual(repr(Pattern[bytes]), 'Pattern[bytes]')
- self.assertEqual(repr(Match), 'Match[~AnyStr]')
- self.assertEqual(repr(Match[str]), 'Match[str]')
- self.assertEqual(repr(Match[bytes]), 'Match[bytes]')
-
- def test_re_submodule(self):
- from typing.re import Match, Pattern, __all__, __name__
- self.assertIs(Match, typing.Match)
- self.assertIs(Pattern, typing.Pattern)
- self.assertEqual(set(__all__), set(['Match', 'Pattern']))
- self.assertEqual(__name__, 'typing.re')
-
- def test_cannot_subclass(self):
- with self.assertRaises(TypeError) as ex:
-
- class A(typing.Match):
- pass
-
- self.assertEqual(str(ex.exception),
- "Cannot subclass typing._TypeAlias")
-
-
-class AllTests(BaseTestCase):
- """Tests for __all__."""
-
- def test_all(self):
- from typing import __all__ as a
- # Just spot-check the first and last of every category.
- self.assertIn('AbstractSet', a)
- self.assertIn('ValuesView', a)
- self.assertIn('cast', a)
- self.assertIn('overload', a)
- if hasattr(contextlib, 'AbstractContextManager'):
- self.assertIn('ContextManager', a)
- # Check that io and re are not exported.
- self.assertNotIn('io', a)
- self.assertNotIn('re', a)
- # Spot-check that stdlib modules aren't exported.
- self.assertNotIn('os', a)
- self.assertNotIn('sys', a)
- # Check that Text is defined.
- self.assertIn('Text', a)
-
-
-if __name__ == '__main__':
- main()
diff --git a/lib-typing/3.2/typing.py b/lib-typing/3.2/typing.py
deleted file mode 100644
index 34845b7..0000000
--- a/lib-typing/3.2/typing.py
+++ /dev/null
@@ -1,2160 +0,0 @@
-import abc
-from abc import abstractmethod, abstractproperty
-import collections
-import contextlib
-import functools
-import re as stdlib_re # Avoid confusion with the re we export.
-import sys
-import types
-try:
- import collections.abc as collections_abc
-except ImportError:
- import collections as collections_abc # Fallback for PY3.2.
-
-
-# Please keep __all__ alphabetized within each category.
-__all__ = [
- # Super-special typing primitives.
- 'Any',
- 'Callable',
- 'ClassVar',
- 'Generic',
- 'Optional',
- 'Tuple',
- 'Type',
- 'TypeVar',
- 'Union',
-
- # ABCs (from collections.abc).
- 'AbstractSet', # collections.abc.Set.
- 'ByteString',
- 'Container',
- 'Hashable',
- 'ItemsView',
- 'Iterable',
- 'Iterator',
- 'KeysView',
- 'Mapping',
- 'MappingView',
- 'MutableMapping',
- 'MutableSequence',
- 'MutableSet',
- 'Sequence',
- 'Sized',
- 'ValuesView',
- # The following are added depending on presence
- # of their non-generic counterparts in stdlib:
- # Awaitable,
- # AsyncIterator,
- # AsyncIterable,
- # Coroutine,
- # Collection,
- # ContextManager
-
- # Structural checks, a.k.a. protocols.
- 'Reversible',
- 'SupportsAbs',
- 'SupportsFloat',
- 'SupportsInt',
- 'SupportsRound',
-
- # Concrete collection types.
- 'Dict',
- 'DefaultDict',
- 'List',
- 'Set',
- 'FrozenSet',
- 'NamedTuple', # Not really a type.
- 'Generator',
-
- # One-off things.
- 'AnyStr',
- 'cast',
- 'get_type_hints',
- 'NewType',
- 'no_type_check',
- 'no_type_check_decorator',
- 'overload',
- 'Text',
- 'TYPE_CHECKING',
-]
-
-# The pseudo-submodules 're' and 'io' are part of the public
-# namespace, but excluded from __all__ because they might stomp on
-# legitimate imports of those modules.
-
-
-def _qualname(x):
- if sys.version_info[:2] >= (3, 3):
- return x.__qualname__
- else:
- # Fall back to just name.
- return x.__name__
-
-
-def _trim_name(nm):
- if nm.startswith('_') and nm not in ('_TypeAlias',
- '_ForwardRef', '_TypingBase', '_FinalTypingBase'):
- nm = nm[1:]
- return nm
-
-
-class TypingMeta(type):
- """Metaclass for most types defined in typing module
- (not a part of public API).
-
- This overrides __new__() to require an extra keyword parameter
- '_root', which serves as a guard against naive subclassing of the
- typing classes. Any legitimate class defined using a metaclass
- derived from TypingMeta must pass _root=True.
-
- This also defines a dummy constructor (all the work for most typing
- constructs is done in __new__) and a nicer repr().
- """
-
- _is_protocol = False
-
- def __new__(cls, name, bases, namespace, *, _root=False):
- if not _root:
- raise TypeError("Cannot subclass %s" %
- (', '.join(map(_type_repr, bases)) or '()'))
- return super().__new__(cls, name, bases, namespace)
-
- def __init__(self, *args, **kwds):
- pass
-
- def _eval_type(self, globalns, localns):
- """Override this in subclasses to interpret forward references.
-
- For example, List['C'] is internally stored as
- List[_ForwardRef('C')], which should evaluate to List[C],
- where C is an object found in globalns or localns (searching
- localns first, of course).
- """
- return self
-
- def _get_type_vars(self, tvars):
- pass
-
- def __repr__(self):
- qname = _trim_name(_qualname(self))
- return '%s.%s' % (self.__module__, qname)
-
-
-class _TypingBase(metaclass=TypingMeta, _root=True):
- """Internal indicator of special typing constructs."""
-
- __slots__ = ()
-
- def __init__(self, *args, **kwds):
- pass
-
- def __new__(cls, *args, **kwds):
- """Constructor.
-
- This only exists to give a better error message in case
- someone tries to subclass a special typing object (not a good idea).
- """
- if (len(args) == 3 and
- isinstance(args[0], str) and
- isinstance(args[1], tuple)):
- # Close enough.
- raise TypeError("Cannot subclass %r" % cls)
- return super().__new__(cls)
-
- # Things that are not classes also need these.
- def _eval_type(self, globalns, localns):
- return self
-
- def _get_type_vars(self, tvars):
- pass
-
- def __repr__(self):
- cls = type(self)
- qname = _trim_name(_qualname(cls))
- return '%s.%s' % (cls.__module__, qname)
-
- def __call__(self, *args, **kwds):
- raise TypeError("Cannot instantiate %r" % type(self))
-
-
-class _FinalTypingBase(_TypingBase, _root=True):
- """Internal mix-in class to prevent instantiation.
-
- Prevents instantiation unless _root=True is given in class call.
- It is used to create pseudo-singleton instances Any, Union, Optional, etc.
- """
-
- __slots__ = ()
-
- def __new__(cls, *args, _root=False, **kwds):
- self = super().__new__(cls, *args, **kwds)
- if _root is True:
- return self
- raise TypeError("Cannot instantiate %r" % cls)
-
- def __reduce__(self):
- return _trim_name(type(self).__name__)
-
-
-class _ForwardRef(_TypingBase, _root=True):
- """Internal wrapper to hold a forward reference."""
-
- __slots__ = ('__forward_arg__', '__forward_code__',
- '__forward_evaluated__', '__forward_value__')
-
- def __init__(self, arg):
- super().__init__(arg)
- if not isinstance(arg, str):
- raise TypeError('Forward reference must be a string -- got %r' % (arg,))
- try:
- code = compile(arg, '<string>', 'eval')
- except SyntaxError:
- raise SyntaxError('Forward reference must be an expression -- got %r' %
- (arg,))
- self.__forward_arg__ = arg
- self.__forward_code__ = code
- self.__forward_evaluated__ = False
- self.__forward_value__ = None
-
- def _eval_type(self, globalns, localns):
- if not self.__forward_evaluated__ or localns is not globalns:
- if globalns is None and localns is None:
- globalns = localns = {}
- elif globalns is None:
- globalns = localns
- elif localns is None:
- localns = globalns
- self.__forward_value__ = _type_check(
- eval(self.__forward_code__, globalns, localns),
- "Forward references must evaluate to types.")
- self.__forward_evaluated__ = True
- return self.__forward_value__
-
- def __eq__(self, other):
- if not isinstance(other, _ForwardRef):
- return NotImplemented
- return (self.__forward_arg__ == other.__forward_arg__ and
- self.__forward_value__ == other.__forward_value__)
-
- def __hash__(self):
- return hash((self.__forward_arg__, self.__forward_value__))
-
- def __instancecheck__(self, obj):
- raise TypeError("Forward references cannot be used with isinstance().")
-
- def __subclasscheck__(self, cls):
- raise TypeError("Forward references cannot be used with issubclass().")
-
- def __repr__(self):
- return '_ForwardRef(%r)' % (self.__forward_arg__,)
-
-
-class _TypeAlias(_TypingBase, _root=True):
- """Internal helper class for defining generic variants of concrete types.
-
- Note that this is not a type; let's call it a pseudo-type. It cannot
- be used in instance and subclass checks in parameterized form, i.e.
- ``isinstance(42, Match[str])`` raises ``TypeError`` instead of returning
- ``False``.
- """
-
- __slots__ = ('name', 'type_var', 'impl_type', 'type_checker')
-
- def __init__(self, name, type_var, impl_type, type_checker):
- """Initializer.
-
- Args:
- name: The name, e.g. 'Pattern'.
- type_var: The type parameter, e.g. AnyStr, or the
- specific type, e.g. str.
- impl_type: The implementation type.
- type_checker: Function that takes an impl_type instance.
- and returns a value that should be a type_var instance.
- """
- assert isinstance(name, str), repr(name)
- assert isinstance(impl_type, type), repr(impl_type)
- assert not isinstance(impl_type, TypingMeta), repr(impl_type)
- assert isinstance(type_var, (type, _TypingBase)), repr(type_var)
- self.name = name
- self.type_var = type_var
- self.impl_type = impl_type
- self.type_checker = type_checker
-
- def __repr__(self):
- return "%s[%s]" % (self.name, _type_repr(self.type_var))
-
- def __getitem__(self, parameter):
- if not isinstance(self.type_var, TypeVar):
- raise TypeError("%s cannot be further parameterized." % self)
- if self.type_var.__constraints__ and isinstance(parameter, type):
- if not issubclass(parameter, self.type_var.__constraints__):
- raise TypeError("%s is not a valid substitution for %s." %
- (parameter, self.type_var))
- if isinstance(parameter, TypeVar) and parameter is not self.type_var:
- raise TypeError("%s cannot be re-parameterized." % self)
- return self.__class__(self.name, parameter,
- self.impl_type, self.type_checker)
-
- def __eq__(self, other):
- if not isinstance(other, _TypeAlias):
- return NotImplemented
- return self.name == other.name and self.type_var == other.type_var
-
- def __hash__(self):
- return hash((self.name, self.type_var))
-
- def __instancecheck__(self, obj):
- if not isinstance(self.type_var, TypeVar):
- raise TypeError("Parameterized type aliases cannot be used "
- "with isinstance().")
- return isinstance(obj, self.impl_type)
-
- def __subclasscheck__(self, cls):
- if not isinstance(self.type_var, TypeVar):
- raise TypeError("Parameterized type aliases cannot be used "
- "with issubclass().")
- return issubclass(cls, self.impl_type)
-
-
-def _get_type_vars(types, tvars):
- for t in types:
- if isinstance(t, TypingMeta) or isinstance(t, _TypingBase):
- t._get_type_vars(tvars)
-
-
-def _type_vars(types):
- tvars = []
- _get_type_vars(types, tvars)
- return tuple(tvars)
-
-
-def _eval_type(t, globalns, localns):
- if isinstance(t, TypingMeta) or isinstance(t, _TypingBase):
- return t._eval_type(globalns, localns)
- return t
-
-
-def _type_check(arg, msg):
- """Check that the argument is a type, and return it (internal helper).
-
- As a special case, accept None and return type(None) instead.
- Also, _TypeAlias instances (e.g. Match, Pattern) are acceptable.
-
- The msg argument is a human-readable error message, e.g.
-
- "Union[arg, ...]: arg should be a type."
-
- We append the repr() of the actual value (truncated to 100 chars).
- """
- if arg is None:
- return type(None)
- if isinstance(arg, str):
- arg = _ForwardRef(arg)
- if (isinstance(arg, _TypingBase) and type(arg).__name__ == '_ClassVar' or
- not isinstance(arg, (type, _TypingBase)) and not callable(arg)):
- raise TypeError(msg + " Got %.100r." % (arg,))
- # Bare Union etc. are not valid as type arguments
- if (type(arg).__name__ in ('_Union', '_Optional')
- and not getattr(arg, '__origin__', None)
- or isinstance(arg, TypingMeta) and _gorg(arg) in (Generic, _Protocol)):
- raise TypeError("Plain %s is not valid as type argument" % arg)
- return arg
-
-
-def _type_repr(obj):
- """Return the repr() of an object, special-casing types (internal helper).
-
- If obj is a type, we return a shorter version than the default
- type.__repr__, based on the module and qualified name, which is
- typically enough to uniquely identify a type. For everything
- else, we fall back on repr(obj).
- """
- if isinstance(obj, type) and not isinstance(obj, TypingMeta):
- if obj.__module__ == 'builtins':
- return _qualname(obj)
- return '%s.%s' % (obj.__module__, _qualname(obj))
- if obj is ...:
- return('...')
- if isinstance(obj, types.FunctionType):
- return obj.__name__
- return repr(obj)
-
-
-class _Any(_FinalTypingBase, _root=True):
- """Special type indicating an unconstrained type.
-
- - Any is compatible with every type.
- - Any assumed to have all methods.
- - All values assumed to be instances of Any.
-
- Note that all the above statements are true from the point of view of
- static type checkers. At runtime, Any should not be used with instance
- or class checks.
- """
-
- __slots__ = ()
-
- def __instancecheck__(self, obj):
- raise TypeError("Any cannot be used with isinstance().")
-
- def __subclasscheck__(self, cls):
- raise TypeError("Any cannot be used with issubclass().")
-
-
-Any = _Any(_root=True)
-
-
-class TypeVar(_TypingBase, _root=True):
- """Type variable.
-
- Usage::
-
- T = TypeVar('T') # Can be anything
- A = TypeVar('A', str, bytes) # Must be str or bytes
-
- Type variables exist primarily for the benefit of static type
- checkers. They serve as the parameters for generic types as well
- as for generic function definitions. See class Generic for more
- information on generic types. Generic functions work as follows:
-
- def repeat(x: T, n: int) -> List[T]:
- '''Return a list containing n references to x.'''
- return [x]*n
-
- def longest(x: A, y: A) -> A:
- '''Return the longest of two strings.'''
- return x if len(x) >= len(y) else y
-
- The latter example's signature is essentially the overloading
- of (str, str) -> str and (bytes, bytes) -> bytes. Also note
- that if the arguments are instances of some subclass of str,
- the return type is still plain str.
-
- At runtime, isinstance(x, T) and issubclass(C, T) will raise TypeError.
-
- Type variables defined with covariant=True or contravariant=True
- can be used do declare covariant or contravariant generic types.
- See PEP 484 for more details. By default generic types are invariant
- in all type variables.
-
- Type variables can be introspected. e.g.:
-
- T.__name__ == 'T'
- T.__constraints__ == ()
- T.__covariant__ == False
- T.__contravariant__ = False
- A.__constraints__ == (str, bytes)
- """
-
- __slots__ = ('__name__', '__bound__', '__constraints__',
- '__covariant__', '__contravariant__')
-
- def __init__(self, name, *constraints, bound=None,
- covariant=False, contravariant=False):
- super().__init__(name, *constraints, bound=bound,
- covariant=covariant, contravariant=contravariant)
- self.__name__ = name
- if covariant and contravariant:
- raise ValueError("Bivariant types are not supported.")
- self.__covariant__ = bool(covariant)
- self.__contravariant__ = bool(contravariant)
- if constraints and bound is not None:
- raise TypeError("Constraints cannot be combined with bound=...")
- if constraints and len(constraints) == 1:
- raise TypeError("A single constraint is not allowed")
- msg = "TypeVar(name, constraint, ...): constraints must be types."
- self.__constraints__ = tuple(_type_check(t, msg) for t in constraints)
- if bound:
- self.__bound__ = _type_check(bound, "Bound must be a type.")
- else:
- self.__bound__ = None
-
- def _get_type_vars(self, tvars):
- if self not in tvars:
- tvars.append(self)
-
- def __repr__(self):
- if self.__covariant__:
- prefix = '+'
- elif self.__contravariant__:
- prefix = '-'
- else:
- prefix = '~'
- return prefix + self.__name__
-
- def __instancecheck__(self, instance):
- raise TypeError("Type variables cannot be used with isinstance().")
-
- def __subclasscheck__(self, cls):
- raise TypeError("Type variables cannot be used with issubclass().")
-
-
-# Some unconstrained type variables. These are used by the container types.
-# (These are not for export.)
-T = TypeVar('T') # Any type.
-KT = TypeVar('KT') # Key type.
-VT = TypeVar('VT') # Value type.
-T_co = TypeVar('T_co', covariant=True) # Any type covariant containers.
-V_co = TypeVar('V_co', covariant=True) # Any type covariant containers.
-VT_co = TypeVar('VT_co', covariant=True) # Value type covariant containers.
-T_contra = TypeVar('T_contra', contravariant=True) # Ditto contravariant.
-
-# A useful type variable with constraints. This represents string types.
-# (This one *is* for export!)
-AnyStr = TypeVar('AnyStr', bytes, str)
-
-
-def _replace_arg(arg, tvars, args):
- """An internal helper function: replace arg if it is a type variable
- found in tvars with corresponding substitution from args or
- with corresponding substitution sub-tree if arg is a generic type.
- """
-
- if tvars is None:
- tvars = []
- if hasattr(arg, '_subs_tree'):
- return arg._subs_tree(tvars, args)
- if isinstance(arg, TypeVar):
- for i, tvar in enumerate(tvars):
- if arg == tvar:
- return args[i]
- return arg
-
-
-def _subs_tree(cls, tvars=None, args=None):
- """An internal helper function: calculate substitution tree
- for generic cls after replacing its type parameters with
- substitutions in tvars -> args (if any).
- Repeat the same following __origin__'s.
-
- Return a list of arguments with all possible substitutions
- performed. Arguments that are generic classes themselves are represented
- as tuples (so that no new classes are created by this function).
- For example: _subs_tree(List[Tuple[int, T]][str]) == [(Tuple, int, str)]
- """
-
- if cls.__origin__ is None:
- return cls
- # Make of chain of origins (i.e. cls -> cls.__origin__)
- current = cls.__origin__
- orig_chain = []
- while current.__origin__ is not None:
- orig_chain.append(current)
- current = current.__origin__
- # Replace type variables in __args__ if asked ...
- tree_args = []
- for arg in cls.__args__:
- tree_args.append(_replace_arg(arg, tvars, args))
- # ... then continue replacing down the origin chain.
- for ocls in orig_chain:
- new_tree_args = []
- for i, arg in enumerate(ocls.__args__):
- new_tree_args.append(_replace_arg(arg, ocls.__parameters__, tree_args))
- tree_args = new_tree_args
- return tree_args
-
-
-def _remove_dups_flatten(parameters):
- """An internal helper for Union creation and substitution: flatten Union's
- among parameters, then remove duplicates and strict subclasses.
- """
-
- # Flatten out Union[Union[...], ...].
- params = []
- for p in parameters:
- if isinstance(p, _Union) and p.__origin__ is Union:
- params.extend(p.__args__)
- elif isinstance(p, tuple) and len(p) > 0 and p[0] is Union:
- params.extend(p[1:])
- else:
- params.append(p)
- # Weed out strict duplicates, preserving the first of each occurrence.
- all_params = set(params)
- if len(all_params) < len(params):
- new_params = []
- for t in params:
- if t in all_params:
- new_params.append(t)
- all_params.remove(t)
- params = new_params
- assert not all_params, all_params
- # Weed out subclasses.
- # E.g. Union[int, Employee, Manager] == Union[int, Employee].
- # If object is present it will be sole survivor among proper classes.
- # Never discard type variables.
- # (In particular, Union[str, AnyStr] != AnyStr.)
- all_params = set(params)
- for t1 in params:
- if not isinstance(t1, type):
- continue
- if any(isinstance(t2, type) and issubclass(t1, t2)
- for t2 in all_params - {t1}
- if not (isinstance(t2, GenericMeta) and
- t2.__origin__ is not None)):
- all_params.remove(t1)
- return tuple(t for t in params if t in all_params)
-
-
-def _check_generic(cls, parameters):
- # Check correct count for parameters of a generic cls (internal helper).
- if not cls.__parameters__:
- raise TypeError("%s is not a generic class" % repr(cls))
- alen = len(parameters)
- elen = len(cls.__parameters__)
- if alen != elen:
- raise TypeError("Too %s parameters for %s; actual %s, expected %s" %
- ("many" if alen > elen else "few", repr(cls), alen, elen))
-
-
-_cleanups = []
-
-
-def _tp_cache(func):
- """Internal wrapper caching __getitem__ of generic types with a fallback to
- original function for non-hashable arguments.
- """
-
- cached = functools.lru_cache()(func)
- _cleanups.append(cached.cache_clear)
- @functools.wraps(func)
- def inner(*args, **kwds):
- try:
- return cached(*args, **kwds)
- except TypeError:
- pass # All real errors (not unhashable args) are raised below.
- return func(*args, **kwds)
- return inner
-
-
-class _Union(_FinalTypingBase, _root=True):
- """Union type; Union[X, Y] means either X or Y.
-
- To define a union, use e.g. Union[int, str]. Details:
-
- - The arguments must be types and there must be at least one.
-
- - None as an argument is a special case and is replaced by
- type(None).
-
- - Unions of unions are flattened, e.g.::
-
- Union[Union[int, str], float] == Union[int, str, float]
-
- - Unions of a single argument vanish, e.g.::
-
- Union[int] == int # The constructor actually returns int
-
- - Redundant arguments are skipped, e.g.::
-
- Union[int, str, int] == Union[int, str]
-
- - When comparing unions, the argument order is ignored, e.g.::
-
- Union[int, str] == Union[str, int]
-
- - When two arguments have a subclass relationship, the least
- derived argument is kept, e.g.::
-
- class Employee: pass
- class Manager(Employee): pass
- Union[int, Employee, Manager] == Union[int, Employee]
- Union[Manager, int, Employee] == Union[int, Employee]
- Union[Employee, Manager] == Employee
-
- - Similar for object::
-
- Union[int, object] == object
-
- - You cannot subclass or instantiate a union.
-
- - You can use Optional[X] as a shorthand for Union[X, None].
- """
-
- __slots__ = ('__parameters__', '__args__', '__origin__', '__tree_hash__')
-
- def __new__(cls, parameters=None, origin=None, *args, _root=False):
- self = super().__new__(cls, parameters, origin, *args, _root=_root)
- if origin is None:
- self.__parameters__ = None
- self.__args__ = None
- self.__origin__ = None
- self.__tree_hash__ = hash(frozenset(('Union',)))
- return self
- if not isinstance(parameters, tuple):
- raise TypeError("Expected parameters=<tuple>")
- if origin is Union:
- parameters = _remove_dups_flatten(parameters)
- # It's not a union if there's only one type left.
- if len(parameters) == 1:
- return parameters[0]
- self.__parameters__ = _type_vars(parameters)
- self.__args__ = parameters
- self.__origin__ = origin
- # Pre-calculate the __hash__ on instantiation.
- # This improves speed for complex substitutions.
- subs_tree = self._subs_tree()
- if isinstance(subs_tree, tuple):
- self.__tree_hash__ = hash(frozenset(subs_tree))
- else:
- self.__tree_hash__ = hash(subs_tree)
- return self
-
- def _eval_type(self, globalns, localns):
- if self.__args__ is None:
- return self
- ev_args = tuple(_eval_type(t, globalns, localns) for t in self.__args__)
- ev_origin = _eval_type(self.__origin__, globalns, localns)
- if ev_args == self.__args__ and ev_origin == self.__origin__:
- # Everything is already evaluated.
- return self
- return self.__class__(ev_args, ev_origin, _root=True)
-
- def _get_type_vars(self, tvars):
- if self.__origin__ and self.__parameters__:
- _get_type_vars(self.__parameters__, tvars)
-
- def __repr__(self):
- if self.__origin__ is None:
- return super().__repr__()
- tree = self._subs_tree()
- if not isinstance(tree, tuple):
- return repr(tree)
- return tree[0]._tree_repr(tree)
-
- def _tree_repr(self, tree):
- arg_list = []
- for arg in tree[1:]:
- if not isinstance(arg, tuple):
- arg_list.append(_type_repr(arg))
- else:
- arg_list.append(arg[0]._tree_repr(arg))
- return super().__repr__() + '[%s]' % ', '.join(arg_list)
-
- @_tp_cache
- def __getitem__(self, parameters):
- if parameters == ():
- raise TypeError("Cannot take a Union of no types.")
- if not isinstance(parameters, tuple):
- parameters = (parameters,)
- if self.__origin__ is None:
- msg = "Union[arg, ...]: each arg must be a type."
- else:
- msg = "Parameters to generic types must be types."
- parameters = tuple(_type_check(p, msg) for p in parameters)
- if self is not Union:
- _check_generic(self, parameters)
- return self.__class__(parameters, origin=self, _root=True)
-
- def _subs_tree(self, tvars=None, args=None):
- if self is Union:
- return Union # Nothing to substitute
- tree_args = _subs_tree(self, tvars, args)
- tree_args = _remove_dups_flatten(tree_args)
- if len(tree_args) == 1:
- return tree_args[0] # Union of a single type is that type
- return (Union,) + tree_args
-
- def __eq__(self, other):
- if not isinstance(other, _Union):
- return self._subs_tree() == other
- return self.__tree_hash__ == other.__tree_hash__
-
- def __hash__(self):
- return self.__tree_hash__
-
- def __instancecheck__(self, obj):
- raise TypeError("Unions cannot be used with isinstance().")
-
- def __subclasscheck__(self, cls):
- raise TypeError("Unions cannot be used with issubclass().")
-
-
-Union = _Union(_root=True)
-
-
-class _Optional(_FinalTypingBase, _root=True):
- """Optional type.
-
- Optional[X] is equivalent to Union[X, None].
- """
-
- __slots__ = ()
-
- @_tp_cache
- def __getitem__(self, arg):
- arg = _type_check(arg, "Optional[t] requires a single type.")
- return Union[arg, type(None)]
-
-
-Optional = _Optional(_root=True)
-
-
-def _gorg(a):
- """Return the farthest origin of a generic class (internal helper)."""
- assert isinstance(a, GenericMeta)
- while a.__origin__ is not None:
- a = a.__origin__
- return a
-
-
-def _geqv(a, b):
- """Return whether two generic classes are equivalent (internal helper).
-
- The intention is to consider generic class X and any of its
- parameterized forms (X[T], X[int], etc.) as equivalent.
-
- However, X is not equivalent to a subclass of X.
-
- The relation is reflexive, symmetric and transitive.
- """
- assert isinstance(a, GenericMeta) and isinstance(b, GenericMeta)
- # Reduce each to its origin.
- return _gorg(a) is _gorg(b)
-
-
-def _next_in_mro(cls):
- """Helper for Generic.__new__.
-
- Returns the class after the last occurrence of Generic or
- Generic[...] in cls.__mro__.
- """
- next_in_mro = object
- # Look for the last occurrence of Generic or Generic[...].
- for i, c in enumerate(cls.__mro__[:-1]):
- if isinstance(c, GenericMeta) and _gorg(c) is Generic:
- next_in_mro = cls.__mro__[i+1]
- return next_in_mro
-
-
-def _valid_for_check(cls):
- """An internal helper to prohibit isinstance([1], List[str]) etc."""
- if cls is Generic:
- raise TypeError("Class %r cannot be used with class "
- "or instance checks" % cls)
- if (cls.__origin__ is not None and
- sys._getframe(3).f_globals['__name__'] not in ['abc', 'functools']):
- raise TypeError("Parameterized generics cannot be used with class "
- "or instance checks")
-
-
-def _make_subclasshook(cls):
- """Construct a __subclasshook__ callable that incorporates
- the associated __extra__ class in subclass checks performed
- against cls.
- """
- if isinstance(cls.__extra__, abc.ABCMeta):
- # The logic mirrors that of ABCMeta.__subclasscheck__.
- # Registered classes need not be checked here because
- # cls and its extra share the same _abc_registry.
- def __extrahook__(subclass):
- _valid_for_check(cls)
- res = cls.__extra__.__subclasshook__(subclass)
- if res is not NotImplemented:
- return res
- if cls.__extra__ in subclass.__mro__:
- return True
- for scls in cls.__extra__.__subclasses__():
- if isinstance(scls, GenericMeta):
- continue
- if issubclass(subclass, scls):
- return True
- return NotImplemented
- else:
- # For non-ABC extras we'll just call issubclass().
- def __extrahook__(subclass):
- _valid_for_check(cls)
- if cls.__extra__ and issubclass(subclass, cls.__extra__):
- return True
- return NotImplemented
- return __extrahook__
-
-
-def _no_slots_copy(dct):
- """Internal helper: copy class __dict__ and clean slots class variables.
- (They will be re-created if necessary by normal class machinery.)
- """
- dict_copy = dict(dct)
- if '__slots__' in dict_copy:
- for slot in dict_copy['__slots__']:
- dict_copy.pop(slot, None)
- return dict_copy
-
-
-class GenericMeta(TypingMeta, abc.ABCMeta):
- """Metaclass for generic types."""
-
- def __new__(cls, name, bases, namespace,
- tvars=None, args=None, origin=None, extra=None, orig_bases=None):
- if tvars is not None:
- # Called from __getitem__() below.
- assert origin is not None
- assert all(isinstance(t, TypeVar) for t in tvars), tvars
- else:
- # Called from class statement.
- assert tvars is None, tvars
- assert args is None, args
- assert origin is None, origin
-
- # Get the full set of tvars from the bases.
- tvars = _type_vars(bases)
- # Look for Generic[T1, ..., Tn].
- # If found, tvars must be a subset of it.
- # If not found, tvars is it.
- # Also check for and reject plain Generic,
- # and reject multiple Generic[...].
- gvars = None
- for base in bases:
- if base is Generic:
- raise TypeError("Cannot inherit from plain Generic")
- if (isinstance(base, GenericMeta) and
- base.__origin__ is Generic):
- if gvars is not None:
- raise TypeError(
- "Cannot inherit from Generic[...] multiple types.")
- gvars = base.__parameters__
- if gvars is None:
- gvars = tvars
- else:
- tvarset = set(tvars)
- gvarset = set(gvars)
- if not tvarset <= gvarset:
- raise TypeError(
- "Some type variables (%s) "
- "are not listed in Generic[%s]" %
- (", ".join(str(t) for t in tvars if t not in gvarset),
- ", ".join(str(g) for g in gvars)))
- tvars = gvars
-
- initial_bases = bases
- if extra is not None and type(extra) is abc.ABCMeta and extra not in bases:
- bases = (extra,) + bases
- bases = tuple(_gorg(b) if isinstance(b, GenericMeta) else b for b in bases)
-
- # remove bare Generic from bases if there are other generic bases
- if any(isinstance(b, GenericMeta) and b is not Generic for b in bases):
- bases = tuple(b for b in bases if b is not Generic)
- self = super().__new__(cls, name, bases, namespace, _root=True)
-
- self.__parameters__ = tvars
- # Be prepared that GenericMeta will be subclassed by TupleMeta
- # and CallableMeta, those two allow ..., (), or [] in __args___.
- self.__args__ = tuple(... if a is _TypingEllipsis else
- () if a is _TypingEmpty else
- a for a in args) if args else None
- self.__origin__ = origin
- self.__extra__ = extra
- # Speed hack (https://github.com/python/typing/issues/196).
- self.__next_in_mro__ = _next_in_mro(self)
- # Preserve base classes on subclassing (__bases__ are type erased now).
- if orig_bases is None:
- self.__orig_bases__ = initial_bases
-
- # This allows unparameterized generic collections to be used
- # with issubclass() and isinstance() in the same way as their
- # collections.abc counterparts (e.g., isinstance([], Iterable)).
- if ('__subclasshook__' not in namespace and extra # allow overriding
- or hasattr(self.__subclasshook__, '__name__') and
- self.__subclasshook__.__name__ == '__extrahook__'):
- self.__subclasshook__ = _make_subclasshook(self)
- if isinstance(extra, abc.ABCMeta):
- self._abc_registry = extra._abc_registry
-
- if origin and hasattr(origin, '__qualname__'): # Fix for Python 3.2.
- self.__qualname__ = origin.__qualname__
- self.__tree_hash__ = hash(self._subs_tree()) if origin else hash((self.__name__,))
- return self
-
- def _get_type_vars(self, tvars):
- if self.__origin__ and self.__parameters__:
- _get_type_vars(self.__parameters__, tvars)
-
- def _eval_type(self, globalns, localns):
- ev_origin = (self.__origin__._eval_type(globalns, localns)
- if self.__origin__ else None)
- ev_args = tuple(_eval_type(a, globalns, localns) for a
- in self.__args__) if self.__args__ else None
- if ev_origin == self.__origin__ and ev_args == self.__args__:
- return self
- return self.__class__(self.__name__,
- self.__bases__,
- _no_slots_copy(self.__dict__),
- tvars=_type_vars(ev_args) if ev_args else None,
- args=ev_args,
- origin=ev_origin,
- extra=self.__extra__,
- orig_bases=self.__orig_bases__)
-
- def __repr__(self):
- if self.__origin__ is None:
- return super().__repr__()
- return self._tree_repr(self._subs_tree())
-
- def _tree_repr(self, tree):
- arg_list = []
- for arg in tree[1:]:
- if arg == ():
- arg_list.append('()')
- elif not isinstance(arg, tuple):
- arg_list.append(_type_repr(arg))
- else:
- arg_list.append(arg[0]._tree_repr(arg))
- return super().__repr__() + '[%s]' % ', '.join(arg_list)
-
- def _subs_tree(self, tvars=None, args=None):
- if self.__origin__ is None:
- return self
- tree_args = _subs_tree(self, tvars, args)
- return (_gorg(self),) + tuple(tree_args)
-
- def __eq__(self, other):
- if not isinstance(other, GenericMeta):
- return NotImplemented
- if self.__origin__ is None or other.__origin__ is None:
- return self is other
- return self.__tree_hash__ == other.__tree_hash__
-
- def __hash__(self):
- return self.__tree_hash__
-
- @_tp_cache
- def __getitem__(self, params):
- if not isinstance(params, tuple):
- params = (params,)
- if not params and not _gorg(self) is Tuple:
- raise TypeError(
- "Parameter list to %s[...] cannot be empty" % _qualname(self))
- msg = "Parameters to generic types must be types."
- params = tuple(_type_check(p, msg) for p in params)
- if self is Generic:
- # Generic can only be subscripted with unique type variables.
- if not all(isinstance(p, TypeVar) for p in params):
- raise TypeError(
- "Parameters to Generic[...] must all be type variables")
- if len(set(params)) != len(params):
- raise TypeError(
- "Parameters to Generic[...] must all be unique")
- tvars = params
- args = params
- elif self in (Tuple, Callable):
- tvars = _type_vars(params)
- args = params
- elif self is _Protocol:
- # _Protocol is internal, don't check anything.
- tvars = params
- args = params
- elif self.__origin__ in (Generic, _Protocol):
- # Can't subscript Generic[...] or _Protocol[...].
- raise TypeError("Cannot subscript already-subscripted %s" %
- repr(self))
- else:
- # Subscripting a regular Generic subclass.
- _check_generic(self, params)
- tvars = _type_vars(params)
- args = params
- return self.__class__(self.__name__,
- self.__bases__,
- _no_slots_copy(self.__dict__),
- tvars=tvars,
- args=args,
- origin=self,
- extra=self.__extra__,
- orig_bases=self.__orig_bases__)
-
- def __instancecheck__(self, instance):
- # Since we extend ABC.__subclasscheck__ and
- # ABC.__instancecheck__ inlines the cache checking done by the
- # latter, we must extend __instancecheck__ too. For simplicity
- # we just skip the cache check -- instance checks for generic
- # classes are supposed to be rare anyways.
- return issubclass(instance.__class__, self)
-
- def __copy__(self):
- return self.__class__(self.__name__, self.__bases__,
- _no_slots_copy(self.__dict__),
- self.__parameters__, self.__args__, self.__origin__,
- self.__extra__, self.__orig_bases__)
-
-
-# Prevent checks for Generic to crash when defining Generic.
-Generic = None
-
-
-def _generic_new(base_cls, cls, *args, **kwds):
- # Assure type is erased on instantiation,
- # but attempt to store it in __orig_class__
- if cls.__origin__ is None:
- return base_cls.__new__(cls)
- else:
- origin = _gorg(cls)
- obj = base_cls.__new__(origin)
- try:
- obj.__orig_class__ = cls
- except AttributeError:
- pass
- obj.__init__(*args, **kwds)
- return obj
-
-
-class Generic(metaclass=GenericMeta):
- """Abstract base class for generic types.
-
- A generic type is typically declared by inheriting from
- this class parameterized with one or more type variables.
- For example, a generic mapping type might be defined as::
-
- class Mapping(Generic[KT, VT]):
- def __getitem__(self, key: KT) -> VT:
- ...
- # Etc.
-
- This class can then be used as follows::
-
- def lookup_name(mapping: Mapping[KT, VT], key: KT, default: VT) -> VT:
- try:
- return mapping[key]
- except KeyError:
- return default
- """
-
- __slots__ = ()
-
- def __new__(cls, *args, **kwds):
- if _geqv(cls, Generic):
- raise TypeError("Type Generic cannot be instantiated; "
- "it can be used only as a base class")
- return _generic_new(cls.__next_in_mro__, cls, *args, **kwds)
-
-
-class _TypingEmpty:
- """Internal placeholder for () or []. Used by TupleMeta and CallableMeta
- to allow empty list/tuple in specific places, without allowing them
- to sneak in where prohibited.
- """
-
-
-class _TypingEllipsis:
- """Internal placeholder for ... (ellipsis)."""
-
-
-class TupleMeta(GenericMeta):
- """Metaclass for Tuple (internal)."""
-
- @_tp_cache
- def __getitem__(self, parameters):
- if self.__origin__ is not None or not _geqv(self, Tuple):
- # Normal generic rules apply if this is not the first subscription
- # or a subscription of a subclass.
- return super().__getitem__(parameters)
- if parameters == ():
- return super().__getitem__((_TypingEmpty,))
- if not isinstance(parameters, tuple):
- parameters = (parameters,)
- if len(parameters) == 2 and parameters[1] is ...:
- msg = "Tuple[t, ...]: t must be a type."
- p = _type_check(parameters[0], msg)
- return super().__getitem__((p, _TypingEllipsis))
- msg = "Tuple[t0, t1, ...]: each t must be a type."
- parameters = tuple(_type_check(p, msg) for p in parameters)
- return super().__getitem__(parameters)
-
- def __instancecheck__(self, obj):
- if self.__args__ == None:
- return isinstance(obj, tuple)
- raise TypeError("Parameterized Tuple cannot be used "
- "with isinstance().")
-
- def __subclasscheck__(self, cls):
- if self.__args__ == None:
- return issubclass(cls, tuple)
- raise TypeError("Parameterized Tuple cannot be used "
- "with issubclass().")
-
-
-class Tuple(tuple, extra=tuple, metaclass=TupleMeta):
- """Tuple type; Tuple[X, Y] is the cross-product type of X and Y.
-
- Example: Tuple[T1, T2] is a tuple of two elements corresponding
- to type variables T1 and T2. Tuple[int, float, str] is a tuple
- of an int, a float and a string.
-
- To specify a variable-length tuple of homogeneous type, use Tuple[T, ...].
- """
-
- __slots__ = ()
-
- def __new__(cls, *args, **kwds):
- if _geqv(cls, Tuple):
- raise TypeError("Type Tuple cannot be instantiated; "
- "use tuple() instead")
- return _generic_new(tuple, cls, *args, **kwds)
-
-
-class CallableMeta(GenericMeta):
- """Metaclass for Callable (internal)."""
-
- def __repr__(self):
- if self.__origin__ is None:
- return super().__repr__()
- return self._tree_repr(self._subs_tree())
-
- def _tree_repr(self, tree):
- if _gorg(self) is not Callable:
- return super()._tree_repr(tree)
- # For actual Callable (not its subclass) we override
- # super()._tree_repr() for nice formatting.
- arg_list = []
- for arg in tree[1:]:
- if not isinstance(arg, tuple):
- arg_list.append(_type_repr(arg))
- else:
- arg_list.append(arg[0]._tree_repr(arg))
- if arg_list[0] == '...':
- return repr(tree[0]) + '[..., %s]' % arg_list[1]
- return (repr(tree[0]) +
- '[[%s], %s]' % (', '.join(arg_list[:-1]), arg_list[-1]))
-
- def __getitem__(self, parameters):
- """A thin wrapper around __getitem_inner__ to provide the latter
- with hashable arguments to improve speed.
- """
-
- if self.__origin__ is not None or not _geqv(self, Callable):
- return super().__getitem__(parameters)
- if not isinstance(parameters, tuple) or len(parameters) != 2:
- raise TypeError("Callable must be used as "
- "Callable[[arg, ...], result].")
- args, result = parameters
- if args is Ellipsis:
- parameters = (Ellipsis, result)
- else:
- if not isinstance(args, list):
- raise TypeError("Callable[args, result]: args must be a list."
- " Got %.100r." % (args,))
- parameters = (tuple(args), result)
- return self.__getitem_inner__(parameters)
-
- @_tp_cache
- def __getitem_inner__(self, parameters):
- args, result = parameters
- msg = "Callable[args, result]: result must be a type."
- result = _type_check(result, msg)
- if args is Ellipsis:
- return super().__getitem__((_TypingEllipsis, result))
- msg = "Callable[[arg, ...], result]: each arg must be a type."
- args = tuple(_type_check(arg, msg) for arg in args)
- parameters = args + (result,)
- return super().__getitem__(parameters)
-
-
-class Callable(extra=collections_abc.Callable, metaclass = CallableMeta):
- """Callable type; Callable[[int], str] is a function of (int) -> str.
-
- The subscription syntax must always be used with exactly two
- values: the argument list and the return type. The argument list
- must be a list of types or ellipsis; the return type must be a single type.
-
- There is no syntax to indicate optional or keyword arguments,
- such function types are rarely used as callback types.
- """
-
- __slots__ = ()
-
- def __new__(cls, *args, **kwds):
- if _geqv(cls, Callable):
- raise TypeError("Type Callable cannot be instantiated; "
- "use a non-abstract subclass instead")
- return _generic_new(cls.__next_in_mro__, cls, *args, **kwds)
-
-
-class _ClassVar(_FinalTypingBase, _root=True):
- """Special type construct to mark class variables.
-
- An annotation wrapped in ClassVar indicates that a given
- attribute is intended to be used as a class variable and
- should not be set on instances of that class. Usage::
-
- class Starship:
- stats: ClassVar[Dict[str, int]] = {} # class variable
- damage: int = 10 # instance variable
-
- ClassVar accepts only types and cannot be further subscribed.
-
- Note that ClassVar is not a class itself, and should not
- be used with isinstance() or issubclass().
- """
-
- __slots__ = ('__type__',)
-
- def __init__(self, tp=None, **kwds):
- self.__type__ = tp
-
- def __getitem__(self, item):
- cls = type(self)
- if self.__type__ is None:
- return cls(_type_check(item,
- '{} accepts only single type.'.format(cls.__name__[1:])),
- _root=True)
- raise TypeError('{} cannot be further subscripted'
- .format(cls.__name__[1:]))
-
- def _eval_type(self, globalns, localns):
- new_tp = _eval_type(self.__type__, globalns, localns)
- if new_tp == self.__type__:
- return self
- return type(self)(new_tp, _root=True)
-
- def __repr__(self):
- r = super().__repr__()
- if self.__type__ is not None:
- r += '[{}]'.format(_type_repr(self.__type__))
- return r
-
- def __hash__(self):
- return hash((type(self).__name__, self.__type__))
-
- def __eq__(self, other):
- if not isinstance(other, _ClassVar):
- return NotImplemented
- if self.__type__ is not None:
- return self.__type__ == other.__type__
- return self is other
-
-
-ClassVar = _ClassVar(_root=True)
-
-
-def cast(typ, val):
- """Cast a value to a type.
-
- This returns the value unchanged. To the type checker this
- signals that the return value has the designated type, but at
- runtime we intentionally don't check anything (we want this
- to be as fast as possible).
- """
- return val
-
-
-def _get_defaults(func):
- """Internal helper to extract the default arguments, by name."""
- try:
- code = func.__code__
- except AttributeError:
- # Some built-in functions don't have __code__, __defaults__, etc.
- return {}
- pos_count = code.co_argcount
- arg_names = code.co_varnames
- arg_names = arg_names[:pos_count]
- defaults = func.__defaults__ or ()
- kwdefaults = func.__kwdefaults__
- res = dict(kwdefaults) if kwdefaults else {}
- pos_offset = pos_count - len(defaults)
- for name, value in zip(arg_names[pos_offset:], defaults):
- assert name not in res
- res[name] = value
- return res
-
-
-def get_type_hints(obj, globalns=None, localns=None):
- """Return type hints for an object.
-
- This is often the same as obj.__annotations__, but it handles
- forward references encoded as string literals, and if necessary
- adds Optional[t] if a default value equal to None is set.
-
- The argument may be a module, class, method, or function. The annotations
- are returned as a dictionary. For classes, annotations include also
- inherited members.
-
- TypeError is raised if the argument is not of a type that can contain
- annotations, and an empty dictionary is returned if no annotations are
- present.
-
- BEWARE -- the behavior of globalns and localns is counterintuitive
- (unless you are familiar with how eval() and exec() work). The
- search order is locals first, then globals.
-
- - If no dict arguments are passed, an attempt is made to use the
- globals from obj, and these are also used as the locals. If the
- object does not appear to have globals, an exception is raised.
-
- - If one dict argument is passed, it is used for both globals and
- locals.
-
- - If two dict arguments are passed, they specify globals and
- locals, respectively.
- """
-
- if getattr(obj, '__no_type_check__', None):
- return {}
- if globalns is None:
- globalns = getattr(obj, '__globals__', {})
- if localns is None:
- localns = globalns
- elif localns is None:
- localns = globalns
- # Classes require a special treatment.
- if isinstance(obj, type):
- hints = {}
- for base in reversed(obj.__mro__):
- ann = base.__dict__.get('__annotations__', {})
- for name, value in ann.items():
- if value is None:
- value = type(None)
- if isinstance(value, str):
- value = _ForwardRef(value)
- value = _eval_type(value, globalns, localns)
- hints[name] = value
- return hints
- hints = getattr(obj, '__annotations__', None)
- if hints is None:
- # Return empty annotations for something that _could_ have them.
- if (isinstance(obj, types.FunctionType) or
- isinstance(obj, types.BuiltinFunctionType) or
- isinstance(obj, types.MethodType) or
- isinstance(obj, types.ModuleType)):
- return {}
- else:
- raise TypeError('{!r} is not a module, class, method, '
- 'or function.'.format(obj))
- defaults = _get_defaults(obj)
- hints = dict(hints)
- for name, value in hints.items():
- if value is None:
- value = type(None)
- if isinstance(value, str):
- value = _ForwardRef(value)
- value = _eval_type(value, globalns, localns)
- if name in defaults and defaults[name] is None:
- value = Optional[value]
- hints[name] = value
- return hints
-
-
-def no_type_check(arg):
- """Decorator to indicate that annotations are not type hints.
-
- The argument must be a class or function; if it is a class, it
- applies recursively to all methods and classes defined in that class
- (but not to methods defined in its superclasses or subclasses).
-
- This mutates the function(s) or class(es) in place.
- """
- if isinstance(arg, type):
- arg_attrs = arg.__dict__.copy()
- for attr, val in arg.__dict__.items():
- if val in arg.__bases__:
- arg_attrs.pop(attr)
- for obj in arg_attrs.values():
- if isinstance(obj, types.FunctionType):
- obj.__no_type_check__ = True
- if isinstance(obj, type):
- no_type_check(obj)
- try:
- arg.__no_type_check__ = True
- except TypeError: # built-in classes
- pass
- return arg
-
-
-def no_type_check_decorator(decorator):
- """Decorator to give another decorator the @no_type_check effect.
-
- This wraps the decorator with something that wraps the decorated
- function in @no_type_check.
- """
-
- @functools.wraps(decorator)
- def wrapped_decorator(*args, **kwds):
- func = decorator(*args, **kwds)
- func = no_type_check(func)
- return func
-
- return wrapped_decorator
-
-
-def _overload_dummy(*args, **kwds):
- """Helper for @overload to raise when called."""
- raise NotImplementedError(
- "You should not call an overloaded function. "
- "A series of @overload-decorated functions "
- "outside a stub module should always be followed "
- "by an implementation that is not @overload-ed.")
-
-
-def overload(func):
- """Decorator for overloaded functions/methods.
-
- In a stub file, place two or more stub definitions for the same
- function in a row, each decorated with @overload. For example:
-
- @overload
- def utf8(value: None) -> None: ...
- @overload
- def utf8(value: bytes) -> bytes: ...
- @overload
- def utf8(value: str) -> bytes: ...
-
- In a non-stub file (i.e. a regular .py file), do the same but
- follow it with an implementation. The implementation should *not*
- be decorated with @overload. For example:
-
- @overload
- def utf8(value: None) -> None: ...
- @overload
- def utf8(value: bytes) -> bytes: ...
- @overload
- def utf8(value: str) -> bytes: ...
- def utf8(value):
- # implementation goes here
- """
- return _overload_dummy
-
-
-class _ProtocolMeta(GenericMeta):
- """Internal metaclass for _Protocol.
-
- This exists so _Protocol classes can be generic without deriving
- from Generic.
- """
-
- def __instancecheck__(self, obj):
- if _Protocol not in self.__bases__:
- return super().__instancecheck__(obj)
- raise TypeError("Protocols cannot be used with isinstance().")
-
- def __subclasscheck__(self, cls):
- if not self._is_protocol:
- # No structural checks since this isn't a protocol.
- return NotImplemented
-
- if self is _Protocol:
- # Every class is a subclass of the empty protocol.
- return True
-
- # Find all attributes defined in the protocol.
- attrs = self._get_protocol_attrs()
-
- for attr in attrs:
- if not any(attr in d.__dict__ for d in cls.__mro__):
- return False
- return True
-
- def _get_protocol_attrs(self):
- # Get all Protocol base classes.
- protocol_bases = []
- for c in self.__mro__:
- if getattr(c, '_is_protocol', False) and c.__name__ != '_Protocol':
- protocol_bases.append(c)
-
- # Get attributes included in protocol.
- attrs = set()
- for base in protocol_bases:
- for attr in base.__dict__.keys():
- # Include attributes not defined in any non-protocol bases.
- for c in self.__mro__:
- if (c is not base and attr in c.__dict__ and
- not getattr(c, '_is_protocol', False)):
- break
- else:
- if (not attr.startswith('_abc_') and
- attr != '__abstractmethods__' and
- attr != '__annotations__' and
- attr != '__weakref__' and
- attr != '_is_protocol' and
- attr != '__dict__' and
- attr != '__args__' and
- attr != '__slots__' and
- attr != '_get_protocol_attrs' and
- attr != '__next_in_mro__' and
- attr != '__parameters__' and
- attr != '__origin__' and
- attr != '__orig_bases__' and
- attr != '__extra__' and
- attr != '__tree_hash__' and
- attr != '__module__'):
- attrs.add(attr)
-
- return attrs
-
-
-class _Protocol(metaclass=_ProtocolMeta):
- """Internal base class for protocol classes.
-
- This implements a simple-minded structural issubclass check
- (similar but more general than the one-offs in collections.abc
- such as Hashable).
- """
-
- __slots__ = ()
-
- _is_protocol = True
-
-
-# Various ABCs mimicking those in collections.abc.
-# A few are simply re-exported for completeness.
-
-Hashable = collections_abc.Hashable # Not generic.
-
-
-if hasattr(collections_abc, 'Awaitable'):
- class Awaitable(Generic[T_co], extra=collections_abc.Awaitable):
- __slots__ = ()
-
- __all__.append('Awaitable')
-
-
-if hasattr(collections_abc, 'Coroutine'):
- class Coroutine(Awaitable[V_co], Generic[T_co, T_contra, V_co],
- extra=collections_abc.Coroutine):
- __slots__ = ()
-
- __all__.append('Coroutine')
-
-
-if hasattr(collections_abc, 'AsyncIterable'):
-
- class AsyncIterable(Generic[T_co], extra=collections_abc.AsyncIterable):
- __slots__ = ()
-
- class AsyncIterator(AsyncIterable[T_co],
- extra=collections_abc.AsyncIterator):
- __slots__ = ()
-
- __all__.append('AsyncIterable')
- __all__.append('AsyncIterator')
-
-
-class Iterable(Generic[T_co], extra=collections_abc.Iterable):
- __slots__ = ()
-
-
-class Iterator(Iterable[T_co], extra=collections_abc.Iterator):
- __slots__ = ()
-
-
-class SupportsInt(_Protocol):
- __slots__ = ()
-
- @abstractmethod
- def __int__(self) -> int:
- pass
-
-
-class SupportsFloat(_Protocol):
- __slots__ = ()
-
- @abstractmethod
- def __float__(self) -> float:
- pass
-
-
-class SupportsComplex(_Protocol):
- __slots__ = ()
-
- @abstractmethod
- def __complex__(self) -> complex:
- pass
-
-
-class SupportsBytes(_Protocol):
- __slots__ = ()
-
- @abstractmethod
- def __bytes__(self) -> bytes:
- pass
-
-
-class SupportsAbs(_Protocol[T_co]):
- __slots__ = ()
-
- @abstractmethod
- def __abs__(self) -> T_co:
- pass
-
-
-class SupportsRound(_Protocol[T_co]):
- __slots__ = ()
-
- @abstractmethod
- def __round__(self, ndigits: int = 0) -> T_co:
- pass
-
-
-if hasattr(collections_abc, 'Reversible'):
- class Reversible(Iterable[T_co], extra=collections_abc.Reversible):
- __slots__ = ()
-else:
- class Reversible(_Protocol[T_co]):
- __slots__ = ()
-
- @abstractmethod
- def __reversed__(self) -> 'Iterator[T_co]':
- pass
-
-
-Sized = collections_abc.Sized # Not generic.
-
-
-class Container(Generic[T_co], extra=collections_abc.Container):
- __slots__ = ()
-
-
-if hasattr(collections_abc, 'Collection'):
- class Collection(Sized, Iterable[T_co], Container[T_co],
- extra=collections_abc.Collection):
- __slots__ = ()
-
- __all__.append('Collection')
-
-
-# Callable was defined earlier.
-
-if hasattr(collections_abc, 'Collection'):
- class AbstractSet(Collection[T_co],
- extra=collections_abc.Set):
- __slots__ = ()
-else:
- class AbstractSet(Sized, Iterable[T_co], Container[T_co],
- extra=collections_abc.Set):
- __slots__ = ()
-
-
-class MutableSet(AbstractSet[T], extra=collections_abc.MutableSet):
- __slots__ = ()
-
-
-# NOTE: It is only covariant in the value type.
-if hasattr(collections_abc, 'Collection'):
- class Mapping(Collection[KT], Generic[KT, VT_co],
- extra=collections_abc.Mapping):
- __slots__ = ()
-else:
- class Mapping(Sized, Iterable[KT], Container[KT], Generic[KT, VT_co],
- extra=collections_abc.Mapping):
- __slots__ = ()
-
-
-class MutableMapping(Mapping[KT, VT], extra=collections_abc.MutableMapping):
- __slots__ = ()
-
-if hasattr(collections_abc, 'Reversible'):
- if hasattr(collections_abc, 'Collection'):
- class Sequence(Reversible[T_co], Collection[T_co],
- extra=collections_abc.Sequence):
- __slots__ = ()
- else:
- class Sequence(Sized, Reversible[T_co], Container[T_co],
- extra=collections_abc.Sequence):
- __slots__ = ()
-else:
- class Sequence(Sized, Iterable[T_co], Container[T_co],
- extra=collections_abc.Sequence):
- __slots__ = ()
-
-
-class MutableSequence(Sequence[T], extra=collections_abc.MutableSequence):
- __slots__ = ()
-
-
-class ByteString(Sequence[int], extra=collections_abc.ByteString):
- __slots__ = ()
-
-
-class List(list, MutableSequence[T], extra=list):
-
- __slots__ = ()
-
- def __new__(cls, *args, **kwds):
- if _geqv(cls, List):
- raise TypeError("Type List cannot be instantiated; "
- "use list() instead")
- return _generic_new(list, cls, *args, **kwds)
-
-
-class Set(set, MutableSet[T], extra=set):
-
- __slots__ = ()
-
- def __new__(cls, *args, **kwds):
- if _geqv(cls, Set):
- raise TypeError("Type Set cannot be instantiated; "
- "use set() instead")
- return _generic_new(set, cls, *args, **kwds)
-
-
-class FrozenSet(frozenset, AbstractSet[T_co], extra=frozenset):
- __slots__ = ()
-
- def __new__(cls, *args, **kwds):
- if _geqv(cls, FrozenSet):
- raise TypeError("Type FrozenSet cannot be instantiated; "
- "use frozenset() instead")
- return _generic_new(frozenset, cls, *args, **kwds)
-
-
-class MappingView(Sized, Iterable[T_co], extra=collections_abc.MappingView):
- __slots__ = ()
-
-
-class KeysView(MappingView[KT], AbstractSet[KT],
- extra=collections_abc.KeysView):
- __slots__ = ()
-
-
-class ItemsView(MappingView[Tuple[KT, VT_co]],
- AbstractSet[Tuple[KT, VT_co]],
- Generic[KT, VT_co],
- extra=collections_abc.ItemsView):
- __slots__ = ()
-
-
-class ValuesView(MappingView[VT_co], extra=collections_abc.ValuesView):
- __slots__ = ()
-
-
-if hasattr(contextlib, 'AbstractContextManager'):
- class ContextManager(Generic[T_co], extra=contextlib.AbstractContextManager):
- __slots__ = ()
- __all__.append('ContextManager')
-
-
-class Dict(dict, MutableMapping[KT, VT], extra=dict):
-
- __slots__ = ()
-
- def __new__(cls, *args, **kwds):
- if _geqv(cls, Dict):
- raise TypeError("Type Dict cannot be instantiated; "
- "use dict() instead")
- return _generic_new(dict, cls, *args, **kwds)
-
-class DefaultDict(collections.defaultdict, MutableMapping[KT, VT],
- extra=collections.defaultdict):
-
- __slots__ = ()
-
- def __new__(cls, *args, **kwds):
- if _geqv(cls, DefaultDict):
- raise TypeError("Type DefaultDict cannot be instantiated; "
- "use collections.defaultdict() instead")
- return _generic_new(collections.defaultdict, cls, *args, **kwds)
-
-# Determine what base class to use for Generator.
-if hasattr(collections_abc, 'Generator'):
- # Sufficiently recent versions of 3.5 have a Generator ABC.
- _G_base = collections_abc.Generator
-else:
- # Fall back on the exact type.
- _G_base = types.GeneratorType
-
-
-class Generator(Iterator[T_co], Generic[T_co, T_contra, V_co],
- extra=_G_base):
- __slots__ = ()
-
- def __new__(cls, *args, **kwds):
- if _geqv(cls, Generator):
- raise TypeError("Type Generator cannot be instantiated; "
- "create a subclass instead")
- return _generic_new(_G_base, cls, *args, **kwds)
-
-
-# Internal type variable used for Type[].
-CT_co = TypeVar('CT_co', covariant=True, bound=type)
-
-
-# This is not a real generic class. Don't use outside annotations.
-class Type(Generic[CT_co], extra=type):
- """A special construct usable to annotate class objects.
-
- For example, suppose we have the following classes::
-
- class User: ... # Abstract base for User classes
- class BasicUser(User): ...
- class ProUser(User): ...
- class TeamUser(User): ...
-
- And a function that takes a class argument that's a subclass of
- User and returns an instance of the corresponding class::
-
- U = TypeVar('U', bound=User)
- def new_user(user_class: Type[U]) -> U:
- user = user_class()
- # (Here we could write the user object to a database)
- return user
-
- joe = new_user(BasicUser)
-
- At this point the type checker knows that joe has type BasicUser.
- """
-
- __slots__ = ()
-
-
-def _make_nmtuple(name, types):
- msg = "NamedTuple('Name', [(f0, t0), (f1, t1), ...]); each t must be a type"
- types = [(n, _type_check(t, msg)) for n, t in types]
- nm_tpl = collections.namedtuple(name, [n for n, t in types])
- nm_tpl._field_types = dict(types)
- try:
- nm_tpl.__module__ = sys._getframe(2).f_globals.get('__name__', '__main__')
- except (AttributeError, ValueError):
- pass
- return nm_tpl
-
-
-_PY36 = sys.version_info[:2] >= (3, 6)
-
-
-class NamedTupleMeta(type):
-
- def __new__(cls, typename, bases, ns):
- if ns.get('_root', False):
- return super().__new__(cls, typename, bases, ns)
- if not _PY36:
- raise TypeError("Class syntax for NamedTuple is only supported"
- " in Python 3.6+")
- types = ns.get('__annotations__', {})
- return _make_nmtuple(typename, types.items())
-
-class NamedTuple(metaclass=NamedTupleMeta):
- """Typed version of namedtuple.
-
- Usage in Python versions >= 3.6::
-
- class Employee(NamedTuple):
- name: str
- id: int
-
- This is equivalent to::
-
- Employee = collections.namedtuple('Employee', ['name', 'id'])
-
- The resulting class has one extra attribute: _field_types,
- giving a dict mapping field names to types. (The field names
- are in the _fields attribute, which is part of the namedtuple
- API.) Alternative equivalent keyword syntax is also accepted::
-
- Employee = NamedTuple('Employee', name=str, id=int)
-
- In Python versions <= 3.5 use::
-
- Employee = NamedTuple('Employee', [('name', str), ('id', int)])
- """
- _root = True
-
- def __new__(self, typename, fields=None, **kwargs):
- if kwargs and not _PY36:
- raise TypeError("Keyword syntax for NamedTuple is only supported"
- " in Python 3.6+")
- if fields is None:
- fields = kwargs.items()
- elif kwargs:
- raise TypeError("Either list of fields or keywords"
- " can be provided to NamedTuple, not both")
- return _make_nmtuple(typename, fields)
-
-
-def NewType(name, tp):
- """NewType creates simple unique types with almost zero
- runtime overhead. NewType(name, tp) is considered a subtype of tp
- by static type checkers. At runtime, NewType(name, tp) returns
- a dummy function that simply returns its argument. Usage::
-
- UserId = NewType('UserId', int)
-
- def name_by_id(user_id: UserId) -> str:
- ...
-
- UserId('user') # Fails type check
-
- name_by_id(42) # Fails type check
- name_by_id(UserId(42)) # OK
-
- num = UserId(5) + 1 # type: int
- """
-
- def new_type(x):
- return x
-
- new_type.__name__ = name
- new_type.__supertype__ = tp
- return new_type
-
-
-# Python-version-specific alias (Python 2: unicode; Python 3: str)
-Text = str
-
-
-# Constant that's True when type checking, but False here.
-TYPE_CHECKING = False
-
-
-class IO(Generic[AnyStr]):
- """Generic base class for TextIO and BinaryIO.
-
- This is an abstract, generic version of the return of open().
-
- NOTE: This does not distinguish between the different possible
- classes (text vs. binary, read vs. write vs. read/write,
- append-only, unbuffered). The TextIO and BinaryIO subclasses
- below capture the distinctions between text vs. binary, which is
- pervasive in the interface; however we currently do not offer a
- way to track the other distinctions in the type system.
- """
-
- __slots__ = ()
-
- @abstractproperty
- def mode(self) -> str:
- pass
-
- @abstractproperty
- def name(self) -> str:
- pass
-
- @abstractmethod
- def close(self) -> None:
- pass
-
- @abstractmethod
- def closed(self) -> bool:
- pass
-
- @abstractmethod
- def fileno(self) -> int:
- pass
-
- @abstractmethod
- def flush(self) -> None:
- pass
-
- @abstractmethod
- def isatty(self) -> bool:
- pass
-
- @abstractmethod
- def read(self, n: int = -1) -> AnyStr:
- pass
-
- @abstractmethod
- def readable(self) -> bool:
- pass
-
- @abstractmethod
- def readline(self, limit: int = -1) -> AnyStr:
- pass
-
- @abstractmethod
- def readlines(self, hint: int = -1) -> List[AnyStr]:
- pass
-
- @abstractmethod
- def seek(self, offset: int, whence: int = 0) -> int:
- pass
-
- @abstractmethod
- def seekable(self) -> bool:
- pass
-
- @abstractmethod
- def tell(self) -> int:
- pass
-
- @abstractmethod
- def truncate(self, size: int = None) -> int:
- pass
-
- @abstractmethod
- def writable(self) -> bool:
- pass
-
- @abstractmethod
- def write(self, s: AnyStr) -> int:
- pass
-
- @abstractmethod
- def writelines(self, lines: List[AnyStr]) -> None:
- pass
-
- @abstractmethod
- def __enter__(self) -> 'IO[AnyStr]':
- pass
-
- @abstractmethod
- def __exit__(self, type, value, traceback) -> None:
- pass
-
-
-class BinaryIO(IO[bytes]):
- """Typed version of the return of open() in binary mode."""
-
- __slots__ = ()
-
- @abstractmethod
- def write(self, s: Union[bytes, bytearray]) -> int:
- pass
-
- @abstractmethod
- def __enter__(self) -> 'BinaryIO':
- pass
-
-
-class TextIO(IO[str]):
- """Typed version of the return of open() in text mode."""
-
- __slots__ = ()
-
- @abstractproperty
- def buffer(self) -> BinaryIO:
- pass
-
- @abstractproperty
- def encoding(self) -> str:
- pass
-
- @abstractproperty
- def errors(self) -> Optional[str]:
- pass
-
- @abstractproperty
- def line_buffering(self) -> bool:
- pass
-
- @abstractproperty
- def newlines(self) -> Any:
- pass
-
- @abstractmethod
- def __enter__(self) -> 'TextIO':
- pass
-
-
-class io:
- """Wrapper namespace for IO generic classes."""
-
- __all__ = ['IO', 'TextIO', 'BinaryIO']
- IO = IO
- TextIO = TextIO
- BinaryIO = BinaryIO
-
-io.__name__ = __name__ + '.io'
-sys.modules[io.__name__] = io
-
-
-Pattern = _TypeAlias('Pattern', AnyStr, type(stdlib_re.compile('')),
- lambda p: p.pattern)
-Match = _TypeAlias('Match', AnyStr, type(stdlib_re.match('', '')),
- lambda m: m.re.pattern)
-
-
-class re:
- """Wrapper namespace for re type aliases."""
-
- __all__ = ['Pattern', 'Match']
- Pattern = Pattern
- Match = Match
-
-re.__name__ = __name__ + '.re'
-sys.modules[re.__name__] = re
diff --git a/misc/actions_stubs.py b/misc/actions_stubs.py
deleted file mode 100644
index 978af71..0000000
--- a/misc/actions_stubs.py
+++ /dev/null
@@ -1,111 +0,0 @@
-#!/usr/bin/env python3
-import os
-import shutil
-from typing import Tuple, Any
-try:
- import click
-except ImportError:
- print("You need the module \'click\'")
- exit(1)
-
-base_path = os.getcwd()
-
-# I don't know how to set callables with different args
-def apply_all(func: Any, directory: str, extension: str,
- to_extension: str='', exclude: Tuple[str]=('',),
- recursive: bool=True, debug: bool=False) -> None:
- excluded = [x+extension for x in exclude] if exclude else []
- for p, d, files in os.walk(os.path.join(base_path,directory)):
- for f in files:
- if "{}".format(f) in excluded:
- continue
- inner_path = os.path.join(p,f)
- if not inner_path.endswith(extension):
- continue
- if to_extension:
- new_path = "{}{}".format(inner_path[:-len(extension)],to_extension)
- func(inner_path,new_path)
- else:
- func(inner_path)
- if not recursive:
- break
-
-def confirm(resp: bool=False, **kargs) -> bool:
- kargs['rest'] = "to this {f2}/*{e2}".format(**kargs) if kargs.get('f2') else ''
- prompt = "{act} all files {rec}matching this expression {f1}/*{e1} {rest}".format(**kargs)
- prompt.format(**kargs)
- prompt = "{} [{}]|{}: ".format(prompt, 'Y' if resp else 'N', 'n' if resp else 'y')
- while True:
- ans = input(prompt).lower()
- if not ans:
- return resp
- if ans not in ['y','n']:
- print( 'Please, enter (y) or (n).')
- continue
- if ans == 'y':
- return True
- else:
- return False
-
-actions = ['cp', 'mv', 'rm']
- at click.command(context_settings=dict(help_option_names=['-h', '--help']))
- at click.option('--action', '-a', type=click.Choice(actions), required=True, help="What do I have to do :-)")
- at click.option('--dir', '-d', 'directory', default='stubs', help="Directory to start search!")
- at click.option('--ext', '-e', 'extension', default='.py', help="Extension \"from\" will be applied the action. Default .py")
- at click.option('--to', '-t', 'to_extension', default='.pyi', help="Extension \"to\" will be applied the action if can. Default .pyi")
- at click.option('--exclude', '-x', multiple=True, default=('__init__',), help="For every appear, will ignore this files. (can set multiples times)")
- at click.option('--not-recursive', '-n', default=True, is_flag=True, help="Set if don't want to walk recursively.")
-def main(action: str, directory: str, extension: str, to_extension: str,
- exclude: Tuple[str], not_recursive: bool) -> None:
- """
- This script helps to copy/move/remove files based on their extension.
-
- The three actions will ask you for confirmation.
-
- Examples (by default the script search in stubs directory):
-
- - Change extension of all stubs from .py to .pyi:
-
- python <script.py> -a mv
-
- - Revert the previous action.
-
- python <script.py> -a mv -e .pyi -t .py
-
- - If you want to ignore "awesome.py" files.
-
- python <script.py> -a [cp|mv|rm] -x awesome
-
- - If you want to ignore "awesome.py" and "__init__.py" files.
-
- python <script.py> -a [cp|mv|rm] -x awesome -x __init__
-
- - If you want to remove all ".todo" files in "todo" directory, but not recursively:
-
- python <script.py> -a rm -e .todo -d todo -r
-
- """
- if action not in actions:
- print("Your action have to be one of this: {}".format(', '.join(actions)))
- return
-
- rec = "[Recursively] " if not_recursive else ''
- if not extension.startswith('.'):
- extension = ".{}".format(extension)
- if not to_extension.startswith('.'):
- to_extension = ".{}".format(to_extension)
- if directory.endswith('/'):
- directory = directory[:-1]
- if action == 'cp':
- if confirm(act='Copy',rec=rec, f1=directory, e1=extension, f2=directory, e2=to_extension):
- apply_all(shutil.copy, directory, extension, to_extension, exclude, not_recursive)
- elif action == 'rm':
- if confirm(act='Remove',rec=rec, f1=directory, e1=extension):
- apply_all(os.remove, directory, extension, exclude=exclude, recursive=not_recursive)
- elif action == 'mv':
- if confirm(act='Move',rec=rec, f1=directory, e1=extension, f2=directory, e2=to_extension):
- apply_all(shutil.move, directory, extension, to_extension, exclude, not_recursive)
-
-
-if __name__ == '__main__':
- main()
diff --git a/misc/analyze_cache.py b/misc/analyze_cache.py
deleted file mode 100644
index 643e2bf..0000000
--- a/misc/analyze_cache.py
+++ /dev/null
@@ -1,189 +0,0 @@
-#!/usr/bin/env python
-
-from typing import Any, Dict, Generator, Iterable, List, Optional
-from collections import Counter
-
-import os
-import os.path
-import json
-
-ROOT = ".mypy_cache/3.5"
-
-JsonDict = Dict[str, Any]
-
-class CacheData:
- def __init__(self, filename: str, data_json: JsonDict, meta_json: JsonDict,
- data_size: int, meta_size: int) -> None:
- self.filename = filename
- self.data = data_json
- self.meta = meta_json
- self.data_size = data_size
- self.meta_size = meta_size
-
- @property
- def total_size(self):
- return self.data_size + self.meta_size
-
-
-def extract_classes(chunks: Iterable[CacheData]) -> Iterable[JsonDict]:
- def extract(chunks: Iterable[JsonDict]) -> Iterable[JsonDict]:
- for chunk in chunks:
- if isinstance(chunk, dict):
- yield chunk
- yield from extract(chunk.values())
- elif isinstance(chunk, list):
- yield from extract(chunk)
- yield from extract([chunk.data for chunk in chunks])
-
-
-def load_json(data_path: str, meta_path: str) -> CacheData:
- with open(data_path, 'r') as ds:
- data_json = json.load(ds)
-
- with open(meta_path, 'r') as ms:
- meta_json = json.load(ms)
-
- data_size = os.path.getsize(data_path)
- meta_size = os.path.getsize(meta_path)
-
- return CacheData(data_path.replace(".data.json", ".*.json"),
- data_json, meta_json, data_size, meta_size)
-
-
-def get_files(root: str) -> Iterable[CacheData]:
- for (dirpath, dirnames, filenames) in os.walk(root):
- for filename in filenames:
- if filename.endswith(".data.json"):
- meta_filename = filename.replace(".data.json", ".meta.json")
- yield load_json(
- os.path.join(dirpath, filename),
- os.path.join(dirpath, meta_filename))
-
-
-def pluck(name: str, chunks: Iterable[JsonDict]) -> Iterable[JsonDict]:
- return (chunk for chunk in chunks if chunk['.class'] == name)
-
-
-def report_counter(counter: Counter, amount: Optional[int] = None) -> None:
- for name, count in counter.most_common(amount):
- print(' {: <8} {}'.format(count, name))
- print()
-
-
-def report_most_common(chunks: List[JsonDict], amount: Optional[int] = None) -> None:
- report_counter(Counter(str(chunk) for chunk in chunks), amount)
-
-
-def compress(chunk: JsonDict) -> JsonDict:
- cache = {} # type: Dict[int, JsonDict]
- counter = 0
- def helper(chunk: Any) -> Any:
- nonlocal counter
- if not isinstance(chunk, dict):
- return chunk
-
- if len(chunk) <= 2:
- return chunk
- id = hash(str(chunk))
-
- if id in cache:
- return cache[id]
- else:
- cache[id] = {'.id': counter}
- chunk['.cache_id'] = counter
- counter += 1
-
- for name in sorted(chunk.keys()):
- value = chunk[name]
- if isinstance(value, list):
- chunk[name] = [helper(child) for child in value]
- elif isinstance(value, dict):
- chunk[name] = helper(value)
-
- return chunk
- out = helper(chunk)
- return out
-
-def decompress(chunk: JsonDict) -> JsonDict:
- cache = {} # type: Dict[int, JsonDict]
- def helper(chunk: Any) -> Any:
- if not isinstance(chunk, dict):
- return chunk
- if '.id' in chunk:
- return cache[chunk['.id']]
-
- counter = None
- if '.cache_id' in chunk:
- counter = chunk['.cache_id']
- del chunk['.cache_id']
-
- for name in sorted(chunk.keys()):
- value = chunk[name]
- if isinstance(value, list):
- chunk[name] = [helper(child) for child in value]
- elif isinstance(value, dict):
- chunk[name] = helper(value)
-
- if counter is not None:
- cache[counter] = chunk
-
- return chunk
- return helper(chunk)
-
-
-
-
-def main() -> None:
- json_chunks = list(get_files(ROOT))
- class_chunks = list(extract_classes(json_chunks))
-
- total_size = sum(chunk.total_size for chunk in json_chunks)
- print("Total cache size: {:.3f} megabytes".format(total_size / (1024 * 1024)))
- print()
-
- class_name_counter = Counter(chunk[".class"] for chunk in class_chunks)
- print("Most commonly used classes:")
- report_counter(class_name_counter)
-
- print("Most common literal chunks:")
- report_most_common(class_chunks, 15)
-
- build = None
- for chunk in json_chunks:
- if 'build.*.json' in chunk.filename:
- build = chunk
- break
- original = json.dumps(build.data, sort_keys=True)
- print("Size of build.data.json, in kilobytes: {:.3f}".format(len(original) / 1024))
-
- build.data = compress(build.data)
- compressed = json.dumps(build.data, sort_keys=True)
- print("Size of compressed build.data.json, in kilobytes: {:.3f}".format(len(compressed) / 1024))
-
- build.data = decompress(build.data)
- decompressed = json.dumps(build.data, sort_keys=True)
- print("Size of decompressed build.data.json, in kilobytes: {:.3f}".format(len(decompressed) / 1024))
-
- print("Lossless conversion back", original == decompressed)
-
-
- '''var_chunks = list(pluck("Var", class_chunks))
- report_most_common(var_chunks, 20)
- print()
-
- #for var in var_chunks:
- # if var['fullname'] == 'self' and not (isinstance(var['type'], dict) and var['type']['.class'] == 'AnyType'):
- # print(var)
- #argument_chunks = list(pluck("Argument", class_chunks))
-
- symbol_table_node_chunks = list(pluck("SymbolTableNode", class_chunks))
- report_most_common(symbol_table_node_chunks, 20)
-
- print()
- print("Most common")
- report_most_common(class_chunks, 20)
- print()'''
-
-
-if __name__ == '__main__':
- main()
diff --git a/misc/async_matrix.py b/misc/async_matrix.py
deleted file mode 100644
index e9a758a..0000000
--- a/misc/async_matrix.py
+++ /dev/null
@@ -1,120 +0,0 @@
-#!/usr/bin/env python3
-"""Test various combinations of generators/coroutines.
-
-This was used to cross-check the errors in the test case
-testFullCoroutineMatrix in test-data/unit/check-async-await.test.
-"""
-
-import sys
-from types import coroutine
-from typing import Any, AsyncIterator, Awaitable, Generator, Iterator
-
-# The various things you might try to use in `await` or `yield from`.
-
-def plain_generator() -> Generator[str, None, int]:
- yield 'a'
- return 1
-
-async def plain_coroutine() -> int:
- return 1
-
- at coroutine
-def decorated_generator() -> Generator[str, None, int]:
- yield 'a'
- return 1
-
- at coroutine
-async def decorated_coroutine() -> int:
- return 1
-
-class It(Iterator[str]):
- stop = False
- def __iter__(self) -> 'It':
- return self
- def __next__(self) -> str:
- if self.stop:
- raise StopIteration('end')
- else:
- self.stop = True
- return 'a'
-
-def other_iterator() -> It:
- return It()
-
-class Aw(Awaitable[int]):
- def __await__(self) -> Generator[str, Any, int]:
- yield 'a'
- return 1
-
-def other_coroutine() -> Aw:
- return Aw()
-
-# The various contexts in which `await` or `yield from` might occur.
-
-def plain_host_generator(func) -> Generator[str, None, None]:
- yield 'a'
- x = 0
- f = func()
- try:
- x = yield from f
- finally:
- try:
- f.close()
- except AttributeError:
- pass
-
-async def plain_host_coroutine(func) -> None:
- x = 0
- x = await func()
-
- at coroutine
-def decorated_host_generator(func) -> Generator[str, None, None]:
- yield 'a'
- x = 0
- f = func()
- try:
- x = yield from f
- finally:
- try:
- f.close()
- except AttributeError:
- pass
-
- at coroutine
-async def decorated_host_coroutine(func) -> None:
- x = 0
- x = await func()
-
-# Main driver.
-
-def main():
- verbose = ('-v' in sys.argv)
- for host in [plain_host_generator, plain_host_coroutine,
- decorated_host_generator, decorated_host_coroutine]:
- print()
- print("==== Host:", host.__name__)
- for func in [plain_generator, plain_coroutine,
- decorated_generator, decorated_coroutine,
- other_iterator, other_coroutine]:
- print(" ---- Func:", func.__name__)
- try:
- f = host(func)
- for i in range(10):
- try:
- x = f.send(None)
- if verbose:
- print(" yield:", x)
- except StopIteration as e:
- if verbose:
- print(" stop:", e.value)
- break
- else:
- if verbose:
- print(" ???? still going")
- except Exception as e:
- print(" error:", repr(e))
-
-# Run main().
-
-if __name__ == '__main__':
- main()
diff --git a/misc/fix_annotate.py b/misc/fix_annotate.py
deleted file mode 100644
index 0b552bf..0000000
--- a/misc/fix_annotate.py
+++ /dev/null
@@ -1,219 +0,0 @@
-"""Fixer for lib2to3 that inserts mypy annotations into all methods.
-
-The simplest way to run this is to copy it into lib2to3's "fixes"
-subdirectory and then run "2to3 -f annotate" over your files.
-
-The fixer transforms e.g.
-
- def foo(self, bar, baz=12):
- return bar + baz
-
-into
-
- def foo(self, bar, baz=12):
- # type: (Any, int) -> Any
- return bar + baz
-
-It does not do type inference but it recognizes some basic default
-argument values such as numbers and strings (and assumes their type
-implies the argument type).
-
-It also uses some basic heuristics to decide whether to ignore the
-first argument:
-
- - always if it's named 'self'
- - if there's a @classmethod decorator
-
-Finally, it knows that __init__() is supposed to return None.
-"""
-
-from __future__ import print_function
-
-import os
-import re
-
-from lib2to3.fixer_base import BaseFix
-from lib2to3.patcomp import compile_pattern
-from lib2to3.pytree import Leaf, Node
-from lib2to3.fixer_util import token, syms, touch_import
-
-
-class FixAnnotate(BaseFix):
-
- # This fixer is compatible with the bottom matcher.
- BM_compatible = True
-
- # This fixer shouldn't run by default.
- explicit = True
-
- # The pattern to match.
- PATTERN = """
- funcdef< 'def' name=any parameters< '(' [args=any] ')' > ':' suite=any+ >
- """
-
- counter = None if not os.getenv('MAXFIXES') else int(os.getenv('MAXFIXES'))
-
- def transform(self, node, results):
- if FixAnnotate.counter is not None:
- if FixAnnotate.counter <= 0:
- return
- suite = results['suite']
- children = suite[0].children
-
- # NOTE: I've reverse-engineered the structure of the parse tree.
- # It's always a list of nodes, the first of which contains the
- # entire suite. Its children seem to be:
- #
- # [0] NEWLINE
- # [1] INDENT
- # [2...n-2] statements (the first may be a docstring)
- # [n-1] DEDENT
- #
- # Comments before the suite are part of the INDENT's prefix.
- #
- # "Compact" functions (e.g. "def foo(x, y): return max(x, y)")
- # have a different structure that isn't matched by PATTERN.
-
- ## print('-'*60)
- ## print(node)
- ## for i, ch in enumerate(children):
- ## print(i, repr(ch.prefix), repr(ch))
-
- # Check if there's already an annotation.
- for ch in children:
- if ch.prefix.lstrip().startswith('# type:'):
- return # There's already a # type: comment here; don't change anything.
-
- # Compute the annotation
- annot = self.make_annotation(node, results)
-
- # Insert '# type: {annot}' comment.
- # For reference, see lib2to3/fixes/fix_tuple_params.py in stdlib.
- if len(children) >= 2 and children[1].type == token.INDENT:
- children[1].prefix = '%s# type: %s\n%s' % (children[1].value, annot, children[1].prefix)
- children[1].changed()
- if FixAnnotate.counter is not None:
- FixAnnotate.counter -= 1
-
- # Also add 'from typing import Any' at the top.
- if 'Any' in annot:
- touch_import('typing', 'Any', node)
-
- def make_annotation(self, node, results):
- name = results['name']
- assert isinstance(name, Leaf), repr(name)
- assert name.type == token.NAME, repr(name)
- decorators = self.get_decorators(node)
- is_method = self.is_method(node)
- if name.value == '__init__' or not self.has_return_exprs(node):
- restype = 'None'
- else:
- restype = 'Any'
- args = results.get('args')
- argtypes = []
- if isinstance(args, Node):
- children = args.children
- elif isinstance(args, Leaf):
- children = [args]
- else:
- children = []
- # Interpret children according to the following grammar:
- # (('*'|'**')? NAME ['=' expr] ','?)*
- stars = inferred_type = ''
- in_default = False
- at_start = True
- for child in children:
- if isinstance(child, Leaf):
- if child.value in ('*', '**'):
- stars += child.value
- elif child.type == token.NAME and not in_default:
- if not is_method or not at_start or 'staticmethod' in decorators:
- inferred_type = 'Any'
- else:
- # Always skip the first argument if it's named 'self'.
- # Always skip the first argument of a class method.
- if child.value == 'self' or 'classmethod' in decorators:
- pass
- else:
- inferred_type = 'Any'
- elif child.value == '=':
- in_default = True
- elif in_default and child.value != ',':
- if child.type == token.NUMBER:
- if re.match(r'\d+[lL]?$', child.value):
- inferred_type = 'int'
- else:
- inferred_type = 'float' # TODO: complex?
- elif child.type == token.STRING:
- if child.value.startswith(('u', 'U')):
- inferred_type = 'unicode'
- else:
- inferred_type = 'str'
- elif child.type == token.NAME and child.value in ('True', 'False'):
- inferred_type = 'bool'
- elif child.value == ',':
- if inferred_type:
- argtypes.append(stars + inferred_type)
- # Reset
- stars = inferred_type = ''
- in_default = False
- at_start = False
- if inferred_type:
- argtypes.append(stars + inferred_type)
- return '(' + ', '.join(argtypes) + ') -> ' + restype
-
- # The parse tree has a different shape when there is a single
- # decorator vs. when there are multiple decorators.
- DECORATED = "decorated< (d=decorator | decorators< dd=decorator+ >) funcdef >"
- decorated = compile_pattern(DECORATED)
-
- def get_decorators(self, node):
- """Return a list of decorators found on a function definition.
-
- This is a list of strings; only simple decorators
- (e.g. @staticmethod) are returned.
-
- If the function is undecorated or only non-simple decorators
- are found, return [].
- """
- if node.parent is None:
- return []
- results = {}
- if not self.decorated.match(node.parent, results):
- return []
- decorators = results.get('dd') or [results['d']]
- decs = []
- for d in decorators:
- for child in d.children:
- if isinstance(child, Leaf) and child.type == token.NAME:
- decs.append(child.value)
- return decs
-
- def is_method(self, node):
- """Return whether the node occurs (directly) inside a class."""
- node = node.parent
- while node is not None:
- if node.type == syms.classdef:
- return True
- if node.type == syms.funcdef:
- return False
- node = node.parent
- return False
-
- RETURN_EXPR = "return_stmt< 'return' any >"
- return_expr = compile_pattern(RETURN_EXPR)
-
- def has_return_exprs(self, node):
- """Traverse the tree below node looking for 'return expr'.
-
- Return True if at least 'return expr' is found, False if not.
- (If both 'return' and 'return expr' are found, return True.)
- """
- results = {}
- if self.return_expr.match(node, results):
- return True
- for child in node.children:
- if child.type not in (syms.funcdef, syms.classdef):
- if self.has_return_exprs(child):
- return True
- return False
diff --git a/misc/incremental_checker.py b/misc/incremental_checker.py
deleted file mode 100755
index 515e662..0000000
--- a/misc/incremental_checker.py
+++ /dev/null
@@ -1,356 +0,0 @@
-#!/usr/bin/env python3
-"""
-This file compares the output and runtime of running normal vs incremental mode
-on the history of any arbitrary git repo as a way of performing a sanity check
-to make sure incremental mode is working correctly and efficiently.
-
-It does so by first running mypy without incremental mode on the specified range
-of commits to find the expected result, then rewinds back to the first commit and
-re-runs mypy on the commits with incremental mode enabled to make sure it returns
-the same results.
-
-This script will download and test the offical mypy repo by default. Running:
-
- python3 misc/incremental_checker.py last 30
-
-is equivalent to running
-
- python3 misc/incremental_checker.py last 30 \\
- --repo_url https://github.com/python/mypy.git \\
- --file-path mypy
-
-You can chose to run this script against a specific commit id or against the
-last n commits.
-
-To run this script against the last 30 commits:
-
- python3 misc/incremental_checker.py last 30
-
-To run this script starting from the commit id 2a432b:
-
- python3 misc/incremental_checker.py commit 2a432b
-"""
-
-from typing import Any, Dict, List, Optional, Tuple
-
-from argparse import (ArgumentParser, RawDescriptionHelpFormatter,
- ArgumentDefaultsHelpFormatter, Namespace)
-import base64
-import json
-import os
-import random
-import shutil
-import subprocess
-import sys
-import textwrap
-import time
-
-
-CACHE_PATH = ".incremental_checker_cache.json"
-MYPY_REPO_URL = "https://github.com/python/mypy.git"
-MYPY_TARGET_FILE = "mypy"
-
-JsonDict = Dict[str, Any]
-
-
-def print_offset(text: str, indent_length: int = 4) -> None:
- print()
- print(textwrap.indent(text, ' ' * indent_length))
- print()
-
-
-def delete_folder(folder_path: str) -> None:
- if os.path.exists(folder_path):
- shutil.rmtree(folder_path)
-
-
-def execute(command: List[str], fail_on_error: bool = True) -> Tuple[str, str, int]:
- proc = subprocess.Popen(
- ' '.join(command),
- stderr=subprocess.PIPE,
- stdout=subprocess.PIPE,
- shell=True)
- stdout_bytes, stderr_bytes = proc.communicate() # type: Tuple[bytes, bytes]
- stdout, stderr = stdout_bytes.decode('utf-8'), stderr_bytes.decode('utf-8')
- if fail_on_error and proc.returncode != 0:
- print('EXECUTED COMMAND:', repr(command))
- print('RETURN CODE:', proc.returncode)
- print()
- print('STDOUT:')
- print_offset(stdout)
- print('STDERR:')
- print_offset(stderr)
- raise RuntimeError('Unexpected error from external tool.')
- return stdout, stderr, proc.returncode
-
-
-def ensure_environment_is_ready(mypy_path: str, temp_repo_path: str, mypy_cache_path: str) -> None:
- os.chdir(mypy_path)
- delete_folder(temp_repo_path)
- delete_folder(mypy_cache_path)
-
-
-def initialize_repo(repo_url: str, temp_repo_path: str, branch: str) -> None:
- print("Cloning repo {0} to {1}".format(repo_url, temp_repo_path))
- execute(["git", "clone", repo_url, temp_repo_path])
- if branch is not None:
- print("Checking out branch {}".format(branch))
- execute(["git", "-C", temp_repo_path, "checkout", branch])
-
-
-def get_commits(repo_folder_path: str, commit_range: str) -> List[Tuple[str, str]]:
- raw_data, _stderr, _errcode = execute([
- "git", "-C", repo_folder_path, "log", "--reverse", "--oneline", commit_range])
- output = []
- for line in raw_data.strip().split('\n'):
- commit_id, _, message = line.partition(' ')
- output.append((commit_id, message))
- return output
-
-
-def get_commits_starting_at(repo_folder_path: str, start_commit: str) -> List[Tuple[str, str]]:
- print("Fetching commits starting at {0}".format(start_commit))
- return get_commits(repo_folder_path, '{0}^..HEAD'.format(start_commit))
-
-
-def get_nth_commit(repo_folder_path, n: int) -> Tuple[str, str]:
- print("Fetching last {} commits (or all, if there are fewer commits than n)".format(n))
- return get_commits(repo_folder_path, '-{}'.format(n))[0]
-
-
-def run_mypy(target_file_path: Optional[str],
- mypy_cache_path: str,
- mypy_script: Optional[str],
- incremental: bool = True,
- verbose: bool = False) -> Tuple[float, str]:
- """Runs mypy against `target_file_path` and returns what mypy prints to stdout as a string.
-
- If `incremental` is set to True, this function will use store and retrieve all caching data
- inside `mypy_cache_path`. If `verbose` is set to True, this function will pass the "-v -v"
- flags to mypy to make it output debugging information.
- """
- if mypy_script is None:
- command = ["python3", "-m", "mypy"]
- else:
- command = [mypy_script]
- command.extend(["--cache-dir", mypy_cache_path])
- if incremental:
- command.append("--incremental")
- if verbose:
- command.extend(["-v", "-v"])
- if target_file_path is not None:
- command.append(target_file_path)
- start = time.time()
- output, stderr, _ = execute(command, False)
- if stderr != "":
- output = stderr
- runtime = time.time() - start
- return runtime, output
-
-
-def load_cache(incremental_cache_path: str = CACHE_PATH) -> JsonDict:
- if os.path.exists(incremental_cache_path):
- with open(incremental_cache_path, 'r') as stream:
- return json.load(stream)
- else:
- return {}
-
-
-def save_cache(cache: JsonDict, incremental_cache_path: str = CACHE_PATH) -> None:
- with open(incremental_cache_path, 'w') as stream:
- json.dump(cache, stream, indent=2)
-
-
-def set_expected(commits: List[Tuple[str, str]],
- cache: JsonDict,
- temp_repo_path: str,
- target_file_path: Optional[str],
- mypy_cache_path: str,
- mypy_script: Optional[str]) -> None:
- """Populates the given `cache` with the expected results for all of the given `commits`.
-
- This function runs mypy on the `target_file_path` inside the `temp_repo_path`, and stores
- the result in the `cache`.
-
- If `cache` already contains results for a particular commit, this function will
- skip evaluating that commit and move on to the next."""
- for commit_id, message in commits:
- if commit_id in cache:
- print('Skipping commit (already cached): {0}: "{1}"'.format(commit_id, message))
- else:
- print('Caching expected output for commit {0}: "{1}"'.format(commit_id, message))
- execute(["git", "-C", temp_repo_path, "checkout", commit_id])
- runtime, output = run_mypy(target_file_path, mypy_cache_path, mypy_script,
- incremental=False)
- cache[commit_id] = {'runtime': runtime, 'output': output}
- if output == "":
- print(" Clean output ({:.3f} sec)".format(runtime))
- else:
- print(" Output ({:.3f} sec)".format(runtime))
- print_offset(output, 8)
- print()
-
-
-def test_incremental(commits: List[Tuple[str, str]],
- cache: JsonDict,
- temp_repo_path: str,
- target_file_path: Optional[str],
- mypy_cache_path: str,
- mypy_script: Optional[str]) -> None:
- """Runs incremental mode on all `commits` to verify the output matches the expected output.
-
- This function runs mypy on the `target_file_path` inside the `temp_repo_path`. The
- expected output must be stored inside of the given `cache`.
- """
- print("Note: first commit is evaluated twice to warm up cache")
- commits = [commits[0]] + commits
- for commit_id, message in commits:
- print('Now testing commit {0}: "{1}"'.format(commit_id, message))
- execute(["git", "-C", temp_repo_path, "checkout", commit_id])
- runtime, output = run_mypy(target_file_path, mypy_cache_path, mypy_script,
- incremental=True)
- expected_runtime = cache[commit_id]['runtime'] # type: float
- expected_output = cache[commit_id]['output'] # type: str
- if output != expected_output:
- print(" Output does not match expected result!")
- print(" Expected output ({:.3f} sec):".format(expected_runtime))
- print_offset(expected_output, 8)
- print(" Actual output: ({:.3f} sec):".format(runtime))
- print_offset(output, 8)
- else:
- print(" Output matches expected result!")
- print(" Incremental: {:.3f} sec".format(runtime))
- print(" Original: {:.3f} sec".format(expected_runtime))
-
-
-def cleanup(temp_repo_path: str, mypy_cache_path: str) -> None:
- delete_folder(temp_repo_path)
- delete_folder(mypy_cache_path)
-
-
-def test_repo(target_repo_url: str, temp_repo_path: str,
- target_file_path: Optional[str],
- mypy_path: str, incremental_cache_path: str, mypy_cache_path: str,
- range_type: str, range_start: str, branch: str,
- params: Optional[Namespace] = None) -> None:
- """Tests incremental mode against the repo specified in `target_repo_url`.
-
- This algorithm runs in five main stages:
-
- 1. Clones `target_repo_url` into the `temp_repo_path` folder locally,
- checking out the specified `branch` if applicable.
- 2. Examines the repo's history to get the list of all commits to
- to test incremental mode on.
- 3. Runs mypy WITHOUT incremental mode against the `target_file_path` (which is
- assumed to be located inside the `temp_repo_path`), testing each commit
- discovered in stage two.
- - If the results of running mypy WITHOUT incremental mode on a
- particular commit are already cached inside the `incremental_cache_path`,
- skip that commit to save time.
- - Cache the results after finishing.
- 4. Rewind back to the first commit, and run mypy WITH incremental mode
- against the `target_file_path` commit-by-commit, and compare to the expected
- results found in stage 3.
- 5. Delete all unnecessary temp files.
- """
- # Stage 1: Clone repo and get ready to being testing
- ensure_environment_is_ready(mypy_path, temp_repo_path, mypy_cache_path)
- initialize_repo(target_repo_url, temp_repo_path, branch)
-
- # Stage 2: Get all commits we want to test
- if range_type == "last":
- start_commit = get_nth_commit(temp_repo_path, int(range_start))[0]
- elif range_type == "commit":
- start_commit = range_start
- else:
- raise RuntimeError("Invalid option: {}".format(range_type))
- commits = get_commits_starting_at(temp_repo_path, start_commit)
- if params is not None and params.sample:
- seed = params.seed or base64.urlsafe_b64encode(os.urandom(15)).decode('ascii')
- random.seed(seed)
- commits = random.sample(commits, params.sample)
- print("Sampled down to %d commits using random seed %s" % (len(commits), seed))
-
- # Stage 3: Find and cache expected results for each commit (without incremental mode)
- cache = load_cache(incremental_cache_path)
- set_expected(commits, cache, temp_repo_path, target_file_path, mypy_cache_path,
- mypy_script=params.mypy_script)
- save_cache(cache, incremental_cache_path)
-
- # Stage 4: Rewind and re-run mypy (with incremental mode enabled)
- test_incremental(commits, cache, temp_repo_path, target_file_path, mypy_cache_path,
- mypy_script=params.mypy_script)
-
- # Stage 5: Remove temp files
- cleanup(temp_repo_path, mypy_cache_path)
-
-
-def main() -> None:
- help_factory = (lambda prog: RawDescriptionHelpFormatter(prog=prog, max_help_position=32))
- parser = ArgumentParser(
- prog='incremental_checker',
- description=__doc__,
- formatter_class=help_factory)
-
- parser.add_argument("range_type", metavar="START_TYPE", choices=["last", "commit"],
- help="must be one of 'last' or 'commit'")
- parser.add_argument("range_start", metavar="COMMIT_ID_OR_NUMBER",
- help="the commit id to start from, or the number of "
- "commits to move back (see above)")
- parser.add_argument("-r", "--repo_url", default=MYPY_REPO_URL, metavar="URL",
- help="the repo to clone and run tests on")
- parser.add_argument("-f", "--file-path", default=MYPY_TARGET_FILE, metavar="FILE",
- help="the name of the file or directory to typecheck")
- parser.add_argument("--cache-path", default=CACHE_PATH, metavar="DIR",
- help="sets a custom location to store cache data")
- parser.add_argument("--branch", default=None, metavar="NAME",
- help="check out and test a custom branch"
- "uses the default if not specified")
- parser.add_argument("--sample", type=int, help="use a random sample of size SAMPLE")
- parser.add_argument("--seed", type=str, help="random seed")
- parser.add_argument("--mypy-script", type=str, help="alternate mypy script to run")
-
- if len(sys.argv[1:]) == 0:
- parser.print_help()
- parser.exit()
-
- params = parser.parse_args(sys.argv[1:])
-
- # Make all paths absolute so we avoid having to worry about being in the right folder
-
- # The path to this specific script (incremental_checker.py).
- script_path = os.path.abspath(sys.argv[0])
-
- # The path to the mypy repo.
- mypy_path = os.path.abspath(os.path.dirname(os.path.dirname(script_path)))
-
- # The folder the cloned repo will reside in.
- temp_repo_path = os.path.abspath(os.path.join(mypy_path, "tmp_repo"))
-
- # The particular file or package to typecheck inside the repo.
- if params.file_path:
- target_file_path = os.path.abspath(os.path.join(temp_repo_path, params.file_path))
- else:
- # Allow `-f ''` to clear target_file_path.
- target_file_path = None
-
- # The path to where the incremental checker cache data is stored.
- incremental_cache_path = os.path.abspath(params.cache_path)
-
- # The path to store the mypy incremental mode cache data
- mypy_cache_path = os.path.abspath(os.path.join(mypy_path, "misc", ".mypy_cache"))
-
- print("Assuming mypy is located at {0}".format(mypy_path))
- print("Temp repo will be cloned at {0}".format(temp_repo_path))
- print("Testing file/dir located at {0}".format(target_file_path))
- print("Using cache data located at {0}".format(incremental_cache_path))
- print()
-
- test_repo(params.repo_url, temp_repo_path, target_file_path,
- mypy_path, incremental_cache_path, mypy_cache_path,
- params.range_type, params.range_start, params.branch,
- params)
-
-
-if __name__ == '__main__':
- main()
diff --git a/misc/macs.el b/misc/macs.el
deleted file mode 100644
index 67d80aa..0000000
--- a/misc/macs.el
+++ /dev/null
@@ -1,22 +0,0 @@
-; Example Emacs integration; shows type of expression in region.
-
-(defun mypy-show-region ()
- "Show type of variable at point."
- (interactive)
- (let ((here (region-beginning))
- (there (region-end))
- (filename (buffer-file-name)))
- (let ((hereline (line-number-at-pos here))
- (herecol (save-excursion (goto-char here) (current-column)))
- (thereline (line-number-at-pos there))
- (therecol (save-excursion (goto-char there) (current-column))))
- (shell-command
- (format "cd ~/src/mypy; python3 ./scripts/find_type.py %s %s %s %s %s python3 -m mypy -i mypy"
- filename hereline herecol thereline therecol)
- )
- )
- )
- )
-
-; I like to bind this to ^X-t.
-(global-set-key "\C-xt" 'mypy-show-region)
diff --git a/misc/perf_checker.py b/misc/perf_checker.py
deleted file mode 100644
index e55f8cc..0000000
--- a/misc/perf_checker.py
+++ /dev/null
@@ -1,93 +0,0 @@
-#!/usr/bin/env python3
-
-from typing import Callable, List, Tuple
-
-import os
-import shutil
-import statistics
-import subprocess
-import textwrap
-import time
-
-
-class Command:
- def __init__(self, setup: Callable[[], None], command: Callable[[], None]) -> None:
- self.setup = setup
- self.command = command
-
-
-def print_offset(text: str, indent_length: int = 4) -> None:
- print()
- print(textwrap.indent(text, ' ' * indent_length))
- print()
-
-
-def delete_folder(folder_path: str) -> None:
- if os.path.exists(folder_path):
- shutil.rmtree(folder_path)
-
-
-def execute(command: List[str]) -> None:
- proc = subprocess.Popen(
- ' '.join(command),
- stderr=subprocess.PIPE,
- stdout=subprocess.PIPE,
- shell=True)
- stdout_bytes, stderr_bytes = proc.communicate() # type: Tuple[bytes, bytes]
- stdout, stderr = stdout_bytes.decode('utf-8'), stderr_bytes.decode('utf-8')
- if proc.returncode != 0:
- print('EXECUTED COMMAND:', repr(command))
- print('RETURN CODE:', proc.returncode)
- print()
- print('STDOUT:')
- print_offset(stdout)
- print('STDERR:')
- print_offset(stderr)
- raise RuntimeError('Unexpected error from external tool.')
-
-
-def trial(num_trials: int, command: Command) -> List[float]:
- trials = []
- for i in range(num_trials):
- command.setup()
- start = time.time()
- command.command()
- delta = time.time() - start
- trials.append(delta)
- return trials
-
-
-def report(name: str, times: List[float]) -> None:
- print("{}:".format(name))
- print(" Times: {}".format(times))
- print(" Mean: {}".format(statistics.mean(times)))
- print(" Stdev: {}".format(statistics.stdev(times)))
- print()
-
-
-def main() -> None:
- trials = 3
-
- print("Testing baseline")
- baseline = trial(trials, Command(
- lambda: None,
- lambda: execute(["python3", "-m", "mypy", "mypy"])))
- report("Baseline", baseline)
-
- print("Testing cold cache")
- cold_cache = trial(trials, Command(
- lambda: delete_folder(".mypy_cache"),
- lambda: execute(["python3", "-m", "mypy", "-i", "mypy"])))
- report("Cold cache", cold_cache)
-
- print("Testing warm cache")
- execute(["python3", "-m", "mypy", "-i", "mypy"])
- warm_cache = trial(trials, Command(
- lambda: None,
- lambda: execute(["python3", "-m", "mypy", "-i", "mypy"])))
- report("Warm cache", warm_cache)
-
-
-if __name__ == '__main__':
- main()
-
diff --git a/misc/remove-eol-whitespace.sh b/misc/remove-eol-whitespace.sh
deleted file mode 100644
index 3da6b9d..0000000
--- a/misc/remove-eol-whitespace.sh
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/bin/sh
-
-# Remove trailing whitespace from all non-binary files in a git repo.
-
-# From https://gist.github.com/dpaluy/3690668; originally from here:
-# http://unix.stackexchange.com/questions/36233/how-to-skip-file-in-sed-if-it-contains-regex/36240#36240
-
-git grep -I --name-only -z -e '' | xargs -0 sed -i -e 's/[ \t]\+\(\r\?\)$/\1/'
diff --git a/misc/test_case_to_actual.py b/misc/test_case_to_actual.py
deleted file mode 100644
index 9a91bb1..0000000
--- a/misc/test_case_to_actual.py
+++ /dev/null
@@ -1,71 +0,0 @@
-from typing import Iterator, List
-import sys
-import os
-import os.path
-
-
-class Chunk:
- def __init__(self, header_type: str, args: str) -> None:
- self.header_type = header_type
- self.args = args
- self.lines = [] # type: List[str]
-
-
-def is_header(line: str) -> bool:
- return line.startswith('[') and line.endswith(']')
-
-
-def normalize(lines: Iterator[str]) -> Iterator[str]:
- return (line.rstrip() for line in lines)
-
-
-def produce_chunks(lines: Iterator[str]) -> Iterator[Chunk]:
- current_chunk = None # type: Chunk
- for line in normalize(lines):
- if is_header(line):
- if current_chunk is not None:
- yield current_chunk
- parts = line[1:-1].split(' ', 1)
- args = parts[1] if len(parts) > 1 else ''
- current_chunk = Chunk(parts[0], args)
- else:
- current_chunk.lines.append(line)
- if current_chunk is not None:
- yield current_chunk
-
-
-def write_out(filename: str, lines: List[str]) -> None:
- os.makedirs(os.path.dirname(filename), exist_ok=True)
- with open(filename, 'w') as stream:
- stream.write('\n'.join(lines))
-
-
-def write_tree(root: str, chunks: Iterator[Chunk]) -> None:
- init = next(chunks)
- assert init.header_type == 'case'
-
- root = os.path.join(root, init.args)
- write_out(os.path.join(root, 'main.py'), init.lines)
-
- for chunk in chunks:
- if chunk.header_type == 'file' and chunk.args.endswith('.py'):
- write_out(os.path.join(root, chunk.args), chunk.lines)
-
-
-def help() -> None:
- print("Usage: python misc/test_case_to_actual.py test_file.txt root_path")
-
-
-def main() -> None:
- if len(sys.argv) != 3:
- help()
- return
-
- test_file_path, root_path = sys.argv[1], sys.argv[2]
- with open(test_file_path, 'r') as stream:
- chunks = produce_chunks(iter(stream))
- write_tree(root_path, chunks)
-
-
-if __name__ == '__main__':
- main()
diff --git a/misc/touch_checker.py b/misc/touch_checker.py
deleted file mode 100644
index c44afe4..0000000
--- a/misc/touch_checker.py
+++ /dev/null
@@ -1,151 +0,0 @@
-#!/usr/bin/env python3
-
-from typing import Callable, List, Tuple, Optional
-
-import sys
-import glob
-import os
-import shutil
-import statistics
-import subprocess
-import textwrap
-import time
-
-
-def print_offset(text: str, indent_length: int = 4) -> None:
- print()
- print(textwrap.indent(text, ' ' * indent_length))
- print()
-
-
-def delete_folder(folder_path: str) -> None:
- if os.path.exists(folder_path):
- shutil.rmtree(folder_path)
-
-
-def execute(command: List[str]) -> None:
- proc = subprocess.Popen(
- ' '.join(command),
- stderr=subprocess.PIPE,
- stdout=subprocess.PIPE,
- shell=True)
- stdout_bytes, stderr_bytes = proc.communicate() # type: Tuple[bytes, bytes]
- stdout, stderr = stdout_bytes.decode('utf-8'), stderr_bytes.decode('utf-8')
- if proc.returncode != 0:
- print('EXECUTED COMMAND:', repr(command))
- print('RETURN CODE:', proc.returncode)
- print()
- print('STDOUT:')
- print_offset(stdout)
- print('STDERR:')
- print_offset(stderr)
- print()
-
-
-Command = Callable[[], None]
-
-
-def test(setup: Command, command: Command, teardown: Command) -> float:
- setup()
- start = time.time()
- command()
- end = time.time() - start
- teardown()
- return end
-
-
-def make_touch_wrappers(filename: str) -> Tuple[Command, Command]:
- def setup() -> None:
- execute(["touch", filename])
- def teardown() -> None:
- pass
- return setup, teardown
-
-
-def make_change_wrappers(filename: str) -> Tuple[Command, Command]:
- copy = None # type: Optional[str]
-
- def setup() -> None:
- nonlocal copy
- with open(filename, 'r') as stream:
- copy = stream.read()
- with open(filename, 'a') as stream:
- stream.write('\n\nfoo = 3')
-
- def teardown() -> None:
- assert copy is not None
- with open(filename, 'w') as stream:
- stream.write(copy)
-
- # Re-run to reset cache
- execute(["python3", "-m", "mypy", "-i", "mypy"]),
-
- return setup, teardown
-
-def main() -> None:
- if len(sys.argv) != 2 or sys.argv[1] not in {'touch', 'change'}:
- print("First argument should be 'touch' or 'change'")
- return
-
- if sys.argv[1] == 'touch':
- make_wrappers = make_touch_wrappers
- verb = "Touching"
- elif sys.argv[1] == 'change':
- make_wrappers = make_change_wrappers
- verb = "Changing"
- else:
- raise AssertionError()
-
- print("Setting up...")
-
- baseline = test(
- lambda: None,
- lambda: execute(["python3", "-m", "mypy", "mypy"]),
- lambda: None)
- print("Baseline: {}".format(baseline))
-
- cold = test(
- lambda: delete_folder(".mypy_cache"),
- lambda: execute(["python3", "-m", "mypy", "-i", "mypy"]),
- lambda: None)
- print("Cold cache: {}".format(cold))
-
- warm = test(
- lambda: None,
- lambda: execute(["python3", "-m", "mypy", "-i", "mypy"]),
- lambda: None)
- print("Warm cache: {}".format(warm))
-
- print()
-
- deltas = []
- for filename in glob.iglob("mypy/**/*.py", recursive=True):
- print("{} {}".format(verb, filename))
-
- setup, teardown = make_wrappers(filename)
- delta = test(
- setup,
- lambda: execute(["python3", "-m", "mypy", "-i", "mypy"]),
- teardown)
- print(" Time: {}".format(delta))
- deltas.append(delta)
- print()
-
- print("Initial:")
- print(" Baseline: {}".format(baseline))
- print(" Cold cache: {}".format(cold))
- print(" Warm cache: {}".format(warm))
- print()
- print("Aggregate:")
- print(" Times: {}".format(deltas))
- print(" Mean: {}".format(statistics.mean(deltas)))
- print(" Median: {}".format(statistics.median(deltas)))
- print(" Stdev: {}".format(statistics.stdev(deltas)))
- print(" Min: {}".format(min(deltas)))
- print(" Max: {}".format(max(deltas)))
- print(" Total: {}".format(sum(deltas)))
- print()
-
-if __name__ == '__main__':
- main()
-
diff --git a/misc/variadics.py b/misc/variadics.py
deleted file mode 100644
index 9200288..0000000
--- a/misc/variadics.py
+++ /dev/null
@@ -1,54 +0,0 @@
-"""Example of code generation approach to variadics.
-
-See https://github.com/python/typing/issues/193#issuecomment-236383893
-"""
-
-LIMIT = 5
-BOUND = 'object'
-
-def prelude(limit: int, bound: str) -> None:
- print('from typing import Callable, Iterable, Iterator, Tuple, TypeVar, overload')
- print('Ts = TypeVar(\'Ts\', bound={bound})'.format(bound=bound))
- print('R = TypeVar(\'R\')')
- for i in range(LIMIT):
- print('T{i} = TypeVar(\'T{i}\', bound={bound})'.format(i=i+1, bound=bound))
-
-def expand_template(template: str,
- arg_template: str = 'arg{i}: {Ts}',
- lower: int = 0,
- limit: int = LIMIT) -> None:
- print()
- for i in range(lower, limit):
- tvs = ', '.join('T{i}'.format(i=j+1) for j in range(i))
- args = ', '.join(arg_template.format(i=j+1, Ts='T{}'.format(j+1))
- for j in range(i))
- print('@overload')
- s = template.format(Ts=tvs, argsTs=args)
- s = s.replace('Tuple[]', 'Tuple[()]')
- print(s)
- args_l = [arg_template.format(i=j+1, Ts='Ts') for j in range(limit)]
- args_l.append('*' + (arg_template.format(i='s', Ts='Ts')))
- args = ', '.join(args_l)
- s = template.format(Ts='Ts, ...', argsTs=args)
- s = s.replace('Callable[[Ts, ...]', 'Callable[...')
- print('@overload')
- print(s)
-
-def main():
- prelude(LIMIT, BOUND)
-
- # map()
- expand_template('def map(func: Callable[[{Ts}], R], {argsTs}) -> R: ...',
- lower=1)
- # zip()
- expand_template('def zip({argsTs}) -> Tuple[{Ts}]: ...')
-
- # Naomi's examples
- expand_template('def my_zip({argsTs}) -> Iterator[Tuple[{Ts}]]: ...',
- 'arg{i}: Iterable[{Ts}]')
- expand_template('def make_check({argsTs}) -> Callable[[{Ts}], bool]: ...')
- expand_template('def my_map(f: Callable[[{Ts}], R], {argsTs}) -> Iterator[R]: ...',
- 'arg{i}: Iterable[{Ts}]')
-
-
-main()
diff --git a/mypy.egg-info/PKG-INFO b/mypy.egg-info/PKG-INFO
new file mode 100644
index 0000000..c9cf741
--- /dev/null
+++ b/mypy.egg-info/PKG-INFO
@@ -0,0 +1,30 @@
+Metadata-Version: 1.1
+Name: mypy
+Version: 0.470
+Summary: Optional static typing for Python
+Home-page: http://www.mypy-lang.org/
+Author: Jukka Lehtosalo
+Author-email: jukka.lehtosalo at iki.fi
+License: MIT License
+Description: Mypy -- Optional Static Typing for Python
+ =========================================
+
+ Add type annotations to your Python programs, and use mypy to type
+ check them. Mypy is essentially a Python linter on steroids, and it
+ can catch many programming errors by analyzing your program, without
+ actually having to run it. Mypy has a powerful type system with
+ features such as type inference, gradual typing, generics and union
+ types.
+
+Platform: POSIX
+Classifier: Development Status :: 2 - Pre-Alpha
+Classifier: Environment :: Console
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Operating System :: POSIX
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.3
+Classifier: Programming Language :: Python :: 3.4
+Classifier: Programming Language :: Python :: 3.5
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Topic :: Software Development
diff --git a/mypy.egg-info/SOURCES.txt b/mypy.egg-info/SOURCES.txt
new file mode 100644
index 0000000..6497a7c
--- /dev/null
+++ b/mypy.egg-info/SOURCES.txt
@@ -0,0 +1,984 @@
+MANIFEST.in
+setup.cfg
+setup.py
+mypy/__init__.py
+mypy/__main__.py
+mypy/api.py
+mypy/applytype.py
+mypy/binder.py
+mypy/build.py
+mypy/checker.py
+mypy/checkexpr.py
+mypy/checkmember.py
+mypy/checkstrformat.py
+mypy/constraints.py
+mypy/defaults.py
+mypy/erasetype.py
+mypy/errors.py
+mypy/expandtype.py
+mypy/experiments.py
+mypy/exprtotype.py
+mypy/fastparse.py
+mypy/fastparse2.py
+mypy/fixup.py
+mypy/git.py
+mypy/indirection.py
+mypy/infer.py
+mypy/join.py
+mypy/lex.py
+mypy/main.py
+mypy/maptype.py
+mypy/meet.py
+mypy/messages.py
+mypy/moduleinfo.py
+mypy/nodes.py
+mypy/options.py
+mypy/parse.py
+mypy/parsetype.py
+mypy/report.py
+mypy/sametypes.py
+mypy/semanal.py
+mypy/sharedparse.py
+mypy/solve.py
+mypy/stats.py
+mypy/strconv.py
+mypy/stubgen.py
+mypy/stubgenc.py
+mypy/stubutil.py
+mypy/subtypes.py
+mypy/traverser.py
+mypy/treetransform.py
+mypy/typeanal.py
+mypy/typefixture.py
+mypy/types.py
+mypy/util.py
+mypy/version.py
+mypy/visitor.py
+mypy/waiter.py
+mypy.egg-info/PKG-INFO
+mypy.egg-info/SOURCES.txt
+mypy.egg-info/dependency_links.txt
+mypy.egg-info/requires.txt
+mypy.egg-info/top_level.txt
+scripts/find_type.py
+scripts/mypy
+scripts/mypy.bat
+scripts/stubgen
+typeshed/stdlib/2/BaseHTTPServer.pyi
+typeshed/stdlib/2/ConfigParser.pyi
+typeshed/stdlib/2/Cookie.pyi
+typeshed/stdlib/2/HTMLParser.pyi
+typeshed/stdlib/2/Queue.pyi
+typeshed/stdlib/2/SocketServer.pyi
+typeshed/stdlib/2/StringIO.pyi
+typeshed/stdlib/2/UserDict.pyi
+typeshed/stdlib/2/UserList.pyi
+typeshed/stdlib/2/UserString.pyi
+typeshed/stdlib/2/__builtin__.pyi
+typeshed/stdlib/2/__future__.pyi
+typeshed/stdlib/2/_ast.pyi
+typeshed/stdlib/2/_codecs.pyi
+typeshed/stdlib/2/_collections.pyi
+typeshed/stdlib/2/_functools.pyi
+typeshed/stdlib/2/_hotshot.pyi
+typeshed/stdlib/2/_io.pyi
+typeshed/stdlib/2/_json.pyi
+typeshed/stdlib/2/_md5.pyi
+typeshed/stdlib/2/_random.pyi
+typeshed/stdlib/2/_sha.pyi
+typeshed/stdlib/2/_sha256.pyi
+typeshed/stdlib/2/_sha512.pyi
+typeshed/stdlib/2/_socket.pyi
+typeshed/stdlib/2/_sre.pyi
+typeshed/stdlib/2/_struct.pyi
+typeshed/stdlib/2/_symtable.pyi
+typeshed/stdlib/2/_warnings.pyi
+typeshed/stdlib/2/_weakref.pyi
+typeshed/stdlib/2/_weakrefset.pyi
+typeshed/stdlib/2/abc.pyi
+typeshed/stdlib/2/array.pyi
+typeshed/stdlib/2/ast.pyi
+typeshed/stdlib/2/atexit.pyi
+typeshed/stdlib/2/base64.pyi
+typeshed/stdlib/2/binascii.pyi
+typeshed/stdlib/2/builtins.pyi
+typeshed/stdlib/2/cPickle.pyi
+typeshed/stdlib/2/cStringIO.pyi
+typeshed/stdlib/2/calendar.pyi
+typeshed/stdlib/2/codecs.pyi
+typeshed/stdlib/2/collections.pyi
+typeshed/stdlib/2/commands.pyi
+typeshed/stdlib/2/compileall.pyi
+typeshed/stdlib/2/cookielib.pyi
+typeshed/stdlib/2/copy.pyi
+typeshed/stdlib/2/csv.pyi
+typeshed/stdlib/2/datetime.pyi
+typeshed/stdlib/2/decimal.pyi
+typeshed/stdlib/2/difflib.pyi
+typeshed/stdlib/2/doctest.pyi
+typeshed/stdlib/2/exceptions.pyi
+typeshed/stdlib/2/fcntl.pyi
+typeshed/stdlib/2/fileinput.pyi
+typeshed/stdlib/2/fnmatch.pyi
+typeshed/stdlib/2/functools.pyi
+typeshed/stdlib/2/future_builtins.pyi
+typeshed/stdlib/2/gc.pyi
+typeshed/stdlib/2/genericpath.pyi
+typeshed/stdlib/2/getopt.pyi
+typeshed/stdlib/2/getpass.pyi
+typeshed/stdlib/2/gettext.pyi
+typeshed/stdlib/2/glob.pyi
+typeshed/stdlib/2/grp.pyi
+typeshed/stdlib/2/gzip.pyi
+typeshed/stdlib/2/hashlib.pyi
+typeshed/stdlib/2/heapq.pyi
+typeshed/stdlib/2/htmlentitydefs.pyi
+typeshed/stdlib/2/httplib.pyi
+typeshed/stdlib/2/imp.pyi
+typeshed/stdlib/2/importlib.pyi
+typeshed/stdlib/2/inspect.pyi
+typeshed/stdlib/2/io.pyi
+typeshed/stdlib/2/itertools.pyi
+typeshed/stdlib/2/json.pyi
+typeshed/stdlib/2/linecache.pyi
+typeshed/stdlib/2/markupbase.pyi
+typeshed/stdlib/2/md5.pyi
+typeshed/stdlib/2/mimetools.pyi
+typeshed/stdlib/2/optparse.pyi
+typeshed/stdlib/2/pdb.pyi
+typeshed/stdlib/2/pickle.pyi
+typeshed/stdlib/2/pipes.pyi
+typeshed/stdlib/2/platform.pyi
+typeshed/stdlib/2/posix.pyi
+typeshed/stdlib/2/posixpath.pyi
+typeshed/stdlib/2/pprint.pyi
+typeshed/stdlib/2/pwd.pyi
+typeshed/stdlib/2/quopri.pyi
+typeshed/stdlib/2/random.pyi
+typeshed/stdlib/2/re.pyi
+typeshed/stdlib/2/resource.pyi
+typeshed/stdlib/2/rfc822.pyi
+typeshed/stdlib/2/robotparser.pyi
+typeshed/stdlib/2/runpy.pyi
+typeshed/stdlib/2/select.pyi
+typeshed/stdlib/2/sha.pyi
+typeshed/stdlib/2/shelve.pyi
+typeshed/stdlib/2/shlex.pyi
+typeshed/stdlib/2/shutil.pyi
+typeshed/stdlib/2/signal.pyi
+typeshed/stdlib/2/smtplib.pyi
+typeshed/stdlib/2/socket.pyi
+typeshed/stdlib/2/spwd.pyi
+typeshed/stdlib/2/ssl.pyi
+typeshed/stdlib/2/stat.pyi
+typeshed/stdlib/2/string.pyi
+typeshed/stdlib/2/strop.pyi
+typeshed/stdlib/2/struct.pyi
+typeshed/stdlib/2/subprocess.pyi
+typeshed/stdlib/2/sys.pyi
+typeshed/stdlib/2/syslog.pyi
+typeshed/stdlib/2/tempfile.pyi
+typeshed/stdlib/2/textwrap.pyi
+typeshed/stdlib/2/thread.pyi
+typeshed/stdlib/2/time.pyi
+typeshed/stdlib/2/token.pyi
+typeshed/stdlib/2/tokenize.pyi
+typeshed/stdlib/2/types.pyi
+typeshed/stdlib/2/typing.pyi
+typeshed/stdlib/2/unicodedata.pyi
+typeshed/stdlib/2/unittest.pyi
+typeshed/stdlib/2/urllib.pyi
+typeshed/stdlib/2/urllib2.pyi
+typeshed/stdlib/2/urlparse.pyi
+typeshed/stdlib/2/uuid.pyi
+typeshed/stdlib/2/weakref.pyi
+typeshed/stdlib/2/xxsubtype.pyi
+typeshed/stdlib/2/zlib.pyi
+typeshed/stdlib/2/distutils/__init__.pyi
+typeshed/stdlib/2/distutils/emxccompiler.pyi
+typeshed/stdlib/2/email/MIMEText.pyi
+typeshed/stdlib/2/email/__init__.pyi
+typeshed/stdlib/2/email/_parseaddr.pyi
+typeshed/stdlib/2/email/utils.pyi
+typeshed/stdlib/2/email/mime/__init__.pyi
+typeshed/stdlib/2/email/mime/base.pyi
+typeshed/stdlib/2/email/mime/multipart.pyi
+typeshed/stdlib/2/email/mime/nonmultipart.pyi
+typeshed/stdlib/2/email/mime/text.pyi
+typeshed/stdlib/2/encodings/__init__.pyi
+typeshed/stdlib/2/encodings/utf_8.pyi
+typeshed/stdlib/2/multiprocessing/__init__.pyi
+typeshed/stdlib/2/multiprocessing/process.pyi
+typeshed/stdlib/2/multiprocessing/util.pyi
+typeshed/stdlib/2/os/__init__.pyi
+typeshed/stdlib/2/os/path.pyi
+typeshed/stdlib/2/sqlite3/__init__.pyi
+typeshed/stdlib/2/sqlite3/dbapi2.pyi
+typeshed/stdlib/2/wsgiref/__init__.pyi
+typeshed/stdlib/2/wsgiref/validate.pyi
+typeshed/stdlib/2/xml/__init__.pyi
+typeshed/stdlib/2/xml/etree/ElementInclude.pyi
+typeshed/stdlib/2/xml/etree/ElementPath.pyi
+typeshed/stdlib/2/xml/etree/ElementTree.pyi
+typeshed/stdlib/2/xml/etree/__init__.pyi
+typeshed/stdlib/2/xml/etree/cElementTree.pyi
+typeshed/stdlib/2and3/_bisect.pyi
+typeshed/stdlib/2and3/_heapq.pyi
+typeshed/stdlib/2and3/argparse.pyi
+typeshed/stdlib/2and3/asynchat.pyi
+typeshed/stdlib/2and3/asyncore.pyi
+typeshed/stdlib/2and3/bisect.pyi
+typeshed/stdlib/2and3/bz2.pyi
+typeshed/stdlib/2and3/cProfile.pyi
+typeshed/stdlib/2and3/cmath.pyi
+typeshed/stdlib/2and3/code.pyi
+typeshed/stdlib/2and3/colorsys.pyi
+typeshed/stdlib/2and3/contextlib.pyi
+typeshed/stdlib/2and3/errno.pyi
+typeshed/stdlib/2and3/fractions.pyi
+typeshed/stdlib/2and3/hmac.pyi
+typeshed/stdlib/2and3/keyword.pyi
+typeshed/stdlib/2and3/locale.pyi
+typeshed/stdlib/2and3/marshal.pyi
+typeshed/stdlib/2and3/math.pyi
+typeshed/stdlib/2and3/mimetypes.pyi
+typeshed/stdlib/2and3/mmap.pyi
+typeshed/stdlib/2and3/numbers.pyi
+typeshed/stdlib/2and3/operator.pyi
+typeshed/stdlib/2and3/pkgutil.pyi
+typeshed/stdlib/2and3/plistlib.pyi
+typeshed/stdlib/2and3/profile.pyi
+typeshed/stdlib/2and3/pstats.pyi
+typeshed/stdlib/2and3/readline.pyi
+typeshed/stdlib/2and3/rlcompleter.pyi
+typeshed/stdlib/2and3/site.pyi
+typeshed/stdlib/2and3/tarfile.pyi
+typeshed/stdlib/2and3/termios.pyi
+typeshed/stdlib/2and3/threading.pyi
+typeshed/stdlib/2and3/traceback.pyi
+typeshed/stdlib/2and3/warnings.pyi
+typeshed/stdlib/2and3/webbrowser.pyi
+typeshed/stdlib/2and3/zipfile.pyi
+typeshed/stdlib/2and3/zipimport.pyi
+typeshed/stdlib/2and3/distutils/__init__.pyi
+typeshed/stdlib/2and3/distutils/archive_util.pyi
+typeshed/stdlib/2and3/distutils/bcppcompiler.pyi
+typeshed/stdlib/2and3/distutils/ccompiler.pyi
+typeshed/stdlib/2and3/distutils/cmd.pyi
+typeshed/stdlib/2and3/distutils/core.pyi
+typeshed/stdlib/2and3/distutils/cygwinccompiler.pyi
+typeshed/stdlib/2and3/distutils/debug.pyi
+typeshed/stdlib/2and3/distutils/dep_util.pyi
+typeshed/stdlib/2and3/distutils/dir_util.pyi
+typeshed/stdlib/2and3/distutils/dist.pyi
+typeshed/stdlib/2and3/distutils/errors.pyi
+typeshed/stdlib/2and3/distutils/extension.pyi
+typeshed/stdlib/2and3/distutils/fancy_getopt.pyi
+typeshed/stdlib/2and3/distutils/file_util.pyi
+typeshed/stdlib/2and3/distutils/filelist.pyi
+typeshed/stdlib/2and3/distutils/log.pyi
+typeshed/stdlib/2and3/distutils/msvccompiler.pyi
+typeshed/stdlib/2and3/distutils/spawn.pyi
+typeshed/stdlib/2and3/distutils/sysconfig.pyi
+typeshed/stdlib/2and3/distutils/text_file.pyi
+typeshed/stdlib/2and3/distutils/unixccompiler.pyi
+typeshed/stdlib/2and3/distutils/util.pyi
+typeshed/stdlib/2and3/distutils/version.pyi
+typeshed/stdlib/2and3/distutils/command/__init__.pyi
+typeshed/stdlib/2and3/distutils/command/bdist.pyi
+typeshed/stdlib/2and3/distutils/command/bdist_dumb.pyi
+typeshed/stdlib/2and3/distutils/command/bdist_msi.pyi
+typeshed/stdlib/2and3/distutils/command/bdist_packager.pyi
+typeshed/stdlib/2and3/distutils/command/bdist_rpm.pyi
+typeshed/stdlib/2and3/distutils/command/bdist_wininst.pyi
+typeshed/stdlib/2and3/distutils/command/build.pyi
+typeshed/stdlib/2and3/distutils/command/build_clib.pyi
+typeshed/stdlib/2and3/distutils/command/build_ext.pyi
+typeshed/stdlib/2and3/distutils/command/build_py.pyi
+typeshed/stdlib/2and3/distutils/command/build_scripts.pyi
+typeshed/stdlib/2and3/distutils/command/check.pyi
+typeshed/stdlib/2and3/distutils/command/clean.pyi
+typeshed/stdlib/2and3/distutils/command/config.pyi
+typeshed/stdlib/2and3/distutils/command/install.pyi
+typeshed/stdlib/2and3/distutils/command/install_data.pyi
+typeshed/stdlib/2and3/distutils/command/install_headers.pyi
+typeshed/stdlib/2and3/distutils/command/install_lib.pyi
+typeshed/stdlib/2and3/distutils/command/install_scripts.pyi
+typeshed/stdlib/2and3/distutils/command/register.pyi
+typeshed/stdlib/2and3/distutils/command/sdist.pyi
+typeshed/stdlib/2and3/logging/__init__.pyi
+typeshed/stdlib/2and3/logging/config.pyi
+typeshed/stdlib/2and3/logging/handlers.pyi
+typeshed/stdlib/2and3/xml/__init__.pyi
+typeshed/stdlib/2and3/xml/sax/__init__.pyi
+typeshed/stdlib/2and3/xml/sax/handler.pyi
+typeshed/stdlib/2and3/xml/sax/saxutils.pyi
+typeshed/stdlib/2and3/xml/sax/xmlreader.pyi
+typeshed/stdlib/3/__future__.pyi
+typeshed/stdlib/3/_ast.pyi
+typeshed/stdlib/3/_codecs.pyi
+typeshed/stdlib/3/_compression.pyi
+typeshed/stdlib/3/_curses.pyi
+typeshed/stdlib/3/_dummy_thread.pyi
+typeshed/stdlib/3/_importlib_modulespec.pyi
+typeshed/stdlib/3/_json.pyi
+typeshed/stdlib/3/_markupbase.pyi
+typeshed/stdlib/3/_operator.pyi
+typeshed/stdlib/3/_posixsubprocess.pyi
+typeshed/stdlib/3/_random.pyi
+typeshed/stdlib/3/_subprocess.pyi
+typeshed/stdlib/3/_thread.pyi
+typeshed/stdlib/3/_warnings.pyi
+typeshed/stdlib/3/abc.pyi
+typeshed/stdlib/3/array.pyi
+typeshed/stdlib/3/ast.pyi
+typeshed/stdlib/3/atexit.pyi
+typeshed/stdlib/3/base64.pyi
+typeshed/stdlib/3/binascii.pyi
+typeshed/stdlib/3/builtins.pyi
+typeshed/stdlib/3/calendar.pyi
+typeshed/stdlib/3/cgi.pyi
+typeshed/stdlib/3/codecs.pyi
+typeshed/stdlib/3/configparser.pyi
+typeshed/stdlib/3/copy.pyi
+typeshed/stdlib/3/csv.pyi
+typeshed/stdlib/3/datetime.pyi
+typeshed/stdlib/3/decimal.pyi
+typeshed/stdlib/3/difflib.pyi
+typeshed/stdlib/3/dis.pyi
+typeshed/stdlib/3/doctest.pyi
+typeshed/stdlib/3/fcntl.pyi
+typeshed/stdlib/3/fileinput.pyi
+typeshed/stdlib/3/fnmatch.pyi
+typeshed/stdlib/3/functools.pyi
+typeshed/stdlib/3/gc.pyi
+typeshed/stdlib/3/getopt.pyi
+typeshed/stdlib/3/getpass.pyi
+typeshed/stdlib/3/gettext.pyi
+typeshed/stdlib/3/glob.pyi
+typeshed/stdlib/3/grp.pyi
+typeshed/stdlib/3/gzip.pyi
+typeshed/stdlib/3/hashlib.pyi
+typeshed/stdlib/3/heapq.pyi
+typeshed/stdlib/3/imp.pyi
+typeshed/stdlib/3/inspect.pyi
+typeshed/stdlib/3/io.pyi
+typeshed/stdlib/3/itertools.pyi
+typeshed/stdlib/3/json.pyi
+typeshed/stdlib/3/linecache.pyi
+typeshed/stdlib/3/msvcrt.pyi
+typeshed/stdlib/3/opcode.pyi
+typeshed/stdlib/3/pdb.pyi
+typeshed/stdlib/3/pickle.pyi
+typeshed/stdlib/3/pipes.pyi
+typeshed/stdlib/3/platform.pyi
+typeshed/stdlib/3/posix.pyi
+typeshed/stdlib/3/posixpath.pyi
+typeshed/stdlib/3/pprint.pyi
+typeshed/stdlib/3/pwd.pyi
+typeshed/stdlib/3/pyclbr.pyi
+typeshed/stdlib/3/queue.pyi
+typeshed/stdlib/3/random.pyi
+typeshed/stdlib/3/re.pyi
+typeshed/stdlib/3/resource.pyi
+typeshed/stdlib/3/runpy.pyi
+typeshed/stdlib/3/select.pyi
+typeshed/stdlib/3/shelve.pyi
+typeshed/stdlib/3/shlex.pyi
+typeshed/stdlib/3/shutil.pyi
+typeshed/stdlib/3/signal.pyi
+typeshed/stdlib/3/smtplib.pyi
+typeshed/stdlib/3/socket.pyi
+typeshed/stdlib/3/socketserver.pyi
+typeshed/stdlib/3/ssl.pyi
+typeshed/stdlib/3/stat.pyi
+typeshed/stdlib/3/string.pyi
+typeshed/stdlib/3/struct.pyi
+typeshed/stdlib/3/subprocess.pyi
+typeshed/stdlib/3/sys.pyi
+typeshed/stdlib/3/sysconfig.pyi
+typeshed/stdlib/3/tempfile.pyi
+typeshed/stdlib/3/textwrap.pyi
+typeshed/stdlib/3/time.pyi
+typeshed/stdlib/3/token.pyi
+typeshed/stdlib/3/tokenize.pyi
+typeshed/stdlib/3/types.pyi
+typeshed/stdlib/3/typing.pyi
+typeshed/stdlib/3/unicodedata.pyi
+typeshed/stdlib/3/uuid.pyi
+typeshed/stdlib/3/weakref.pyi
+typeshed/stdlib/3/zlib.pyi
+typeshed/stdlib/3.2/xml/__init__.pyi
+typeshed/stdlib/3.2/xml/etree/ElementInclude.pyi
+typeshed/stdlib/3.2/xml/etree/ElementPath.pyi
+typeshed/stdlib/3.2/xml/etree/ElementTree.pyi
+typeshed/stdlib/3.2/xml/etree/__init__.pyi
+typeshed/stdlib/3.2/xml/etree/cElementTree.pyi
+typeshed/stdlib/3.3/ipaddress.pyi
+typeshed/stdlib/3.3/xml/__init__.pyi
+typeshed/stdlib/3.3/xml/etree/ElementInclude.pyi
+typeshed/stdlib/3.3/xml/etree/ElementPath.pyi
+typeshed/stdlib/3.3/xml/etree/ElementTree.pyi
+typeshed/stdlib/3.3/xml/etree/__init__.pyi
+typeshed/stdlib/3.3/xml/etree/cElementTree.pyi
+typeshed/stdlib/3.4/_stat.pyi
+typeshed/stdlib/3.4/_tracemalloc.pyi
+typeshed/stdlib/3.4/enum.pyi
+typeshed/stdlib/3.4/pathlib.pyi
+typeshed/stdlib/3.4/selectors.pyi
+typeshed/stdlib/3.4/asyncio/__init__.pyi
+typeshed/stdlib/3.4/asyncio/coroutines.pyi
+typeshed/stdlib/3.4/asyncio/events.pyi
+typeshed/stdlib/3.4/asyncio/futures.pyi
+typeshed/stdlib/3.4/asyncio/locks.pyi
+typeshed/stdlib/3.4/asyncio/protocols.pyi
+typeshed/stdlib/3.4/asyncio/queues.pyi
+typeshed/stdlib/3.4/asyncio/streams.pyi
+typeshed/stdlib/3.4/asyncio/subprocess.pyi
+typeshed/stdlib/3.4/asyncio/tasks.pyi
+typeshed/stdlib/3.4/asyncio/transports.pyi
+typeshed/stdlib/3.4/xml/__init__.pyi
+typeshed/stdlib/3.4/xml/etree/ElementInclude.pyi
+typeshed/stdlib/3.4/xml/etree/ElementPath.pyi
+typeshed/stdlib/3.4/xml/etree/ElementTree.pyi
+typeshed/stdlib/3.4/xml/etree/__init__.pyi
+typeshed/stdlib/3.4/xml/etree/cElementTree.pyi
+typeshed/stdlib/3.5/xml/__init__.pyi
+typeshed/stdlib/3.5/xml/etree/ElementInclude.pyi
+typeshed/stdlib/3.5/xml/etree/ElementPath.pyi
+typeshed/stdlib/3.5/xml/etree/ElementTree.pyi
+typeshed/stdlib/3.5/xml/etree/__init__.pyi
+typeshed/stdlib/3.5/xml/etree/cElementTree.pyi
+typeshed/stdlib/3.6/secrets.pyi
+typeshed/stdlib/3/collections/__init__.pyi
+typeshed/stdlib/3/collections/abc.pyi
+typeshed/stdlib/3/concurrent/__init__.pyi
+typeshed/stdlib/3/concurrent/futures/__init__.pyi
+typeshed/stdlib/3/concurrent/futures/_base.pyi
+typeshed/stdlib/3/concurrent/futures/process.pyi
+typeshed/stdlib/3/concurrent/futures/thread.pyi
+typeshed/stdlib/3/curses/__init__.pyi
+typeshed/stdlib/3/email/__init__.pyi
+typeshed/stdlib/3/email/charset.pyi
+typeshed/stdlib/3/email/contentmanager.pyi
+typeshed/stdlib/3/email/encoders.pyi
+typeshed/stdlib/3/email/errors.pyi
+typeshed/stdlib/3/email/feedparser.pyi
+typeshed/stdlib/3/email/generator.pyi
+typeshed/stdlib/3/email/header.pyi
+typeshed/stdlib/3/email/headerregistry.pyi
+typeshed/stdlib/3/email/iterators.pyi
+typeshed/stdlib/3/email/message.pyi
+typeshed/stdlib/3/email/parser.pyi
+typeshed/stdlib/3/email/policy.pyi
+typeshed/stdlib/3/email/utils.pyi
+typeshed/stdlib/3/email/mime/__init__.py
+typeshed/stdlib/3/email/mime/application.pyi
+typeshed/stdlib/3/email/mime/audio.pyi
+typeshed/stdlib/3/email/mime/base.pyi
+typeshed/stdlib/3/email/mime/image.pyi
+typeshed/stdlib/3/email/mime/message.pyi
+typeshed/stdlib/3/email/mime/multipart.pyi
+typeshed/stdlib/3/email/mime/nonmultipart.pyi
+typeshed/stdlib/3/email/mime/text.pyi
+typeshed/stdlib/3/encodings/__init__.pyi
+typeshed/stdlib/3/encodings/utf_8.pyi
+typeshed/stdlib/3/html/__init__.pyi
+typeshed/stdlib/3/html/entities.pyi
+typeshed/stdlib/3/html/parser.pyi
+typeshed/stdlib/3/http/__init__.pyi
+typeshed/stdlib/3/http/client.pyi
+typeshed/stdlib/3/http/cookiejar.pyi
+typeshed/stdlib/3/http/cookies.pyi
+typeshed/stdlib/3/http/server.pyi
+typeshed/stdlib/3/importlib/__init__.pyi
+typeshed/stdlib/3/importlib/abc.pyi
+typeshed/stdlib/3/importlib/machinery.pyi
+typeshed/stdlib/3/importlib/util.pyi
+typeshed/stdlib/3/multiprocessing/__init__.pyi
+typeshed/stdlib/3/multiprocessing/managers.pyi
+typeshed/stdlib/3/multiprocessing/pool.pyi
+typeshed/stdlib/3/multiprocessing/process.pyi
+typeshed/stdlib/3/os/__init__.pyi
+typeshed/stdlib/3/os/path.pyi
+typeshed/stdlib/3/sqlite3/__init__.pyi
+typeshed/stdlib/3/sqlite3/dbapi2.pyi
+typeshed/stdlib/3/tkinter/__init__.pyi
+typeshed/stdlib/3/tkinter/constants.pyi
+typeshed/stdlib/3/tkinter/ttk.pyi
+typeshed/stdlib/3/unittest/__init__.pyi
+typeshed/stdlib/3/unittest/mock.pyi
+typeshed/stdlib/3/urllib/__init__.pyi
+typeshed/stdlib/3/urllib/error.pyi
+typeshed/stdlib/3/urllib/parse.pyi
+typeshed/stdlib/3/urllib/request.pyi
+typeshed/stdlib/3/urllib/response.pyi
+typeshed/stdlib/3/urllib/robotparser.pyi
+typeshed/stdlib/3/wsgiref/__init__.pyi
+typeshed/stdlib/3/wsgiref/validate.pyi
+typeshed/stdlib/3/xml/etree/ElementInclude.pyi
+typeshed/stdlib/3/xml/etree/ElementPath.pyi
+typeshed/stdlib/3/xml/etree/ElementTree.pyi
+typeshed/stdlib/3/xml/etree/__init__.pyi
+typeshed/stdlib/3/xml/etree/cElementTree.pyi
+typeshed/tests/mypy_test.py
+typeshed/tests/pytype_test.py
+typeshed/third_party/2/croniter.pyi
+typeshed/third_party/2/enum.pyi
+typeshed/third_party/2/gflags.pyi
+typeshed/third_party/2/itsdangerous.pyi
+typeshed/third_party/2/pycurl.pyi
+typeshed/third_party/2/pymssql.pyi
+typeshed/third_party/2/OpenSSL/__init__.pyi
+typeshed/third_party/2/OpenSSL/crypto.pyi
+typeshed/third_party/2/concurrent/__init__.pyi
+typeshed/third_party/2/concurrent/futures/__init__.pyi
+typeshed/third_party/2/dateutil/__init__.pyi
+typeshed/third_party/2/dateutil/parser.pyi
+typeshed/third_party/2/dateutil/relativedelta.pyi
+typeshed/third_party/2/fb303/FacebookService.pyi
+typeshed/third_party/2/fb303/__init__.pyi
+typeshed/third_party/2/google/__init__.pyi
+typeshed/third_party/2/google/protobuf/__init__.pyi
+typeshed/third_party/2/google/protobuf/descriptor.pyi
+typeshed/third_party/2/google/protobuf/descriptor_pb2.pyi
+typeshed/third_party/2/google/protobuf/descriptor_pool.pyi
+typeshed/third_party/2/google/protobuf/message.pyi
+typeshed/third_party/2/google/protobuf/message_factory.pyi
+typeshed/third_party/2/google/protobuf/reflection.pyi
+typeshed/third_party/2/google/protobuf/symbol_database.pyi
+typeshed/third_party/2/google/protobuf/internal/__init__.pyi
+typeshed/third_party/2/google/protobuf/internal/decoder.pyi
+typeshed/third_party/2/google/protobuf/internal/encoder.pyi
+typeshed/third_party/2/google/protobuf/internal/enum_type_wrapper.pyi
+typeshed/third_party/2/google/protobuf/internal/wire_format.pyi
+typeshed/third_party/2/kazoo/__init__.pyi
+typeshed/third_party/2/kazoo/client.pyi
+typeshed/third_party/2/kazoo/exceptions.pyi
+typeshed/third_party/2/kazoo/recipe/__init__.pyi
+typeshed/third_party/2/kazoo/recipe/watchers.pyi
+typeshed/third_party/2/redis/__init__.pyi
+typeshed/third_party/2/redis/client.pyi
+typeshed/third_party/2/redis/connection.pyi
+typeshed/third_party/2/redis/exceptions.pyi
+typeshed/third_party/2/redis/utils.pyi
+typeshed/third_party/2/requests/__init__.pyi
+typeshed/third_party/2/requests/adapters.pyi
+typeshed/third_party/2/requests/api.pyi
+typeshed/third_party/2/requests/auth.pyi
+typeshed/third_party/2/requests/compat.pyi
+typeshed/third_party/2/requests/cookies.pyi
+typeshed/third_party/2/requests/exceptions.pyi
+typeshed/third_party/2/requests/hooks.pyi
+typeshed/third_party/2/requests/models.pyi
+typeshed/third_party/2/requests/sessions.pyi
+typeshed/third_party/2/requests/status_codes.pyi
+typeshed/third_party/2/requests/structures.pyi
+typeshed/third_party/2/requests/utils.pyi
+typeshed/third_party/2/requests/packages/__init__.pyi
+typeshed/third_party/2/requests/packages/urllib3/__init__.pyi
+typeshed/third_party/2/requests/packages/urllib3/_collections.pyi
+typeshed/third_party/2/requests/packages/urllib3/connection.pyi
+typeshed/third_party/2/requests/packages/urllib3/connectionpool.pyi
+typeshed/third_party/2/requests/packages/urllib3/exceptions.pyi
+typeshed/third_party/2/requests/packages/urllib3/fields.pyi
+typeshed/third_party/2/requests/packages/urllib3/filepost.pyi
+typeshed/third_party/2/requests/packages/urllib3/poolmanager.pyi
+typeshed/third_party/2/requests/packages/urllib3/request.pyi
+typeshed/third_party/2/requests/packages/urllib3/response.pyi
+typeshed/third_party/2/requests/packages/urllib3/contrib/__init__.pyi
+typeshed/third_party/2/requests/packages/urllib3/packages/__init__.pyi
+typeshed/third_party/2/requests/packages/urllib3/packages/ssl_match_hostname/__init__.pyi
+typeshed/third_party/2/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.pyi
+typeshed/third_party/2/requests/packages/urllib3/util/__init__.pyi
+typeshed/third_party/2/requests/packages/urllib3/util/connection.pyi
+typeshed/third_party/2/requests/packages/urllib3/util/request.pyi
+typeshed/third_party/2/requests/packages/urllib3/util/response.pyi
+typeshed/third_party/2/requests/packages/urllib3/util/retry.pyi
+typeshed/third_party/2/requests/packages/urllib3/util/timeout.pyi
+typeshed/third_party/2/requests/packages/urllib3/util/url.pyi
+typeshed/third_party/2/routes/__init__.pyi
+typeshed/third_party/2/routes/mapper.pyi
+typeshed/third_party/2/routes/util.pyi
+typeshed/third_party/2/scribe/__init__.pyi
+typeshed/third_party/2/scribe/scribe.pyi
+typeshed/third_party/2/scribe/ttypes.pyi
+typeshed/third_party/2/selenium/webdriver/remote/webdriver.pyi
+typeshed/third_party/2/selenium/webdriver/remote/webelement.pyi
+typeshed/third_party/2/simplejson/__init__.pyi
+typeshed/third_party/2/simplejson/decoder.pyi
+typeshed/third_party/2/simplejson/encoder.pyi
+typeshed/third_party/2/simplejson/scanner.pyi
+typeshed/third_party/2/six/__init__.pyi
+typeshed/third_party/2/six/moves/__init__.pyi
+typeshed/third_party/2/six/moves/cPickle.pyi
+typeshed/third_party/2/six/moves/urllib_error.pyi
+typeshed/third_party/2/six/moves/urllib_parse.pyi
+typeshed/third_party/2/six/moves/urllib_request.pyi
+typeshed/third_party/2/six/moves/urllib_response.pyi
+typeshed/third_party/2/six/moves/urllib_robotparser.pyi
+typeshed/third_party/2/six/moves/urllib/__init__.pyi
+typeshed/third_party/2/six/moves/urllib/error.pyi
+typeshed/third_party/2/six/moves/urllib/parse.pyi
+typeshed/third_party/2/six/moves/urllib/request.pyi
+typeshed/third_party/2/six/moves/urllib/response.pyi
+typeshed/third_party/2/six/moves/urllib/robotparser.pyi
+typeshed/third_party/2/sqlalchemy/__init__.pyi
+typeshed/third_party/2/sqlalchemy/exc.pyi
+typeshed/third_party/2/sqlalchemy/inspection.pyi
+typeshed/third_party/2/sqlalchemy/log.pyi
+typeshed/third_party/2/sqlalchemy/pool.pyi
+typeshed/third_party/2/sqlalchemy/schema.pyi
+typeshed/third_party/2/sqlalchemy/types.pyi
+typeshed/third_party/2/sqlalchemy/databases/__init__.pyi
+typeshed/third_party/2/sqlalchemy/databases/mysql.pyi
+typeshed/third_party/2/sqlalchemy/dialects/__init__.pyi
+typeshed/third_party/2/sqlalchemy/dialects/mysql/__init__.pyi
+typeshed/third_party/2/sqlalchemy/dialects/mysql/base.pyi
+typeshed/third_party/2/sqlalchemy/engine/__init__.pyi
+typeshed/third_party/2/sqlalchemy/engine/base.pyi
+typeshed/third_party/2/sqlalchemy/engine/strategies.pyi
+typeshed/third_party/2/sqlalchemy/engine/url.pyi
+typeshed/third_party/2/sqlalchemy/orm/__init__.pyi
+typeshed/third_party/2/sqlalchemy/orm/session.pyi
+typeshed/third_party/2/sqlalchemy/sql/__init__.pyi
+typeshed/third_party/2/sqlalchemy/sql/annotation.pyi
+typeshed/third_party/2/sqlalchemy/sql/base.pyi
+typeshed/third_party/2/sqlalchemy/sql/ddl.pyi
+typeshed/third_party/2/sqlalchemy/sql/dml.pyi
+typeshed/third_party/2/sqlalchemy/sql/elements.pyi
+typeshed/third_party/2/sqlalchemy/sql/expression.pyi
+typeshed/third_party/2/sqlalchemy/sql/functions.pyi
+typeshed/third_party/2/sqlalchemy/sql/naming.pyi
+typeshed/third_party/2/sqlalchemy/sql/operators.pyi
+typeshed/third_party/2/sqlalchemy/sql/schema.pyi
+typeshed/third_party/2/sqlalchemy/sql/selectable.pyi
+typeshed/third_party/2/sqlalchemy/sql/sqltypes.pyi
+typeshed/third_party/2/sqlalchemy/sql/type_api.pyi
+typeshed/third_party/2/sqlalchemy/sql/visitors.pyi
+typeshed/third_party/2/sqlalchemy/util/__init__.pyi
+typeshed/third_party/2/sqlalchemy/util/_collections.pyi
+typeshed/third_party/2/sqlalchemy/util/compat.pyi
+typeshed/third_party/2/sqlalchemy/util/deprecations.pyi
+typeshed/third_party/2/sqlalchemy/util/langhelpers.pyi
+typeshed/third_party/2/thrift/Thrift.pyi
+typeshed/third_party/2/thrift/__init__.pyi
+typeshed/third_party/2/thrift/protocol/TBinaryProtocol.pyi
+typeshed/third_party/2/thrift/protocol/TProtocol.pyi
+typeshed/third_party/2/thrift/protocol/__init__.pyi
+typeshed/third_party/2/thrift/transport/TSocket.pyi
+typeshed/third_party/2/thrift/transport/TTransport.pyi
+typeshed/third_party/2/thrift/transport/__init__.pyi
+typeshed/third_party/2/tornado/__init__.pyi
+typeshed/third_party/2/tornado/concurrent.pyi
+typeshed/third_party/2/tornado/gen.pyi
+typeshed/third_party/2/tornado/httpclient.pyi
+typeshed/third_party/2/tornado/httpserver.pyi
+typeshed/third_party/2/tornado/httputil.pyi
+typeshed/third_party/2/tornado/ioloop.pyi
+typeshed/third_party/2/tornado/locks.pyi
+typeshed/third_party/2/tornado/netutil.pyi
+typeshed/third_party/2/tornado/tcpserver.pyi
+typeshed/third_party/2/tornado/testing.pyi
+typeshed/third_party/2/tornado/util.pyi
+typeshed/third_party/2/tornado/web.pyi
+typeshed/third_party/2/werkzeug/__init__.pyi
+typeshed/third_party/2/werkzeug/_compat.pyi
+typeshed/third_party/2/werkzeug/_internal.pyi
+typeshed/third_party/2/werkzeug/_reloader.pyi
+typeshed/third_party/2/werkzeug/datastructures.pyi
+typeshed/third_party/2/werkzeug/exceptions.pyi
+typeshed/third_party/2/werkzeug/filesystem.pyi
+typeshed/third_party/2/werkzeug/formparser.pyi
+typeshed/third_party/2/werkzeug/http.pyi
+typeshed/third_party/2/werkzeug/local.pyi
+typeshed/third_party/2/werkzeug/posixemulation.pyi
+typeshed/third_party/2/werkzeug/routing.pyi
+typeshed/third_party/2/werkzeug/script.pyi
+typeshed/third_party/2/werkzeug/security.pyi
+typeshed/third_party/2/werkzeug/serving.pyi
+typeshed/third_party/2/werkzeug/test.pyi
+typeshed/third_party/2/werkzeug/testapp.pyi
+typeshed/third_party/2/werkzeug/urls.pyi
+typeshed/third_party/2/werkzeug/useragents.pyi
+typeshed/third_party/2/werkzeug/utils.pyi
+typeshed/third_party/2/werkzeug/wrappers.pyi
+typeshed/third_party/2/werkzeug/wsgi.pyi
+typeshed/third_party/2/werkzeug/contrib/__init__.pyi
+typeshed/third_party/2/werkzeug/contrib/atom.pyi
+typeshed/third_party/2/werkzeug/contrib/cache.pyi
+typeshed/third_party/2/werkzeug/contrib/fixers.pyi
+typeshed/third_party/2/werkzeug/contrib/iterio.pyi
+typeshed/third_party/2/werkzeug/contrib/jsrouting.pyi
+typeshed/third_party/2/werkzeug/contrib/limiter.pyi
+typeshed/third_party/2/werkzeug/contrib/lint.pyi
+typeshed/third_party/2/werkzeug/contrib/profiler.pyi
+typeshed/third_party/2/werkzeug/contrib/securecookie.pyi
+typeshed/third_party/2/werkzeug/contrib/sessions.pyi
+typeshed/third_party/2/werkzeug/contrib/testtools.pyi
+typeshed/third_party/2/werkzeug/contrib/wrappers.pyi
+typeshed/third_party/2/werkzeug/debug/__init__.pyi
+typeshed/third_party/2/werkzeug/debug/console.pyi
+typeshed/third_party/2/werkzeug/debug/repr.pyi
+typeshed/third_party/2/werkzeug/debug/tbtools.pyi
+typeshed/third_party/2/yaml/__init__.pyi
+typeshed/third_party/2/yaml/composer.pyi
+typeshed/third_party/2/yaml/constructor.pyi
+typeshed/third_party/2/yaml/dumper.pyi
+typeshed/third_party/2/yaml/emitter.pyi
+typeshed/third_party/2/yaml/error.pyi
+typeshed/third_party/2/yaml/events.pyi
+typeshed/third_party/2/yaml/loader.pyi
+typeshed/third_party/2/yaml/nodes.pyi
+typeshed/third_party/2/yaml/parser.pyi
+typeshed/third_party/2/yaml/reader.pyi
+typeshed/third_party/2/yaml/representer.pyi
+typeshed/third_party/2/yaml/resolver.pyi
+typeshed/third_party/2/yaml/scanner.pyi
+typeshed/third_party/2/yaml/serializer.pyi
+typeshed/third_party/2/yaml/tokens.pyi
+typeshed/third_party/2and3/backports_abc.pyi
+typeshed/third_party/2and3/certifi.pyi
+typeshed/third_party/2and3/mypy_extensions.pyi
+typeshed/third_party/2and3/singledispatch.pyi
+typeshed/third_party/2and3/ujson.pyi
+typeshed/third_party/2and3/Crypto/__init__.pyi
+typeshed/third_party/2and3/Crypto/pct_warnings.pyi
+typeshed/third_party/2and3/Crypto/Cipher/AES.pyi
+typeshed/third_party/2and3/Crypto/Cipher/ARC2.pyi
+typeshed/third_party/2and3/Crypto/Cipher/ARC4.pyi
+typeshed/third_party/2and3/Crypto/Cipher/Blowfish.pyi
+typeshed/third_party/2and3/Crypto/Cipher/CAST.pyi
+typeshed/third_party/2and3/Crypto/Cipher/DES.pyi
+typeshed/third_party/2and3/Crypto/Cipher/DES3.pyi
+typeshed/third_party/2and3/Crypto/Cipher/PKCS1_OAEP.pyi
+typeshed/third_party/2and3/Crypto/Cipher/PKCS1_v1_5.pyi
+typeshed/third_party/2and3/Crypto/Cipher/XOR.pyi
+typeshed/third_party/2and3/Crypto/Cipher/__init__.pyi
+typeshed/third_party/2and3/Crypto/Cipher/blockalgo.pyi
+typeshed/third_party/2and3/Crypto/Hash/HMAC.pyi
+typeshed/third_party/2and3/Crypto/Hash/MD2.pyi
+typeshed/third_party/2and3/Crypto/Hash/MD4.pyi
+typeshed/third_party/2and3/Crypto/Hash/MD5.pyi
+typeshed/third_party/2and3/Crypto/Hash/RIPEMD.pyi
+typeshed/third_party/2and3/Crypto/Hash/SHA.pyi
+typeshed/third_party/2and3/Crypto/Hash/SHA224.pyi
+typeshed/third_party/2and3/Crypto/Hash/SHA256.pyi
+typeshed/third_party/2and3/Crypto/Hash/SHA384.pyi
+typeshed/third_party/2and3/Crypto/Hash/SHA512.pyi
+typeshed/third_party/2and3/Crypto/Hash/__init__.pyi
+typeshed/third_party/2and3/Crypto/Hash/hashalgo.pyi
+typeshed/third_party/2and3/Crypto/Protocol/AllOrNothing.pyi
+typeshed/third_party/2and3/Crypto/Protocol/Chaffing.pyi
+typeshed/third_party/2and3/Crypto/Protocol/KDF.pyi
+typeshed/third_party/2and3/Crypto/Protocol/__init__.pyi
+typeshed/third_party/2and3/Crypto/PublicKey/DSA.pyi
+typeshed/third_party/2and3/Crypto/PublicKey/ElGamal.pyi
+typeshed/third_party/2and3/Crypto/PublicKey/RSA.pyi
+typeshed/third_party/2and3/Crypto/PublicKey/__init__.pyi
+typeshed/third_party/2and3/Crypto/PublicKey/pubkey.pyi
+typeshed/third_party/2and3/Crypto/Random/__init__.pyi
+typeshed/third_party/2and3/Crypto/Random/random.pyi
+typeshed/third_party/2and3/Crypto/Random/Fortuna/FortunaAccumulator.pyi
+typeshed/third_party/2and3/Crypto/Random/Fortuna/FortunaGenerator.pyi
+typeshed/third_party/2and3/Crypto/Random/Fortuna/SHAd256.pyi
+typeshed/third_party/2and3/Crypto/Random/Fortuna/__init__.pyi
+typeshed/third_party/2and3/Crypto/Random/OSRNG/__init__.pyi
+typeshed/third_party/2and3/Crypto/Random/OSRNG/fallback.pyi
+typeshed/third_party/2and3/Crypto/Random/OSRNG/posix.pyi
+typeshed/third_party/2and3/Crypto/Random/OSRNG/rng_base.pyi
+typeshed/third_party/2and3/Crypto/Signature/PKCS1_PSS.pyi
+typeshed/third_party/2and3/Crypto/Signature/PKCS1_v1_5.pyi
+typeshed/third_party/2and3/Crypto/Signature/__init__.pyi
+typeshed/third_party/2and3/Crypto/Util/Counter.pyi
+typeshed/third_party/2and3/Crypto/Util/RFC1751.pyi
+typeshed/third_party/2and3/Crypto/Util/__init__.pyi
+typeshed/third_party/2and3/Crypto/Util/asn1.pyi
+typeshed/third_party/2and3/Crypto/Util/number.pyi
+typeshed/third_party/2and3/Crypto/Util/randpool.pyi
+typeshed/third_party/2and3/Crypto/Util/strxor.pyi
+typeshed/third_party/2and3/atomicwrites/__init__.pyi
+typeshed/third_party/2and3/backports/__init__.pyi
+typeshed/third_party/2and3/backports/ssl_match_hostname.pyi
+typeshed/third_party/2and3/boto/__init__.pyi
+typeshed/third_party/2and3/boto/auth.pyi
+typeshed/third_party/2and3/boto/auth_handler.pyi
+typeshed/third_party/2and3/boto/compat.pyi
+typeshed/third_party/2and3/boto/connection.pyi
+typeshed/third_party/2and3/boto/exception.pyi
+typeshed/third_party/2and3/boto/plugin.pyi
+typeshed/third_party/2and3/boto/regioninfo.pyi
+typeshed/third_party/2and3/boto/ec2/__init__.pyi
+typeshed/third_party/2and3/boto/elb/__init__.pyi
+typeshed/third_party/2and3/boto/s3/__init__.pyi
+typeshed/third_party/2and3/boto/s3/acl.pyi
+typeshed/third_party/2and3/boto/s3/bucket.pyi
+typeshed/third_party/2and3/boto/s3/bucketlistresultset.pyi
+typeshed/third_party/2and3/boto/s3/bucketlogging.pyi
+typeshed/third_party/2and3/boto/s3/connection.pyi
+typeshed/third_party/2and3/boto/s3/cors.pyi
+typeshed/third_party/2and3/boto/s3/deletemarker.pyi
+typeshed/third_party/2and3/boto/s3/key.pyi
+typeshed/third_party/2and3/boto/s3/keyfile.pyi
+typeshed/third_party/2and3/boto/s3/lifecycle.pyi
+typeshed/third_party/2and3/boto/s3/multidelete.pyi
+typeshed/third_party/2and3/boto/s3/multipart.pyi
+typeshed/third_party/2and3/boto/s3/prefix.pyi
+typeshed/third_party/2and3/boto/s3/tagging.pyi
+typeshed/third_party/2and3/boto/s3/user.pyi
+typeshed/third_party/2and3/boto/s3/website.pyi
+typeshed/third_party/2and3/characteristic/__init__.pyi
+typeshed/third_party/2and3/jinja2/__init__.pyi
+typeshed/third_party/2and3/jinja2/_compat.pyi
+typeshed/third_party/2and3/jinja2/_stringdefs.pyi
+typeshed/third_party/2and3/jinja2/bccache.pyi
+typeshed/third_party/2and3/jinja2/compiler.pyi
+typeshed/third_party/2and3/jinja2/constants.pyi
+typeshed/third_party/2and3/jinja2/debug.pyi
+typeshed/third_party/2and3/jinja2/defaults.pyi
+typeshed/third_party/2and3/jinja2/environment.pyi
+typeshed/third_party/2and3/jinja2/exceptions.pyi
+typeshed/third_party/2and3/jinja2/ext.pyi
+typeshed/third_party/2and3/jinja2/filters.pyi
+typeshed/third_party/2and3/jinja2/lexer.pyi
+typeshed/third_party/2and3/jinja2/loaders.pyi
+typeshed/third_party/2and3/jinja2/meta.pyi
+typeshed/third_party/2and3/jinja2/nodes.pyi
+typeshed/third_party/2and3/jinja2/optimizer.pyi
+typeshed/third_party/2and3/jinja2/parser.pyi
+typeshed/third_party/2and3/jinja2/runtime.pyi
+typeshed/third_party/2and3/jinja2/sandbox.pyi
+typeshed/third_party/2and3/jinja2/tests.pyi
+typeshed/third_party/2and3/jinja2/utils.pyi
+typeshed/third_party/2and3/jinja2/visitor.pyi
+typeshed/third_party/2and3/markupsafe/__init__.pyi
+typeshed/third_party/2and3/markupsafe/_compat.pyi
+typeshed/third_party/2and3/markupsafe/_constants.pyi
+typeshed/third_party/2and3/markupsafe/_native.pyi
+typeshed/third_party/2and3/markupsafe/_speedups.pyi
+typeshed/third_party/2and3/pytz/__init__.pyi
+typeshed/third_party/2and3/pytz/lazy.pyi
+typeshed/third_party/3/enum.pyi
+typeshed/third_party/3/itsdangerous.pyi
+typeshed/third_party/3/pkg_resources.pyi
+typeshed/third_party/3.6/click/__init__.pyi
+typeshed/third_party/3.6/click/core.pyi
+typeshed/third_party/3.6/click/decorators.pyi
+typeshed/third_party/3.6/click/exceptions.pyi
+typeshed/third_party/3.6/click/formatting.pyi
+typeshed/third_party/3.6/click/globals.pyi
+typeshed/third_party/3.6/click/parser.pyi
+typeshed/third_party/3.6/click/termui.pyi
+typeshed/third_party/3.6/click/types.pyi
+typeshed/third_party/3.6/click/utils.pyi
+typeshed/third_party/3/dateutil/__init__.pyi
+typeshed/third_party/3/dateutil/parser.pyi
+typeshed/third_party/3/dateutil/relativedelta.pyi
+typeshed/third_party/3/docutils/__init__.pyi
+typeshed/third_party/3/docutils/examples.pyi
+typeshed/third_party/3/docutils/nodes.pyi
+typeshed/third_party/3/docutils/parsers/__init__.pyi
+typeshed/third_party/3/docutils/parsers/rst/__init__.pyi
+typeshed/third_party/3/docutils/parsers/rst/nodes.pyi
+typeshed/third_party/3/docutils/parsers/rst/roles.pyi
+typeshed/third_party/3/docutils/parsers/rst/states.pyi
+typeshed/third_party/3/lxml/__init__.pyi
+typeshed/third_party/3/lxml/etree.pyi
+typeshed/third_party/3/lxml/objectify.pyi
+typeshed/third_party/3/requests/__init__.pyi
+typeshed/third_party/3/requests/adapters.pyi
+typeshed/third_party/3/requests/api.pyi
+typeshed/third_party/3/requests/auth.pyi
+typeshed/third_party/3/requests/compat.pyi
+typeshed/third_party/3/requests/cookies.pyi
+typeshed/third_party/3/requests/exceptions.pyi
+typeshed/third_party/3/requests/hooks.pyi
+typeshed/third_party/3/requests/models.pyi
+typeshed/third_party/3/requests/sessions.pyi
+typeshed/third_party/3/requests/status_codes.pyi
+typeshed/third_party/3/requests/structures.pyi
+typeshed/third_party/3/requests/utils.pyi
+typeshed/third_party/3/requests/packages/__init__.pyi
+typeshed/third_party/3/requests/packages/urllib3/__init__.pyi
+typeshed/third_party/3/requests/packages/urllib3/_collections.pyi
+typeshed/third_party/3/requests/packages/urllib3/connection.pyi
+typeshed/third_party/3/requests/packages/urllib3/connectionpool.pyi
+typeshed/third_party/3/requests/packages/urllib3/exceptions.pyi
+typeshed/third_party/3/requests/packages/urllib3/fields.pyi
+typeshed/third_party/3/requests/packages/urllib3/filepost.pyi
+typeshed/third_party/3/requests/packages/urllib3/poolmanager.pyi
+typeshed/third_party/3/requests/packages/urllib3/request.pyi
+typeshed/third_party/3/requests/packages/urllib3/response.pyi
+typeshed/third_party/3/requests/packages/urllib3/contrib/__init__.pyi
+typeshed/third_party/3/requests/packages/urllib3/packages/__init__.pyi
+typeshed/third_party/3/requests/packages/urllib3/packages/ssl_match_hostname/__init__.pyi
+typeshed/third_party/3/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.pyi
+typeshed/third_party/3/requests/packages/urllib3/util/__init__.pyi
+typeshed/third_party/3/requests/packages/urllib3/util/connection.pyi
+typeshed/third_party/3/requests/packages/urllib3/util/request.pyi
+typeshed/third_party/3/requests/packages/urllib3/util/response.pyi
+typeshed/third_party/3/requests/packages/urllib3/util/retry.pyi
+typeshed/third_party/3/requests/packages/urllib3/util/ssl_.pyi
+typeshed/third_party/3/requests/packages/urllib3/util/timeout.pyi
+typeshed/third_party/3/requests/packages/urllib3/util/url.pyi
+typeshed/third_party/3/six/__init__.pyi
+typeshed/third_party/3/six/moves/__init__.pyi
+typeshed/third_party/3/six/moves/cPickle.pyi
+typeshed/third_party/3/six/moves/urllib_error.pyi
+typeshed/third_party/3/six/moves/urllib_parse.pyi
+typeshed/third_party/3/six/moves/urllib_request.pyi
+typeshed/third_party/3/six/moves/urllib_response.pyi
+typeshed/third_party/3/six/moves/urllib_robotparser.pyi
+typeshed/third_party/3/six/moves/urllib/__init__.pyi
+typeshed/third_party/3/six/moves/urllib/error.pyi
+typeshed/third_party/3/six/moves/urllib/parse.pyi
+typeshed/third_party/3/six/moves/urllib/request.pyi
+typeshed/third_party/3/six/moves/urllib/response.pyi
+typeshed/third_party/3/six/moves/urllib/robotparser.pyi
+typeshed/third_party/3/typed_ast/__init__.pyi
+typeshed/third_party/3/typed_ast/ast27.pyi
+typeshed/third_party/3/typed_ast/ast35.pyi
+typeshed/third_party/3/typed_ast/conversions.pyi
+typeshed/third_party/3/werkzeug/__init__.pyi
+typeshed/third_party/3/werkzeug/_compat.pyi
+typeshed/third_party/3/werkzeug/_internal.pyi
+typeshed/third_party/3/werkzeug/_reloader.pyi
+typeshed/third_party/3/werkzeug/datastructures.pyi
+typeshed/third_party/3/werkzeug/exceptions.pyi
+typeshed/third_party/3/werkzeug/filesystem.pyi
+typeshed/third_party/3/werkzeug/formparser.pyi
+typeshed/third_party/3/werkzeug/http.pyi
+typeshed/third_party/3/werkzeug/local.pyi
+typeshed/third_party/3/werkzeug/posixemulation.pyi
+typeshed/third_party/3/werkzeug/routing.pyi
+typeshed/third_party/3/werkzeug/script.pyi
+typeshed/third_party/3/werkzeug/security.pyi
+typeshed/third_party/3/werkzeug/serving.pyi
+typeshed/third_party/3/werkzeug/test.pyi
+typeshed/third_party/3/werkzeug/testapp.pyi
+typeshed/third_party/3/werkzeug/urls.pyi
+typeshed/third_party/3/werkzeug/useragents.pyi
+typeshed/third_party/3/werkzeug/utils.pyi
+typeshed/third_party/3/werkzeug/wrappers.pyi
+typeshed/third_party/3/werkzeug/wsgi.pyi
+typeshed/third_party/3/werkzeug/contrib/__init__.pyi
+typeshed/third_party/3/werkzeug/contrib/atom.pyi
+typeshed/third_party/3/werkzeug/contrib/cache.pyi
+typeshed/third_party/3/werkzeug/contrib/fixers.pyi
+typeshed/third_party/3/werkzeug/contrib/iterio.pyi
+typeshed/third_party/3/werkzeug/contrib/jsrouting.pyi
+typeshed/third_party/3/werkzeug/contrib/limiter.pyi
+typeshed/third_party/3/werkzeug/contrib/lint.pyi
+typeshed/third_party/3/werkzeug/contrib/profiler.pyi
+typeshed/third_party/3/werkzeug/contrib/securecookie.pyi
+typeshed/third_party/3/werkzeug/contrib/sessions.pyi
+typeshed/third_party/3/werkzeug/contrib/testtools.pyi
+typeshed/third_party/3/werkzeug/contrib/wrappers.pyi
+typeshed/third_party/3/werkzeug/debug/__init__.pyi
+typeshed/third_party/3/werkzeug/debug/console.pyi
+typeshed/third_party/3/werkzeug/debug/repr.pyi
+typeshed/third_party/3/werkzeug/debug/tbtools.pyi
+xml/mypy-html.css
+xml/mypy-html.xslt
+xml/mypy-txt.xslt
+xml/mypy.xsd
\ No newline at end of file
diff --git a/mypy.egg-info/dependency_links.txt b/mypy.egg-info/dependency_links.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/mypy.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/mypy.egg-info/requires.txt b/mypy.egg-info/requires.txt
new file mode 100644
index 0000000..34d5806
--- /dev/null
+++ b/mypy.egg-info/requires.txt
@@ -0,0 +1 @@
+typed-ast >= 0.6.3
diff --git a/mypy.egg-info/top_level.txt b/mypy.egg-info/top_level.txt
new file mode 100644
index 0000000..f0aa93a
--- /dev/null
+++ b/mypy.egg-info/top_level.txt
@@ -0,0 +1 @@
+mypy
diff --git a/mypy/myunit/__init__.py b/mypy/myunit/__init__.py
deleted file mode 100644
index 26b9a45..0000000
--- a/mypy/myunit/__init__.py
+++ /dev/null
@@ -1,380 +0,0 @@
-import importlib
-import os
-import sys
-import re
-import tempfile
-import time
-import traceback
-
-from typing import List, Tuple, Any, Callable, Union, cast
-from types import TracebackType
-
-
-# TODO remove global state
-is_verbose = False
-is_quiet = False
-patterns = [] # type: List[str]
-times = [] # type: List[Tuple[float, str]]
-
-
-class AssertionFailure(Exception):
- """Exception used to signal failed test cases."""
- def __init__(self, s: str = None) -> None:
- if s:
- super().__init__(s)
- else:
- super().__init__()
-
-
-class SkipTestCaseException(Exception):
- """Exception used to signal skipped test cases."""
- pass
-
-
-def assert_true(b: bool, msg: str = None) -> None:
- if not b:
- raise AssertionFailure(msg)
-
-
-def assert_false(b: bool, msg: str = None) -> None:
- if b:
- raise AssertionFailure(msg)
-
-
-def good_repr(obj: object) -> str:
- if isinstance(obj, str):
- if obj.count('\n') > 1:
- bits = ["'''\\"]
- for line in obj.split('\n'):
- # force repr to use ' not ", then cut it off
- bits.append(repr('"' + line)[2:-1])
- bits[-1] += "'''"
- return '\n'.join(bits)
- return repr(obj)
-
-
-def assert_equal(a: object, b: object, fmt: str = '{} != {}') -> None:
- if a != b:
- raise AssertionFailure(fmt.format(good_repr(a), good_repr(b)))
-
-
-def assert_not_equal(a: object, b: object, fmt: str = '{} == {}') -> None:
- if a == b:
- raise AssertionFailure(fmt.format(good_repr(a), good_repr(b)))
-
-
-def assert_raises(typ: type, *rest: Any) -> None:
- """Usage: assert_raises(exception class[, message], function[, args])
-
- Call function with the given arguments and expect an exception of the given
- type.
-
- TODO use overloads for better type checking
- """
- # Parse arguments.
- msg = None # type: str
- if isinstance(rest[0], str) or rest[0] is None:
- msg = rest[0]
- rest = rest[1:]
- f = rest[0]
- args = [] # type: List[Any]
- if len(rest) > 1:
- args = rest[1]
- assert len(rest) <= 2
-
- # Perform call and verify the exception.
- try:
- f(*args)
- except BaseException as e:
- if isinstance(e, KeyboardInterrupt):
- raise
- assert_type(typ, e)
- if msg:
- assert_equal(e.args[0], msg, 'Invalid message {}, expected {}')
- else:
- raise AssertionFailure('No exception raised')
-
-
-def assert_type(typ: type, value: object) -> None:
- if type(value) != typ:
- raise AssertionFailure('Invalid type {}, expected {}'.format(
- typename(type(value)), typename(typ)))
-
-
-def fail() -> None:
- raise AssertionFailure()
-
-
-class TestCase:
- def __init__(self, name: str, suite: 'Suite' = None,
- func: Callable[[], None] = None) -> None:
- self.func = func
- self.name = name
- self.suite = suite
- self.old_cwd = None # type: str
- self.tmpdir = None # type: tempfile.TemporaryDirectory
-
- def run(self) -> None:
- if self.func:
- self.func()
-
- def set_up(self) -> None:
- self.old_cwd = os.getcwd()
- self.tmpdir = tempfile.TemporaryDirectory(prefix='mypy-test-',
- dir=os.path.abspath('tmp-test-dirs'))
- os.chdir(self.tmpdir.name)
- os.mkdir('tmp')
- if self.suite:
- self.suite.set_up()
-
- def tear_down(self) -> None:
- if self.suite:
- self.suite.tear_down()
- os.chdir(self.old_cwd)
- self.tmpdir.cleanup()
- self.old_cwd = None
- self.tmpdir = None
-
-
-class Suite:
- def __init__(self) -> None:
- self.prefix = typename(type(self)) + '.'
- # Each test case is either a TestCase object or (str, function).
- self._test_cases = [] # type: List[Any]
- self.init()
-
- def set_up(self) -> None:
- pass
-
- def tear_down(self) -> None:
- pass
-
- def init(self) -> None:
- for m in dir(self):
- if m.startswith('test'):
- t = getattr(self, m)
- if isinstance(t, Suite):
- self.add_test((m + '.', t))
- else:
- self.add_test(TestCase(m, self, getattr(self, m)))
-
- def add_test(self, test: Union[TestCase,
- Tuple[str, Callable[[], None]],
- Tuple[str, 'Suite']]) -> None:
- self._test_cases.append(test)
-
- def cases(self) -> List[Any]:
- return self._test_cases[:]
-
- def skip(self) -> None:
- raise SkipTestCaseException()
-
-
-def add_suites_from_module(suites: List[Suite], mod_name: str) -> None:
- mod = importlib.import_module(mod_name)
- got_suite = False
- for suite in mod.__dict__.values():
- if isinstance(suite, type) and issubclass(suite, Suite) and suite is not Suite:
- got_suite = True
- suites.append(cast(Callable[[], Suite], suite)())
- if not got_suite:
- # Sanity check in case e.g. it uses unittest instead of a myunit.
- # The codecs tests do since they need to be python2-compatible.
- sys.exit('Test module %s had no test!' % mod_name)
-
-
-class ListSuite(Suite):
- def __init__(self, suites: List[Suite]) -> None:
- for suite in suites:
- mod_name = type(suite).__module__.replace('.', '_')
- mod_name = mod_name.replace('mypy_', '')
- mod_name = mod_name.replace('test_', '')
- mod_name = mod_name.strip('_').replace('__', '_')
- type_name = type(suite).__name__
- name = 'test_%s_%s' % (mod_name, type_name)
- setattr(self, name, suite)
- super().__init__()
-
-
-def main(args: List[str] = None) -> None:
- global patterns, is_verbose, is_quiet
- if not args:
- args = sys.argv[1:]
- is_verbose = False
- is_quiet = False
- suites = [] # type: List[Suite]
- patterns = []
- i = 0
- while i < len(args):
- a = args[i]
- if a == '-v':
- is_verbose = True
- elif a == '-q':
- is_quiet = True
- elif a == '-m':
- i += 1
- if i == len(args):
- sys.exit('-m requires an argument')
- add_suites_from_module(suites, args[i])
- elif not a.startswith('-'):
- patterns.append(a)
- else:
- sys.exit('Usage: python -m mypy.myunit [-v] [-q]'
- + ' -m mypy.test.module [-m mypy.test.module ...] [filter ...]')
- i += 1
- if len(patterns) == 0:
- patterns.append('*')
- if not suites:
- sys.exit('At least one -m argument is required')
-
- t = ListSuite(suites)
- num_total, num_fail, num_skip = run_test_recursive(t, 0, 0, 0, '', 0)
-
- skip_msg = ''
- if num_skip > 0:
- skip_msg = ', {} skipped'.format(num_skip)
-
- if num_fail == 0:
- if not is_quiet:
- print('%d test cases run%s, all passed.' % (num_total, skip_msg))
- print('*** OK ***')
- else:
- sys.stderr.write('%d/%d test cases failed%s.\n' % (num_fail,
- num_total,
- skip_msg))
- sys.stderr.write('*** FAILURE ***\n')
- sys.exit(1)
-
-
-def run_test_recursive(test: Any, num_total: int, num_fail: int, num_skip: int,
- prefix: str, depth: int) -> Tuple[int, int, int]:
- """The first argument may be TestCase, Suite or (str, Suite)."""
- if isinstance(test, TestCase):
- name = prefix + test.name
- for pattern in patterns:
- if match_pattern(name, pattern):
- match = True
- break
- else:
- match = False
- if match:
- is_fail, is_skip = run_single_test(name, test)
- if is_fail: num_fail += 1
- if is_skip: num_skip += 1
- num_total += 1
- else:
- suite = None # type: Suite
- suite_prefix = ''
- if isinstance(test, list) or isinstance(test, tuple):
- suite = test[1]
- suite_prefix = test[0]
- else:
- suite = test
- suite_prefix = test.prefix
-
- for stest in suite.cases():
- new_prefix = prefix
- if depth > 0:
- new_prefix = prefix + suite_prefix
- num_total, num_fail, num_skip = run_test_recursive(
- stest, num_total, num_fail, num_skip, new_prefix, depth + 1)
- return num_total, num_fail, num_skip
-
-
-def run_single_test(name: str, test: Any) -> Tuple[bool, bool]:
- if is_verbose:
- sys.stderr.write(name)
- sys.stderr.flush()
-
- time0 = time.time()
- test.set_up() # FIX: check exceptions
- exc_traceback = None # type: Any
- try:
- test.run()
- except BaseException as e:
- if isinstance(e, KeyboardInterrupt):
- raise
- exc_type, exc_value, exc_traceback = sys.exc_info()
- test.tear_down() # FIX: check exceptions
- times.append((time.time() - time0, name))
-
- if exc_traceback:
- if isinstance(exc_value, SkipTestCaseException):
- if is_verbose:
- sys.stderr.write(' (skipped)\n')
- return False, True
- else:
- handle_failure(name, exc_type, exc_value, exc_traceback)
- return True, False
- elif is_verbose:
- sys.stderr.write('\n')
-
- return False, False
-
-
-def handle_failure(name: str,
- exc_type: type,
- exc_value: BaseException,
- exc_traceback: TracebackType,
- ) -> None:
- # Report failed test case.
- if is_verbose:
- sys.stderr.write('\n\n')
- msg = ''
- if exc_value.args and exc_value.args[0]:
- msg = ': ' + str(exc_value)
- else:
- msg = ''
- if not isinstance(exc_value, SystemExit):
- # We assume that before doing exit() (which raises SystemExit) we've printed
- # enough context about what happened so that a stack trace is not useful.
- # In particular, uncaught exceptions during semantic analysis or type checking
- # call exit() and they already print out a stack trace.
- sys.stderr.write('Traceback (most recent call last):\n')
- tb = traceback.format_tb(exc_traceback)
- tb = clean_traceback(tb)
- for s in tb:
- sys.stderr.write(s)
- else:
- sys.stderr.write('\n')
- exception = typename(exc_type)
- sys.stderr.write('{}{}\n\n'.format(exception, msg))
- sys.stderr.write('{} failed\n\n'.format(name))
-
-
-def typename(t: type) -> str:
- if '.' in str(t):
- return str(t).split('.')[-1].rstrip("'>")
- else:
- return str(t)[8:-2]
-
-
-def match_pattern(s: str, p: str) -> bool:
- if len(p) == 0:
- return len(s) == 0
- elif p[0] == '*':
- if len(p) == 1:
- return True
- else:
- for i in range(len(s) + 1):
- if match_pattern(s[i:], p[1:]):
- return True
- return False
- elif len(s) == 0:
- return False
- else:
- return s[0] == p[0] and match_pattern(s[1:], p[1:])
-
-
-def clean_traceback(tb: List[str]) -> List[str]:
- # Remove clutter from the traceback.
- start = 0
- for i, s in enumerate(tb):
- if '\n test.run()\n' in s or '\n self.func()\n' in s:
- start = i + 1
- tb = tb[start:]
- for f in ['assert_equal', 'assert_not_equal', 'assert_type',
- 'assert_raises', 'assert_true']:
- if tb != [] and ', in {}\n'.format(f) in tb[-1]:
- tb = tb[:-1]
- return tb
diff --git a/mypy/myunit/__main__.py b/mypy/myunit/__main__.py
deleted file mode 100644
index 78ef01f..0000000
--- a/mypy/myunit/__main__.py
+++ /dev/null
@@ -1,18 +0,0 @@
-# This is a separate module from mypy.myunit so it doesn't exist twice.
-"""Myunit test runner command line tool.
-
-Usually used as a slave by runtests.py, but can be used directly.
-"""
-
-from mypy.myunit import main
-
-# In Python 3.3, mypy.__path__ contains a relative path to the mypy module
-# (whereas in later Python versions it contains an absolute path). Because the
-# test runner changes directories, this breaks non-toplevel mypy imports. We
-# fix that problem by fixing up the path to be absolute here.
-import os.path
-import mypy
-# User-defined packages always have __path__ attributes, but mypy doesn't know that.
-mypy.__path__ = [os.path.abspath(p) for p in mypy.__path__] # type: ignore
-
-main()
diff --git a/mypy/test/config.py b/mypy/test/config.py
deleted file mode 100644
index 681f866..0000000
--- a/mypy/test/config.py
+++ /dev/null
@@ -1,19 +0,0 @@
-import os
-import os.path
-
-import typing
-
-
-this_file_dir = os.path.dirname(os.path.realpath(__file__))
-PREFIX = os.path.dirname(os.path.dirname(this_file_dir))
-
-# Location of test data files such as test case descriptions.
-test_data_prefix = os.path.join(PREFIX, 'test-data', 'unit')
-
-assert os.path.isdir(test_data_prefix), \
- 'Test data prefix ({}) not set correctly'.format(test_data_prefix)
-
-# Temp directory used for the temp files created when running test cases.
-# This is *within* the tempfile.TemporaryDirectory that is chroot'ed per testcase.
-# It is also hard-coded in numerous places, so don't change it.
-test_temp_dir = 'tmp'
diff --git a/mypy/test/data.py b/mypy/test/data.py
deleted file mode 100644
index e1b6133..0000000
--- a/mypy/test/data.py
+++ /dev/null
@@ -1,468 +0,0 @@
-"""Utilities for processing .test files containing test case descriptions."""
-
-import os.path
-import os
-import re
-from os import remove, rmdir
-import shutil
-
-import pytest # type: ignore # no pytest in typeshed
-from typing import Callable, List, Tuple, Set, Optional
-
-from mypy.myunit import TestCase, SkipTestCaseException
-
-
-def parse_test_cases(
- path: str,
- perform: Optional[Callable[['DataDrivenTestCase'], None]],
- base_path: str = '.',
- optional_out: bool = False,
- include_path: str = None,
- native_sep: bool = False) -> List['DataDrivenTestCase']:
- """Parse a file with test case descriptions.
-
- Return an array of test cases.
-
- NB this function and DataDrivenTestCase are shared between the
- myunit and pytest codepaths -- if something looks redundant,
- that's likely the reason.
- """
-
- if not include_path:
- include_path = os.path.dirname(path)
- with open(path, encoding='utf-8') as f:
- l = f.readlines()
- for i in range(len(l)):
- l[i] = l[i].rstrip('\n')
- p = parse_test_data(l, path)
- out = [] # type: List[DataDrivenTestCase]
-
- # Process the parsed items. Each item has a header of form [id args],
- # optionally followed by lines of text.
- i = 0
- while i < len(p):
- ok = False
- i0 = i
- if p[i].id == 'case':
- i += 1
-
- files = [] # type: List[Tuple[str, str]] # path and contents
- output_files = [] # type: List[Tuple[str, str]] # path and contents for output files
- tcout = [] # type: List[str] # Regular output errors
- tcout2 = [] # type: List[str] # Output errors for incremental, second run
- stale_modules = None # type: Optional[Set[str]] # module names
- rechecked_modules = None # type: Optional[Set[str]] # module names
- while i < len(p) and p[i].id != 'case':
- if p[i].id == 'file' or p[i].id == 'outfile':
- # Record an extra file needed for the test case.
- arg = p[i].arg
- assert arg is not None
- file_entry = (os.path.join(base_path, arg), '\n'.join(p[i].data))
- if p[i].id == 'file':
- files.append(file_entry)
- elif p[i].id == 'outfile':
- output_files.append(file_entry)
- elif p[i].id in ('builtins', 'builtins_py2'):
- # Use a custom source file for the std module.
- arg = p[i].arg
- assert arg is not None
- mpath = os.path.join(os.path.dirname(path), arg)
- if p[i].id == 'builtins':
- fnam = 'builtins.pyi'
- else:
- # Python 2
- fnam = '__builtin__.pyi'
- with open(mpath) as f:
- files.append((os.path.join(base_path, fnam), f.read()))
- elif p[i].id == 'stale':
- arg = p[i].arg
- if arg is None:
- stale_modules = set()
- else:
- stale_modules = {item.strip() for item in arg.split(',')}
- elif p[i].id == 'rechecked':
- arg = p[i].arg
- if arg is None:
- rechecked_modules = set()
- else:
- rechecked_modules = {item.strip() for item in arg.split(',')}
- elif p[i].id == 'out' or p[i].id == 'out1':
- tcout = p[i].data
- if native_sep and os.path.sep == '\\':
- tcout = [fix_win_path(line) for line in tcout]
- ok = True
- elif p[i].id == 'out2':
- tcout2 = p[i].data
- if native_sep and os.path.sep == '\\':
- tcout2 = [fix_win_path(line) for line in tcout2]
- ok = True
- else:
- raise ValueError(
- 'Invalid section header {} in {} at line {}'.format(
- p[i].id, path, p[i].line))
- i += 1
-
- if rechecked_modules is None:
- # If the set of rechecked modules isn't specified, make it the same as the set of
- # modules with a stale public interface.
- rechecked_modules = stale_modules
- if (stale_modules is not None
- and rechecked_modules is not None
- and not stale_modules.issubset(rechecked_modules)):
- raise ValueError(
- 'Stale modules must be a subset of rechecked modules ({})'.format(path))
-
- if optional_out:
- ok = True
-
- if ok:
- input = expand_includes(p[i0].data, include_path)
- expand_errors(input, tcout, 'main')
- lastline = p[i].line if i < len(p) else p[i - 1].line + 9999
- tc = DataDrivenTestCase(p[i0].arg, input, tcout, tcout2, path,
- p[i0].line, lastline, perform,
- files, output_files, stale_modules,
- rechecked_modules)
- out.append(tc)
- if not ok:
- raise ValueError(
- '{}, line {}: Error in test case description'.format(
- path, p[i0].line))
-
- return out
-
-
-class DataDrivenTestCase(TestCase):
- input = None # type: List[str]
- output = None # type: List[str]
-
- file = ''
- line = 0
-
- perform = None # type: Callable[['DataDrivenTestCase'], None]
-
- # (file path, file content) tuples
- files = None # type: List[Tuple[str, str]]
- expected_stale_modules = None # type: Optional[Set[str]]
-
- clean_up = None # type: List[Tuple[bool, str]]
-
- def __init__(self, name, input, output, output2, file, line, lastline,
- perform, files, output_files, expected_stale_modules, expected_rechecked_modules):
- super().__init__(name)
- self.input = input
- self.output = output
- self.output2 = output2
- self.lastline = lastline
- self.file = file
- self.line = line
- self.perform = perform
- self.files = files
- self.output_files = output_files
- self.expected_stale_modules = expected_stale_modules
- self.expected_rechecked_modules = expected_rechecked_modules
-
- def set_up(self) -> None:
- super().set_up()
- encountered_files = set()
- self.clean_up = []
- for path, content in self.files:
- dir = os.path.dirname(path)
- for d in self.add_dirs(dir):
- self.clean_up.append((True, d))
- with open(path, 'w') as f:
- f.write(content)
- self.clean_up.append((False, path))
- encountered_files.add(path)
- if path.endswith(".next"):
- # Make sure new files introduced in the second run are accounted for
- renamed_path = path[:-5]
- if renamed_path not in encountered_files:
- encountered_files.add(renamed_path)
- self.clean_up.append((False, renamed_path))
- for path, _ in self.output_files:
- # Create directories for expected output and mark them to be cleaned up at the end
- # of the test case.
- dir = os.path.dirname(path)
- for d in self.add_dirs(dir):
- self.clean_up.append((True, d))
- self.clean_up.append((False, path))
-
- def add_dirs(self, dir: str) -> List[str]:
- """Add all subdirectories required to create dir.
-
- Return an array of the created directories in the order of creation.
- """
- if dir == '' or os.path.isdir(dir):
- return []
- else:
- dirs = self.add_dirs(os.path.dirname(dir)) + [dir]
- os.mkdir(dir)
- return dirs
-
- def run(self):
- if self.name.endswith('-skip'):
- raise SkipTestCaseException()
- else:
- self.perform(self)
-
- def tear_down(self) -> None:
- # First remove files.
- for is_dir, path in reversed(self.clean_up):
- if not is_dir:
- remove(path)
- # Then remove directories.
- for is_dir, path in reversed(self.clean_up):
- if is_dir:
- pycache = os.path.join(path, '__pycache__')
- if os.path.isdir(pycache):
- shutil.rmtree(pycache)
- try:
- rmdir(path)
- except OSError as error:
- print(' ** Error removing directory %s -- contents:' % path)
- for item in os.listdir(path):
- print(' ', item)
- # Most likely, there are some files in the
- # directory. Use rmtree to nuke the directory, but
- # fail the test case anyway, since this seems like
- # a bug in a test case -- we shouldn't leave
- # garbage lying around. By nuking the directory,
- # the next test run hopefully passes.
- path = error.filename
- # Be defensive -- only call rmtree if we're sure we aren't removing anything
- # valuable.
- if path.startswith('tmp/') and os.path.isdir(path):
- shutil.rmtree(path)
- raise
- super().tear_down()
-
-
-class TestItem:
- """Parsed test caseitem.
-
- An item is of the form
- [id arg]
- .. data ..
- """
-
- id = ''
- arg = '' # type: Optional[str]
-
- # Text data, array of 8-bit strings
- data = None # type: List[str]
-
- file = ''
- line = 0 # Line number in file
-
- def __init__(self, id: str, arg: Optional[str], data: List[str], file: str,
- line: int) -> None:
- self.id = id
- self.arg = arg
- self.data = data
- self.file = file
- self.line = line
-
-
-def parse_test_data(l: List[str], fnam: str) -> List[TestItem]:
- """Parse a list of lines that represent a sequence of test items."""
-
- ret = [] # type: List[TestItem]
- data = [] # type: List[str]
-
- id = None # type: Optional[str]
- arg = None # type: Optional[str]
-
- i = 0
- i0 = 0
- while i < len(l):
- s = l[i].strip()
-
- if l[i].startswith('[') and s.endswith(']') and not s.startswith('[['):
- if id:
- data = collapse_line_continuation(data)
- data = strip_list(data)
- ret.append(TestItem(id, arg, strip_list(data), fnam, i0 + 1))
- i0 = i
- id = s[1:-1]
- arg = None
- if ' ' in id:
- arg = id[id.index(' ') + 1:]
- id = id[:id.index(' ')]
- data = []
- elif l[i].startswith('[['):
- data.append(l[i][1:])
- elif not l[i].startswith('--'):
- data.append(l[i])
- elif l[i].startswith('----'):
- data.append(l[i][2:])
- i += 1
-
- # Process the last item.
- if id:
- data = collapse_line_continuation(data)
- data = strip_list(data)
- ret.append(TestItem(id, arg, data, fnam, i0 + 1))
-
- return ret
-
-
-def strip_list(l: List[str]) -> List[str]:
- """Return a stripped copy of l.
-
- Strip whitespace at the end of all lines, and strip all empty
- lines from the end of the array.
- """
-
- r = [] # type: List[str]
- for s in l:
- # Strip spaces at end of line
- r.append(re.sub(r'\s+$', '', s))
-
- while len(r) > 0 and r[-1] == '':
- r.pop()
-
- return r
-
-
-def collapse_line_continuation(l: List[str]) -> List[str]:
- r = [] # type: List[str]
- cont = False
- for s in l:
- ss = re.sub(r'\\$', '', s)
- if cont:
- r[-1] += re.sub('^ +', '', ss)
- else:
- r.append(ss)
- cont = s.endswith('\\')
- return r
-
-
-def expand_includes(a: List[str], base_path: str) -> List[str]:
- """Expand @includes within a list of lines.
-
- Replace all lies starting with @include with the contents of the
- file name following the prefix. Look for the files in base_path.
- """
-
- res = [] # type: List[str]
- for s in a:
- if s.startswith('@include '):
- fn = s.split(' ', 1)[1].strip()
- with open(os.path.join(base_path, fn)) as f:
- res.extend(f.readlines())
- else:
- res.append(s)
- return res
-
-
-def expand_errors(input: List[str], output: List[str], fnam: str) -> None:
- """Transform comments such as '# E: message' or
- '# E:3: message' in input.
-
- The result is lines like 'fnam:line: error: message'.
- """
-
- for i in range(len(input)):
- # The first in the split things isn't a comment
- for possible_err_comment in input[i].split('#')[1:]:
- m = re.search(
- '^([EN]):((?P<col>\d+):)? (?P<message>.*)$',
- possible_err_comment.strip())
- if m:
- severity = 'error' if m.group(1) == 'E' else 'note'
- col = m.group('col')
- if col is None:
- output.append(
- '{}:{}: {}: {}'.format(fnam, i + 1, severity, m.group('message')))
- else:
- output.append('{}:{}:{}: {}: {}'.format(
- fnam, i + 1, col, severity, m.group('message')))
-
-
-def fix_win_path(line: str) -> str:
- r"""Changes paths to Windows paths in error messages.
-
- E.g. foo/bar.py -> foo\bar.py.
- """
- m = re.match(r'^([\S/]+):(\d+:)?(\s+.*)', line)
- if not m:
- return line
- else:
- filename, lineno, message = m.groups()
- return '{}:{}{}'.format(filename.replace('/', '\\'),
- lineno or '', message)
-
-
-##
-#
-# pytest setup
-#
-##
-
-
-def pytest_addoption(parser):
- group = parser.getgroup('mypy')
- group.addoption('--update-data', action='store_true', default=False,
- help='Update test data to reflect actual output'
- ' (supported only for certain tests)')
-
-
-def pytest_pycollect_makeitem(collector, name, obj):
- if not isinstance(obj, type) or not issubclass(obj, DataSuite):
- return None
- return MypyDataSuite(name, parent=collector)
-
-
-class MypyDataSuite(pytest.Class):
- def collect(self):
- for case in self.obj.cases():
- yield MypyDataCase(case.name, self, case)
-
-
-class MypyDataCase(pytest.Item):
- def __init__(self, name: str, parent: MypyDataSuite, obj: DataDrivenTestCase) -> None:
- self.skip = False
- if name.endswith('-skip'):
- self.skip = True
- name = name[:-len('-skip')]
-
- super().__init__(name, parent)
- self.obj = obj
-
- def runtest(self):
- if self.skip:
- pytest.skip()
- update_data = self.config.getoption('--update-data', False)
- self.parent.obj(update_data=update_data).run_case(self.obj)
-
- def setup(self):
- self.obj.set_up()
-
- def teardown(self):
- self.obj.tear_down()
-
- def reportinfo(self):
- return self.obj.file, self.obj.line, self.obj.name
-
- def repr_failure(self, excinfo):
- if excinfo.errisinstance(SystemExit):
- # We assume that before doing exit() (which raises SystemExit) we've printed
- # enough context about what happened so that a stack trace is not useful.
- # In particular, uncaught exceptions during semantic analysis or type checking
- # call exit() and they already print out a stack trace.
- excrepr = excinfo.exconly()
- else:
- self.parent._prunetraceback(excinfo)
- excrepr = excinfo.getrepr(style='short')
-
- return "data: {}:{}:\n{}".format(self.obj.file, self.obj.line, excrepr)
-
-
-class DataSuite:
- @classmethod
- def cases(cls) -> List[DataDrivenTestCase]:
- return []
-
- def run_case(self, testcase: DataDrivenTestCase) -> None:
- raise NotImplementedError
diff --git a/mypy/test/helpers.py b/mypy/test/helpers.py
deleted file mode 100644
index 32d889b..0000000
--- a/mypy/test/helpers.py
+++ /dev/null
@@ -1,285 +0,0 @@
-import sys
-import re
-import os
-
-from typing import List, Dict, Tuple
-
-from mypy import defaults
-from mypy.myunit import AssertionFailure
-from mypy.test.data import DataDrivenTestCase
-
-
-# AssertStringArraysEqual displays special line alignment helper messages if
-# the first different line has at least this many characters,
-MIN_LINE_LENGTH_FOR_ALIGNMENT = 5
-
-
-def assert_string_arrays_equal(expected: List[str], actual: List[str],
- msg: str) -> None:
- """Assert that two string arrays are equal.
-
- Display any differences in a human-readable form.
- """
-
- actual = clean_up(actual)
-
- if actual != expected:
- num_skip_start = num_skipped_prefix_lines(expected, actual)
- num_skip_end = num_skipped_suffix_lines(expected, actual)
-
- sys.stderr.write('Expected:\n')
-
- # If omit some lines at the beginning, indicate it by displaying a line
- # with '...'.
- if num_skip_start > 0:
- sys.stderr.write(' ...\n')
-
- # Keep track of the first different line.
- first_diff = -1
-
- # Display only this many first characters of identical lines.
- width = 75
-
- for i in range(num_skip_start, len(expected) - num_skip_end):
- if i >= len(actual) or expected[i] != actual[i]:
- if first_diff < 0:
- first_diff = i
- sys.stderr.write(' {:<45} (diff)'.format(expected[i]))
- else:
- e = expected[i]
- sys.stderr.write(' ' + e[:width])
- if len(e) > width:
- sys.stderr.write('...')
- sys.stderr.write('\n')
- if num_skip_end > 0:
- sys.stderr.write(' ...\n')
-
- sys.stderr.write('Actual:\n')
-
- if num_skip_start > 0:
- sys.stderr.write(' ...\n')
-
- for j in range(num_skip_start, len(actual) - num_skip_end):
- if j >= len(expected) or expected[j] != actual[j]:
- sys.stderr.write(' {:<45} (diff)'.format(actual[j]))
- else:
- a = actual[j]
- sys.stderr.write(' ' + a[:width])
- if len(a) > width:
- sys.stderr.write('...')
- sys.stderr.write('\n')
- if actual == []:
- sys.stderr.write(' (empty)\n')
- if num_skip_end > 0:
- sys.stderr.write(' ...\n')
-
- sys.stderr.write('\n')
-
- if first_diff >= 0 and first_diff < len(actual) and (
- len(expected[first_diff]) >= MIN_LINE_LENGTH_FOR_ALIGNMENT
- or len(actual[first_diff]) >= MIN_LINE_LENGTH_FOR_ALIGNMENT):
- # Display message that helps visualize the differences between two
- # long lines.
- show_align_message(expected[first_diff], actual[first_diff])
-
- raise AssertionFailure(msg)
-
-
-def update_testcase_output(testcase: DataDrivenTestCase, output: List[str]) -> None:
- testcase_path = os.path.join(testcase.old_cwd, testcase.file)
- with open(testcase_path) as f:
- data_lines = f.read().splitlines()
- test = '\n'.join(data_lines[testcase.line:testcase.lastline])
-
- mapping = {} # type: Dict[str, List[str]]
- for old, new in zip(testcase.output, output):
- PREFIX = 'error:'
- ind = old.find(PREFIX)
- if ind != -1 and old[:ind] == new[:ind]:
- old, new = old[ind + len(PREFIX):], new[ind + len(PREFIX):]
- mapping.setdefault(old, []).append(new)
-
- for old in mapping:
- if test.count(old) == len(mapping[old]):
- betweens = test.split(old)
-
- # Interleave betweens and mapping[old]
- from itertools import chain
- interleaved = [betweens[0]] + \
- list(chain.from_iterable(zip(mapping[old], betweens[1:])))
- test = ''.join(interleaved)
-
- data_lines[testcase.line:testcase.lastline] = [test]
- data = '\n'.join(data_lines)
- with open(testcase_path, 'w') as f:
- print(data, file=f)
-
-
-def show_align_message(s1: str, s2: str) -> None:
- """Align s1 and s2 so that the their first difference is highlighted.
-
- For example, if s1 is 'foobar' and s2 is 'fobar', display the
- following lines:
-
- E: foobar
- A: fobar
- ^
-
- If s1 and s2 are long, only display a fragment of the strings around the
- first difference. If s1 is very short, do nothing.
- """
-
- # Seeing what went wrong is trivial even without alignment if the expected
- # string is very short. In this case do nothing to simplify output.
- if len(s1) < 4:
- return
-
- maxw = 72 # Maximum number of characters shown
-
- sys.stderr.write('Alignment of first line difference:\n')
-
- trunc = False
- while s1[:30] == s2[:30]:
- s1 = s1[10:]
- s2 = s2[10:]
- trunc = True
-
- if trunc:
- s1 = '...' + s1
- s2 = '...' + s2
-
- max_len = max(len(s1), len(s2))
- extra = ''
- if max_len > maxw:
- extra = '...'
-
- # Write a chunk of both lines, aligned.
- sys.stderr.write(' E: {}{}\n'.format(s1[:maxw], extra))
- sys.stderr.write(' A: {}{}\n'.format(s2[:maxw], extra))
- # Write an indicator character under the different columns.
- sys.stderr.write(' ')
- for j in range(min(maxw, max(len(s1), len(s2)))):
- if s1[j:j + 1] != s2[j:j + 1]:
- sys.stderr.write('^') # Difference
- break
- else:
- sys.stderr.write(' ') # Equal
- sys.stderr.write('\n')
-
-
-def assert_string_arrays_equal_wildcards(expected: List[str],
- actual: List[str],
- msg: str) -> None:
- # Like above, but let a line with only '...' in expected match any number
- # of lines in actual.
- actual = clean_up(actual)
-
- while actual != [] and actual[-1] == '':
- actual = actual[:-1]
-
- # Expand "..." wildcards away.
- expected = match_array(expected, actual)
- assert_string_arrays_equal(expected, actual, msg)
-
-
-def clean_up(a: List[str]) -> List[str]:
- """Remove common directory prefix from all strings in a.
-
- This uses a naive string replace; it seems to work well enough. Also
- remove trailing carriage returns.
- """
- res = []
- for s in a:
- prefix = os.sep
- ss = s
- for p in prefix, prefix.replace(os.sep, '/'):
- if p != '/' and p != '//' and p != '\\' and p != '\\\\':
- ss = ss.replace(p, '')
- # Ignore spaces at end of line.
- ss = re.sub(' +$', '', ss)
- res.append(re.sub('\\r$', '', ss))
- return res
-
-
-def match_array(pattern: List[str], target: List[str]) -> List[str]:
- """Expand '...' wildcards in pattern by matching against target."""
-
- res = [] # type: List[str]
- i = 0
- j = 0
-
- while i < len(pattern):
- if pattern[i] == '...':
- # Wildcard in pattern.
- if i + 1 == len(pattern):
- # Wildcard at end of pattern; match the rest of target.
- res.extend(target[j:])
- # Finished.
- break
- else:
- # Must find the instance of the next pattern line in target.
- jj = j
- while jj < len(target):
- if target[jj] == pattern[i + 1]:
- break
- jj += 1
- if jj == len(target):
- # No match. Get out.
- res.extend(pattern[i:])
- break
- res.extend(target[j:jj])
- i += 1
- j = jj
- elif (j < len(target) and (pattern[i] == target[j]
- or (i + 1 < len(pattern)
- and j + 1 < len(target)
- and pattern[i + 1] == target[j + 1]))):
- # In sync; advance one line. The above condition keeps sync also if
- # only a single line is different, but loses it if two consecutive
- # lines fail to match.
- res.append(pattern[i])
- i += 1
- j += 1
- else:
- # Out of sync. Get out.
- res.extend(pattern[i:])
- break
- return res
-
-
-def num_skipped_prefix_lines(a1: List[str], a2: List[str]) -> int:
- num_eq = 0
- while num_eq < min(len(a1), len(a2)) and a1[num_eq] == a2[num_eq]:
- num_eq += 1
- return max(0, num_eq - 4)
-
-
-def num_skipped_suffix_lines(a1: List[str], a2: List[str]) -> int:
- num_eq = 0
- while (num_eq < min(len(a1), len(a2))
- and a1[-num_eq - 1] == a2[-num_eq - 1]):
- num_eq += 1
- return max(0, num_eq - 4)
-
-
-def testfile_pyversion(path: str) -> Tuple[int, int]:
- if path.endswith('python2.test'):
- return defaults.PYTHON2_VERSION
- else:
- return defaults.PYTHON3_VERSION
-
-
-def testcase_pyversion(path: str, testcase_name: str) -> Tuple[int, int]:
- if testcase_name.endswith('python2'):
- return defaults.PYTHON2_VERSION
- else:
- return testfile_pyversion(path)
-
-
-def normalize_error_messages(messages: List[str]) -> List[str]:
- """Translate an array of error messages to use / as path separator."""
-
- a = []
- for m in messages:
- a.append(m.replace(os.sep, '/'))
- return a
diff --git a/mypy/test/testargs.py b/mypy/test/testargs.py
deleted file mode 100644
index 4e27e37..0000000
--- a/mypy/test/testargs.py
+++ /dev/null
@@ -1,18 +0,0 @@
-"""Ensure the argparse parser and Options class are in sync.
-
-In particular, verify that the argparse defaults are the same as the Options
-defaults, and that argparse doesn't assign any new members to the Options
-object it creates.
-"""
-
-import typing
-from mypy.myunit import Suite, assert_equal
-from mypy.options import Options, BuildType
-from mypy.main import process_options
-
-
-class ArgSuite(Suite):
- def test_coherence(self) -> None:
- options = Options()
- _, parsed_options = process_options([], require_targets=False)
- assert_equal(options, parsed_options)
diff --git a/mypy/test/testcheck.py b/mypy/test/testcheck.py
deleted file mode 100644
index 970e69d..0000000
--- a/mypy/test/testcheck.py
+++ /dev/null
@@ -1,332 +0,0 @@
-"""Type checker test cases"""
-
-import os.path
-import re
-import shutil
-import sys
-import time
-import typed_ast
-import typed_ast.ast35
-
-from typing import Dict, List, Optional, Set, Tuple
-
-from mypy import build, defaults
-from mypy.main import parse_version, process_options
-from mypy.build import BuildSource, find_module_clear_caches
-from mypy.myunit import AssertionFailure
-from mypy.test.config import test_temp_dir, test_data_prefix
-from mypy.test.data import parse_test_cases, DataDrivenTestCase, DataSuite
-from mypy.test.helpers import (
- assert_string_arrays_equal, normalize_error_messages,
- testcase_pyversion, update_testcase_output,
-)
-from mypy.errors import CompileError
-from mypy.options import Options
-
-from mypy import experiments
-
-# List of files that contain test case descriptions.
-files = [
- 'check-columns.test',
- 'check-expressions.test',
- 'check-functions.test',
- 'check-generic-subtyping.test',
- 'check-python2.test',
- 'check-tuples.test',
- 'check-varargs.test',
-]
-fast_parser_files = [
- 'check-basic.test',
- 'check-callable.test',
- 'check-classes.test',
- 'check-statements.test',
- 'check-generics.test',
- 'check-dynamic-typing.test',
- 'check-inference.test',
- 'check-inference-context.test',
- 'check-kwargs.test',
- 'check-overloading.test',
- 'check-type-checks.test',
- 'check-abstract.test',
- 'check-multiple-inheritance.test',
- 'check-super.test',
- 'check-modules.test',
- 'check-typevar-values.test',
- 'check-unsupported.test',
- 'check-unreachable-code.test',
- 'check-unions.test',
- 'check-isinstance.test',
- 'check-lists.test',
- 'check-namedtuple.test',
- 'check-typeddict.test',
- 'check-type-aliases.test',
- 'check-ignore.test',
- 'check-type-promotion.test',
- 'check-semanal-error.test',
- 'check-flags.test',
- 'check-incremental.test',
- 'check-bound.test',
- 'check-optional.test',
- 'check-fastparse.test',
- 'check-warnings.test',
- 'check-async-await.test',
- 'check-newtype.test',
- 'check-class-namedtuple.test',
- 'check-selftype.test',
-]
-
-files.extend(fast_parser_files)
-
-if 'annotation' in typed_ast.ast35.Assign._fields:
- files.append('check-newsyntax.test')
-
-if 'contains_underscores' in typed_ast.ast35.Num._fields:
- files.append('check-underscores.test')
-
-
-class TypeCheckSuite(DataSuite):
- def __init__(self, *, update_data: bool = False) -> None:
- self.update_data = update_data
-
- @classmethod
- def cases(cls) -> List[DataDrivenTestCase]:
- c = [] # type: List[DataDrivenTestCase]
- for f in files:
- c += parse_test_cases(os.path.join(test_data_prefix, f),
- None, test_temp_dir, True)
- return c
-
- def run_case(self, testcase: DataDrivenTestCase) -> None:
- incremental = 'incremental' in testcase.name.lower() or 'incremental' in testcase.file
- optional = 'optional' in testcase.file
- if incremental:
- # Incremental tests are run once with a cold cache, once with a warm cache.
- # Expect success on first run, errors from testcase.output (if any) on second run.
- # We briefly sleep to make sure file timestamps are distinct.
- self.clear_cache()
- self.run_case_once(testcase, 1)
- self.run_case_once(testcase, 2)
- elif optional:
- try:
- experiments.STRICT_OPTIONAL = True
- self.run_case_once(testcase)
- finally:
- experiments.STRICT_OPTIONAL = False
- else:
- try:
- old_strict_optional = experiments.STRICT_OPTIONAL
- self.run_case_once(testcase)
- finally:
- experiments.STRICT_OPTIONAL = old_strict_optional
-
- def clear_cache(self) -> None:
- dn = defaults.CACHE_DIR
-
- if os.path.exists(dn):
- shutil.rmtree(dn)
-
- def run_case_once(self, testcase: DataDrivenTestCase, incremental: int = 0) -> None:
- find_module_clear_caches()
- original_program_text = '\n'.join(testcase.input)
- module_data = self.parse_module(original_program_text, incremental)
-
- if incremental:
- if incremental == 1:
- # In run 1, copy program text to program file.
- for module_name, program_path, program_text in module_data:
- if module_name == '__main__':
- with open(program_path, 'w') as f:
- f.write(program_text)
- break
- elif incremental == 2:
- # In run 2, copy *.next files to * files.
- for dn, dirs, files in os.walk(os.curdir):
- for file in files:
- if file.endswith('.next'):
- full = os.path.join(dn, file)
- target = full[:-5]
- shutil.copy(full, target)
-
- # In some systems, mtime has a resolution of 1 second which can cause
- # annoying-to-debug issues when a file has the same size after a
- # change. We manually set the mtime to circumvent this.
- new_time = os.stat(target).st_mtime + 1
- os.utime(target, times=(new_time, new_time))
-
- # Parse options after moving files (in case mypy.ini is being moved).
- options = self.parse_options(original_program_text, testcase)
- options.use_builtins_fixtures = True
- options.show_traceback = True
- if 'optional' in testcase.file:
- options.strict_optional = True
- if incremental:
- options.incremental = True
- if os.path.split(testcase.file)[1] in fast_parser_files:
- options.fast_parser = True
-
- sources = []
- for module_name, program_path, program_text in module_data:
- # Always set to none so we're forced to reread the module in incremental mode
- sources.append(BuildSource(program_path, module_name,
- None if incremental else program_text))
- res = None
- try:
- res = build.build(sources=sources,
- options=options,
- alt_lib_path=test_temp_dir)
- a = res.errors
- except CompileError as e:
- a = e.messages
- a = normalize_error_messages(a)
-
- # Make sure error messages match
- if incremental == 0:
- msg = 'Invalid type checker output ({}, line {})'
- output = testcase.output
- elif incremental == 1:
- msg = 'Invalid type checker output in incremental, run 1 ({}, line {})'
- output = testcase.output
- elif incremental == 2:
- msg = 'Invalid type checker output in incremental, run 2 ({}, line {})'
- output = testcase.output2
- else:
- raise AssertionError()
-
- if output != a and self.update_data:
- update_testcase_output(testcase, a)
- assert_string_arrays_equal(output, a, msg.format(testcase.file, testcase.line))
-
- if incremental and res:
- if options.follow_imports == 'normal' and testcase.output is None:
- self.verify_cache(module_data, a, res.manager)
- if incremental == 2:
- self.check_module_equivalence(
- 'rechecked',
- testcase.expected_rechecked_modules,
- res.manager.rechecked_modules)
- self.check_module_equivalence(
- 'stale',
- testcase.expected_stale_modules,
- res.manager.stale_modules)
-
- def check_module_equivalence(self, name: str,
- expected: Optional[Set[str]], actual: Set[str]) -> None:
- if expected is not None:
- assert_string_arrays_equal(
- list(sorted(expected)),
- list(sorted(actual.difference({"__main__"}))),
- 'Set of {} modules does not match expected set'.format(name))
-
- def verify_cache(self, module_data: List[Tuple[str, str, str]], a: List[str],
- manager: build.BuildManager) -> None:
- # There should be valid cache metadata for each module except
- # those in error_paths; for those there should not be.
- #
- # NOTE: When A imports B and there's an error in B, the cache
- # data for B is invalidated, but the cache data for A remains.
- # However build.process_graphs() will ignore A's cache data.
- #
- # Also note that when A imports B, and there's an error in A
- # _due to a valid change in B_, the cache data for B will be
- # invalidated and updated, but the old cache data for A will
- # remain unchanged. As before, build.process_graphs() will
- # ignore A's (old) cache data.
- error_paths = self.find_error_paths(a)
- modules = self.find_module_files()
- modules.update({module_name: path for module_name, path, text in module_data})
- missing_paths = self.find_missing_cache_files(modules, manager)
- if not missing_paths.issubset(error_paths):
- raise AssertionFailure("cache data discrepancy %s != %s" %
- (missing_paths, error_paths))
-
- def find_error_paths(self, a: List[str]) -> Set[str]:
- hits = set()
- for line in a:
- m = re.match(r'([^\s:]+):\d+: error:', line)
- if m:
- p = m.group(1).replace('/', os.path.sep)
- hits.add(p)
- return hits
-
- def find_module_files(self) -> Dict[str, str]:
- modules = {}
- for dn, dirs, files in os.walk(test_temp_dir):
- dnparts = dn.split(os.sep)
- assert dnparts[0] == test_temp_dir
- del dnparts[0]
- for file in files:
- if file.endswith('.py'):
- if file == "__init__.py":
- # If the file path is `a/b/__init__.py`, exclude the file name
- # and make sure the module id is just `a.b`, not `a.b.__init__`.
- id = '.'.join(dnparts)
- else:
- base, ext = os.path.splitext(file)
- id = '.'.join(dnparts + [base])
- modules[id] = os.path.join(dn, file)
- return modules
-
- def find_missing_cache_files(self, modules: Dict[str, str],
- manager: build.BuildManager) -> Set[str]:
- missing = {}
- for id, path in modules.items():
- meta = build.find_cache_meta(id, path, manager)
- if not build.is_meta_fresh(meta, id, path, manager):
- missing[id] = path
- return set(missing.values())
-
- def parse_module(self, program_text: str, incremental: int = 0) -> List[Tuple[str, str, str]]:
- """Return the module and program names for a test case.
-
- Normally, the unit tests will parse the default ('__main__')
- module and follow all the imports listed there. You can override
- this behavior and instruct the tests to check multiple modules
- by using a comment like this in the test case input:
-
- # cmd: mypy -m foo.bar foo.baz
-
- Return a list of tuples (module name, file name, program text).
- """
- m = re.search('# cmd: mypy -m ([a-zA-Z0-9_. ]+)$', program_text, flags=re.MULTILINE)
- m2 = re.search('# cmd2: mypy -m ([a-zA-Z0-9_. ]+)$', program_text, flags=re.MULTILINE)
- if m2 is not None and incremental == 2:
- # Optionally return a different command if in the second
- # stage of incremental mode, otherwise default to reusing
- # the original cmd.
- m = m2
-
- if m:
- # The test case wants to use a non-default main
- # module. Look up the module and give it as the thing to
- # analyze.
- module_names = m.group(1)
- out = []
- for module_name in module_names.split(' '):
- path = build.find_module(module_name, [test_temp_dir])
- with open(path) as f:
- program_text = f.read()
- out.append((module_name, path, program_text))
- return out
- else:
- return [('__main__', 'main', program_text)]
-
- def parse_options(self, program_text: str, testcase: DataDrivenTestCase) -> Options:
- options = Options()
- flags = re.search('# flags: (.*)$', program_text, flags=re.MULTILINE)
-
- flag_list = None
- if flags:
- flag_list = flags.group(1).split()
- targets, options = process_options(flag_list, require_targets=False)
- if targets:
- # TODO: support specifying targets via the flags pragma
- raise RuntimeError('Specifying targets via the flags pragma is not supported.')
- else:
- options = Options()
-
- # Allow custom python version to override testcase_pyversion
- if (not flag_list or
- all(flag not in flag_list for flag in ['--python-version', '-2', '--py2'])):
- options.python_version = testcase_pyversion(testcase.file, testcase.name)
-
- return options
diff --git a/mypy/test/testcmdline.py b/mypy/test/testcmdline.py
deleted file mode 100644
index f2ddc9b..0000000
--- a/mypy/test/testcmdline.py
+++ /dev/null
@@ -1,104 +0,0 @@
-"""Test cases for the command line.
-
-To begin we test that "mypy <directory>[/]" always recurses down the
-whole tree.
-"""
-
-import os
-import re
-import subprocess
-import sys
-
-from typing import Tuple, List, Dict, Set
-
-from mypy.myunit import Suite, SkipTestCaseException, AssertionFailure
-from mypy.test.config import test_data_prefix, test_temp_dir
-from mypy.test.data import parse_test_cases, DataDrivenTestCase
-from mypy.test.helpers import assert_string_arrays_equal
-from mypy.version import __version__, base_version
-
-# Path to Python 3 interpreter
-python3_path = sys.executable
-
-# Files containing test case descriptions.
-cmdline_files = ['cmdline.test']
-
-
-class PythonEvaluationSuite(Suite):
-
- def cases(self) -> List[DataDrivenTestCase]:
- c = [] # type: List[DataDrivenTestCase]
- for f in cmdline_files:
- c += parse_test_cases(os.path.join(test_data_prefix, f),
- test_python_evaluation,
- base_path=test_temp_dir,
- optional_out=True,
- native_sep=True)
- return c
-
-
-def test_python_evaluation(testcase: DataDrivenTestCase) -> None:
- # Write the program to a file.
- program = '_program.py'
- program_path = os.path.join(test_temp_dir, program)
- with open(program_path, 'w') as file:
- for s in testcase.input:
- file.write('{}\n'.format(s))
- args = parse_args(testcase.input[0])
- args.append('--show-traceback')
- # Type check the program.
- fixed = [python3_path,
- os.path.join(testcase.old_cwd, 'scripts', 'mypy')]
- process = subprocess.Popen(fixed + args,
- stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT,
- cwd=test_temp_dir)
- outb = process.stdout.read()
- # Split output into lines.
- out = [s.rstrip('\n\r') for s in str(outb, 'utf8').splitlines()]
- # Remove temp file.
- os.remove(program_path)
- # Compare actual output to expected.
- if testcase.output_files:
- for path, expected_content in testcase.output_files:
- if not os.path.exists(path):
- raise AssertionFailure(
- 'Expected file {} was not produced by test case'.format(path))
- with open(path, 'r') as output_file:
- actual_output_content = output_file.read().splitlines()
- noramlized_output = normalize_file_output(actual_output_content,
- os.path.abspath(test_temp_dir))
- assert_string_arrays_equal(expected_content.splitlines(), noramlized_output,
- 'Output file {} did not match its expected output'.format(
- path))
- else:
- assert_string_arrays_equal(testcase.output, out,
- 'Invalid output ({}, line {})'.format(
- testcase.file, testcase.line))
-
-
-def parse_args(line: str) -> List[str]:
- """Parse the first line of the program for the command line.
-
- This should have the form
-
- # cmd: mypy <options>
-
- For example:
-
- # cmd: mypy pkg/
- """
- m = re.match('# cmd: mypy (.*)$', line)
- if not m:
- return [] # No args; mypy will spit out an error.
- return m.group(1).split()
-
-
-def normalize_file_output(content: List[str], current_abs_path: str) -> List[str]:
- """Normalize file output for comparison."""
- timestamp_regex = re.compile('\d{10}')
- result = [x.replace(current_abs_path, '$PWD') for x in content]
- result = [x.replace(__version__, '$VERSION') for x in result]
- result = [x.replace(base_version, '$VERSION') for x in result]
- result = [timestamp_regex.sub('$TIMESTAMP', x) for x in result]
- return result
diff --git a/mypy/test/testextensions.py b/mypy/test/testextensions.py
deleted file mode 100644
index af3916f..0000000
--- a/mypy/test/testextensions.py
+++ /dev/null
@@ -1,125 +0,0 @@
-import sys
-import pickle
-import typing
-try:
- import collections.abc as collections_abc
-except ImportError:
- import collections as collections_abc # type: ignore # PY32 and earlier
-from unittest import TestCase, main, skipUnless
-sys.path[0:0] = ['extensions']
-from mypy_extensions import TypedDict
-
-
-class BaseTestCase(TestCase):
-
- def assertIsSubclass(self, cls, class_or_tuple, msg=None):
- if not issubclass(cls, class_or_tuple):
- message = '%r is not a subclass of %r' % (cls, class_or_tuple)
- if msg is not None:
- message += ' : %s' % msg
- raise self.failureException(message)
-
- def assertNotIsSubclass(self, cls, class_or_tuple, msg=None):
- if issubclass(cls, class_or_tuple):
- message = '%r is a subclass of %r' % (cls, class_or_tuple)
- if msg is not None:
- message += ' : %s' % msg
- raise self.failureException(message)
-
-
-PY36 = sys.version_info[:2] >= (3, 6)
-
-PY36_TESTS = """
-Label = TypedDict('Label', [('label', str)])
-
-class Point2D(TypedDict):
- x: int
- y: int
-
-class LabelPoint2D(Point2D, Label): ...
-"""
-
-if PY36:
- exec(PY36_TESTS)
-
-
-class TypedDictTests(BaseTestCase):
-
- def test_basics_iterable_syntax(self):
- Emp = TypedDict('Emp', {'name': str, 'id': int})
- self.assertIsSubclass(Emp, dict)
- self.assertIsSubclass(Emp, typing.MutableMapping)
- self.assertNotIsSubclass(Emp, collections_abc.Sequence)
- jim = Emp(name='Jim', id=1)
- self.assertIs(type(jim), dict)
- self.assertEqual(jim['name'], 'Jim')
- self.assertEqual(jim['id'], 1)
- self.assertEqual(Emp.__name__, 'Emp')
- self.assertEqual(Emp.__module__, 'mypy.test.testextensions')
- self.assertEqual(Emp.__bases__, (dict,))
- self.assertEqual(Emp.__annotations__, {'name': str, 'id': int})
-
- def test_basics_keywords_syntax(self):
- Emp = TypedDict('Emp', name=str, id=int)
- self.assertIsSubclass(Emp, dict)
- self.assertIsSubclass(Emp, typing.MutableMapping)
- self.assertNotIsSubclass(Emp, collections_abc.Sequence)
- jim = Emp(name='Jim', id=1) # type: ignore # mypy doesn't support keyword syntax yet
- self.assertIs(type(jim), dict)
- self.assertEqual(jim['name'], 'Jim')
- self.assertEqual(jim['id'], 1)
- self.assertEqual(Emp.__name__, 'Emp')
- self.assertEqual(Emp.__module__, 'mypy.test.testextensions')
- self.assertEqual(Emp.__bases__, (dict,))
- self.assertEqual(Emp.__annotations__, {'name': str, 'id': int})
-
- def test_typeddict_errors(self):
- Emp = TypedDict('Emp', {'name': str, 'id': int})
- self.assertEqual(TypedDict.__module__, 'mypy_extensions')
- jim = Emp(name='Jim', id=1)
- with self.assertRaises(TypeError):
- isinstance({}, Emp)
- with self.assertRaises(TypeError):
- isinstance(jim, Emp)
- with self.assertRaises(TypeError):
- issubclass(dict, Emp)
- with self.assertRaises(TypeError):
- TypedDict('Hi', x=1)
- with self.assertRaises(TypeError):
- TypedDict('Hi', [('x', int), ('y', 1)])
- with self.assertRaises(TypeError):
- TypedDict('Hi', [('x', int)], y=int)
-
- @skipUnless(PY36, 'Python 3.6 required')
- def test_py36_class_syntax_usage(self):
- self.assertEqual(LabelPoint2D.__annotations__, {'x': int, 'y': int, 'label': str}) # noqa
- self.assertEqual(LabelPoint2D.__bases__, (dict,)) # noqa
- self.assertNotIsSubclass(LabelPoint2D, typing.Sequence) # noqa
- not_origin = Point2D(x=0, y=1) # noqa
- self.assertEqual(not_origin['x'], 0)
- self.assertEqual(not_origin['y'], 1)
- other = LabelPoint2D(x=0, y=1, label='hi') # noqa
- self.assertEqual(other['label'], 'hi')
-
- def test_pickle(self):
- global EmpD # pickle wants to reference the class by name
- EmpD = TypedDict('EmpD', name=str, id=int)
- jane = EmpD({'name': 'jane', 'id': 37})
- for proto in range(pickle.HIGHEST_PROTOCOL + 1):
- z = pickle.dumps(jane, proto)
- jane2 = pickle.loads(z)
- self.assertEqual(jane2, jane)
- self.assertEqual(jane2, {'name': 'jane', 'id': 37})
- ZZ = pickle.dumps(EmpD, proto)
- EmpDnew = pickle.loads(ZZ)
- self.assertEqual(EmpDnew({'name': 'jane', 'id': 37}), jane)
-
- def test_optional(self):
- EmpD = TypedDict('EmpD', name=str, id=int)
-
- self.assertEqual(typing.Optional[EmpD], typing.Union[None, EmpD])
- self.assertNotEqual(typing.List[EmpD], typing.Tuple[EmpD])
-
-
-if __name__ == '__main__':
- main()
diff --git a/mypy/test/testgraph.py b/mypy/test/testgraph.py
deleted file mode 100644
index d88ca1c..0000000
--- a/mypy/test/testgraph.py
+++ /dev/null
@@ -1,69 +0,0 @@
-"""Test cases for graph processing code in build.py."""
-
-from typing import AbstractSet, Dict, Set
-
-from mypy.myunit import Suite, assert_equal
-from mypy.build import BuildManager, State, BuildSourceSet
-from mypy.build import topsort, strongly_connected_components, sorted_components, order_ascc
-from mypy.version import __version__
-from mypy.options import Options
-from mypy.report import Reports
-
-
-class GraphSuite(Suite):
-
- def test_topsort(self) -> None:
- a = frozenset({'A'})
- b = frozenset({'B'})
- c = frozenset({'C'})
- d = frozenset({'D'})
- data = {a: {b, c}, b: {d}, c: {d}} # type: Dict[AbstractSet[str], Set[AbstractSet[str]]]
- res = list(topsort(data))
- assert_equal(res, [{d}, {b, c}, {a}])
-
- def test_scc(self) -> None:
- vertices = {'A', 'B', 'C', 'D'}
- edges = {'A': ['B', 'C'],
- 'B': ['C'],
- 'C': ['B', 'D'],
- 'D': []} # type: Dict[str, List[str]]
- sccs = set(frozenset(x) for x in strongly_connected_components(vertices, edges))
- assert_equal(sccs,
- {frozenset({'A'}),
- frozenset({'B', 'C'}),
- frozenset({'D'})})
-
- def _make_manager(self) -> BuildManager:
- manager = BuildManager(
- data_dir='',
- lib_path=[],
- ignore_prefix='',
- source_set=BuildSourceSet([]),
- reports=Reports('', {}),
- options=Options(),
- version_id=__version__,
- )
- return manager
-
- def test_sorted_components(self) -> None:
- manager = self._make_manager()
- graph = {'a': State('a', None, 'import b, c', manager),
- 'd': State('d', None, 'pass', manager),
- 'b': State('b', None, 'import c', manager),
- 'c': State('c', None, 'import b, d', manager),
- }
- res = sorted_components(graph)
- assert_equal(res, [frozenset({'d'}), frozenset({'c', 'b'}), frozenset({'a'})])
-
- def test_order_ascc(self) -> None:
- manager = self._make_manager()
- graph = {'a': State('a', None, 'import b, c', manager),
- 'd': State('d', None, 'def f(): import a', manager),
- 'b': State('b', None, 'import c', manager),
- 'c': State('c', None, 'import b, d', manager),
- }
- res = sorted_components(graph)
- assert_equal(res, [frozenset({'a', 'd', 'c', 'b'})])
- ascc = res[0]
- scc = order_ascc(graph, ascc)
- assert_equal(scc, ['d', 'c', 'b', 'a'])
diff --git a/mypy/test/testinfer.py b/mypy/test/testinfer.py
deleted file mode 100644
index 2142456..0000000
--- a/mypy/test/testinfer.py
+++ /dev/null
@@ -1,223 +0,0 @@
-"""Test cases for type inference helper functions."""
-
-from typing import List, Optional, Tuple, Union
-
-from mypy.myunit import Suite, assert_equal, assert_true
-from mypy.checkexpr import map_actuals_to_formals
-from mypy.nodes import ARG_POS, ARG_OPT, ARG_STAR, ARG_STAR2, ARG_NAMED
-from mypy.types import AnyType, TupleType, Type
-
-
-class MapActualsToFormalsSuite(Suite):
- """Test cases for checkexpr.map_actuals_to_formals."""
-
- def test_basic(self) -> None:
- self.assert_map([], [], [])
-
- def test_positional_only(self) -> None:
- self.assert_map([ARG_POS],
- [ARG_POS],
- [[0]])
- self.assert_map([ARG_POS, ARG_POS],
- [ARG_POS, ARG_POS],
- [[0], [1]])
-
- def test_optional(self) -> None:
- self.assert_map([],
- [ARG_OPT],
- [[]])
- self.assert_map([ARG_POS],
- [ARG_OPT],
- [[0]])
- self.assert_map([ARG_POS],
- [ARG_OPT, ARG_OPT],
- [[0], []])
-
- def test_callee_star(self) -> None:
- self.assert_map([],
- [ARG_STAR],
- [[]])
- self.assert_map([ARG_POS],
- [ARG_STAR],
- [[0]])
- self.assert_map([ARG_POS, ARG_POS],
- [ARG_STAR],
- [[0, 1]])
-
- def test_caller_star(self) -> None:
- self.assert_map([ARG_STAR],
- [ARG_STAR],
- [[0]])
- self.assert_map([ARG_POS, ARG_STAR],
- [ARG_STAR],
- [[0, 1]])
- self.assert_map([ARG_STAR],
- [ARG_POS, ARG_STAR],
- [[0], [0]])
- self.assert_map([ARG_STAR],
- [ARG_OPT, ARG_STAR],
- [[0], [0]])
-
- def test_too_many_caller_args(self) -> None:
- self.assert_map([ARG_POS],
- [],
- [])
- self.assert_map([ARG_STAR],
- [],
- [])
- self.assert_map([ARG_STAR],
- [ARG_POS],
- [[0]])
-
- def test_tuple_star(self) -> None:
- self.assert_vararg_map(
- [ARG_STAR],
- [ARG_POS],
- [[0]],
- self.tuple(AnyType()))
- self.assert_vararg_map(
- [ARG_STAR],
- [ARG_POS, ARG_POS],
- [[0], [0]],
- self.tuple(AnyType(), AnyType()))
- self.assert_vararg_map(
- [ARG_STAR],
- [ARG_POS, ARG_OPT, ARG_OPT],
- [[0], [0], []],
- self.tuple(AnyType(), AnyType()))
-
- def tuple(self, *args: Type) -> TupleType:
- return TupleType(list(args), None)
-
- def test_named_args(self) -> None:
- self.assert_map(
- ['x'],
- [(ARG_POS, 'x')],
- [[0]])
- self.assert_map(
- ['y', 'x'],
- [(ARG_POS, 'x'), (ARG_POS, 'y')],
- [[1], [0]])
-
- def test_some_named_args(self) -> None:
- self.assert_map(
- ['y'],
- [(ARG_OPT, 'x'), (ARG_OPT, 'y'), (ARG_OPT, 'z')],
- [[], [0], []])
-
- def test_missing_named_arg(self) -> None:
- self.assert_map(
- ['y'],
- [(ARG_OPT, 'x')],
- [[]])
-
- def test_duplicate_named_arg(self) -> None:
- self.assert_map(
- ['x', 'x'],
- [(ARG_OPT, 'x')],
- [[0, 1]])
-
- def test_varargs_and_bare_asterisk(self) -> None:
- self.assert_map(
- [ARG_STAR],
- [ARG_STAR, (ARG_NAMED, 'x')],
- [[0], []])
- self.assert_map(
- [ARG_STAR, 'x'],
- [ARG_STAR, (ARG_NAMED, 'x')],
- [[0], [1]])
-
- def test_keyword_varargs(self) -> None:
- self.assert_map(
- ['x'],
- [ARG_STAR2],
- [[0]])
- self.assert_map(
- ['x', ARG_STAR2],
- [ARG_STAR2],
- [[0, 1]])
- self.assert_map(
- ['x', ARG_STAR2],
- [(ARG_POS, 'x'), ARG_STAR2],
- [[0], [1]])
- self.assert_map(
- [ARG_POS, ARG_STAR2],
- [(ARG_POS, 'x'), ARG_STAR2],
- [[0], [1]])
-
- def test_both_kinds_of_varargs(self) -> None:
- self.assert_map(
- [ARG_STAR, ARG_STAR2],
- [(ARG_POS, 'x'), (ARG_POS, 'y')],
- [[0, 1], [0, 1]])
-
- def test_special_cases(self) -> None:
- self.assert_map([ARG_STAR],
- [ARG_STAR, ARG_STAR2],
- [[0], []])
- self.assert_map([ARG_STAR, ARG_STAR2],
- [ARG_STAR, ARG_STAR2],
- [[0], [1]])
- self.assert_map([ARG_STAR2],
- [(ARG_POS, 'x'), ARG_STAR2],
- [[0], [0]])
- self.assert_map([ARG_STAR2],
- [ARG_STAR2],
- [[0]])
-
- def assert_map(self,
- caller_kinds_: List[Union[int, str]],
- callee_kinds_: List[Union[int, Tuple[int, str]]],
- expected: List[List[int]],
- ) -> None:
- caller_kinds, caller_names = expand_caller_kinds(caller_kinds_)
- callee_kinds, callee_names = expand_callee_kinds(callee_kinds_)
- result = map_actuals_to_formals(
- caller_kinds,
- caller_names,
- callee_kinds,
- callee_names,
- lambda i: AnyType())
- assert_equal(result, expected)
-
- def assert_vararg_map(self,
- caller_kinds: List[int],
- callee_kinds: List[int],
- expected: List[List[int]],
- vararg_type: Type,
- ) -> None:
- result = map_actuals_to_formals(
- caller_kinds,
- [],
- callee_kinds,
- [],
- lambda i: vararg_type)
- assert_equal(result, expected)
-
-
-def expand_caller_kinds(kinds_or_names: List[Union[int, str]]
- ) -> Tuple[List[int], List[Optional[str]]]:
- kinds = []
- names = []
- for k in kinds_or_names:
- if isinstance(k, str):
- kinds.append(ARG_NAMED)
- names.append(k)
- else:
- kinds.append(k)
- names.append(None)
- return kinds, names
-
-
-def expand_callee_kinds(kinds_and_names: List[Union[int, Tuple[int, str]]]
- ) -> Tuple[List[int], List[Optional[str]]]:
- kinds = []
- names = []
- for v in kinds_and_names:
- if isinstance(v, tuple):
- kinds.append(v[0])
- names.append(v[1])
- else:
- kinds.append(v)
- names.append(None)
- return kinds, names
diff --git a/mypy/test/testlex.py b/mypy/test/testlex.py
deleted file mode 100644
index fb857bd..0000000
--- a/mypy/test/testlex.py
+++ /dev/null
@@ -1,466 +0,0 @@
-"""Lexical analyzer test cases"""
-
-import typing
-
-from mypy.myunit import Suite, assert_equal
-from mypy.lex import lex
-
-
-class LexerSuite(Suite):
- def test_empty(self):
- self.assert_lex('', 'Eof()')
-
- def test_keywords(self):
- self.assert_lex(
- 'if else elif def return pass',
- 'Keyword(if) Keyword( else) Keyword( elif) Keyword( def) '
- 'Keyword( return) Keyword( pass) Break() Eof()')
-
- self.assert_lex(
- 'from import as class global',
- 'Keyword(from) Keyword( import) Keyword( as) Keyword( class) '
- 'Keyword( global) ...')
-
- def test_identifiers(self):
- self.assert_lex(
- 'i x FooBar FOO_BAR __x var',
- 'Name(i) Name( x) Name( FooBar) Name( FOO_BAR) Name( __x) '
- 'Name( var) Break() Eof()')
-
- self.assert_lex(
- 'any interface void',
- 'Name(any) Name( interface) Name( void) Break() Eof()')
-
- def test_int_literals(self):
- self.assert_lex(
- '0 00 1 0987654321 10002000300040005000600070008000',
- 'IntLit(0) IntLit( 00) IntLit( 1) LexError( 0987654321) '
- 'IntLit( 10002000300040005000600070008000) Break() Eof()')
-
- def test_hex_int_literals(self):
- self.assert_lex('0x0 0xabcedf0189 0xAFe 0X2',
- 'IntLit(0x0) IntLit( 0xabcedf0189) IntLit( 0xAFe) '
- 'IntLit( 0X2) ...')
-
- def test_oct_int_literals(self):
- self.assert_lex('0o0 0o127 0O1',
- 'IntLit(0o0) IntLit( 0o127) IntLit( 0O1) ...')
-
- def test_bin_int_literals(self):
- self.assert_lex('0b0 0b110 0B1',
- 'IntLit(0b0) IntLit( 0b110) IntLit( 0B1) ...')
-
- def test_float_literals(self):
- self.assert_lex('1.2 .1 1.',
- 'FloatLit(1.2) FloatLit( .1) FloatLit( 1.) ...')
-
- self.assert_lex(
- '1e2 1.2e+3 1.3e-12',
- 'FloatLit(1e2) FloatLit( 1.2e+3) FloatLit( 1.3e-12) ...')
-
- self.assert_lex('1.e2', 'FloatLit(1.e2) ...')
-
- def test_comments(self):
- self.assert_lex('# foo "" bar' + '\n' + 'x #x',
- 'Name(# foo "" bar\\nx) Break( #x) Eof()')
-
- def test_empty_lines(self):
- self.assert_lex(r'\n1', r'IntLit(\n1) ...')
- self.assert_lex(r'\n\n1', r'IntLit(\n\n1) ...')
- self.assert_lex(r'1\n\n2', r'IntLit(1) Break(\n\n) IntLit(2) ...')
-
- def test_line_breaks(self):
- self.assert_lex('1\\r2', 'IntLit(1) Break(\\r) IntLit(2) ...')
- self.assert_lex('1\\r\\n2', 'IntLit(1) Break(\\r\\n) IntLit(2) ...')
-
- def test_operators(self):
- self.assert_lex('- + < > == != <= >= .',
- 'Op(-) Op( +) Op( <) Op( >) Op( ==) Op( !=) Op( <=) '
- 'Op( >=) Op( .) ...')
-
- self.assert_lex('* / % // **',
- 'Op(*) Op( /) Op( %) Op( //) Op( **) ...')
-
- self.assert_lex('& | ^ ~ << >>',
- 'Op(&) Op( |) Op( ^) Op( ~) Op( <<) Op( >>) ...')
-
- self.assert_lex('in is and or not',
- 'Op(in) Op( is) Op( and) Op( or) Op( not) ...')
-
- def test_punctuators(self):
- self.assert_lex(': = ,', 'Colon(:) Punct( =) Punct( ,) ...')
-
- self.assert_lex(
- '+= -= *= %= //=',
- 'Punct(+=) Punct( -=) Punct( *=) Punct( %=) Punct( //=) ...')
- self.assert_lex('**=', 'Punct(**=) ...')
- self.assert_lex(
- '&= |= ^= <<= >>=',
- 'Punct(&=) Punct( |=) Punct( ^=) Punct( <<=) Punct( >>=) ...')
-
- def test_basic_indentation(self):
- self.assert_lex(
- 'y' + '\n' + ' x',
- 'Name(y) Break(\\n) Indent( ) Name(x) Break() Dedent() Eof()')
-
- self.assert_lex(
- 'y' + '\n' + ' x' + '\n' + 'z',
- 'Name(y) Break(\\n) Indent( ) Name(x) Break(\\n) Dedent() '
- 'Name(z) Break() Eof()')
-
- def test_multiple_indent_levels(self):
- self.assert_lex('y' + '\n' +
- ' x' + '\n' +
- ' y' + '\n' +
- ' z',
- 'Name(y) Break(\\n) ' +
- 'Indent( ) Name(x) Break(\\n) ' +
- 'Name( y) Break(\\n) ' +
- 'Indent( ) Name(z) Break() ' +
- 'Dedent() Dedent() Eof()')
-
- self.assert_lex('y' + '\n' +
- ' x' + '\n' +
- ' z' + '\n' +
- ' y',
- 'Name(y) Break(\\n) ' +
- 'Indent( ) Name(x) Break(\\n) ' +
- 'Indent( ) Name(z) Break(\\n) ' +
- 'Dedent() Name( y) Break() ' +
- 'Dedent() Eof()')
-
- def test_tab_indent(self):
- self.assert_lex('y' + '\n' +
- '\t' + 'x' + '\n' +
- ' y' + '\n' +
- ' ' + '\t' + 'z',
- 'Name(y) Break(\\n) ' +
- 'Indent(\\t) Name(x) Break(\\n) ' +
- 'Name( y) Break(\\n) ' +
- 'Name( \\tz) Break() ' +
- 'Dedent() Eof()')
-
- def test_comment_after_dedent(self):
- self.assert_lex('y\n'
- ' x\n'
- '# Foo\n'
- 'z',
- r'Name(y) Break(\n) Indent( ) Name(x) '
- r'Break(\n# Foo\n) '
- r'Dedent() Name(z) Break() Eof()')
-
- def test_parens(self):
- self.assert_lex('( x )', 'Punct(() Name( x) Punct( )) Break() Eof()')
- self.assert_lex(
- '( x' + '\n' + ' y )',
- 'Punct(() Name( x) Name(\\n y) Punct( )) Break() Eof()')
-
- self.assert_lex('()' + '\n' + ' y',
- 'Punct(() Punct()) Break(\\n) Indent( ) Name(y) '
- 'Break() Dedent() Eof()')
-
- # [ ... ] and { ... }.
- self.assert_lex(
- '[ x' + '\n' + ' y ]',
- 'Punct([) Name( x) Name(\\n y) Punct( ]) Break() Eof()')
- self.assert_lex(
- '{ x' + '\n' + ' y }',
- 'Punct({) Name( x) Name(\\n y) Punct( }) Break() Eof()')
-
- # Nested brackets.
- self.assert_lex(
- '({}' + '\n' + ' y)',
- 'Punct(() Punct({) Punct(}) Name(\\n y) Punct()) Break() Eof()')
-
- def test_brackets_and_line_breaks(self):
- # This used to fail.
- self.assert_lex('{}' + '\n' + '1',
- 'Punct({) Punct(}) Break(\\n) IntLit(1) Break() Eof()')
-
- def test_str_literals(self):
- self.assert_lex("'' 'foo_bar'",
- "StrLit('') StrLit( 'foo_bar') Break() Eof()")
- self.assert_lex('"" "foo_bar"',
- 'StrLit("") StrLit( "foo_bar") Break() Eof()')
-
- self.assert_lex('"\\"" 1', 'StrLit("\\"") IntLit( 1) Break() Eof()')
- self.assert_lex("'\\'' 1", "StrLit('\\'') IntLit( 1) Break() Eof()")
-
- self.assert_lex('"\\\\" 1', 'StrLit("\\\\") IntLit( 1) Break() Eof()')
- self.assert_lex("'\\\\' 1", "StrLit('\\\\') IntLit( 1) Break() Eof()")
-
- def test_triple_quoted_string_literals(self):
- # Single-line
-
- self.assert_lex("''''''", "StrLit('''''') ...")
- self.assert_lex("1 '''x''y'''1",
- "IntLit(1) StrLit( '''x''y''') IntLit(1) ...")
-
- self.assert_lex('""""""', 'StrLit("""""") ...')
- self.assert_lex('"""x""y"""', 'StrLit("""x""y""") ...')
-
- # Multiple-line
-
- self.assert_lex("'''" + '\n' + "'''", "StrLit('''\\n''') ...")
- self.assert_lex("'''x''" + '\n' + "''x'''",
- "StrLit('''x''\\n''x''') ...")
- self.assert_lex("'''''" + '\n' + "'''''",
- "StrLit('''''\\n''') StrLit('') ...")
- self.assert_lex("'''x" + '\n' + 'xyz' + '\n' + "''x'''",
- "StrLit('''x\\nxyz\\n''x''') ...")
-
- self.assert_lex('"""x' + '\n' + 'y"""', 'StrLit("""x\\ny""") ...')
-
- def test_unicode_literals(self):
- self.assert_lex("u'' u'foo'",
- "UnicodeLit(u'') UnicodeLit( u'foo') ...")
- self.assert_lex('u"" u"foo"',
- 'UnicodeLit(u"") UnicodeLit( u"foo") ...')
- self.assert_lex('ur"" ur"foo"',
- 'UnicodeLit(ur"") UnicodeLit( ur"foo") ...')
- self.assert_lex('u"""foo\n"""',
- r'UnicodeLit(u"""foo\n""") ...')
-
- def test_unicode_literal_capital_u(self):
- self.assert_lex("U'foo'", "UnicodeLit(U'foo') ...")
-
- def test_semicolons(self):
- self.assert_lex('a;b', 'Name(a) Break(;) Name(b) ...')
- self.assert_lex('a;', 'Name(a) Break(;) Eof()')
-
- self.assert_lex(';a', 'Break(;) Name(a) ...')
- self.assert_lex('a;;b', 'Name(a) Break(;) Break(;) Name(b) ...')
-
- def test_raw_string(self):
- self.assert_lex("r'' r'foo bar'",
- "StrLit(r'') StrLit( r'foo bar') ...")
- self.assert_lex('r"" r"foo bar"',
- 'StrLit(r"") StrLit( r"foo bar") ...')
-
- self.assert_lex("r'\\x\\''", "StrLit(r'\\x\\'') ...")
- self.assert_lex('r"\\x\\""', 'StrLit(r"\\x\\"") ...')
-
- self.assert_lex("r'\\\\' ''", "StrLit(r'\\\\') StrLit( '') ...")
- self.assert_lex('r"\\\\" ""', 'StrLit(r"\\\\") StrLit( "") ...')
-
- self.assert_lex("r'''" + '\n' + "x'''", "StrLit(r'''\\nx''') ...")
-
- def test_raw_string_with_capital_r(self):
- self.assert_lex("R'foo'", "StrLit(R'foo') ...")
-
- def test_escapes_in_triple_quoted_literals(self):
- self.assert_lex(r"'''\''''",
- r"StrLit('''\'''') ...")
- self.assert_lex(r'"""\""""',
- r'StrLit("""\"""") ...')
- self.assert_lex(r'"""\\"""',
- r'StrLit("""\\""") ...')
-
- def test_escapes_in_triple_quoted_raw_literals(self):
- self.assert_lex(r"r'''\''''",
- r"StrLit(r'''\'''') ...")
- self.assert_lex(r"r'''\\'''",
- r"StrLit(r'''\\''') ...")
- self.assert_lex(r'r"""\""""',
- r'StrLit(r"""\"""") ...')
-
- def test_bytes(self):
- self.assert_lex("b'\\'' b'foo bar'",
- "BytesLit(b'\\'') BytesLit( b'foo bar') ...")
- self.assert_lex('b"\\"" b"foo bar"',
- 'BytesLit(b"\\"") BytesLit( b"foo bar") ...')
-
- self.assert_lex("b'''" + '\n' + " x'''", "BytesLit(b'''\\n x''') ...")
-
- def test_bytes_with_capital_b(self):
- self.assert_lex("B'foo'", "BytesLit(B'foo') ...")
-
- def test_raw_bytes(self):
- self.assert_lex("br'x\\x\\''", "BytesLit(br'x\\x\\'') ...")
- self.assert_lex('br"x\\y\\""', 'BytesLit(br"x\\y\\"") ...')
-
- self.assert_lex('br"""' + '\n' + 'x"""', 'BytesLit(br"""\\nx""") ...')
-
- def test_raw_bytes_alternative(self):
- self.assert_lex("rb'x\\x\\''", "BytesLit(rb'x\\x\\'') ...")
-
- def test_backslash(self):
- self.assert_lex('a\\' + '\n' + ' b', 'Name(a) Name(\\\\n b) ...')
- self.assert_lex(
- 'a = \\' + '\n' + ' 1' + '\n' + '=',
- 'Name(a) Punct( =) IntLit( \\\\n 1) Break(\\n) Punct(=) ...')
-
- def test_backslash_in_string(self):
- self.assert_lex("'foo\\" + '\n' + "bar'", "StrLit('foo\\\\nbar') ...")
- self.assert_lex("'foo\\" + '\n' + ' zar\\' + '\n' + " bar'",
- "StrLit('foo\\\\n zar\\\\n bar') ...")
-
- self.assert_lex('"foo\\' + '\n' + 'bar"', 'StrLit("foo\\\\nbar") ...')
-
- def test_backslash_in_raw_string(self):
- self.assert_lex("r'a\\" + '\n' + "b\\'1",
- "StrLit(r'a\\\\nb\\') IntLit(1) ...")
- self.assert_lex("r'a\\" + '\n' + '-\\' + '\n' + "b\\'1",
- "StrLit(r'a\\\\n-\\\\nb\\') IntLit(1) ...")
- self.assert_lex('r"a\\' + '\n' + 'b\\"1',
- 'StrLit(r"a\\\\nb\\") IntLit(1) ...')
- self.assert_lex('r"a\\' + '\n' + '-\\' + '\n' + 'b\\"1',
- 'StrLit(r"a\\\\n-\\\\nb\\") IntLit(1) ...')
-
- def test_final_dedent(self):
- self.assert_lex(
- '1' + '\n' + ' 1' + '\n',
- 'IntLit(1) Break(\\n) Indent( ) IntLit(1) Break(\\n) Dedent() Eof()')
-
- def test_empty_line(self):
- self.assert_lex('1' + '\n' + ' 1' + '\n' + '\n',
- r'IntLit(1) Break(\n) Indent( ) IntLit(1) '
- r'Break(\n\n) Dedent() Eof()')
-
- def test_comments_and_indents(self):
- self.assert_lex('1' + '\n' + ' #x' + '\n' + ' y',
- r'IntLit(1) Break(\n #x\n) Indent( ) Name(y) '
- r'Break() Dedent() Eof()')
- self.assert_lex('1' + '\n' + '#x' + '\n' + ' y',
- r'IntLit(1) Break(\n#x\n) Indent( ) Name(y) '
- r'Break() Dedent() Eof()')
-
- def test_form_feed(self):
- self.assert_lex('\x0c' + '\n' + 'x', 'Name(\x0c\\nx) ...')
-
- def test_comment_after_linebreak(self):
- self.assert_lex('1\n# foo\n2',
- 'IntLit(1) Break(\\n# foo\\n) IntLit(2) ...')
- self.assert_lex('1\n# foo',
- 'IntLit(1) Break(\\n# foo) Eof()')
-
- def test_line_numbers(self):
- self.assert_line('a\\nb', [1, 1, 2, 2, 2])
-
- self.assert_line('(\\nb)', [1, 2, 2]) # Note: omit break and eof tokens
-
- self.assert_line('a\\n b', [1, 1, # a, break
- 2, 2, 2, # indent, b, break
- 2, 2]) # dedent, break
- self.assert_line('a\\n b\\nc', [1, 1, # a, break
- 2, 2, 2, # indent, b, break
- 3, 3]) # dedent, c
-
- self.assert_line('a\\rb', [1, 1, 2])
- self.assert_line('a\\r\\nb', [1, 1, 2])
-
- self.assert_line('"""x""" 1', [1, 1])
- self.assert_line('"""x\\ny""" 1', [1, 2])
- self.assert_line('"""x\\r\\ny""" 1', [1, 2])
- self.assert_line('"""x\\ry""" 1', [1, 2])
- self.assert_line('"""x\\n\\ny""" 1', [1, 3])
- self.assert_line('\\n"""x\\ny""" 1', [2, 3])
-
- self.assert_line('"x" 1', [1, 1])
- self.assert_line('"\\\\n" 1', [1, 2])
- self.assert_line('"\\\\nx\\\\n" 1', [1, 3])
-
- self.assert_line('r"x" 1', [1, 1])
- self.assert_line('r"\\\\n" 1', [1, 2])
- self.assert_line('r"\\\\nx\\\\n" 1', [1, 3])
-
- def test_backslash_line(self):
- self.assert_line('a\\\\n 1\\n=', [1, 2, 2, 3])
-
- def test_invalid_parens(self):
- self.assert_lex('([\\n )\\n1',
- 'Punct(() Punct([) Punct(\\n )) IntLit(\\n1) ...')
- self.assert_lex('])', 'Punct(]) Punct()) ...')
- self.assert_lex('(]\\n )', 'Punct(() Punct(]) Punct(\\n )) ...')
- self.assert_lex('(\\n ])', 'Punct(() Punct(\\n ]) Punct()) ...')
-
- def test_invalid_indent(self):
- self.assert_lex('x\\n y\\n z',
- 'Name(x) Break(\\n) Indent( ) Name(y) ' +
- 'Break(\\n) Dedent() LexError( ) Name(z) ...')
-
- def test_invalid_backslash(self):
- self.assert_lex('\\ \\nx', 'LexError(\\) Break( \\n) Name(x) ...')
- self.assert_lex('\\ \\nx', 'LexError(\\) Break( \\n) Name(x) ...')
-
- def test_non_terminated_string_literal(self):
- self.assert_lex("'", 'LexError(\') ...')
- self.assert_lex("'\\na", 'LexError(\') Break(\\n) Name(a) ...')
-
- self.assert_lex('"', 'LexError(") ...')
- self.assert_lex('"\\na', 'LexError(") Break(\\n) Name(a) ...')
-
- self.assert_lex("r'", 'LexError(r\') ...')
- self.assert_lex('r"', 'LexError(r") ...')
-
- self.assert_lex('"""', 'LexError(""") ...')
- self.assert_lex('"""\\n', 'LexError("""\\n) ...')
-
- self.assert_lex("'''", "LexError(''') ...")
- self.assert_lex("'''\\n", "LexError('''\\n) ...")
-
- self.assert_lex("'\\", 'LexError(\'\\) ...')
- self.assert_lex("'\\\\n", 'LexError(\'\\\\n) ...')
- self.assert_lex("r'\\", 'LexError(r\'\\) ...')
- self.assert_lex("r'\\\\n", 'LexError(r\'\\\\n) ...')
-
- def test_invalid_hex_int_literals(self):
- self.assert_lex('0x', 'LexError( ) ...')
- self.assert_lex('0xax', 'LexError( ) ...')
-
- def test_latin1_encoding(self):
- self.assert_lex(b'# coding: latin1\n"\xbb"',
- 'StrLit(# coding: latin1\\n"\xbb") Break() Eof()')
-
- def test_utf8_encoding(self):
- self.assert_lex('"\xbb"'.encode('utf8'),
- 'StrLit("\xbb") Break() Eof()')
- self.assert_lex(b'"\xbb"',
- "LexError('utf8' codec can't decode byte 187 in column 2) "
- 'Break() Eof()')
- self.assert_lex(b'\n"abcde\xbc"',
- "LexError('utf8' codec can't decode byte 188 in column 7) "
- 'Break() Eof()')
-
- def test_byte_order_mark(self):
- self.assert_lex('\ufeff"\xbb"'.encode('utf8'),
- 'Bom(\ufeff) StrLit("\xbb") Break() Eof()')
-
- def test_long_comment(self):
- prog = '# pass\n' * 1000
- self.assert_lex(prog, 'Eof(%s)' % repr(prog)[1:-1])
-
- # TODO
- # invalid escape sequences in string literals etc.
-
- def assert_lex(self, src, lexed):
- if isinstance(src, str):
- src = src.replace('\\n', '\n')
- src = src.replace('\\r', '\r')
-
- if lexed.endswith(' ...'):
- lexed = lexed[:-3] + 'Break() Eof()'
-
- l = lex(src)[0]
- r = []
- for t in l:
- r.append(str(t))
- act = ' '.join(r)
- if act != lexed:
- print('Actual: ', act)
- print('Expected:', lexed)
- assert_equal(act, lexed)
-
- def assert_line(self, s, a):
- s = s.replace('\\n', '\n')
- s = s.replace('\\r', '\r')
-
- tt = lex(s)[0]
- r = []
- for t in tt:
- r.append(t.line)
- if len(r) == len(a) + 2:
- a = a[:]
- a.append(a[-1])
- a.append(a[-1])
- assert_equal(r, a)
diff --git a/mypy/test/testmoduleinfo.py b/mypy/test/testmoduleinfo.py
deleted file mode 100644
index 5818479..0000000
--- a/mypy/test/testmoduleinfo.py
+++ /dev/null
@@ -1,14 +0,0 @@
-from mypy import moduleinfo
-from mypy.myunit import (
- Suite, assert_equal, assert_true, assert_false
-)
-
-
-class ModuleInfoSuite(Suite):
- def test_is_in_module_collection(self) -> None:
- assert_true(moduleinfo.is_in_module_collection({'foo'}, 'foo'))
- assert_true(moduleinfo.is_in_module_collection({'foo'}, 'foo.bar'))
- assert_false(moduleinfo.is_in_module_collection({'foo'}, 'fo'))
- assert_true(moduleinfo.is_in_module_collection({'foo.bar'}, 'foo.bar'))
- assert_true(moduleinfo.is_in_module_collection({'foo.bar'}, 'foo.bar.zar'))
- assert_false(moduleinfo.is_in_module_collection({'foo.bar'}, 'foo'))
diff --git a/mypy/test/testparse.py b/mypy/test/testparse.py
deleted file mode 100644
index d6789c0..0000000
--- a/mypy/test/testparse.py
+++ /dev/null
@@ -1,79 +0,0 @@
-"""Tests for the mypy parser."""
-
-import os.path
-
-from typing import List
-
-from mypy import defaults
-from mypy.myunit import Suite, AssertionFailure
-from mypy.test.helpers import assert_string_arrays_equal
-from mypy.test.data import parse_test_cases, DataDrivenTestCase
-from mypy.test import config
-from mypy.parse import parse
-from mypy.errors import CompileError
-from mypy.options import Options
-
-
-class ParserSuite(Suite):
- parse_files = ['parse.test',
- 'parse-python2.test']
-
- def cases(self) -> List[DataDrivenTestCase]:
- # The test case descriptions are stored in data files.
- c = [] # type: List[DataDrivenTestCase]
- for f in self.parse_files:
- c += parse_test_cases(
- os.path.join(config.test_data_prefix, f), test_parser)
- return c
-
-
-def test_parser(testcase: DataDrivenTestCase) -> None:
- """Perform a single parser test case.
-
- The argument contains the description of the test case.
- """
- options = Options()
-
- if testcase.file.endswith('python2.test'):
- options.python_version = defaults.PYTHON2_VERSION
- else:
- options.python_version = defaults.PYTHON3_VERSION
-
- try:
- n = parse(bytes('\n'.join(testcase.input), 'ascii'),
- fnam='main',
- errors=None,
- options=options)
- a = str(n).split('\n')
- except CompileError as e:
- a = e.messages
- assert_string_arrays_equal(testcase.output, a,
- 'Invalid parser output ({}, line {})'.format(
- testcase.file, testcase.line))
-
-
-# The file name shown in test case output. This is displayed in error
-# messages, and must match the file name in the test case descriptions.
-INPUT_FILE_NAME = 'file'
-
-
-class ParseErrorSuite(Suite):
- def cases(self) -> List[DataDrivenTestCase]:
- # Test case descriptions are in an external file.
- return parse_test_cases(os.path.join(config.test_data_prefix,
- 'parse-errors.test'),
- test_parse_error)
-
-
-def test_parse_error(testcase: DataDrivenTestCase) -> None:
- try:
- # Compile temporary file. The test file contains non-ASCII characters.
- parse(bytes('\n'.join(testcase.input), 'utf-8'), INPUT_FILE_NAME, None, Options())
- raise AssertionFailure('No errors reported')
- except CompileError as e:
- # Verify that there was a compile error and that the error messages
- # are equivalent.
- assert_string_arrays_equal(
- testcase.output, e.messages,
- 'Invalid compiler output ({}, line {})'.format(testcase.file,
- testcase.line))
diff --git a/mypy/test/testpythoneval.py b/mypy/test/testpythoneval.py
deleted file mode 100644
index cc598d2..0000000
--- a/mypy/test/testpythoneval.py
+++ /dev/null
@@ -1,135 +0,0 @@
-"""Test cases for running mypy programs using a Python interpreter.
-
-Each test case type checks a program then runs it using Python. The
-output (stdout) of the program is compared to expected output. Type checking
-uses full builtins and other stubs.
-
-Note: Currently Python interpreter paths are hard coded.
-
-Note: These test cases are *not* included in the main test suite, as including
- this suite would slow down the main suite too much.
-"""
-
-from contextlib import contextmanager
-import errno
-import os
-import os.path
-import re
-import subprocess
-import sys
-
-import typing
-from typing import Dict, List, Tuple
-
-from mypy.myunit import Suite, SkipTestCaseException
-from mypy.test.config import test_data_prefix, test_temp_dir
-from mypy.test.data import DataDrivenTestCase, parse_test_cases
-from mypy.test.helpers import assert_string_arrays_equal
-from mypy.util import try_find_python2_interpreter
-
-
-# Files which contain test case descriptions.
-python_eval_files = ['pythoneval.test',
- 'python2eval.test']
-
-python_34_eval_files = ['pythoneval-asyncio.test',
- 'pythoneval-enum.test']
-
-# Path to Python 3 interpreter
-python3_path = sys.executable
-program_re = re.compile(r'\b_program.py\b')
-
-
-class PythonEvaluationSuite(Suite):
- def cases(self) -> List[DataDrivenTestCase]:
- c = [] # type: List[DataDrivenTestCase]
- for f in python_eval_files:
- c += parse_test_cases(os.path.join(test_data_prefix, f),
- test_python_evaluation, test_temp_dir, True)
- if sys.version_info.major == 3 and sys.version_info.minor >= 4:
- for f in python_34_eval_files:
- c += parse_test_cases(os.path.join(test_data_prefix, f),
- test_python_evaluation, test_temp_dir, True)
- return c
-
-
-def test_python_evaluation(testcase: DataDrivenTestCase) -> None:
- """Runs Mypy in a subprocess.
-
- If this passes without errors, executes the script again with a given Python
- version.
- """
- mypy_cmdline = [
- python3_path,
- os.path.join(testcase.old_cwd, 'scripts', 'mypy'),
- '--show-traceback',
- ]
- py2 = testcase.name.lower().endswith('python2')
- if py2:
- mypy_cmdline.append('--py2')
- interpreter = try_find_python2_interpreter()
- if not interpreter:
- # Skip, can't find a Python 2 interpreter.
- raise SkipTestCaseException()
- else:
- interpreter = python3_path
-
- # Write the program to a file.
- program = '_' + testcase.name + '.py'
- mypy_cmdline.append(program)
- program_path = os.path.join(test_temp_dir, program)
- with open(program_path, 'w') as file:
- for s in testcase.input:
- file.write('{}\n'.format(s))
- # Type check the program.
- # This uses the same PYTHONPATH as the current process.
- returncode, out = run(mypy_cmdline)
- if returncode == 0:
- # Set up module path for the execution.
- # This needs the typing module but *not* the mypy module.
- vers_dir = '2.7' if py2 else '3.2'
- typing_path = os.path.join(testcase.old_cwd, 'lib-typing', vers_dir)
- assert os.path.isdir(typing_path)
- env = os.environ.copy()
- env['PYTHONPATH'] = typing_path
- returncode, interp_out = run([interpreter, program], env=env)
- out += interp_out
- # Remove temp file.
- os.remove(program_path)
- assert_string_arrays_equal(adapt_output(testcase), out,
- 'Invalid output ({}, line {})'.format(
- testcase.file, testcase.line))
-
-
-def split_lines(*streams: bytes) -> List[str]:
- """Returns a single list of string lines from the byte streams in args."""
- return [
- s.rstrip('\n\r')
- for stream in streams
- for s in str(stream, 'utf8').splitlines()
- ]
-
-
-def adapt_output(testcase: DataDrivenTestCase) -> List[str]:
- """Translates the generic _program.py into the actual filename."""
- program = '_' + testcase.name + '.py'
- return [program_re.sub(program, line) for line in testcase.output]
-
-
-def run(
- cmdline: List[str], *, env: Dict[str, str] = None, timeout: int = 30
-) -> Tuple[int, List[str]]:
- """A poor man's subprocess.run() for 3.3 and 3.4 compatibility."""
- process = subprocess.Popen(
- cmdline,
- env=env,
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE,
- cwd=test_temp_dir,
- )
- try:
- out, err = process.communicate(timeout=timeout)
- except subprocess.TimeoutExpired:
- out = err = b''
- process.kill()
- return process.returncode, split_lines(out, err)
diff --git a/mypy/test/testreports.py b/mypy/test/testreports.py
deleted file mode 100644
index 80e6980..0000000
--- a/mypy/test/testreports.py
+++ /dev/null
@@ -1,40 +0,0 @@
-"""Test cases for reports generated by mypy."""
-import textwrap
-
-from mypy.myunit import Suite, assert_equal
-from mypy.report import CoberturaPackage, get_line_rate
-
-import lxml.etree as etree
-
-
-class CoberturaReportSuite(Suite):
- def test_get_line_rate(self) -> None:
- assert_equal('1.0', get_line_rate(0, 0))
- assert_equal('0.3333', get_line_rate(1, 3))
-
- def test_as_xml(self) -> None:
- cobertura_package = CoberturaPackage('foobar')
- cobertura_package.covered_lines = 21
- cobertura_package.total_lines = 42
-
- child_package = CoberturaPackage('raz')
- child_package.covered_lines = 10
- child_package.total_lines = 10
- child_package.classes['class'] = etree.Element('class')
-
- cobertura_package.packages['raz'] = child_package
-
- expected_output = textwrap.dedent('''\
- <package complexity="1.0" name="foobar" branch-rate="0" line-rate="0.5000">
- <classes/>
- <packages>
- <package complexity="1.0" name="raz" branch-rate="0" line-rate="1.0000">
- <classes>
- <class/>
- </classes>
- </package>
- </packages>
- </package>
- ''').encode('ascii')
- assert_equal(expected_output,
- etree.tostring(cobertura_package.as_xml(), pretty_print=True))
diff --git a/mypy/test/testsemanal.py b/mypy/test/testsemanal.py
deleted file mode 100644
index 4870fa8..0000000
--- a/mypy/test/testsemanal.py
+++ /dev/null
@@ -1,224 +0,0 @@
-"""Semantic analyzer test cases"""
-
-import os.path
-
-from typing import Dict, List
-
-from mypy import build
-from mypy.build import BuildSource
-from mypy.myunit import Suite
-from mypy.test.helpers import (
- assert_string_arrays_equal, normalize_error_messages, testfile_pyversion,
-)
-from mypy.test.data import parse_test_cases, DataDrivenTestCase
-from mypy.test.config import test_data_prefix, test_temp_dir
-from mypy.errors import CompileError
-from mypy.nodes import TypeInfo
-from mypy.options import Options
-
-
-# Semantic analyzer test cases: dump parse tree
-
-# Semantic analysis test case description files.
-semanal_files = ['semanal-basic.test',
- 'semanal-expressions.test',
- 'semanal-classes.test',
- 'semanal-types.test',
- 'semanal-typealiases.test',
- 'semanal-modules.test',
- 'semanal-statements.test',
- 'semanal-abstractclasses.test',
- 'semanal-namedtuple.test',
- 'semanal-typeddict.test',
- 'semanal-python2.test']
-
-
-def get_semanal_options() -> Options:
- options = Options()
- options.use_builtins_fixtures = True
- options.semantic_analysis_only = True
- options.show_traceback = True
- return options
-
-
-class SemAnalSuite(Suite):
- def cases(self) -> List[DataDrivenTestCase]:
- c = [] # type: List[DataDrivenTestCase]
- for f in semanal_files:
- c += parse_test_cases(os.path.join(test_data_prefix, f),
- test_semanal,
- base_path=test_temp_dir,
- optional_out=True,
- native_sep=True)
- return c
-
-
-def test_semanal(testcase: DataDrivenTestCase) -> None:
- """Perform a semantic analysis test case.
-
- The testcase argument contains a description of the test case
- (inputs and output).
- """
-
- try:
- src = '\n'.join(testcase.input)
- options = get_semanal_options()
- options.python_version = testfile_pyversion(testcase.file)
- result = build.build(sources=[BuildSource('main', None, src)],
- options=options,
- alt_lib_path=test_temp_dir)
- a = result.errors
- if a:
- raise CompileError(a)
- # Include string representations of the source files in the actual
- # output.
- for fnam in sorted(result.files.keys()):
- f = result.files[fnam]
- # Omit the builtins module and files with a special marker in the
- # path.
- # TODO the test is not reliable
- if (not f.path.endswith((os.sep + 'builtins.pyi',
- 'typing.pyi',
- 'mypy_extensions.pyi',
- 'abc.pyi',
- 'collections.pyi'))
- and not os.path.basename(f.path).startswith('_')
- and not os.path.splitext(
- os.path.basename(f.path))[0].endswith('_')):
- a += str(f).split('\n')
- except CompileError as e:
- a = e.messages
- assert_string_arrays_equal(
- testcase.output, a,
- 'Invalid semantic analyzer output ({}, line {})'.format(testcase.file,
- testcase.line))
-
-
-# Semantic analyzer error test cases
-
-# Paths to files containing test case descriptions.
-semanal_error_files = ['semanal-errors.test']
-
-
-class SemAnalErrorSuite(Suite):
- def cases(self) -> List[DataDrivenTestCase]:
- # Read test cases from test case description files.
- c = [] # type: List[DataDrivenTestCase]
- for f in semanal_error_files:
- c += parse_test_cases(os.path.join(test_data_prefix, f),
- test_semanal_error, test_temp_dir, optional_out=True)
- return c
-
-
-def test_semanal_error(testcase: DataDrivenTestCase) -> None:
- """Perform a test case."""
-
- try:
- src = '\n'.join(testcase.input)
- res = build.build(sources=[BuildSource('main', None, src)],
- options=get_semanal_options(),
- alt_lib_path=test_temp_dir)
- a = res.errors
- assert a, 'No errors reported in {}, line {}'.format(testcase.file, testcase.line)
- except CompileError as e:
- # Verify that there was a compile error and that the error messages
- # are equivalent.
- a = e.messages
- assert_string_arrays_equal(
- testcase.output, normalize_error_messages(a),
- 'Invalid compiler output ({}, line {})'.format(testcase.file, testcase.line))
-
-
-# SymbolNode table export test cases
-
-# Test case descriptions
-semanal_symtable_files = ['semanal-symtable.test']
-
-
-class SemAnalSymtableSuite(Suite):
- def cases(self) -> List[DataDrivenTestCase]:
- c = [] # type: List[DataDrivenTestCase]
- for f in semanal_symtable_files:
- c += parse_test_cases(os.path.join(test_data_prefix, f),
- self.run_test, test_temp_dir)
- return c
-
- def run_test(self, testcase: DataDrivenTestCase) -> None:
- """Perform a test case."""
- try:
- # Build test case input.
- src = '\n'.join(testcase.input)
- result = build.build(sources=[BuildSource('main', None, src)],
- options=get_semanal_options(),
- alt_lib_path=test_temp_dir)
- # The output is the symbol table converted into a string.
- a = result.errors
- if a:
- raise CompileError(a)
- for f in sorted(result.files.keys()):
- if f not in ('builtins', 'typing', 'abc'):
- a.append('{}:'.format(f))
- for s in str(result.files[f].names).split('\n'):
- a.append(' ' + s)
- except CompileError as e:
- a = e.messages
- assert_string_arrays_equal(
- testcase.output, a,
- 'Invalid semantic analyzer output ({}, line {})'.format(
- testcase.file, testcase.line))
-
-
-# Type info export test cases
-
-semanal_typeinfo_files = ['semanal-typeinfo.test']
-
-
-class SemAnalTypeInfoSuite(Suite):
- def cases(self) -> List[DataDrivenTestCase]:
- """Test case descriptions"""
- c = [] # type: List[DataDrivenTestCase]
- for f in semanal_typeinfo_files:
- c += parse_test_cases(os.path.join(test_data_prefix, f),
- self.run_test, test_temp_dir)
- return c
-
- def run_test(self, testcase: DataDrivenTestCase) -> None:
- """Perform a test case."""
- try:
- # Build test case input.
- src = '\n'.join(testcase.input)
- result = build.build(sources=[BuildSource('main', None, src)],
- options=get_semanal_options(),
- alt_lib_path=test_temp_dir)
- a = result.errors
- if a:
- raise CompileError(a)
-
- # Collect all TypeInfos in top-level modules.
- typeinfos = TypeInfoMap()
- for f in result.files.values():
- for n in f.names.values():
- if isinstance(n.node, TypeInfo):
- typeinfos[n.fullname] = n.node
-
- # The output is the symbol table converted into a string.
- a = str(typeinfos).split('\n')
- except CompileError as e:
- a = e.messages
- assert_string_arrays_equal(
- testcase.output, a,
- 'Invalid semantic analyzer output ({}, line {})'.format(
- testcase.file, testcase.line))
-
-
-class TypeInfoMap(Dict[str, TypeInfo]):
- def __str__(self) -> str:
- a = ['TypeInfoMap('] # type: List[str]
- for x, y in sorted(self.items()):
- if isinstance(x, str) and (not x.startswith('builtins.') and
- not x.startswith('typing.') and
- not x.startswith('abc.')):
- ti = ('\n' + ' ').join(str(y).split('\n'))
- a.append(' {} : {}'.format(x, ti))
- a[-1] += ')'
- return '\n'.join(a)
diff --git a/mypy/test/testsolve.py b/mypy/test/testsolve.py
deleted file mode 100644
index e407f75..0000000
--- a/mypy/test/testsolve.py
+++ /dev/null
@@ -1,156 +0,0 @@
-"""Test cases for the constraint solver used in type inference."""
-
-from typing import List, Union, Tuple
-
-from mypy.myunit import Suite, assert_equal
-from mypy.constraints import SUPERTYPE_OF, SUBTYPE_OF, Constraint
-from mypy.solve import solve_constraints
-from mypy.typefixture import TypeFixture
-from mypy.types import Type, TypeVarType, TypeVarId
-
-
-class SolveSuite(Suite):
- def __init__(self) -> None:
- super().__init__()
- self.fx = TypeFixture()
-
- def test_empty_input(self) -> None:
- self.assert_solve([], [], [])
-
- def test_simple_supertype_constraints(self) -> None:
- self.assert_solve([self.fx.t.id],
- [self.supc(self.fx.t, self.fx.a)],
- [(self.fx.a, self.fx.o)])
- self.assert_solve([self.fx.t.id],
- [self.supc(self.fx.t, self.fx.a),
- self.supc(self.fx.t, self.fx.b)],
- [(self.fx.a, self.fx.o)])
-
- def test_simple_subtype_constraints(self) -> None:
- self.assert_solve([self.fx.t.id],
- [self.subc(self.fx.t, self.fx.a)],
- [self.fx.a])
- self.assert_solve([self.fx.t.id],
- [self.subc(self.fx.t, self.fx.a),
- self.subc(self.fx.t, self.fx.b)],
- [self.fx.b])
-
- def test_both_kinds_of_constraints(self) -> None:
- self.assert_solve([self.fx.t.id],
- [self.supc(self.fx.t, self.fx.b),
- self.subc(self.fx.t, self.fx.a)],
- [(self.fx.b, self.fx.a)])
-
- def test_unsatisfiable_constraints(self) -> None:
- # The constraints are impossible to satisfy.
- self.assert_solve([self.fx.t.id],
- [self.supc(self.fx.t, self.fx.a),
- self.subc(self.fx.t, self.fx.b)],
- [None])
-
- def test_exactly_specified_result(self) -> None:
- self.assert_solve([self.fx.t.id],
- [self.supc(self.fx.t, self.fx.b),
- self.subc(self.fx.t, self.fx.b)],
- [(self.fx.b, self.fx.b)])
-
- def test_multiple_variables(self) -> None:
- self.assert_solve([self.fx.t.id, self.fx.s.id],
- [self.supc(self.fx.t, self.fx.b),
- self.supc(self.fx.s, self.fx.c),
- self.subc(self.fx.t, self.fx.a)],
- [(self.fx.b, self.fx.a), (self.fx.c, self.fx.o)])
-
- def test_no_constraints_for_var(self) -> None:
- self.assert_solve([self.fx.t.id],
- [],
- [self.fx.nonet])
- self.assert_solve([self.fx.t.id, self.fx.s.id],
- [],
- [self.fx.nonet, self.fx.nonet])
- self.assert_solve([self.fx.t.id, self.fx.s.id],
- [self.supc(self.fx.s, self.fx.a)],
- [self.fx.nonet, (self.fx.a, self.fx.o)])
-
- def test_void_constraints(self) -> None:
- self.assert_solve([self.fx.t.id],
- [self.supc(self.fx.t, self.fx.void)],
- [(self.fx.void, self.fx.void)])
- self.assert_solve([self.fx.t.id],
- [self.subc(self.fx.t, self.fx.void)],
- [(self.fx.void, self.fx.void)])
-
- # Both bounds void.
- self.assert_solve([self.fx.t.id],
- [self.supc(self.fx.t, self.fx.void),
- self.subc(self.fx.t, self.fx.void)],
- [(self.fx.void, self.fx.void)])
-
- # Cannot infer any type.
- self.assert_solve([self.fx.t.id],
- [self.supc(self.fx.t, self.fx.a),
- self.supc(self.fx.t, self.fx.void)],
- [None])
- self.assert_solve([self.fx.t.id],
- [self.subc(self.fx.t, self.fx.a),
- self.subc(self.fx.t, self.fx.void)],
- [None])
-
- def test_simple_constraints_with_dynamic_type(self) -> None:
- self.assert_solve([self.fx.t.id],
- [self.supc(self.fx.t, self.fx.anyt)],
- [(self.fx.anyt, self.fx.anyt)])
- self.assert_solve([self.fx.t.id],
- [self.supc(self.fx.t, self.fx.anyt),
- self.supc(self.fx.t, self.fx.anyt)],
- [(self.fx.anyt, self.fx.anyt)])
- self.assert_solve([self.fx.t.id],
- [self.supc(self.fx.t, self.fx.anyt),
- self.supc(self.fx.t, self.fx.a)],
- [(self.fx.anyt, self.fx.anyt)])
-
- self.assert_solve([self.fx.t.id],
- [self.subc(self.fx.t, self.fx.anyt)],
- [(self.fx.anyt, self.fx.anyt)])
- self.assert_solve([self.fx.t.id],
- [self.subc(self.fx.t, self.fx.anyt),
- self.subc(self.fx.t, self.fx.anyt)],
- [(self.fx.anyt, self.fx.anyt)])
- # self.assert_solve([self.fx.t.id],
- # [self.subc(self.fx.t, self.fx.anyt),
- # self.subc(self.fx.t, self.fx.a)],
- # [(self.fx.anyt, self.fx.anyt)])
- # TODO: figure out what this should be after changes to meet(any, X)
-
- def test_both_normal_and_any_types_in_results(self) -> None:
- # If one of the bounds is any, we promote the other bound to
- # any as well, since otherwise the type range does not make sense.
- self.assert_solve([self.fx.t.id],
- [self.supc(self.fx.t, self.fx.a),
- self.subc(self.fx.t, self.fx.anyt)],
- [(self.fx.anyt, self.fx.anyt)])
-
- self.assert_solve([self.fx.t.id],
- [self.supc(self.fx.t, self.fx.anyt),
- self.subc(self.fx.t, self.fx.a)],
- [(self.fx.anyt, self.fx.anyt)])
-
- def assert_solve(self,
- vars: List[TypeVarId],
- constraints: List[Constraint],
- results: List[Union[Type, Tuple[Type, Type]]],
- ) -> None:
- res = []
- for r in results:
- if isinstance(r, tuple):
- res.append(r[0])
- else:
- res.append(r)
- actual = solve_constraints(vars, constraints)
- assert_equal(str(actual), str(res))
-
- def supc(self, type_var: TypeVarType, bound: Type) -> Constraint:
- return Constraint(type_var.id, SUPERTYPE_OF, bound)
-
- def subc(self, type_var: TypeVarType, bound: Type) -> Constraint:
- return Constraint(type_var.id, SUBTYPE_OF, bound)
diff --git a/mypy/test/teststubgen.py b/mypy/test/teststubgen.py
deleted file mode 100644
index 0be61ca..0000000
--- a/mypy/test/teststubgen.py
+++ /dev/null
@@ -1,186 +0,0 @@
-import glob
-import importlib
-import os.path
-import random
-import shutil
-import sys
-import tempfile
-import time
-
-from typing import List, Tuple
-
-from mypy.myunit import Suite, AssertionFailure, assert_equal
-from mypy.test.helpers import assert_string_arrays_equal
-from mypy.test.data import parse_test_cases, DataDrivenTestCase
-from mypy.test import config
-from mypy.parse import parse
-from mypy.errors import CompileError
-from mypy.stubgen import generate_stub, generate_stub_for_module
-from mypy.stubgenc import infer_method_sig
-from mypy.stubutil import (
- parse_signature, parse_all_signatures, build_signature, find_unique_signatures,
- infer_sig_from_docstring
-)
-
-
-class StubgenUtilSuite(Suite):
- def test_parse_signature(self) -> None:
- self.assert_parse_signature('func()', ('func', [], []))
-
- def test_parse_signature_with_args(self) -> None:
- self.assert_parse_signature('func(arg)', ('func', ['arg'], []))
- self.assert_parse_signature('do(arg, arg2)', ('do', ['arg', 'arg2'], []))
-
- def test_parse_signature_with_optional_args(self) -> None:
- self.assert_parse_signature('func([arg])', ('func', [], ['arg']))
- self.assert_parse_signature('func(arg[, arg2])', ('func', ['arg'], ['arg2']))
- self.assert_parse_signature('func([arg[, arg2]])', ('func', [], ['arg', 'arg2']))
-
- def test_parse_signature_with_default_arg(self) -> None:
- self.assert_parse_signature('func(arg=None)', ('func', [], ['arg']))
- self.assert_parse_signature('func(arg, arg2=None)', ('func', ['arg'], ['arg2']))
- self.assert_parse_signature('func(arg=1, arg2="")', ('func', [], ['arg', 'arg2']))
-
- def test_parse_signature_with_qualified_function(self) -> None:
- self.assert_parse_signature('ClassName.func(arg)', ('func', ['arg'], []))
-
- def test_parse_signature_with_kw_only_arg(self) -> None:
- self.assert_parse_signature('ClassName.func(arg, *, arg2=1)',
- ('func', ['arg', '*'], ['arg2']))
-
- def test_parse_signature_with_star_arg(self) -> None:
- self.assert_parse_signature('ClassName.func(arg, *args)',
- ('func', ['arg', '*args'], []))
-
- def test_parse_signature_with_star_star_arg(self) -> None:
- self.assert_parse_signature('ClassName.func(arg, **args)',
- ('func', ['arg', '**args'], []))
-
- def assert_parse_signature(self, sig: str, result: Tuple[str, List[str], List[str]]) -> None:
- assert_equal(parse_signature(sig), result)
-
- def test_build_signature(self) -> None:
- assert_equal(build_signature([], []), '()')
- assert_equal(build_signature(['arg'], []), '(arg)')
- assert_equal(build_signature(['arg', 'arg2'], []), '(arg, arg2)')
- assert_equal(build_signature(['arg'], ['arg2']), '(arg, arg2=...)')
- assert_equal(build_signature(['arg'], ['arg2', '**x']), '(arg, arg2=..., **x)')
-
- def test_parse_all_signatures(self) -> None:
- assert_equal(parse_all_signatures(['random text',
- '.. function:: fn(arg',
- '.. function:: fn()',
- ' .. method:: fn2(arg)']),
- ([('fn', '()'),
- ('fn2', '(arg)')], []))
-
- def test_find_unique_signatures(self) -> None:
- assert_equal(find_unique_signatures(
- [('func', '()'),
- ('func', '()'),
- ('func2', '()'),
- ('func2', '(arg)'),
- ('func3', '(arg, arg2)')]),
- [('func', '()'),
- ('func3', '(arg, arg2)')])
-
- def test_infer_sig_from_docstring(self) -> None:
- assert_equal(infer_sig_from_docstring('\nfunc(x) - y', 'func'), '(x)')
- assert_equal(infer_sig_from_docstring('\nfunc(x, Y_a=None)', 'func'), '(x, Y_a=None)')
- assert_equal(infer_sig_from_docstring('\nafunc(x) - y', 'func'), None)
- assert_equal(infer_sig_from_docstring('\nfunc(x, y', 'func'), None)
- assert_equal(infer_sig_from_docstring('\nfunc(x=z(y))', 'func'), None)
- assert_equal(infer_sig_from_docstring('\nfunc x', 'func'), None)
-
-
-class StubgenPythonSuite(Suite):
- test_data_files = ['stubgen.test']
-
- def cases(self) -> List[DataDrivenTestCase]:
- c = [] # type: List[DataDrivenTestCase]
- for path in self.test_data_files:
- c += parse_test_cases(os.path.join(config.test_data_prefix, path), test_stubgen)
- return c
-
-
-def test_stubgen(testcase: DataDrivenTestCase) -> None:
- if 'stubgen-test-path' not in sys.path:
- sys.path.insert(0, 'stubgen-test-path')
- os.mkdir('stubgen-test-path')
- source = '\n'.join(testcase.input)
- handle = tempfile.NamedTemporaryFile(prefix='prog_', suffix='.py', dir='stubgen-test-path',
- delete=False)
- assert os.path.isabs(handle.name)
- path = os.path.basename(handle.name)
- name = path[:-3]
- path = os.path.join('stubgen-test-path', path)
- out_dir = '_out'
- os.mkdir(out_dir)
- try:
- handle.write(bytes(source, 'ascii'))
- handle.close()
- # Without this we may sometimes be unable to import the module below, as importlib
- # caches os.listdir() results in Python 3.3+ (Guido explained this to me).
- reset_importlib_caches()
- try:
- if testcase.name.endswith('_import'):
- generate_stub_for_module(name, out_dir, quiet=True)
- elif testcase.name.endswith('_fast_parser'):
- generate_stub(path, out_dir, fast_parser=True)
- else:
- generate_stub(path, out_dir)
- a = load_output(out_dir)
- except CompileError as e:
- a = e.messages
- assert_string_arrays_equal(testcase.output, a,
- 'Invalid output ({}, line {})'.format(
- testcase.file, testcase.line))
- finally:
- handle.close()
- os.unlink(handle.name)
- shutil.rmtree(out_dir)
-
-
-def reset_importlib_caches() -> None:
- try:
- importlib.invalidate_caches()
- except (ImportError, AttributeError):
- pass
-
-
-def load_output(dirname: str) -> List[str]:
- result = [] # type: List[str]
- entries = glob.glob('%s/*' % dirname)
- assert entries, 'No files generated'
- if len(entries) == 1:
- add_file(entries[0], result)
- else:
- for entry in entries:
- result.append('## %s ##' % entry)
- add_file(entry, result)
- return result
-
-
-def add_file(path: str, result: List[str]) -> None:
- with open(path) as file:
- result.extend(file.read().splitlines())
-
-
-class StubgencSuite(Suite):
- def test_infer_hash_sig(self) -> None:
- assert_equal(infer_method_sig('__hash__'), '()')
-
- def test_infer_getitem_sig(self) -> None:
- assert_equal(infer_method_sig('__getitem__'), '(index)')
-
- def test_infer_setitem_sig(self) -> None:
- assert_equal(infer_method_sig('__setitem__'), '(index, object)')
-
- def test_infer_binary_op_sig(self) -> None:
- for op in ('eq', 'ne', 'lt', 'le', 'gt', 'ge',
- 'add', 'radd', 'sub', 'rsub', 'mul', 'rmul'):
- assert_equal(infer_method_sig('__%s__' % op), '(other)')
-
- def test_infer_unary_op_sig(self) -> None:
- for op in ('neg', 'pos'):
- assert_equal(infer_method_sig('__%s__' % op), '()')
diff --git a/mypy/test/testsubtypes.py b/mypy/test/testsubtypes.py
deleted file mode 100644
index 307cb7a..0000000
--- a/mypy/test/testsubtypes.py
+++ /dev/null
@@ -1,208 +0,0 @@
-from mypy.myunit import Suite, assert_true
-from mypy.nodes import CONTRAVARIANT, INVARIANT, COVARIANT
-from mypy.subtypes import is_subtype
-from mypy.typefixture import TypeFixture, InterfaceTypeFixture
-from mypy.types import Type
-
-
-class SubtypingSuite(Suite):
- def set_up(self) -> None:
- self.fx = TypeFixture(INVARIANT)
- self.fx_contra = TypeFixture(CONTRAVARIANT)
- self.fx_co = TypeFixture(COVARIANT)
-
- def test_trivial_cases(self) -> None:
- for simple in self.fx_co.void, self.fx_co.a, self.fx_co.o, self.fx_co.b:
- self.assert_subtype(simple, simple)
-
- def test_instance_subtyping(self) -> None:
- self.assert_strict_subtype(self.fx.a, self.fx.o)
- self.assert_strict_subtype(self.fx.b, self.fx.o)
- self.assert_strict_subtype(self.fx.b, self.fx.a)
-
- self.assert_not_subtype(self.fx.a, self.fx.d)
- self.assert_not_subtype(self.fx.b, self.fx.c)
-
- def test_simple_generic_instance_subtyping_invariant(self) -> None:
- self.assert_subtype(self.fx.ga, self.fx.ga)
- self.assert_subtype(self.fx.hab, self.fx.hab)
-
- self.assert_not_subtype(self.fx.ga, self.fx.g2a)
- self.assert_not_subtype(self.fx.ga, self.fx.gb)
- self.assert_not_subtype(self.fx.gb, self.fx.ga)
-
- def test_simple_generic_instance_subtyping_covariant(self) -> None:
- self.assert_subtype(self.fx_co.ga, self.fx_co.ga)
- self.assert_subtype(self.fx_co.hab, self.fx_co.hab)
-
- self.assert_not_subtype(self.fx_co.ga, self.fx_co.g2a)
- self.assert_not_subtype(self.fx_co.ga, self.fx_co.gb)
- self.assert_subtype(self.fx_co.gb, self.fx_co.ga)
-
- def test_simple_generic_instance_subtyping_contravariant(self) -> None:
- self.assert_subtype(self.fx_contra.ga, self.fx_contra.ga)
- self.assert_subtype(self.fx_contra.hab, self.fx_contra.hab)
-
- self.assert_not_subtype(self.fx_contra.ga, self.fx_contra.g2a)
- self.assert_subtype(self.fx_contra.ga, self.fx_contra.gb)
- self.assert_not_subtype(self.fx_contra.gb, self.fx_contra.ga)
-
- def test_generic_subtyping_with_inheritance_invariant(self) -> None:
- self.assert_subtype(self.fx.gsab, self.fx.gb)
- self.assert_not_subtype(self.fx.gsab, self.fx.ga)
- self.assert_not_subtype(self.fx.gsaa, self.fx.gb)
-
- def test_generic_subtyping_with_inheritance_covariant(self) -> None:
- self.assert_subtype(self.fx_co.gsab, self.fx_co.gb)
- self.assert_subtype(self.fx_co.gsab, self.fx_co.ga)
- self.assert_not_subtype(self.fx_co.gsaa, self.fx_co.gb)
-
- def test_generic_subtyping_with_inheritance_contravariant(self) -> None:
- self.assert_subtype(self.fx_contra.gsab, self.fx_contra.gb)
- self.assert_not_subtype(self.fx_contra.gsab, self.fx_contra.ga)
- self.assert_subtype(self.fx_contra.gsaa, self.fx_contra.gb)
-
- def test_interface_subtyping(self) -> None:
- self.assert_subtype(self.fx.e, self.fx.f)
- self.assert_equivalent(self.fx.f, self.fx.f)
- self.assert_not_subtype(self.fx.a, self.fx.f)
-
- def test_generic_interface_subtyping(self) -> None:
- # TODO make this work
- self.skip()
-
- fx2 = InterfaceTypeFixture()
-
- self.assert_subtype(fx2.m1, fx2.gfa)
- self.assert_not_subtype(fx2.m1, fx2.gfb)
-
- self.assert_equivalent(fx2.gfa, fx2.gfa)
-
- def test_basic_callable_subtyping(self) -> None:
- self.assert_strict_subtype(self.fx.callable(self.fx.o, self.fx.d),
- self.fx.callable(self.fx.a, self.fx.d))
- self.assert_strict_subtype(self.fx.callable(self.fx.d, self.fx.b),
- self.fx.callable(self.fx.d, self.fx.a))
-
- self.assert_unrelated(self.fx.callable(self.fx.a, self.fx.a),
- self.fx.callable(self.fx.a, self.fx.void))
-
- self.assert_unrelated(
- self.fx.callable(self.fx.a, self.fx.a, self.fx.a),
- self.fx.callable(self.fx.a, self.fx.a))
-
- def test_default_arg_callable_subtyping(self) -> None:
- self.assert_strict_subtype(
- self.fx.callable_default(1, self.fx.a, self.fx.d, self.fx.a),
- self.fx.callable(self.fx.a, self.fx.d, self.fx.a))
-
- self.assert_strict_subtype(
- self.fx.callable_default(1, self.fx.a, self.fx.d, self.fx.a),
- self.fx.callable(self.fx.a, self.fx.a))
-
- self.assert_strict_subtype(
- self.fx.callable_default(0, self.fx.a, self.fx.d, self.fx.a),
- self.fx.callable_default(1, self.fx.a, self.fx.d, self.fx.a))
-
- self.assert_unrelated(
- self.fx.callable_default(1, self.fx.a, self.fx.d, self.fx.a),
- self.fx.callable(self.fx.d, self.fx.d, self.fx.a))
-
- self.assert_unrelated(
- self.fx.callable_default(0, self.fx.a, self.fx.d, self.fx.a),
- self.fx.callable_default(1, self.fx.a, self.fx.a, self.fx.a))
-
- self.assert_unrelated(
- self.fx.callable_default(1, self.fx.a, self.fx.a),
- self.fx.callable(self.fx.a, self.fx.a, self.fx.a))
-
- def test_var_arg_callable_subtyping_1(self) -> None:
- self.assert_strict_subtype(
- self.fx.callable_var_arg(0, self.fx.a, self.fx.a),
- self.fx.callable_var_arg(0, self.fx.b, self.fx.a))
-
- def test_var_arg_callable_subtyping_2(self) -> None:
- self.assert_strict_subtype(
- self.fx.callable_var_arg(0, self.fx.a, self.fx.a),
- self.fx.callable(self.fx.b, self.fx.a))
-
- def test_var_arg_callable_subtyping_3(self) -> None:
- self.assert_strict_subtype(
- self.fx.callable_var_arg(0, self.fx.a, self.fx.a),
- self.fx.callable(self.fx.a))
-
- def test_var_arg_callable_subtyping_4(self) -> None:
- self.assert_strict_subtype(
- self.fx.callable_var_arg(1, self.fx.a, self.fx.d, self.fx.a),
- self.fx.callable(self.fx.b, self.fx.a))
-
- def test_var_arg_callable_subtyping_5(self) -> None:
- self.assert_strict_subtype(
- self.fx.callable_var_arg(0, self.fx.a, self.fx.d, self.fx.a),
- self.fx.callable(self.fx.b, self.fx.a))
-
- def test_var_arg_callable_subtyping_6(self) -> None:
- self.assert_strict_subtype(
- self.fx.callable_var_arg(0, self.fx.a, self.fx.f, self.fx.d),
- self.fx.callable_var_arg(0, self.fx.b, self.fx.e, self.fx.d))
-
- def test_var_arg_callable_subtyping_7(self) -> None:
- self.assert_not_subtype(
- self.fx.callable_var_arg(0, self.fx.b, self.fx.d),
- self.fx.callable(self.fx.a, self.fx.d))
-
- def test_var_arg_callable_subtyping_8(self) -> None:
- self.assert_not_subtype(
- self.fx.callable_var_arg(0, self.fx.b, self.fx.d),
- self.fx.callable_var_arg(0, self.fx.a, self.fx.a, self.fx.d))
- self.assert_subtype(
- self.fx.callable_var_arg(0, self.fx.a, self.fx.d),
- self.fx.callable_var_arg(0, self.fx.b, self.fx.b, self.fx.d))
-
- def test_var_arg_callable_subtyping_9(self) -> None:
- self.assert_not_subtype(
- self.fx.callable_var_arg(0, self.fx.b, self.fx.b, self.fx.d),
- self.fx.callable_var_arg(0, self.fx.a, self.fx.d))
- self.assert_subtype(
- self.fx.callable_var_arg(0, self.fx.a, self.fx.a, self.fx.d),
- self.fx.callable_var_arg(0, self.fx.b, self.fx.d))
-
- def test_type_callable_subtyping(self) -> None:
- self.assert_strict_subtype(
- self.fx.callable_type(self.fx.d, self.fx.a), self.fx.type_type)
-
- self.assert_strict_subtype(
- self.fx.callable_type(self.fx.d, self.fx.b),
- self.fx.callable(self.fx.d, self.fx.a))
-
- self.assert_strict_subtype(self.fx.callable_type(self.fx.a, self.fx.b),
- self.fx.callable(self.fx.a, self.fx.b))
-
- # IDEA: Maybe add these test cases (they are tested pretty well in type
- # checker tests already):
- # * more interface subtyping test cases
- # * more generic interface subtyping test cases
- # * type variables
- # * tuple types
- # * void type
- # * None type
- # * any type
- # * generic function types
-
- def assert_subtype(self, s: Type, t: Type) -> None:
- assert_true(is_subtype(s, t), '{} not subtype of {}'.format(s, t))
-
- def assert_not_subtype(self, s: Type, t: Type) -> None:
- assert_true(not is_subtype(s, t), '{} subtype of {}'.format(s, t))
-
- def assert_strict_subtype(self, s: Type, t: Type) -> None:
- self.assert_subtype(s, t)
- self.assert_not_subtype(t, s)
-
- def assert_equivalent(self, s: Type, t: Type) -> None:
- self.assert_subtype(s, t)
- self.assert_subtype(t, s)
-
- def assert_unrelated(self, s: Type, t: Type) -> None:
- self.assert_not_subtype(s, t)
- self.assert_not_subtype(t, s)
diff --git a/mypy/test/testtransform.py b/mypy/test/testtransform.py
deleted file mode 100644
index 1dac308..0000000
--- a/mypy/test/testtransform.py
+++ /dev/null
@@ -1,85 +0,0 @@
-"""Identity AST transform test cases"""
-
-import os.path
-
-from typing import Dict, List
-
-from mypy import build
-from mypy.build import BuildSource
-from mypy.myunit import Suite
-from mypy.test.helpers import assert_string_arrays_equal, testfile_pyversion
-from mypy.test.data import parse_test_cases, DataDrivenTestCase
-from mypy.test.config import test_data_prefix, test_temp_dir
-from mypy.errors import CompileError
-from mypy.nodes import TypeInfo
-from mypy.treetransform import TransformVisitor
-from mypy.types import Type
-from mypy.options import Options
-
-
-class TransformSuite(Suite):
- # Reuse semantic analysis test cases.
- transform_files = ['semanal-basic.test',
- 'semanal-expressions.test',
- 'semanal-classes.test',
- 'semanal-types.test',
- 'semanal-modules.test',
- 'semanal-statements.test',
- 'semanal-abstractclasses.test',
- 'semanal-python2.test']
-
- def cases(self) -> List[DataDrivenTestCase]:
- c = [] # type: List[DataDrivenTestCase]
- for f in self.transform_files:
- c += parse_test_cases(os.path.join(test_data_prefix, f),
- test_transform,
- base_path=test_temp_dir,
- native_sep=True)
- return c
-
-
-def test_transform(testcase: DataDrivenTestCase) -> None:
- """Perform an identity transform test case."""
-
- try:
- src = '\n'.join(testcase.input)
- options = Options()
- options.use_builtins_fixtures = True
- options.semantic_analysis_only = True
- options.show_traceback = True
- options.python_version = testfile_pyversion(testcase.file)
- result = build.build(sources=[BuildSource('main', None, src)],
- options=options,
- alt_lib_path=test_temp_dir)
- a = result.errors
- if a:
- raise CompileError(a)
- # Include string representations of the source files in the actual
- # output.
- for fnam in sorted(result.files.keys()):
- f = result.files[fnam]
-
- # Omit the builtins module and files with a special marker in the
- # path.
- # TODO the test is not reliable
- if (not f.path.endswith((os.sep + 'builtins.pyi',
- 'typing.pyi',
- 'abc.pyi'))
- and not os.path.basename(f.path).startswith('_')
- and not os.path.splitext(
- os.path.basename(f.path))[0].endswith('_')):
- t = TestTransformVisitor()
- f = t.mypyfile(f)
- a += str(f).split('\n')
- except CompileError as e:
- a = e.messages
- assert_string_arrays_equal(
- testcase.output, a,
- 'Invalid semantic analyzer output ({}, line {})'.format(testcase.file,
- testcase.line))
-
-
-class TestTransformVisitor(TransformVisitor):
- def type(self, type: Type) -> Type:
- assert type is not None
- return type
diff --git a/mypy/test/testtypegen.py b/mypy/test/testtypegen.py
deleted file mode 100644
index a465c71..0000000
--- a/mypy/test/testtypegen.py
+++ /dev/null
@@ -1,128 +0,0 @@
-"""Test cases for the type checker: exporting inferred types"""
-
-import os.path
-import re
-
-from typing import Set, List
-
-from mypy import build
-from mypy.build import BuildSource
-from mypy.myunit import Suite
-from mypy.test import config
-from mypy.test.data import parse_test_cases, DataDrivenTestCase
-from mypy.test.helpers import assert_string_arrays_equal
-from mypy.util import short_type
-from mypy.nodes import (
- NameExpr, TypeVarExpr, CallExpr, Expression, MypyFile, AssignmentStmt, IntExpr
-)
-from mypy.traverser import TraverserVisitor
-from mypy.errors import CompileError
-from mypy.options import Options
-
-
-class TypeExportSuite(Suite):
- # List of files that contain test case descriptions.
- files = ['typexport-basic.test']
-
- def cases(self) -> List[DataDrivenTestCase]:
- c = [] # type: List[DataDrivenTestCase]
- for f in self.files:
- c += parse_test_cases(os.path.join(config.test_data_prefix, f),
- self.run_test, config.test_temp_dir)
- return c
-
- def run_test(self, testcase: DataDrivenTestCase) -> None:
- try:
- line = testcase.input[0]
- mask = ''
- if line.startswith('##'):
- mask = '(' + line[2:].strip() + ')$'
-
- src = '\n'.join(testcase.input)
- options = Options()
- options.use_builtins_fixtures = True
- options.show_traceback = True
- result = build.build(sources=[BuildSource('main', None, src)],
- options=options,
- alt_lib_path=config.test_temp_dir)
- a = result.errors
- map = result.types
- nodes = map.keys()
-
- # Ignore NameExpr nodes of variables with explicit (trivial) types
- # to simplify output.
- searcher = SkippedNodeSearcher()
- for file in result.files.values():
- file.accept(searcher)
- ignored = searcher.nodes
-
- # Filter nodes that should be included in the output.
- keys = []
- for node in nodes:
- if node.line is not None and node.line != -1 and map[node]:
- if ignore_node(node) or node in ignored:
- continue
- if (re.match(mask, short_type(node))
- or (isinstance(node, NameExpr)
- and re.match(mask, node.name))):
- # Include node in output.
- keys.append(node)
-
- for key in sorted(keys,
- key=lambda n: (n.line, short_type(n),
- str(n) + str(map[n]))):
- ts = str(map[key]).replace('*', '') # Remove erased tags
- ts = ts.replace('__main__.', '')
- a.append('{}({}) : {}'.format(short_type(key), key.line, ts))
- except CompileError as e:
- a = e.messages
- assert_string_arrays_equal(
- testcase.output, a,
- 'Invalid type checker output ({}, line {})'.format(testcase.file,
- testcase.line))
-
-
-class SkippedNodeSearcher(TraverserVisitor):
- def __init__(self) -> None:
- self.nodes = set() # type: Set[Expression]
- self.is_typing = False
-
- def visit_mypy_file(self, f: MypyFile) -> None:
- self.is_typing = f.fullname() == 'typing'
- super().visit_mypy_file(f)
-
- def visit_assignment_stmt(self, s: AssignmentStmt) -> None:
- if s.type or ignore_node(s.rvalue):
- for lvalue in s.lvalues:
- if isinstance(lvalue, NameExpr):
- self.nodes.add(lvalue)
- super().visit_assignment_stmt(s)
-
- def visit_name_expr(self, n: NameExpr) -> None:
- self.skip_if_typing(n)
-
- def visit_int_expr(self, n: IntExpr) -> None:
- self.skip_if_typing(n)
-
- def skip_if_typing(self, n: Expression) -> None:
- if self.is_typing:
- self.nodes.add(n)
-
-
-def ignore_node(node: Expression) -> bool:
- """Return True if node is to be omitted from test case output."""
-
- # We want to get rid of object() expressions in the typing module stub
- # and also TypeVar(...) expressions. Since detecting whether a node comes
- # from the typing module is not easy, we just to strip them all away.
- if isinstance(node, TypeVarExpr):
- return True
- if isinstance(node, NameExpr) and node.fullname == 'builtins.object':
- return True
- if isinstance(node, NameExpr) and node.fullname == 'builtins.None':
- return True
- if isinstance(node, CallExpr) and (ignore_node(node.callee) or
- node.analyzed):
- return True
-
- return False
diff --git a/mypy/test/testtypes.py b/mypy/test/testtypes.py
deleted file mode 100644
index 4364848..0000000
--- a/mypy/test/testtypes.py
+++ /dev/null
@@ -1,847 +0,0 @@
-"""Test cases for mypy types and type operations."""
-
-from typing import List, Tuple
-
-from mypy.myunit import (
- Suite, assert_equal, assert_true, assert_false, assert_type
-)
-from mypy.erasetype import erase_type
-from mypy.expandtype import expand_type
-from mypy.join import join_types, join_simple
-from mypy.meet import meet_types
-from mypy.types import (
- UnboundType, AnyType, Void, CallableType, TupleType, TypeVarDef, Type,
- Instance, NoneTyp, ErrorType, Overloaded, TypeType, UnionType, UninhabitedType,
- true_only, false_only, TypeVarId
-)
-from mypy.nodes import ARG_POS, ARG_OPT, ARG_STAR, CONTRAVARIANT, INVARIANT, COVARIANT
-from mypy.subtypes import is_subtype, is_more_precise, is_proper_subtype
-from mypy.typefixture import TypeFixture, InterfaceTypeFixture
-
-
-class TypesSuite(Suite):
- def __init__(self) -> None:
- super().__init__()
- self.x = UnboundType('X') # Helpers
- self.y = UnboundType('Y')
- self.fx = TypeFixture()
- self.function = self.fx.function
-
- def test_any(self) -> None:
- assert_equal(str(AnyType()), 'Any')
-
- def test_simple_unbound_type(self) -> None:
- u = UnboundType('Foo')
- assert_equal(str(u), 'Foo?')
-
- def test_generic_unbound_type(self) -> None:
- u = UnboundType('Foo', [UnboundType('T'), AnyType()])
- assert_equal(str(u), 'Foo?[T?, Any]')
-
- def test_void_type(self) -> None:
- assert_equal(str(Void(None)), 'void')
-
- def test_callable_type(self) -> None:
- c = CallableType([self.x, self.y],
- [ARG_POS, ARG_POS],
- [None, None],
- AnyType(), self.function)
- assert_equal(str(c), 'def (X?, Y?) -> Any')
-
- c2 = CallableType([], [], [], Void(None), None)
- assert_equal(str(c2), 'def ()')
-
- def test_callable_type_with_default_args(self) -> None:
- c = CallableType([self.x, self.y], [ARG_POS, ARG_OPT], [None, None],
- AnyType(), self.function)
- assert_equal(str(c), 'def (X?, Y? =) -> Any')
-
- c2 = CallableType([self.x, self.y], [ARG_OPT, ARG_OPT], [None, None],
- AnyType(), self.function)
- assert_equal(str(c2), 'def (X? =, Y? =) -> Any')
-
- def test_callable_type_with_var_args(self) -> None:
- c = CallableType([self.x], [ARG_STAR], [None], AnyType(), self.function)
- assert_equal(str(c), 'def (*X?) -> Any')
-
- c2 = CallableType([self.x, self.y], [ARG_POS, ARG_STAR],
- [None, None], AnyType(), self.function)
- assert_equal(str(c2), 'def (X?, *Y?) -> Any')
-
- c3 = CallableType([self.x, self.y], [ARG_OPT, ARG_STAR], [None, None],
- AnyType(), self.function)
- assert_equal(str(c3), 'def (X? =, *Y?) -> Any')
-
- def test_tuple_type(self) -> None:
- assert_equal(str(TupleType([], None)), 'Tuple[]')
- assert_equal(str(TupleType([self.x], None)), 'Tuple[X?]')
- assert_equal(str(TupleType([self.x, AnyType()], None)), 'Tuple[X?, Any]')
-
- def test_type_variable_binding(self) -> None:
- assert_equal(str(TypeVarDef('X', 1, None, self.fx.o)), 'X')
- assert_equal(str(TypeVarDef('X', 1, [self.x, self.y], self.fx.o)),
- 'X in (X?, Y?)')
-
- def test_generic_function_type(self) -> None:
- c = CallableType([self.x, self.y], [ARG_POS, ARG_POS], [None, None],
- self.y, self.function, name=None,
- variables=[TypeVarDef('X', -1, None, self.fx.o)])
- assert_equal(str(c), 'def [X] (X?, Y?) -> Y?')
-
- v = [TypeVarDef('Y', -1, None, self.fx.o),
- TypeVarDef('X', -2, None, self.fx.o)]
- c2 = CallableType([], [], [], Void(None), self.function, name=None, variables=v)
- assert_equal(str(c2), 'def [Y, X] ()')
-
-
-class TypeOpsSuite(Suite):
- def set_up(self) -> None:
- self.fx = TypeFixture(INVARIANT)
- self.fx_co = TypeFixture(COVARIANT)
- self.fx_contra = TypeFixture(CONTRAVARIANT)
-
- # expand_type
-
- def test_trivial_expand(self) -> None:
- for t in (self.fx.a, self.fx.o, self.fx.t, self.fx.void, self.fx.nonet,
- self.tuple(self.fx.a),
- self.callable([], self.fx.a, self.fx.a), self.fx.anyt):
- self.assert_expand(t, [], t)
- self.assert_expand(t, [], t)
- self.assert_expand(t, [], t)
-
- def test_expand_naked_type_var(self) -> None:
- self.assert_expand(self.fx.t, [(self.fx.t.id, self.fx.a)], self.fx.a)
- self.assert_expand(self.fx.t, [(self.fx.s.id, self.fx.a)], self.fx.t)
-
- def test_expand_basic_generic_types(self) -> None:
- self.assert_expand(self.fx.gt, [(self.fx.t.id, self.fx.a)], self.fx.ga)
-
- # IDEA: Add test cases for
- # tuple types
- # callable types
- # multiple arguments
-
- def assert_expand(self,
- orig: Type,
- map_items: List[Tuple[TypeVarId, Type]],
- result: Type,
- ) -> None:
- lower_bounds = {}
-
- for id, t in map_items:
- lower_bounds[id] = t
-
- exp = expand_type(orig, lower_bounds)
- # Remove erased tags (asterisks).
- assert_equal(str(exp).replace('*', ''), str(result))
-
- # erase_type
-
- def test_trivial_erase(self) -> None:
- for t in (self.fx.a, self.fx.o, self.fx.void, self.fx.nonet,
- self.fx.anyt, self.fx.err):
- self.assert_erase(t, t)
-
- def test_erase_with_type_variable(self) -> None:
- self.assert_erase(self.fx.t, self.fx.anyt)
-
- def test_erase_with_generic_type(self) -> None:
- self.assert_erase(self.fx.ga, self.fx.gdyn)
- self.assert_erase(self.fx.hab,
- Instance(self.fx.hi, [self.fx.anyt, self.fx.anyt]))
-
- def test_erase_with_tuple_type(self) -> None:
- self.assert_erase(self.tuple(self.fx.a), self.fx.std_tuple)
-
- def test_erase_with_function_type(self) -> None:
- self.assert_erase(self.fx.callable(self.fx.a, self.fx.b),
- self.fx.callable_type(self.fx.void))
-
- def test_erase_with_type_object(self) -> None:
- self.assert_erase(self.fx.callable_type(self.fx.a, self.fx.b),
- self.fx.callable_type(self.fx.void))
-
- def test_erase_with_type_type(self) -> None:
- self.assert_erase(self.fx.type_a, self.fx.type_a)
- self.assert_erase(self.fx.type_t, self.fx.type_any)
-
- def assert_erase(self, orig: Type, result: Type) -> None:
- assert_equal(str(erase_type(orig)), str(result))
-
- # is_more_precise
-
- def test_is_more_precise(self) -> None:
- fx = self.fx
- assert_true(is_more_precise(fx.b, fx.a))
- assert_true(is_more_precise(fx.b, fx.b))
- assert_true(is_more_precise(fx.b, fx.b))
- assert_true(is_more_precise(fx.b, fx.anyt))
- assert_true(is_more_precise(self.tuple(fx.b, fx.a),
- self.tuple(fx.b, fx.a)))
-
- assert_false(is_more_precise(fx.a, fx.b))
- assert_false(is_more_precise(fx.anyt, fx.b))
- assert_false(is_more_precise(self.tuple(fx.b, fx.b),
- self.tuple(fx.b, fx.a)))
-
- # is_proper_subtype
-
- def test_is_proper_subtype(self) -> None:
- fx = self.fx
-
- assert_true(is_proper_subtype(fx.a, fx.a))
- assert_true(is_proper_subtype(fx.b, fx.a))
- assert_true(is_proper_subtype(fx.b, fx.o))
- assert_true(is_proper_subtype(fx.b, fx.o))
-
- assert_false(is_proper_subtype(fx.a, fx.b))
- assert_false(is_proper_subtype(fx.o, fx.b))
-
- assert_true(is_proper_subtype(fx.anyt, fx.anyt))
- assert_false(is_proper_subtype(fx.a, fx.anyt))
- assert_false(is_proper_subtype(fx.anyt, fx.a))
-
- assert_true(is_proper_subtype(fx.ga, fx.ga))
- assert_true(is_proper_subtype(fx.gdyn, fx.gdyn))
- assert_false(is_proper_subtype(fx.ga, fx.gdyn))
- assert_false(is_proper_subtype(fx.gdyn, fx.ga))
-
- assert_true(is_proper_subtype(fx.t, fx.t))
- assert_false(is_proper_subtype(fx.t, fx.s))
-
- def test_is_proper_subtype_covariance(self) -> None:
- fx_co = self.fx_co
-
- assert_true(is_proper_subtype(fx_co.gsab, fx_co.gb))
- assert_true(is_proper_subtype(fx_co.gsab, fx_co.ga))
- assert_false(is_proper_subtype(fx_co.gsaa, fx_co.gb))
- assert_true(is_proper_subtype(fx_co.gb, fx_co.ga))
- assert_false(is_proper_subtype(fx_co.ga, fx_co.gb))
-
- def test_is_proper_subtype_contravariance(self) -> None:
- fx_contra = self.fx_contra
-
- assert_true(is_proper_subtype(fx_contra.gsab, fx_contra.gb))
- assert_false(is_proper_subtype(fx_contra.gsab, fx_contra.ga))
- assert_true(is_proper_subtype(fx_contra.gsaa, fx_contra.gb))
- assert_false(is_proper_subtype(fx_contra.gb, fx_contra.ga))
- assert_true(is_proper_subtype(fx_contra.ga, fx_contra.gb))
-
- def test_is_proper_subtype_invariance(self) -> None:
- fx = self.fx
-
- assert_true(is_proper_subtype(fx.gsab, fx.gb))
- assert_false(is_proper_subtype(fx.gsab, fx.ga))
- assert_false(is_proper_subtype(fx.gsaa, fx.gb))
- assert_false(is_proper_subtype(fx.gb, fx.ga))
- assert_false(is_proper_subtype(fx.ga, fx.gb))
-
- # can_be_true / can_be_false
-
- def test_empty_tuple_always_false(self) -> None:
- tuple_type = self.tuple()
- assert_true(tuple_type.can_be_false)
- assert_false(tuple_type.can_be_true)
-
- def test_nonempty_tuple_always_true(self) -> None:
- tuple_type = self.tuple(AnyType(), AnyType())
- assert_true(tuple_type.can_be_true)
- assert_false(tuple_type.can_be_false)
-
- def test_union_can_be_true_if_any_true(self) -> None:
- union_type = UnionType([self.fx.a, self.tuple()])
- assert_true(union_type.can_be_true)
-
- def test_union_can_not_be_true_if_none_true(self) -> None:
- union_type = UnionType([self.tuple(), self.tuple()])
- assert_false(union_type.can_be_true)
-
- def test_union_can_be_false_if_any_false(self) -> None:
- union_type = UnionType([self.fx.a, self.tuple()])
- assert_true(union_type.can_be_false)
-
- def test_union_can_not_be_false_if_none_false(self) -> None:
- union_type = UnionType([self.tuple(self.fx.a), self.tuple(self.fx.d)])
- assert_false(union_type.can_be_false)
-
- # true_only / false_only
-
- def test_true_only_of_false_type_is_uninhabited(self) -> None:
- to = true_only(NoneTyp())
- assert_type(UninhabitedType, to)
-
- def test_true_only_of_true_type_is_idempotent(self) -> None:
- always_true = self.tuple(AnyType())
- to = true_only(always_true)
- assert_true(always_true is to)
-
- def test_true_only_of_instance(self) -> None:
- to = true_only(self.fx.a)
- assert_equal(str(to), "A")
- assert_true(to.can_be_true)
- assert_false(to.can_be_false)
- assert_type(Instance, to)
- # The original class still can be false
- assert_true(self.fx.a.can_be_false)
-
- def test_true_only_of_union(self) -> None:
- tup_type = self.tuple(AnyType())
- # Union of something that is unknown, something that is always true, something
- # that is always false
- union_type = UnionType([self.fx.a, tup_type, self.tuple()])
- to = true_only(union_type)
- assert isinstance(to, UnionType)
- assert_equal(len(to.items), 2)
- assert_true(to.items[0].can_be_true)
- assert_false(to.items[0].can_be_false)
- assert_true(to.items[1] is tup_type)
-
- def test_false_only_of_true_type_is_uninhabited(self) -> None:
- fo = false_only(self.tuple(AnyType()))
- assert_type(UninhabitedType, fo)
-
- def test_false_only_of_false_type_is_idempotent(self) -> None:
- always_false = NoneTyp()
- fo = false_only(always_false)
- assert_true(always_false is fo)
-
- def test_false_only_of_instance(self) -> None:
- fo = false_only(self.fx.a)
- assert_equal(str(fo), "A")
- assert_false(fo.can_be_true)
- assert_true(fo.can_be_false)
- assert_type(Instance, fo)
- # The original class still can be true
- assert_true(self.fx.a.can_be_true)
-
- def test_false_only_of_union(self) -> None:
- tup_type = self.tuple()
- # Union of something that is unknown, something that is always true, something
- # that is always false
- union_type = UnionType([self.fx.a, self.tuple(AnyType()), tup_type])
- assert_equal(len(union_type.items), 3)
- fo = false_only(union_type)
- assert isinstance(fo, UnionType)
- assert_equal(len(fo.items), 2)
- assert_false(fo.items[0].can_be_true)
- assert_true(fo.items[0].can_be_false)
- assert_true(fo.items[1] is tup_type)
-
- # Helpers
-
- def tuple(self, *a: Type) -> TupleType:
- return TupleType(list(a), self.fx.std_tuple)
-
- def callable(self, vars: List[str], *a: Type) -> CallableType:
- """callable(args, a1, ..., an, r) constructs a callable with
- argument types a1, ... an and return type r and type arguments
- vars.
- """
- tv = [] # type: List[TypeVarDef]
- n = -1
- for v in vars:
- tv.append(TypeVarDef(v, n, None, self.fx.o))
- n -= 1
- return CallableType(list(a[:-1]),
- [ARG_POS] * (len(a) - 1),
- [None] * (len(a) - 1),
- a[-1],
- self.fx.function,
- name=None,
- variables=tv)
-
-
-class JoinSuite(Suite):
- def set_up(self) -> None:
- self.fx = TypeFixture()
-
- def test_trivial_cases(self) -> None:
- for simple in self.fx.void, self.fx.a, self.fx.o, self.fx.b:
- self.assert_join(simple, simple, simple)
-
- def test_class_subtyping(self) -> None:
- self.assert_join(self.fx.a, self.fx.o, self.fx.o)
- self.assert_join(self.fx.b, self.fx.o, self.fx.o)
- self.assert_join(self.fx.a, self.fx.d, self.fx.o)
- self.assert_join(self.fx.b, self.fx.c, self.fx.a)
- self.assert_join(self.fx.b, self.fx.d, self.fx.o)
-
- def test_tuples(self) -> None:
- self.assert_join(self.tuple(), self.tuple(), self.tuple())
- self.assert_join(self.tuple(self.fx.a),
- self.tuple(self.fx.a),
- self.tuple(self.fx.a))
- self.assert_join(self.tuple(self.fx.b, self.fx.c),
- self.tuple(self.fx.a, self.fx.d),
- self.tuple(self.fx.a, self.fx.o))
-
- self.assert_join(self.tuple(self.fx.a, self.fx.a),
- self.fx.std_tuple,
- self.fx.o)
- self.assert_join(self.tuple(self.fx.a),
- self.tuple(self.fx.a, self.fx.a),
- self.fx.o)
-
- def test_function_types(self) -> None:
- self.assert_join(self.callable(self.fx.a, self.fx.b),
- self.callable(self.fx.a, self.fx.b),
- self.callable(self.fx.a, self.fx.b))
-
- self.assert_join(self.callable(self.fx.a, self.fx.b),
- self.callable(self.fx.b, self.fx.b),
- self.fx.function)
- self.assert_join(self.callable(self.fx.a, self.fx.b),
- self.callable(self.fx.a, self.fx.a),
- self.fx.function)
- self.assert_join(self.callable(self.fx.a, self.fx.b),
- self.fx.function,
- self.fx.function)
-
- def test_type_vars(self) -> None:
- self.assert_join(self.fx.t, self.fx.t, self.fx.t)
- self.assert_join(self.fx.s, self.fx.s, self.fx.s)
- self.assert_join(self.fx.t, self.fx.s, self.fx.o)
-
- def test_void(self) -> None:
- self.assert_join(self.fx.void, self.fx.void, self.fx.void)
- self.assert_join(self.fx.void, self.fx.anyt, self.fx.anyt)
-
- # Join of any other type against void results in ErrorType, since there
- # is no other meaningful result.
- for t in [self.fx.a, self.fx.o, NoneTyp(), UnboundType('x'),
- self.fx.t, self.tuple(),
- self.callable(self.fx.a, self.fx.b)]:
- self.assert_join(t, self.fx.void, self.fx.err)
-
- def test_none(self) -> None:
- # Any type t joined with None results in t.
- for t in [NoneTyp(), self.fx.a, self.fx.o, UnboundType('x'),
- self.fx.t, self.tuple(),
- self.callable(self.fx.a, self.fx.b), self.fx.anyt]:
- self.assert_join(t, NoneTyp(), t)
-
- def test_unbound_type(self) -> None:
- self.assert_join(UnboundType('x'), UnboundType('x'), self.fx.anyt)
- self.assert_join(UnboundType('x'), UnboundType('y'), self.fx.anyt)
-
- # Any type t joined with an unbound type results in dynamic. Unbound
- # type means that there is an error somewhere in the program, so this
- # does not affect type safety (whatever the result).
- for t in [self.fx.a, self.fx.o, self.fx.ga, self.fx.t, self.tuple(),
- self.callable(self.fx.a, self.fx.b)]:
- self.assert_join(t, UnboundType('X'), self.fx.anyt)
-
- def test_any_type(self) -> None:
- # Join against 'Any' type always results in 'Any'.
- for t in [self.fx.anyt, self.fx.a, self.fx.o, NoneTyp(),
- UnboundType('x'), self.fx.void, self.fx.t, self.tuple(),
- self.callable(self.fx.a, self.fx.b)]:
- self.assert_join(t, self.fx.anyt, self.fx.anyt)
-
- def test_mixed_truth_restricted_type_simple(self) -> None:
- # join_simple against differently restricted truthiness types drops restrictions.
- true_a = true_only(self.fx.a)
- false_o = false_only(self.fx.o)
- j = join_simple(self.fx.o, true_a, false_o)
- assert_true(j.can_be_true)
- assert_true(j.can_be_false)
-
- def test_mixed_truth_restricted_type(self) -> None:
- # join_types against differently restricted truthiness types drops restrictions.
- true_any = true_only(AnyType())
- false_o = false_only(self.fx.o)
- j = join_types(true_any, false_o)
- assert_true(j.can_be_true)
- assert_true(j.can_be_false)
-
- def test_other_mixed_types(self) -> None:
- # In general, joining unrelated types produces object.
- for t1 in [self.fx.a, self.fx.t, self.tuple(),
- self.callable(self.fx.a, self.fx.b)]:
- for t2 in [self.fx.a, self.fx.t, self.tuple(),
- self.callable(self.fx.a, self.fx.b)]:
- if str(t1) != str(t2):
- self.assert_join(t1, t2, self.fx.o)
-
- def test_error_type(self) -> None:
- self.assert_join(self.fx.err, self.fx.anyt, self.fx.anyt)
-
- # Meet against any type except dynamic results in ErrorType.
- for t in [self.fx.a, self.fx.o, NoneTyp(), UnboundType('x'),
- self.fx.void, self.fx.t, self.tuple(),
- self.callable(self.fx.a, self.fx.b)]:
- self.assert_join(t, self.fx.err, self.fx.err)
-
- def test_simple_generics(self) -> None:
- self.assert_join(self.fx.ga, self.fx.ga, self.fx.ga)
- self.assert_join(self.fx.ga, self.fx.gb, self.fx.ga)
- self.assert_join(self.fx.ga, self.fx.gd, self.fx.o)
- self.assert_join(self.fx.ga, self.fx.g2a, self.fx.o)
-
- self.assert_join(self.fx.ga, self.fx.nonet, self.fx.ga)
- self.assert_join(self.fx.ga, self.fx.anyt, self.fx.anyt)
-
- for t in [self.fx.a, self.fx.o, self.fx.t, self.tuple(),
- self.callable(self.fx.a, self.fx.b)]:
- self.assert_join(t, self.fx.ga, self.fx.o)
-
- def test_generics_with_multiple_args(self) -> None:
- self.assert_join(self.fx.hab, self.fx.hab, self.fx.hab)
- self.assert_join(self.fx.hab, self.fx.hbb, self.fx.hab)
- self.assert_join(self.fx.had, self.fx.haa, self.fx.o)
-
- def test_generics_with_inheritance(self) -> None:
- self.assert_join(self.fx.gsab, self.fx.gb, self.fx.gb)
- self.assert_join(self.fx.gsba, self.fx.gb, self.fx.ga)
- self.assert_join(self.fx.gsab, self.fx.gd, self.fx.o)
-
- def test_generics_with_inheritance_and_shared_supertype(self) -> None:
- self.assert_join(self.fx.gsba, self.fx.gs2a, self.fx.ga)
- self.assert_join(self.fx.gsab, self.fx.gs2a, self.fx.ga)
- self.assert_join(self.fx.gsab, self.fx.gs2d, self.fx.o)
-
- def test_generic_types_and_any(self) -> None:
- self.assert_join(self.fx.gdyn, self.fx.ga, self.fx.gdyn)
-
- def test_callables_with_any(self) -> None:
- self.assert_join(self.callable(self.fx.a, self.fx.a, self.fx.anyt,
- self.fx.a),
- self.callable(self.fx.a, self.fx.anyt, self.fx.a,
- self.fx.anyt),
- self.callable(self.fx.a, self.fx.anyt, self.fx.anyt,
- self.fx.anyt))
-
- def test_overloaded(self) -> None:
- c = self.callable
-
- def ov(*items: CallableType) -> Overloaded:
- return Overloaded(list(items))
-
- fx = self.fx
- func = fx.function
- c1 = c(fx.a, fx.a)
- c2 = c(fx.b, fx.b)
- c3 = c(fx.c, fx.c)
- self.assert_join(ov(c1, c2), c1, c1)
- self.assert_join(ov(c1, c2), c2, c2)
- self.assert_join(ov(c1, c2), ov(c1, c2), ov(c1, c2))
- self.assert_join(ov(c1, c2), ov(c1, c3), c1)
- self.assert_join(ov(c2, c1), ov(c3, c1), c1)
- self.assert_join(ov(c1, c2), c3, func)
-
- def test_overloaded_with_any(self) -> None:
- c = self.callable
-
- def ov(*items: CallableType) -> Overloaded:
- return Overloaded(list(items))
-
- fx = self.fx
- any = fx.anyt
- self.assert_join(ov(c(fx.a, fx.a), c(fx.b, fx.b)), c(any, fx.b), c(any, fx.b))
- self.assert_join(ov(c(fx.a, fx.a), c(any, fx.b)), c(fx.b, fx.b), c(any, fx.b))
-
- def test_join_interface_types(self) -> None:
- self.skip() # FIX
- self.assert_join(self.fx.f, self.fx.f, self.fx.f)
- self.assert_join(self.fx.f, self.fx.f2, self.fx.o)
- self.assert_join(self.fx.f, self.fx.f3, self.fx.f)
-
- def test_join_interface_and_class_types(self) -> None:
- self.skip() # FIX
-
- self.assert_join(self.fx.o, self.fx.f, self.fx.o)
- self.assert_join(self.fx.a, self.fx.f, self.fx.o)
-
- self.assert_join(self.fx.e, self.fx.f, self.fx.f)
-
- def test_join_class_types_with_interface_result(self) -> None:
- self.skip() # FIX
- # Unique result
- self.assert_join(self.fx.e, self.fx.e2, self.fx.f)
-
- # Ambiguous result
- self.assert_join(self.fx.e2, self.fx.e3, self.fx.err)
-
- def test_generic_interfaces(self) -> None:
- self.skip() # FIX
-
- fx = InterfaceTypeFixture()
-
- self.assert_join(fx.gfa, fx.gfa, fx.gfa)
- self.assert_join(fx.gfa, fx.gfb, fx.o)
-
- self.assert_join(fx.m1, fx.gfa, fx.gfa)
-
- self.assert_join(fx.m1, fx.gfb, fx.o)
-
- def test_simple_type_objects(self) -> None:
- t1 = self.type_callable(self.fx.a, self.fx.a)
- t2 = self.type_callable(self.fx.b, self.fx.b)
-
- self.assert_join(t1, t1, t1)
- j = join_types(t1, t1)
- assert isinstance(j, CallableType)
- assert_true(j.is_type_obj())
-
- self.assert_join(t1, t2, self.fx.type_type)
- self.assert_join(t1, self.fx.type_type, self.fx.type_type)
- self.assert_join(self.fx.type_type, self.fx.type_type,
- self.fx.type_type)
-
- def test_type_type(self) -> None:
- self.assert_join(self.fx.type_a, self.fx.type_b, self.fx.type_a)
- self.assert_join(self.fx.type_b, self.fx.type_any, self.fx.type_any)
- self.assert_join(self.fx.type_b, self.fx.type_type, self.fx.type_type)
- self.assert_join(self.fx.type_b, self.fx.type_c, self.fx.type_a)
- self.assert_join(self.fx.type_c, self.fx.type_d, TypeType(self.fx.o))
- self.assert_join(self.fx.type_type, self.fx.type_any, self.fx.type_type)
- self.assert_join(self.fx.type_b, self.fx.anyt, self.fx.anyt)
-
- # There are additional test cases in check-inference.test.
-
- # TODO: Function types + varargs and default args.
-
- def assert_join(self, s: Type, t: Type, join: Type) -> None:
- self.assert_simple_join(s, t, join)
- self.assert_simple_join(t, s, join)
-
- def assert_simple_join(self, s: Type, t: Type, join: Type) -> None:
- result = join_types(s, t)
- actual = str(result)
- expected = str(join)
- assert_equal(actual, expected,
- 'join({}, {}) == {{}} ({{}} expected)'.format(s, t))
- if not isinstance(s, ErrorType) and not isinstance(result, ErrorType):
- assert_true(is_subtype(s, result),
- '{} not subtype of {}'.format(s, result))
- if not isinstance(t, ErrorType) and not isinstance(result, ErrorType):
- assert_true(is_subtype(t, result),
- '{} not subtype of {}'.format(t, result))
-
- def tuple(self, *a: Type) -> TupleType:
- return TupleType(list(a), self.fx.std_tuple)
-
- def callable(self, *a: Type) -> CallableType:
- """callable(a1, ..., an, r) constructs a callable with argument types
- a1, ... an and return type r.
- """
- n = len(a) - 1
- return CallableType(list(a[:-1]), [ARG_POS] * n, [None] * n,
- a[-1], self.fx.function)
-
- def type_callable(self, *a: Type) -> CallableType:
- """type_callable(a1, ..., an, r) constructs a callable with
- argument types a1, ... an and return type r, and which
- represents a type.
- """
- n = len(a) - 1
- return CallableType(list(a[:-1]), [ARG_POS] * n, [None] * n,
- a[-1], self.fx.type_type)
-
-
-class MeetSuite(Suite):
- def set_up(self) -> None:
- self.fx = TypeFixture()
-
- def test_trivial_cases(self) -> None:
- for simple in self.fx.void, self.fx.a, self.fx.o, self.fx.b:
- self.assert_meet(simple, simple, simple)
-
- def test_class_subtyping(self) -> None:
- self.assert_meet(self.fx.a, self.fx.o, self.fx.a)
- self.assert_meet(self.fx.a, self.fx.b, self.fx.b)
- self.assert_meet(self.fx.b, self.fx.o, self.fx.b)
- self.assert_meet(self.fx.a, self.fx.d, NoneTyp())
- self.assert_meet(self.fx.b, self.fx.c, NoneTyp())
-
- def test_tuples(self) -> None:
- self.assert_meet(self.tuple(), self.tuple(), self.tuple())
- self.assert_meet(self.tuple(self.fx.a),
- self.tuple(self.fx.a),
- self.tuple(self.fx.a))
- self.assert_meet(self.tuple(self.fx.b, self.fx.c),
- self.tuple(self.fx.a, self.fx.d),
- self.tuple(self.fx.b, NoneTyp()))
-
- self.assert_meet(self.tuple(self.fx.a, self.fx.a),
- self.fx.std_tuple,
- NoneTyp())
- self.assert_meet(self.tuple(self.fx.a),
- self.tuple(self.fx.a, self.fx.a),
- NoneTyp())
-
- def test_function_types(self) -> None:
- self.assert_meet(self.callable(self.fx.a, self.fx.b),
- self.callable(self.fx.a, self.fx.b),
- self.callable(self.fx.a, self.fx.b))
-
- self.assert_meet(self.callable(self.fx.a, self.fx.b),
- self.callable(self.fx.b, self.fx.b),
- NoneTyp())
- self.assert_meet(self.callable(self.fx.a, self.fx.b),
- self.callable(self.fx.a, self.fx.a),
- NoneTyp())
-
- def test_type_vars(self) -> None:
- self.assert_meet(self.fx.t, self.fx.t, self.fx.t)
- self.assert_meet(self.fx.s, self.fx.s, self.fx.s)
- self.assert_meet(self.fx.t, self.fx.s, NoneTyp())
-
- def test_void(self) -> None:
- self.assert_meet(self.fx.void, self.fx.void, self.fx.void)
- self.assert_meet(self.fx.void, self.fx.anyt, self.fx.void)
-
- # Meet of any other type against void results in ErrorType, since there
- # is no meaningful valid result.
- for t in [self.fx.a, self.fx.o, UnboundType('x'), NoneTyp(),
- self.fx.t, self.tuple(),
- self.callable(self.fx.a, self.fx.b)]:
- self.assert_meet(t, self.fx.void, self.fx.err)
-
- def test_none(self) -> None:
- self.assert_meet(NoneTyp(), NoneTyp(), NoneTyp())
-
- self.assert_meet(NoneTyp(), self.fx.anyt, NoneTyp())
- self.assert_meet(NoneTyp(), self.fx.void, self.fx.err)
-
- # Any type t joined with None results in None, unless t is any or
- # void.
- for t in [self.fx.a, self.fx.o, UnboundType('x'), self.fx.t,
- self.tuple(), self.callable(self.fx.a, self.fx.b)]:
- self.assert_meet(t, NoneTyp(), NoneTyp())
-
- def test_unbound_type(self) -> None:
- self.assert_meet(UnboundType('x'), UnboundType('x'), self.fx.anyt)
- self.assert_meet(UnboundType('x'), UnboundType('y'), self.fx.anyt)
-
- self.assert_meet(UnboundType('x'), self.fx.void, self.fx.err)
- self.assert_meet(UnboundType('x'), self.fx.anyt, UnboundType('x'))
-
- # The meet of any type t with an unbound type results in dynamic
- # (except for void). Unbound type means that there is an error
- # somewhere in the program, so this does not affect type safety.
- for t in [self.fx.a, self.fx.o, self.fx.t, self.tuple(),
- self.callable(self.fx.a, self.fx.b)]:
- self.assert_meet(t, UnboundType('X'), self.fx.anyt)
-
- def test_dynamic_type(self) -> None:
- # Meet against dynamic type always results in dynamic.
- for t in [self.fx.anyt, self.fx.a, self.fx.o, NoneTyp(),
- UnboundType('x'), self.fx.void, self.fx.t, self.tuple(),
- self.callable(self.fx.a, self.fx.b)]:
- self.assert_meet(t, self.fx.anyt, t)
-
- def test_error_type(self) -> None:
- self.assert_meet(self.fx.err, self.fx.anyt, self.fx.err)
-
- # Meet against any type except dynamic results in ErrorType.
- for t in [self.fx.a, self.fx.o, NoneTyp(), UnboundType('x'),
- self.fx.void, self.fx.t, self.tuple(),
- self.callable(self.fx.a, self.fx.b)]:
- self.assert_meet(t, self.fx.err, self.fx.err)
-
- def test_simple_generics(self) -> None:
- self.assert_meet(self.fx.ga, self.fx.ga, self.fx.ga)
- self.assert_meet(self.fx.ga, self.fx.o, self.fx.ga)
- self.assert_meet(self.fx.ga, self.fx.gb, self.fx.gb)
- self.assert_meet(self.fx.ga, self.fx.gd, self.fx.nonet)
- self.assert_meet(self.fx.ga, self.fx.g2a, self.fx.nonet)
-
- self.assert_meet(self.fx.ga, self.fx.nonet, self.fx.nonet)
- self.assert_meet(self.fx.ga, self.fx.anyt, self.fx.ga)
-
- for t in [self.fx.a, self.fx.t, self.tuple(),
- self.callable(self.fx.a, self.fx.b)]:
- self.assert_meet(t, self.fx.ga, self.fx.nonet)
-
- def test_generics_with_multiple_args(self) -> None:
- self.assert_meet(self.fx.hab, self.fx.hab, self.fx.hab)
- self.assert_meet(self.fx.hab, self.fx.haa, self.fx.hab)
- self.assert_meet(self.fx.hab, self.fx.had, self.fx.nonet)
- self.assert_meet(self.fx.hab, self.fx.hbb, self.fx.hbb)
-
- def test_generics_with_inheritance(self) -> None:
- self.assert_meet(self.fx.gsab, self.fx.gb, self.fx.gsab)
- self.assert_meet(self.fx.gsba, self.fx.gb, self.fx.nonet)
-
- def test_generics_with_inheritance_and_shared_supertype(self) -> None:
- self.assert_meet(self.fx.gsba, self.fx.gs2a, self.fx.nonet)
- self.assert_meet(self.fx.gsab, self.fx.gs2a, self.fx.nonet)
-
- def test_generic_types_and_dynamic(self) -> None:
- self.assert_meet(self.fx.gdyn, self.fx.ga, self.fx.ga)
-
- def test_callables_with_dynamic(self) -> None:
- self.assert_meet(self.callable(self.fx.a, self.fx.a, self.fx.anyt,
- self.fx.a),
- self.callable(self.fx.a, self.fx.anyt, self.fx.a,
- self.fx.anyt),
- self.callable(self.fx.a, self.fx.anyt, self.fx.anyt,
- self.fx.anyt))
-
- def test_meet_interface_types(self) -> None:
- self.assert_meet(self.fx.f, self.fx.f, self.fx.f)
- self.assert_meet(self.fx.f, self.fx.f2, self.fx.nonet)
- self.assert_meet(self.fx.f, self.fx.f3, self.fx.f3)
-
- def test_meet_interface_and_class_types(self) -> None:
- self.assert_meet(self.fx.o, self.fx.f, self.fx.f)
- self.assert_meet(self.fx.a, self.fx.f, self.fx.nonet)
-
- self.assert_meet(self.fx.e, self.fx.f, self.fx.e)
-
- def test_meet_class_types_with_shared_interfaces(self) -> None:
- # These have nothing special with respect to meets, unlike joins. These
- # are for completeness only.
- self.assert_meet(self.fx.e, self.fx.e2, self.fx.nonet)
- self.assert_meet(self.fx.e2, self.fx.e3, self.fx.nonet)
-
- def test_meet_with_generic_interfaces(self) -> None:
- # TODO fix
- self.skip()
-
- fx = InterfaceTypeFixture()
- self.assert_meet(fx.gfa, fx.m1, fx.m1)
- self.assert_meet(fx.gfa, fx.gfa, fx.gfa)
- self.assert_meet(fx.gfb, fx.m1, fx.nonet)
-
- def test_type_type(self) -> None:
- self.assert_meet(self.fx.type_a, self.fx.type_b, self.fx.type_b)
- self.assert_meet(self.fx.type_b, self.fx.type_any, self.fx.type_b)
- self.assert_meet(self.fx.type_b, self.fx.type_type, self.fx.type_b)
- self.assert_meet(self.fx.type_b, self.fx.type_c, self.fx.nonet)
- self.assert_meet(self.fx.type_c, self.fx.type_d, self.fx.nonet)
- self.assert_meet(self.fx.type_type, self.fx.type_any, self.fx.type_any)
- self.assert_meet(self.fx.type_b, self.fx.anyt, self.fx.type_b)
-
- # FIX generic interfaces + ranges
-
- def assert_meet(self, s: Type, t: Type, meet: Type) -> None:
- self.assert_simple_meet(s, t, meet)
- self.assert_simple_meet(t, s, meet)
-
- def assert_simple_meet(self, s: Type, t: Type, meet: Type) -> None:
- result = meet_types(s, t)
- actual = str(result)
- expected = str(meet)
- assert_equal(actual, expected,
- 'meet({}, {}) == {{}} ({{}} expected)'.format(s, t))
- if not isinstance(s, ErrorType) and not isinstance(result, ErrorType):
- assert_true(is_subtype(result, s),
- '{} not subtype of {}'.format(result, s))
- if not isinstance(t, ErrorType) and not isinstance(result, ErrorType):
- assert_true(is_subtype(result, t),
- '{} not subtype of {}'.format(result, t))
-
- def tuple(self, *a: Type) -> TupleType:
- return TupleType(list(a), self.fx.std_tuple)
-
- def callable(self, *a: Type) -> CallableType:
- """callable(a1, ..., an, r) constructs a callable with argument types
- a1, ... an and return type r.
- """
- n = len(a) - 1
- return CallableType(list(a[:-1]),
- [ARG_POS] * n, [None] * n,
- a[-1], self.fx.function)
diff --git a/mypy_self_check.ini b/mypy_self_check.ini
deleted file mode 100644
index 3d54bd3..0000000
--- a/mypy_self_check.ini
+++ /dev/null
@@ -1,15 +0,0 @@
-[mypy]
-disallow_untyped_defs = True
-
-; historical exceptions
-[mypy-mypy.test.testextensions]
-disallow_untyped_defs = False
-
-[mypy-mypy.test.testlex]
-disallow_untyped_defs = False
-
-[mypy-mypy.test.data]
-disallow_untyped_defs = False
-
-[mypy-mypy.typefixture]
-disallow_untyped_defs = False
diff --git a/mypy_strict_optional.ini b/mypy_strict_optional.ini
deleted file mode 100644
index 3b7d272..0000000
--- a/mypy_strict_optional.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-; Mypy is run both with and without this config file in CI.
-; This allows us to make mypy strict Optional compliant over time.
-[mypy]
-strict_optional = True
-ignore_errors = True
diff --git a/pinfer/.gitignore b/pinfer/.gitignore
deleted file mode 100644
index e1dace5..0000000
--- a/pinfer/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-__pycache__
-*~
-*.pyc
diff --git a/pinfer/LICENSE b/pinfer/LICENSE
deleted file mode 100644
index ecdce98..0000000
--- a/pinfer/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-pinfer is licensed under the terms of the MIT license, reproduced below.
-
-= = = = =
-
-The MIT License
-
-Copyright (c) 2013, 2014 Jukka Lehtosalo
-
-Permission is hereby granted, free of charge, to any person obtaining a
-copy of this software and associated documentation files (the "Software"),
-to deal in the Software without restriction, including without limitation
-the rights to use, copy, modify, merge, publish, distribute, sublicense,
-and/or sell copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-= = = = =
diff --git a/pinfer/README b/pinfer/README
deleted file mode 100644
index 1f4fe4c..0000000
--- a/pinfer/README
+++ /dev/null
@@ -1,47 +0,0 @@
-ReadMe for pinfer
-=================
-
-Introduction
-------------
-
-Pinfer is tool for runtime type inference of variable types and
-function signatures in Python programs. The inferred types are mostly
-compatible with mypy types. It is intended for coming up with draft
-types when migrating Python code to static typing, but it can also be
-used as a code understanding or analysis tool.
-
-Pinfer is very experimental!
-
-Requirements
-------------
-
- * Python 3.2 or later
-
-Basic usage
------------
-
-To infer types of all functions and methods in a module:
-
- import foo # target module
- import pinfer
-
- # set up type inference and dumping
- pinfer.infer_module(foo)
- pinfer.dump_at_exit()
-
- # now do something with the module, e.g. run tests
-
-For inferring a Python module, add the above lines to the test suite.
-
-Handy wrapper
--------------
-
-The p.py script provides a handy wrapper for the above.
-
-
-Copyright
--------------
-
-This project includes files from the open source CPython project. Those files are Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
-2011, 2012, 2013, 2014 Python Software Foundation; All Rights Reserved. The license can be found at https://github.com/python/cpython/blob/master/LICENSE.
-
diff --git a/pinfer/inspect3.py b/pinfer/inspect3.py
deleted file mode 100644
index 4d74be1..0000000
--- a/pinfer/inspect3.py
+++ /dev/null
@@ -1,122 +0,0 @@
-# from Python 3's inspect.py
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
-# 2011, 2012, 2013, 2014 Python Software Foundation; All Rights Reserved
-'''
-provide getfullargspec() and getcallargs() for Python 2
-'''
-
-import sys
-import inspect
-
-if sys.version_info.major == 2:
-
- def getfullargspec(func):
- (args, varargs, keywords, defaults) = inspect.getargspec(func)
- return (args, varargs, keywords, defaults, [], [], {})
-
-
- def getcallargs(*func_and_positional, **named):
- """Get the mapping of arguments to values.
-
- A dict is returned, with keys the function argument names (including the
- names of the * and ** arguments, if any), and values the respective bound
- values from 'positional' and 'named'."""
- func = func_and_positional[0]
- positional = func_and_positional[1:]
- spec = getfullargspec(func)
- args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, ann = spec
- f_name = func.__name__
- arg2value = {}
-
-
- if inspect.ismethod(func) and func.__self__ is not None:
- # implicit 'self' (or 'cls' for classmethods) argument
- positional = (func.__self__,) + positional
- num_pos = len(positional)
- num_args = len(args)
- num_defaults = len(defaults) if defaults else 0
-
- n = min(num_pos, num_args)
- for i in range(n):
- arg2value[args[i]] = positional[i]
- if varargs:
- arg2value[varargs] = tuple(positional[n:])
- possible_kwargs = set(args + kwonlyargs)
- if varkw:
- arg2value[varkw] = {}
- for kw, value in named.items():
- if kw not in possible_kwargs:
- if not varkw:
- raise TypeError("%s() got an unexpected keyword argument %r" %
- (f_name, kw))
- arg2value[varkw][kw] = value
- continue
- if kw in arg2value:
- raise TypeError("%s() got multiple values for argument %r" %
- (f_name, kw))
- arg2value[kw] = value
- if num_pos > num_args and not varargs:
- _too_many(f_name, args, kwonlyargs, varargs, num_defaults,
- num_pos, arg2value)
- if num_pos < num_args:
- req = args[:num_args - num_defaults]
- for arg in req:
- if arg not in arg2value:
- _missing_arguments(f_name, req, True, arg2value)
- for i, arg in enumerate(args[num_args - num_defaults:]):
- if arg not in arg2value:
- arg2value[arg] = defaults[i]
- missing = 0
- for kwarg in kwonlyargs:
- if kwarg not in arg2value:
- if kwonlydefaults and kwarg in kwonlydefaults:
- arg2value[kwarg] = kwonlydefaults[kwarg]
- else:
- missing += 1
- if missing:
- _missing_arguments(f_name, kwonlyargs, False, arg2value)
- return arg2value
-
-
- def _too_many(f_name, args, kwonly, varargs, defcount, given, values):
- atleast = len(args) - defcount
- kwonly_given = len([arg for arg in kwonly if arg in values])
- if varargs:
- plural = atleast != 1
- sig = "at least %d" % (atleast,)
- elif defcount:
- plural = True
- sig = "from %d to %d" % (atleast, len(args))
- else:
- plural = len(args) != 1
- sig = str(len(args))
- kwonly_sig = ""
- if kwonly_given:
- msg = " positional argument%s (and %d keyword-only argument%s)"
- kwonly_sig = (msg % ("s" if given != 1 else "", kwonly_given,
- "s" if kwonly_given != 1 else ""))
- raise TypeError("%s() takes %s positional argument%s but %d%s %s given" %
- (f_name, sig, "s" if plural else "", given, kwonly_sig,
- "was" if given == 1 and not kwonly_given else "were"))
-
-
- def _missing_arguments(f_name, argnames, pos, values):
- names = [repr(name) for name in argnames if name not in values]
- missing = len(names)
- if missing == 1:
- s = names[0]
- elif missing == 2:
- s = "{} and {}".format(*names)
- else:
- tail = ", {} and {}".format(*names[-2:])
- del names[-2:]
- s = ", ".join(names) + tail
- raise TypeError("%s() missing %i required %s argument%s: %s" %
- (f_name, missing,
- "positional" if pos else "keyword-only",
- "" if missing == 1 else "s", s))
-
-
-else:
- getfullargspec = inspect.getfullargspec
- getcallargs = inspect.getcallargs
diff --git a/pinfer/p.py b/pinfer/p.py
deleted file mode 100644
index 451038d..0000000
--- a/pinfer/p.py
+++ /dev/null
@@ -1,83 +0,0 @@
-#!/usr/bin/env python3
-"""Stub to run pinfer on a module.
-
-Usage:
-
- p.py targetmod testfile [outfile] [ -- testargs]
-
-Where:
-
- targetmod: the full target module (e.g. textwrap)
- testfile: the full test module file (e.g. test/test_textwrap.py)
- outfile: where to write the annotated module. If unspecified, will
- write stubs at end of stdout.
-
-Example invocation:
-
- python3 p.py textwrap test/test_textwrap.py
-"""
-
-
-import sys
-import imp
-import pinfer
-import os
-import atexit
-import inspect
-
-iport = __builtins__.__import__
-watched = set()
-
-
-def inferring_import(*args, **kwargs):
- module = iport(*args, **kwargs)
- if module not in watched:
- watched.add(module)
- pinfer.infer_module(module)
- return module
-
-
-def main():
- if '--' in sys.argv:
- argslen = sys.argv.index('--')
- else:
- argslen = len(sys.argv)
- args = sys.argv[1:argslen]
- del sys.argv[1:argslen + 1]
-
- if len(args) == 2:
- targetpackage, testfile = args
- outfile = None
- elif len(args) == 3:
- targetpackage, testfile, outfile = args
- else:
- sys.stderr.write('Usage: %s targetmodule testfile [outfile] [ -- testargs]\n' %
- sys.argv[0])
- sys.exit(2)
-
- # help us with local imports
- filemodule = os.path.dirname(os.path.abspath(testfile))
- sys.path.append(filemodule)
-
- targetmod = __import__(targetpackage)
- targetfile = inspect.getfile(targetmod)
- pinfer.infer_module(targetmod)
-
- if outfile:
- @atexit.register
- def rewrite_file(targetfile=targetfile, outfile=outfile, pinfer=pinfer):
- if targetfile.endswith(".pyc"):
- targetfile = targetfile[0:-1]
- annotated = pinfer.annotate_file(targetfile)
- open(outfile, "w").write(annotated)
- else:
- pinfer.dump_at_exit()
-
- pinfer.ignore_files.add(os.path.abspath(testfile))
-
- # run testfile as main
- del sys.modules['__main__']
- imp.load_source('__main__', testfile)
-
-if __name__ == '__main__':
- main()
diff --git a/pinfer/pinfer.py b/pinfer/pinfer.py
deleted file mode 100644
index 3dd1445..0000000
--- a/pinfer/pinfer.py
+++ /dev/null
@@ -1,686 +0,0 @@
-"""Tools for runtime type inference"""
-
-import inspect
-from inspect3 import getfullargspec, getcallargs
-import types
-import codecs
-import os
-import tokenize
-try:
- from StringIO import StringIO
- from unparse import Unparser
-except:
- from io import StringIO
- from unparse3 import Unparser
-import ast
-
-
-MAX_INFERRED_TUPLE_LENGTH = 10
-PREFERRED_LINE_LENGTH = 79
-
-
-var_db = {} # (location, variable) -> type
-func_argid_db = {} # funcid -> argspec
-func_arg_db = {} # (funcid, name) -> type
-func_return_db = {} # funcname -> type
-func_source_db = {} # funcid -> source string
-#func_info_db = {} # funcid -> (class, name, argspec, file, line, source)
-ignore_files = set()
-
-# The type inferencing wrapper should not be reentrant. It's not, in theory, calling
-# out to any external code which we would want to infer the types of. However,
-# sometimes we do something like infer_type(arg.keys()) or infer_type(arg.values()) if
-# the arg is a collection, and we want to know about the types of its elements. .keys(),
-# .values(), etc. can be overloaded, possibly to a method we've wrapped. This can become
-# infinitely recursive, particularly because on something like arg.keys(), keys() gets passed
-# arg as the first parameter, so if we've wrapped keys() we'll try to infer_type(arg),
-# which will detect it's a dictionary, call infer_type(arg.keys()), recurse and so on.
-# We ran in to this problem with collections.OrderedDict.
-# To prevent reentrancy, we set is_performing_inference = True iff we're in the middle of
-# inferring the types of a function. If we try to run another function we've wrapped,
-# we skip type inferencing so we can't accidentally infinitely recurse.
-is_performing_inference = False
-
-
-def reset():
- global var_db, func_argid_db, func_arg_db, func_return_db, func_source_db
- global ignore_files, is_performing_inference
- var_db = {}
- func_arg_db = {}
- func_return_db = {}
- # we don't actually want to clear these on reset(), or we'll
- # lose the functions we've already wrapped forever.
- #func_source_db = {}
- #func_argid_db = {}
- is_performing_inference = False
- ignore_files = set()
-
-
-def format_state(pretty=False):
- lines = []
- for loc, var in sorted(var_db.keys()):
- lines.append('%s: %s' % (var, var_db[(loc, var)]))
- funcnames = sorted(set(func_return_db.keys()))
- prevclass = ''
- indent = ''
- for funcid in funcnames:
- curclass, name, sourcefile, sourceline = funcid
- if curclass != prevclass:
- if curclass:
- lines.append('class %s(...):' % curclass)
- indent = ' ' * 4
- else:
- indent = ''
- prevclass = curclass
-
- lines.append(format_sig(funcid, name, indent, pretty))
- return '\n'.join(lines)
-
-
-def unparse_ast(node):
- buf = StringIO()
- Unparser(node, buf)
- return buf.getvalue().strip()
-
-
-def format_sig(funcid, fname, indent, pretty, defaults=[]):
- (argnames, varargs, varkw, _, kwonlyargs, _, _) = func_argid_db[funcid]
-
- # to get defaults, parse the function, get the nodes for the
- # defaults, then unparse them
- try:
- fn_ast = ast.parse(func_source_db[funcid].strip()).body[0]
-
- # override fname if we parsed a different one
- fname = fn_ast.name
-
- defaults = [unparse_ast(dn) for dn in fn_ast.args.defaults]
-
- if hasattr(fn_ast.args, 'kw_defaults'):
- kwonly_defaults = [unparse_ast(dn) for dn in fn_ast.args.kw_defaults]
- else:
- kwonly_defaults = []
- except:
- defaults, kwonly_defaults = [], []
- finally:
- # pad defaults to match the length of args
- defaults = ([None] * (len(argnames) - len(defaults))) + defaults
- kwonly_defaults = ([None] * (len(kwonlyargs) - len(kwonly_defaults))) + kwonly_defaults
-
- args = [('', arg, default) for (arg, default) in zip(argnames, defaults)]
-
- if varargs:
- args += [('*', varargs, None)]
- elif len(kwonlyargs) > 0:
- args += [('*', '', None)]
- if len(kwonlyargs) > 0:
- args += [('', arg, default) for (arg, default) in zip(kwonlyargs, kwonly_defaults)]
- if varkw:
- args += [('**', varkw, None)]
-
- argstrs = []
- for i, (prefix, arg, default) in enumerate(args):
- argstr = prefix + arg
-
- # Omit type of self argument.
- if (funcid, arg) in func_arg_db and not (i == 0 and arg == 'self'):
- argstr += ': %s' % func_arg_db[(funcid, arg)]
-
- if default:
- argstr += ' = %s' % default
-
- argstrs.append(argstr)
-
- ret = str(func_return_db.get(funcid, Unknown()))
-
- sig = 'def %s(%s) -> %s' % (fname, ', '.join(argstrs), ret)
- if not pretty or len(sig) <= PREFERRED_LINE_LENGTH or not args:
- return indent + sig
-
- else:
- # Format into multiple lines to conserve horizontal space.
- first = indent + 'def %s(' % fname
- extra_indent = first.index('(') + 1
-
- decl = indent + first
- decl += (',\n' + indent + ' ' * extra_indent).join(argstrs)
- decl += ')\n%s -> %s' % (indent + ' ' * (extra_indent - 4), ret)
- return decl
-
-
-def annotate_file(path):
- # this should be documented somewhere...
- INDENT_TOKEN = 5
-
- with open(path, 'r') as targetfile:
- source = targetfile.read()
-
- line_offsets = []
- source_length = 0
- for line in source.split('\n'):
- line_offsets.append(source_length)
- source_length = source_length + len(line) + 1
-
- funcids = set(funcid for funcid, arg in func_arg_db)
-
- # list of (oldstart, oldend, replacement)
- replacements = [] # type: List[Tuple[Int, Int, String]]
-
- for funcid in funcids:
- class_name, name, sourcefile, def_start_line = funcid
- if sourcefile != path:
- continue
-
- func_source = func_source_db[funcid]
- tokens = list(tokenize.generate_tokens(StringIO(func_source).readline))
- assert len(tokens) > 0
-
- # we're making the assumption that the def at least gets to start on
- # it's own line, which is fine for non-lambdas
-
- if tokens[0][0] == INDENT_TOKEN:
- indent = tokens[0][1]
- del tokens[0]
- else:
- indent = ''
-
- # Find the first indent, which should be between the end of the def
- # and before the start of the body. Then find the preceding colon,
- # which should be at the end of the def.
-
- for indent_loc in range(len(tokens)):
- if tokens[indent_loc][0] == INDENT_TOKEN:
- function_is_one_line = False
- break
- else:
- function_is_one_line = True
-
- if function_is_one_line:
- # we're also making the assumption that the def has an indent on the
- # line following the signature, which is true almost all of the time.
- # If this is not the case, we should just leave a comment above the
- # function, although I might not have time to do that now.
- continue
-
- for def_end_loc in range(indent_loc, -1, -1):
- if tokens[def_end_loc][1] == ':':
- break
-
- assert def_end_loc > 0
-
- def_end_line, def_end_col = tokens[def_end_loc][2]
- def_end_line -= 1 # the tokenizer apparently 1-indexes lines
- def_end_line += def_start_line
-
- def_start_offset = line_offsets[def_start_line]
- def_end_offset = line_offsets[def_end_line] + def_end_col
-
- annotated_def = format_sig(funcid, name, indent, True)
-
- replacements.append((def_start_offset, def_end_offset, annotated_def))
-
- # ideally, we'd put this after the docstring
- replacements.append((0, 0, "from typing import List, Dict, Set, Tuple, Callable, Pattern, Match, Union, Optional\n"))
-
- # absurdly inefficient algorithm: replace with O(n) writer
-
- for (start, end, replacement) in sorted(replacements, key=lambda r: r[0], reverse=True):
- source = source[0:start] + replacement + source[end:]
-
- return source
-
-
-def dump():
- s = format_state(pretty=True)
- if s:
- print()
- print('INFERRED TYPES:')
- print(s)
- reset()
-
-
-def dump_at_exit():
- import atexit
- atexit.register(dump)
-
-
-def get_defining_file(obj):
- try:
- path = os.path.abspath(inspect.getfile(obj))
- if path.endswith('.pyc'):
- path = path[0:-1]
- return path
- except:
- return None
-
-
-def infer_var(name, value):
- key = (None, name)
- update_var_db(key, value)
-
-
-def infer_attrs(x):
- if hasattr(x, '__class__'):
- t = x.__class__
- else:
- t = type(x)
- cls = t.__name__
- typedict = t.__dict__
- for dict in x.__dict__, typedict:
- for attr, value in dict.items():
- if attr in ('__dict__', '__doc__', '__module__', '__weakref__'):
- continue
- if type(value) is type(infer_attrs) and dict is typedict:
- # Skip methods.
- continue
- key = (None, '%s.%s' % (cls, attr))
- update_var_db(key, value)
-
-
-def infer_method_signature(class_name):
- def decorator(func):
- return infer_signature(func, class_name)
- return decorator
-
-
-def infer_signature(func, class_name=''):
- """Decorator that infers the signature of a function."""
-
- # infer_method_signature should be idempotent
- if hasattr(func, '__is_inferring_sig'):
- return func
-
- assert func.__module__ != infer_method_signature.__module__
-
- try:
- funcfile = get_defining_file(func)
- funcsource, sourceline = inspect.getsourcelines(func)
- sourceline -= 1 # getsourcelines is apparently 1-indexed
- except:
- return func
-
- funcid = (class_name, func.__name__, funcfile, sourceline)
- func_source_db[funcid] = ''.join(funcsource)
-
- try:
- func_argid_db[funcid] = getfullargspec(func)
- vargs_name, kwargs_name = func_argid_db[funcid][1], func_argid_db[funcid][2]
- except TypeError:
- # Not supported.
- return func
-
- def wrapper(*args, **kwargs):
- global is_performing_inference
- # If we're already doing inference, we should be in our own code, not code we're checking.
- # Not doing this check sometimes results in infinite recursion.
-
- if is_performing_inference:
- return func(*args, **kwargs)
-
- expecting_type_error, got_type_error, got_exception = False, False, False
-
- is_performing_inference = True
- try:
- callargs = getcallargs(func, *args, **kwargs)
-
- # we have to handle *args and **kwargs separately
- if vargs_name:
- va = callargs.pop(vargs_name)
- if kwargs_name:
- kw = callargs.pop(kwargs_name)
-
- arg_db = {arg: infer_value_type(value) for arg, value in callargs.items()}
-
- # *args and **kwargs need to merge the types of all their values
- if vargs_name:
- arg_db[vargs_name] = union_many_types(*[infer_value_type(v) for v in va])
- if kwargs_name:
- arg_db[kwargs_name] = union_many_types(*[infer_value_type(v) for v in kw.values()])
-
- except TypeError:
- got_exception = expecting_type_error = True
- except:
- got_exception = True
- finally:
- is_performing_inference = False
-
- try:
- ret = func(*args, **kwargs)
- except TypeError:
- got_type_error = got_exception = True
- raise
- except:
- got_exception = True
- raise
- finally:
- if not got_exception:
- assert not expecting_type_error
-
- # if we didn't get a TypeError, update the actual database
- for arg, t in arg_db.items():
- update_db(func_arg_db, (funcid, arg), t)
-
- # if we got an exception, we don't have a ret
- if not got_exception:
- is_performing_inference = True
- try:
- type = infer_value_type(ret)
- update_db(func_return_db, funcid, type)
- except:
- pass
- finally:
- is_performing_inference = False
-
- return ret
-
- if hasattr(func, '__name__'):
- wrapper.__name__ = func.__name__
- wrapper.__is_inferring_sig = True
- return wrapper
-
-
-def infer_class(cls):
- """Class decorator for inferring signatures of all methods of the class."""
- for attr, value in cls.__dict__.items():
- if type(value) is type(infer_class):
- setattr(cls, attr, infer_method_signature(cls.__name__)(value))
- return cls
-
-
-def infer_module(namespace):
- if hasattr(namespace, '__dict__'):
- namespace = namespace.__dict__
- for name, value in list(namespace.items()):
- if inspect.isfunction(value):
- namespace[name] = infer_signature(value)
- elif inspect.isclass(value):
- namespace[name] = infer_class(value)
-
-
-def update_var_db(key, value):
- type = infer_value_type(value)
- update_db(var_db, key, type)
-
-
-def update_db(db, key, type):
- if key not in db:
- db[key] = type
- else:
- db[key] = combine_types(db[key], type)
-
-
-def merge_db(db, other):
- assert id(db) != id(other)
- for key in other.keys():
- if key not in db:
- db[key] = other[key]
- else:
- db[key] = combine_types(db[key], other[key])
-
-
-def infer_value_type(value, depth=0):
- # Prevent infinite recursion
- if depth > 5:
- return Unknown()
- depth += 1
-
- if value is None:
- return None
- elif isinstance(value, list):
- return Generic('List', [infer_value_types(value, depth)])
- elif isinstance(value, dict):
- keytype = infer_value_types(value.keys(), depth)
- valuetype = infer_value_types(value.values(), depth)
- return Generic('Dict', (keytype, valuetype))
- elif isinstance(value, tuple):
- if len(value) <= MAX_INFERRED_TUPLE_LENGTH:
- return Tuple(infer_value_type(item, depth)
- for item in value)
- else:
- return Generic('TupleSequence', [infer_value_types(value, depth)])
- elif isinstance(value, set):
- return Generic('Set', [infer_value_types(value, depth)])
- elif isinstance(value, types.MethodType) or isinstance(value, types.FunctionType):
- return Instance(Callable)
- else:
- for t in type(value).mro():
- if get_defining_file(t) in ignore_files:
- continue
- elif t is object:
- return Any()
- elif hasattr(types, 'InstanceType') and t is types.InstanceType:
- return Any()
- else:
- return Instance(t)
- else:
- return Any()
-
-
-def infer_value_types(values, depth=0):
- """Infer a single type for an iterable of values.
-
- >>> infer_value_types((1, 'x'))
- Union(int, str)
- >>> infer_value_types([])
- Unknown
- """
- inferred = Unknown()
- for value in sample(values):
- type = infer_value_type(value, depth)
- inferred = combine_types(inferred, type)
- return inferred
-
-
-def sample(values):
- # TODO only return a sample of values
- return list(values)
-
-
-def union_many_types(*types):
- union = Unknown()
- for t in types:
- union = combine_types(union, t)
- return union
-
-
-def combine_types(x, y):
- """Perform a union of two types.
-
- >>> combine_types(Instance(int), None)
- Optional[int]
- """
- if isinstance(x, Unknown):
- return y
- if isinstance(y, Unknown):
- return x
- if isinstance(x, Any):
- return x
- if isinstance(y, Any):
- return y
- if isinstance(x, Union):
- return combine_either(x, y)
- if isinstance(y, Union):
- return combine_either(y, x)
- if x == y:
- return x
- return simplify_either([x], [y])
-
-
-def combine_either(either, x):
- if isinstance(x, Union):
- xtypes = x.types
- else:
- xtypes = [x]
- return simplify_either(either.types, xtypes)
-
-
-def simplify_either(x, y):
- numerics = [Instance(int), Instance(float), Instance(complex)]
-
- # TODO this is O(n**2); use an O(n) algorithm instead
- result = list(x)
- for type in y:
- if isinstance(type, Generic):
- for i, rt in enumerate(result):
- if isinstance(rt, Generic) and type.typename == rt.typename:
- result[i] = Generic(rt.typename,
- (combine_types(t, s)
- for t, s in zip(type.args, rt.args)))
- break
- else:
- result.append(type)
- elif isinstance(type, Tuple):
- for i, rt in enumerate(result):
- if isinstance(rt, Tuple) and len(type) == len(rt):
- result[i] = Tuple(combine_types(t, s)
- for t, s in zip(type.itemtypes,
- rt.itemtypes))
- break
- else:
- result.append(type)
- elif type in numerics:
- for i, rt in enumerate(result):
- if rt in numerics:
- result[i] = numerics[max(numerics.index(rt), numerics.index(type))]
- break
- else:
- result.append(type)
- elif isinstance(type, Instance):
- for i, rt in enumerate(result):
- if isinstance(rt, Instance):
- # Union[A, SubclassOfA] -> A
- # Union[A, A] -> A, because issubclass(A, A) == True,
- if issubclass(type.typeobj, rt.typeobj):
- break
- elif issubclass(rt.typeobj, type.typeobj):
- result[i] = type
- break
- else:
- result.append(type)
- elif type not in result:
- result.append(type)
-
- if len(result) > 1:
- return Union(result)
- else:
- return result[0]
-
-
-class TypeBase(object):
- """Abstract base class of all type objects.
-
- Type objects use isinstance tests librarally -- they don't support duck
- typing well.
- """
-
- def __eq__(self, other):
- if type(other) is not type(self):
- return False
- for attr in self.__dict__:
- if getattr(other, attr) != getattr(self, attr):
- return False
- return True
-
- def __ne__(self, other):
- return not self == other
-
- def __repr__(self):
- return str(self)
-
-
-class Instance(TypeBase):
- def __init__(self, typeobj):
- assert not inspect.isclass(typeobj) or not issubclass(typeobj, TypeBase)
- self.typeobj = typeobj
-
- def __str__(self):
- # cheat on regular expression objects which have weird class names
- # to be consistent with typing.py
- if self.typeobj == Pattern:
- return "Pattern"
- elif self.typeobj == Match:
- return "Match"
- else:
- return self.typeobj.__name__
-
- def __repr__(self):
- return 'Instance(%s)' % self
-
-
-class Generic(TypeBase):
- def __init__(self, typename, args):
- self.typename = typename
- self.args = tuple(args)
-
- def __str__(self):
- return '%s[%s]' % (self.typename, ', '.join(str(t)
- for t in self.args))
-
-
-class Tuple(TypeBase):
- def __init__(self, itemtypes):
- self.itemtypes = tuple(itemtypes)
-
- def __len__(self):
- return len(self.itemtypes)
-
- def __str__(self):
- return 'Tuple[%s]' % (', '.join(str(t) for t in self.itemtypes))
-
-
-class Union(TypeBase):
- def __init__(self, types):
- assert len(types) > 1
- self.types = tuple(types)
-
- def __eq__(self, other):
- if type(other) is not Union:
- return False
- # TODO this is O(n**2); use an O(n) algorithm instead
- for t in self.types:
- if t not in other.types:
- return False
- for t in other.types:
- if t not in self.types:
- return False
- return True
-
- def __str__(self):
- types = list(self.types)
- if str != bytes: # on Python 2 str == bytes
- if Instance(bytes) in types and Instance(str) in types:
- # we Union[bytes, str] -> AnyStr as late as possible so we avoid
- # corner cases like subclasses of bytes or str
- types.remove(Instance(bytes))
- types.remove(Instance(str))
- types.append(Instance(AnyStr))
- if len(types) == 1:
- return str(types[0])
- elif len(types) == 2 and None in types:
- type = [t for t in types if t is not None][0]
- return 'Optional[%s]' % type
- else:
- return 'Union[%s]' % (', '.join(sorted(str(t) for t in types)))
-
-
-class Unknown(TypeBase):
- def __str__(self):
- return 'Unknown'
-
- def __repr__(self):
- return 'Unknown()'
-
-
-class Any(TypeBase):
- def __str__(self):
- return 'Any'
-
- def __repr__(self):
- return 'Any()'
-
-
-class AnyStr(object): pass
-class Callable(object): pass
-import re
-Pattern = type(re.compile(u''))
-Match = type(re.match(u'', u''))
diff --git a/pinfer/test_pinfer.py b/pinfer/test_pinfer.py
deleted file mode 100644
index d6168db..0000000
--- a/pinfer/test_pinfer.py
+++ /dev/null
@@ -1,302 +0,0 @@
-"""Test cases for the infer module"""
-
-import unittest
-
-from pinfer import Instance, Generic, Tuple, Union, Unknown
-import pinfer
-
-
-class TestInfer(unittest.TestCase):
- def setUp(self):
- self.int = Instance(int)
- self.float = Instance(float)
-
- def tearDown(self):
- pinfer.reset()
-
- def test_instance(self):
- i = self.int
- self.assertEqual(i.typeobj, int)
- self.assertEqual(str(i), 'int')
- self.assertEqual(repr(i), 'Instance(int)')
-
- self.assertTrue(i == Instance(int))
- self.assertFalse(i != Instance(int))
- self.assertTrue(i != self.float)
- self.assertFalse(i == self.float)
- self.assertNotEqual(i, None)
-
- def test_generic_with_one_arg(self):
- g = Generic('List', [self.int])
- self.assertEqual(g.typename, 'List')
- self.assertEqual(str(g.args), '(Instance(int),)')
- self.assertEqual(str(g), 'List[int]')
- self.assertEqual(repr(g), 'List[int]')
-
- self.assertEqual(g, Generic('List', [self.int]))
- self.assertNotEqual(g, Generic('Set', [self.int]))
- self.assertNotEqual(g, Generic('List', [self.float]))
- self.assertNotEqual(g, self.int)
-
- def test_generic_with_two_args(self):
- g = Generic('Dict', (self.int, self.float))
- self.assertEqual(g.typename, 'Dict')
- self.assertEqual(str(g), 'Dict[int, float]')
-
- def test_tuple(self):
- t0 = Tuple(())
- t1 = Tuple([self.int])
- t2 = Tuple((self.float, self.int))
- self.assertEqual(t0.itemtypes, ())
- self.assertEqual(str(t1.itemtypes[0]), 'int')
- self.assertEqual(str(t2.itemtypes[0]), 'float')
- self.assertEqual(str(t2.itemtypes[1]), 'int')
- self.assertEqual(str(t0), 'Tuple[]')
- self.assertEqual(str(t1), 'Tuple[int]')
- self.assertEqual(str(t2), 'Tuple[float, int]')
-
- self.assertEqual(t1, Tuple([self.int]))
- self.assertNotEqual(t1, Tuple([self.float]))
- self.assertNotEqual(t1, Tuple([self.int, self.int]))
- self.assertNotEqual(t1, self.int)
-
- def test_either(self):
- i = self.int
- f = self.float
- s = Instance(str)
-
- e2 = Union((i, f))
- self.assertEqual(len(e2.types), 2)
- self.assertEqual(str(e2), 'Union[float, int]')
-
- self.assertEqual(e2, Union((i, f)))
- self.assertEqual(e2, Union((f, i)))
- self.assertNotEqual(e2, Union((i, s)))
- self.assertNotEqual(e2, Union((i, f, s)))
- self.assertNotEqual(Union((i, f, s)), e2)
- self.assertNotEqual(e2, i)
-
- def test_either_as_optional(self):
- optint = Union((self.int, None))
- self.assertEqual(str(optint), 'Optional[int]')
- optfloat = Union((None, self.float))
- self.assertEqual(str(optfloat), 'Optional[float]')
- eithernone = Union((self.int, self.float, None))
- self.assertEqual(str(eithernone), 'Union[None, float, int]')
-
- def test_unknown(self):
- unknown = Unknown()
- self.assertEqual(str(unknown), 'Unknown')
- self.assertEqual(repr(unknown), 'Unknown()')
-
- self.assertEqual(unknown, Unknown())
- self.assertNotEqual(unknown, self.int)
-
- def test_combine_types(self):
- i = self.int
- f = self.float
- s = Instance(str)
- c = Instance(complex)
- class Foo: pass
- o = Instance(Foo)
-
- # Simple types
- self.assert_combine(i, i, i)
- self.assert_combine(s, s, s)
- self.assert_combine(i, s, Union((i, s)))
- self.assert_combine(i, None, Union((i, None)))
- # Unknowns
- self.assert_combine(i, Unknown(), i)
- self.assert_combine(Unknown(), Unknown(), Unknown())
- # Union types
- self.assert_combine(o, Union((f, s)), Union((o, f, s)))
- self.assert_combine(i, Union((i, s)), Union((i, s)))
- self.assert_combine(Union((o, f)), Union((o, s)), Union((o, f, s)))
- # Tuple types
- self.assert_combine(Tuple([i, i]), Tuple([i, i]), Tuple([i, i]))
- self.assert_combine(Tuple([i, i]), Tuple([o, s]),
- Tuple([Union([o, i]), Union([s, i])]))
- # Numeric types
- self.assert_combine(i, f, f)
- self.assert_combine(i, c, c)
- self.assert_combine(c, f, c)
- # Unions with numerics
- self.assert_combine(i, Union((o, f)), Union((o, f)))
- self.assert_combine(Union((o, f)), i, Union((o, f)))
- self.assert_combine(Union((o, i)), f, Union((o, f)))
- # Tuples with numerics
- self.assert_combine(Tuple([i, i]), Tuple([f, i]), Tuple([f, i]))
- self.assert_combine(Tuple([i, i]), Tuple([f, o]), Tuple([f, Union((i, o))]))
- self.assert_combine(Tuple([f, i]), Tuple([i, o]), Tuple([f, Union((i, o))]))
-
- def test_combine_special_cases(self):
- i = self.int
- f = self.float
- u = Unknown()
- def list_(x):
- return Generic('List', [x])
- # Simplify generic types.
- self.assert_combine(list_(i), list_(u), list_(i))
-
- def assert_combine(self, t, s, combined):
- self.assertEqual(pinfer.combine_types(t, s), combined)
- self.assertEqual(pinfer.combine_types(s, t), combined)
-
- def test_sample(self):
- sample = pinfer.sample
- self.assertEqual(sample(()), [])
- self.assertEqual(sample((1, 2)), [1, 2])
- self.assertEqual(sample([]), [])
- self.assertEqual(sample([1]), [1])
- self.assertEqual(sample([1, 2]), [1, 2])
- # TODO larger collections
-
- def test_infer_simple_value_type(self):
- self.assert_infer_type(1, 'int')
- self.assert_infer_type('', 'str')
- self.assert_infer_type(None, 'None')
-
- def test_infer_collection_type(self):
- # List
- self.assert_infer_type([], 'List[Unknown]')
- self.assert_infer_type([1], 'List[int]')
- self.assert_infer_type([1, None], 'List[Optional[int]]')
- # Dict
- self.assert_infer_type({1: 'x', 2: None},
- 'Dict[int, Optional[str]]')
- # Set
- self.assert_infer_type({1, None}, 'Set[Optional[int]]')
- # Tuple
- self.assert_infer_type((1, 'x'), 'Tuple[int, str]')
- self.assert_infer_type((1, None) * 100, 'TupleSequence[Optional[int]]')
-
- def assert_infer_type(self, value, type):
- self.assertEqual(str(pinfer.infer_value_type(value)), type)
-
- def test_infer_variables(self):
- pinfer.infer_var('x', 1)
- self.assert_infer_state('x: int')
- pinfer.infer_var('x', 1)
- pinfer.infer_var('x', None)
- pinfer.infer_var('y', 1.1)
- self.assert_infer_state('x: Optional[int]\n'
- 'y: float')
-
- def test_infer_instance_var(self):
- class A: pass
- a = A()
- a.x = 1
- a.y = 'x'
- pinfer.infer_attrs(a)
- self.assert_infer_state('A.x: int\n'
- 'A.y: str')
-
- def test_infer_class_var(self):
- class A:
- x = 1.1
- pinfer.infer_attrs(A())
- self.assert_infer_state('A.x: float')
-
- def test_infer_function_attr(self):
- class A:
- def f(self): pass
- a = A()
- a.g = lambda x: 1
- pinfer.infer_attrs(a)
- self.assert_infer_state('A.g: Callable')
-
- def test_infer_simple_function_signature(self):
- @pinfer.infer_signature
- def f(a):
- return 'x'
- f(1)
- f(None)
- self.assertEqual(f.__name__, 'f')
- self.assert_infer_state('def f(a: Optional[int]) -> str')
-
- def test_infer_function_with_two_args(self):
- @pinfer.infer_signature
- def f(x, y):
- return x * y
- f(1, 2)
- f(1, 'x')
- self.assert_infer_state(
- 'def f(x: int, y: Union[int, str]) -> Union[int, str]')
-
- def test_infer_method(self):
- class A:
- @pinfer.infer_signature
- def f(self, x): pass
- A().f('x')
- self.assert_infer_state('def f(self, x: str) -> None')
-
- def test_infer_default_arg_values(self):
- @pinfer.infer_signature
- def f(x=1, y=None): pass
- f()
- self.assert_infer_state('def f(x: int, y: None) -> None')
- f('x')
- f('x', 1.1)
- f()
- self.assert_infer_state(
- 'def f(x: Union[int, str], y: Optional[float]) -> None')
-
- def test_infer_varargs(self):
- @pinfer.infer_signature
- def f(x, *y): pass
- f(1)
- f(1, 'x', None)
- self.assert_infer_state('def f(x: int, *y: Optional[str]) -> None')
- f(1)
- self.assert_infer_state('def f(x: int, *y: Unknown) -> None')
-
- def test_infer_keyword_args(self):
- @pinfer.infer_signature
- def f(x): pass
- f(x=1)
- self.assert_infer_state('def f(x: int) -> None')
-
- @pinfer.infer_signature
- def f(x='x'): pass
- f(x=1)
- self.assert_infer_state('def f(x: int) -> None')
-
- def test_infer_keyword_varargs(self):
- @pinfer.infer_signature
- def f(a, **kwargs): pass
- f(None, x=1, y='x')
- self.assert_infer_state(
- 'def f(a: None, **kwargs: Union[int, str]) -> None')
-
- def test_infer_class(self):
- @pinfer.infer_class
- class A:
- def f(self, x): return 0
- A().f('x')
- self.assert_infer_state('class A(...):\n'
- ' def f(self, x: str) -> int')
-
- @pinfer.infer_class
- class A:
- def f(self, x): return 0
- @pinfer.infer_class
- class B:
- def f(self): pass
- def g(self): pass
- A().f('')
- B().f()
- B().g()
- self.assert_infer_state('class A(...):\n'
- ' def f(self, x: str) -> int\n'
- 'class B(...):\n'
- ' def f(self) -> None\n'
- ' def g(self) -> None')
-
- def assert_infer_state(self, expected):
- state = pinfer.format_state()
- self.assertEqual(state, expected)
- pinfer.reset()
-
-
-if __name__ == '__main__':
- unittest.main()
diff --git a/pinfer/test_pinfer3.py b/pinfer/test_pinfer3.py
deleted file mode 100644
index 688e8c0..0000000
--- a/pinfer/test_pinfer3.py
+++ /dev/null
@@ -1,31 +0,0 @@
-""" tests cases that require python3 syntax """
-
-import unittest
-import pinfer
-
-# Include all of the shared unit tests
-from test_pinfer import TestInfer
-
-
-class TestInfer3(unittest.TestCase):
- def test_infer_keyword_only_args(self):
- # decorators break the parsing
- def f(x, *, y=0): pass
- f = pinfer.infer_signature(f)
- f(1, y='x')
- self.assert_infer_state(
- 'def f(x: int, *, y: str = 0) -> None')
-
- def f(*, x=None, y=None): pass
- f = pinfer.infer_signature(f)
- f(y='x')
- self.assert_infer_state(
- 'def f(*, x: None = None, y: str = None) -> None')
-
- def assert_infer_state(self, expected):
- state = pinfer.format_state()
- self.assertEqual(state, expected)
- pinfer.reset()
-
-if __name__ == '__main__':
- unittest.main()
diff --git a/pinfer/unparse.py b/pinfer/unparse.py
deleted file mode 100644
index 6e1e493..0000000
--- a/pinfer/unparse.py
+++ /dev/null
@@ -1,610 +0,0 @@
-# From Python 2's Demo/parser/unparse.py
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
-# 2011, 2012, 2013, 2014 Python Software Foundation; All Rights Reserved
-
-"Usage: unparse.py <path to source file>"
-import sys
-import ast
-import cStringIO
-import os
-
-# Large float and imaginary literals get turned into infinities in the AST.
-# We unparse those infinities to INFSTR.
-INFSTR = "1e" + repr(sys.float_info.max_10_exp + 1)
-
-def interleave(inter, f, seq):
- """Call f on each item in seq, calling inter() in between.
- """
- seq = iter(seq)
- try:
- f(next(seq))
- except StopIteration:
- pass
- else:
- for x in seq:
- inter()
- f(x)
-
-class Unparser:
- """Methods in this class recursively traverse an AST and
- output source code for the abstract syntax; original formatting
- is disregarded. """
-
- def __init__(self, tree, file = sys.stdout):
- """Unparser(tree, file=sys.stdout) -> None.
- Print the source for tree to file."""
- self.f = file
- self.future_imports = []
- self._indent = 0
- self.dispatch(tree)
- self.f.write("")
- self.f.flush()
-
- def fill(self, text = ""):
- "Indent a piece of text, according to the current indentation level"
- self.f.write("\n"+" "*self._indent + text)
-
- def write(self, text):
- "Append a piece of text to the current line."
- self.f.write(text)
-
- def enter(self):
- "Print ':', and increase the indentation."
- self.write(":")
- self._indent += 1
-
- def leave(self):
- "Decrease the indentation level."
- self._indent -= 1
-
- def dispatch(self, tree):
- "Dispatcher function, dispatching tree type T to method _T."
- if isinstance(tree, list):
- for t in tree:
- self.dispatch(t)
- return
- meth = getattr(self, "_"+tree.__class__.__name__)
- meth(tree)
-
-
- ############### Unparsing methods ######################
- # There should be one method per concrete grammar type #
- # Constructors should be grouped by sum type. Ideally, #
- # this would follow the order in the grammar, but #
- # currently doesn't. #
- ########################################################
-
- def _Module(self, tree):
- for stmt in tree.body:
- self.dispatch(stmt)
-
- # stmt
- def _Expr(self, tree):
- self.fill()
- self.dispatch(tree.value)
-
- def _Import(self, t):
- self.fill("import ")
- interleave(lambda: self.write(", "), self.dispatch, t.names)
-
- def _ImportFrom(self, t):
- # A from __future__ import may affect unparsing, so record it.
- if t.module and t.module == '__future__':
- self.future_imports.extend(n.name for n in t.names)
-
- self.fill("from ")
- self.write("." * t.level)
- if t.module:
- self.write(t.module)
- self.write(" import ")
- interleave(lambda: self.write(", "), self.dispatch, t.names)
-
- def _Assign(self, t):
- self.fill()
- for target in t.targets:
- self.dispatch(target)
- self.write(" = ")
- self.dispatch(t.value)
-
- def _AugAssign(self, t):
- self.fill()
- self.dispatch(t.target)
- self.write(" "+self.binop[t.op.__class__.__name__]+"= ")
- self.dispatch(t.value)
-
- def _Return(self, t):
- self.fill("return")
- if t.value:
- self.write(" ")
- self.dispatch(t.value)
-
- def _Pass(self, t):
- self.fill("pass")
-
- def _Break(self, t):
- self.fill("break")
-
- def _Continue(self, t):
- self.fill("continue")
-
- def _Delete(self, t):
- self.fill("del ")
- interleave(lambda: self.write(", "), self.dispatch, t.targets)
-
- def _Assert(self, t):
- self.fill("assert ")
- self.dispatch(t.test)
- if t.msg:
- self.write(", ")
- self.dispatch(t.msg)
-
- def _Exec(self, t):
- self.fill("exec ")
- self.dispatch(t.body)
- if t.globals:
- self.write(" in ")
- self.dispatch(t.globals)
- if t.locals:
- self.write(", ")
- self.dispatch(t.locals)
-
- def _Print(self, t):
- self.fill("print ")
- do_comma = False
- if t.dest:
- self.write(">>")
- self.dispatch(t.dest)
- do_comma = True
- for e in t.values:
- if do_comma:self.write(", ")
- else:do_comma=True
- self.dispatch(e)
- if not t.nl:
- self.write(",")
-
- def _Global(self, t):
- self.fill("global ")
- interleave(lambda: self.write(", "), self.write, t.names)
-
- def _Yield(self, t):
- self.write("(")
- self.write("yield")
- if t.value:
- self.write(" ")
- self.dispatch(t.value)
- self.write(")")
-
- def _Raise(self, t):
- self.fill('raise ')
- if t.type:
- self.dispatch(t.type)
- if t.inst:
- self.write(", ")
- self.dispatch(t.inst)
- if t.tback:
- self.write(", ")
- self.dispatch(t.tback)
-
- def _TryExcept(self, t):
- self.fill("try")
- self.enter()
- self.dispatch(t.body)
- self.leave()
-
- for ex in t.handlers:
- self.dispatch(ex)
- if t.orelse:
- self.fill("else")
- self.enter()
- self.dispatch(t.orelse)
- self.leave()
-
- def _TryFinally(self, t):
- if len(t.body) == 1 and isinstance(t.body[0], ast.TryExcept):
- # try-except-finally
- self.dispatch(t.body)
- else:
- self.fill("try")
- self.enter()
- self.dispatch(t.body)
- self.leave()
-
- self.fill("finally")
- self.enter()
- self.dispatch(t.finalbody)
- self.leave()
-
- def _ExceptHandler(self, t):
- self.fill("except")
- if t.type:
- self.write(" ")
- self.dispatch(t.type)
- if t.name:
- self.write(" as ")
- self.dispatch(t.name)
- self.enter()
- self.dispatch(t.body)
- self.leave()
-
- def _ClassDef(self, t):
- self.write("\n")
- for deco in t.decorator_list:
- self.fill("@")
- self.dispatch(deco)
- self.fill("class "+t.name)
- if t.bases:
- self.write("(")
- for a in t.bases:
- self.dispatch(a)
- self.write(", ")
- self.write(")")
- self.enter()
- self.dispatch(t.body)
- self.leave()
-
- def _FunctionDef(self, t):
- self.write("\n")
- for deco in t.decorator_list:
- self.fill("@")
- self.dispatch(deco)
- self.fill("def "+t.name + "(")
- self.dispatch(t.args)
- self.write(")")
- self.enter()
- self.dispatch(t.body)
- self.leave()
-
- def _For(self, t):
- self.fill("for ")
- self.dispatch(t.target)
- self.write(" in ")
- self.dispatch(t.iter)
- self.enter()
- self.dispatch(t.body)
- self.leave()
- if t.orelse:
- self.fill("else")
- self.enter()
- self.dispatch(t.orelse)
- self.leave()
-
- def _If(self, t):
- self.fill("if ")
- self.dispatch(t.test)
- self.enter()
- self.dispatch(t.body)
- self.leave()
- # collapse nested ifs into equivalent elifs.
- while (t.orelse and len(t.orelse) == 1 and
- isinstance(t.orelse[0], ast.If)):
- t = t.orelse[0]
- self.fill("elif ")
- self.dispatch(t.test)
- self.enter()
- self.dispatch(t.body)
- self.leave()
- # final else
- if t.orelse:
- self.fill("else")
- self.enter()
- self.dispatch(t.orelse)
- self.leave()
-
- def _While(self, t):
- self.fill("while ")
- self.dispatch(t.test)
- self.enter()
- self.dispatch(t.body)
- self.leave()
- if t.orelse:
- self.fill("else")
- self.enter()
- self.dispatch(t.orelse)
- self.leave()
-
- def _With(self, t):
- self.fill("with ")
- self.dispatch(t.context_expr)
- if t.optional_vars:
- self.write(" as ")
- self.dispatch(t.optional_vars)
- self.enter()
- self.dispatch(t.body)
- self.leave()
-
- # expr
- def _Str(self, tree):
- # if from __future__ import unicode_literals is in effect,
- # then we want to output string literals using a 'b' prefix
- # and unicode literals with no prefix.
- if "unicode_literals" not in self.future_imports:
- self.write(repr(tree.s))
- elif isinstance(tree.s, str):
- self.write("b" + repr(tree.s))
- elif isinstance(tree.s, unicode):
- self.write(repr(tree.s).lstrip("u"))
- else:
- assert False, "shouldn't get here"
-
- def _Name(self, t):
- self.write(t.id)
-
- def _Repr(self, t):
- self.write("`")
- self.dispatch(t.value)
- self.write("`")
-
- def _Num(self, t):
- repr_n = repr(t.n)
- # Parenthesize negative numbers, to avoid turning (-1)**2 into -1**2.
- if repr_n.startswith("-"):
- self.write("(")
- # Substitute overflowing decimal literal for AST infinities.
- self.write(repr_n.replace("inf", INFSTR))
- if repr_n.startswith("-"):
- self.write(")")
-
- def _List(self, t):
- self.write("[")
- interleave(lambda: self.write(", "), self.dispatch, t.elts)
- self.write("]")
-
- def _ListComp(self, t):
- self.write("[")
- self.dispatch(t.elt)
- for gen in t.generators:
- self.dispatch(gen)
- self.write("]")
-
- def _GeneratorExp(self, t):
- self.write("(")
- self.dispatch(t.elt)
- for gen in t.generators:
- self.dispatch(gen)
- self.write(")")
-
- def _SetComp(self, t):
- self.write("{")
- self.dispatch(t.elt)
- for gen in t.generators:
- self.dispatch(gen)
- self.write("}")
-
- def _DictComp(self, t):
- self.write("{")
- self.dispatch(t.key)
- self.write(": ")
- self.dispatch(t.value)
- for gen in t.generators:
- self.dispatch(gen)
- self.write("}")
-
- def _comprehension(self, t):
- self.write(" for ")
- self.dispatch(t.target)
- self.write(" in ")
- self.dispatch(t.iter)
- for if_clause in t.ifs:
- self.write(" if ")
- self.dispatch(if_clause)
-
- def _IfExp(self, t):
- self.write("(")
- self.dispatch(t.body)
- self.write(" if ")
- self.dispatch(t.test)
- self.write(" else ")
- self.dispatch(t.orelse)
- self.write(")")
-
- def _Set(self, t):
- assert(t.elts) # should be at least one element
- self.write("{")
- interleave(lambda: self.write(", "), self.dispatch, t.elts)
- self.write("}")
-
- def _Dict(self, t):
- self.write("{")
- def write_pair(pair):
- (k, v) = pair
- self.dispatch(k)
- self.write(": ")
- self.dispatch(v)
- interleave(lambda: self.write(", "), write_pair, zip(t.keys, t.values))
- self.write("}")
-
- def _Tuple(self, t):
- self.write("(")
- if len(t.elts) == 1:
- (elt,) = t.elts
- self.dispatch(elt)
- self.write(",")
- else:
- interleave(lambda: self.write(", "), self.dispatch, t.elts)
- self.write(")")
-
- unop = {"Invert":"~", "Not": "not", "UAdd":"+", "USub":"-"}
- def _UnaryOp(self, t):
- self.write("(")
- self.write(self.unop[t.op.__class__.__name__])
- self.write(" ")
- # If we're applying unary minus to a number, parenthesize the number.
- # This is necessary: -2147483648 is different from -(2147483648) on
- # a 32-bit machine (the first is an int, the second a long), and
- # -7j is different from -(7j). (The first has real part 0.0, the second
- # has real part -0.0.)
- if isinstance(t.op, ast.USub) and isinstance(t.operand, ast.Num):
- self.write("(")
- self.dispatch(t.operand)
- self.write(")")
- else:
- self.dispatch(t.operand)
- self.write(")")
-
- binop = { "Add":"+", "Sub":"-", "Mult":"*", "Div":"/", "Mod":"%",
- "LShift":"<<", "RShift":">>", "BitOr":"|", "BitXor":"^", "BitAnd":"&",
- "FloorDiv":"//", "Pow": "**"}
- def _BinOp(self, t):
- self.write("(")
- self.dispatch(t.left)
- self.write(" " + self.binop[t.op.__class__.__name__] + " ")
- self.dispatch(t.right)
- self.write(")")
-
- cmpops = {"Eq":"==", "NotEq":"!=", "Lt":"<", "LtE":"<=", "Gt":">", "GtE":">=",
- "Is":"is", "IsNot":"is not", "In":"in", "NotIn":"not in"}
- def _Compare(self, t):
- self.write("(")
- self.dispatch(t.left)
- for o, e in zip(t.ops, t.comparators):
- self.write(" " + self.cmpops[o.__class__.__name__] + " ")
- self.dispatch(e)
- self.write(")")
-
- boolops = {ast.And: 'and', ast.Or: 'or'}
- def _BoolOp(self, t):
- self.write("(")
- s = " %s " % self.boolops[t.op.__class__]
- interleave(lambda: self.write(s), self.dispatch, t.values)
- self.write(")")
-
- def _Attribute(self,t):
- self.dispatch(t.value)
- # Special case: 3.__abs__() is a syntax error, so if t.value
- # is an integer literal then we need to either parenthesize
- # it or add an extra space to get 3 .__abs__().
- if isinstance(t.value, ast.Num) and isinstance(t.value.n, int):
- self.write(" ")
- self.write(".")
- self.write(t.attr)
-
- def _Call(self, t):
- self.dispatch(t.func)
- self.write("(")
- comma = False
- for e in t.args:
- if comma: self.write(", ")
- else: comma = True
- self.dispatch(e)
- for e in t.keywords:
- if comma: self.write(", ")
- else: comma = True
- self.dispatch(e)
- if t.starargs:
- if comma: self.write(", ")
- else: comma = True
- self.write("*")
- self.dispatch(t.starargs)
- if t.kwargs:
- if comma: self.write(", ")
- else: comma = True
- self.write("**")
- self.dispatch(t.kwargs)
- self.write(")")
-
- def _Subscript(self, t):
- self.dispatch(t.value)
- self.write("[")
- self.dispatch(t.slice)
- self.write("]")
-
- # slice
- def _Ellipsis(self, t):
- self.write("...")
-
- def _Index(self, t):
- self.dispatch(t.value)
-
- def _Slice(self, t):
- if t.lower:
- self.dispatch(t.lower)
- self.write(":")
- if t.upper:
- self.dispatch(t.upper)
- if t.step:
- self.write(":")
- self.dispatch(t.step)
-
- def _ExtSlice(self, t):
- interleave(lambda: self.write(', '), self.dispatch, t.dims)
-
- # others
- def _arguments(self, t):
- first = True
- # normal arguments
- defaults = [None] * (len(t.args) - len(t.defaults)) + t.defaults
- for a,d in zip(t.args, defaults):
- if first:first = False
- else: self.write(", ")
- self.dispatch(a),
- if d:
- self.write("=")
- self.dispatch(d)
-
- # varargs
- if t.vararg:
- if first:first = False
- else: self.write(", ")
- self.write("*")
- self.write(t.vararg)
-
- # kwargs
- if t.kwarg:
- if first:first = False
- else: self.write(", ")
- self.write("**"+t.kwarg)
-
- def _keyword(self, t):
- self.write(t.arg)
- self.write("=")
- self.dispatch(t.value)
-
- def _Lambda(self, t):
- self.write("(")
- self.write("lambda ")
- self.dispatch(t.args)
- self.write(": ")
- self.dispatch(t.body)
- self.write(")")
-
- def _alias(self, t):
- self.write(t.name)
- if t.asname:
- self.write(" as "+t.asname)
-
-def roundtrip(filename, output=sys.stdout):
- with open(filename, "r") as pyfile:
- source = pyfile.read()
- tree = compile(source, filename, "exec", ast.PyCF_ONLY_AST)
- Unparser(tree, output)
-
-
-
-def testdir(a):
- try:
- names = [n for n in os.listdir(a) if n.endswith('.py')]
- except OSError:
- sys.stderr.write("Directory not readable: %s" % a)
- else:
- for n in names:
- fullname = os.path.join(a, n)
- if os.path.isfile(fullname):
- output = cStringIO.StringIO()
- print 'Testing %s' % fullname
- try:
- roundtrip(fullname, output)
- except Exception as e:
- print ' Failed to compile, exception is %s' % repr(e)
- elif os.path.isdir(fullname):
- testdir(fullname)
-
-def main(args):
- if args[0] == '--testdir':
- for a in args[1:]:
- testdir(a)
- else:
- for a in args:
- roundtrip(a)
-
-if __name__=='__main__':
- main(sys.argv[1:])
diff --git a/pinfer/unparse3.py b/pinfer/unparse3.py
deleted file mode 100644
index 0936cb2..0000000
--- a/pinfer/unparse3.py
+++ /dev/null
@@ -1,610 +0,0 @@
-# From Python 3's Tools/parser/unparse.py
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
-# 2011, 2012, 2013, 2014 Python Software Foundation; All Rights Reserved
-
-"Usage: unparse.py <path to source file>"
-import sys
-import ast
-import tokenize
-import io
-import os
-
-# Large float and imaginary literals get turned into infinities in the AST.
-# We unparse those infinities to INFSTR.
-INFSTR = "1e" + repr(sys.float_info.max_10_exp + 1)
-
-def interleave(inter, f, seq):
- """Call f on each item in seq, calling inter() in between.
- """
- seq = iter(seq)
- try:
- f(next(seq))
- except StopIteration:
- pass
- else:
- for x in seq:
- inter()
- f(x)
-
-class Unparser:
- """Methods in this class recursively traverse an AST and
- output source code for the abstract syntax; original formatting
- is disregarded. """
-
- def __init__(self, tree, file = sys.stdout):
- """Unparser(tree, file=sys.stdout) -> None.
- Print the source for tree to file."""
- self.f = file
- self._indent = 0
- self.dispatch(tree)
- print("", file=self.f)
- self.f.flush()
-
- def fill(self, text = ""):
- "Indent a piece of text, according to the current indentation level"
- self.f.write("\n"+" "*self._indent + text)
-
- def write(self, text):
- "Append a piece of text to the current line."
- self.f.write(text)
-
- def enter(self):
- "Print ':', and increase the indentation."
- self.write(":")
- self._indent += 1
-
- def leave(self):
- "Decrease the indentation level."
- self._indent -= 1
-
- def dispatch(self, tree):
- "Dispatcher function, dispatching tree type T to method _T."
- if isinstance(tree, list):
- for t in tree:
- self.dispatch(t)
- return
- meth = getattr(self, "_"+tree.__class__.__name__)
- meth(tree)
-
-
- ############### Unparsing methods ######################
- # There should be one method per concrete grammar type #
- # Constructors should be grouped by sum type. Ideally, #
- # this would follow the order in the grammar, but #
- # currently doesn't. #
- ########################################################
-
- def _Module(self, tree):
- for stmt in tree.body:
- self.dispatch(stmt)
-
- # stmt
- def _Expr(self, tree):
- self.fill()
- self.dispatch(tree.value)
-
- def _Import(self, t):
- self.fill("import ")
- interleave(lambda: self.write(", "), self.dispatch, t.names)
-
- def _ImportFrom(self, t):
- self.fill("from ")
- self.write("." * t.level)
- if t.module:
- self.write(t.module)
- self.write(" import ")
- interleave(lambda: self.write(", "), self.dispatch, t.names)
-
- def _Assign(self, t):
- self.fill()
- for target in t.targets:
- self.dispatch(target)
- self.write(" = ")
- self.dispatch(t.value)
-
- def _AugAssign(self, t):
- self.fill()
- self.dispatch(t.target)
- self.write(" "+self.binop[t.op.__class__.__name__]+"= ")
- self.dispatch(t.value)
-
- def _Return(self, t):
- self.fill("return")
- if t.value:
- self.write(" ")
- self.dispatch(t.value)
-
- def _Pass(self, t):
- self.fill("pass")
-
- def _Break(self, t):
- self.fill("break")
-
- def _Continue(self, t):
- self.fill("continue")
-
- def _Delete(self, t):
- self.fill("del ")
- interleave(lambda: self.write(", "), self.dispatch, t.targets)
-
- def _Assert(self, t):
- self.fill("assert ")
- self.dispatch(t.test)
- if t.msg:
- self.write(", ")
- self.dispatch(t.msg)
-
- def _Global(self, t):
- self.fill("global ")
- interleave(lambda: self.write(", "), self.write, t.names)
-
- def _Nonlocal(self, t):
- self.fill("nonlocal ")
- interleave(lambda: self.write(", "), self.write, t.names)
-
- def _Yield(self, t):
- self.write("(")
- self.write("yield")
- if t.value:
- self.write(" ")
- self.dispatch(t.value)
- self.write(")")
-
- def _YieldFrom(self, t):
- self.write("(")
- self.write("yield from")
- if t.value:
- self.write(" ")
- self.dispatch(t.value)
- self.write(")")
-
- def _Raise(self, t):
- self.fill("raise")
- if not t.exc:
- assert not t.cause
- return
- self.write(" ")
- self.dispatch(t.exc)
- if t.cause:
- self.write(" from ")
- self.dispatch(t.cause)
-
- def _Try(self, t):
- self.fill("try")
- self.enter()
- self.dispatch(t.body)
- self.leave()
- for ex in t.handlers:
- self.dispatch(ex)
- if t.orelse:
- self.fill("else")
- self.enter()
- self.dispatch(t.orelse)
- self.leave()
- if t.finalbody:
- self.fill("finally")
- self.enter()
- self.dispatch(t.finalbody)
- self.leave()
-
- def _ExceptHandler(self, t):
- self.fill("except")
- if t.type:
- self.write(" ")
- self.dispatch(t.type)
- if t.name:
- self.write(" as ")
- self.write(t.name)
- self.enter()
- self.dispatch(t.body)
- self.leave()
-
- def _ClassDef(self, t):
- self.write("\n")
- for deco in t.decorator_list:
- self.fill("@")
- self.dispatch(deco)
- self.fill("class "+t.name)
- self.write("(")
- comma = False
- for e in t.bases:
- if comma: self.write(", ")
- else: comma = True
- self.dispatch(e)
- for e in t.keywords:
- if comma: self.write(", ")
- else: comma = True
- self.dispatch(e)
- if t.starargs:
- if comma: self.write(", ")
- else: comma = True
- self.write("*")
- self.dispatch(t.starargs)
- if t.kwargs:
- if comma: self.write(", ")
- else: comma = True
- self.write("**")
- self.dispatch(t.kwargs)
- self.write(")")
-
- self.enter()
- self.dispatch(t.body)
- self.leave()
-
- def _FunctionDef(self, t):
- self.write("\n")
- for deco in t.decorator_list:
- self.fill("@")
- self.dispatch(deco)
- self.fill("def "+t.name + "(")
- self.dispatch(t.args)
- self.write(")")
- if t.returns:
- self.write(" -> ")
- self.dispatch(t.returns)
- self.enter()
- self.dispatch(t.body)
- self.leave()
-
- def _For(self, t):
- self.fill("for ")
- self.dispatch(t.target)
- self.write(" in ")
- self.dispatch(t.iter)
- self.enter()
- self.dispatch(t.body)
- self.leave()
- if t.orelse:
- self.fill("else")
- self.enter()
- self.dispatch(t.orelse)
- self.leave()
-
- def _If(self, t):
- self.fill("if ")
- self.dispatch(t.test)
- self.enter()
- self.dispatch(t.body)
- self.leave()
- # collapse nested ifs into equivalent elifs.
- while (t.orelse and len(t.orelse) == 1 and
- isinstance(t.orelse[0], ast.If)):
- t = t.orelse[0]
- self.fill("elif ")
- self.dispatch(t.test)
- self.enter()
- self.dispatch(t.body)
- self.leave()
- # final else
- if t.orelse:
- self.fill("else")
- self.enter()
- self.dispatch(t.orelse)
- self.leave()
-
- def _While(self, t):
- self.fill("while ")
- self.dispatch(t.test)
- self.enter()
- self.dispatch(t.body)
- self.leave()
- if t.orelse:
- self.fill("else")
- self.enter()
- self.dispatch(t.orelse)
- self.leave()
-
- def _With(self, t):
- self.fill("with ")
- interleave(lambda: self.write(", "), self.dispatch, t.items)
- self.enter()
- self.dispatch(t.body)
- self.leave()
-
- # expr
- def _Bytes(self, t):
- self.write(repr(t.s))
-
- def _Str(self, tree):
- self.write(repr(tree.s))
-
- def _Name(self, t):
- self.write(t.id)
-
- def _NameConstant(self, t):
- self.write(repr(t.value))
-
- def _Num(self, t):
- # Substitute overflowing decimal literal for AST infinities.
- self.write(repr(t.n).replace("inf", INFSTR))
-
- def _List(self, t):
- self.write("[")
- interleave(lambda: self.write(", "), self.dispatch, t.elts)
- self.write("]")
-
- def _ListComp(self, t):
- self.write("[")
- self.dispatch(t.elt)
- for gen in t.generators:
- self.dispatch(gen)
- self.write("]")
-
- def _GeneratorExp(self, t):
- self.write("(")
- self.dispatch(t.elt)
- for gen in t.generators:
- self.dispatch(gen)
- self.write(")")
-
- def _SetComp(self, t):
- self.write("{")
- self.dispatch(t.elt)
- for gen in t.generators:
- self.dispatch(gen)
- self.write("}")
-
- def _DictComp(self, t):
- self.write("{")
- self.dispatch(t.key)
- self.write(": ")
- self.dispatch(t.value)
- for gen in t.generators:
- self.dispatch(gen)
- self.write("}")
-
- def _comprehension(self, t):
- self.write(" for ")
- self.dispatch(t.target)
- self.write(" in ")
- self.dispatch(t.iter)
- for if_clause in t.ifs:
- self.write(" if ")
- self.dispatch(if_clause)
-
- def _IfExp(self, t):
- self.write("(")
- self.dispatch(t.body)
- self.write(" if ")
- self.dispatch(t.test)
- self.write(" else ")
- self.dispatch(t.orelse)
- self.write(")")
-
- def _Set(self, t):
- assert(t.elts) # should be at least one element
- self.write("{")
- interleave(lambda: self.write(", "), self.dispatch, t.elts)
- self.write("}")
-
- def _Dict(self, t):
- self.write("{")
- def write_pair(pair):
- (k, v) = pair
- self.dispatch(k)
- self.write(": ")
- self.dispatch(v)
- interleave(lambda: self.write(", "), write_pair, zip(t.keys, t.values))
- self.write("}")
-
- def _Tuple(self, t):
- self.write("(")
- if len(t.elts) == 1:
- (elt,) = t.elts
- self.dispatch(elt)
- self.write(",")
- else:
- interleave(lambda: self.write(", "), self.dispatch, t.elts)
- self.write(")")
-
- unop = {"Invert":"~", "Not": "not", "UAdd":"+", "USub":"-"}
- def _UnaryOp(self, t):
- self.write("(")
- self.write(self.unop[t.op.__class__.__name__])
- self.write(" ")
- self.dispatch(t.operand)
- self.write(")")
-
- binop = { "Add":"+", "Sub":"-", "Mult":"*", "Div":"/", "Mod":"%",
- "LShift":"<<", "RShift":">>", "BitOr":"|", "BitXor":"^", "BitAnd":"&",
- "FloorDiv":"//", "Pow": "**"}
- def _BinOp(self, t):
- self.write("(")
- self.dispatch(t.left)
- self.write(" " + self.binop[t.op.__class__.__name__] + " ")
- self.dispatch(t.right)
- self.write(")")
-
- cmpops = {"Eq":"==", "NotEq":"!=", "Lt":"<", "LtE":"<=", "Gt":">", "GtE":">=",
- "Is":"is", "IsNot":"is not", "In":"in", "NotIn":"not in"}
- def _Compare(self, t):
- self.write("(")
- self.dispatch(t.left)
- for o, e in zip(t.ops, t.comparators):
- self.write(" " + self.cmpops[o.__class__.__name__] + " ")
- self.dispatch(e)
- self.write(")")
-
- boolops = {ast.And: 'and', ast.Or: 'or'}
- def _BoolOp(self, t):
- self.write("(")
- s = " %s " % self.boolops[t.op.__class__]
- interleave(lambda: self.write(s), self.dispatch, t.values)
- self.write(")")
-
- def _Attribute(self,t):
- self.dispatch(t.value)
- # Special case: 3.__abs__() is a syntax error, so if t.value
- # is an integer literal then we need to either parenthesize
- # it or add an extra space to get 3 .__abs__().
- if isinstance(t.value, ast.Num) and isinstance(t.value.n, int):
- self.write(" ")
- self.write(".")
- self.write(t.attr)
-
- def _Call(self, t):
- self.dispatch(t.func)
- self.write("(")
- comma = False
- for e in t.args:
- if comma: self.write(", ")
- else: comma = True
- self.dispatch(e)
- for e in t.keywords:
- if comma: self.write(", ")
- else: comma = True
- self.dispatch(e)
- if t.starargs:
- if comma: self.write(", ")
- else: comma = True
- self.write("*")
- self.dispatch(t.starargs)
- if t.kwargs:
- if comma: self.write(", ")
- else: comma = True
- self.write("**")
- self.dispatch(t.kwargs)
- self.write(")")
-
- def _Subscript(self, t):
- self.dispatch(t.value)
- self.write("[")
- self.dispatch(t.slice)
- self.write("]")
-
- def _Starred(self, t):
- self.write("*")
- self.dispatch(t.value)
-
- # slice
- def _Ellipsis(self, t):
- self.write("...")
-
- def _Index(self, t):
- self.dispatch(t.value)
-
- def _Slice(self, t):
- if t.lower:
- self.dispatch(t.lower)
- self.write(":")
- if t.upper:
- self.dispatch(t.upper)
- if t.step:
- self.write(":")
- self.dispatch(t.step)
-
- def _ExtSlice(self, t):
- interleave(lambda: self.write(', '), self.dispatch, t.dims)
-
- # argument
- def _arg(self, t):
- self.write(t.arg)
- if t.annotation:
- self.write(": ")
- self.dispatch(t.annotation)
-
- # others
- def _arguments(self, t):
- first = True
- # normal arguments
- defaults = [None] * (len(t.args) - len(t.defaults)) + t.defaults
- for a, d in zip(t.args, defaults):
- if first:first = False
- else: self.write(", ")
- self.dispatch(a)
- if d:
- self.write("=")
- self.dispatch(d)
-
- # varargs, or bare '*' if no varargs but keyword-only arguments present
- if t.vararg or t.kwonlyargs:
- if first:first = False
- else: self.write(", ")
- self.write("*")
- if t.vararg:
- self.write(t.vararg.arg)
- if t.vararg.annotation:
- self.write(": ")
- self.dispatch(t.vararg.annotation)
-
- # keyword-only arguments
- if t.kwonlyargs:
- for a, d in zip(t.kwonlyargs, t.kw_defaults):
- if first:first = False
- else: self.write(", ")
- self.dispatch(a),
- if d:
- self.write("=")
- self.dispatch(d)
-
- # kwargs
- if t.kwarg:
- if first:first = False
- else: self.write(", ")
- self.write("**"+t.kwarg.arg)
- if t.kwarg.annotation:
- self.write(": ")
- self.dispatch(t.kwarg.annotation)
-
- def _keyword(self, t):
- self.write(t.arg)
- self.write("=")
- self.dispatch(t.value)
-
- def _Lambda(self, t):
- self.write("(")
- self.write("lambda ")
- self.dispatch(t.args)
- self.write(": ")
- self.dispatch(t.body)
- self.write(")")
-
- def _alias(self, t):
- self.write(t.name)
- if t.asname:
- self.write(" as "+t.asname)
-
- def _withitem(self, t):
- self.dispatch(t.context_expr)
- if t.optional_vars:
- self.write(" as ")
- self.dispatch(t.optional_vars)
-
-def roundtrip(filename, output=sys.stdout):
- with open(filename, "rb") as pyfile:
- encoding = tokenize.detect_encoding(pyfile.readline)[0]
- with open(filename, "r", encoding=encoding) as pyfile:
- source = pyfile.read()
- tree = compile(source, filename, "exec", ast.PyCF_ONLY_AST)
- Unparser(tree, output)
-
-
-
-def testdir(a):
- try:
- names = [n for n in os.listdir(a) if n.endswith('.py')]
- except OSError:
- print("Directory not readable: %s" % a, file=sys.stderr)
- else:
- for n in names:
- fullname = os.path.join(a, n)
- if os.path.isfile(fullname):
- output = io.StringIO()
- print('Testing %s' % fullname)
- try:
- roundtrip(fullname, output)
- except Exception as e:
- print(' Failed to compile, exception is %s' % repr(e))
- elif os.path.isdir(fullname):
- testdir(fullname)
-
-def main(args):
- if args[0] == '--testdir':
- for a in args[1:]:
- testdir(a)
- else:
- for a in args:
- roundtrip(a)
-
-if __name__=='__main__':
- main(sys.argv[1:])
diff --git a/pytest.ini b/pytest.ini
deleted file mode 100644
index 2b14288..0000000
--- a/pytest.ini
+++ /dev/null
@@ -1,14 +0,0 @@
-[pytest]
-# testpaths is new in 2.8
-minversion = 2.8
-
-testpaths = mypy/test
-
-python_files = test*.py
-
-# empty patterns for default python collector, to stick to our plugin's collector
-python_classes =
-python_functions =
-
-# always run in parallel (requires pytest-xdist, see test-requirements.txt)
-addopts = -nauto --cov-append --cov-report=
diff --git a/runtests.py b/runtests.py
deleted file mode 100755
index 05f6179..0000000
--- a/runtests.py
+++ /dev/null
@@ -1,428 +0,0 @@
-#!/usr/bin/env python3
-"""Mypy test runner."""
-
-if False:
- import typing
-
-if True:
- # When this is run as a script, `typing` is not available yet.
- import sys
- from os.path import join, isdir
-
- def get_versions(): # type: () -> typing.List[str]
- major = sys.version_info[0]
- minor = sys.version_info[1]
- if major == 2:
- return ['2.7']
- else:
- # generates list of python versions to use.
- # For Python2, this is only [2.7].
- # Otherwise, it is [3.4, 3.3, 3.2, 3.1, 3.0].
- return ['%d.%d' % (major, i) for i in range(minor, -1, -1)]
-
- sys.path[0:0] = [v for v in [join('lib-typing', v) for v in get_versions()] if isdir(v)]
- # Now `typing` is available.
-
-
-from typing import Dict, List, Optional, Set, Iterable
-
-from mypy.waiter import Waiter, LazySubprocess
-from mypy import util
-from mypy.test.config import test_data_prefix
-from mypy.test.testpythoneval import python_eval_files, python_34_eval_files
-
-import itertools
-import os
-import re
-
-
-# Ideally, all tests would be `discover`able so that they can be driven
-# (and parallelized) by an external test driver.
-
-class Driver:
-
- def __init__(self, whitelist: List[str], blacklist: List[str],
- arglist: List[str], verbosity: int, parallel_limit: int,
- xfail: List[str], coverage: bool) -> None:
- self.whitelist = whitelist
- self.blacklist = blacklist
- self.arglist = arglist
- self.verbosity = verbosity
- self.waiter = Waiter(verbosity=verbosity, limit=parallel_limit, xfail=xfail)
- self.versions = get_versions()
- self.cwd = os.getcwd()
- self.mypy = os.path.join(self.cwd, 'scripts', 'mypy')
- self.env = dict(os.environ)
- self.coverage = coverage
-
- def prepend_path(self, name: str, paths: List[str]) -> None:
- old_val = self.env.get(name)
- paths = [p for p in paths if isdir(p)]
- if not paths:
- return
- if old_val is not None:
- new_val = ':'.join(itertools.chain(paths, [old_val]))
- else:
- new_val = ':'.join(paths)
- self.env[name] = new_val
-
- def allow(self, name: str) -> bool:
- if any(f in name for f in self.whitelist):
- if not any(f in name for f in self.blacklist):
- if self.verbosity >= 2:
- print('SELECT #%d %s' % (len(self.waiter.queue), name))
- return True
- if self.verbosity >= 3:
- print('OMIT %s' % name)
- return False
-
- def add_mypy_cmd(self, name: str, mypy_args: List[str], cwd: Optional[str] = None) -> None:
- full_name = 'check %s' % name
- if not self.allow(full_name):
- return
- args = [sys.executable, self.mypy] + mypy_args
- args.append('--show-traceback')
- self.waiter.add(LazySubprocess(full_name, args, cwd=cwd, env=self.env))
-
- def add_mypy(self, name: str, *args: str, cwd: Optional[str] = None) -> None:
- self.add_mypy_cmd(name, list(args), cwd=cwd)
-
- def add_mypy_modules(self, name: str, modules: Iterable[str],
- cwd: Optional[str] = None) -> None:
- args = list(itertools.chain(*(['-m', mod] for mod in modules)))
- self.add_mypy_cmd(name, args, cwd=cwd)
-
- def add_mypy_package(self, name: str, packagename: str, *flags: str) -> None:
- self.add_mypy_cmd(name, ['-p', packagename] + list(flags))
-
- def add_mypy_string(self, name: str, *args: str, cwd: Optional[str] = None) -> None:
- self.add_mypy_cmd(name, ['-c'] + list(args), cwd=cwd)
-
- def add_pytest(self, name: str, pytest_args: List[str], coverage: bool = False) -> None:
- full_name = 'pytest %s' % name
- if not self.allow(full_name):
- return
- if coverage and self.coverage:
- args = [sys.executable, '-m', 'pytest', '--cov=mypy'] + pytest_args
- else:
- args = [sys.executable, '-m', 'pytest'] + pytest_args
-
- self.waiter.add(LazySubprocess(full_name, args, env=self.env))
-
- def add_python(self, name: str, *args: str, cwd: Optional[str] = None) -> None:
- name = 'run %s' % name
- if not self.allow(name):
- return
- largs = list(args)
- largs[0:0] = [sys.executable]
- env = self.env
- self.waiter.add(LazySubprocess(name, largs, cwd=cwd, env=env))
-
- def add_python_mod(self, name: str, *args: str, cwd: Optional[str] = None,
- coverage: bool = False) -> None:
- name = 'run %s' % name
- if not self.allow(name):
- return
- largs = list(args)
- if coverage and self.coverage:
- largs[0:0] = ['coverage', 'run', '-m']
- else:
- largs[0:0] = [sys.executable, '-m']
- env = self.env
- self.waiter.add(LazySubprocess(name, largs, cwd=cwd, env=env))
-
- def add_python_string(self, name: str, *args: str, cwd: Optional[str] = None) -> None:
- name = 'run %s' % name
- if not self.allow(name):
- return
- largs = list(args)
- largs[0:0] = [sys.executable, '-c']
- env = self.env
- self.waiter.add(LazySubprocess(name, largs, cwd=cwd, env=env))
-
- def add_python2(self, name: str, *args: str, cwd: Optional[str] = None) -> None:
- name = 'run2 %s' % name
- if not self.allow(name):
- return
- largs = list(args)
- python2 = util.try_find_python2_interpreter()
- assert python2, "Couldn't find a Python 2.7 interpreter"
- largs[0:0] = [python2]
- env = self.env
- self.waiter.add(LazySubprocess(name, largs, cwd=cwd, env=env))
-
- def add_flake8(self, cwd: Optional[str] = None) -> None:
- name = 'lint'
- if not self.allow(name):
- return
- largs = ['flake8', '-j{}'.format(self.waiter.limit)]
- env = self.env
- self.waiter.add(LazySubprocess(name, largs, cwd=cwd, env=env))
-
- def list_tasks(self) -> None:
- for id, task in enumerate(self.waiter.queue):
- print('{id}:{task}'.format(id=id, task=task.name))
-
-
-def add_basic(driver: Driver) -> None:
- if False:
- driver.add_mypy('file setup.py', 'setup.py')
- driver.add_mypy('file runtests.py', 'runtests.py')
- driver.add_mypy('legacy entry script', 'scripts/mypy')
- driver.add_mypy('legacy myunit script', 'scripts/myunit')
- # needs typed_ast installed:
- driver.add_mypy('fast-parse', '--fast-parse', 'test-data/samples/hello.py')
-
-
-def add_selftypecheck(driver: Driver) -> None:
- driver.add_mypy_package('package mypy', 'mypy', '--fast-parser', '--warn-no-return',
- '--config-file', 'mypy_self_check.ini')
- driver.add_mypy_package('package mypy', 'mypy', '--fast-parser',
- '--config-file', 'mypy_strict_optional.ini')
-
-
-def find_files(base: str, prefix: str = '', suffix: str = '') -> List[str]:
- return [join(root, f)
- for root, dirs, files in os.walk(base)
- for f in files
- if f.startswith(prefix) and f.endswith(suffix)]
-
-
-def file_to_module(file: str) -> str:
- rv = os.path.splitext(file)[0].replace(os.sep, '.')
- if rv.endswith('.__init__'):
- rv = rv[:-len('.__init__')]
- return rv
-
-
-def add_imports(driver: Driver) -> None:
- # Make sure each module can be imported originally.
- # There is currently a bug in mypy where a module can pass typecheck
- # because of *implicit* imports from other modules.
- for f in find_files('mypy', suffix='.py'):
- mod = file_to_module(f)
- if not mod.endswith('.__main__'):
- driver.add_python_string('import %s' % mod, 'import %s' % mod)
-
-
-PYTEST_FILES = [os.path.join('mypy', 'test', '{}.py'.format(name)) for name in [
- 'testcheck', 'testextensions',
-]]
-
-
-def add_pytest(driver: Driver) -> None:
- for f in PYTEST_FILES:
- driver.add_pytest(f, [f] + driver.arglist, True)
-
-
-def add_myunit(driver: Driver) -> None:
- for f in find_files('mypy', prefix='test', suffix='.py'):
- mod = file_to_module(f)
- if mod in ('mypy.test.testpythoneval', 'mypy.test.testcmdline'):
- # Run Python evaluation integration tests and command-line
- # parsing tests separately since they are much slower than
- # proper unit tests.
- pass
- elif f in PYTEST_FILES:
- # This module has been converted to pytest; don't try to use myunit.
- pass
- else:
- driver.add_python_mod('unit-test %s' % mod, 'mypy.myunit', '-m', mod,
- *driver.arglist, coverage=True)
-
-
-def add_pythoneval(driver: Driver) -> None:
- cases = set()
- case_re = re.compile(r'^\[case ([^\]]+)\]$')
- for file in python_eval_files + python_34_eval_files:
- with open(os.path.join(test_data_prefix, file), 'r') as f:
- for line in f:
- m = case_re.match(line)
- if m:
- case_name = m.group(1)
- assert case_name[:4] == 'test'
- cases.add(case_name[4:5])
-
- for prefix in sorted(cases):
- driver.add_python_mod(
- 'eval-test-' + prefix,
- 'mypy.myunit',
- '-m',
- 'mypy.test.testpythoneval',
- 'test_testpythoneval_PythonEvaluationSuite.test' + prefix + '*',
- *driver.arglist,
- coverage=True
- )
-
-
-def add_cmdline(driver: Driver) -> None:
- driver.add_python_mod('cmdline-test', 'mypy.myunit',
- '-m', 'mypy.test.testcmdline', *driver.arglist,
- coverage=True)
-
-
-def add_stubs(driver: Driver) -> None:
- # We only test each module in the one version mypy prefers to find.
- # TODO: test stubs for other versions, especially Python 2 stubs.
-
- modules = set() # type: Set[str]
- modules.add('typing')
- # TODO: This should also test Python 2, and pass pyversion accordingly.
- for version in ["2and3", "3", "3.3", "3.4", "3.5"]:
- for stub_type in ['builtins', 'stdlib', 'third_party']:
- stubdir = join('typeshed', stub_type, version)
- for f in find_files(stubdir, suffix='.pyi'):
- module = file_to_module(f[len(stubdir) + 1:])
- modules.add(module)
-
- driver.add_mypy_modules('stubs', sorted(modules))
-
-
-def add_stdlibsamples(driver: Driver) -> None:
- seen = set() # type: Set[str]
- for version in driver.versions:
- stdlibsamples_dir = join(driver.cwd, 'test-data', 'stdlib-samples', version)
- modules = [] # type: List[str]
- for f in find_files(stdlibsamples_dir, prefix='test_', suffix='.py'):
- module = file_to_module(f[len(stdlibsamples_dir) + 1:])
- if module not in seen:
- seen.add(module)
- modules.append(module)
- if modules:
- driver.add_mypy_modules('stdlibsamples (%s)' % (version,), modules,
- cwd=stdlibsamples_dir)
-
-
-def add_samples(driver: Driver) -> None:
- for f in find_files(os.path.join('test-data', 'samples'), suffix='.py'):
- driver.add_mypy('file %s' % f, f, '--fast-parser')
-
-
-def usage(status: int) -> None:
- print('Usage: %s [-h | -v | -q | [-x] FILTER | -a ARG] ... [-- FILTER ...]' % sys.argv[0])
- print()
- print('Run mypy tests. If given no arguments, run all tests.')
- print()
- print('Examples:')
- print(' %s unit-test (run unit tests only)' % sys.argv[0])
- print(' %s unit-test -a "*tuple*"' % sys.argv[0])
- print(' (run all unit tests with "tuple" in test name)')
- print()
- print('Options:')
- print(' -h, --help show this help')
- print(' -v, --verbose increase driver verbosity')
- print(' -q, --quiet decrease driver verbosity')
- print(' -jN run N tasks at once (default: one per CPU)')
- print(' -a, --argument ARG pass an argument to myunit tasks')
- print(' (-v: verbose; glob pattern: filter by test name)')
- print(' -l, --list list included tasks (after filtering) and exit')
- print(' FILTER include tasks matching FILTER')
- print(' -x, --exclude FILTER exclude tasks matching FILTER')
- print(' -c, --coverage calculate code coverage while running tests')
- print(' -- treat all remaining arguments as positional')
- sys.exit(status)
-
-
-def sanity() -> None:
- paths = os.getenv('PYTHONPATH')
- if paths is None:
- return
- failed = False
- for p in paths.split(os.pathsep):
- if not os.path.isabs(p):
- print('Relative PYTHONPATH entry %r' % p)
- failed = True
- if failed:
- print('Please use absolute so that chdir() tests can work.')
- print('Cowardly refusing to continue.')
- sys.exit(1)
-
-
-def main() -> None:
- sanity()
-
- verbosity = 0
- parallel_limit = 0
- whitelist = [] # type: List[str]
- blacklist = [] # type: List[str]
- arglist = [] # type: List[str]
- list_only = False
- coverage = False
-
- allow_opts = True
- curlist = whitelist
- for a in sys.argv[1:]:
- if curlist is not arglist and allow_opts and a.startswith('-'):
- if curlist is not whitelist:
- break
- if a == '--':
- allow_opts = False
- elif a == '-v' or a == '--verbose':
- verbosity += 1
- elif a == '-q' or a == '--quiet':
- verbosity -= 1
- elif a.startswith('-j'):
- try:
- parallel_limit = int(a[2:])
- except ValueError:
- usage(1)
- elif a == '-x' or a == '--exclude':
- curlist = blacklist
- elif a == '-a' or a == '--argument':
- curlist = arglist
- elif a == '-l' or a == '--list':
- list_only = True
- elif a == '-c' or a == '--coverage':
- coverage = True
- elif a == '-h' or a == '--help':
- usage(0)
- else:
- usage(1)
- else:
- curlist.append(a)
- curlist = whitelist
- if curlist is blacklist:
- sys.exit('-x must be followed by a filter')
- if curlist is arglist:
- sys.exit('-a must be followed by an argument')
- # empty string is a substring of all names
- if not whitelist:
- whitelist.append('')
-
- driver = Driver(whitelist=whitelist, blacklist=blacklist, arglist=arglist,
- verbosity=verbosity, parallel_limit=parallel_limit, xfail=[], coverage=coverage)
-
- driver.prepend_path('PATH', [join(driver.cwd, 'scripts')])
- driver.prepend_path('MYPYPATH', [driver.cwd])
- driver.prepend_path('PYTHONPATH', [driver.cwd])
- driver.prepend_path('PYTHONPATH', [join(driver.cwd, 'lib-typing', v) for v in driver.versions])
-
- add_pythoneval(driver)
- add_cmdline(driver)
- add_basic(driver)
- add_selftypecheck(driver)
- add_pytest(driver)
- add_myunit(driver)
- add_imports(driver)
- add_stubs(driver)
- add_stdlibsamples(driver)
- add_samples(driver)
- driver.add_flake8()
-
- if list_only:
- driver.list_tasks()
- return
-
- exit_code = driver.waiter.run()
-
- if verbosity >= 1:
- times = driver.waiter.times2 if verbosity >= 2 else driver.waiter.times1
- times_sortable = ((t, tp) for (tp, t) in times.items())
- for total_time, test_type in sorted(times_sortable, reverse=True):
- print('total time in %s: %f' % (test_type, total_time))
-
- sys.exit(exit_code)
-
-
-if __name__ == '__main__':
- main()
diff --git a/scripts/myunit b/scripts/myunit
deleted file mode 100755
index 43fce06..0000000
--- a/scripts/myunit
+++ /dev/null
@@ -1,9 +0,0 @@
-#!/usr/bin/env python3
-"""Myunit test runner command line tool.
-
-Usually used as a slave by runtests.py, but can be used directly.
-"""
-
-from mypy.myunit import main
-
-main()
diff --git a/setup.cfg b/setup.cfg
index 43ab1b3..8962631 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,35 +1,13 @@
[flake8]
max-line-length = 99
-# typeshed and unit test fixtures have .pyi-specific flake8 configuration
-exclude =
- # Sphinx configuration is irrelevant
- docs/source/conf.py,
- # external library with incompatible style
- lib-typing/*,
- # conflicting styles
- misc/*,
- # external library with incompatible style
- pinfer/*,
- # conflicting styles
- scripts/*,
- # tests have more relaxed styling requirements
- # fixtures have their own .pyi-specific configuration
- test-data/*,
- # typeshed has its own .pyi-specific configuration
- typeshed/*
-
-# Things to ignore:
-# E251: spaces around default arg value (against our style)
-# E128: continuation line under-indented (too noisy)
-# F401: unused identifiers (useless, as it doesn't see inside # type: comments)
-# W601: has_key() deprecated (false positives)
-# E701: multiple statements on one line (colon) (we use this for classes with empty body)
-# W503: line break before binary operator
-# E704: multiple statements on one line (def)
-# E402: module level import not at top of file
-# B3??: Python 3 compatibility warnings
-# B006: use of mutable defaults in function signatures
-# B007: Loop control variable not used within the loop body.
+exclude =
+ docs/source/conf.py,
+ lib-typing/*,
+ misc/*,
+ pinfer/*,
+ scripts/*,
+ test-data/*,
+ typeshed/*
ignore = E251,E128,F401,W601,E701,W503,E704,E402,B3,B006,B007
[coverage:run]
@@ -41,10 +19,12 @@ parallel = true
show_missing = true
[metadata]
-# This seems to be used only by bdist_wheel.
-# You need "pip3 install wheel".
-# Then run "python3 setup.py bdist_wheel" to build a wheel file
-# (and then upload that to PyPI).
-requires-dist =
- typed-ast >= 0.6.3
- typing >= 3.5.3; python_version < "3.5"
+requires-dist =
+ typed-ast >= 0.6.3
+ typing >= 3.5.3; python_version < "3.5"
+
+[egg_info]
+tag_build =
+tag_date = 0
+tag_svn_revision = 0
+
diff --git a/test-data/.flake8 b/test-data/.flake8
deleted file mode 120000
index 3ec8bd5..0000000
--- a/test-data/.flake8
+++ /dev/null
@@ -1 +0,0 @@
-../typeshed/.flake8
\ No newline at end of file
diff --git a/test-data/samples/bottles.py b/test-data/samples/bottles.py
deleted file mode 100644
index ddf77f5..0000000
--- a/test-data/samples/bottles.py
+++ /dev/null
@@ -1,13 +0,0 @@
-import typing
-
-REFRAIN = '''
-%d bottles of beer on the wall,
-%d bottles of beer,
-take one down, pass it around,
-%d bottles of beer on the wall!
-'''
-bottles_of_beer = 99
-while bottles_of_beer > 1:
- print(REFRAIN % (bottles_of_beer, bottles_of_beer,
- bottles_of_beer - 1))
- bottles_of_beer -= 1
diff --git a/test-data/samples/class.py b/test-data/samples/class.py
deleted file mode 100644
index d2eb4ac..0000000
--- a/test-data/samples/class.py
+++ /dev/null
@@ -1,18 +0,0 @@
-import typing
-
-
-class BankAccount(object):
- def __init__(self, initial_balance: int = 0) -> None:
- self.balance = initial_balance
-
- def deposit(self, amount: int) -> None:
- self.balance += amount
-
- def withdraw(self, amount: int) -> None:
- self.balance -= amount
-
- def overdrawn(self) -> bool:
- return self.balance < 0
-my_account = BankAccount(15)
-my_account.withdraw(5)
-print(my_account.balance)
diff --git a/test-data/samples/cmdline.py b/test-data/samples/cmdline.py
deleted file mode 100644
index 105c27a..0000000
--- a/test-data/samples/cmdline.py
+++ /dev/null
@@ -1,8 +0,0 @@
-# This program adds up integers in the command line
-import sys
-import typing
-try:
- total = sum(int(arg) for arg in sys.argv[1:])
- print('sum =', total)
-except ValueError:
- print('Please supply integer arguments')
diff --git a/test-data/samples/crawl.py b/test-data/samples/crawl.py
deleted file mode 100644
index 56b6f8f..0000000
--- a/test-data/samples/crawl.py
+++ /dev/null
@@ -1,863 +0,0 @@
-#!/usr/bin/env python3.4
-
-"""A simple web crawler."""
-
-# This is cloned from <asyncio>/examples/crawl.py,
-# with type annotations added (PEP 484).
-#
-# TODO: convert to `async def` + `await` (PEP 492).
-
-import argparse
-import asyncio
-import cgi
-from http.client import BadStatusLine
-import logging
-import re
-import sys
-import time
-import urllib.parse
-from typing import Any, Generator, IO, Optional, Sequence, Set, Tuple
-
-
-ARGS = argparse.ArgumentParser(description="Web crawler")
-ARGS.add_argument(
- '--iocp', action='store_true', dest='iocp',
- default=False, help='Use IOCP event loop (Windows only)')
-ARGS.add_argument(
- '--select', action='store_true', dest='select',
- default=False, help='Use Select event loop instead of default')
-ARGS.add_argument(
- 'roots', nargs='*',
- default=[], help='Root URL (may be repeated)')
-ARGS.add_argument(
- '--max_redirect', action='store', type=int, metavar='N',
- default=10, help='Limit redirection chains (for 301, 302 etc.)')
-ARGS.add_argument(
- '--max_tries', action='store', type=int, metavar='N',
- default=4, help='Limit retries on network errors')
-ARGS.add_argument(
- '--max_tasks', action='store', type=int, metavar='N',
- default=100, help='Limit concurrent connections')
-ARGS.add_argument(
- '--max_pool', action='store', type=int, metavar='N',
- default=100, help='Limit connection pool size')
-ARGS.add_argument(
- '--exclude', action='store', metavar='REGEX',
- help='Exclude matching URLs')
-ARGS.add_argument(
- '--strict', action='store_true',
- default=True, help='Strict host matching (default)')
-ARGS.add_argument(
- '--lenient', action='store_false', dest='strict',
- default=False, help='Lenient host matching')
-ARGS.add_argument(
- '-v', '--verbose', action='count', dest='level',
- default=1, help='Verbose logging (repeat for more verbose)')
-ARGS.add_argument(
- '-q', '--quiet', action='store_const', const=0, dest='level',
- default=1, help='Quiet logging (opposite of --verbose)')
-
-
-ESCAPES = [('quot', '"'),
- ('gt', '>'),
- ('lt', '<'),
- ('amp', '&') # Must be last.
- ]
-
-
-def unescape(url: str) -> str:
- """Turn & into &, and so on.
-
- This is the inverse of cgi.escape().
- """
- for name, char in ESCAPES:
- url = url.replace('&' + name + ';', char)
- return url
-
-
-def fix_url(url: str) -> str:
- """Prefix a schema-less URL with http://."""
- if '://' not in url:
- url = 'http://' + url
- return url
-
-
-class Logger:
-
- def __init__(self, level: int) -> None:
- self.level = level
-
- def _log(self, n: int, args: Sequence[Any]) -> None:
- if self.level >= n:
- print(*args, file=sys.stderr, flush=True)
-
- def log(self, n: int, *args: Any) -> None:
- self._log(n, args)
-
- def __call__(self, n: int, *args: Any) -> None:
- self._log(n, args)
-
-
-KeyTuple = Tuple[str, int, bool]
-
-
-class ConnectionPool:
- """A connection pool.
-
- To open a connection, use reserve(). To recycle it, use unreserve().
-
- The pool is mostly just a mapping from (host, port, ssl) tuples to
- lists of Connections. The currently active connections are *not*
- in the data structure; get_connection() takes the connection out,
- and recycle_connection() puts it back in. To recycle a
- connection, call conn.close(recycle=True).
-
- There are limits to both the overall pool and the per-key pool.
- """
-
- def __init__(self, log: Logger, max_pool: int = 10, max_tasks: int = 5) -> None:
- self.log = log
- self.max_pool = max_pool # Overall limit.
- self.max_tasks = max_tasks # Per-key limit.
- self.loop = asyncio.get_event_loop()
- self.connections = {} # type: Dict[KeyTuple, List[Connection]]
- self.queue = [] # type: List[Connection]
-
- def close(self) -> None:
- """Close all connections available for reuse."""
- for conns in self.connections.values():
- for conn in conns:
- conn.close()
- self.connections.clear()
- self.queue.clear()
-
- @asyncio.coroutine
- def get_connection(self, host: str, port: int, ssl: bool) -> Generator[Any, None, 'Connection']:
- """Create or reuse a connection."""
- port = port or (443 if ssl else 80)
- try:
- ipaddrs = yield from self.loop.getaddrinfo(host, port)
- except Exception as exc:
- self.log(0, 'Exception %r for (%r, %r)' % (exc, host, port))
- raise
- self.log(1, '* %s resolves to %s' %
- (host, ', '.join(ip[4][0] for ip in ipaddrs)))
-
- # Look for a reusable connection.
- for _1, _2, _3, _4, (h, p, *_5) in ipaddrs:
- key = h, p, ssl
- conn = None
- conns = self.connections.get(key)
- while conns:
- conn = conns.pop(0)
- self.queue.remove(conn)
- if not conns:
- del self.connections[key]
- if conn.stale():
- self.log(1, 'closing stale connection for', key)
- conn.close() # Just in case.
- else:
- self.log(1, '* Reusing pooled connection', key,
- 'FD =', conn.fileno())
- return conn
-
- # Create a new connection.
- conn = Connection(self.log, self, host, port, ssl)
- yield from conn.connect()
- self.log(1, '* New connection', conn.key, 'FD =', conn.fileno())
- return conn
-
- def recycle_connection(self, conn: 'Connection') -> None:
- """Make a connection available for reuse.
-
- This also prunes the pool if it exceeds the size limits.
- """
- if conn.stale():
- conn.close()
- return
-
- key = conn.key
- conns = self.connections.setdefault(key, [])
- conns.append(conn)
- self.queue.append(conn)
-
- if len(conns) <= self.max_tasks and len(self.queue) <= self.max_pool:
- return
-
- # Prune the queue.
-
- # Close stale connections for this key first.
- stale = [conn for conn in conns if conn.stale()]
- if stale:
- for conn in stale:
- conns.remove(conn)
- self.queue.remove(conn)
- self.log(1, 'closing stale connection for', key)
- conn.close()
- if not conns:
- del self.connections[key]
-
- # Close oldest connection(s) for this key if limit reached.
- while len(conns) > self.max_tasks:
- conn = conns.pop(0)
- self.queue.remove(conn)
- self.log(1, 'closing oldest connection for', key)
- conn.close()
-
- if len(self.queue) <= self.max_pool:
- return
-
- # Close overall stale connections.
- stale = [conn for conn in self.queue if conn.stale()]
- if stale:
- for conn in stale:
- conns = self.connections.get(conn.key)
- conns.remove(conn)
- self.queue.remove(conn)
- self.log(1, 'closing stale connection for', key)
- conn.close()
-
- # Close oldest overall connection(s) if limit reached.
- while len(self.queue) > self.max_pool:
- conn = self.queue.pop(0)
- conns = self.connections.get(conn.key)
- c = conns.pop(0)
- assert conn == c, (conn.key, conn, c, conns)
- self.log(1, 'closing overall oldest connection for', conn.key)
- conn.close()
-
-
-class Connection:
-
- def __init__(self, log: Logger, pool: ConnectionPool, host: str, port: int, ssl: bool) -> None:
- self.log = log
- self.pool = pool
- self.host = host
- self.port = port
- self.ssl = ssl
- self.reader = None # type: asyncio.StreamReader
- self.writer = None # type: asyncio.StreamWriter
- self.key = None # type: KeyTuple
-
- def stale(self) -> bool:
- return self.reader is None or self.reader.at_eof()
-
- def fileno(self) -> Optional[int]:
- writer = self.writer
- if writer is not None:
- transport = writer.transport
- if transport is not None:
- sock = transport.get_extra_info('socket')
- if sock is not None:
- return sock.fileno()
- return None
-
- @asyncio.coroutine
- def connect(self) -> Generator[Any, None, None]:
- self.reader, self.writer = yield from asyncio.open_connection(
- self.host, self.port, ssl=self.ssl)
- peername = self.writer.get_extra_info('peername')
- if peername:
- self.host, self.port = peername[:2]
- else:
- self.log(1, 'NO PEERNAME???', self.host, self.port, self.ssl)
- self.key = self.host, self.port, self.ssl
-
- def close(self, recycle: bool = False) -> None:
- if recycle and not self.stale():
- self.pool.recycle_connection(self)
- else:
- self.writer.close()
- self.pool = self.reader = self.writer = None
-
-
-class Request:
- """HTTP request.
-
- Use connect() to open a connection; send_request() to send the
- request; get_response() to receive the response headers.
- """
-
- def __init__(self, log: Logger, url: str, pool: ConnectionPool) -> None:
- self.log = log
- self.url = url
- self.pool = pool
- self.parts = urllib.parse.urlparse(self.url)
- self.scheme = self.parts.scheme
- assert self.scheme in ('http', 'https'), repr(url)
- self.ssl = self.parts.scheme == 'https'
- self.netloc = self.parts.netloc
- self.hostname = self.parts.hostname
- self.port = self.parts.port or (443 if self.ssl else 80)
- self.path = (self.parts.path or '/')
- self.query = self.parts.query
- if self.query:
- self.full_path = '%s?%s' % (self.path, self.query)
- else:
- self.full_path = self.path
- self.http_version = 'HTTP/1.1'
- self.method = 'GET'
- self.headers = [] # type: List[Tuple[str, str]]
- self.conn = None # type: Connection
-
- @asyncio.coroutine
- def connect(self) -> Generator[Any, None, None]:
- """Open a connection to the server."""
- self.log(1, '* Connecting to %s:%s using %s for %s' %
- (self.hostname, self.port,
- 'ssl' if self.ssl else 'tcp',
- self.url))
- self.conn = yield from self.pool.get_connection(self.hostname,
- self.port, self.ssl)
-
- def close(self, recycle: bool = False) -> None:
- """Close the connection, recycle if requested."""
- if self.conn is not None:
- if not recycle:
- self.log(1, 'closing connection for', self.conn.key)
- self.conn.close(recycle)
- self.conn = None
-
- @asyncio.coroutine
- def putline(self, line: str) -> Generator[Any, None, None]:
- """Write a line to the connection.
-
- Used for the request line and headers.
- """
- self.log(2, '>', line)
- self.conn.writer.write(line.encode('latin-1') + b'\r\n')
-
- @asyncio.coroutine
- def send_request(self) -> Generator[Any, None, None]:
- """Send the request."""
- request_line = '%s %s %s' % (self.method, self.full_path,
- self.http_version)
- yield from self.putline(request_line)
- # TODO: What if a header is already set?
- self.headers.append(('User-Agent', 'asyncio-example-crawl/0.0'))
- self.headers.append(('Host', self.netloc))
- self.headers.append(('Accept', '*/*'))
- # self.headers.append(('Accept-Encoding', 'gzip'))
- for key, value in self.headers:
- line = '%s: %s' % (key, value)
- yield from self.putline(line)
- yield from self.putline('')
-
- @asyncio.coroutine
- def get_response(self) -> Generator[Any, None, 'Response']:
- """Receive the response."""
- response = Response(self.log, self.conn.reader)
- yield from response.read_headers()
- return response
-
-
-class Response:
- """HTTP response.
-
- Call read_headers() to receive the request headers. Then check
- the status attribute and call get_header() to inspect the headers.
- Finally call read() to receive the body.
- """
-
- def __init__(self, log: Logger, reader: asyncio.StreamReader) -> None:
- self.log = log
- self.reader = reader
- self.http_version = None # type: str # 'HTTP/1.1'
- self.status = None # type: int # 200
- self.reason = None # type: str # 'Ok'
- self.headers = [] # type: List[Tuple[str, str]] # [('Content-Type', 'text/html')]
-
- @asyncio.coroutine
- def getline(self) -> Generator[Any, None, str]:
- """Read one line from the connection."""
- line = (yield from self.reader.readline()).decode('latin-1').rstrip()
- self.log(2, '<', line)
- return line
-
- @asyncio.coroutine
- def read_headers(self) -> Generator[Any, None, None]:
- """Read the response status and the request headers."""
- status_line = yield from self.getline()
- status_parts = status_line.split(None, 2)
- if len(status_parts) != 3:
- self.log(0, 'bad status_line', repr(status_line))
- raise BadStatusLine(status_line)
- self.http_version, status, self.reason = status_parts
- self.status = int(status)
- while True:
- header_line = yield from self.getline()
- if not header_line:
- break
- # TODO: Continuation lines.
- key, value = header_line.split(':', 1)
- self.headers.append((key, value.strip()))
-
- def get_redirect_url(self, default: str = '') -> str:
- """Inspect the status and return the redirect url if appropriate."""
- if self.status not in (300, 301, 302, 303, 307):
- return default
- return self.get_header('Location', default)
-
- def get_header(self, key: str, default: str = '') -> str:
- """Get one header value, using a case insensitive header name."""
- key = key.lower()
- for k, v in self.headers:
- if k.lower() == key:
- return v
- return default
-
- @asyncio.coroutine
- def read(self) -> Generator[Any, None, bytes]:
- """Read the response body.
-
- This honors Content-Length and Transfer-Encoding: chunked.
- """
- nbytes = None
- for key, value in self.headers:
- if key.lower() == 'content-length':
- nbytes = int(value)
- break
- if nbytes is None:
- if self.get_header('transfer-encoding').lower() == 'chunked':
- self.log(2, 'parsing chunked response')
- blocks = []
- while True:
- size_header = yield from self.reader.readline()
- if not size_header:
- self.log(0, 'premature end of chunked response')
- break
- self.log(3, 'size_header =', repr(size_header))
- parts = size_header.split(b';')
- size = int(parts[0], 16)
- if size:
- self.log(3, 'reading chunk of', size, 'bytes')
- block = yield from self.reader.readexactly(size)
- assert len(block) == size, (len(block), size)
- blocks.append(block)
- crlf = yield from self.reader.readline()
- assert crlf == b'\r\n', repr(crlf)
- if not size:
- break
- body = b''.join(blocks)
- self.log(1, 'chunked response had', len(body),
- 'bytes in', len(blocks), 'blocks')
- else:
- self.log(3, 'reading until EOF')
- body = yield from self.reader.read()
- # TODO: Should make sure not to recycle the connection
- # in this case.
- else:
- body = yield from self.reader.readexactly(nbytes)
- return body
-
-
-class Fetcher:
- """Logic and state for one URL.
-
- When found in crawler.busy, this represents a URL to be fetched or
- in the process of being fetched; when found in crawler.done, this
- holds the results from fetching it.
-
- This is usually associated with a task. This references the
- crawler for the connection pool and to add more URLs to its todo
- list.
-
- Call fetch() to do the fetching, then report() to print the results.
- """
-
- def __init__(self, log: Logger, url: str, crawler: 'Crawler',
- max_redirect: int = 10, max_tries: int = 4) -> None:
- self.log = log
- self.url = url
- self.crawler = crawler
- # We don't loop resolving redirects here -- we just use this
- # to decide whether to add the redirect URL to crawler.todo.
- self.max_redirect = max_redirect
- # But we do loop to retry on errors a few times.
- self.max_tries = max_tries
- # Everything we collect from the response goes here.
- self.task = None # type: asyncio.Task
- self.exceptions = [] # type: List[Exception]
- self.tries = 0
- self.request = None # type: Request
- self.response = None # type: Response
- self.body = None # type: bytes
- self.next_url = None # type: str
- self.ctype = None # type: str
- self.pdict = None # type: Dict[str, str]
- self.encoding = None # type: str
- self.urls = None # type: Set[str]
- self.new_urls = None # type: Set[str]
-
- @asyncio.coroutine
- def fetch(self) -> Generator[Any, None, None]:
- """Attempt to fetch the contents of the URL.
-
- If successful, and the data is HTML, extract further links and
- add them to the crawler. Redirects are also added back there.
- """
- while self.tries < self.max_tries:
- self.tries += 1
- self.request = None
- try:
- self.request = Request(self.log, self.url, self.crawler.pool)
- yield from self.request.connect()
- yield from self.request.send_request()
- self.response = yield from self.request.get_response()
- self.body = yield from self.response.read()
- h_conn = self.response.get_header('connection').lower()
- if h_conn != 'close':
- self.request.close(recycle=True)
- self.request = None
- if self.tries > 1:
- self.log(1, 'try', self.tries, 'for', self.url, 'success')
- break
- except (BadStatusLine, OSError) as exc:
- self.exceptions.append(exc)
- self.log(1, 'try', self.tries, 'for', self.url,
- 'raised', repr(exc))
- # import pdb; pdb.set_trace()
- # Don't reuse the connection in this case.
- finally:
- if self.request is not None:
- self.request.close()
- else:
- # We never broke out of the while loop, i.e. all tries failed.
- self.log(0, 'no success for', self.url,
- 'in', self.max_tries, 'tries')
- return
- next_url = self.response.get_redirect_url()
- if next_url:
- self.next_url = urllib.parse.urljoin(self.url, next_url)
- if self.max_redirect > 0:
- self.log(1, 'redirect to', self.next_url, 'from', self.url)
- self.crawler.add_url(self.next_url, self.max_redirect - 1)
- else:
- self.log(0, 'redirect limit reached for', self.next_url,
- 'from', self.url)
- else:
- if self.response.status == 200:
- self.ctype = self.response.get_header('content-type')
- self.pdict = {}
- if self.ctype:
- self.ctype, self.pdict = cgi.parse_header(self.ctype)
- self.encoding = self.pdict.get('charset', 'utf-8')
- if self.ctype == 'text/html':
- body = self.body.decode(self.encoding, 'replace')
- # Replace href with (?:href|src) to follow image links.
- self.urls = set(re.findall(r'(?i)href=["\']?([^\s"\'<>]+)',
- body))
- if self.urls:
- self.log(1, 'got', len(self.urls),
- 'distinct urls from', self.url)
- self.new_urls = set()
- for url in self.urls:
- url = unescape(url)
- url = urllib.parse.urljoin(self.url, url)
- url, frag = urllib.parse.urldefrag(url)
- if self.crawler.add_url(url):
- self.new_urls.add(url)
-
- def report(self, stats: 'Stats', file: IO[str] = None) -> None:
- """Print a report on the state for this URL.
-
- Also update the Stats instance.
- """
- if self.task is not None:
- if not self.task.done():
- stats.add('pending')
- print(self.url, 'pending', file=file)
- return
- elif self.task.cancelled():
- stats.add('cancelled')
- print(self.url, 'cancelled', file=file)
- return
- elif self.task.exception():
- stats.add('exception')
- exc = self.task.exception()
- stats.add('exception_' + exc.__class__.__name__)
- print(self.url, exc, file=file)
- return
- if len(self.exceptions) == self.tries:
- stats.add('fail')
- exc = self.exceptions[-1]
- stats.add('fail_' + str(exc.__class__.__name__))
- print(self.url, 'error', exc, file=file)
- elif self.next_url:
- stats.add('redirect')
- print(self.url, self.response.status, 'redirect', self.next_url,
- file=file)
- elif self.ctype == 'text/html':
- stats.add('html')
- size = len(self.body or b'')
- stats.add('html_bytes', size)
- if self.log.level:
- print(self.url, self.response.status,
- self.ctype, self.encoding,
- size,
- '%d/%d' % (len(self.new_urls or ()), len(self.urls or ())),
- file=file)
- elif self.response is None:
- print(self.url, 'no response object')
- else:
- size = len(self.body or b'')
- if self.response.status == 200:
- stats.add('other')
- stats.add('other_bytes', size)
- else:
- stats.add('error')
- stats.add('error_bytes', size)
- stats.add('status_%s' % self.response.status)
- print(self.url, self.response.status,
- self.ctype, self.encoding,
- size,
- file=file)
-
-
-class Stats:
- """Record stats of various sorts."""
-
- def __init__(self) -> None:
- self.stats = {} # type: Dict[str, int]
-
- def add(self, key: str, count: int = 1) -> None:
- self.stats[key] = self.stats.get(key, 0) + count
-
- def report(self, file: IO[str] = None) -> None:
- for key, count in sorted(self.stats.items()):
- print('%10d' % count, key, file=file)
-
-
-class Crawler:
- """Crawl a set of URLs.
-
- This manages three disjoint sets of URLs (todo, busy, done). The
- data structures actually store dicts -- the values in todo give
- the redirect limit, while the values in busy and done are Fetcher
- instances.
- """
- def __init__(self, log: Logger,
- roots: Set[str], exclude: str = None, strict: bool = True, # What to crawl.
- max_redirect: int = 10, max_tries: int = 4, # Per-url limits.
- max_tasks: int = 10, max_pool: int = 10, # Global limits.
- ) -> None:
- self.log = log
- self.roots = roots
- self.exclude = exclude
- self.strict = strict
- self.max_redirect = max_redirect
- self.max_tries = max_tries
- self.max_tasks = max_tasks
- self.max_pool = max_pool
- self.todo = {} # type: Dict[str, int]
- self.busy = {} # type: Dict[str, Fetcher]
- self.done = {} # type: Dict[str, Fetcher]
- self.pool = ConnectionPool(self.log, max_pool, max_tasks)
- self.root_domains = set() # type: Set[str]
- for root in roots:
- host = urllib.parse.urlparse(root).hostname
- if not host:
- continue
- if re.match(r'\A[\d\.]*\Z', host):
- self.root_domains.add(host)
- else:
- host = host.lower()
- if self.strict:
- self.root_domains.add(host)
- if host.startswith('www.'):
- self.root_domains.add(host[4:])
- else:
- self.root_domains.add('www.' + host)
- else:
- parts = host.split('.')
- if len(parts) > 2:
- host = '.'.join(parts[-2:])
- self.root_domains.add(host)
- for root in roots:
- self.add_url(root)
- self.governor = asyncio.Semaphore(max_tasks)
- self.termination = asyncio.Condition()
- self.t0 = time.time()
- self.t1 = None # type: Optional[float]
-
- def close(self) -> None:
- """Close resources (currently only the pool)."""
- self.pool.close()
-
- def host_okay(self, host: str) -> bool:
- """Check if a host should be crawled.
-
- A literal match (after lowercasing) is always good. For hosts
- that don't look like IP addresses, some approximate matches
- are okay depending on the strict flag.
- """
- host = host.lower()
- if host in self.root_domains:
- return True
- if re.match(r'\A[\d\.]*\Z', host):
- return False
- if self.strict:
- return self._host_okay_strictish(host)
- else:
- return self._host_okay_lenient(host)
-
- def _host_okay_strictish(self, host: str) -> bool:
- """Check if a host should be crawled, strict-ish version.
-
- This checks for equality modulo an initial 'www.' component.
- """
- if host.startswith('www.'):
- if host[4:] in self.root_domains:
- return True
- else:
- if 'www.' + host in self.root_domains:
- return True
- return False
-
- def _host_okay_lenient(self, host: str) -> bool:
- """Check if a host should be crawled, lenient version.
-
- This compares the last two components of the host.
- """
- parts = host.split('.')
- if len(parts) > 2:
- host = '.'.join(parts[-2:])
- return host in self.root_domains
-
- def add_url(self, url: str, max_redirect: int = None) -> bool:
- """Add a URL to the todo list if not seen before."""
- if self.exclude and re.search(self.exclude, url):
- return False
- parsed = urllib.parse.urlparse(url)
- if parsed.scheme not in ('http', 'https'):
- self.log(2, 'skipping non-http scheme in', url)
- return False
- host = parsed.hostname
- if not self.host_okay(host):
- self.log(2, 'skipping non-root host in', url)
- return False
- if max_redirect is None:
- max_redirect = self.max_redirect
- if url in self.todo or url in self.busy or url in self.done:
- return False
- self.log(1, 'adding', url, max_redirect)
- self.todo[url] = max_redirect
- return True
-
- @asyncio.coroutine
- def crawl(self) -> Generator[Any, None, None]:
- """Run the crawler until all finished."""
- with (yield from self.termination):
- while self.todo or self.busy:
- if self.todo:
- url, max_redirect = self.todo.popitem()
- fetcher = Fetcher(self.log, url,
- crawler=self,
- max_redirect=max_redirect,
- max_tries=self.max_tries,
- )
- self.busy[url] = fetcher
- fetcher.task = asyncio.Task(self.fetch(fetcher))
- else:
- yield from self.termination.wait()
- self.t1 = time.time()
-
- @asyncio.coroutine
- def fetch(self, fetcher: Fetcher) -> Generator[Any, None, None]:
- """Call the Fetcher's fetch(), with a limit on concurrency.
-
- Once this returns, move the fetcher from busy to done.
- """
- url = fetcher.url
- with (yield from self.governor):
- try:
- yield from fetcher.fetch() # Fetcher gonna fetch.
- finally:
- # Force GC of the task, so the error is logged.
- fetcher.task = None
- with (yield from self.termination):
- self.done[url] = fetcher
- del self.busy[url]
- self.termination.notify()
-
- def report(self, file: IO[str] = None) -> None:
- """Print a report on all completed URLs."""
- if self.t1 is None:
- self.t1 = time.time()
- dt = self.t1 - self.t0
- if dt and self.max_tasks:
- speed = len(self.done) / dt / self.max_tasks
- else:
- speed = 0
- stats = Stats()
- print('*** Report ***', file=file)
- try:
- show = [] # type: List[Tuple[str, Fetcher]]
- show.extend(self.done.items())
- show.extend(self.busy.items())
- show.sort()
- for url, fetcher in show:
- fetcher.report(stats, file=file)
- except KeyboardInterrupt:
- print('\nInterrupted', file=file)
- print('Finished', len(self.done),
- 'urls in %.3f secs' % dt,
- '(max_tasks=%d)' % self.max_tasks,
- '(%.3f urls/sec/task)' % speed,
- file=file)
- stats.report(file=file)
- print('Todo:', len(self.todo), file=file)
- print('Busy:', len(self.busy), file=file)
- print('Done:', len(self.done), file=file)
- print('Date:', time.ctime(), 'local time', file=file)
-
-
-def main() -> None:
- """Main program.
-
- Parse arguments, set up event loop, run crawler, print report.
- """
- args = ARGS.parse_args()
- if not args.roots:
- print('Use --help for command line help')
- return
-
- log = Logger(args.level)
-
- if args.iocp:
- if sys.platform == 'win32':
- from asyncio import ProactorEventLoop
- loop = ProactorEventLoop() # type: ignore
- asyncio.set_event_loop(loop)
- else:
- assert False
- elif args.select:
- loop = asyncio.SelectorEventLoop() # type: ignore
- asyncio.set_event_loop(loop)
- else:
- loop = asyncio.get_event_loop()
-
- roots = {fix_url(root) for root in args.roots}
-
- crawler = Crawler(log,
- roots, exclude=args.exclude,
- strict=args.strict,
- max_redirect=args.max_redirect,
- max_tries=args.max_tries,
- max_tasks=args.max_tasks,
- max_pool=args.max_pool,
- )
- try:
- loop.run_until_complete(crawler.crawl()) # Crawler gonna crawl.
- except KeyboardInterrupt:
- sys.stderr.flush()
- print('\nInterrupted\n')
- finally:
- crawler.report()
- crawler.close()
- loop.close()
-
-
-if __name__ == '__main__':
- logging.basicConfig(level=logging.INFO) # type: ignore
- main()
diff --git a/test-data/samples/crawl2.py b/test-data/samples/crawl2.py
deleted file mode 100644
index 5eaad70..0000000
--- a/test-data/samples/crawl2.py
+++ /dev/null
@@ -1,852 +0,0 @@
-#!/usr/bin/env python3.4
-
-"""A simple web crawler."""
-
-# This is cloned from <asyncio>/examples/crawl.py,
-# with type annotations added (PEP 484).
-#
-# This version (crawl2.) has also been converted to use `async def` +
-# `await` (PEP 492).
-
-import argparse
-import asyncio
-import cgi
-from http.client import BadStatusLine
-import logging
-import re
-import sys
-import time
-import urllib.parse
-from typing import Any, Awaitable, IO, Optional, Sequence, Set, Tuple
-
-
-ARGS = argparse.ArgumentParser(description="Web crawler")
-ARGS.add_argument(
- '--iocp', action='store_true', dest='iocp',
- default=False, help='Use IOCP event loop (Windows only)')
-ARGS.add_argument(
- '--select', action='store_true', dest='select',
- default=False, help='Use Select event loop instead of default')
-ARGS.add_argument(
- 'roots', nargs='*',
- default=[], help='Root URL (may be repeated)')
-ARGS.add_argument(
- '--max_redirect', action='store', type=int, metavar='N',
- default=10, help='Limit redirection chains (for 301, 302 etc.)')
-ARGS.add_argument(
- '--max_tries', action='store', type=int, metavar='N',
- default=4, help='Limit retries on network errors')
-ARGS.add_argument(
- '--max_tasks', action='store', type=int, metavar='N',
- default=100, help='Limit concurrent connections')
-ARGS.add_argument(
- '--max_pool', action='store', type=int, metavar='N',
- default=100, help='Limit connection pool size')
-ARGS.add_argument(
- '--exclude', action='store', metavar='REGEX',
- help='Exclude matching URLs')
-ARGS.add_argument(
- '--strict', action='store_true',
- default=True, help='Strict host matching (default)')
-ARGS.add_argument(
- '--lenient', action='store_false', dest='strict',
- default=False, help='Lenient host matching')
-ARGS.add_argument(
- '-v', '--verbose', action='count', dest='level',
- default=1, help='Verbose logging (repeat for more verbose)')
-ARGS.add_argument(
- '-q', '--quiet', action='store_const', const=0, dest='level',
- default=1, help='Quiet logging (opposite of --verbose)')
-
-
-ESCAPES = [('quot', '"'),
- ('gt', '>'),
- ('lt', '<'),
- ('amp', '&') # Must be last.
- ]
-
-
-def unescape(url: str) -> str:
- """Turn & into &, and so on.
-
- This is the inverse of cgi.escape().
- """
- for name, char in ESCAPES:
- url = url.replace('&' + name + ';', char)
- return url
-
-
-def fix_url(url: str) -> str:
- """Prefix a schema-less URL with http://."""
- if '://' not in url:
- url = 'http://' + url
- return url
-
-
-class Logger:
-
- def __init__(self, level: int) -> None:
- self.level = level
-
- def _log(self, n: int, args: Sequence[Any]) -> None:
- if self.level >= n:
- print(*args, file=sys.stderr, flush=True)
-
- def log(self, n: int, *args: Any) -> None:
- self._log(n, args)
-
- def __call__(self, n: int, *args: Any) -> None:
- self._log(n, args)
-
-
-KeyTuple = Tuple[str, int, bool]
-
-
-class ConnectionPool:
- """A connection pool.
-
- To open a connection, use reserve(). To recycle it, use unreserve().
-
- The pool is mostly just a mapping from (host, port, ssl) tuples to
- lists of Connections. The currently active connections are *not*
- in the data structure; get_connection() takes the connection out,
- and recycle_connection() puts it back in. To recycle a
- connection, call conn.close(recycle=True).
-
- There are limits to both the overall pool and the per-key pool.
- """
-
- def __init__(self, log: Logger, max_pool: int = 10, max_tasks: int = 5) -> None:
- self.log = log
- self.max_pool = max_pool # Overall limit.
- self.max_tasks = max_tasks # Per-key limit.
- self.loop = asyncio.get_event_loop()
- self.connections = {} # type: Dict[KeyTuple, List[Connection]]
- self.queue = [] # type: List[Connection]
-
- def close(self) -> None:
- """Close all connections available for reuse."""
- for conns in self.connections.values():
- for conn in conns:
- conn.close()
- self.connections.clear()
- self.queue.clear()
-
- async def get_connection(self, host: str, port: int, ssl: bool) -> 'Connection':
- """Create or reuse a connection."""
- port = port or (443 if ssl else 80)
- try:
- ipaddrs = await self.loop.getaddrinfo(host, port)
- except Exception as exc:
- self.log(0, 'Exception %r for (%r, %r)' % (exc, host, port))
- raise
- self.log(1, '* %s resolves to %s' %
- (host, ', '.join(ip[4][0] for ip in ipaddrs)))
-
- # Look for a reusable connection.
- for _1, _2, _3, _4, (h, p, *_5) in ipaddrs:
- key = h, p, ssl
- conn = None
- conns = self.connections.get(key)
- while conns:
- conn = conns.pop(0)
- self.queue.remove(conn)
- if not conns:
- del self.connections[key]
- if conn.stale():
- self.log(1, 'closing stale connection for', key)
- conn.close() # Just in case.
- else:
- self.log(1, '* Reusing pooled connection', key,
- 'FD =', conn.fileno())
- return conn
-
- # Create a new connection.
- conn = Connection(self.log, self, host, port, ssl)
- await conn.connect()
- self.log(1, '* New connection', conn.key, 'FD =', conn.fileno())
- return conn
-
- def recycle_connection(self, conn: 'Connection') -> None:
- """Make a connection available for reuse.
-
- This also prunes the pool if it exceeds the size limits.
- """
- if conn.stale():
- conn.close()
- return
-
- key = conn.key
- conns = self.connections.setdefault(key, [])
- conns.append(conn)
- self.queue.append(conn)
-
- if len(conns) <= self.max_tasks and len(self.queue) <= self.max_pool:
- return
-
- # Prune the queue.
-
- # Close stale connections for this key first.
- stale = [conn for conn in conns if conn.stale()]
- if stale:
- for conn in stale:
- conns.remove(conn)
- self.queue.remove(conn)
- self.log(1, 'closing stale connection for', key)
- conn.close()
- if not conns:
- del self.connections[key]
-
- # Close oldest connection(s) for this key if limit reached.
- while len(conns) > self.max_tasks:
- conn = conns.pop(0)
- self.queue.remove(conn)
- self.log(1, 'closing oldest connection for', key)
- conn.close()
-
- if len(self.queue) <= self.max_pool:
- return
-
- # Close overall stale connections.
- stale = [conn for conn in self.queue if conn.stale()]
- if stale:
- for conn in stale:
- conns = self.connections.get(conn.key)
- conns.remove(conn)
- self.queue.remove(conn)
- self.log(1, 'closing stale connection for', key)
- conn.close()
-
- # Close oldest overall connection(s) if limit reached.
- while len(self.queue) > self.max_pool:
- conn = self.queue.pop(0)
- conns = self.connections.get(conn.key)
- c = conns.pop(0)
- assert conn == c, (conn.key, conn, c, conns)
- self.log(1, 'closing overall oldest connection for', conn.key)
- conn.close()
-
-
-class Connection:
-
- def __init__(self, log: Logger, pool: ConnectionPool, host: str, port: int, ssl: bool) -> None:
- self.log = log
- self.pool = pool
- self.host = host
- self.port = port
- self.ssl = ssl
- self.reader = None # type: asyncio.StreamReader
- self.writer = None # type: asyncio.StreamWriter
- self.key = None # type: KeyTuple
-
- def stale(self) -> bool:
- return self.reader is None or self.reader.at_eof()
-
- def fileno(self) -> Optional[int]:
- writer = self.writer
- if writer is not None:
- transport = writer.transport
- if transport is not None:
- sock = transport.get_extra_info('socket')
- if sock is not None:
- return sock.fileno()
- return None
-
- async def connect(self) -> None:
- self.reader, self.writer = await asyncio.open_connection(
- self.host, self.port, ssl=self.ssl)
- peername = self.writer.get_extra_info('peername')
- if peername:
- self.host, self.port = peername[:2]
- else:
- self.log(1, 'NO PEERNAME???', self.host, self.port, self.ssl)
- self.key = self.host, self.port, self.ssl
-
- def close(self, recycle: bool = False) -> None:
- if recycle and not self.stale():
- self.pool.recycle_connection(self)
- else:
- self.writer.close()
- self.pool = self.reader = self.writer = None
-
-
-class Request:
- """HTTP request.
-
- Use connect() to open a connection; send_request() to send the
- request; get_response() to receive the response headers.
- """
-
- def __init__(self, log: Logger, url: str, pool: ConnectionPool) -> None:
- self.log = log
- self.url = url
- self.pool = pool
- self.parts = urllib.parse.urlparse(self.url)
- self.scheme = self.parts.scheme
- assert self.scheme in ('http', 'https'), repr(url)
- self.ssl = self.parts.scheme == 'https'
- self.netloc = self.parts.netloc
- self.hostname = self.parts.hostname
- self.port = self.parts.port or (443 if self.ssl else 80)
- self.path = (self.parts.path or '/')
- self.query = self.parts.query
- if self.query:
- self.full_path = '%s?%s' % (self.path, self.query)
- else:
- self.full_path = self.path
- self.http_version = 'HTTP/1.1'
- self.method = 'GET'
- self.headers = [] # type: List[Tuple[str, str]]
- self.conn = None # type: Connection
-
- async def connect(self) -> None:
- """Open a connection to the server."""
- self.log(1, '* Connecting to %s:%s using %s for %s' %
- (self.hostname, self.port,
- 'ssl' if self.ssl else 'tcp',
- self.url))
- self.conn = await self.pool.get_connection(self.hostname,
- self.port, self.ssl)
-
- def close(self, recycle: bool = False) -> None:
- """Close the connection, recycle if requested."""
- if self.conn is not None:
- if not recycle:
- self.log(1, 'closing connection for', self.conn.key)
- self.conn.close(recycle)
- self.conn = None
-
- async def putline(self, line: str) -> None:
- """Write a line to the connection.
-
- Used for the request line and headers.
- """
- self.log(2, '>', line)
- self.conn.writer.write(line.encode('latin-1') + b'\r\n')
-
- async def send_request(self) -> None:
- """Send the request."""
- request_line = '%s %s %s' % (self.method, self.full_path,
- self.http_version)
- await self.putline(request_line)
- # TODO: What if a header is already set?
- self.headers.append(('User-Agent', 'asyncio-example-crawl/0.0'))
- self.headers.append(('Host', self.netloc))
- self.headers.append(('Accept', '*/*'))
- # self.headers.append(('Accept-Encoding', 'gzip'))
- for key, value in self.headers:
- line = '%s: %s' % (key, value)
- await self.putline(line)
- await self.putline('')
-
- async def get_response(self) -> 'Response':
- """Receive the response."""
- response = Response(self.log, self.conn.reader)
- await response.read_headers()
- return response
-
-
-class Response:
- """HTTP response.
-
- Call read_headers() to receive the request headers. Then check
- the status attribute and call get_header() to inspect the headers.
- Finally call read() to receive the body.
- """
-
- def __init__(self, log: Logger, reader: asyncio.StreamReader) -> None:
- self.log = log
- self.reader = reader
- self.http_version = None # type: str # 'HTTP/1.1'
- self.status = None # type: int # 200
- self.reason = None # type: str # 'Ok'
- self.headers = [] # type: List[Tuple[str, str]] # [('Content-Type', 'text/html')]
-
- async def getline(self) -> str:
- """Read one line from the connection."""
- line = (await self.reader.readline()).decode('latin-1').rstrip()
- self.log(2, '<', line)
- return line
-
- async def read_headers(self) -> None:
- """Read the response status and the request headers."""
- status_line = await self.getline()
- status_parts = status_line.split(None, 2)
- if len(status_parts) != 3:
- self.log(0, 'bad status_line', repr(status_line))
- raise BadStatusLine(status_line)
- self.http_version, status, self.reason = status_parts
- self.status = int(status)
- while True:
- header_line = await self.getline()
- if not header_line:
- break
- # TODO: Continuation lines.
- key, value = header_line.split(':', 1)
- self.headers.append((key, value.strip()))
-
- def get_redirect_url(self, default: str = '') -> str:
- """Inspect the status and return the redirect url if appropriate."""
- if self.status not in (300, 301, 302, 303, 307):
- return default
- return self.get_header('Location', default)
-
- def get_header(self, key: str, default: str = '') -> str:
- """Get one header value, using a case insensitive header name."""
- key = key.lower()
- for k, v in self.headers:
- if k.lower() == key:
- return v
- return default
-
- async def read(self) -> bytes:
- """Read the response body.
-
- This honors Content-Length and Transfer-Encoding: chunked.
- """
- nbytes = None
- for key, value in self.headers:
- if key.lower() == 'content-length':
- nbytes = int(value)
- break
- if nbytes is None:
- if self.get_header('transfer-encoding').lower() == 'chunked':
- self.log(2, 'parsing chunked response')
- blocks = []
- while True:
- size_header = await self.reader.readline()
- if not size_header:
- self.log(0, 'premature end of chunked response')
- break
- self.log(3, 'size_header =', repr(size_header))
- parts = size_header.split(b';')
- size = int(parts[0], 16)
- if size:
- self.log(3, 'reading chunk of', size, 'bytes')
- block = await self.reader.readexactly(size)
- assert len(block) == size, (len(block), size)
- blocks.append(block)
- crlf = await self.reader.readline()
- assert crlf == b'\r\n', repr(crlf)
- if not size:
- break
- body = b''.join(blocks)
- self.log(1, 'chunked response had', len(body),
- 'bytes in', len(blocks), 'blocks')
- else:
- self.log(3, 'reading until EOF')
- body = await self.reader.read()
- # TODO: Should make sure not to recycle the connection
- # in this case.
- else:
- body = await self.reader.readexactly(nbytes)
- return body
-
-
-class Fetcher:
- """Logic and state for one URL.
-
- When found in crawler.busy, this represents a URL to be fetched or
- in the process of being fetched; when found in crawler.done, this
- holds the results from fetching it.
-
- This is usually associated with a task. This references the
- crawler for the connection pool and to add more URLs to its todo
- list.
-
- Call fetch() to do the fetching, then report() to print the results.
- """
-
- def __init__(self, log: Logger, url: str, crawler: 'Crawler',
- max_redirect: int = 10, max_tries: int = 4) -> None:
- self.log = log
- self.url = url
- self.crawler = crawler
- # We don't loop resolving redirects here -- we just use this
- # to decide whether to add the redirect URL to crawler.todo.
- self.max_redirect = max_redirect
- # But we do loop to retry on errors a few times.
- self.max_tries = max_tries
- # Everything we collect from the response goes here.
- self.task = None # type: asyncio.Task
- self.exceptions = [] # type: List[Exception]
- self.tries = 0
- self.request = None # type: Request
- self.response = None # type: Response
- self.body = None # type: bytes
- self.next_url = None # type: str
- self.ctype = None # type: str
- self.pdict = None # type: Dict[str, str]
- self.encoding = None # type: str
- self.urls = None # type: Set[str]
- self.new_urls = None # type: Set[str]
-
- async def fetch(self) -> None:
- """Attempt to fetch the contents of the URL.
-
- If successful, and the data is HTML, extract further links and
- add them to the crawler. Redirects are also added back there.
- """
- while self.tries < self.max_tries:
- self.tries += 1
- self.request = None
- try:
- self.request = Request(self.log, self.url, self.crawler.pool)
- await self.request.connect()
- await self.request.send_request()
- self.response = await self.request.get_response()
- self.body = await self.response.read()
- h_conn = self.response.get_header('connection').lower()
- if h_conn != 'close':
- self.request.close(recycle=True)
- self.request = None
- if self.tries > 1:
- self.log(1, 'try', self.tries, 'for', self.url, 'success')
- break
- except (BadStatusLine, OSError) as exc:
- self.exceptions.append(exc)
- self.log(1, 'try', self.tries, 'for', self.url,
- 'raised', repr(exc))
- # import pdb; pdb.set_trace()
- # Don't reuse the connection in this case.
- finally:
- if self.request is not None:
- self.request.close()
- else:
- # We never broke out of the while loop, i.e. all tries failed.
- self.log(0, 'no success for', self.url,
- 'in', self.max_tries, 'tries')
- return
- next_url = self.response.get_redirect_url()
- if next_url:
- self.next_url = urllib.parse.urljoin(self.url, next_url)
- if self.max_redirect > 0:
- self.log(1, 'redirect to', self.next_url, 'from', self.url)
- self.crawler.add_url(self.next_url, self.max_redirect - 1)
- else:
- self.log(0, 'redirect limit reached for', self.next_url,
- 'from', self.url)
- else:
- if self.response.status == 200:
- self.ctype = self.response.get_header('content-type')
- self.pdict = {}
- if self.ctype:
- self.ctype, self.pdict = cgi.parse_header(self.ctype)
- self.encoding = self.pdict.get('charset', 'utf-8')
- if self.ctype == 'text/html':
- body = self.body.decode(self.encoding, 'replace')
- # Replace href with (?:href|src) to follow image links.
- self.urls = set(re.findall(r'(?i)href=["\']?([^\s"\'<>]+)',
- body))
- if self.urls:
- self.log(1, 'got', len(self.urls),
- 'distinct urls from', self.url)
- self.new_urls = set()
- for url in self.urls:
- url = unescape(url)
- url = urllib.parse.urljoin(self.url, url)
- url, frag = urllib.parse.urldefrag(url)
- if self.crawler.add_url(url):
- self.new_urls.add(url)
-
- def report(self, stats: 'Stats', file: IO[str] = None) -> None:
- """Print a report on the state for this URL.
-
- Also update the Stats instance.
- """
- if self.task is not None:
- if not self.task.done():
- stats.add('pending')
- print(self.url, 'pending', file=file)
- return
- elif self.task.cancelled():
- stats.add('cancelled')
- print(self.url, 'cancelled', file=file)
- return
- elif self.task.exception():
- stats.add('exception')
- exc = self.task.exception()
- stats.add('exception_' + exc.__class__.__name__)
- print(self.url, exc, file=file)
- return
- if len(self.exceptions) == self.tries:
- stats.add('fail')
- exc = self.exceptions[-1]
- stats.add('fail_' + str(exc.__class__.__name__))
- print(self.url, 'error', exc, file=file)
- elif self.next_url:
- stats.add('redirect')
- print(self.url, self.response.status, 'redirect', self.next_url,
- file=file)
- elif self.ctype == 'text/html':
- stats.add('html')
- size = len(self.body or b'')
- stats.add('html_bytes', size)
- if self.log.level:
- print(self.url, self.response.status,
- self.ctype, self.encoding,
- size,
- '%d/%d' % (len(self.new_urls or ()), len(self.urls or ())),
- file=file)
- elif self.response is None:
- print(self.url, 'no response object')
- else:
- size = len(self.body or b'')
- if self.response.status == 200:
- stats.add('other')
- stats.add('other_bytes', size)
- else:
- stats.add('error')
- stats.add('error_bytes', size)
- stats.add('status_%s' % self.response.status)
- print(self.url, self.response.status,
- self.ctype, self.encoding,
- size,
- file=file)
-
-
-class Stats:
- """Record stats of various sorts."""
-
- def __init__(self) -> None:
- self.stats = {} # type: Dict[str, int]
-
- def add(self, key: str, count: int = 1) -> None:
- self.stats[key] = self.stats.get(key, 0) + count
-
- def report(self, file: IO[str] = None) -> None:
- for key, count in sorted(self.stats.items()):
- print('%10d' % count, key, file=file)
-
-
-class Crawler:
- """Crawl a set of URLs.
-
- This manages three disjoint sets of URLs (todo, busy, done). The
- data structures actually store dicts -- the values in todo give
- the redirect limit, while the values in busy and done are Fetcher
- instances.
- """
- def __init__(self, log: Logger,
- roots: Set[str], exclude: str = None, strict: bool = True, # What to crawl.
- max_redirect: int = 10, max_tries: int = 4, # Per-url limits.
- max_tasks: int = 10, max_pool: int = 10, # Global limits.
- ) -> None:
- self.log = log
- self.roots = roots
- self.exclude = exclude
- self.strict = strict
- self.max_redirect = max_redirect
- self.max_tries = max_tries
- self.max_tasks = max_tasks
- self.max_pool = max_pool
- self.todo = {} # type: Dict[str, int]
- self.busy = {} # type: Dict[str, Fetcher]
- self.done = {} # type: Dict[str, Fetcher]
- self.pool = ConnectionPool(self.log, max_pool, max_tasks)
- self.root_domains = set() # type: Set[str]
- for root in roots:
- host = urllib.parse.urlparse(root).hostname
- if not host:
- continue
- if re.match(r'\A[\d\.]*\Z', host):
- self.root_domains.add(host)
- else:
- host = host.lower()
- if self.strict:
- self.root_domains.add(host)
- if host.startswith('www.'):
- self.root_domains.add(host[4:])
- else:
- self.root_domains.add('www.' + host)
- else:
- parts = host.split('.')
- if len(parts) > 2:
- host = '.'.join(parts[-2:])
- self.root_domains.add(host)
- for root in roots:
- self.add_url(root)
- self.governor = asyncio.Semaphore(max_tasks)
- self.termination = asyncio.Condition()
- self.t0 = time.time()
- self.t1 = None # type: Optional[float]
-
- def close(self) -> None:
- """Close resources (currently only the pool)."""
- self.pool.close()
-
- def host_okay(self, host: str) -> bool:
- """Check if a host should be crawled.
-
- A literal match (after lowercasing) is always good. For hosts
- that don't look like IP addresses, some approximate matches
- are okay depending on the strict flag.
- """
- host = host.lower()
- if host in self.root_domains:
- return True
- if re.match(r'\A[\d\.]*\Z', host):
- return False
- if self.strict:
- return self._host_okay_strictish(host)
- else:
- return self._host_okay_lenient(host)
-
- def _host_okay_strictish(self, host: str) -> bool:
- """Check if a host should be crawled, strict-ish version.
-
- This checks for equality modulo an initial 'www.' component.
- """
- if host.startswith('www.'):
- if host[4:] in self.root_domains:
- return True
- else:
- if 'www.' + host in self.root_domains:
- return True
- return False
-
- def _host_okay_lenient(self, host: str) -> bool:
- """Check if a host should be crawled, lenient version.
-
- This compares the last two components of the host.
- """
- parts = host.split('.')
- if len(parts) > 2:
- host = '.'.join(parts[-2:])
- return host in self.root_domains
-
- def add_url(self, url: str, max_redirect: int = None) -> bool:
- """Add a URL to the todo list if not seen before."""
- if self.exclude and re.search(self.exclude, url):
- return False
- parsed = urllib.parse.urlparse(url)
- if parsed.scheme not in ('http', 'https'):
- self.log(2, 'skipping non-http scheme in', url)
- return False
- host = parsed.hostname
- if not self.host_okay(host):
- self.log(2, 'skipping non-root host in', url)
- return False
- if max_redirect is None:
- max_redirect = self.max_redirect
- if url in self.todo or url in self.busy or url in self.done:
- return False
- self.log(1, 'adding', url, max_redirect)
- self.todo[url] = max_redirect
- return True
-
- async def crawl(self) -> None:
- """Run the crawler until all finished."""
- with (await self.termination):
- while self.todo or self.busy:
- if self.todo:
- url, max_redirect = self.todo.popitem()
- fetcher = Fetcher(self.log, url,
- crawler=self,
- max_redirect=max_redirect,
- max_tries=self.max_tries,
- )
- self.busy[url] = fetcher
- fetcher.task = asyncio.Task(self.fetch(fetcher))
- else:
- await self.termination.wait()
- self.t1 = time.time()
-
- async def fetch(self, fetcher: Fetcher) -> None:
- """Call the Fetcher's fetch(), with a limit on concurrency.
-
- Once this returns, move the fetcher from busy to done.
- """
- url = fetcher.url
- with (await self.governor):
- try:
- await fetcher.fetch() # Fetcher gonna fetch.
- finally:
- # Force GC of the task, so the error is logged.
- fetcher.task = None
- with (await self.termination):
- self.done[url] = fetcher
- del self.busy[url]
- self.termination.notify()
-
- def report(self, file: IO[str] = None) -> None:
- """Print a report on all completed URLs."""
- if self.t1 is None:
- self.t1 = time.time()
- dt = self.t1 - self.t0
- if dt and self.max_tasks:
- speed = len(self.done) / dt / self.max_tasks
- else:
- speed = 0
- stats = Stats()
- print('*** Report ***', file=file)
- try:
- show = [] # type: List[Tuple[str, Fetcher]]
- show.extend(self.done.items())
- show.extend(self.busy.items())
- show.sort()
- for url, fetcher in show:
- fetcher.report(stats, file=file)
- except KeyboardInterrupt:
- print('\nInterrupted', file=file)
- print('Finished', len(self.done),
- 'urls in %.3f secs' % dt,
- '(max_tasks=%d)' % self.max_tasks,
- '(%.3f urls/sec/task)' % speed,
- file=file)
- stats.report(file=file)
- print('Todo:', len(self.todo), file=file)
- print('Busy:', len(self.busy), file=file)
- print('Done:', len(self.done), file=file)
- print('Date:', time.ctime(), 'local time', file=file)
-
-
-def main() -> None:
- """Main program.
-
- Parse arguments, set up event loop, run crawler, print report.
- """
- args = ARGS.parse_args()
- if not args.roots:
- print('Use --help for command line help')
- return
-
- log = Logger(args.level)
-
- if args.iocp:
- if sys.platform == 'win32':
- from asyncio import ProactorEventLoop
- loop = ProactorEventLoop() # type: ignore
- asyncio.set_event_loop(loop)
- else:
- assert False
- elif args.select:
- loop = asyncio.SelectorEventLoop() # type: ignore
- asyncio.set_event_loop(loop)
- else:
- loop = asyncio.get_event_loop()
-
- roots = {fix_url(root) for root in args.roots}
-
- crawler = Crawler(log,
- roots, exclude=args.exclude,
- strict=args.strict,
- max_redirect=args.max_redirect,
- max_tries=args.max_tries,
- max_tasks=args.max_tasks,
- max_pool=args.max_pool,
- )
- try:
- loop.run_until_complete(crawler.crawl()) # Crawler gonna crawl.
- except KeyboardInterrupt:
- sys.stderr.flush()
- print('\nInterrupted\n')
- finally:
- crawler.report()
- crawler.close()
- loop.close()
-
-
-if __name__ == '__main__':
- logging.basicConfig(level=logging.INFO) # type: ignore
- main()
diff --git a/test-data/samples/dict.py b/test-data/samples/dict.py
deleted file mode 100644
index d74a5b5..0000000
--- a/test-data/samples/dict.py
+++ /dev/null
@@ -1,8 +0,0 @@
-import typing
-prices = {'apple': 0.40, 'banana': 0.50}
-my_purchase = {
- 'apple': 1,
- 'banana': 6}
-grocery_bill = sum(prices[fruit] * my_purchase[fruit]
- for fruit in my_purchase)
-print('I owe the grocer $%.2f' % grocery_bill)
diff --git a/test-data/samples/fib.py b/test-data/samples/fib.py
deleted file mode 100644
index 26248c8..0000000
--- a/test-data/samples/fib.py
+++ /dev/null
@@ -1,5 +0,0 @@
-import typing
-parents, babies = (1, 1)
-while babies < 100:
- print('This generation has {0} babies'.format(babies))
- parents, babies = (babies, parents + babies)
diff --git a/test-data/samples/files.py b/test-data/samples/files.py
deleted file mode 100644
index f540c7c..0000000
--- a/test-data/samples/files.py
+++ /dev/null
@@ -1,14 +0,0 @@
-# indent your Python code to put into an email
-import glob
-import typing
-# glob supports Unix style pathname extensions
-python_files = glob.glob('*.py')
-for file_name in sorted(python_files):
- print(' ------' + file_name)
-
- f = open(file_name)
- for line in f:
- print(' ' + line.rstrip())
- f.close()
-
- print()
diff --git a/test-data/samples/for.py b/test-data/samples/for.py
deleted file mode 100644
index f7eeed4..0000000
--- a/test-data/samples/for.py
+++ /dev/null
@@ -1,4 +0,0 @@
-import typing
-friends = ['john', 'pat', 'gary', 'michael']
-for i, name in enumerate(friends):
- print("iteration {iteration} is {name}".format(iteration=i, name=name))
diff --git a/test-data/samples/generators.py b/test-data/samples/generators.py
deleted file mode 100644
index 9150c96..0000000
--- a/test-data/samples/generators.py
+++ /dev/null
@@ -1,24 +0,0 @@
-# Prime number sieve with generators
-
-import itertools
-from typing import Iterator
-
-
-def iter_primes() -> Iterator[int]:
- # an iterator of all numbers between 2 and +infinity
- numbers = itertools.count(2)
-
- # generate primes forever
- while True:
- # get the first number from the iterator (always a prime)
- prime = next(numbers)
- yield prime
-
- # this code iteratively builds up a chain of
- # filters...slightly tricky, but ponder it a bit
- numbers = filter(prime.__rmod__, numbers)
-
-for p in iter_primes():
- if p > 1000:
- break
- print(p)
diff --git a/test-data/samples/greet.py b/test-data/samples/greet.py
deleted file mode 100644
index 47e7626..0000000
--- a/test-data/samples/greet.py
+++ /dev/null
@@ -1,8 +0,0 @@
-import typing
-
-
-def greet(name: str) -> None:
- print('Hello', name)
-greet('Jack')
-greet('Jill')
-greet('Bob')
diff --git a/test-data/samples/guess.py b/test-data/samples/guess.py
deleted file mode 100644
index d3f1cee..0000000
--- a/test-data/samples/guess.py
+++ /dev/null
@@ -1,32 +0,0 @@
-# "Guess the Number" Game (edited) from http://inventwithpython.com
-
-import random
-import typing
-
-guesses_made = 0
-
-name = input('Hello! What is your name?\n')
-
-number = random.randint(1, 20)
-print('Well, {0}, I am thinking of a number between 1 and 20.'.format(name))
-
-while guesses_made < 6:
-
- guess = int(input('Take a guess: '))
-
- guesses_made += 1
-
- if guess < number:
- print('Your guess is too low.')
-
- if guess > number:
- print('Your guess is too high.')
-
- if guess == number:
- break
-
-if guess == number:
- print('Good job, {0}! You guessed my number in {1} guesses!'.format(
- name, guesses_made))
-else:
- print('Nope. The number I was thinking of was {0}'.format(number))
diff --git a/test-data/samples/hello.py b/test-data/samples/hello.py
deleted file mode 100644
index 6c0b2ca..0000000
--- a/test-data/samples/hello.py
+++ /dev/null
@@ -1,2 +0,0 @@
-import typing
-print('Hello, world')
diff --git a/test-data/samples/input.py b/test-data/samples/input.py
deleted file mode 100644
index cca9233..0000000
--- a/test-data/samples/input.py
+++ /dev/null
@@ -1,3 +0,0 @@
-import typing
-name = input('What is your name?\n')
-print('Hi, %s.' % name)
diff --git a/test-data/samples/itertool.py b/test-data/samples/itertool.py
deleted file mode 100644
index 9ee2475..0000000
--- a/test-data/samples/itertool.py
+++ /dev/null
@@ -1,16 +0,0 @@
-from itertools import groupby
-import typing
-lines = '''
-This is the
-first paragraph.
-
-This is the second.
-'''.splitlines()
-# Use itertools.groupby and bool to return groups of
-# consecutive lines that either have content or don't.
-for has_chars, frags in groupby(lines, bool):
- if has_chars:
- print(' '.join(frags))
-# PRINTS:
-# This is the first paragraph.
-# This is the second.
diff --git a/test-data/samples/readme.txt b/test-data/samples/readme.txt
deleted file mode 100644
index 5889a8e..0000000
--- a/test-data/samples/readme.txt
+++ /dev/null
@@ -1,25 +0,0 @@
-Mypy Sample Programs
---------------------
-
-The sample programs use static typing unless otherwise noted in comments.
-
-Original credits for sample programs:
-
- fib.py - Python Wiki [1]
- for.py - Python Wiki [1]
- greet.py - Python Wiki [1]
- hello.py - Python Wiki [1]
- input.py - Python Wiki [1]
- regexp.py - Python Wiki [1]
- dict.py - Python Wiki [1]
- cmdline.py - Python Wiki [1]
- files.py - Python Wiki [1]
- bottles.py - Python Wiki [1]
- class.py - Python Wiki [1]
- guess.py - Python Wiki [1]
- generators.py - Python Wiki [1]
- itertool.py - Python Wiki [1]
-
-The sample programs were ported to mypy by Jukka Lehtosalo.
-
-[1] http://wiki.python.org/moin/SimplePrograms
diff --git a/test-data/samples/regexp.py b/test-data/samples/regexp.py
deleted file mode 100644
index 6d8d799..0000000
--- a/test-data/samples/regexp.py
+++ /dev/null
@@ -1,7 +0,0 @@
-import typing
-import re
-for test_string in ['555-1212', 'ILL-EGAL']:
- if re.match(r'^\d{3}-\d{4}$', test_string):
- print(test_string, 'is a valid US local phone number')
- else:
- print(test_string, 'rejected')
diff --git a/test-data/stdlib-samples/3.2/base64.py b/test-data/stdlib-samples/3.2/base64.py
deleted file mode 100644
index ef91964..0000000
--- a/test-data/stdlib-samples/3.2/base64.py
+++ /dev/null
@@ -1,411 +0,0 @@
-#! /usr/bin/env python3
-
-"""RFC 3548: Base16, Base32, Base64 Data Encodings"""
-
-# Modified 04-Oct-1995 by Jack Jansen to use binascii module
-# Modified 30-Dec-2003 by Barry Warsaw to add full RFC 3548 support
-# Modified 22-May-2007 by Guido van Rossum to use bytes everywhere
-
-import re
-import struct
-import binascii
-
-from typing import Dict, List, AnyStr, IO
-
-
-__all__ = [
- # Legacy interface exports traditional RFC 1521 Base64 encodings
- 'encode', 'decode', 'encodebytes', 'decodebytes',
- # Generalized interface for other encodings
- 'b64encode', 'b64decode', 'b32encode', 'b32decode',
- 'b16encode', 'b16decode',
- # Standard Base64 encoding
- 'standard_b64encode', 'standard_b64decode',
- # Some common Base64 alternatives. As referenced by RFC 3458, see thread
- # starting at:
- #
- # http://zgp.org/pipermail/p2p-hackers/2001-September/000316.html
- 'urlsafe_b64encode', 'urlsafe_b64decode',
- ]
-
-
-bytes_types = (bytes, bytearray) # Types acceptable as binary data
-
-
-def _translate(s: bytes, altchars: Dict[AnyStr, bytes]) -> bytes:
- if not isinstance(s, bytes_types):
- raise TypeError("expected bytes, not %s" % s.__class__.__name__)
- translation = bytearray(range(256))
- for k, v in altchars.items():
- translation[ord(k)] = v[0]
- return s.translate(translation)
-
-
-
-# Base64 encoding/decoding uses binascii
-
-def b64encode(s: bytes, altchars: bytes = None) -> bytes:
- """Encode a byte string using Base64.
-
- s is the byte string to encode. Optional altchars must be a byte
- string of length 2 which specifies an alternative alphabet for the
- '+' and '/' characters. This allows an application to
- e.g. generate url or filesystem safe Base64 strings.
-
- The encoded byte string is returned.
- """
- if not isinstance(s, bytes_types):
- raise TypeError("expected bytes, not %s" % s.__class__.__name__)
- # Strip off the trailing newline
- encoded = binascii.b2a_base64(s)[:-1]
- if altchars is not None:
- if not isinstance(altchars, bytes_types):
- raise TypeError("expected bytes, not %s"
- % altchars.__class__.__name__)
- assert len(altchars) == 2, repr(altchars)
- return _translate(encoded, {'+': altchars[0:1], '/': altchars[1:2]})
- return encoded
-
-
-def b64decode(s: bytes, altchars: bytes = None,
- validate: bool = False) -> bytes:
- """Decode a Base64 encoded byte string.
-
- s is the byte string to decode. Optional altchars must be a
- string of length 2 which specifies the alternative alphabet used
- instead of the '+' and '/' characters.
-
- The decoded string is returned. A binascii.Error is raised if s is
- incorrectly padded.
-
- If validate is False (the default), non-base64-alphabet characters are
- discarded prior to the padding check. If validate is True,
- non-base64-alphabet characters in the input result in a binascii.Error.
- """
- if not isinstance(s, bytes_types):
- raise TypeError("expected bytes, not %s" % s.__class__.__name__)
- if altchars is not None:
- if not isinstance(altchars, bytes_types):
- raise TypeError("expected bytes, not %s"
- % altchars.__class__.__name__)
- assert len(altchars) == 2, repr(altchars)
- s = _translate(s, {chr(altchars[0]): b'+', chr(altchars[1]): b'/'})
- if validate and not re.match(b'^[A-Za-z0-9+/]*={0,2}$', s):
- raise binascii.Error('Non-base64 digit found')
- return binascii.a2b_base64(s)
-
-
-def standard_b64encode(s: bytes) -> bytes:
- """Encode a byte string using the standard Base64 alphabet.
-
- s is the byte string to encode. The encoded byte string is returned.
- """
- return b64encode(s)
-
-def standard_b64decode(s: bytes) -> bytes:
- """Decode a byte string encoded with the standard Base64 alphabet.
-
- s is the byte string to decode. The decoded byte string is
- returned. binascii.Error is raised if the input is incorrectly
- padded or if there are non-alphabet characters present in the
- input.
- """
- return b64decode(s)
-
-def urlsafe_b64encode(s: bytes) -> bytes:
- """Encode a byte string using a url-safe Base64 alphabet.
-
- s is the byte string to encode. The encoded byte string is
- returned. The alphabet uses '-' instead of '+' and '_' instead of
- '/'.
- """
- return b64encode(s, b'-_')
-
-def urlsafe_b64decode(s: bytes) -> bytes:
- """Decode a byte string encoded with the standard Base64 alphabet.
-
- s is the byte string to decode. The decoded byte string is
- returned. binascii.Error is raised if the input is incorrectly
- padded or if there are non-alphabet characters present in the
- input.
-
- The alphabet uses '-' instead of '+' and '_' instead of '/'.
- """
- return b64decode(s, b'-_')
-
-
-
-# Base32 encoding/decoding must be done in Python
-_b32alphabet = {
- 0: b'A', 9: b'J', 18: b'S', 27: b'3',
- 1: b'B', 10: b'K', 19: b'T', 28: b'4',
- 2: b'C', 11: b'L', 20: b'U', 29: b'5',
- 3: b'D', 12: b'M', 21: b'V', 30: b'6',
- 4: b'E', 13: b'N', 22: b'W', 31: b'7',
- 5: b'F', 14: b'O', 23: b'X',
- 6: b'G', 15: b'P', 24: b'Y',
- 7: b'H', 16: b'Q', 25: b'Z',
- 8: b'I', 17: b'R', 26: b'2',
- }
-
-_b32tab = [v[0] for k, v in sorted(_b32alphabet.items())]
-_b32rev = dict([(v[0], k) for k, v in _b32alphabet.items()])
-
-
-def b32encode(s: bytes) -> bytes:
- """Encode a byte string using Base32.
-
- s is the byte string to encode. The encoded byte string is returned.
- """
- if not isinstance(s, bytes_types):
- raise TypeError("expected bytes, not %s" % s.__class__.__name__)
- quanta, leftover = divmod(len(s), 5)
- # Pad the last quantum with zero bits if necessary
- if leftover:
- s = s + bytes(5 - leftover) # Don't use += !
- quanta += 1
- encoded = bytes()
- for i in range(quanta):
- # c1 and c2 are 16 bits wide, c3 is 8 bits wide. The intent of this
- # code is to process the 40 bits in units of 5 bits. So we take the 1
- # leftover bit of c1 and tack it onto c2. Then we take the 2 leftover
- # bits of c2 and tack them onto c3. The shifts and masks are intended
- # to give us values of exactly 5 bits in width.
- c1, c2, c3 = struct.unpack('!HHB', s[i*5:(i+1)*5]) # type: (int, int, int)
- c2 += (c1 & 1) << 16 # 17 bits wide
- c3 += (c2 & 3) << 8 # 10 bits wide
- encoded += bytes([_b32tab[c1 >> 11], # bits 1 - 5
- _b32tab[(c1 >> 6) & 0x1f], # bits 6 - 10
- _b32tab[(c1 >> 1) & 0x1f], # bits 11 - 15
- _b32tab[c2 >> 12], # bits 16 - 20 (1 - 5)
- _b32tab[(c2 >> 7) & 0x1f], # bits 21 - 25 (6 - 10)
- _b32tab[(c2 >> 2) & 0x1f], # bits 26 - 30 (11 - 15)
- _b32tab[c3 >> 5], # bits 31 - 35 (1 - 5)
- _b32tab[c3 & 0x1f], # bits 36 - 40 (1 - 5)
- ])
- # Adjust for any leftover partial quanta
- if leftover == 1:
- return encoded[:-6] + b'======'
- elif leftover == 2:
- return encoded[:-4] + b'===='
- elif leftover == 3:
- return encoded[:-3] + b'==='
- elif leftover == 4:
- return encoded[:-1] + b'='
- return encoded
-
-
-def b32decode(s: bytes, casefold: bool = False, map01: bytes = None) -> bytes:
- """Decode a Base32 encoded byte string.
-
- s is the byte string to decode. Optional casefold is a flag
- specifying whether a lowercase alphabet is acceptable as input.
- For security purposes, the default is False.
-
- RFC 3548 allows for optional mapping of the digit 0 (zero) to the
- letter O (oh), and for optional mapping of the digit 1 (one) to
- either the letter I (eye) or letter L (el). The optional argument
- map01 when not None, specifies which letter the digit 1 should be
- mapped to (when map01 is not None, the digit 0 is always mapped to
- the letter O). For security purposes the default is None, so that
- 0 and 1 are not allowed in the input.
-
- The decoded byte string is returned. binascii.Error is raised if
- the input is incorrectly padded or if there are non-alphabet
- characters present in the input.
- """
- if not isinstance(s, bytes_types):
- raise TypeError("expected bytes, not %s" % s.__class__.__name__)
- quanta, leftover = divmod(len(s), 8)
- if leftover:
- raise binascii.Error('Incorrect padding')
- # Handle section 2.4 zero and one mapping. The flag map01 will be either
- # False, or the character to map the digit 1 (one) to. It should be
- # either L (el) or I (eye).
- if map01 is not None:
- if not isinstance(map01, bytes_types):
- raise TypeError("expected bytes, not %s" % map01.__class__.__name__)
- assert len(map01) == 1, repr(map01)
- s = _translate(s, {b'0': b'O', b'1': map01})
- if casefold:
- s = s.upper()
- # Strip off pad characters from the right. We need to count the pad
- # characters because this will tell us how many null bytes to remove from
- # the end of the decoded string.
- padchars = 0
- mo = re.search(b'(?P<pad>[=]*)$', s)
- if mo:
- padchars = len(mo.group('pad'))
- if padchars > 0:
- s = s[:-padchars]
- # Now decode the full quanta
- parts = [] # type: List[bytes]
- acc = 0
- shift = 35
- for c in s:
- val = _b32rev.get(c)
- if val is None:
- raise TypeError('Non-base32 digit found')
- acc += _b32rev[c] << shift
- shift -= 5
- if shift < 0:
- parts.append(binascii.unhexlify(bytes('%010x' % acc, "ascii")))
- acc = 0
- shift = 35
- # Process the last, partial quanta
- last = binascii.unhexlify(bytes('%010x' % acc, "ascii"))
- if padchars == 0:
- last = b'' # No characters
- elif padchars == 1:
- last = last[:-1]
- elif padchars == 3:
- last = last[:-2]
- elif padchars == 4:
- last = last[:-3]
- elif padchars == 6:
- last = last[:-4]
- else:
- raise binascii.Error('Incorrect padding')
- parts.append(last)
- return b''.join(parts)
-
-
-
-# RFC 3548, Base 16 Alphabet specifies uppercase, but hexlify() returns
-# lowercase. The RFC also recommends against accepting input case
-# insensitively.
-def b16encode(s: bytes) -> bytes:
- """Encode a byte string using Base16.
-
- s is the byte string to encode. The encoded byte string is returned.
- """
- if not isinstance(s, bytes_types):
- raise TypeError("expected bytes, not %s" % s.__class__.__name__)
- return binascii.hexlify(s).upper()
-
-
-def b16decode(s: bytes, casefold: bool = False) -> bytes:
- """Decode a Base16 encoded byte string.
-
- s is the byte string to decode. Optional casefold is a flag
- specifying whether a lowercase alphabet is acceptable as input.
- For security purposes, the default is False.
-
- The decoded byte string is returned. binascii.Error is raised if
- s were incorrectly padded or if there are non-alphabet characters
- present in the string.
- """
- if not isinstance(s, bytes_types):
- raise TypeError("expected bytes, not %s" % s.__class__.__name__)
- if casefold:
- s = s.upper()
- if re.search(b'[^0-9A-F]', s):
- raise binascii.Error('Non-base16 digit found')
- return binascii.unhexlify(s)
-
-
-
-# Legacy interface. This code could be cleaned up since I don't believe
-# binascii has any line length limitations. It just doesn't seem worth it
-# though. The files should be opened in binary mode.
-
-MAXLINESIZE = 76 # Excluding the CRLF
-MAXBINSIZE = (MAXLINESIZE//4)*3
-
-def encode(input: IO[bytes], output: IO[bytes]) -> None:
- """Encode a file; input and output are binary files."""
- while True:
- s = input.read(MAXBINSIZE)
- if not s:
- break
- while len(s) < MAXBINSIZE:
- ns = input.read(MAXBINSIZE-len(s))
- if not ns:
- break
- s += ns
- line = binascii.b2a_base64(s)
- output.write(line)
-
-
-def decode(input: IO[bytes], output: IO[bytes]) -> None:
- """Decode a file; input and output are binary files."""
- while True:
- line = input.readline()
- if not line:
- break
- s = binascii.a2b_base64(line)
- output.write(s)
-
-
-def encodebytes(s: bytes) -> bytes:
- """Encode a bytestring into a bytestring containing multiple lines
- of base-64 data."""
- if not isinstance(s, bytes_types):
- raise TypeError("expected bytes, not %s" % s.__class__.__name__)
- pieces = [] # type: List[bytes]
- for i in range(0, len(s), MAXBINSIZE):
- chunk = s[i : i + MAXBINSIZE]
- pieces.append(binascii.b2a_base64(chunk))
- return b"".join(pieces)
-
-def encodestring(s: bytes) -> bytes:
- """Legacy alias of encodebytes()."""
- import warnings
- warnings.warn("encodestring() is a deprecated alias, use encodebytes()",
- DeprecationWarning, 2)
- return encodebytes(s)
-
-
-def decodebytes(s: bytes) -> bytes:
- """Decode a bytestring of base-64 data into a bytestring."""
- if not isinstance(s, bytes_types):
- raise TypeError("expected bytes, not %s" % s.__class__.__name__)
- return binascii.a2b_base64(s)
-
-def decodestring(s: bytes) -> bytes:
- """Legacy alias of decodebytes()."""
- import warnings
- warnings.warn("decodestring() is a deprecated alias, use decodebytes()",
- DeprecationWarning, 2)
- return decodebytes(s)
-
-
-# Usable as a script...
-def main() -> None:
- """Small main program"""
- import sys, getopt
- try:
- opts, args = getopt.getopt(sys.argv[1:], 'deut')
- except getopt.error as msg:
- sys.stdout = sys.stderr
- print(msg)
- print("""usage: %s [-d|-e|-u|-t] [file|-]
- -d, -u: decode
- -e: encode (default)
- -t: encode and decode string 'Aladdin:open sesame'"""%sys.argv[0])
- sys.exit(2)
- func = encode
- for o, a in opts:
- if o == '-e': func = encode
- if o == '-d': func = decode
- if o == '-u': func = decode
- if o == '-t': test(); return
- if args and args[0] != '-':
- with open(args[0], 'rb') as f:
- func(f, sys.stdout.buffer)
- else:
- func(sys.stdin.buffer, sys.stdout.buffer)
-
-
-def test() -> None:
- s0 = b"Aladdin:open sesame"
- print(repr(s0))
- s1 = encodebytes(s0)
- print(repr(s1))
- s2 = decodebytes(s1)
- print(repr(s2))
- assert s0 == s2
-
-
-if __name__ == '__main__':
- main()
diff --git a/test-data/stdlib-samples/3.2/fnmatch.py b/test-data/stdlib-samples/3.2/fnmatch.py
deleted file mode 100644
index ec27b90..0000000
--- a/test-data/stdlib-samples/3.2/fnmatch.py
+++ /dev/null
@@ -1,112 +0,0 @@
-"""Filename matching with shell patterns.
-
-fnmatch(FILENAME, PATTERN) matches according to the local convention.
-fnmatchcase(FILENAME, PATTERN) always takes case in account.
-
-The functions operate by translating the pattern into a regular
-expression. They cache the compiled regular expressions for speed.
-
-The function translate(PATTERN) returns a regular expression
-corresponding to PATTERN. (It does not compile it.)
-"""
-import os
-import posixpath
-import re
-import functools
-
-from typing import Iterable, List, AnyStr, Any, Callable, Match
-
-__all__ = ["filter", "fnmatch", "fnmatchcase", "translate"]
-
-def fnmatch(name: AnyStr, pat: AnyStr) -> bool:
- """Test whether FILENAME matches PATTERN.
-
- Patterns are Unix shell style:
-
- * matches everything
- ? matches any single character
- [seq] matches any character in seq
- [!seq] matches any char not in seq
-
- An initial period in FILENAME is not special.
- Both FILENAME and PATTERN are first case-normalized
- if the operating system requires it.
- If you don't want this, use fnmatchcase(FILENAME, PATTERN).
- """
- name = os.path.normcase(name)
- pat = os.path.normcase(pat)
- return fnmatchcase(name, pat)
-
- at functools.lru_cache(maxsize=250)
-def _compile_pattern(pat: AnyStr,
- is_bytes: bool = False) -> Callable[[AnyStr],
- Match[AnyStr]]:
- if isinstance(pat, bytes):
- pat_str = str(pat, 'ISO-8859-1')
- res_str = translate(pat_str)
- res = bytes(res_str, 'ISO-8859-1')
- else:
- res = translate(pat)
- return re.compile(res).match
-
-def filter(names: Iterable[AnyStr], pat: AnyStr) -> List[AnyStr]:
- """Return the subset of the list NAMES that match PAT."""
- result = [] # type: List[AnyStr]
- pat = os.path.normcase(pat)
- match = _compile_pattern(pat, isinstance(pat, bytes))
- if os.path is posixpath:
- # normcase on posix is NOP. Optimize it away from the loop.
- for name in names:
- if match(name):
- result.append(name)
- else:
- for name in names:
- if match(os.path.normcase(name)):
- result.append(name)
- return result
-
-def fnmatchcase(name: AnyStr, pat: AnyStr) -> bool:
- """Test whether FILENAME matches PATTERN, including case.
-
- This is a version of fnmatch() which doesn't case-normalize
- its arguments.
- """
- match = _compile_pattern(pat, isinstance(pat, bytes))
- return match(name) is not None
-
-def translate(pat: str) -> str:
- """Translate a shell PATTERN to a regular expression.
-
- There is no way to quote meta-characters.
- """
-
- i, n = 0, len(pat)
- res = ''
- while i < n:
- c = pat[i]
- i = i+1
- if c == '*':
- res = res + '.*'
- elif c == '?':
- res = res + '.'
- elif c == '[':
- j = i
- if j < n and pat[j] == '!':
- j = j+1
- if j < n and pat[j] == ']':
- j = j+1
- while j < n and pat[j] != ']':
- j = j+1
- if j >= n:
- res = res + '\\['
- else:
- stuff = pat[i:j].replace('\\','\\\\')
- i = j+1
- if stuff[0] == '!':
- stuff = '^' + stuff[1:]
- elif stuff[0] == '^':
- stuff = '\\' + stuff
- res = '%s[%s]' % (res, stuff)
- else:
- res = res + re.escape(c)
- return res + '\Z(?ms)'
diff --git a/test-data/stdlib-samples/3.2/genericpath.py b/test-data/stdlib-samples/3.2/genericpath.py
deleted file mode 100644
index bd1fddf..0000000
--- a/test-data/stdlib-samples/3.2/genericpath.py
+++ /dev/null
@@ -1,112 +0,0 @@
-"""
-Path operations common to more than one OS
-Do not use directly. The OS specific modules import the appropriate
-functions from this module themselves.
-"""
-import os
-import stat
-
-from typing import (
- Any as Any_, List as List_, AnyStr as AnyStr_, Tuple as Tuple_
-)
-
-__all__ = ['commonprefix', 'exists', 'getatime', 'getctime', 'getmtime',
- 'getsize', 'isdir', 'isfile']
-
-
-# Does a path exist?
-# This is false for dangling symbolic links on systems that support them.
-def exists(path: AnyStr_) -> bool:
- """Test whether a path exists. Returns False for broken symbolic links"""
- try:
- os.stat(path)
- except os.error:
- return False
- return True
-
-
-# This follows symbolic links, so both islink() and isdir() can be true
-# for the same path ono systems that support symlinks
-def isfile(path: AnyStr_) -> bool:
- """Test whether a path is a regular file"""
- try:
- st = os.stat(path)
- except os.error:
- return False
- return stat.S_ISREG(st.st_mode)
-
-
-# Is a path a directory?
-# This follows symbolic links, so both islink() and isdir()
-# can be true for the same path on systems that support symlinks
-def isdir(s: AnyStr_) -> bool:
- """Return true if the pathname refers to an existing directory."""
- try:
- st = os.stat(s)
- except os.error:
- return False
- return stat.S_ISDIR(st.st_mode)
-
-
-def getsize(filename: AnyStr_) -> int:
- """Return the size of a file, reported by os.stat()."""
- return os.stat(filename).st_size
-
-
-def getmtime(filename: AnyStr_) -> float:
- """Return the last modification time of a file, reported by os.stat()."""
- return os.stat(filename).st_mtime
-
-
-def getatime(filename: AnyStr_) -> float:
- """Return the last access time of a file, reported by os.stat()."""
- return os.stat(filename).st_atime
-
-
-def getctime(filename: AnyStr_) -> float:
- """Return the metadata change time of a file, reported by os.stat()."""
- return os.stat(filename).st_ctime
-
-
-# Return the longest prefix of all list elements.
-def commonprefix(m: List_[Any_]) -> Any_:
- "Given a list of pathnames, returns the longest common leading component"
- if not m: return ''
- s1 = min(m)
- s2 = max(m)
- for i, c in enumerate(s1):
- if c != s2[i]:
- return s1[:i]
- return s1
-
-
-# Split a path in root and extension.
-# The extension is everything starting at the last dot in the last
-# pathname component; the root is everything before that.
-# It is always true that root + ext == p.
-
-# Generic implementation of splitext, to be parametrized with
-# the separators
-def _splitext(p: AnyStr_, sep: AnyStr_, altsep: AnyStr_,
- extsep: AnyStr_) -> Tuple_[AnyStr_, AnyStr_]:
- """Split the extension from a pathname.
-
- Extension is everything from the last dot to the end, ignoring
- leading dots. Returns "(root, ext)"; ext may be empty."""
- # NOTE: This code must work for text and bytes strings.
-
- sepIndex = p.rfind(sep)
- if altsep:
- altsepIndex = p.rfind(altsep)
- sepIndex = max(sepIndex, altsepIndex)
-
- dotIndex = p.rfind(extsep)
- if dotIndex > sepIndex:
- # skip all leading dots
- filenameIndex = sepIndex + 1
- while filenameIndex < dotIndex:
- if p[filenameIndex:filenameIndex+1] != extsep:
- return p[:dotIndex], p[dotIndex:]
- filenameIndex += 1
-
- return p, p[:0]
diff --git a/test-data/stdlib-samples/3.2/getopt.py b/test-data/stdlib-samples/3.2/getopt.py
deleted file mode 100644
index 32f5bce..0000000
--- a/test-data/stdlib-samples/3.2/getopt.py
+++ /dev/null
@@ -1,220 +0,0 @@
-"""Parser for command line options.
-
-This module helps scripts to parse the command line arguments in
-sys.argv. It supports the same conventions as the Unix getopt()
-function (including the special meanings of arguments of the form `-'
-and `--'). Long options similar to those supported by GNU software
-may be used as well via an optional third argument. This module
-provides two functions and an exception:
-
-getopt() -- Parse command line options
-gnu_getopt() -- Like getopt(), but allow option and non-option arguments
-to be intermixed.
-GetoptError -- exception (class) raised with 'opt' attribute, which is the
-option involved with the exception.
-"""
-
-# Long option support added by Lars Wirzenius <liw at iki.fi>.
-#
-# Gerrit Holl <gerrit at nl.linux.org> moved the string-based exceptions
-# to class-based exceptions.
-#
-# Peter Ã
strand <astrand at lysator.liu.se> added gnu_getopt().
-#
-# TODO for gnu_getopt():
-#
-# - GNU getopt_long_only mechanism
-# - allow the caller to specify ordering
-# - RETURN_IN_ORDER option
-# - GNU extension with '-' as first character of option string
-# - optional arguments, specified by double colons
-# - a option string with a W followed by semicolon should
-# treat "-W foo" as "--foo"
-
-__all__ = ["GetoptError","error","getopt","gnu_getopt"]
-
-import os
-
-from typing import List, Tuple, Iterable
-
-class GetoptError(Exception):
- opt = ''
- msg = ''
- def __init__(self, msg: str, opt: str = '') -> None:
- self.msg = msg
- self.opt = opt
- Exception.__init__(self, msg, opt)
-
- def __str__(self) -> str:
- return self.msg
-
-error = GetoptError # backward compatibility
-
-def getopt(args: List[str], shortopts: str,
- longopts: Iterable[str] = []) -> Tuple[List[Tuple[str, str]],
- List[str]]:
- """getopt(args, options[, long_options]) -> opts, args
-
- Parses command line options and parameter list. args is the
- argument list to be parsed, without the leading reference to the
- running program. Typically, this means "sys.argv[1:]". shortopts
- is the string of option letters that the script wants to
- recognize, with options that require an argument followed by a
- colon (i.e., the same format that Unix getopt() uses). If
- specified, longopts is a list of strings with the names of the
- long options which should be supported. The leading '--'
- characters should not be included in the option name. Options
- which require an argument should be followed by an equal sign
- ('=').
-
- The return value consists of two elements: the first is a list of
- (option, value) pairs; the second is the list of program arguments
- left after the option list was stripped (this is a trailing slice
- of the first argument). Each option-and-value pair returned has
- the option as its first element, prefixed with a hyphen (e.g.,
- '-x'), and the option argument as its second element, or an empty
- string if the option has no argument. The options occur in the
- list in the same order in which they were found, thus allowing
- multiple occurrences. Long and short options may be mixed.
-
- """
-
- opts = [] # type: List[Tuple[str, str]]
- if isinstance(longopts, str):
- longopts = [longopts]
- else:
- longopts = list(longopts)
- while args and args[0].startswith('-') and args[0] != '-':
- if args[0] == '--':
- args = args[1:]
- break
- if args[0].startswith('--'):
- opts, args = do_longs(opts, args[0][2:], longopts, args[1:])
- else:
- opts, args = do_shorts(opts, args[0][1:], shortopts, args[1:])
-
- return opts, args
-
-def gnu_getopt(args: List[str], shortopts: str,
- longopts: Iterable[str] = []) -> Tuple[List[Tuple[str, str]],
- List[str]]:
- """getopt(args, options[, long_options]) -> opts, args
-
- This function works like getopt(), except that GNU style scanning
- mode is used by default. This means that option and non-option
- arguments may be intermixed. The getopt() function stops
- processing options as soon as a non-option argument is
- encountered.
-
- If the first character of the option string is `+', or if the
- environment variable POSIXLY_CORRECT is set, then option
- processing stops as soon as a non-option argument is encountered.
-
- """
-
- opts = [] # type: List[Tuple[str, str]]
- prog_args = [] # type: List[str]
- if isinstance(longopts, str):
- longopts = [longopts]
- else:
- longopts = list(longopts)
-
- # Allow options after non-option arguments?
- if shortopts.startswith('+'):
- shortopts = shortopts[1:]
- all_options_first = True
- elif os.environ.get("POSIXLY_CORRECT"):
- all_options_first = True
- else:
- all_options_first = False
-
- while args:
- if args[0] == '--':
- prog_args += args[1:]
- break
-
- if args[0][:2] == '--':
- opts, args = do_longs(opts, args[0][2:], longopts, args[1:])
- elif args[0][:1] == '-' and args[0] != '-':
- opts, args = do_shorts(opts, args[0][1:], shortopts, args[1:])
- else:
- if all_options_first:
- prog_args += args
- break
- else:
- prog_args.append(args[0])
- args = args[1:]
-
- return opts, prog_args
-
-def do_longs(opts: List[Tuple[str, str]], opt: str,
- longopts: List[str],
- args: List[str]) -> Tuple[List[Tuple[str, str]], List[str]]:
- try:
- i = opt.index('=')
- except ValueError:
- optarg = None # type: str
- else:
- opt, optarg = opt[:i], opt[i+1:]
-
- has_arg, opt = long_has_args(opt, longopts)
- if has_arg:
- if optarg is None:
- if not args:
- raise GetoptError('option --%s requires argument' % opt, opt)
- optarg, args = args[0], args[1:]
- elif optarg is not None:
- raise GetoptError('option --%s must not have an argument' % opt, opt)
- opts.append(('--' + opt, optarg or ''))
- return opts, args
-
-# Return:
-# has_arg?
-# full option name
-def long_has_args(opt: str, longopts: List[str]) -> Tuple[bool, str]:
- possibilities = [o for o in longopts if o.startswith(opt)]
- if not possibilities:
- raise GetoptError('option --%s not recognized' % opt, opt)
- # Is there an exact match?
- if opt in possibilities:
- return False, opt
- elif opt + '=' in possibilities:
- return True, opt
- # No exact match, so better be unique.
- if len(possibilities) > 1:
- # XXX since possibilities contains all valid continuations, might be
- # nice to work them into the error msg
- raise GetoptError('option --%s not a unique prefix' % opt, opt)
- assert len(possibilities) == 1
- unique_match = possibilities[0]
- has_arg = unique_match.endswith('=')
- if has_arg:
- unique_match = unique_match[:-1]
- return has_arg, unique_match
-
-def do_shorts(opts: List[Tuple[str, str]], optstring: str,
- shortopts: str, args: List[str]) -> Tuple[List[Tuple[str, str]],
- List[str]]:
- while optstring != '':
- opt, optstring = optstring[0], optstring[1:]
- if short_has_arg(opt, shortopts):
- if optstring == '':
- if not args:
- raise GetoptError('option -%s requires argument' % opt,
- opt)
- optstring, args = args[0], args[1:]
- optarg, optstring = optstring, ''
- else:
- optarg = ''
- opts.append(('-' + opt, optarg))
- return opts, args
-
-def short_has_arg(opt: str, shortopts: str) -> bool:
- for i in range(len(shortopts)):
- if opt == shortopts[i] != ':':
- return shortopts.startswith(':', i+1)
- raise GetoptError('option -%s not recognized' % opt, opt)
-
-if __name__ == '__main__':
- import sys
- print(getopt(sys.argv[1:], "a:b", ["alpha=", "beta"]))
diff --git a/test-data/stdlib-samples/3.2/glob.py b/test-data/stdlib-samples/3.2/glob.py
deleted file mode 100644
index 0f3d5f5..0000000
--- a/test-data/stdlib-samples/3.2/glob.py
+++ /dev/null
@@ -1,84 +0,0 @@
-"""Filename globbing utility."""
-
-import os
-import re
-import fnmatch
-
-from typing import List, Iterator, Iterable, Any, AnyStr
-
-__all__ = ["glob", "iglob"]
-
-def glob(pathname: AnyStr) -> List[AnyStr]:
- """Return a list of paths matching a pathname pattern.
-
- The pattern may contain simple shell-style wildcards a la fnmatch.
-
- """
- return list(iglob(pathname))
-
-def iglob(pathname: AnyStr) -> Iterator[AnyStr]:
- """Return an iterator which yields the paths matching a pathname pattern.
-
- The pattern may contain simple shell-style wildcards a la fnmatch.
-
- """
- if not has_magic(pathname):
- if os.path.lexists(pathname):
- yield pathname
- return
- dirname, basename = os.path.split(pathname)
- if not dirname:
- for name in glob1(None, basename):
- yield name
- return
- if has_magic(dirname):
- dirs = iglob(dirname) # type: Iterable[AnyStr]
- else:
- dirs = [dirname]
- if has_magic(basename):
- glob_in_dir = glob1 # type: Any
- else:
- glob_in_dir = glob0
- for dirname in dirs:
- for name in glob_in_dir(dirname, basename):
- yield os.path.join(dirname, name)
-
-# These 2 helper functions non-recursively glob inside a literal directory.
-# They return a list of basenames. `glob1` accepts a pattern while `glob0`
-# takes a literal basename (so it only has to check for its existence).
-
-def glob1(dirname: AnyStr, pattern: AnyStr) -> List[AnyStr]:
- if not dirname:
- if isinstance(pattern, bytes):
- dirname = bytes(os.curdir, 'ASCII')
- else:
- dirname = os.curdir
- try:
- names = os.listdir(dirname)
- except os.error:
- return []
- if pattern[0] != '.':
- names = [x for x in names if x[0] != '.']
- return fnmatch.filter(names, pattern)
-
-def glob0(dirname: AnyStr, basename: AnyStr) -> List[AnyStr]:
- if basename == '':
- # `os.path.split()` returns an empty basename for paths ending with a
- # directory separator. 'q*x/' should match only directories.
- if os.path.isdir(dirname):
- return [basename]
- else:
- if os.path.lexists(os.path.join(dirname, basename)):
- return [basename]
- return []
-
-
-magic_check = re.compile('[*?[]')
-magic_check_bytes = re.compile(b'[*?[]')
-
-def has_magic(s: AnyStr) -> bool:
- if isinstance(s, bytes):
- match = magic_check_bytes.search(s)
- else:
- match = magic_check.search(s)
- return match is not None
diff --git a/test-data/stdlib-samples/3.2/incomplete/logging/__init__.py b/test-data/stdlib-samples/3.2/incomplete/logging/__init__.py
deleted file mode 100644
index aa861eb..0000000
--- a/test-data/stdlib-samples/3.2/incomplete/logging/__init__.py
+++ /dev/null
@@ -1,1873 +0,0 @@
-# Copyright 2001-2010 by Vinay Sajip. All Rights Reserved.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose and without fee is hereby granted,
-# provided that the above copyright notice appear in all copies and that
-# both that copyright notice and this permission notice appear in
-# supporting documentation, and that the name of Vinay Sajip
-# not be used in advertising or publicity pertaining to distribution
-# of the software without specific, written prior permission.
-# VINAY SAJIP DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
-# VINAY SAJIP BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
-# IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-"""
-Logging package for Python. Based on PEP 282 and comments thereto in
-comp.lang.python, and influenced by Apache's log4j system.
-
-Copyright (C) 2001-2011 Vinay Sajip. All Rights Reserved.
-
-To use, simply 'import logging' and log away!
-"""
-
-import sys, os, time, io, traceback, warnings, weakref
-from string import Template
-
-__all__ = ['BASIC_FORMAT', 'BufferingFormatter', 'CRITICAL', 'DEBUG', 'ERROR',
- 'FATAL', 'FileHandler', 'Filter', 'Formatter', 'Handler', 'INFO',
- 'LogRecord', 'Logger', 'LoggerAdapter', 'NOTSET', 'NullHandler',
- 'StreamHandler', 'WARN', 'WARNING', 'addLevelName', 'basicConfig',
- 'captureWarnings', 'critical', 'debug', 'disable', 'error',
- 'exception', 'fatal', 'getLevelName', 'getLogger', 'getLoggerClass',
- 'info', 'log', 'makeLogRecord', 'setLoggerClass', 'warn', 'warning',
- 'getLogRecordFactory', 'setLogRecordFactory', 'lastResort']
-
-import codecs
-
-import _thread as thread
-import threading
-
-__author__ = "Vinay Sajip <vinay_sajip at red-dove.com>"
-__status__ = "production"
-__version__ = "0.5.1.2"
-__date__ = "07 February 2010"
-
-#---------------------------------------------------------------------------
-# Miscellaneous module data
-#---------------------------------------------------------------------------
-
-#
-# _srcfile is used when walking the stack to check when we've got the first
-# caller stack frame.
-#
-if hasattr(sys, 'frozen'): #support for py2exe
- _srcfile = "logging%s__init__%s" % (os.sep, __file__[-4:])
-else:
- _srcfile = __file__
-_srcfile = os.path.normcase(_srcfile)
-
-# next bit filched from 1.5.2's inspect.py
-def _currentframe():
- """Return the frame object for the caller's stack frame."""
- try:
- raise Exception
- except:
- return sys.exc_info()[2].tb_frame.f_back
-currentframe = _currentframe
-
-if hasattr(sys, '_getframe'): currentframe = lambda: sys._getframe(3)
-# done filching
-
-# _srcfile is only used in conjunction with sys._getframe().
-# To provide compatibility with older versions of Python, set _srcfile
-# to None if _getframe() is not available; this value will prevent
-# findCaller() from being called.
-#if not hasattr(sys, "_getframe"):
-# _srcfile = None
-
-#
-#_startTime is used as the base when calculating the relative time of events
-#
-_startTime = time.time()
-
-#
-#raiseExceptions is used to see if exceptions during handling should be
-#propagated
-#
-raiseExceptions = 1
-
-#
-# If you don't want threading information in the log, set this to zero
-#
-logThreads = 1
-
-#
-# If you don't want multiprocessing information in the log, set this to zero
-#
-logMultiprocessing = 1
-
-#
-# If you don't want process information in the log, set this to zero
-#
-logProcesses = 1
-
-#---------------------------------------------------------------------------
-# Level related stuff
-#---------------------------------------------------------------------------
-#
-# Default levels and level names, these can be replaced with any positive set
-# of values having corresponding names. There is a pseudo-level, NOTSET, which
-# is only really there as a lower limit for user-defined levels. Handlers and
-# loggers are initialized with NOTSET so that they will log all messages, even
-# at user-defined levels.
-#
-
-CRITICAL = 50
-FATAL = CRITICAL
-ERROR = 40
-WARNING = 30
-WARN = WARNING
-INFO = 20
-DEBUG = 10
-NOTSET = 0
-
-_levelNames = {
- CRITICAL : 'CRITICAL',
- ERROR : 'ERROR',
- WARNING : 'WARNING',
- INFO : 'INFO',
- DEBUG : 'DEBUG',
- NOTSET : 'NOTSET',
- 'CRITICAL' : CRITICAL,
- 'ERROR' : ERROR,
- 'WARN' : WARNING,
- 'WARNING' : WARNING,
- 'INFO' : INFO,
- 'DEBUG' : DEBUG,
- 'NOTSET' : NOTSET,
-}
-
-def getLevelName(level):
- """
- Return the textual representation of logging level 'level'.
-
- If the level is one of the predefined levels (CRITICAL, ERROR, WARNING,
- INFO, DEBUG) then you get the corresponding string. If you have
- associated levels with names using addLevelName then the name you have
- associated with 'level' is returned.
-
- If a numeric value corresponding to one of the defined levels is passed
- in, the corresponding string representation is returned.
-
- Otherwise, the string "Level %s" % level is returned.
- """
- return _levelNames.get(level, ("Level %s" % level))
-
-def addLevelName(level, levelName):
- """
- Associate 'levelName' with 'level'.
-
- This is used when converting levels to text during message formatting.
- """
- _acquireLock()
- try: #unlikely to cause an exception, but you never know...
- _levelNames[level] = levelName
- _levelNames[levelName] = level
- finally:
- _releaseLock()
-
-def _checkLevel(level):
- if isinstance(level, int):
- rv = level
- elif str(level) == level:
- if level not in _levelNames:
- raise ValueError("Unknown level: %r" % level)
- rv = _levelNames[level]
- else:
- raise TypeError("Level not an integer or a valid string: %r" % level)
- return rv
-
-#---------------------------------------------------------------------------
-# Thread-related stuff
-#---------------------------------------------------------------------------
-
-#
-#_lock is used to serialize access to shared data structures in this module.
-#This needs to be an RLock because fileConfig() creates and configures
-#Handlers, and so might arbitrary user threads. Since Handler code updates the
-#shared dictionary _handlers, it needs to acquire the lock. But if configuring,
-#the lock would already have been acquired - so we need an RLock.
-#The same argument applies to Loggers and Manager.loggerDict.
-#
-if thread:
- _lock = threading.RLock()
-else:
- _lock = None
-
-
-def _acquireLock():
- """
- Acquire the module-level lock for serializing access to shared data.
-
- This should be released with _releaseLock().
- """
- if _lock:
- _lock.acquire()
-
-def _releaseLock():
- """
- Release the module-level lock acquired by calling _acquireLock().
- """
- if _lock:
- _lock.release()
-
-#---------------------------------------------------------------------------
-# The logging record
-#---------------------------------------------------------------------------
-
-class LogRecord(object):
- """
- A LogRecord instance represents an event being logged.
-
- LogRecord instances are created every time something is logged. They
- contain all the information pertinent to the event being logged. The
- main information passed in is in msg and args, which are combined
- using str(msg) % args to create the message field of the record. The
- record also includes information such as when the record was created,
- the source line where the logging call was made, and any exception
- information to be logged.
- """
- def __init__(self, name, level, pathname, lineno,
- msg, args, exc_info, func=None, sinfo=None, **kwargs):
- """
- Initialize a logging record with interesting information.
- """
- ct = time.time()
- self.name = name
- self.msg = msg
- #
- # The following statement allows passing of a dictionary as a sole
- # argument, so that you can do something like
- # logging.debug("a %(a)d b %(b)s", {'a':1, 'b':2})
- # Suggested by Stefan Behnel.
- # Note that without the test for args[0], we get a problem because
- # during formatting, we test to see if the arg is present using
- # 'if self.args:'. If the event being logged is e.g. 'Value is %d'
- # and if the passed arg fails 'if self.args:' then no formatting
- # is done. For example, logger.warn('Value is %d', 0) would log
- # 'Value is %d' instead of 'Value is 0'.
- # For the use case of passing a dictionary, this should not be a
- # problem.
- if args and len(args) == 1 and isinstance(args[0], dict) and args[0]:
- args = args[0]
- self.args = args
- self.levelname = getLevelName(level)
- self.levelno = level
- self.pathname = pathname
- try:
- self.filename = os.path.basename(pathname)
- self.module = os.path.splitext(self.filename)[0]
- except (TypeError, ValueError, AttributeError):
- self.filename = pathname
- self.module = "Unknown module"
- self.exc_info = exc_info
- self.exc_text = None # used to cache the traceback text
- self.stack_info = sinfo
- self.lineno = lineno
- self.funcName = func
- self.created = ct
- self.msecs = (ct - int(ct)) * 1000
- self.relativeCreated = (self.created - _startTime) * 1000
- if logThreads and thread:
- self.thread = thread.get_ident()
- self.threadName = threading.current_thread().name
- else:
- self.thread = None
- self.threadName = None
- if not logMultiprocessing:
- self.processName = None
- else:
- self.processName = 'MainProcess'
- mp = sys.modules.get('multiprocessing')
- if mp is not None:
- # Errors may occur if multiprocessing has not finished loading
- # yet - e.g. if a custom import hook causes third-party code
- # to run when multiprocessing calls import. See issue 8200
- # for an example
- try:
- self.processName = mp.current_process().name
- except Exception:
- pass
- if logProcesses and hasattr(os, 'getpid'):
- self.process = os.getpid()
- else:
- self.process = None
-
- def __str__(self):
- return '<LogRecord: %s, %s, %s, %s, "%s">'%(self.name, self.levelno,
- self.pathname, self.lineno, self.msg)
-
- def getMessage(self):
- """
- Return the message for this LogRecord.
-
- Return the message for this LogRecord after merging any user-supplied
- arguments with the message.
- """
- msg = str(self.msg)
- if self.args:
- msg = msg % self.args
- return msg
-
-#
-# Determine which class to use when instantiating log records.
-#
-_logRecordFactory = LogRecord
-
-def setLogRecordFactory(factory):
- """
- Set the factory to be used when instantiating a log record.
-
- :param factory: A callable which will be called to instantiate
- a log record.
- """
- global _logRecordFactory
- _logRecordFactory = factory
-
-def getLogRecordFactory():
- """
- Return the factory to be used when instantiating a log record.
- """
-
- return _logRecordFactory
-
-def makeLogRecord(dict):
- """
- Make a LogRecord whose attributes are defined by the specified dictionary,
- This function is useful for converting a logging event received over
- a socket connection (which is sent as a dictionary) into a LogRecord
- instance.
- """
- rv = _logRecordFactory(None, None, "", 0, "", (), None, None)
- rv.__dict__.update(dict)
- return rv
-
-#---------------------------------------------------------------------------
-# Formatter classes and functions
-#---------------------------------------------------------------------------
-
-class PercentStyle(object):
-
- default_format = '%(message)s'
- asctime_format = '%(asctime)s'
- asctime_search = '%(asctime)'
-
- def __init__(self, fmt):
- self._fmt = fmt or self.default_format
-
- def usesTime(self):
- return self._fmt.find(self.asctime_search) >= 0
-
- def format(self, record):
- return self._fmt % record.__dict__
-
-class StrFormatStyle(PercentStyle):
- default_format = '{message}'
- asctime_format = '{asctime}'
- asctime_search = '{asctime'
-
- def format(self, record):
- return self._fmt.format(**record.__dict__)
-
-
-class StringTemplateStyle(PercentStyle):
- default_format = '${message}'
- asctime_format = '${asctime}'
- asctime_search = '${asctime}'
-
- def __init__(self, fmt):
- self._fmt = fmt or self.default_format
- self._tpl = Template(self._fmt)
-
- def usesTime(self):
- fmt = self._fmt
- return fmt.find('$asctime') >= 0 or fmt.find(self.asctime_format) >= 0
-
- def format(self, record):
- return self._tpl.substitute(**record.__dict__)
-
-_STYLES = {
- '%': PercentStyle,
- '{': StrFormatStyle,
- '$': StringTemplateStyle
-}
-
-class Formatter(object):
- """
- Formatter instances are used to convert a LogRecord to text.
-
- Formatters need to know how a LogRecord is constructed. They are
- responsible for converting a LogRecord to (usually) a string which can
- be interpreted by either a human or an external system. The base Formatter
- allows a formatting string to be specified. If none is supplied, the
- default value of "%s(message)" is used.
-
- The Formatter can be initialized with a format string which makes use of
- knowledge of the LogRecord attributes - e.g. the default value mentioned
- above makes use of the fact that the user's message and arguments are pre-
- formatted into a LogRecord's message attribute. Currently, the useful
- attributes in a LogRecord are described by:
-
- %(name)s Name of the logger (logging channel)
- %(levelno)s Numeric logging level for the message (DEBUG, INFO,
- WARNING, ERROR, CRITICAL)
- %(levelname)s Text logging level for the message ("DEBUG", "INFO",
- "WARNING", "ERROR", "CRITICAL")
- %(pathname)s Full pathname of the source file where the logging
- call was issued (if available)
- %(filename)s Filename portion of pathname
- %(module)s Module (name portion of filename)
- %(lineno)d Source line number where the logging call was issued
- (if available)
- %(funcName)s Function name
- %(created)f Time when the LogRecord was created (time.time()
- return value)
- %(asctime)s Textual time when the LogRecord was created
- %(msecs)d Millisecond portion of the creation time
- %(relativeCreated)d Time in milliseconds when the LogRecord was created,
- relative to the time the logging module was loaded
- (typically at application startup time)
- %(thread)d Thread ID (if available)
- %(threadName)s Thread name (if available)
- %(process)d Process ID (if available)
- %(message)s The result of record.getMessage(), computed just as
- the record is emitted
- """
-
- converter = time.localtime
-
- def __init__(self, fmt=None, datefmt=None, style='%'):
- """
- Initialize the formatter with specified format strings.
-
- Initialize the formatter either with the specified format string, or a
- default as described above. Allow for specialized date formatting with
- the optional datefmt argument (if omitted, you get the ISO8601 format).
-
- Use a style parameter of '%', '{' or '$' to specify that you want to
- use one of %-formatting, :meth:`str.format` (``{}``) formatting or
- :class:`string.Template` formatting in your format string.
-
- .. versionchanged: 3.2
- Added the ``style`` parameter.
- """
- if style not in _STYLES:
- raise ValueError('Style must be one of: %s' % ','.join(
- _STYLES.keys()))
- self._style = _STYLES[style](fmt)
- self._fmt = self._style._fmt
- self.datefmt = datefmt
-
- def formatTime(self, record, datefmt=None):
- """
- Return the creation time of the specified LogRecord as formatted text.
-
- This method should be called from format() by a formatter which
- wants to make use of a formatted time. This method can be overridden
- in formatters to provide for any specific requirement, but the
- basic behaviour is as follows: if datefmt (a string) is specified,
- it is used with time.strftime() to format the creation time of the
- record. Otherwise, the ISO8601 format is used. The resulting
- string is returned. This function uses a user-configurable function
- to convert the creation time to a tuple. By default, time.localtime()
- is used; to change this for a particular formatter instance, set the
- 'converter' attribute to a function with the same signature as
- time.localtime() or time.gmtime(). To change it for all formatters,
- for example if you want all logging times to be shown in GMT,
- set the 'converter' attribute in the Formatter class.
- """
- ct = self.converter(record.created)
- if datefmt:
- s = time.strftime(datefmt, ct)
- else:
- t = time.strftime("%Y-%m-%d %H:%M:%S", ct)
- s = "%s,%03d" % (t, record.msecs) # the use of % here is internal
- return s
-
- def formatException(self, ei):
- """
- Format and return the specified exception information as a string.
-
- This default implementation just uses
- traceback.print_exception()
- """
- sio = io.StringIO()
- tb = ei[2]
- # See issues #9427, #1553375. Commented out for now.
- #if getattr(self, 'fullstack', False):
- # traceback.print_stack(tb.tb_frame.f_back, file=sio)
- traceback.print_exception(ei[0], ei[1], tb, None, sio)
- s = sio.getvalue()
- sio.close()
- if s[-1:] == "\n":
- s = s[:-1]
- return s
-
- def usesTime(self):
- """
- Check if the format uses the creation time of the record.
- """
- return self._style.usesTime()
-
- def formatMessage(self, record):
- return self._style.format(record)
-
- def formatStack(self, stack_info):
- """
- This method is provided as an extension point for specialized
- formatting of stack information.
-
- The input data is a string as returned from a call to
- :func:`traceback.print_stack`, but with the last trailing newline
- removed.
-
- The base implementation just returns the value passed in.
- """
- return stack_info
-
- def format(self, record):
- """
- Format the specified record as text.
-
- The record's attribute dictionary is used as the operand to a
- string formatting operation which yields the returned string.
- Before formatting the dictionary, a couple of preparatory steps
- are carried out. The message attribute of the record is computed
- using LogRecord.getMessage(). If the formatting string uses the
- time (as determined by a call to usesTime(), formatTime() is
- called to format the event time. If there is exception information,
- it is formatted using formatException() and appended to the message.
- """
- record.message = record.getMessage()
- if self.usesTime():
- record.asctime = self.formatTime(record, self.datefmt)
- s = self.formatMessage(record)
- if record.exc_info:
- # Cache the traceback text to avoid converting it multiple times
- # (it's constant anyway)
- if not record.exc_text:
- record.exc_text = self.formatException(record.exc_info)
- if record.exc_text:
- if s[-1:] != "\n":
- s = s + "\n"
- s = s + record.exc_text
- if record.stack_info:
- if s[-1:] != "\n":
- s = s + "\n"
- s = s + self.formatStack(record.stack_info)
- return s
-
-#
-# The default formatter to use when no other is specified
-#
-_defaultFormatter = Formatter()
-
-class BufferingFormatter(object):
- """
- A formatter suitable for formatting a number of records.
- """
- def __init__(self, linefmt=None):
- """
- Optionally specify a formatter which will be used to format each
- individual record.
- """
- if linefmt:
- self.linefmt = linefmt
- else:
- self.linefmt = _defaultFormatter
-
- def formatHeader(self, records):
- """
- Return the header string for the specified records.
- """
- return ""
-
- def formatFooter(self, records):
- """
- Return the footer string for the specified records.
- """
- return ""
-
- def format(self, records):
- """
- Format the specified records and return the result as a string.
- """
- rv = ""
- if len(records) > 0:
- rv = rv + self.formatHeader(records)
- for record in records:
- rv = rv + self.linefmt.format(record)
- rv = rv + self.formatFooter(records)
- return rv
-
-#---------------------------------------------------------------------------
-# Filter classes and functions
-#---------------------------------------------------------------------------
-
-class Filter(object):
- """
- Filter instances are used to perform arbitrary filtering of LogRecords.
-
- Loggers and Handlers can optionally use Filter instances to filter
- records as desired. The base filter class only allows events which are
- below a certain point in the logger hierarchy. For example, a filter
- initialized with "A.B" will allow events logged by loggers "A.B",
- "A.B.C", "A.B.C.D", "A.B.D" etc. but not "A.BB", "B.A.B" etc. If
- initialized with the empty string, all events are passed.
- """
- def __init__(self, name=''):
- """
- Initialize a filter.
-
- Initialize with the name of the logger which, together with its
- children, will have its events allowed through the filter. If no
- name is specified, allow every event.
- """
- self.name = name
- self.nlen = len(name)
-
- def filter(self, record):
- """
- Determine if the specified record is to be logged.
-
- Is the specified record to be logged? Returns 0 for no, nonzero for
- yes. If deemed appropriate, the record may be modified in-place.
- """
- if self.nlen == 0:
- return 1
- elif self.name == record.name:
- return 1
- elif record.name.find(self.name, 0, self.nlen) != 0:
- return 0
- return (record.name[self.nlen] == ".")
-
-class Filterer(object):
- """
- A base class for loggers and handlers which allows them to share
- common code.
- """
- def __init__(self):
- """
- Initialize the list of filters to be an empty list.
- """
- self.filters = []
-
- def addFilter(self, filter):
- """
- Add the specified filter to this handler.
- """
- if not (filter in self.filters):
- self.filters.append(filter)
-
- def removeFilter(self, filter):
- """
- Remove the specified filter from this handler.
- """
- if filter in self.filters:
- self.filters.remove(filter)
-
- def filter(self, record):
- """
- Determine if a record is loggable by consulting all the filters.
-
- The default is to allow the record to be logged; any filter can veto
- this and the record is then dropped. Returns a zero value if a record
- is to be dropped, else non-zero.
-
- .. versionchanged: 3.2
-
- Allow filters to be just callables.
- """
- rv = 1
- for f in self.filters:
- if hasattr(f, 'filter'):
- result = f.filter(record)
- else:
- result = f(record) # assume callable - will raise if not
- if not result:
- rv = 0
- break
- return rv
-
-#---------------------------------------------------------------------------
-# Handler classes and functions
-#---------------------------------------------------------------------------
-
-any _handlers = weakref.WeakValueDictionary() #map of handler names to handlers
-any _handlerList = [] # added to allow handlers to be removed in reverse of order initialized
-
-def _removeHandlerRef(wr):
- """
- Remove a handler reference from the internal cleanup list.
- """
- # This function can be called during module teardown, when globals are
- # set to None. If _acquireLock is None, assume this is the case and do
- # nothing.
- if _acquireLock is not None:
- _acquireLock()
- try:
- if wr in _handlerList:
- _handlerList.remove(wr)
- finally:
- _releaseLock()
-
-def _addHandlerRef(handler):
- """
- Add a handler to the internal cleanup list using a weak reference.
- """
- _acquireLock()
- try:
- _handlerList.append(weakref.ref(handler, _removeHandlerRef))
- finally:
- _releaseLock()
-
-class Handler(Filterer):
- """
- Handler instances dispatch logging events to specific destinations.
-
- The base handler class. Acts as a placeholder which defines the Handler
- interface. Handlers can optionally use Formatter instances to format
- records as desired. By default, no formatter is specified; in this case,
- the 'raw' message as determined by record.message is logged.
- """
- def __init__(self, level=NOTSET):
- """
- Initializes the instance - basically setting the formatter to None
- and the filter list to empty.
- """
- Filterer.__init__(self)
- self._name = None
- self.level = _checkLevel(level)
- self.formatter = None
- # Add the handler to the global _handlerList (for cleanup on shutdown)
- _addHandlerRef(self)
- self.createLock()
-
- def get_name(self):
- return self._name
-
- def set_name(self, name):
- _acquireLock()
- try:
- if self._name in _handlers:
- del _handlers[self._name]
- self._name = name
- if name:
- _handlers[name] = self
- finally:
- _releaseLock()
-
- #name = property(get_name, set_name)
-
- def createLock(self):
- """
- Acquire a thread lock for serializing access to the underlying I/O.
- """
- if thread:
- self.lock = threading.RLock()
- else:
- self.lock = None
-
- def acquire(self):
- """
- Acquire the I/O thread lock.
- """
- if self.lock:
- self.lock.acquire()
-
- def release(self):
- """
- Release the I/O thread lock.
- """
- if self.lock:
- self.lock.release()
-
- def setLevel(self, level):
- """
- Set the logging level of this handler.
- """
- self.level = _checkLevel(level)
-
- def format(self, record):
- """
- Format the specified record.
-
- If a formatter is set, use it. Otherwise, use the default formatter
- for the module.
- """
- if self.formatter:
- fmt = self.formatter
- else:
- fmt = _defaultFormatter
- return fmt.format(record)
-
- def emit(self, record):
- """
- Do whatever it takes to actually log the specified logging record.
-
- This version is intended to be implemented by subclasses and so
- raises a NotImplementedError.
- """
- raise NotImplementedError('emit must be implemented '
- 'by Handler subclasses')
-
- def handle(self, record):
- """
- Conditionally emit the specified logging record.
-
- Emission depends on filters which may have been added to the handler.
- Wrap the actual emission of the record with acquisition/release of
- the I/O thread lock. Returns whether the filter passed the record for
- emission.
- """
- rv = self.filter(record)
- if rv:
- self.acquire()
- try:
- self.emit(record)
- finally:
- self.release()
- return rv
-
- def setFormatter(self, fmt):
- """
- Set the formatter for this handler.
- """
- self.formatter = fmt
-
- def flush(self):
- """
- Ensure all logging output has been flushed.
-
- This version does nothing and is intended to be implemented by
- subclasses.
- """
- pass
-
- def close(self):
- """
- Tidy up any resources used by the handler.
-
- This version removes the handler from an internal map of handlers,
- _handlers, which is used for handler lookup by name. Subclasses
- should ensure that this gets called from overridden close()
- methods.
- """
- #get the module data lock, as we're updating a shared structure.
- _acquireLock()
- try: #unlikely to raise an exception, but you never know...
- if self._name and self._name in _handlers:
- del _handlers[self._name]
- finally:
- _releaseLock()
-
- def handleError(self, record):
- """
- Handle errors which occur during an emit() call.
-
- This method should be called from handlers when an exception is
- encountered during an emit() call. If raiseExceptions is false,
- exceptions get silently ignored. This is what is mostly wanted
- for a logging system - most users will not care about errors in
- the logging system, they are more interested in application errors.
- You could, however, replace this with a custom handler if you wish.
- The record which was being processed is passed in to this method.
- """
- if raiseExceptions and sys.stderr: # see issue 13807
- ei = sys.exc_info()
- try:
- traceback.print_exception(ei[0], ei[1], ei[2],
- None, sys.stderr)
- sys.stderr.write('Logged from file %s, line %s\n' % (
- record.filename, record.lineno))
- except IOError:
- pass # see issue 5971
- finally:
- ei = None
-
-class StreamHandler(Handler):
- """
- A handler class which writes logging records, appropriately formatted,
- to a stream. Note that this class does not close the stream, as
- sys.stdout or sys.stderr may be used.
- """
-
- terminator = '\n'
-
- def __init__(self, stream=None):
- """
- Initialize the handler.
-
- If stream is not specified, sys.stderr is used.
- """
- Handler.__init__(self)
- if stream is None:
- stream = sys.stderr
- self.stream = stream
-
- def flush(self):
- """
- Flushes the stream.
- """
- if self.stream and hasattr(self.stream, "flush"):
- self.stream.flush()
-
- def emit(self, record):
- """
- Emit a record.
-
- If a formatter is specified, it is used to format the record.
- The record is then written to the stream with a trailing newline. If
- exception information is present, it is formatted using
- traceback.print_exception and appended to the stream. If the stream
- has an 'encoding' attribute, it is used to determine how to do the
- output to the stream.
- """
- try:
- msg = self.format(record)
- stream = self.stream
- stream.write(msg)
- stream.write(self.terminator)
- self.flush()
- except (KeyboardInterrupt, SystemExit):
- raise
- except:
- self.handleError(record)
-
-class FileHandler(StreamHandler):
- """
- A handler class which writes formatted logging records to disk files.
- """
- def __init__(self, filename, mode='a', encoding=None, delay=0):
- """
- Open the specified file and use it as the stream for logging.
- """
- #keep the absolute path, otherwise derived classes which use this
- #may come a cropper when the current directory changes
- if codecs is None:
- encoding = None
- self.baseFilename = os.path.abspath(filename)
- self.mode = mode
- self.encoding = encoding
- if delay:
- #We don't open the stream, but we still need to call the
- #Handler constructor to set level, formatter, lock etc.
- Handler.__init__(self)
- self.stream = None
- else:
- StreamHandler.__init__(self, self._open())
-
- def close(self):
- """
- Closes the stream.
- """
- if self.stream:
- self.flush()
- if hasattr(self.stream, "close"):
- self.stream.close()
- StreamHandler.close(self)
- self.stream = None
-
- def _open(self):
- """
- Open the current base file with the (original) mode and encoding.
- Return the resulting stream.
- """
- if self.encoding is None:
- stream = open(self.baseFilename, self.mode)
- else:
- stream = codecs.open(self.baseFilename, self.mode, self.encoding)
- return stream
-
- def emit(self, record):
- """
- Emit a record.
-
- If the stream was not opened because 'delay' was specified in the
- constructor, open it before calling the superclass's emit.
- """
- if self.stream is None:
- self.stream = self._open()
- StreamHandler.emit(self, record)
-
-class _StderrHandler(StreamHandler):
- """
- This class is like a StreamHandler using sys.stderr, but always uses
- whatever sys.stderr is currently set to rather than the value of
- sys.stderr at handler construction time.
- """
- def __init__(self, level=NOTSET):
- """
- Initialize the handler.
- """
- Handler.__init__(self, level)
-
- #@property
- #def stream(self):
- # return sys.stderr
-
-
-_defaultLastResort = _StderrHandler(WARNING)
-lastResort = _defaultLastResort
-
-#---------------------------------------------------------------------------
-# Manager classes and functions
-#---------------------------------------------------------------------------
-
-class PlaceHolder(object):
- """
- PlaceHolder instances are used in the Manager logger hierarchy to take
- the place of nodes for which no loggers have been defined. This class is
- intended for internal use only and not as part of the public API.
- """
- def __init__(self, alogger):
- """
- Initialize with the specified logger being a child of this placeholder.
- """
- self.loggerMap = { alogger : None }
-
- def append(self, alogger):
- """
- Add the specified logger as a child of this placeholder.
- """
- if alogger not in self.loggerMap:
- self.loggerMap[alogger] = None
-
-#
-# Determine which class to use when instantiating loggers.
-#
-any _loggerClass = None
-
-def setLoggerClass(klass):
- """
- Set the class to be used when instantiating a logger. The class should
- define __init__() such that only a name argument is required, and the
- __init__() should call Logger.__init__()
- """
- if klass != Logger:
- if not issubclass(klass, Logger):
- raise TypeError("logger not derived from logging.Logger: "
- + klass.__name__)
- global _loggerClass
- _loggerClass = klass
-
-def getLoggerClass():
- """
- Return the class to be used when instantiating a logger.
- """
-
- return _loggerClass
-
-class Manager(object):
- """
- There is [under normal circumstances] just one Manager instance, which
- holds the hierarchy of loggers.
- """
- def __init__(self, rootnode):
- """
- Initialize the manager with the root node of the logger hierarchy.
- """
- self.root = rootnode
- self.disable = 0
- self.emittedNoHandlerWarning = False
- self.loggerDict = {}
- self.loggerClass = None
- self.logRecordFactory = None
-
- def getLogger(self, name):
- """
- Get a logger with the specified name (channel name), creating it
- if it doesn't yet exist. This name is a dot-separated hierarchical
- name, such as "a", "a.b", "a.b.c" or similar.
-
- If a PlaceHolder existed for the specified name [i.e. the logger
- didn't exist but a child of it did], replace it with the created
- logger and fix up the parent/child references which pointed to the
- placeholder to now point to the logger.
- """
- rv = None
- if not isinstance(name, str):
- raise TypeError('A logger name must be a string')
- _acquireLock()
- try:
- if name in self.loggerDict:
- rv = self.loggerDict[name]
- if isinstance(rv, PlaceHolder):
- ph = rv
- rv = (self.loggerClass or _loggerClass)(name)
- rv.manager = self
- self.loggerDict[name] = rv
- self._fixupChildren(ph, rv)
- self._fixupParents(rv)
- else:
- rv = (self.loggerClass or _loggerClass)(name)
- rv.manager = self
- self.loggerDict[name] = rv
- self._fixupParents(rv)
- finally:
- _releaseLock()
- return rv
-
- def setLoggerClass(self, klass):
- """
- Set the class to be used when instantiating a logger with this Manager.
- """
- if klass != Logger:
- if not issubclass(klass, Logger):
- raise TypeError("logger not derived from logging.Logger: "
- + klass.__name__)
- self.loggerClass = klass
-
- def setLogRecordFactory(self, factory):
- """
- Set the factory to be used when instantiating a log record with this
- Manager.
- """
- self.logRecordFactory = factory
-
- def _fixupParents(self, alogger):
- """
- Ensure that there are either loggers or placeholders all the way
- from the specified logger to the root of the logger hierarchy.
- """
- name = alogger.name
- i = name.rfind(".")
- rv = None
- while (i > 0) and not rv:
- substr = name[:i]
- if substr not in self.loggerDict:
- self.loggerDict[substr] = PlaceHolder(alogger)
- else:
- obj = self.loggerDict[substr]
- if isinstance(obj, Logger):
- rv = obj
- else:
- assert isinstance(obj, PlaceHolder)
- obj.append(alogger)
- i = name.rfind(".", 0, i - 1)
- if not rv:
- rv = self.root
- alogger.parent = rv
-
- def _fixupChildren(self, ph, alogger):
- """
- Ensure that children of the placeholder ph are connected to the
- specified logger.
- """
- name = alogger.name
- namelen = len(name)
- for c in ph.loggerMap.keys():
- #The if means ... if not c.parent.name.startswith(nm)
- if c.parent.name[:namelen] != name:
- alogger.parent = c.parent
- c.parent = alogger
-
-#---------------------------------------------------------------------------
-# Logger classes and functions
-#---------------------------------------------------------------------------
-
-class Logger(Filterer):
- """
- Instances of the Logger class represent a single logging channel. A
- "logging channel" indicates an area of an application. Exactly how an
- "area" is defined is up to the application developer. Since an
- application can have any number of areas, logging channels are identified
- by a unique string. Application areas can be nested (e.g. an area
- of "input processing" might include sub-areas "read CSV files", "read
- XLS files" and "read Gnumeric files"). To cater for this natural nesting,
- channel names are organized into a namespace hierarchy where levels are
- separated by periods, much like the Java or Python package namespace. So
- in the instance given above, channel names might be "input" for the upper
- level, and "input.csv", "input.xls" and "input.gnu" for the sub-levels.
- There is no arbitrary limit to the depth of nesting.
- """
-
- any root
- any manager
-
- def __init__(self, name, level=NOTSET):
- """
- Initialize the logger with a name and an optional level.
- """
- Filterer.__init__(self)
- self.name = name
- self.level = _checkLevel(level)
- self.parent = None
- self.propagate = 1
- self.handlers = []
- self.disabled = 0
-
- def setLevel(self, level):
- """
- Set the logging level of this logger.
- """
- self.level = _checkLevel(level)
-
- def debug(self, msg, *args, **kwargs):
- """
- Log 'msg % args' with severity 'DEBUG'.
-
- To pass exception information, use the keyword argument exc_info with
- a true value, e.g.
-
- logger.debug("Houston, we have a %s", "thorny problem", exc_info=1)
- """
- if self.isEnabledFor(DEBUG):
- self._log(DEBUG, msg, args, **kwargs)
-
- def info(self, msg, *args, **kwargs):
- """
- Log 'msg % args' with severity 'INFO'.
-
- To pass exception information, use the keyword argument exc_info with
- a true value, e.g.
-
- logger.info("Houston, we have a %s", "interesting problem", exc_info=1)
- """
- if self.isEnabledFor(INFO):
- self._log(INFO, msg, args, **kwargs)
-
- def warning(self, msg, *args, **kwargs):
- """
- Log 'msg % args' with severity 'WARNING'.
-
- To pass exception information, use the keyword argument exc_info with
- a true value, e.g.
-
- logger.warning("Houston, we have a %s", "bit of a problem", exc_info=1)
- """
- if self.isEnabledFor(WARNING):
- self._log(WARNING, msg, args, **kwargs)
-
- warn = warning
-
- def error(self, msg, *args, **kwargs):
- """
- Log 'msg % args' with severity 'ERROR'.
-
- To pass exception information, use the keyword argument exc_info with
- a true value, e.g.
-
- logger.error("Houston, we have a %s", "major problem", exc_info=1)
- """
- if self.isEnabledFor(ERROR):
- self._log(ERROR, msg, args, **kwargs)
-
- def exception(self, msg, *args, **kwargs):
- """
- Convenience method for logging an ERROR with exception information.
- """
- kwargs['exc_info'] = True
- self.error(msg, *args, **kwargs)
-
- def critical(self, msg, *args, **kwargs):
- """
- Log 'msg % args' with severity 'CRITICAL'.
-
- To pass exception information, use the keyword argument exc_info with
- a true value, e.g.
-
- logger.critical("Houston, we have a %s", "major disaster", exc_info=1)
- """
- if self.isEnabledFor(CRITICAL):
- self._log(CRITICAL, msg, args, **kwargs)
-
- fatal = critical
-
- def log(self, level, msg, *args, **kwargs):
- """
- Log 'msg % args' with the integer severity 'level'.
-
- To pass exception information, use the keyword argument exc_info with
- a true value, e.g.
-
- logger.log(level, "We have a %s", "mysterious problem", exc_info=1)
- """
- if not isinstance(level, int):
- if raiseExceptions:
- raise TypeError("level must be an integer")
- else:
- return
- if self.isEnabledFor(level):
- self._log(level, msg, args, **kwargs)
-
- def findCaller(self, stack_info=False):
- """
- Find the stack frame of the caller so that we can note the source
- file name, line number and function name.
- """
- f = currentframe()
- #On some versions of IronPython, currentframe() returns None if
- #IronPython isn't run with -X:Frames.
- if f is not None:
- f = f.f_back
- rv = "(unknown file)", 0, "(unknown function)", None
- while hasattr(f, "f_code"):
- co = f.f_code
- filename = os.path.normcase(co.co_filename)
- if filename == _srcfile:
- f = f.f_back
- continue
- sinfo = None
- if stack_info:
- sio = io.StringIO()
- sio.write('Stack (most recent call last):\n')
- traceback.print_stack(f, file=sio)
- sinfo = sio.getvalue()
- if sinfo[-1] == '\n':
- sinfo = sinfo[:-1]
- sio.close()
- rv = (co.co_filename, f.f_lineno, co.co_name, sinfo)
- break
- return rv
-
- def makeRecord(self, name, level, fn, lno, msg, args, exc_info,
- func=None, extra=None, sinfo=None):
- """
- A factory method which can be overridden in subclasses to create
- specialized LogRecords.
- """
- rv = _logRecordFactory(name, level, fn, lno, msg, args, exc_info, func,
- sinfo)
- if extra is not None:
- for key in extra:
- if (key in ["message", "asctime"]) or (key in rv.__dict__):
- raise KeyError("Attempt to overwrite %r in LogRecord" % key)
- rv.__dict__[key] = extra[key]
- return rv
-
- def _log(self, level, msg, args, exc_info=None, extra=None, stack_info=False):
- """
- Low-level logging routine which creates a LogRecord and then calls
- all the handlers of this logger to handle the record.
- """
- sinfo = None
- if _srcfile:
- #IronPython doesn't track Python frames, so findCaller throws an
- #exception on some versions of IronPython. We trap it here so that
- #IronPython can use logging.
- try:
- fn, lno, func, sinfo = self.findCaller(stack_info)
- except ValueError:
- fn, lno, func = "(unknown file)", 0, "(unknown function)"
- else:
- fn, lno, func = "(unknown file)", 0, "(unknown function)"
- if exc_info:
- if not isinstance(exc_info, tuple):
- exc_info = sys.exc_info()
- record = self.makeRecord(self.name, level, fn, lno, msg, args,
- exc_info, func, extra, sinfo)
- self.handle(record)
-
- def handle(self, record):
- """
- Call the handlers for the specified record.
-
- This method is used for unpickled records received from a socket, as
- well as those created locally. Logger-level filtering is applied.
- """
- if (not self.disabled) and self.filter(record):
- self.callHandlers(record)
-
- def addHandler(self, hdlr):
- """
- Add the specified handler to this logger.
- """
- _acquireLock()
- try:
- if not (hdlr in self.handlers):
- self.handlers.append(hdlr)
- finally:
- _releaseLock()
-
- def removeHandler(self, hdlr):
- """
- Remove the specified handler from this logger.
- """
- _acquireLock()
- try:
- if hdlr in self.handlers:
- self.handlers.remove(hdlr)
- finally:
- _releaseLock()
-
- def hasHandlers(self):
- """
- See if this logger has any handlers configured.
-
- Loop through all handlers for this logger and its parents in the
- logger hierarchy. Return True if a handler was found, else False.
- Stop searching up the hierarchy whenever a logger with the "propagate"
- attribute set to zero is found - that will be the last logger which
- is checked for the existence of handlers.
- """
- c = self
- rv = False
- while c:
- if c.handlers:
- rv = True
- break
- if not c.propagate:
- break
- else:
- c = c.parent
- return rv
-
- def callHandlers(self, record):
- """
- Pass a record to all relevant handlers.
-
- Loop through all handlers for this logger and its parents in the
- logger hierarchy. If no handler was found, output a one-off error
- message to sys.stderr. Stop searching up the hierarchy whenever a
- logger with the "propagate" attribute set to zero is found - that
- will be the last logger whose handlers are called.
- """
- c = self
- found = 0
- while c:
- for hdlr in c.handlers:
- found = found + 1
- if record.levelno >= hdlr.level:
- hdlr.handle(record)
- if not c.propagate:
- c = None #break out
- else:
- c = c.parent
- if (found == 0):
- if lastResort:
- if record.levelno >= lastResort.level:
- lastResort.handle(record)
- elif raiseExceptions and not self.manager.emittedNoHandlerWarning:
- sys.stderr.write("No handlers could be found for logger"
- " \"%s\"\n" % self.name)
- self.manager.emittedNoHandlerWarning = True
-
- def getEffectiveLevel(self):
- """
- Get the effective level for this logger.
-
- Loop through this logger and its parents in the logger hierarchy,
- looking for a non-zero logging level. Return the first one found.
- """
- logger = self
- while logger:
- if logger.level:
- return logger.level
- logger = logger.parent
- return NOTSET
-
- def isEnabledFor(self, level):
- """
- Is this logger enabled for level 'level'?
- """
- if self.manager.disable >= level:
- return 0
- return level >= self.getEffectiveLevel()
-
- def getChild(self, suffix):
- """
- Get a logger which is a descendant to this one.
-
- This is a convenience method, such that
-
- logging.getLogger('abc').getChild('def.ghi')
-
- is the same as
-
- logging.getLogger('abc.def.ghi')
-
- It's useful, for example, when the parent logger is named using
- __name__ rather than a literal string.
- """
- if self.root is not self:
- suffix = '.'.join((self.name, suffix))
- return self.manager.getLogger(suffix)
-
-class RootLogger(Logger):
- """
- A root logger is not that different to any other logger, except that
- it must have a logging level and there is only one instance of it in
- the hierarchy.
- """
- def __init__(self, level):
- """
- Initialize the logger with the name "root".
- """
- Logger.__init__(self, "root", level)
-
-_loggerClass = Logger
-
-class LoggerAdapter(object):
- """
- An adapter for loggers which makes it easier to specify contextual
- information in logging output.
- """
-
- def __init__(self, logger, extra):
- """
- Initialize the adapter with a logger and a dict-like object which
- provides contextual information. This constructor signature allows
- easy stacking of LoggerAdapters, if so desired.
-
- You can effectively pass keyword arguments as shown in the
- following example:
-
- adapter = LoggerAdapter(someLogger, dict(p1=v1, p2="v2"))
- """
- self.logger = logger
- self.extra = extra
-
- def process(self, msg, kwargs):
- """
- Process the logging message and keyword arguments passed in to
- a logging call to insert contextual information. You can either
- manipulate the message itself, the keyword args or both. Return
- the message and kwargs modified (or not) to suit your needs.
-
- Normally, you'll only need to override this one method in a
- LoggerAdapter subclass for your specific needs.
- """
- kwargs["extra"] = self.extra
- return msg, kwargs
-
- #
- # Boilerplate convenience methods
- #
- def debug(self, msg, *args, **kwargs):
- """
- Delegate a debug call to the underlying logger.
- """
- self.log(DEBUG, msg, *args, **kwargs)
-
- def info(self, msg, *args, **kwargs):
- """
- Delegate an info call to the underlying logger.
- """
- self.log(INFO, msg, *args, **kwargs)
-
- def warning(self, msg, *args, **kwargs):
- """
- Delegate a warning call to the underlying logger.
- """
- self.log(WARNING, msg, *args, **kwargs)
-
- warn = warning
-
- def error(self, msg, *args, **kwargs):
- """
- Delegate an error call to the underlying logger.
- """
- self.log(ERROR, msg, *args, **kwargs)
-
- def exception(self, msg, *args, **kwargs):
- """
- Delegate an exception call to the underlying logger.
- """
- kwargs["exc_info"] = 1
- self.log(ERROR, msg, *args, **kwargs)
-
- def critical(self, msg, *args, **kwargs):
- """
- Delegate a critical call to the underlying logger.
- """
- self.log(CRITICAL, msg, *args, **kwargs)
-
- def log(self, level, msg, *args, **kwargs):
- """
- Delegate a log call to the underlying logger, after adding
- contextual information from this adapter instance.
- """
- if self.isEnabledFor(level):
- msg, kwargs = self.process(msg, kwargs)
- self.logger._log(level, msg, args, **kwargs)
-
- def isEnabledFor(self, level):
- """
- Is this logger enabled for level 'level'?
- """
- if self.logger.manager.disable >= level:
- return False
- return level >= self.getEffectiveLevel()
-
- def setLevel(self, level):
- """
- Set the specified level on the underlying logger.
- """
- self.logger.setLevel(level)
-
- def getEffectiveLevel(self):
- """
- Get the effective level for the underlying logger.
- """
- return self.logger.getEffectiveLevel()
-
- def hasHandlers(self):
- """
- See if the underlying logger has any handlers.
- """
- return self.logger.hasHandlers()
-
-root = RootLogger(WARNING)
-Logger.root = root
-Logger.manager = Manager(Logger.root)
-
-#---------------------------------------------------------------------------
-# Configuration classes and functions
-#---------------------------------------------------------------------------
-
-BASIC_FORMAT = "%(levelname)s:%(name)s:%(message)s"
-
-def basicConfig(**kwargs):
- """
- Do basic configuration for the logging system.
-
- This function does nothing if the root logger already has handlers
- configured. It is a convenience method intended for use by simple scripts
- to do one-shot configuration of the logging package.
-
- The default behaviour is to create a StreamHandler which writes to
- sys.stderr, set a formatter using the BASIC_FORMAT format string, and
- add the handler to the root logger.
-
- A number of optional keyword arguments may be specified, which can alter
- the default behaviour.
-
- filename Specifies that a FileHandler be created, using the specified
- filename, rather than a StreamHandler.
- filemode Specifies the mode to open the file, if filename is specified
- (if filemode is unspecified, it defaults to 'a').
- format Use the specified format string for the handler.
- datefmt Use the specified date/time format.
- style If a format string is specified, use this to specify the
- type of format string (possible values '%', '{', '$', for
- %-formatting, :meth:`str.format` and :class:`string.Template`
- - defaults to '%').
- level Set the root logger level to the specified level.
- stream Use the specified stream to initialize the StreamHandler. Note
- that this argument is incompatible with 'filename' - if both
- are present, 'stream' is ignored.
-
- Note that you could specify a stream created using open(filename, mode)
- rather than passing the filename and mode in. However, it should be
- remembered that StreamHandler does not close its stream (since it may be
- using sys.stdout or sys.stderr), whereas FileHandler closes its stream
- when the handler is closed.
-
- .. versionchanged: 3.2
- Added the ``style`` parameter.
- """
- # Add thread safety in case someone mistakenly calls
- # basicConfig() from multiple threads
- _acquireLock()
- try:
- if len(root.handlers) == 0:
- filename = kwargs.get("filename")
- if filename:
- mode = kwargs.get("filemode", 'a')
- hdlr = FileHandler(filename, mode)
- else:
- stream = kwargs.get("stream")
- hdlr = StreamHandler(stream)
- fs = kwargs.get("format", BASIC_FORMAT)
- dfs = kwargs.get("datefmt", None)
- style = kwargs.get("style", '%')
- fmt = Formatter(fs, dfs, style)
- hdlr.setFormatter(fmt)
- root.addHandler(hdlr)
- level = kwargs.get("level")
- if level is not None:
- root.setLevel(level)
- finally:
- _releaseLock()
-
-#---------------------------------------------------------------------------
-# Utility functions at module level.
-# Basically delegate everything to the root logger.
-#---------------------------------------------------------------------------
-
-def getLogger(name=None):
- """
- Return a logger with the specified name, creating it if necessary.
-
- If no name is specified, return the root logger.
- """
- if name:
- return Logger.manager.getLogger(name)
- else:
- return root
-
-def critical(msg, *args, **kwargs):
- """
- Log a message with severity 'CRITICAL' on the root logger. If the logger
- has no handlers, call basicConfig() to add a console handler with a
- pre-defined format.
- """
- if len(root.handlers) == 0:
- basicConfig()
- root.critical(msg, *args, **kwargs)
-
-fatal = critical
-
-def error(msg, *args, **kwargs):
- """
- Log a message with severity 'ERROR' on the root logger. If the logger has
- no handlers, call basicConfig() to add a console handler with a pre-defined
- format.
- """
- if len(root.handlers) == 0:
- basicConfig()
- root.error(msg, *args, **kwargs)
-
-def exception(msg, *args, **kwargs):
- """
- Log a message with severity 'ERROR' on the root logger, with exception
- information. If the logger has no handlers, basicConfig() is called to add
- a console handler with a pre-defined format.
- """
- kwargs['exc_info'] = True
- error(msg, *args, **kwargs)
-
-def warning(msg, *args, **kwargs):
- """
- Log a message with severity 'WARNING' on the root logger. If the logger has
- no handlers, call basicConfig() to add a console handler with a pre-defined
- format.
- """
- if len(root.handlers) == 0:
- basicConfig()
- root.warning(msg, *args, **kwargs)
-
-warn = warning
-
-def info(msg, *args, **kwargs):
- """
- Log a message with severity 'INFO' on the root logger. If the logger has
- no handlers, call basicConfig() to add a console handler with a pre-defined
- format.
- """
- if len(root.handlers) == 0:
- basicConfig()
- root.info(msg, *args, **kwargs)
-
-def debug(msg, *args, **kwargs):
- """
- Log a message with severity 'DEBUG' on the root logger. If the logger has
- no handlers, call basicConfig() to add a console handler with a pre-defined
- format.
- """
- if len(root.handlers) == 0:
- basicConfig()
- root.debug(msg, *args, **kwargs)
-
-def log(level, msg, *args, **kwargs):
- """
- Log 'msg % args' with the integer severity 'level' on the root logger. If
- the logger has no handlers, call basicConfig() to add a console handler
- with a pre-defined format.
- """
- if len(root.handlers) == 0:
- basicConfig()
- root.log(level, msg, *args, **kwargs)
-
-def disable(level):
- """
- Disable all logging calls of severity 'level' and below.
- """
- root.manager.disable = level
-
-def shutdown(handlerList=_handlerList):
- """
- Perform any cleanup actions in the logging system (e.g. flushing
- buffers).
-
- Should be called at application exit.
- """
- for wr in reversed(handlerList[:]):
- #errors might occur, for example, if files are locked
- #we just ignore them if raiseExceptions is not set
- try:
- h = wr()
- if h:
- try:
- h.acquire()
- h.flush()
- h.close()
- except (IOError, ValueError):
- # Ignore errors which might be caused
- # because handlers have been closed but
- # references to them are still around at
- # application exit.
- pass
- finally:
- h.release()
- except:
- if raiseExceptions:
- raise
- #else, swallow
-
-#Let's try and shutdown automatically on application exit...
-import atexit
-atexit.register(shutdown)
-
-# Null handler
-
-class NullHandler(Handler):
- """
- This handler does nothing. It's intended to be used to avoid the
- "No handlers could be found for logger XXX" one-off warning. This is
- important for library code, which may contain code to log events. If a user
- of the library does not configure logging, the one-off warning might be
- produced; to avoid this, the library developer simply needs to instantiate
- a NullHandler and add it to the top-level logger of the library module or
- package.
- """
- def handle(self, record):
- pass
-
- def emit(self, record):
- pass
-
- def createLock(self):
- self.lock = None
-
-# Warnings integration
-
-any _warnings_showwarning = None
-
-def _showwarning(message, category, filename, lineno, file=None, line=None):
- """
- Implementation of showwarnings which redirects to logging, which will first
- check to see if the file parameter is None. If a file is specified, it will
- delegate to the original warnings implementation of showwarning. Otherwise,
- it will call warnings.formatwarning and will log the resulting string to a
- warnings logger named "py.warnings" with level logging.WARNING.
- """
- if file is not None:
- if _warnings_showwarning is not None:
- _warnings_showwarning(message, category, filename, lineno, file, line)
- else:
- s = warnings.formatwarning(message, category, filename, lineno, line)
- logger = getLogger("py.warnings")
- if not logger.handlers:
- logger.addHandler(NullHandler())
- logger.warning("%s", s)
-
-def captureWarnings(capture):
- """
- If capture is true, redirect all warnings to the logging package.
- If capture is False, ensure that warnings are not redirected to logging
- but to their original destinations.
- """
- global _warnings_showwarning
- if capture:
- if _warnings_showwarning is None:
- _warnings_showwarning = warnings.showwarning
- warnings.showwarning = _showwarning
- else:
- if _warnings_showwarning is not None:
- warnings.showwarning = _warnings_showwarning
- _warnings_showwarning = None
diff --git a/test-data/stdlib-samples/3.2/incomplete/urllib/parse.py b/test-data/stdlib-samples/3.2/incomplete/urllib/parse.py
deleted file mode 100644
index 4fa65c4..0000000
--- a/test-data/stdlib-samples/3.2/incomplete/urllib/parse.py
+++ /dev/null
@@ -1,980 +0,0 @@
-"""Parse (absolute and relative) URLs.
-
-urlparse module is based upon the following RFC specifications.
-
-RFC 3986 (STD66): "Uniform Resource Identifiers" by T. Berners-Lee, R. Fielding
-and L. Masinter, January 2005.
-
-RFC 2732 : "Format for Literal IPv6 Addresses in URLs" by R.Hinden, B.Carpenter
-and L.Masinter, December 1999.
-
-RFC 2396: "Uniform Resource Identifiers (URI)": Generic Syntax by T.
-Berners-Lee, R. Fielding, and L. Masinter, August 1998.
-
-RFC 2368: "The mailto URL scheme", by P.Hoffman , L Masinter, J. Zawinski, July 1998.
-
-RFC 1808: "Relative Uniform Resource Locators", by R. Fielding, UC Irvine, June
-1995.
-
-RFC 1738: "Uniform Resource Locators (URL)" by T. Berners-Lee, L. Masinter, M.
-McCahill, December 1994
-
-RFC 3986 is considered the current standard and any future changes to
-urlparse module should conform with it. The urlparse module is
-currently not entirely compliant with this RFC due to defacto
-scenarios for parsing, and for backward compatibility purposes, some
-parsing quirks from older RFCs are retained. The testcases in
-test_urlparse.py provides a good indicator of parsing behavior.
-"""
-
-import sys
-import collections
-
-__all__ = ["urlparse", "urlunparse", "urljoin", "urldefrag",
- "urlsplit", "urlunsplit", "urlencode", "parse_qs",
- "parse_qsl", "quote", "quote_plus", "quote_from_bytes",
- "unquote", "unquote_plus", "unquote_to_bytes"]
-
-# A classification of schemes ('' means apply by default)
-uses_relative = ['ftp', 'http', 'gopher', 'nntp', 'imap',
- 'wais', 'file', 'https', 'shttp', 'mms',
- 'prospero', 'rtsp', 'rtspu', '', 'sftp',
- 'svn', 'svn+ssh']
-uses_netloc = ['ftp', 'http', 'gopher', 'nntp', 'telnet',
- 'imap', 'wais', 'file', 'mms', 'https', 'shttp',
- 'snews', 'prospero', 'rtsp', 'rtspu', 'rsync', '',
- 'svn', 'svn+ssh', 'sftp', 'nfs', 'git', 'git+ssh']
-non_hierarchical = ['gopher', 'hdl', 'mailto', 'news',
- 'telnet', 'wais', 'imap', 'snews', 'sip', 'sips']
-uses_params = ['ftp', 'hdl', 'prospero', 'http', 'imap',
- 'https', 'shttp', 'rtsp', 'rtspu', 'sip', 'sips',
- 'mms', '', 'sftp']
-uses_query = ['http', 'wais', 'imap', 'https', 'shttp', 'mms',
- 'gopher', 'rtsp', 'rtspu', 'sip', 'sips', '']
-uses_fragment = ['ftp', 'hdl', 'http', 'gopher', 'news',
- 'nntp', 'wais', 'https', 'shttp', 'snews',
- 'file', 'prospero', '']
-
-# Characters valid in scheme names
-scheme_chars = ('abcdefghijklmnopqrstuvwxyz'
- 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
- '0123456789'
- '+-.')
-
-# XXX: Consider replacing with functools.lru_cache
-MAX_CACHE_SIZE = 20
-_parse_cache = {}
-
-def clear_cache():
- """Clear the parse cache and the quoters cache."""
- _parse_cache.clear()
- _safe_quoters.clear()
-
-
-# Helpers for bytes handling
-# For 3.2, we deliberately require applications that
-# handle improperly quoted URLs to do their own
-# decoding and encoding. If valid use cases are
-# presented, we may relax this by using latin-1
-# decoding internally for 3.3
-_implicit_encoding = 'ascii'
-_implicit_errors = 'strict'
-
-def _noop(obj):
- return obj
-
-def _encode_result(obj, encoding=_implicit_encoding,
- errors=_implicit_errors):
- return obj.encode(encoding, errors)
-
-def _decode_args(args, encoding=_implicit_encoding,
- errors=_implicit_errors):
- return tuple(x.decode(encoding, errors) if x else '' for x in args)
-
-def _coerce_args(*args):
- # Invokes decode if necessary to create str args
- # and returns the coerced inputs along with
- # an appropriate result coercion function
- # - noop for str inputs
- # - encoding function otherwise
- str_input = isinstance(args[0], str)
- for arg in args[1:]:
- # We special-case the empty string to support the
- # "scheme=''" default argument to some functions
- if arg and isinstance(arg, str) != str_input:
- raise TypeError("Cannot mix str and non-str arguments")
- if str_input:
- return args + (_noop,)
- return _decode_args(args) + (_encode_result,)
-
-# Result objects are more helpful than simple tuples
-class _ResultMixinStr(object):
- """Standard approach to encoding parsed results from str to bytes"""
- __slots__ = ()
-
- def encode(self, encoding='ascii', errors='strict'):
- return self._encoded_counterpart(*(x.encode(encoding, errors) for x in self))
-
-
-class _ResultMixinBytes(object):
- """Standard approach to decoding parsed results from bytes to str"""
- __slots__ = ()
-
- def decode(self, encoding='ascii', errors='strict'):
- return self._decoded_counterpart(*(x.decode(encoding, errors) for x in self))
-
-
-class _NetlocResultMixinBase(object):
- """Shared methods for the parsed result objects containing a netloc element"""
- __slots__ = ()
-
- @property
- def username(self):
- return self._userinfo[0]
-
- @property
- def password(self):
- return self._userinfo[1]
-
- @property
- def hostname(self):
- hostname = self._hostinfo[0]
- if not hostname:
- hostname = None
- elif hostname is not None:
- hostname = hostname.lower()
- return hostname
-
- @property
- def port(self):
- port = self._hostinfo[1]
- if port is not None:
- port = int(port, 10)
- return port
-
-
-class _NetlocResultMixinStr(_NetlocResultMixinBase, _ResultMixinStr):
- __slots__ = ()
-
- @property
- def _userinfo(self):
- netloc = self.netloc
- userinfo, have_info, hostinfo = netloc.rpartition('@')
- if have_info:
- username, have_password, password = userinfo.partition(':')
- if not have_password:
- password = None
- else:
- username = password = None
- return username, password
-
- @property
- def _hostinfo(self):
- netloc = self.netloc
- _, _, hostinfo = netloc.rpartition('@')
- _, have_open_br, bracketed = hostinfo.partition('[')
- if have_open_br:
- hostname, _, port = bracketed.partition(']')
- _, have_port, port = port.partition(':')
- else:
- hostname, have_port, port = hostinfo.partition(':')
- if not have_port:
- port = None
- return hostname, port
-
-
-class _NetlocResultMixinBytes(_NetlocResultMixinBase, _ResultMixinBytes):
- __slots__ = ()
-
- @property
- def _userinfo(self):
- netloc = self.netloc
- userinfo, have_info, hostinfo = netloc.rpartition(b'@')
- if have_info:
- username, have_password, password = userinfo.partition(b':')
- if not have_password:
- password = None
- else:
- username = password = None
- return username, password
-
- @property
- def _hostinfo(self):
- netloc = self.netloc
- _, _, hostinfo = netloc.rpartition(b'@')
- _, have_open_br, bracketed = hostinfo.partition(b'[')
- if have_open_br:
- hostname, _, port = bracketed.partition(b']')
- _, have_port, port = port.partition(b':')
- else:
- hostname, have_port, port = hostinfo.partition(b':')
- if not have_port:
- port = None
- return hostname, port
-
-
-from collections import namedtuple
-
-_DefragResultBase = namedtuple('DefragResult', 'url fragment')
-_SplitResultBase = namedtuple('SplitResult', 'scheme netloc path query fragment')
-_ParseResultBase = namedtuple('ParseResult', 'scheme netloc path params query fragment')
-
-# For backwards compatibility, alias _NetlocResultMixinStr
-# ResultBase is no longer part of the documented API, but it is
-# retained since deprecating it isn't worth the hassle
-ResultBase = _NetlocResultMixinStr
-
-# Structured result objects for string data
-class DefragResult(_DefragResultBase, _ResultMixinStr):
- __slots__ = ()
- def geturl(self):
- if self.fragment:
- return self.url + '#' + self.fragment
- else:
- return self.url
-
-class SplitResult(_SplitResultBase, _NetlocResultMixinStr):
- __slots__ = ()
- def geturl(self):
- return urlunsplit(self)
-
-class ParseResult(_ParseResultBase, _NetlocResultMixinStr):
- __slots__ = ()
- def geturl(self):
- return urlunparse(self)
-
-# Structured result objects for bytes data
-class DefragResultBytes(_DefragResultBase, _ResultMixinBytes):
- __slots__ = ()
- def geturl(self):
- if self.fragment:
- return self.url + b'#' + self.fragment
- else:
- return self.url
-
-class SplitResultBytes(_SplitResultBase, _NetlocResultMixinBytes):
- __slots__ = ()
- def geturl(self):
- return urlunsplit(self)
-
-class ParseResultBytes(_ParseResultBase, _NetlocResultMixinBytes):
- __slots__ = ()
- def geturl(self):
- return urlunparse(self)
-
-# Set up the encode/decode result pairs
-def _fix_result_transcoding():
- _result_pairs = (
- (DefragResult, DefragResultBytes),
- (SplitResult, SplitResultBytes),
- (ParseResult, ParseResultBytes),
- )
- for _decoded, _encoded in _result_pairs:
- _decoded._encoded_counterpart = _encoded
- _encoded._decoded_counterpart = _decoded
-
-_fix_result_transcoding()
-del _fix_result_transcoding
-
-def urlparse(url, scheme='', allow_fragments=True):
- """Parse a URL into 6 components:
- <scheme>://<netloc>/<path>;<params>?<query>#<fragment>
- Return a 6-tuple: (scheme, netloc, path, params, query, fragment).
- Note that we don't break the components up in smaller bits
- (e.g. netloc is a single string) and we don't expand % escapes."""
- url, scheme, _coerce_result = _coerce_args(url, scheme)
- tuple = urlsplit(url, scheme, allow_fragments)
- scheme, netloc, url, query, fragment = tuple
- if scheme in uses_params and ';' in url:
- url, params = _splitparams(url)
- else:
- params = ''
- result = ParseResult(scheme, netloc, url, params, query, fragment)
- return _coerce_result(result)
-
-def _splitparams(url):
- if '/' in url:
- i = url.find(';', url.rfind('/'))
- if i < 0:
- return url, ''
- else:
- i = url.find(';')
- return url[:i], url[i+1:]
-
-def _splitnetloc(url, start=0):
- delim = len(url) # position of end of domain part of url, default is end
- for c in '/?#': # look for delimiters; the order is NOT important
- wdelim = url.find(c, start) # find first of this delim
- if wdelim >= 0: # if found
- delim = min(delim, wdelim) # use earliest delim position
- return url[start:delim], url[delim:] # return (domain, rest)
-
-def urlsplit(url, scheme='', allow_fragments=True):
- """Parse a URL into 5 components:
- <scheme>://<netloc>/<path>?<query>#<fragment>
- Return a 5-tuple: (scheme, netloc, path, query, fragment).
- Note that we don't break the components up in smaller bits
- (e.g. netloc is a single string) and we don't expand % escapes."""
- url, scheme, _coerce_result = _coerce_args(url, scheme)
- allow_fragments = bool(allow_fragments)
- key = url, scheme, allow_fragments, type(url), type(scheme)
- cached = _parse_cache.get(key, None)
- if cached:
- return _coerce_result(cached)
- if len(_parse_cache) >= MAX_CACHE_SIZE: # avoid runaway growth
- clear_cache()
- netloc = query = fragment = ''
- i = url.find(':')
- if i > 0:
- if url[:i] == 'http': # optimize the common case
- scheme = url[:i].lower()
- url = url[i+1:]
- if url[:2] == '//':
- netloc, url = _splitnetloc(url, 2)
- if (('[' in netloc and ']' not in netloc) or
- (']' in netloc and '[' not in netloc)):
- raise ValueError("Invalid IPv6 URL")
- if allow_fragments and '#' in url:
- url, fragment = url.split('#', 1)
- if '?' in url:
- url, query = url.split('?', 1)
- v = SplitResult(scheme, netloc, url, query, fragment)
- _parse_cache[key] = v
- return _coerce_result(v)
- for c in url[:i]:
- if c not in scheme_chars:
- break
- else:
- try:
- # make sure "url" is not actually a port number (in which case
- # "scheme" is really part of the path
- _testportnum = int(url[i+1:])
- except ValueError:
- scheme, url = url[:i].lower(), url[i+1:]
-
- if url[:2] == '//':
- netloc, url = _splitnetloc(url, 2)
- if (('[' in netloc and ']' not in netloc) or
- (']' in netloc and '[' not in netloc)):
- raise ValueError("Invalid IPv6 URL")
- if allow_fragments and scheme in uses_fragment and '#' in url:
- url, fragment = url.split('#', 1)
- if scheme in uses_query and '?' in url:
- url, query = url.split('?', 1)
- v = SplitResult(scheme, netloc, url, query, fragment)
- _parse_cache[key] = v
- return _coerce_result(v)
-
-def urlunparse(components):
- """Put a parsed URL back together again. This may result in a
- slightly different, but equivalent URL, if the URL that was parsed
- originally had redundant delimiters, e.g. a ? with an empty query
- (the draft states that these are equivalent)."""
- scheme, netloc, url, params, query, fragment, _coerce_result = (
- _coerce_args(*components))
- if params:
- url = "%s;%s" % (url, params)
- return _coerce_result(urlunsplit((scheme, netloc, url, query, fragment)))
-
-def urlunsplit(components):
- """Combine the elements of a tuple as returned by urlsplit() into a
- complete URL as a string. The data argument can be any five-item iterable.
- This may result in a slightly different, but equivalent URL, if the URL that
- was parsed originally had unnecessary delimiters (for example, a ? with an
- empty query; the RFC states that these are equivalent)."""
- scheme, netloc, url, query, fragment, _coerce_result = (
- _coerce_args(*components))
- if netloc or (scheme and scheme in uses_netloc and url[:2] != '//'):
- if url and url[:1] != '/': url = '/' + url
- url = '//' + (netloc or '') + url
- if scheme:
- url = scheme + ':' + url
- if query:
- url = url + '?' + query
- if fragment:
- url = url + '#' + fragment
- return _coerce_result(url)
-
-def urljoin(base, url, allow_fragments=True):
- """Join a base URL and a possibly relative URL to form an absolute
- interpretation of the latter."""
- if not base:
- return url
- if not url:
- return base
- base, url, _coerce_result = _coerce_args(base, url)
- bscheme, bnetloc, bpath, bparams, bquery, bfragment = \
- urlparse(base, '', allow_fragments)
- scheme, netloc, path, params, query, fragment = \
- urlparse(url, bscheme, allow_fragments)
- if scheme != bscheme or scheme not in uses_relative:
- return _coerce_result(url)
- if scheme in uses_netloc:
- if netloc:
- return _coerce_result(urlunparse((scheme, netloc, path,
- params, query, fragment)))
- netloc = bnetloc
- if path[:1] == '/':
- return _coerce_result(urlunparse((scheme, netloc, path,
- params, query, fragment)))
- if not path and not params:
- path = bpath
- params = bparams
- if not query:
- query = bquery
- return _coerce_result(urlunparse((scheme, netloc, path,
- params, query, fragment)))
- segments = bpath.split('/')[:-1] + path.split('/')
- # XXX The stuff below is bogus in various ways...
- if segments[-1] == '.':
- segments[-1] = ''
- while '.' in segments:
- segments.remove('.')
- while 1:
- i = 1
- n = len(segments) - 1
- while i < n:
- if (segments[i] == '..'
- and segments[i-1] not in ('', '..')):
- del segments[i-1:i+1]
- break
- i = i+1
- else:
- break
- if segments == ['', '..']:
- segments[-1] = ''
- elif len(segments) >= 2 and segments[-1] == '..':
- segments[-2:] = ['']
- return _coerce_result(urlunparse((scheme, netloc, '/'.join(segments),
- params, query, fragment)))
-
-def urldefrag(url):
- """Removes any existing fragment from URL.
-
- Returns a tuple of the defragmented URL and the fragment. If
- the URL contained no fragments, the second element is the
- empty string.
- """
- url, _coerce_result = _coerce_args(url)
- if '#' in url:
- s, n, p, a, q, frag = urlparse(url)
- defrag = urlunparse((s, n, p, a, q, ''))
- else:
- frag = ''
- defrag = url
- return _coerce_result(DefragResult(defrag, frag))
-
-def unquote_to_bytes(string):
- """unquote_to_bytes('abc%20def') -> b'abc def'."""
- # Note: strings are encoded as UTF-8. This is only an issue if it contains
- # unescaped non-ASCII characters, which URIs should not.
- if not string:
- # Is it a string-like object?
- string.split
- return b''
- if isinstance(string, str):
- string = string.encode('utf-8')
- res = string.split(b'%')
- if len(res) == 1:
- return string
- string = res[0]
- for item in res[1:]:
- try:
- string += bytes([int(item[:2], 16)]) + item[2:]
- except ValueError:
- string += b'%' + item
- return string
-
-def unquote(string, encoding='utf-8', errors='replace'):
- """Replace %xx escapes by their single-character equivalent. The optional
- encoding and errors parameters specify how to decode percent-encoded
- sequences into Unicode characters, as accepted by the bytes.decode()
- method.
- By default, percent-encoded sequences are decoded with UTF-8, and invalid
- sequences are replaced by a placeholder character.
-
- unquote('abc%20def') -> 'abc def'.
- """
- if string == '':
- return string
- res = string.split('%')
- if len(res) == 1:
- return string
- if encoding is None:
- encoding = 'utf-8'
- if errors is None:
- errors = 'replace'
- # pct_sequence: contiguous sequence of percent-encoded bytes, decoded
- pct_sequence = b''
- string = res[0]
- for item in res[1:]:
- try:
- if not item:
- raise ValueError
- pct_sequence += bytes.fromhex(item[:2])
- rest = item[2:]
- if not rest:
- # This segment was just a single percent-encoded character.
- # May be part of a sequence of code units, so delay decoding.
- # (Stored in pct_sequence).
- continue
- except ValueError:
- rest = '%' + item
- # Encountered non-percent-encoded characters. Flush the current
- # pct_sequence.
- string += pct_sequence.decode(encoding, errors) + rest
- pct_sequence = b''
- if pct_sequence:
- # Flush the final pct_sequence
- string += pct_sequence.decode(encoding, errors)
- return string
-
-def parse_qs(qs, keep_blank_values=False, strict_parsing=False,
- encoding='utf-8', errors='replace'):
- """Parse a query given as a string argument.
-
- Arguments:
-
- qs: percent-encoded query string to be parsed
-
- keep_blank_values: flag indicating whether blank values in
- percent-encoded queries should be treated as blank strings.
- A true value indicates that blanks should be retained as
- blank strings. The default false value indicates that
- blank values are to be ignored and treated as if they were
- not included.
-
- strict_parsing: flag indicating what to do with parsing errors.
- If false (the default), errors are silently ignored.
- If true, errors raise a ValueError exception.
-
- encoding and errors: specify how to decode percent-encoded sequences
- into Unicode characters, as accepted by the bytes.decode() method.
- """
- dict = {}
- pairs = parse_qsl(qs, keep_blank_values, strict_parsing,
- encoding=encoding, errors=errors)
- for name, value in pairs:
- if name in dict:
- dict[name].append(value)
- else:
- dict[name] = [value]
- return dict
-
-def parse_qsl(qs, keep_blank_values=False, strict_parsing=False,
- encoding='utf-8', errors='replace'):
- """Parse a query given as a string argument.
-
- Arguments:
-
- qs: percent-encoded query string to be parsed
-
- keep_blank_values: flag indicating whether blank values in
- percent-encoded queries should be treated as blank strings. A
- true value indicates that blanks should be retained as blank
- strings. The default false value indicates that blank values
- are to be ignored and treated as if they were not included.
-
- strict_parsing: flag indicating what to do with parsing errors. If
- false (the default), errors are silently ignored. If true,
- errors raise a ValueError exception.
-
- encoding and errors: specify how to decode percent-encoded sequences
- into Unicode characters, as accepted by the bytes.decode() method.
-
- Returns a list, as G-d intended.
- """
- qs, _coerce_result = _coerce_args(qs)
- pairs = []
- for s1 in qs.split('&'):
- for s2 in s1.split(';'):
- pairs.append(s2)
- r = []
- for name_value in pairs:
- if not name_value and not strict_parsing:
- continue
- nv = name_value.split('=', 1)
- if len(nv) != 2:
- if strict_parsing:
- raise ValueError("bad query field: %r" % (name_value,))
- # Handle case of a control-name with no equal sign
- if keep_blank_values:
- nv.append('')
- else:
- continue
- if len(nv[1]) or keep_blank_values:
- name = nv[0].replace('+', ' ')
- name = unquote(name, encoding=encoding, errors=errors)
- name = _coerce_result(name)
- value = nv[1].replace('+', ' ')
- value = unquote(value, encoding=encoding, errors=errors)
- value = _coerce_result(value)
- r.append((name, value))
- return r
-
-def unquote_plus(string, encoding='utf-8', errors='replace'):
- """Like unquote(), but also replace plus signs by spaces, as required for
- unquoting HTML form values.
-
- unquote_plus('%7e/abc+def') -> '~/abc def'
- """
- string = string.replace('+', ' ')
- return unquote(string, encoding, errors)
-
-_ALWAYS_SAFE = frozenset(b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
- b'abcdefghijklmnopqrstuvwxyz'
- b'0123456789'
- b'_.-')
-_ALWAYS_SAFE_BYTES = bytes(_ALWAYS_SAFE)
-_safe_quoters = {}
-
-class Quoter(collections.defaultdict):
- """A mapping from bytes (in range(0,256)) to strings.
-
- String values are percent-encoded byte values, unless the key < 128, and
- in the "safe" set (either the specified safe set, or default set).
- """
- # Keeps a cache internally, using defaultdict, for efficiency (lookups
- # of cached keys don't call Python code at all).
- def __init__(self, safe):
- """safe: bytes object."""
- self.safe = _ALWAYS_SAFE.union(safe)
-
- def __repr__(self):
- # Without this, will just display as a defaultdict
- return "<Quoter %r>" % dict(self)
-
- def __missing__(self, b):
- # Handle a cache miss. Store quoted string in cache and return.
- res = chr(b) if b in self.safe else '%{:02X}'.format(b)
- self[b] = res
- return res
-
-def quote(string, safe='/', encoding=None, errors=None):
- """quote('abc def') -> 'abc%20def'
-
- Each part of a URL, e.g. the path info, the query, etc., has a
- different set of reserved characters that must be quoted.
-
- RFC 2396 Uniform Resource Identifiers (URI): Generic Syntax lists
- the following reserved characters.
-
- reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" |
- "$" | ","
-
- Each of these characters is reserved in some component of a URL,
- but not necessarily in all of them.
-
- By default, the quote function is intended for quoting the path
- section of a URL. Thus, it will not encode '/'. This character
- is reserved, but in typical usage the quote function is being
- called on a path where the existing slash characters are used as
- reserved characters.
-
- string and safe may be either str or bytes objects. encoding must
- not be specified if string is a str.
-
- The optional encoding and errors parameters specify how to deal with
- non-ASCII characters, as accepted by the str.encode method.
- By default, encoding='utf-8' (characters are encoded with UTF-8), and
- errors='strict' (unsupported characters raise a UnicodeEncodeError).
- """
- if isinstance(string, str):
- if not string:
- return string
- if encoding is None:
- encoding = 'utf-8'
- if errors is None:
- errors = 'strict'
- string = string.encode(encoding, errors)
- else:
- if encoding is not None:
- raise TypeError("quote() doesn't support 'encoding' for bytes")
- if errors is not None:
- raise TypeError("quote() doesn't support 'errors' for bytes")
- return quote_from_bytes(string, safe)
-
-def quote_plus(string, safe='', encoding=None, errors=None):
- """Like quote(), but also replace ' ' with '+', as required for quoting
- HTML form values. Plus signs in the original string are escaped unless
- they are included in safe. It also does not have safe default to '/'.
- """
- # Check if ' ' in string, where string may either be a str or bytes. If
- # there are no spaces, the regular quote will produce the right answer.
- if ((isinstance(string, str) and ' ' not in string) or
- (isinstance(string, bytes) and b' ' not in string)):
- return quote(string, safe, encoding, errors)
- if isinstance(safe, str):
- space = ' '
- else:
- space = b' '
- string = quote(string, safe + space, encoding, errors)
- return string.replace(' ', '+')
-
-def quote_from_bytes(bs, safe='/'):
- """Like quote(), but accepts a bytes object rather than a str, and does
- not perform string-to-bytes encoding. It always returns an ASCII string.
- quote_from_bytes(b'abc def\xab') -> 'abc%20def%AB'
- """
- if not isinstance(bs, (bytes, bytearray)):
- raise TypeError("quote_from_bytes() expected bytes")
- if not bs:
- return ''
- if isinstance(safe, str):
- # Normalize 'safe' by converting to bytes and removing non-ASCII chars
- safe = safe.encode('ascii', 'ignore')
- else:
- safe = bytes([c for c in safe if c < 128])
- if not bs.rstrip(_ALWAYS_SAFE_BYTES + safe):
- return bs.decode()
- try:
- quoter = _safe_quoters[safe]
- except KeyError:
- _safe_quoters[safe] = quoter = Quoter(safe).__getitem__
- return ''.join([quoter(char) for char in bs])
-
-def urlencode(query, doseq=False, safe='', encoding=None, errors=None):
- """Encode a sequence of two-element tuples or dictionary into a URL query string.
-
- If any values in the query arg are sequences and doseq is true, each
- sequence element is converted to a separate parameter.
-
- If the query arg is a sequence of two-element tuples, the order of the
- parameters in the output will match the order of parameters in the
- input.
-
- The query arg may be either a string or a bytes type. When query arg is a
- string, the safe, encoding and error parameters are sent the quote_plus for
- encoding.
- """
-
- if hasattr(query, "items"):
- query = query.items()
- else:
- # It's a bother at times that strings and string-like objects are
- # sequences.
- try:
- # non-sequence items should not work with len()
- # non-empty strings will fail this
- if len(query) and not isinstance(query[0], tuple):
- raise TypeError
- # Zero-length sequences of all types will get here and succeed,
- # but that's a minor nit. Since the original implementation
- # allowed empty dicts that type of behavior probably should be
- # preserved for consistency
- except TypeError:
- ty, va, tb = sys.exc_info()
- raise TypeError("not a valid non-string sequence "
- "or mapping object").with_traceback(tb)
-
- l = []
- if not doseq:
- for k, v in query:
- if isinstance(k, bytes):
- k = quote_plus(k, safe)
- else:
- k = quote_plus(str(k), safe, encoding, errors)
-
- if isinstance(v, bytes):
- v = quote_plus(v, safe)
- else:
- v = quote_plus(str(v), safe, encoding, errors)
- l.append(k + '=' + v)
- else:
- for k, v in query:
- if isinstance(k, bytes):
- k = quote_plus(k, safe)
- else:
- k = quote_plus(str(k), safe, encoding, errors)
-
- if isinstance(v, bytes):
- v = quote_plus(v, safe)
- l.append(k + '=' + v)
- elif isinstance(v, str):
- v = quote_plus(v, safe, encoding, errors)
- l.append(k + '=' + v)
- else:
- try:
- # Is this a sufficient test for sequence-ness?
- x = len(v)
- except TypeError:
- # not a sequence
- v = quote_plus(str(v), safe, encoding, errors)
- l.append(k + '=' + v)
- else:
- # loop over the sequence
- for elt in v:
- if isinstance(elt, bytes):
- elt = quote_plus(elt, safe)
- else:
- elt = quote_plus(str(elt), safe, encoding, errors)
- l.append(k + '=' + elt)
- return '&'.join(l)
-
-# Utilities to parse URLs (most of these return None for missing parts):
-# unwrap('<URL:type://host/path>') --> 'type://host/path'
-# splittype('type:opaquestring') --> 'type', 'opaquestring'
-# splithost('//host[:port]/path') --> 'host[:port]', '/path'
-# splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'
-# splitpasswd('user:passwd') -> 'user', 'passwd'
-# splitport('host:port') --> 'host', 'port'
-# splitquery('/path?query') --> '/path', 'query'
-# splittag('/path#tag') --> '/path', 'tag'
-# splitattr('/path;attr1=value1;attr2=value2;...') ->
-# '/path', ['attr1=value1', 'attr2=value2', ...]
-# splitvalue('attr=value') --> 'attr', 'value'
-# urllib.parse.unquote('abc%20def') -> 'abc def'
-# quote('abc def') -> 'abc%20def')
-
-def to_bytes(url):
- """to_bytes(u"URL") --> 'URL'."""
- # Most URL schemes require ASCII. If that changes, the conversion
- # can be relaxed.
- # XXX get rid of to_bytes()
- if isinstance(url, str):
- try:
- url = url.encode("ASCII").decode()
- except UnicodeError:
- raise UnicodeError("URL " + repr(url) +
- " contains non-ASCII characters")
- return url
-
-def unwrap(url):
- """unwrap('<URL:type://host/path>') --> 'type://host/path'."""
- url = str(url).strip()
- if url[:1] == '<' and url[-1:] == '>':
- url = url[1:-1].strip()
- if url[:4] == 'URL:': url = url[4:].strip()
- return url
-
-_typeprog = None
-def splittype(url):
- """splittype('type:opaquestring') --> 'type', 'opaquestring'."""
- global _typeprog
- if _typeprog is None:
- import re
- _typeprog = re.compile('^([^/:]+):')
-
- match = _typeprog.match(url)
- if match:
- scheme = match.group(1)
- return scheme.lower(), url[len(scheme) + 1:]
- return None, url
-
-_hostprog = None
-def splithost(url):
- """splithost('//host[:port]/path') --> 'host[:port]', '/path'."""
- global _hostprog
- if _hostprog is None:
- import re
- _hostprog = re.compile('^//([^/?]*)(.*)$')
-
- match = _hostprog.match(url)
- if match:
- host_port = match.group(1)
- path = match.group(2)
- if path and not path.startswith('/'):
- path = '/' + path
- return host_port, path
- return None, url
-
-_userprog = None
-def splituser(host):
- """splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'."""
- global _userprog
- if _userprog is None:
- import re
- _userprog = re.compile('^(.*)@(.*)$')
-
- match = _userprog.match(host)
- if match: return match.group(1, 2)
- return None, host
-
-_passwdprog = None
-def splitpasswd(user):
- """splitpasswd('user:passwd') -> 'user', 'passwd'."""
- global _passwdprog
- if _passwdprog is None:
- import re
- _passwdprog = re.compile('^([^:]*):(.*)$',re.S)
-
- match = _passwdprog.match(user)
- if match: return match.group(1, 2)
- return user, None
-
-# splittag('/path#tag') --> '/path', 'tag'
-_portprog = None
-def splitport(host):
- """splitport('host:port') --> 'host', 'port'."""
- global _portprog
- if _portprog is None:
- import re
- _portprog = re.compile('^(.*):([0-9]+)$')
-
- match = _portprog.match(host)
- if match: return match.group(1, 2)
- return host, None
-
-_nportprog = None
-def splitnport(host, defport=-1):
- """Split host and port, returning numeric port.
- Return given default port if no ':' found; defaults to -1.
- Return numerical port if a valid number are found after ':'.
- Return None if ':' but not a valid number."""
- global _nportprog
- if _nportprog is None:
- import re
- _nportprog = re.compile('^(.*):(.*)$')
-
- match = _nportprog.match(host)
- if match:
- host, port = match.group(1, 2)
- try:
- if not port: raise ValueError("no digits")
- nport = int(port)
- except ValueError:
- nport = None
- return host, nport
- return host, defport
-
-_queryprog = None
-def splitquery(url):
- """splitquery('/path?query') --> '/path', 'query'."""
- global _queryprog
- if _queryprog is None:
- import re
- _queryprog = re.compile('^(.*)\?([^?]*)$')
-
- match = _queryprog.match(url)
- if match: return match.group(1, 2)
- return url, None
-
-_tagprog = None
-def splittag(url):
- """splittag('/path#tag') --> '/path', 'tag'."""
- global _tagprog
- if _tagprog is None:
- import re
- _tagprog = re.compile('^(.*)#([^#]*)$')
-
- match = _tagprog.match(url)
- if match: return match.group(1, 2)
- return url, None
-
-def splitattr(url):
- """splitattr('/path;attr1=value1;attr2=value2;...') ->
- '/path', ['attr1=value1', 'attr2=value2', ...]."""
- words = url.split(';')
- return words[0], words[1:]
-
-_valueprog = None
-def splitvalue(attr):
- """splitvalue('attr=value') --> 'attr', 'value'."""
- global _valueprog
- if _valueprog is None:
- import re
- _valueprog = re.compile('^([^=]*)=(.*)$')
-
- match = _valueprog.match(attr)
- if match: return match.group(1, 2)
- return attr, None
diff --git a/test-data/stdlib-samples/3.2/posixpath.py b/test-data/stdlib-samples/3.2/posixpath.py
deleted file mode 100644
index cf5d59e..0000000
--- a/test-data/stdlib-samples/3.2/posixpath.py
+++ /dev/null
@@ -1,466 +0,0 @@
-"""Common operations on Posix pathnames.
-
-Instead of importing this module directly, import os and refer to
-this module as os.path. The "os.path" name is an alias for this
-module on Posix systems; on other systems (e.g. Mac, Windows),
-os.path provides the same operations in a manner specific to that
-platform, and is an alias to another module (e.g. macpath, ntpath).
-
-Some of this can actually be useful on non-Posix systems too, e.g.
-for manipulation of the pathname component of URLs.
-"""
-
-import os
-import sys
-import stat
-import genericpath
-from genericpath import *
-
-from typing import (
- Tuple, BinaryIO, TextIO, Pattern, AnyStr, List, Set, Any, Union, cast
-)
-
-__all__ = ["normcase","isabs","join","splitdrive","split","splitext",
- "basename","dirname","commonprefix","getsize","getmtime",
- "getatime","getctime","islink","exists","lexists","isdir","isfile",
- "ismount", "expanduser","expandvars","normpath","abspath",
- "samefile","sameopenfile","samestat",
- "curdir","pardir","sep","pathsep","defpath","altsep","extsep",
- "devnull","realpath","supports_unicode_filenames","relpath"]
-
-# Strings representing various path-related bits and pieces.
-# These are primarily for export; internally, they are hardcoded.
-curdir = '.'
-pardir = '..'
-extsep = '.'
-sep = '/'
-pathsep = ':'
-defpath = ':/bin:/usr/bin'
-altsep = None # type: str
-devnull = '/dev/null'
-
-def _get_sep(path: AnyStr) -> AnyStr:
- if isinstance(path, bytes):
- return b'/'
- else:
- return '/'
-
-# Normalize the case of a pathname. Trivial in Posix, string.lower on Mac.
-# On MS-DOS this may also turn slashes into backslashes; however, other
-# normalizations (such as optimizing '../' away) are not allowed
-# (another function should be defined to do that).
-
-def normcase(s: AnyStr) -> AnyStr:
- """Normalize case of pathname. Has no effect under Posix"""
- # TODO: on Mac OS X, this should really return s.lower().
- if not isinstance(s, (bytes, str)):
- raise TypeError("normcase() argument must be str or bytes, "
- "not '{}'".format(s.__class__.__name__))
- return cast(AnyStr, s)
-
-
-# Return whether a path is absolute.
-# Trivial in Posix, harder on the Mac or MS-DOS.
-
-def isabs(s: AnyStr) -> bool:
- """Test whether a path is absolute"""
- sep = _get_sep(s)
- return s.startswith(sep)
-
-
-# Join pathnames.
-# Ignore the previous parts if a part is absolute.
-# Insert a '/' unless the first part is empty or already ends in '/'.
-
-def join(a: AnyStr, *p: AnyStr) -> AnyStr:
- """Join two or more pathname components, inserting '/' as needed.
- If any component is an absolute path, all previous path components
- will be discarded."""
- sep = _get_sep(a)
- path = a
- for b in p:
- if b.startswith(sep):
- path = b
- elif not path or path.endswith(sep):
- path += b
- else:
- path += sep + b
- return path
-
-
-# Split a path in head (everything up to the last '/') and tail (the
-# rest). If the path ends in '/', tail will be empty. If there is no
-# '/' in the path, head will be empty.
-# Trailing '/'es are stripped from head unless it is the root.
-
-def split(p: AnyStr) -> Tuple[AnyStr, AnyStr]:
- """Split a pathname. Returns tuple "(head, tail)" where "tail" is
- everything after the final slash. Either part may be empty."""
- sep = _get_sep(p)
- i = p.rfind(sep) + 1
- head, tail = p[:i], p[i:]
- if head and head != sep*len(head):
- head = head.rstrip(sep)
- return head, tail
-
-
-# Split a path in root and extension.
-# The extension is everything starting at the last dot in the last
-# pathname component; the root is everything before that.
-# It is always true that root + ext == p.
-
-def splitext(p: AnyStr) -> Tuple[AnyStr, AnyStr]:
- if isinstance(p, bytes):
- sep = b'/'
- extsep = b'.'
- else:
- sep = '/'
- extsep = '.'
- return genericpath._splitext(p, sep, None, extsep)
-splitext.__doc__ = genericpath._splitext.__doc__
-
-# Split a pathname into a drive specification and the rest of the
-# path. Useful on DOS/Windows/NT; on Unix, the drive is always empty.
-
-def splitdrive(p: AnyStr) -> Tuple[AnyStr, AnyStr]:
- """Split a pathname into drive and path. On Posix, drive is always
- empty."""
- return p[:0], p
-
-
-# Return the tail (basename) part of a path, same as split(path)[1].
-
-def basename(p: AnyStr) -> AnyStr:
- """Returns the final component of a pathname"""
- sep = _get_sep(p)
- i = p.rfind(sep) + 1
- return p[i:]
-
-
-# Return the head (dirname) part of a path, same as split(path)[0].
-
-def dirname(p: AnyStr) -> AnyStr:
- """Returns the directory component of a pathname"""
- sep = _get_sep(p)
- i = p.rfind(sep) + 1
- head = p[:i]
- if head and head != sep*len(head):
- head = head.rstrip(sep)
- return head
-
-
-# Is a path a symbolic link?
-# This will always return false on systems where os.lstat doesn't exist.
-
-def islink(path: AnyStr) -> bool:
- """Test whether a path is a symbolic link"""
- try:
- st = os.lstat(path)
- except (os.error, AttributeError):
- return False
- return stat.S_ISLNK(st.st_mode)
-
-# Being true for dangling symbolic links is also useful.
-
-def lexists(path: AnyStr) -> bool:
- """Test whether a path exists. Returns True for broken symbolic links"""
- try:
- os.lstat(path)
- except os.error:
- return False
- return True
-
-
-# Are two filenames really pointing to the same file?
-
-def samefile(f1: AnyStr, f2: AnyStr) -> bool:
- """Test whether two pathnames reference the same actual file"""
- s1 = os.stat(f1)
- s2 = os.stat(f2)
- return samestat(s1, s2)
-
-
-# Are two open files really referencing the same file?
-# (Not necessarily the same file descriptor!)
-
-def sameopenfile(fp1: int, fp2: int) -> bool:
- """Test whether two open file objects reference the same file"""
- s1 = os.fstat(fp1)
- s2 = os.fstat(fp2)
- return samestat(s1, s2)
-
-
-# Are two stat buffers (obtained from stat, fstat or lstat)
-# describing the same file?
-
-def samestat(s1: os.stat_result, s2: os.stat_result) -> bool:
- """Test whether two stat buffers reference the same file"""
- return s1.st_ino == s2.st_ino and \
- s1.st_dev == s2.st_dev
-
-
-# Is a path a mount point?
-# (Does this work for all UNIXes? Is it even guaranteed to work by Posix?)
-
-def ismount(path: AnyStr) -> bool:
- """Test whether a path is a mount point"""
- if islink(path):
- # A symlink can never be a mount point
- return False
- try:
- s1 = os.lstat(path)
- if isinstance(path, bytes):
- parent = join(path, b'..')
- else:
- parent = join(path, '..')
- s2 = os.lstat(parent)
- except os.error:
- return False # It doesn't exist -- so not a mount point :-)
- dev1 = s1.st_dev
- dev2 = s2.st_dev
- if dev1 != dev2:
- return True # path/.. on a different device as path
- ino1 = s1.st_ino
- ino2 = s2.st_ino
- if ino1 == ino2:
- return True # path/.. is the same i-node as path
- return False
-
-
-# Expand paths beginning with '~' or '~user'.
-# '~' means $HOME; '~user' means that user's home directory.
-# If the path doesn't begin with '~', or if the user or $HOME is unknown,
-# the path is returned unchanged (leaving error reporting to whatever
-# function is called with the expanded path as argument).
-# See also module 'glob' for expansion of *, ? and [...] in pathnames.
-# (A function should also be defined to do full *sh-style environment
-# variable expansion.)
-
-def expanduser(path: AnyStr) -> AnyStr:
- """Expand ~ and ~user constructions. If user or $HOME is unknown,
- do nothing."""
- if isinstance(path, bytes):
- tilde = b'~'
- else:
- tilde = '~'
- if not path.startswith(tilde):
- return path
- sep = _get_sep(path)
- i = path.find(sep, 1)
- if i < 0:
- i = len(path)
- if i == 1:
- userhome = None # type: Union[str, bytes]
- if 'HOME' not in os.environ:
- import pwd
- userhome = pwd.getpwuid(os.getuid()).pw_dir
- else:
- userhome = os.environ['HOME']
- else:
- import pwd
- name = path[1:i] # type: Union[str, bytes]
- if isinstance(name, bytes):
- name = str(name, 'ASCII')
- try:
- pwent = pwd.getpwnam(name)
- except KeyError:
- return path
- userhome = pwent.pw_dir
- if isinstance(path, bytes):
- userhome = os.fsencode(userhome)
- root = b'/'
- else:
- root = '/'
- userhome = userhome.rstrip(root)
- return (userhome + path[i:]) or root
-
-
-# Expand paths containing shell variable substitutions.
-# This expands the forms $variable and ${variable} only.
-# Non-existent variables are left unchanged.
-
-_varprog = None # type: Pattern[str]
-_varprogb = None # type: Pattern[bytes]
-
-def expandvars(path: AnyStr) -> AnyStr:
- """Expand shell variables of form $var and ${var}. Unknown variables
- are left unchanged."""
- global _varprog, _varprogb
- if isinstance(path, bytes):
- if b'$' not in path:
- return path
- if not _varprogb:
- import re
- _varprogb = re.compile(br'\$(\w+|\{[^}]*\})', re.ASCII)
- search = _varprogb.search
- start = b'{'
- end = b'}'
- else:
- if '$' not in path:
- return path
- if not _varprog:
- import re
- _varprog = re.compile(r'\$(\w+|\{[^}]*\})', re.ASCII)
- search = _varprog.search
- start = '{'
- end = '}'
- i = 0
- while True:
- m = search(path, i)
- if not m:
- break
- i, j = m.span(0)
- name = None # type: Union[str, bytes]
- name = m.group(1)
- if name.startswith(start) and name.endswith(end):
- name = name[1:-1]
- if isinstance(name, bytes):
- name = str(name, 'ASCII')
- if name in os.environ:
- tail = path[j:]
- value = None # type: Union[str, bytes]
- value = os.environ[name]
- if isinstance(path, bytes):
- value = value.encode('ASCII')
- path = path[:i] + value
- i = len(path)
- path += tail
- else:
- i = j
- return path
-
-
-# Normalize a path, e.g. A//B, A/./B and A/foo/../B all become A/B.
-# It should be understood that this may change the meaning of the path
-# if it contains symbolic links!
-
-def normpath(path: AnyStr) -> AnyStr:
- """Normalize path, eliminating double slashes, etc."""
- if isinstance(path, bytes):
- sep = b'/'
- empty = b''
- dot = b'.'
- dotdot = b'..'
- else:
- sep = '/'
- empty = ''
- dot = '.'
- dotdot = '..'
- if path == empty:
- return dot
- initial_slashes = path.startswith(sep) # type: int
- # POSIX allows one or two initial slashes, but treats three or more
- # as single slash.
- if (initial_slashes and
- path.startswith(sep*2) and not path.startswith(sep*3)):
- initial_slashes = 2
- comps = path.split(sep)
- new_comps = [] # type: List[AnyStr]
- for comp in comps:
- if comp in (empty, dot):
- continue
- if (comp != dotdot or (not initial_slashes and not new_comps) or
- (new_comps and new_comps[-1] == dotdot)):
- new_comps.append(comp)
- elif new_comps:
- new_comps.pop()
- comps = new_comps
- path = sep.join(comps)
- if initial_slashes:
- path = sep*initial_slashes + path
- return path or dot
-
-
-def abspath(path: AnyStr) -> AnyStr:
- """Return an absolute path."""
- if not isabs(path):
- if isinstance(path, bytes):
- cwd = os.getcwdb()
- else:
- cwd = os.getcwd()
- path = join(cwd, path)
- return normpath(path)
-
-
-# Return a canonical path (i.e. the absolute location of a file on the
-# filesystem).
-
-def realpath(filename: AnyStr) -> AnyStr:
- """Return the canonical path of the specified filename, eliminating any
-symbolic links encountered in the path."""
- if isinstance(filename, bytes):
- sep = b'/'
- empty = b''
- else:
- sep = '/'
- empty = ''
- if isabs(filename):
- bits = [sep] + filename.split(sep)[1:]
- else:
- bits = [empty] + filename.split(sep)
-
- for i in range(2, len(bits)+1):
- component = join(*bits[0:i])
- # Resolve symbolic links.
- if islink(component):
- resolved = _resolve_link(component)
- if resolved is None:
- # Infinite loop -- return original component + rest of the path
- return abspath(join(*([component] + bits[i:])))
- else:
- newpath = join(*([resolved] + bits[i:]))
- return realpath(newpath)
-
- return abspath(filename)
-
-
-def _resolve_link(path: AnyStr) -> AnyStr:
- """Internal helper function. Takes a path and follows symlinks
- until we either arrive at something that isn't a symlink, or
- encounter a path we've seen before (meaning that there's a loop).
- """
- paths_seen = set() # type: Set[AnyStr]
- while islink(path):
- if path in paths_seen:
- # Already seen this path, so we must have a symlink loop
- return None
- paths_seen.add(path)
- # Resolve where the link points to
- resolved = os.readlink(path)
- if not isabs(resolved):
- dir = dirname(path)
- path = normpath(join(dir, resolved))
- else:
- path = normpath(resolved)
- return path
-
-supports_unicode_filenames = (sys.platform == 'darwin')
-
-def relpath(path: AnyStr, start: AnyStr = None) -> AnyStr:
- """Return a relative version of a path"""
-
- if not path:
- raise ValueError("no path specified")
-
- if isinstance(path, bytes):
- curdir = b'.'
- sep = b'/'
- pardir = b'..'
- else:
- curdir = '.'
- sep = '/'
- pardir = '..'
-
- if start is None:
- start = curdir
-
- start_list = [x for x in abspath(start).split(sep) if x]
- path_list = [x for x in abspath(path).split(sep) if x]
-
- # Work out how much of the filepath is shared by start and path.
- i = len(commonprefix([start_list, path_list]))
-
- rel_list = [pardir] * (len(start_list)-i) + path_list[i:]
- if not rel_list:
- return curdir
- return join(*rel_list)
diff --git a/test-data/stdlib-samples/3.2/pprint.py b/test-data/stdlib-samples/3.2/pprint.py
deleted file mode 100644
index 650c1a3..0000000
--- a/test-data/stdlib-samples/3.2/pprint.py
+++ /dev/null
@@ -1,380 +0,0 @@
-# Author: Fred L. Drake, Jr.
-# fdrake at acm.org
-#
-# This is a simple little module I wrote to make life easier. I didn't
-# see anything quite like it in the library, though I may have overlooked
-# something. I wrote this when I was trying to read some heavily nested
-# tuples with fairly non-descriptive content. This is modeled very much
-# after Lisp/Scheme - style pretty-printing of lists. If you find it
-# useful, thank small children who sleep at night.
-
-"""Support to pretty-print lists, tuples, & dictionaries recursively.
-
-Very simple, but useful, especially in debugging data structures.
-
-Classes
--------
-
-PrettyPrinter()
- Handle pretty-printing operations onto a stream using a configured
- set of formatting parameters.
-
-Functions
----------
-
-pformat()
- Format a Python object into a pretty-printed representation.
-
-pprint()
- Pretty-print a Python object to a stream [default is sys.stdout].
-
-saferepr()
- Generate a 'standard' repr()-like value, but protect against recursive
- data structures.
-
-"""
-
-import sys as _sys
-from collections import OrderedDict as _OrderedDict
-from io import StringIO as _StringIO
-
-from typing import Any, Tuple, Dict, TextIO, cast, List
-
-__all__ = ["pprint","pformat","isreadable","isrecursive","saferepr",
- "PrettyPrinter"]
-
-# cache these for faster access:
-_commajoin = ", ".join
-_id = id
-_len = len
-_type = type
-
-
-def pprint(object: object, stream: TextIO = None, indent: int = 1,
- width: int = 80, depth: int = None) -> None:
- """Pretty-print a Python object to a stream [default is sys.stdout]."""
- printer = PrettyPrinter(
- stream=stream, indent=indent, width=width, depth=depth)
- printer.pprint(object)
-
-def pformat(object: object, indent: int = 1, width: int = 80,
- depth: int = None) -> str:
- """Format a Python object into a pretty-printed representation."""
- return PrettyPrinter(indent=indent, width=width, depth=depth).pformat(object)
-
-def saferepr(object: object) -> str:
- """Version of repr() which can handle recursive data structures."""
- return _safe_repr(object, {}, None, 0)[0]
-
-def isreadable(object: object) -> bool:
- """Determine if saferepr(object) is readable by eval()."""
- return _safe_repr(object, {}, None, 0)[1]
-
-def isrecursive(object: object) -> bool:
- """Determine if object requires a recursive representation."""
- return _safe_repr(object, {}, None, 0)[2]
-
-class _safe_key:
- """Helper function for key functions when sorting unorderable objects.
-
- The wrapped-object will fallback to an Py2.x style comparison for
- unorderable types (sorting first comparing the type name and then by
- the obj ids). Does not work recursively, so dict.items() must have
- _safe_key applied to both the key and the value.
-
- """
-
- __slots__ = ['obj']
-
- def __init__(self, obj: Any) -> None:
- self.obj = obj
-
- def __lt__(self, other: Any) -> Any:
- rv = self.obj.__lt__(other.obj) # type: Any
- if rv is NotImplemented:
- rv = (str(type(self.obj)), id(self.obj)) < \
- (str(type(other.obj)), id(other.obj))
- return rv
-
-def _safe_tuple(t: Tuple[Any, Any]) -> Tuple[_safe_key, _safe_key]:
- "Helper function for comparing 2-tuples"
- return _safe_key(t[0]), _safe_key(t[1])
-
-class PrettyPrinter:
- def __init__(self, indent: int = 1, width: int = 80, depth: int = None,
- stream: TextIO = None) -> None:
- """Handle pretty printing operations onto a stream using a set of
- configured parameters.
-
- indent
- Number of spaces to indent for each level of nesting.
-
- width
- Attempted maximum number of columns in the output.
-
- depth
- The maximum depth to print out nested structures.
-
- stream
- The desired output stream. If omitted (or false), the standard
- output stream available at construction will be used.
-
- """
- indent = int(indent)
- width = int(width)
- assert indent >= 0, "indent must be >= 0"
- assert depth is None or depth > 0, "depth must be > 0"
- assert width, "width must be != 0"
- self._depth = depth
- self._indent_per_level = indent
- self._width = width
- if stream is not None:
- self._stream = stream
- else:
- self._stream = _sys.stdout
-
- def pprint(self, object: object) -> None:
- self._format(object, self._stream, 0, 0, {}, 0)
- self._stream.write("\n")
-
- def pformat(self, object: object) -> str:
- sio = _StringIO()
- self._format(object, sio, 0, 0, {}, 0)
- return sio.getvalue()
-
- def isrecursive(self, object: object) -> int:
- return self.format(object, {}, 0, 0)[2]
-
- def isreadable(self, object: object) -> int:
- s, readable, recursive = self.format(object, {}, 0, 0)
- return readable and not recursive
-
- def _format(self, object: object, stream: TextIO, indent: int,
- allowance: int, context: Dict[int, int], level: int) -> None:
- level = level + 1
- objid = _id(object)
- if objid in context:
- stream.write(_recursion(object))
- self._recursive = True
- self._readable = False
- return
- rep = self._repr(object, context, level - 1)
- typ = _type(object)
- sepLines = _len(rep) > (self._width - 1 - indent - allowance)
- write = stream.write
-
- if self._depth and level > self._depth:
- write(rep)
- return
-
- if sepLines:
- r = getattr(typ, "__repr__", None)
- if isinstance(object, dict):
- write('{')
- if self._indent_per_level > 1:
- write((self._indent_per_level - 1) * ' ')
- length = _len(object)
- if length:
- context[objid] = 1
- indent = indent + self._indent_per_level
- if issubclass(typ, _OrderedDict):
- items = list(object.items())
- else:
- items = sorted(object.items(), key=_safe_tuple)
- key, ent = items[0]
- rep = self._repr(key, context, level)
- write(rep)
- write(': ')
- self._format(ent, stream, indent + _len(rep) + 2,
- allowance + 1, context, level)
- if length > 1:
- for key, ent in items[1:]:
- rep = self._repr(key, context, level)
- write(',\n%s%s: ' % (' '*indent, rep))
- self._format(ent, stream, indent + _len(rep) + 2,
- allowance + 1, context, level)
- indent = indent - self._indent_per_level
- del context[objid]
- write('}')
- return
-
- if ((issubclass(typ, list) and r is list.__repr__) or
- (issubclass(typ, tuple) and r is tuple.__repr__) or
- (issubclass(typ, set) and r is set.__repr__) or
- (issubclass(typ, frozenset) and r is frozenset.__repr__)
- ):
- anyobj = cast(Any, object) # TODO Collection?
- length = _len(anyobj)
- if issubclass(typ, list):
- write('[')
- endchar = ']'
- lst = anyobj
- elif issubclass(typ, set):
- if not length:
- write('set()')
- return
- write('{')
- endchar = '}'
- lst = sorted(anyobj, key=_safe_key)
- elif issubclass(typ, frozenset):
- if not length:
- write('frozenset()')
- return
- write('frozenset({')
- endchar = '})'
- lst = sorted(anyobj, key=_safe_key)
- indent += 10
- else:
- write('(')
- endchar = ')'
- lst = list(anyobj)
- if self._indent_per_level > 1:
- write((self._indent_per_level - 1) * ' ')
- if length:
- context[objid] = 1
- indent = indent + self._indent_per_level
- self._format(lst[0], stream, indent, allowance + 1,
- context, level)
- if length > 1:
- for ent in lst[1:]:
- write(',\n' + ' '*indent)
- self._format(ent, stream, indent,
- allowance + 1, context, level)
- indent = indent - self._indent_per_level
- del context[objid]
- if issubclass(typ, tuple) and length == 1:
- write(',')
- write(endchar)
- return
-
- write(rep)
-
- def _repr(self, object: object, context: Dict[int, int],
- level: int) -> str:
- repr, readable, recursive = self.format(object, context.copy(),
- self._depth, level)
- if not readable:
- self._readable = False
- if recursive:
- self._recursive = True
- return repr
-
- def format(self, object: object, context: Dict[int, int],
- maxlevels: int, level: int) -> Tuple[str, int, int]:
- """Format object for a specific context, returning a string
- and flags indicating whether the representation is 'readable'
- and whether the object represents a recursive construct.
- """
- return _safe_repr(object, context, maxlevels, level)
-
-
-# Return triple (repr_string, isreadable, isrecursive).
-
-def _safe_repr(object: object, context: Dict[int, int],
- maxlevels: int, level: int) -> Tuple[str, bool, bool]:
- typ = _type(object)
- if typ is str:
- s = cast(str, object)
- if 'locale' not in _sys.modules:
- return repr(object), True, False
- if "'" in s and '"' not in s:
- closure = '"'
- quotes = {'"': '\\"'}
- else:
- closure = "'"
- quotes = {"'": "\\'"}
- qget = quotes.get
- sio = _StringIO()
- write = sio.write
- for char in s:
- if char.isalpha():
- write(char)
- else:
- write(qget(char, repr(char)[1:-1]))
- return ("%s%s%s" % (closure, sio.getvalue(), closure)), True, False
-
- r = getattr(typ, "__repr__", None)
- if issubclass(typ, dict) and r is dict.__repr__:
- if not object:
- return "{}", True, False
- objid = _id(object)
- if maxlevels and level >= maxlevels:
- return "{...}", False, objid in context
- if objid in context:
- return _recursion(object), False, True
- context[objid] = 1
- readable = True
- recursive = False
- components = [] # type: List[str]
- append = components.append
- level += 1
- saferepr = _safe_repr
- items = sorted((cast(dict, object)).items(), key=_safe_tuple)
- for k, v in items:
- krepr, kreadable, krecur = saferepr(k, context, maxlevels, level)
- vrepr, vreadable, vrecur = saferepr(v, context, maxlevels, level)
- append("%s: %s" % (krepr, vrepr))
- readable = readable and kreadable and vreadable
- if krecur or vrecur:
- recursive = True
- del context[objid]
- return "{%s}" % _commajoin(components), readable, recursive
-
- if (issubclass(typ, list) and r is list.__repr__) or \
- (issubclass(typ, tuple) and r is tuple.__repr__):
- anyobj = cast(Any, object) # TODO Sequence?
- if issubclass(typ, list):
- if not object:
- return "[]", True, False
- format = "[%s]"
- elif _len(anyobj) == 1:
- format = "(%s,)"
- else:
- if not object:
- return "()", True, False
- format = "(%s)"
- objid = _id(object)
- if maxlevels and level >= maxlevels:
- return format % "...", False, objid in context
- if objid in context:
- return _recursion(object), False, True
- context[objid] = 1
- readable = True
- recursive = False
- components = []
- append = components.append
- level += 1
- for o in anyobj:
- orepr, oreadable, orecur = _safe_repr(o, context, maxlevels, level)
- append(orepr)
- if not oreadable:
- readable = False
- if orecur:
- recursive = True
- del context[objid]
- return format % _commajoin(components), readable, recursive
-
- rep = repr(object)
- return rep, bool(rep and not rep.startswith('<')), False
-
-
-def _recursion(object: object) -> str:
- return ("<Recursion on %s with id=%s>"
- % (_type(object).__name__, _id(object)))
-
-
-def _perfcheck(object: object = None) -> None:
- import time
- if object is None:
- object = [("string", (1, 2), [3, 4], {5: 6, 7: 8})] * 100000
- p = PrettyPrinter()
- t1 = time.time()
- _safe_repr(object, {}, None, 0)
- t2 = time.time()
- p.pformat(object)
- t3 = time.time()
- print("_safe_repr:", t2 - t1)
- print("pformat:", t3 - t2)
-
-if __name__ == "__main__":
- _perfcheck()
diff --git a/test-data/stdlib-samples/3.2/random.py b/test-data/stdlib-samples/3.2/random.py
deleted file mode 100644
index 8ce0a69..0000000
--- a/test-data/stdlib-samples/3.2/random.py
+++ /dev/null
@@ -1,743 +0,0 @@
-"""Random variable generators.
-
- integers
- --------
- uniform within range
-
- sequences
- ---------
- pick random element
- pick random sample
- generate random permutation
-
- distributions on the real line:
- ------------------------------
- uniform
- triangular
- normal (Gaussian)
- lognormal
- negative exponential
- gamma
- beta
- pareto
- Weibull
-
- distributions on the circle (angles 0 to 2pi)
- ---------------------------------------------
- circular uniform
- von Mises
-
-General notes on the underlying Mersenne Twister core generator:
-
-* The period is 2**19937-1.
-* It is one of the most extensively tested generators in existence.
-* The random() method is implemented in C, executes in a single Python step,
- and is, therefore, threadsafe.
-
-"""
-
-from warnings import warn as _warn
-from types import MethodType as _MethodType, BuiltinMethodType as _BuiltinMethodType
-from math import log as _log, exp as _exp, pi as _pi, e as _e, ceil as _ceil
-from math import sqrt as _sqrt, acos as _acos, cos as _cos, sin as _sin
-from os import urandom as _urandom
-from collections import Set as _Set, Sequence as _Sequence
-from hashlib import sha512 as _sha512
-
-from typing import (
- Any, TypeVar, Iterable, Sequence, List, Callable, Set, cast, SupportsInt, Union
-)
-
-__all__ = ["Random","seed","random","uniform","randint","choice","sample",
- "randrange","shuffle","normalvariate","lognormvariate",
- "expovariate","vonmisesvariate","gammavariate","triangular",
- "gauss","betavariate","paretovariate","weibullvariate",
- "getstate","setstate", "getrandbits",
- "SystemRandom"]
-
-NV_MAGICCONST = 4 * _exp(-0.5)/_sqrt(2.0)
-TWOPI = 2.0*_pi
-LOG4 = _log(4.0)
-SG_MAGICCONST = 1.0 + _log(4.5)
-BPF = 53 # Number of bits in a float
-RECIP_BPF = 2**-BPF # type: float
-
-
-# Translated by Guido van Rossum from C source provided by
-# Adrian Baddeley. Adapted by Raymond Hettinger for use with
-# the Mersenne Twister and os.urandom() core generators.
-
-import _random
-
-T = TypeVar('T')
-
-class Random(_random.Random):
- """Random number generator base class used by bound module functions.
-
- Used to instantiate instances of Random to get generators that don't
- share state.
-
- Class Random can also be subclassed if you want to use a different basic
- generator of your own devising: in that case, override the following
- methods: random(), seed(), getstate(), and setstate().
- Optionally, implement a getrandbits() method so that randrange()
- can cover arbitrarily large ranges.
-
- """
-
- VERSION = 3 # used by getstate/setstate
- gauss_next = 0.0
-
- def __init__(self, x: object = None) -> None:
- """Initialize an instance.
-
- Optional argument x controls seeding, as for Random.seed().
- """
-
- self.seed(x)
- self.gauss_next = None
-
- def seed(self, a: Any = None, version: int = 2) -> None:
- """Initialize internal state from hashable object.
-
- None or no argument seeds from current time or from an operating
- system specific randomness source if available.
-
- For version 2 (the default), all of the bits are used if *a *is a str,
- bytes, or bytearray. For version 1, the hash() of *a* is used instead.
-
- If *a* is an int, all bits are used.
-
- """
-
- if a is None:
- try:
- a = int.from_bytes(_urandom(32), 'big')
- except NotImplementedError:
- import time
- a = int(time.time() * 256) # use fractional seconds
-
- if version == 2:
- if isinstance(a, (str, bytes, bytearray)):
- if isinstance(a, str):
- a = a.encode()
- a += _sha512(a).digest()
- a = int.from_bytes(a, 'big')
-
- super().seed(a)
- self.gauss_next = None
-
- def getstate(self) -> tuple:
- """Return internal state; can be passed to setstate() later."""
- return self.VERSION, super().getstate(), self.gauss_next
-
- def setstate(self, state: tuple) -> None:
- """Restore internal state from object returned by getstate()."""
- version = state[0]
- if version == 3:
- version, internalstate, self.gauss_next = state
- super().setstate(internalstate)
- elif version == 2:
- version, internalstate, self.gauss_next = state
- # In version 2, the state was saved as signed ints, which causes
- # inconsistencies between 32/64-bit systems. The state is
- # really unsigned 32-bit ints, so we convert negative ints from
- # version 2 to positive longs for version 3.
- try:
- internalstate = tuple(x % (2**32) for x in internalstate)
- except ValueError as e:
- raise TypeError()
- super().setstate(internalstate)
- else:
- raise ValueError("state with version %s passed to "
- "Random.setstate() of version %s" %
- (version, self.VERSION))
-
-## ---- Methods below this point do not need to be overridden when
-## ---- subclassing for the purpose of using a different core generator.
-
-## -------------------- pickle support -------------------
-
- def __getstate__(self) -> object: # for pickle
- return self.getstate()
-
- def __setstate__(self, state: Any) -> None: # for pickle
- self.setstate(state)
-
- def __reduce__(self) -> object:
- return self.__class__, (), self.getstate()
-
-## -------------------- integer methods -------------------
-
- def randrange(self, start: SupportsInt, stop: SupportsInt = None,
- step: int = 1, int: Callable[[SupportsInt],
- int] = int) -> int:
- """Choose a random item from range(start, stop[, step]).
-
- This fixes the problem with randint() which includes the
- endpoint; in Python this is usually not what you want.
-
- Do not supply the 'int' argument.
- """
-
- # This code is a bit messy to make it fast for the
- # common case while still doing adequate error checking.
- istart = int(start)
- if istart != start:
- raise ValueError("non-integer arg 1 for randrange()")
- if stop is None:
- if istart > 0:
- return self._randbelow(istart)
- raise ValueError("empty range for randrange()")
-
- # stop argument supplied.
- istop = int(stop)
- if istop != stop:
- raise ValueError("non-integer stop for randrange()")
- width = istop - istart
- if step == 1 and width > 0:
- return istart + self._randbelow(width)
- if step == 1:
- raise ValueError("empty range for randrange() (%d,%d, %d)" % (istart, istop, width))
-
- # Non-unit step argument supplied.
- istep = int(step)
- if istep != step:
- raise ValueError("non-integer step for randrange()")
- if istep > 0:
- n = (width + istep - 1) // istep
- elif istep < 0:
- n = (width + istep + 1) // istep
- else:
- raise ValueError("zero step for randrange()")
-
- if n <= 0:
- raise ValueError("empty range for randrange()")
-
- return istart + istep*self._randbelow(n)
-
- def randint(self, a: int, b: int) -> int:
- """Return random integer in range [a, b], including both end points.
- """
-
- return self.randrange(a, b+1)
-
- def _randbelow(self, n: int, int: Callable[[float], int] = int,
- maxsize: int = 1<<BPF,
- type: Callable[[object], type] = type,
- Method: type = _MethodType,
- BuiltinMethod: type = _BuiltinMethodType) -> int:
- "Return a random int in the range [0,n). Raises ValueError if n==0."
-
- getrandbits = self.getrandbits
- # Only call self.getrandbits if the original random() builtin method
- # has not been overridden or if a new getrandbits() was supplied.
- if type(self.random) is BuiltinMethod or type(getrandbits) is Method:
- k = n.bit_length() # don't use (n-1) here because n can be 1
- r = getrandbits(k) # 0 <= r < 2**k
- while r >= n:
- r = getrandbits(k)
- return r
- # There's an overriden random() method but no new getrandbits() method,
- # so we can only use random() from here.
- random = self.random
- if n >= maxsize:
- _warn("Underlying random() generator does not supply \n"
- "enough bits to choose from a population range this large.\n"
- "To remove the range limitation, add a getrandbits() method.")
- return int(random() * n)
- rem = maxsize % n
- limit = (maxsize - rem) / maxsize # int(limit * maxsize) % n == 0
- s = random()
- while s >= limit:
- s = random()
- return int(s*maxsize) % n
-
-## -------------------- sequence methods -------------------
-
- def choice(self, seq: Sequence[T]) -> T:
- """Choose a random element from a non-empty sequence."""
- try:
- i = self._randbelow(len(seq))
- except ValueError:
- raise IndexError('Cannot choose from an empty sequence')
- return seq[i]
-
- def shuffle(self, x: List[T],
- random: Callable[[], float] = None,
- int: Callable[[float], int] = int) -> None:
- """x, random=random.random -> shuffle list x in place; return None.
-
- Optional arg random is a 0-argument function returning a random
- float in [0.0, 1.0); by default, the standard random.random.
- """
-
- randbelow = self._randbelow
- for i in reversed(range(1, len(x))):
- # pick an element in x[:i+1] with which to exchange x[i]
- j = randbelow(i+1) if random is None else int(random() * (i+1))
- x[i], x[j] = x[j], x[i]
-
- def sample(self, population: Union[_Set[T], _Sequence[T]], k: int) -> List[T]:
- """Chooses k unique random elements from a population sequence or set.
-
- Returns a new list containing elements from the population while
- leaving the original population unchanged. The resulting list is
- in selection order so that all sub-slices will also be valid random
- samples. This allows raffle winners (the sample) to be partitioned
- into grand prize and second place winners (the subslices).
-
- Members of the population need not be hashable or unique. If the
- population contains repeats, then each occurrence is a possible
- selection in the sample.
-
- To choose a sample in a range of integers, use range as an argument.
- This is especially fast and space efficient for sampling from a
- large population: sample(range(10000000), 60)
- """
-
- # Sampling without replacement entails tracking either potential
- # selections (the pool) in a list or previous selections in a set.
-
- # When the number of selections is small compared to the
- # population, then tracking selections is efficient, requiring
- # only a small set and an occasional reselection. For
- # a larger number of selections, the pool tracking method is
- # preferred since the list takes less space than the
- # set and it doesn't suffer from frequent reselections.
-
- if isinstance(population, _Set):
- population = list(population)
- if not isinstance(population, _Sequence):
- raise TypeError("Population must be a sequence or set. For dicts, use list(d).")
- randbelow = self._randbelow
- n = len(population)
- if not (0 <= k and k <= n):
- raise ValueError("Sample larger than population")
- result = [cast(T, None)] * k
- setsize = 21 # size of a small set minus size of an empty list
- if k > 5:
- setsize += 4 ** _ceil(_log(k * 3, 4)) # table size for big sets
- if n <= setsize:
- # An n-length list is smaller than a k-length set
- pool = list(population)
- for i in range(k): # invariant: non-selected at [0,n-i)
- j = randbelow(n-i)
- result[i] = pool[j]
- pool[j] = pool[n-i-1] # move non-selected item into vacancy
- else:
- selected = set() # type: Set[int]
- selected_add = selected.add
- for i in range(k):
- j = randbelow(n)
- while j in selected:
- j = randbelow(n)
- selected_add(j)
- result[i] = population[j]
- return result
-
-## -------------------- real-valued distributions -------------------
-
-## -------------------- uniform distribution -------------------
-
- def uniform(self, a: float, b: float) -> float:
- "Get a random number in the range [a, b) or [a, b] depending on rounding."
- return a + (b-a) * self.random()
-
-## -------------------- triangular --------------------
-
- def triangular(self, low: float = 0.0, high: float = 1.0,
- mode: float = None) -> float:
- """Triangular distribution.
-
- Continuous distribution bounded by given lower and upper limits,
- and having a given mode value in-between.
-
- http://en.wikipedia.org/wiki/Triangular_distribution
-
- """
- u = self.random()
- c = 0.5 if mode is None else (mode - low) / (high - low)
- if u > c:
- u = 1.0 - u
- c = 1.0 - c
- low, high = high, low
- return low + (high - low) * (u * c) ** 0.5
-
-## -------------------- normal distribution --------------------
-
- def normalvariate(self, mu: float, sigma: float) -> float:
- """Normal distribution.
-
- mu is the mean, and sigma is the standard deviation.
-
- """
- # mu = mean, sigma = standard deviation
-
- # Uses Kinderman and Monahan method. Reference: Kinderman,
- # A.J. and Monahan, J.F., "Computer generation of random
- # variables using the ratio of uniform deviates", ACM Trans
- # Math Software, 3, (1977), pp257-260.
-
- random = self.random
- while 1:
- u1 = random()
- u2 = 1.0 - random()
- z = NV_MAGICCONST*(u1-0.5)/u2
- zz = z*z/4.0
- if zz <= -_log(u2):
- break
- return mu + z*sigma
-
-## -------------------- lognormal distribution --------------------
-
- def lognormvariate(self, mu: float, sigma: float) -> float:
- """Log normal distribution.
-
- If you take the natural logarithm of this distribution, you'll get a
- normal distribution with mean mu and standard deviation sigma.
- mu can have any value, and sigma must be greater than zero.
-
- """
- return _exp(self.normalvariate(mu, sigma))
-
-## -------------------- exponential distribution --------------------
-
- def expovariate(self, lambd: float) -> float:
- """Exponential distribution.
-
- lambd is 1.0 divided by the desired mean. It should be
- nonzero. (The parameter would be called "lambda", but that is
- a reserved word in Python.) Returned values range from 0 to
- positive infinity if lambd is positive, and from negative
- infinity to 0 if lambd is negative.
-
- """
- # lambd: rate lambd = 1/mean
- # ('lambda' is a Python reserved word)
-
- # we use 1-random() instead of random() to preclude the
- # possibility of taking the log of zero.
- return -_log(1.0 - self.random())/lambd
-
-## -------------------- von Mises distribution --------------------
-
- def vonmisesvariate(self, mu: float, kappa: float) -> float:
- """Circular data distribution.
-
- mu is the mean angle, expressed in radians between 0 and 2*pi, and
- kappa is the concentration parameter, which must be greater than or
- equal to zero. If kappa is equal to zero, this distribution reduces
- to a uniform random angle over the range 0 to 2*pi.
-
- """
- # mu: mean angle (in radians between 0 and 2*pi)
- # kappa: concentration parameter kappa (>= 0)
- # if kappa = 0 generate uniform random angle
-
- # Based upon an algorithm published in: Fisher, N.I.,
- # "Statistical Analysis of Circular Data", Cambridge
- # University Press, 1993.
-
- # Thanks to Magnus Kessler for a correction to the
- # implementation of step 4.
-
- random = self.random
- if kappa <= 1e-6:
- return TWOPI * random()
-
- a = 1.0 + _sqrt(1.0 + 4.0 * kappa * kappa)
- b = (a - _sqrt(2.0 * a))/(2.0 * kappa)
- r = (1.0 + b * b)/(2.0 * b)
-
- while 1:
- u1 = random()
-
- z = _cos(_pi * u1)
- f = (1.0 + r * z)/(r + z)
- c = kappa * (r - f)
-
- u2 = random()
-
- if u2 < c * (2.0 - c) or u2 <= c * _exp(1.0 - c):
- break
-
- u3 = random()
- if u3 > 0.5:
- theta = (mu % TWOPI) + _acos(f)
- else:
- theta = (mu % TWOPI) - _acos(f)
-
- return theta
-
-## -------------------- gamma distribution --------------------
-
- def gammavariate(self, alpha: float, beta: float) -> float:
- """Gamma distribution. Not the gamma function!
-
- Conditions on the parameters are alpha > 0 and beta > 0.
-
- The probability distribution function is:
-
- x ** (alpha - 1) * math.exp(-x / beta)
- pdf(x) = --------------------------------------
- math.gamma(alpha) * beta ** alpha
-
- """
-
- # alpha > 0, beta > 0, mean is alpha*beta, variance is alpha*beta**2
-
- # Warning: a few older sources define the gamma distribution in terms
- # of alpha > -1.0
- if alpha <= 0.0 or beta <= 0.0:
- raise ValueError('gammavariate: alpha and beta must be > 0.0')
-
- random = self.random
- if alpha > 1.0:
-
- # Uses R.C.H. Cheng, "The generation of Gamma
- # variables with non-integral shape parameters",
- # Applied Statistics, (1977), 26, No. 1, p71-74
-
- ainv = _sqrt(2.0 * alpha - 1.0)
- bbb = alpha - LOG4
- ccc = alpha + ainv
-
- while 1:
- u1 = random()
- if not (1e-7 < u1 and u1 < .9999999):
- continue
- u2 = 1.0 - random()
- v = _log(u1/(1.0-u1))/ainv
- x = alpha*_exp(v)
- z = u1*u1*u2
- r = bbb+ccc*v-x
- if r + SG_MAGICCONST - 4.5*z >= 0.0 or r >= _log(z):
- return x * beta
-
- elif alpha == 1.0:
- # expovariate(1)
- u = random()
- while u <= 1e-7:
- u = random()
- return -_log(u) * beta
-
- else: # alpha is between 0 and 1 (exclusive)
-
- # Uses ALGORITHM GS of Statistical Computing - Kennedy & Gentle
-
- while 1:
- u = random()
- b = (_e + alpha)/_e
- p = b*u
- if p <= 1.0:
- x = p ** (1.0/alpha)
- else:
- x = -_log((b-p)/alpha)
- u1 = random()
- if p > 1.0:
- if u1 <= x ** (alpha - 1.0):
- break
- elif u1 <= _exp(-x):
- break
- return x * beta
-
-## -------------------- Gauss (faster alternative) --------------------
-
- def gauss(self, mu: float, sigma: float) -> float:
- """Gaussian distribution.
-
- mu is the mean, and sigma is the standard deviation. This is
- slightly faster than the normalvariate() function.
-
- Not thread-safe without a lock around calls.
-
- """
-
- # When x and y are two variables from [0, 1), uniformly
- # distributed, then
- #
- # cos(2*pi*x)*sqrt(-2*log(1-y))
- # sin(2*pi*x)*sqrt(-2*log(1-y))
- #
- # are two *independent* variables with normal distribution
- # (mu = 0, sigma = 1).
- # (Lambert Meertens)
- # (corrected version; bug discovered by Mike Miller, fixed by LM)
-
- # Multithreading note: When two threads call this function
- # simultaneously, it is possible that they will receive the
- # same return value. The window is very small though. To
- # avoid this, you have to use a lock around all calls. (I
- # didn't want to slow this down in the serial case by using a
- # lock here.)
-
- random = self.random
- z = self.gauss_next
- self.gauss_next = None
- if z is None:
- x2pi = random() * TWOPI
- g2rad = _sqrt(-2.0 * _log(1.0 - random()))
- z = _cos(x2pi) * g2rad
- self.gauss_next = _sin(x2pi) * g2rad
-
- return mu + z*sigma
-
-## -------------------- beta --------------------
-## See
-## http://mail.python.org/pipermail/python-bugs-list/2001-January/003752.html
-## for Ivan Frohne's insightful analysis of why the original implementation:
-##
-## def betavariate(self, alpha, beta):
-## # Discrete Event Simulation in C, pp 87-88.
-##
-## y = self.expovariate(alpha)
-## z = self.expovariate(1.0/beta)
-## return z/(y+z)
-##
-## was dead wrong, and how it probably got that way.
-
- def betavariate(self, alpha: float, beta: float) -> 'float':
- """Beta distribution.
-
- Conditions on the parameters are alpha > 0 and beta > 0.
- Returned values range between 0 and 1.
-
- """
-
- # This version due to Janne Sinkkonen, and matches all the std
- # texts (e.g., Knuth Vol 2 Ed 3 pg 134 "the beta distribution").
- y = self.gammavariate(alpha, 1.)
- if y == 0:
- return 0.0
- else:
- return y / (y + self.gammavariate(beta, 1.))
-
-## -------------------- Pareto --------------------
-
- def paretovariate(self, alpha: float) -> float:
- """Pareto distribution. alpha is the shape parameter."""
- # Jain, pg. 495
-
- u = 1.0 - self.random()
- return 1.0 / u ** (1.0/alpha)
-
-## -------------------- Weibull --------------------
-
- def weibullvariate(self, alpha: float, beta: float) -> float:
- """Weibull distribution.
-
- alpha is the scale parameter and beta is the shape parameter.
-
- """
- # Jain, pg. 499; bug fix courtesy Bill Arms
-
- u = 1.0 - self.random()
- return alpha * (-_log(u)) ** (1.0/beta)
-
-## --------------- Operating System Random Source ------------------
-
-class SystemRandom(Random):
- """Alternate random number generator using sources provided
- by the operating system (such as /dev/urandom on Unix or
- CryptGenRandom on Windows).
-
- Not available on all systems (see os.urandom() for details).
- """
-
- def random(self) -> float:
- """Get the next random number in the range [0.0, 1.0)."""
- return (int.from_bytes(_urandom(7), 'big') >> 3) * RECIP_BPF
-
- def getrandbits(self, k: int) -> int:
- """getrandbits(k) -> x. Generates a long int with k random bits."""
- if k <= 0:
- raise ValueError('number of bits must be greater than zero')
- if k != int(k):
- raise TypeError('number of bits should be an integer')
- numbytes = (k + 7) // 8 # bits / 8 and rounded up
- x = int.from_bytes(_urandom(numbytes), 'big')
- return x >> (numbytes * 8 - k) # trim excess bits
-
- def seed(self, a: object = None, version: int = None) -> None:
- "Stub method. Not used for a system random number generator."
- return
-
- def _notimplemented(self, *args: Any, **kwds: Any) -> Any:
- "Method should not be called for a system random number generator."
- raise NotImplementedError('System entropy source does not have state.')
- getstate = setstate = _notimplemented
-
-# Create one instance, seeded from current time, and export its methods
-# as module-level functions. The functions share state across all uses
-#(both in the user's code and in the Python libraries), but that's fine
-# for most programs and is easier for the casual user than making them
-# instantiate their own Random() instance.
-
-_inst = Random()
-seed = _inst.seed
-random = _inst.random
-uniform = _inst.uniform
-triangular = _inst.triangular
-randint = _inst.randint
-choice = _inst.choice
-randrange = _inst.randrange
-sample = _inst.sample
-shuffle = _inst.shuffle
-normalvariate = _inst.normalvariate
-lognormvariate = _inst.lognormvariate
-expovariate = _inst.expovariate
-vonmisesvariate = _inst.vonmisesvariate
-gammavariate = _inst.gammavariate
-gauss = _inst.gauss
-betavariate = _inst.betavariate
-paretovariate = _inst.paretovariate
-weibullvariate = _inst.weibullvariate
-getstate = _inst.getstate
-setstate = _inst.setstate
-getrandbits = _inst.getrandbits
-
-## -------------------- test program --------------------
-
-def _test_generator(n: int, func: Any, args: tuple) -> None:
- import time
- print(n, 'times', func.__name__)
- total = 0.0
- sqsum = 0.0
- smallest = 1e10
- largest = -1e10
- t0 = time.time()
- for i in range(n):
- x = func(*args) # type: float
- total += x
- sqsum = sqsum + x*x
- smallest = min(x, smallest)
- largest = max(x, largest)
- t1 = time.time()
- print(round(t1-t0, 3), 'sec,', end=' ')
- avg = total/n
- stddev = _sqrt(sqsum/n - avg*avg)
- print('avg %g, stddev %g, min %g, max %g' % \
- (avg, stddev, smallest, largest))
-
-
-def _test(N: int = 2000) -> None:
- _test_generator(N, random, ())
- _test_generator(N, normalvariate, (0.0, 1.0))
- _test_generator(N, lognormvariate, (0.0, 1.0))
- _test_generator(N, vonmisesvariate, (0.0, 1.0))
- _test_generator(N, gammavariate, (0.01, 1.0))
- _test_generator(N, gammavariate, (0.1, 1.0))
- _test_generator(N, gammavariate, (0.1, 2.0))
- _test_generator(N, gammavariate, (0.5, 1.0))
- _test_generator(N, gammavariate, (0.9, 1.0))
- _test_generator(N, gammavariate, (1.0, 1.0))
- _test_generator(N, gammavariate, (2.0, 1.0))
- _test_generator(N, gammavariate, (20.0, 1.0))
- _test_generator(N, gammavariate, (200.0, 1.0))
- _test_generator(N, gauss, (0.0, 1.0))
- _test_generator(N, betavariate, (3.0, 3.0))
- _test_generator(N, triangular, (0.0, 1.0, 1.0/3.0))
-
-if __name__ == '__main__':
- _test()
diff --git a/test-data/stdlib-samples/3.2/shutil.py b/test-data/stdlib-samples/3.2/shutil.py
deleted file mode 100644
index 7204a4d..0000000
--- a/test-data/stdlib-samples/3.2/shutil.py
+++ /dev/null
@@ -1,790 +0,0 @@
-"""Utility functions for copying and archiving files and directory trees.
-
-XXX The functions here don't copy the resource fork or other metadata on Mac.
-
-"""
-
-import os
-import sys
-import stat
-from os.path import abspath
-import fnmatch
-import collections
-import errno
-import tarfile
-import builtins
-
-from typing import (
- Any, AnyStr, IO, List, Iterable, Callable, Tuple, Dict, Sequence, cast
-)
-from types import TracebackType
-
-try:
- import bz2
- _BZ2_SUPPORTED = True
-except ImportError:
- _BZ2_SUPPORTED = False
-
-try:
- from pwd import getpwnam as _getpwnam
- getpwnam = _getpwnam
-except ImportError:
- getpwnam = None
-
-try:
- from grp import getgrnam as _getgrnam
- getgrnam = _getgrnam
-except ImportError:
- getgrnam = None
-
-__all__ = ["copyfileobj", "copyfile", "copymode", "copystat", "copy", "copy2",
- "copytree", "move", "rmtree", "Error", "SpecialFileError",
- "ExecError", "make_archive", "get_archive_formats",
- "register_archive_format", "unregister_archive_format",
- "get_unpack_formats", "register_unpack_format",
- "unregister_unpack_format", "unpack_archive", "ignore_patterns"]
-
-class Error(EnvironmentError):
- pass
-
-class SpecialFileError(EnvironmentError):
- """Raised when trying to do a kind of operation (e.g. copying) which is
- not supported on a special file (e.g. a named pipe)"""
-
-class ExecError(EnvironmentError):
- """Raised when a command could not be executed"""
-
-class ReadError(EnvironmentError):
- """Raised when an archive cannot be read"""
-
-class RegistryError(Exception):
- """Raised when a registery operation with the archiving
- and unpacking registeries fails"""
-
-
-try:
- _WindowsError = WindowsError # type: type
-except NameError:
- _WindowsError = None
-
-
-# Function aliases to be patched in test cases
-rename = os.rename
-open = builtins.open
-
-
-def copyfileobj(fsrc: IO[AnyStr], fdst: IO[AnyStr],
- length: int = 16*1024) -> None:
- """copy data from file-like object fsrc to file-like object fdst"""
- while 1:
- buf = fsrc.read(length)
- if not buf:
- break
- fdst.write(buf)
-
-def _samefile(src: str, dst: str) -> bool:
- # Macintosh, Unix.
- if hasattr(os.path, 'samefile'):
- try:
- return os.path.samefile(src, dst)
- except OSError:
- return False
-
- # All other platforms: check for same pathname.
- return (os.path.normcase(os.path.abspath(src)) ==
- os.path.normcase(os.path.abspath(dst)))
-
-def copyfile(src: str, dst: str) -> None:
- """Copy data from src to dst"""
- if _samefile(src, dst):
- raise Error("`%s` and `%s` are the same file" % (src, dst))
-
- for fn in [src, dst]:
- try:
- st = os.stat(fn)
- except OSError:
- # File most likely does not exist
- pass
- else:
- # XXX What about other special files? (sockets, devices...)
- if stat.S_ISFIFO(st.st_mode):
- raise SpecialFileError("`%s` is a named pipe" % fn)
-
- with open(src, 'rb') as fsrc:
- with open(dst, 'wb') as fdst:
- copyfileobj(fsrc, fdst)
-
-def copymode(src: str, dst: str) -> None:
- """Copy mode bits from src to dst"""
- if hasattr(os, 'chmod'):
- st = os.stat(src)
- mode = stat.S_IMODE(st.st_mode)
- os.chmod(dst, mode)
-
-def copystat(src: str, dst: str) -> None:
- """Copy all stat info (mode bits, atime, mtime, flags) from src to dst"""
- st = os.stat(src)
- mode = stat.S_IMODE(st.st_mode)
- if hasattr(os, 'utime'):
- os.utime(dst, (st.st_atime, st.st_mtime))
- if hasattr(os, 'chmod'):
- os.chmod(dst, mode)
- if hasattr(os, 'chflags') and hasattr(st, 'st_flags'):
- try:
- os.chflags(dst, st.st_flags)
- except OSError as why:
- if (not hasattr(errno, 'EOPNOTSUPP') or
- why.errno != errno.EOPNOTSUPP):
- raise
-
-def copy(src: str, dst: str) -> None:
- """Copy data and mode bits ("cp src dst").
-
- The destination may be a directory.
-
- """
- if os.path.isdir(dst):
- dst = os.path.join(dst, os.path.basename(src))
- copyfile(src, dst)
- copymode(src, dst)
-
-def copy2(src: str, dst: str) -> None:
- """Copy data and all stat info ("cp -p src dst").
-
- The destination may be a directory.
-
- """
- if os.path.isdir(dst):
- dst = os.path.join(dst, os.path.basename(src))
- copyfile(src, dst)
- copystat(src, dst)
-
-def ignore_patterns(*patterns: str) -> Callable[[str, List[str]],
- Iterable[str]]:
- """Function that can be used as copytree() ignore parameter.
-
- Patterns is a sequence of glob-style patterns
- that are used to exclude files"""
- def _ignore_patterns(path: str, names: List[str]) -> Iterable[str]:
- ignored_names = [] # type: List[str]
- for pattern in patterns:
- ignored_names.extend(fnmatch.filter(names, pattern))
- return set(ignored_names)
- return _ignore_patterns
-
-def copytree(src: str, dst: str, symlinks: bool = False,
- ignore: Callable[[str, List[str]], Iterable[str]] = None,
- copy_function: Callable[[str, str], None] = copy2,
- ignore_dangling_symlinks: bool = False) -> None:
- """Recursively copy a directory tree.
-
- The destination directory must not already exist.
- If exception(s) occur, an Error is raised with a list of reasons.
-
- If the optional symlinks flag is true, symbolic links in the
- source tree result in symbolic links in the destination tree; if
- it is false, the contents of the files pointed to by symbolic
- links are copied. If the file pointed by the symlink doesn't
- exist, an exception will be added in the list of errors raised in
- an Error exception at the end of the copy process.
-
- You can set the optional ignore_dangling_symlinks flag to true if you
- want to silence this exception. Notice that this has no effect on
- platforms that don't support os.symlink.
-
- The optional ignore argument is a callable. If given, it
- is called with the `src` parameter, which is the directory
- being visited by copytree(), and `names` which is the list of
- `src` contents, as returned by os.listdir():
-
- callable(src, names) -> ignored_names
-
- Since copytree() is called recursively, the callable will be
- called once for each directory that is copied. It returns a
- list of names relative to the `src` directory that should
- not be copied.
-
- The optional copy_function argument is a callable that will be used
- to copy each file. It will be called with the source path and the
- destination path as arguments. By default, copy2() is used, but any
- function that supports the same signature (like copy()) can be used.
-
- """
- names = os.listdir(src)
- if ignore is not None:
- ignored_names = ignore(src, names)
- else:
- ignored_names = set()
-
- os.makedirs(dst)
- errors = [] # type: List[Tuple[str, str, str]]
- for name in names:
- if name in ignored_names:
- continue
- srcname = os.path.join(src, name)
- dstname = os.path.join(dst, name)
- try:
- if os.path.islink(srcname):
- linkto = os.readlink(srcname)
- if symlinks:
- os.symlink(linkto, dstname)
- else:
- # ignore dangling symlink if the flag is on
- if not os.path.exists(linkto) and ignore_dangling_symlinks:
- continue
- # otherwise let the copy occurs. copy2 will raise an error
- copy_function(srcname, dstname)
- elif os.path.isdir(srcname):
- copytree(srcname, dstname, symlinks, ignore, copy_function)
- else:
- # Will raise a SpecialFileError for unsupported file types
- copy_function(srcname, dstname)
- # catch the Error from the recursive copytree so that we can
- # continue with other files
- except Error as err:
- errors.extend(err.args[0])
- except EnvironmentError as why:
- errors.append((srcname, dstname, str(why)))
- try:
- copystat(src, dst)
- except OSError as why:
- if _WindowsError is not None and isinstance(why, _WindowsError):
- # Copying file access times may fail on Windows
- pass
- else:
- errors.append((src, dst, str(why)))
- if errors:
- raise Error(errors)
-
-def rmtree(path: str, ignore_errors: bool = False,
- onerror: Callable[[Any, str, Tuple[type, BaseException, TracebackType]],
- None] = None) -> None:
- """Recursively delete a directory tree.
-
- If ignore_errors is set, errors are ignored; otherwise, if onerror
- is set, it is called to handle the error with arguments (func,
- path, exc_info) where func is os.listdir, os.remove, or os.rmdir;
- path is the argument to that function that caused it to fail; and
- exc_info is a tuple returned by sys.exc_info(). If ignore_errors
- is false and onerror is None, an exception is raised.
-
- """
- if ignore_errors:
- def _onerror(x: Any, y: str,
- z: Tuple[type, BaseException, TracebackType]) -> None:
- pass
- onerror = _onerror
- elif onerror is None:
- def __onerror(x: Any, y: str,
- z: Tuple[type, BaseException, TracebackType]) -> None:
- raise
- onerror = __onerror
- try:
- if os.path.islink(path):
- # symlinks to directories are forbidden, see bug #1669
- raise OSError("Cannot call rmtree on a symbolic link")
- except OSError:
- onerror(os.path.islink, path, sys.exc_info())
- # can't continue even if onerror hook returns
- return
- names = [] # type: List[str]
- try:
- names = os.listdir(path)
- except os.error as err:
- onerror(os.listdir, path, sys.exc_info())
- for name in names:
- fullname = os.path.join(path, name)
- try:
- mode = os.lstat(fullname).st_mode
- except os.error:
- mode = 0
- if stat.S_ISDIR(mode):
- rmtree(fullname, ignore_errors, onerror)
- else:
- try:
- os.remove(fullname)
- except os.error as err:
- onerror(os.remove, fullname, sys.exc_info())
- try:
- os.rmdir(path)
- except os.error:
- onerror(os.rmdir, path, sys.exc_info())
-
-
-def _basename(path: str) -> str:
- # A basename() variant which first strips the trailing slash, if present.
- # Thus we always get the last component of the path, even for directories.
- return os.path.basename(path.rstrip(os.path.sep))
-
-def move(src: str, dst: str) -> None:
- """Recursively move a file or directory to another location. This is
- similar to the Unix "mv" command.
-
- If the destination is a directory or a symlink to a directory, the source
- is moved inside the directory. The destination path must not already
- exist.
-
- If the destination already exists but is not a directory, it may be
- overwritten depending on os.rename() semantics.
-
- If the destination is on our current filesystem, then rename() is used.
- Otherwise, src is copied to the destination and then removed.
- A lot more could be done here... A look at a mv.c shows a lot of
- the issues this implementation glosses over.
-
- """
- real_dst = dst
- if os.path.isdir(dst):
- if _samefile(src, dst):
- # We might be on a case insensitive filesystem,
- # perform the rename anyway.
- os.rename(src, dst)
- return
-
- real_dst = os.path.join(dst, _basename(src))
- if os.path.exists(real_dst):
- raise Error("Destination path '%s' already exists" % real_dst)
- try:
- os.rename(src, real_dst)
- except OSError as exc:
- if os.path.isdir(src):
- if _destinsrc(src, dst):
- raise Error("Cannot move a directory '%s' into itself '%s'." % (src, dst))
- copytree(src, real_dst, symlinks=True)
- rmtree(src)
- else:
- copy2(src, real_dst)
- os.unlink(src)
-
-def _destinsrc(src: str, dst: str) -> bool:
- src = abspath(src)
- dst = abspath(dst)
- if not src.endswith(os.path.sep):
- src += os.path.sep
- if not dst.endswith(os.path.sep):
- dst += os.path.sep
- return dst.startswith(src)
-
-def _get_gid(name: str) -> int:
- """Returns a gid, given a group name."""
- if getgrnam is None or name is None:
- return None
- try:
- result = getgrnam(name)
- except KeyError:
- result = None
- if result is not None:
- return result.gr_gid
- return None
-
-def _get_uid(name: str) -> int:
- """Returns an uid, given a user name."""
- if getpwnam is None or name is None:
- return None
- try:
- result = getpwnam(name)
- except KeyError:
- result = None
- if result is not None:
- return result.pw_uid
- return None
-
-def _make_tarball(base_name: str, base_dir: str, compress: str = "gzip",
- verbose: bool = False, dry_run: bool = False,
- owner: str = None, group: str = None,
- logger: Any = None) -> str:
- """Create a (possibly compressed) tar file from all the files under
- 'base_dir'.
-
- 'compress' must be "gzip" (the default), "bzip2", or None.
-
- 'owner' and 'group' can be used to define an owner and a group for the
- archive that is being built. If not provided, the current owner and group
- will be used.
-
- The output tar file will be named 'base_name' + ".tar", possibly plus
- the appropriate compression extension (".gz", or ".bz2").
-
- Returns the output filename.
- """
- tar_compression = {'gzip': 'gz', None: ''}
- compress_ext = {'gzip': '.gz'}
-
- if _BZ2_SUPPORTED:
- tar_compression['bzip2'] = 'bz2'
- compress_ext['bzip2'] = '.bz2'
-
- # flags for compression program, each element of list will be an argument
- if compress is not None and compress not in compress_ext.keys():
- raise ValueError("bad value for 'compress', or compression format not "
- "supported : {0}".format(compress))
-
- archive_name = base_name + '.tar' + compress_ext.get(compress, '')
- archive_dir = os.path.dirname(archive_name)
-
- if not os.path.exists(archive_dir):
- if logger is not None:
- logger.info("creating %s", archive_dir)
- if not dry_run:
- os.makedirs(archive_dir)
-
- # creating the tarball
- if logger is not None:
- logger.info('Creating tar archive')
-
- uid = _get_uid(owner)
- gid = _get_gid(group)
-
- def _set_uid_gid(tarinfo):
- if gid is not None:
- tarinfo.gid = gid
- tarinfo.gname = group
- if uid is not None:
- tarinfo.uid = uid
- tarinfo.uname = owner
- return tarinfo
-
- if not dry_run:
- tar = tarfile.open(archive_name, 'w|%s' % tar_compression[compress])
- try:
- tar.add(base_dir, filter=_set_uid_gid)
- finally:
- tar.close()
-
- return archive_name
-
-def _call_external_zip(base_dir: str, zip_filename: str, verbose: bool = False,
- dry_run: bool = False) -> None:
- # XXX see if we want to keep an external call here
- if verbose:
- zipoptions = "-r"
- else:
- zipoptions = "-rq"
- from distutils.errors import DistutilsExecError
- from distutils.spawn import spawn
- try:
- spawn(["zip", zipoptions, zip_filename, base_dir], dry_run=dry_run)
- except DistutilsExecError:
- # XXX really should distinguish between "couldn't find
- # external 'zip' command" and "zip failed".
- raise ExecError(("unable to create zip file '%s': "
- "could neither import the 'zipfile' module nor "
- "find a standalone zip utility") % zip_filename)
-
-def _make_zipfile(base_name: str, base_dir: str, verbose: bool = False,
- dry_run: bool = False, logger: Any = None) -> str:
- """Create a zip file from all the files under 'base_dir'.
-
- The output zip file will be named 'base_name' + ".zip". Uses either the
- "zipfile" Python module (if available) or the InfoZIP "zip" utility
- (if installed and found on the default search path). If neither tool is
- available, raises ExecError. Returns the name of the output zip
- file.
- """
- zip_filename = base_name + ".zip"
- archive_dir = os.path.dirname(base_name)
-
- if not os.path.exists(archive_dir):
- if logger is not None:
- logger.info("creating %s", archive_dir)
- if not dry_run:
- os.makedirs(archive_dir)
-
- # If zipfile module is not available, try spawning an external 'zip'
- # command.
- try:
- import zipfile
- except ImportError:
- zipfile = None
-
- if zipfile is None:
- _call_external_zip(base_dir, zip_filename, verbose, dry_run)
- else:
- if logger is not None:
- logger.info("creating '%s' and adding '%s' to it",
- zip_filename, base_dir)
-
- if not dry_run:
- zip = zipfile.ZipFile(zip_filename, "w",
- compression=zipfile.ZIP_DEFLATED)
-
- for dirpath, dirnames, filenames in os.walk(base_dir):
- for name in filenames:
- path = os.path.normpath(os.path.join(dirpath, name))
- if os.path.isfile(path):
- zip.write(path, path)
- if logger is not None:
- logger.info("adding '%s'", path)
- zip.close()
-
- return zip_filename
-
-_ARCHIVE_FORMATS = {
- 'gztar': (_make_tarball, [('compress', 'gzip')], "gzip'ed tar-file"),
- 'tar': (_make_tarball, [('compress', None)], "uncompressed tar file"),
- 'zip': (_make_zipfile, [],"ZIP file")
- } # type: Dict[str, Tuple[Any, Sequence[Tuple[str, str]], str]]
-
-if _BZ2_SUPPORTED:
- _ARCHIVE_FORMATS['bztar'] = (_make_tarball, [('compress', 'bzip2')],
- "bzip2'ed tar-file")
-
-def get_archive_formats() -> List[Tuple[str, str]]:
- """Returns a list of supported formats for archiving and unarchiving.
-
- Each element of the returned sequence is a tuple (name, description)
- """
- formats = [(name, registry[2]) for name, registry in
- _ARCHIVE_FORMATS.items()]
- formats.sort()
- return formats
-
-def register_archive_format(name: str, function: Any,
- extra_args: Sequence[Tuple[str, Any]] = None,
- description: str = '') -> None:
- """Registers an archive format.
-
- name is the name of the format. function is the callable that will be
- used to create archives. If provided, extra_args is a sequence of
- (name, value) tuples that will be passed as arguments to the callable.
- description can be provided to describe the format, and will be returned
- by the get_archive_formats() function.
- """
- if extra_args is None:
- extra_args = []
- if not callable(function):
- raise TypeError('The %s object is not callable' % function)
- if not isinstance(extra_args, (tuple, list)):
- raise TypeError('extra_args needs to be a sequence')
- for element in extra_args:
- if not isinstance(element, (tuple, list)) or len(cast(tuple, element)) !=2 :
- raise TypeError('extra_args elements are : (arg_name, value)')
-
- _ARCHIVE_FORMATS[name] = (function, extra_args, description)
-
-def unregister_archive_format(name: str) -> None:
- del _ARCHIVE_FORMATS[name]
-
-def make_archive(base_name: str, format: str, root_dir: str = None,
- base_dir: str = None, verbose: bool = False,
- dry_run: bool = False, owner: str = None,
- group: str = None, logger: Any = None) -> str:
- """Create an archive file (eg. zip or tar).
-
- 'base_name' is the name of the file to create, minus any format-specific
- extension; 'format' is the archive format: one of "zip", "tar", "bztar"
- or "gztar".
-
- 'root_dir' is a directory that will be the root directory of the
- archive; ie. we typically chdir into 'root_dir' before creating the
- archive. 'base_dir' is the directory where we start archiving from;
- ie. 'base_dir' will be the common prefix of all files and
- directories in the archive. 'root_dir' and 'base_dir' both default
- to the current directory. Returns the name of the archive file.
-
- 'owner' and 'group' are used when creating a tar archive. By default,
- uses the current owner and group.
- """
- save_cwd = os.getcwd()
- if root_dir is not None:
- if logger is not None:
- logger.debug("changing into '%s'", root_dir)
- base_name = os.path.abspath(base_name)
- if not dry_run:
- os.chdir(root_dir)
-
- if base_dir is None:
- base_dir = os.curdir
-
- kwargs = {'dry_run': dry_run, 'logger': logger}
-
- try:
- format_info = _ARCHIVE_FORMATS[format]
- except KeyError:
- raise ValueError("unknown archive format '%s'" % format)
-
- func = format_info[0]
- for arg, val in format_info[1]:
- kwargs[arg] = val
-
- if format != 'zip':
- kwargs['owner'] = owner
- kwargs['group'] = group
-
- try:
- filename = func(base_name, base_dir, **kwargs)
- finally:
- if root_dir is not None:
- if logger is not None:
- logger.debug("changing back to '%s'", save_cwd)
- os.chdir(save_cwd)
-
- return filename
-
-
-def get_unpack_formats() -> List[Tuple[str, List[str], str]]:
- """Returns a list of supported formats for unpacking.
-
- Each element of the returned sequence is a tuple
- (name, extensions, description)
- """
- formats = [(name, info[0], info[3]) for name, info in
- _UNPACK_FORMATS.items()]
- formats.sort()
- return formats
-
-def _check_unpack_options(extensions: List[str], function: Any,
- extra_args: Sequence[Tuple[str, Any]]) -> None:
- """Checks what gets registered as an unpacker."""
- # first make sure no other unpacker is registered for this extension
- existing_extensions = {} # type: Dict[str, str]
- for name, info in _UNPACK_FORMATS.items():
- for ext in info[0]:
- existing_extensions[ext] = name
-
- for extension in extensions:
- if extension in existing_extensions:
- msg = '%s is already registered for "%s"'
- raise RegistryError(msg % (extension,
- existing_extensions[extension]))
-
- if not callable(function):
- raise TypeError('The registered function must be a callable')
-
-
-def register_unpack_format(name: str, extensions: List[str], function: Any,
- extra_args: Sequence[Tuple[str, Any]] = None,
- description: str = '') -> None:
- """Registers an unpack format.
-
- `name` is the name of the format. `extensions` is a list of extensions
- corresponding to the format.
-
- `function` is the callable that will be
- used to unpack archives. The callable will receive archives to unpack.
- If it's unable to handle an archive, it needs to raise a ReadError
- exception.
-
- If provided, `extra_args` is a sequence of
- (name, value) tuples that will be passed as arguments to the callable.
- description can be provided to describe the format, and will be returned
- by the get_unpack_formats() function.
- """
- if extra_args is None:
- extra_args = []
- _check_unpack_options(extensions, function, extra_args)
- _UNPACK_FORMATS[name] = extensions, function, extra_args, description
-
-def unregister_unpack_format(name: str) -> None:
- """Removes the pack format from the registery."""
- del _UNPACK_FORMATS[name]
-
-def _ensure_directory(path: str) -> None:
- """Ensure that the parent directory of `path` exists"""
- dirname = os.path.dirname(path)
- if not os.path.isdir(dirname):
- os.makedirs(dirname)
-
-def _unpack_zipfile(filename: str, extract_dir: str) -> None:
- """Unpack zip `filename` to `extract_dir`
- """
- try:
- import zipfile
- except ImportError:
- raise ReadError('zlib not supported, cannot unpack this archive.')
-
- if not zipfile.is_zipfile(filename):
- raise ReadError("%s is not a zip file" % filename)
-
- zip = zipfile.ZipFile(filename)
- try:
- for info in zip.infolist():
- name = info.filename
-
- # don't extract absolute paths or ones with .. in them
- if name.startswith('/') or '..' in name:
- continue
-
- target = os.path.join(extract_dir, *name.split('/'))
- if not target:
- continue
-
- _ensure_directory(target)
- if not name.endswith('/'):
- # file
- data = zip.read(info.filename)
- f = open(target,'wb')
- try:
- f.write(data)
- finally:
- f.close()
- del data
- finally:
- zip.close()
-
-def _unpack_tarfile(filename: str, extract_dir: str) -> None:
- """Unpack tar/tar.gz/tar.bz2 `filename` to `extract_dir`
- """
- try:
- tarobj = tarfile.open(filename)
- except tarfile.TarError:
- raise ReadError(
- "%s is not a compressed or uncompressed tar file" % filename)
- try:
- tarobj.extractall(extract_dir)
- finally:
- tarobj.close()
-
-_UNPACK_FORMATS = {
- 'gztar': (['.tar.gz', '.tgz'], _unpack_tarfile, [], "gzip'ed tar-file"),
- 'tar': (['.tar'], _unpack_tarfile, [], "uncompressed tar file"),
- 'zip': (['.zip'], _unpack_zipfile, [], "ZIP file")
- } # type: Dict[str, Tuple[List[str], Any, Sequence[Tuple[str, Any]], str]]
-
-if _BZ2_SUPPORTED:
- _UNPACK_FORMATS['bztar'] = (['.bz2'], _unpack_tarfile, [],
- "bzip2'ed tar-file")
-
-def _find_unpack_format(filename: str) -> str:
- for name, info in _UNPACK_FORMATS.items():
- for extension in info[0]:
- if filename.endswith(extension):
- return name
- return None
-
-def unpack_archive(filename: str, extract_dir: str = None,
- format: str = None) -> None:
- """Unpack an archive.
-
- `filename` is the name of the archive.
-
- `extract_dir` is the name of the target directory, where the archive
- is unpacked. If not provided, the current working directory is used.
-
- `format` is the archive format: one of "zip", "tar", or "gztar". Or any
- other registered format. If not provided, unpack_archive will use the
- filename extension and see if an unpacker was registered for that
- extension.
-
- In case none is found, a ValueError is raised.
- """
- if extract_dir is None:
- extract_dir = os.getcwd()
-
- if format is not None:
- try:
- format_info = _UNPACK_FORMATS[format]
- except KeyError:
- raise ValueError("Unknown unpack format '{0}'".format(format))
-
- func = format_info[1]
- func(filename, extract_dir, **dict(format_info[2]))
- else:
- # we need to look at the registered unpackers supported extensions
- format = _find_unpack_format(filename)
- if format is None:
- raise ReadError("Unknown archive format '{0}'".format(filename))
-
- func = _UNPACK_FORMATS[format][1]
- kwargs = dict(_UNPACK_FORMATS[format][2])
- func(filename, extract_dir, **kwargs)
diff --git a/test-data/stdlib-samples/3.2/subprocess.py b/test-data/stdlib-samples/3.2/subprocess.py
deleted file mode 100644
index e286525..0000000
--- a/test-data/stdlib-samples/3.2/subprocess.py
+++ /dev/null
@@ -1,1703 +0,0 @@
-# subprocess - Subprocesses with accessible I/O streams
-#
-# For more information about this module, see PEP 324.
-#
-# Copyright (c) 2003-2005 by Peter Astrand <astrand at lysator.liu.se>
-#
-# Licensed to PSF under a Contributor Agreement.
-# See http://www.python.org/2.4/license for licensing details.
-
-r"""subprocess - Subprocesses with accessible I/O streams
-
-This module allows you to spawn processes, connect to their
-input/output/error pipes, and obtain their return codes. This module
-intends to replace several other, older modules and functions, like:
-
-os.system
-os.spawn*
-
-Information about how the subprocess module can be used to replace these
-modules and functions can be found below.
-
-
-
-Using the subprocess module
-===========================
-This module defines one class called Popen:
-
-class Popen(args, bufsize=0, executable=None,
- stdin=None, stdout=None, stderr=None,
- preexec_fn=None, close_fds=True, shell=False,
- cwd=None, env=None, universal_newlines=False,
- startupinfo=None, creationflags=0,
- restore_signals=True, start_new_session=False, pass_fds=()):
-
-
-Arguments are:
-
-args should be a string, or a sequence of program arguments. The
-program to execute is normally the first item in the args sequence or
-string, but can be explicitly set by using the executable argument.
-
-On POSIX, with shell=False (default): In this case, the Popen class
-uses os.execvp() to execute the child program. args should normally
-be a sequence. A string will be treated as a sequence with the string
-as the only item (the program to execute).
-
-On POSIX, with shell=True: If args is a string, it specifies the
-command string to execute through the shell. If args is a sequence,
-the first item specifies the command string, and any additional items
-will be treated as additional shell arguments.
-
-On Windows: the Popen class uses CreateProcess() to execute the child
-program, which operates on strings. If args is a sequence, it will be
-converted to a string using the list2cmdline method. Please note that
-not all MS Windows applications interpret the command line the same
-way: The list2cmdline is designed for applications using the same
-rules as the MS C runtime.
-
-bufsize, if given, has the same meaning as the corresponding argument
-to the built-in open() function: 0 means unbuffered, 1 means line
-buffered, any other positive value means use a buffer of
-(approximately) that size. A negative bufsize means to use the system
-default, which usually means fully buffered. The default value for
-bufsize is 0 (unbuffered).
-
-stdin, stdout and stderr specify the executed programs' standard
-input, standard output and standard error file handles, respectively.
-Valid values are PIPE, an existing file descriptor (a positive
-integer), an existing file object, and None. PIPE indicates that a
-new pipe to the child should be created. With None, no redirection
-will occur; the child's file handles will be inherited from the
-parent. Additionally, stderr can be STDOUT, which indicates that the
-stderr data from the applications should be captured into the same
-file handle as for stdout.
-
-On POSIX, if preexec_fn is set to a callable object, this object will be
-called in the child process just before the child is executed. The use
-of preexec_fn is not thread safe, using it in the presence of threads
-could lead to a deadlock in the child process before the new executable
-is executed.
-
-If close_fds is true, all file descriptors except 0, 1 and 2 will be
-closed before the child process is executed. The default for close_fds
-varies by platform: Always true on POSIX. True when stdin/stdout/stderr
-are None on Windows, false otherwise.
-
-pass_fds is an optional sequence of file descriptors to keep open between the
-parent and child. Providing any pass_fds implicitly sets close_fds to true.
-
-if shell is true, the specified command will be executed through the
-shell.
-
-If cwd is not None, the current directory will be changed to cwd
-before the child is executed.
-
-On POSIX, if restore_signals is True all signals that Python sets to
-SIG_IGN are restored to SIG_DFL in the child process before the exec.
-Currently this includes the SIGPIPE, SIGXFZ and SIGXFSZ signals. This
-parameter does nothing on Windows.
-
-On POSIX, if start_new_session is True, the setsid() system call will be made
-in the child process prior to executing the command.
-
-If env is not None, it defines the environment variables for the new
-process.
-
-If universal_newlines is true, the file objects stdout and stderr are
-opened as a text files, but lines may be terminated by any of '\n',
-the Unix end-of-line convention, '\r', the old Macintosh convention or
-'\r\n', the Windows convention. All of these external representations
-are seen as '\n' by the Python program. Note: This feature is only
-available if Python is built with universal newline support (the
-default). Also, the newlines attribute of the file objects stdout,
-stdin and stderr are not updated by the communicate() method.
-
-The startupinfo and creationflags, if given, will be passed to the
-underlying CreateProcess() function. They can specify things such as
-appearance of the main window and priority for the new process.
-(Windows only)
-
-
-This module also defines some shortcut functions:
-
-call(*popenargs, **kwargs):
- Run command with arguments. Wait for command to complete, then
- return the returncode attribute.
-
- The arguments are the same as for the Popen constructor. Example:
-
- >>> retcode = subprocess.call(["ls", "-l"])
-
-check_call(*popenargs, **kwargs):
- Run command with arguments. Wait for command to complete. If the
- exit code was zero then return, otherwise raise
- CalledProcessError. The CalledProcessError object will have the
- return code in the returncode attribute.
-
- The arguments are the same as for the Popen constructor. Example:
-
- >>> subprocess.check_call(["ls", "-l"])
- 0
-
-getstatusoutput(cmd):
- Return (status, output) of executing cmd in a shell.
-
- Execute the string 'cmd' in a shell with os.popen() and return a 2-tuple
- (status, output). cmd is actually run as '{ cmd ; } 2>&1', so that the
- returned output will contain output or error messages. A trailing newline
- is stripped from the output. The exit status for the command can be
- interpreted according to the rules for the C function wait(). Example:
-
- >>> subprocess.getstatusoutput('ls /bin/ls')
- (0, '/bin/ls')
- >>> subprocess.getstatusoutput('cat /bin/junk')
- (256, 'cat: /bin/junk: No such file or directory')
- >>> subprocess.getstatusoutput('/bin/junk')
- (256, 'sh: /bin/junk: not found')
-
-getoutput(cmd):
- Return output (stdout or stderr) of executing cmd in a shell.
-
- Like getstatusoutput(), except the exit status is ignored and the return
- value is a string containing the command's output. Example:
-
- >>> subprocess.getoutput('ls /bin/ls')
- '/bin/ls'
-
-check_output(*popenargs, **kwargs):
- Run command with arguments and return its output as a byte string.
-
- If the exit code was non-zero it raises a CalledProcessError. The
- CalledProcessError object will have the return code in the returncode
- attribute and output in the output attribute.
-
- The arguments are the same as for the Popen constructor. Example:
-
- >>> output = subprocess.check_output(["ls", "-l", "/dev/null"])
-
-
-Exceptions
-----------
-Exceptions raised in the child process, before the new program has
-started to execute, will be re-raised in the parent. Additionally,
-the exception object will have one extra attribute called
-'child_traceback', which is a string containing traceback information
-from the childs point of view.
-
-The most common exception raised is OSError. This occurs, for
-example, when trying to execute a non-existent file. Applications
-should prepare for OSErrors.
-
-A ValueError will be raised if Popen is called with invalid arguments.
-
-check_call() and check_output() will raise CalledProcessError, if the
-called process returns a non-zero return code.
-
-
-Security
---------
-Unlike some other popen functions, this implementation will never call
-/bin/sh implicitly. This means that all characters, including shell
-metacharacters, can safely be passed to child processes.
-
-
-Popen objects
-=============
-Instances of the Popen class have the following methods:
-
-poll()
- Check if child process has terminated. Returns returncode
- attribute.
-
-wait()
- Wait for child process to terminate. Returns returncode attribute.
-
-communicate(input=None)
- Interact with process: Send data to stdin. Read data from stdout
- and stderr, until end-of-file is reached. Wait for process to
- terminate. The optional input argument should be a string to be
- sent to the child process, or None, if no data should be sent to
- the child.
-
- communicate() returns a tuple (stdout, stderr).
-
- Note: The data read is buffered in memory, so do not use this
- method if the data size is large or unlimited.
-
-The following attributes are also available:
-
-stdin
- If the stdin argument is PIPE, this attribute is a file object
- that provides input to the child process. Otherwise, it is None.
-
-stdout
- If the stdout argument is PIPE, this attribute is a file object
- that provides output from the child process. Otherwise, it is
- None.
-
-stderr
- If the stderr argument is PIPE, this attribute is file object that
- provides error output from the child process. Otherwise, it is
- None.
-
-pid
- The process ID of the child process.
-
-returncode
- The child return code. A None value indicates that the process
- hasn't terminated yet. A negative value -N indicates that the
- child was terminated by signal N (POSIX only).
-
-
-Replacing older functions with the subprocess module
-====================================================
-In this section, "a ==> b" means that b can be used as a replacement
-for a.
-
-Note: All functions in this section fail (more or less) silently if
-the executed program cannot be found; this module raises an OSError
-exception.
-
-In the following examples, we assume that the subprocess module is
-imported with "from subprocess import *".
-
-
-Replacing /bin/sh shell backquote
----------------------------------
-output=`mycmd myarg`
-==>
-output = Popen(["mycmd", "myarg"], stdout=PIPE).communicate()[0]
-
-
-Replacing shell pipe line
--------------------------
-output=`dmesg | grep hda`
-==>
-p1 = Popen(["dmesg"], stdout=PIPE)
-p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
-output = p2.communicate()[0]
-
-
-Replacing os.system()
----------------------
-sts = os.system("mycmd" + " myarg")
-==>
-p = Popen("mycmd" + " myarg", shell=True)
-pid, sts = os.waitpid(p.pid, 0)
-
-Note:
-
-* Calling the program through the shell is usually not required.
-
-* It's easier to look at the returncode attribute than the
- exitstatus.
-
-A more real-world example would look like this:
-
-try:
- retcode = call("mycmd" + " myarg", shell=True)
- if retcode < 0:
- print("Child was terminated by signal", -retcode, file=sys.stderr)
- else:
- print("Child returned", retcode, file=sys.stderr)
-except OSError as e:
- print("Execution failed:", e, file=sys.stderr)
-
-
-Replacing os.spawn*
--------------------
-P_NOWAIT example:
-
-pid = os.spawnlp(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg")
-==>
-pid = Popen(["/bin/mycmd", "myarg"]).pid
-
-
-P_WAIT example:
-
-retcode = os.spawnlp(os.P_WAIT, "/bin/mycmd", "mycmd", "myarg")
-==>
-retcode = call(["/bin/mycmd", "myarg"])
-
-
-Vector example:
-
-os.spawnvp(os.P_NOWAIT, path, args)
-==>
-Popen([path] + args[1:])
-
-
-Environment example:
-
-os.spawnlpe(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg", env)
-==>
-Popen(["/bin/mycmd", "myarg"], env={"PATH": "/usr/bin"})
-"""
-
-import sys
-mswindows = (sys.platform == "win32")
-
-import io
-import os
-import traceback
-import gc
-import signal
-import builtins
-import warnings
-import errno
-
-from typing import (
- Any, Tuple, List, Sequence, Callable, Mapping, cast, Set, Dict, IO,
- TextIO, AnyStr
-)
-from types import TracebackType
-
-# Exception classes used by this module.
-class CalledProcessError(Exception):
- """This exception is raised when a process run by check_call() or
- check_output() returns a non-zero exit status.
- The exit status will be stored in the returncode attribute;
- check_output() will also store the output in the output attribute.
- """
- def __init__(self, returncode: int, cmd: str, output: Any = None) -> None:
- self.returncode = returncode
- self.cmd = cmd
- self.output = output
- def __str__(self) -> str:
- return "Command '%s' returned non-zero exit status %d" % (self.cmd, self.returncode)
-
-
-if mswindows:
- import threading
- import msvcrt
- import _subprocess
- class STARTUPINFO:
- dwFlags = 0
- hStdInput = cast(Any, None)
- hStdOutput = cast(Any, None)
- hStdError = cast(Any, None)
- wShowWindow = 0
- class pywintypes:
- error = IOError
-else:
- import select
- _has_poll = hasattr(select, 'poll')
- import fcntl
- import pickle
-
- try:
- import _posixsubprocess
- have_posixsubprocess = True
- except ImportError:
- have_posixsubprocess = False
- warnings.warn("The _posixsubprocess module is not being used. "
- "Child process reliability may suffer if your "
- "program uses threads.", RuntimeWarning)
-
- # When select or poll has indicated that the file is writable,
- # we can write up to _PIPE_BUF bytes without risk of blocking.
- # POSIX defines PIPE_BUF as >= 512.
- _PIPE_BUF = getattr(select, 'PIPE_BUF', 512) # type: int
-
- _FD_CLOEXEC = getattr(fcntl, 'FD_CLOEXEC', 1) # type: int
-
- def _set_cloexec(fd: int, cloexec: bool) -> None:
- old = fcntl.fcntl(fd, fcntl.F_GETFD)
- if cloexec:
- fcntl.fcntl(fd, fcntl.F_SETFD, old | _FD_CLOEXEC)
- else:
- fcntl.fcntl(fd, fcntl.F_SETFD, old & ~_FD_CLOEXEC)
-
- if have_posixsubprocess:
- _create_pipe = _posixsubprocess.cloexec_pipe
- else:
- def __create_pipe() -> Tuple[int, int]:
- fds = os.pipe()
- _set_cloexec(fds[0], True)
- _set_cloexec(fds[1], True)
- return fds
- _create_pipe = __create_pipe
-
-__all__ = ["Popen", "PIPE", "STDOUT", "call", "check_call", "getstatusoutput",
- "getoutput", "check_output", "CalledProcessError"]
-
-if mswindows:
- from _subprocess import (CREATE_NEW_CONSOLE, CREATE_NEW_PROCESS_GROUP,
- STD_INPUT_HANDLE, STD_OUTPUT_HANDLE,
- STD_ERROR_HANDLE, SW_HIDE,
- STARTF_USESTDHANDLES, STARTF_USESHOWWINDOW)
-
- __all__.extend(["CREATE_NEW_CONSOLE", "CREATE_NEW_PROCESS_GROUP",
- "STD_INPUT_HANDLE", "STD_OUTPUT_HANDLE",
- "STD_ERROR_HANDLE", "SW_HIDE",
- "STARTF_USESTDHANDLES", "STARTF_USESHOWWINDOW"])
-try:
- MAXFD = os.sysconf("SC_OPEN_MAX")
-except:
- MAXFD = 256
-
-# This lists holds Popen instances for which the underlying process had not
-# exited at the time its __del__ method got called: those processes are wait()ed
-# for synchronously from _cleanup() when a new Popen object is created, to avoid
-# zombie processes.
-_active = [] # type: List[Popen]
-
-def _cleanup() -> None:
- for inst in _active[:]:
- res = inst._internal_poll(_deadstate=sys.maxsize)
- if res is not None:
- try:
- _active.remove(inst)
- except ValueError:
- # This can happen if two threads create a new Popen instance.
- # It's harmless that it was already removed, so ignore.
- pass
-
-PIPE = -1
-STDOUT = -2
-
-
-def _eintr_retry_call(func: Any, *args: Any) -> Any:
- while True:
- try:
- return func(*args)
- except (OSError, IOError) as e:
- if e.errno == errno.EINTR:
- continue
- raise
-
-
-def call(*popenargs: Any, **kwargs: Any) -> int:
- """Run command with arguments. Wait for command to complete, then
- return the returncode attribute.
-
- The arguments are the same as for the Popen constructor. Example:
-
- retcode = call(["ls", "-l"])
- """
- return Popen(*popenargs, **kwargs).wait()
-
-
-def check_call(*popenargs: Any, **kwargs: Any) -> int:
- """Run command with arguments. Wait for command to complete. If
- the exit code was zero then return, otherwise raise
- CalledProcessError. The CalledProcessError object will have the
- return code in the returncode attribute.
-
- The arguments are the same as for the Popen constructor. Example:
-
- check_call(["ls", "-l"])
- """
- retcode = call(*popenargs, **kwargs)
- if retcode:
- cmd = kwargs.get("args")
- if cmd is None:
- cmd = popenargs[0]
- raise CalledProcessError(retcode, cmd)
- return 0
-
-
-def check_output(*popenargs: Any, **kwargs: Any) -> bytes:
- r"""Run command with arguments and return its output as a byte string.
-
- If the exit code was non-zero it raises a CalledProcessError. The
- CalledProcessError object will have the return code in the returncode
- attribute and output in the output attribute.
-
- The arguments are the same as for the Popen constructor. Example:
-
- >>> check_output(["ls", "-l", "/dev/null"])
- b'crw-rw-rw- 1 root root 1, 3 Oct 18 2007 /dev/null\n'
-
- The stdout argument is not allowed as it is used internally.
- To capture standard error in the result, use stderr=STDOUT.
-
- >>> check_output(["/bin/sh", "-c",
- ... "ls -l non_existent_file ; exit 0"],
- ... stderr=STDOUT)
- b'ls: non_existent_file: No such file or directory\n'
- """
- if 'stdout' in kwargs:
- raise ValueError('stdout argument not allowed, it will be overridden.')
- kwargs['stdout'] = PIPE
- process = Popen(*popenargs, **kwargs)
- output, unused_err = process.communicate()
- retcode = process.poll()
- if retcode:
- cmd = kwargs.get("args")
- if cmd is None:
- cmd = popenargs[0]
- raise CalledProcessError(retcode, cmd, output=output)
- return output
-
-
-def list2cmdline(seq: Sequence[str]) -> str:
- """
- Translate a sequence of arguments into a command line
- string, using the same rules as the MS C runtime:
-
- 1) Arguments are delimited by white space, which is either a
- space or a tab.
-
- 2) A string surrounded by double quotation marks is
- interpreted as a single argument, regardless of white space
- contained within. A quoted string can be embedded in an
- argument.
-
- 3) A double quotation mark preceded by a backslash is
- interpreted as a literal double quotation mark.
-
- 4) Backslashes are interpreted literally, unless they
- immediately precede a double quotation mark.
-
- 5) If backslashes immediately precede a double quotation mark,
- every pair of backslashes is interpreted as a literal
- backslash. If the number of backslashes is odd, the last
- backslash escapes the next double quotation mark as
- described in rule 3.
- """
-
- # See
- # http://msdn.microsoft.com/en-us/library/17w5ykft.aspx
- # or search http://msdn.microsoft.com for
- # "Parsing C++ Command-Line Arguments"
- result = [] # type: List[str]
- needquote = False
- for arg in seq:
- bs_buf = [] # type: List[str]
-
- # Add a space to separate this argument from the others
- if result:
- result.append(' ')
-
- needquote = (" " in arg) or ("\t" in arg) or not arg
- if needquote:
- result.append('"')
-
- for c in arg:
- if c == '\\':
- # Don't know if we need to double yet.
- bs_buf.append(c)
- elif c == '"':
- # Double backslashes.
- result.append('\\' * len(bs_buf)*2)
- bs_buf = []
- result.append('\\"')
- else:
- # Normal char
- if bs_buf:
- result.extend(bs_buf)
- bs_buf = []
- result.append(c)
-
- # Add remaining backslashes, if any.
- if bs_buf:
- result.extend(bs_buf)
-
- if needquote:
- result.extend(bs_buf)
- result.append('"')
-
- return ''.join(result)
-
-
-# Various tools for executing commands and looking at their output and status.
-#
-# NB This only works (and is only relevant) for POSIX.
-
-def getstatusoutput(cmd: str) -> Tuple[int, str]:
- """Return (status, output) of executing cmd in a shell.
-
- Execute the string 'cmd' in a shell with os.popen() and return a 2-tuple
- (status, output). cmd is actually run as '{ cmd ; } 2>&1', so that the
- returned output will contain output or error messages. A trailing newline
- is stripped from the output. The exit status for the command can be
- interpreted according to the rules for the C function wait(). Example:
-
- >>> import subprocess
- >>> subprocess.getstatusoutput('ls /bin/ls')
- (0, '/bin/ls')
- >>> subprocess.getstatusoutput('cat /bin/junk')
- (256, 'cat: /bin/junk: No such file or directory')
- >>> subprocess.getstatusoutput('/bin/junk')
- (256, 'sh: /bin/junk: not found')
- """
- pipe = os.popen('{ ' + cmd + '; } 2>&1', 'r')
- text = pipe.read()
- sts = pipe.close()
- if sts is None: sts = 0
- if text[-1:] == '\n': text = text[:-1]
- return sts, text
-
-
-def getoutput(cmd: str) -> str:
- """Return output (stdout or stderr) of executing cmd in a shell.
-
- Like getstatusoutput(), except the exit status is ignored and the return
- value is a string containing the command's output. Example:
-
- >>> import subprocess
- >>> subprocess.getoutput('ls /bin/ls')
- '/bin/ls'
- """
- return getstatusoutput(cmd)[1]
-
-
-_PLATFORM_DEFAULT_CLOSE_FDS = object()
-
-
-class Popen(object):
- def __init__(self, args: Sequence[Any], bufsize: int = 0,
- executable: str = None, stdin: Any = None,
- stdout: Any = None, stderr: Any = None,
- preexec_fn: Callable[[], Any] = None,
- close_fds: Any = _PLATFORM_DEFAULT_CLOSE_FDS,
- shell: int = False, cwd: str = None,
- env: Mapping[str, str] = None,
- universal_newlines: int = False,
- startupinfo: 'STARTUPINFO' = None, creationflags: int = 0,
- restore_signals: bool = True, start_new_session: bool = False,
- pass_fds: Any = ()) -> None:
- """Create new Popen instance."""
- _cleanup()
-
- self._child_created = False
- if bufsize is None:
- bufsize = 0 # Restore default
- if not isinstance(bufsize, int):
- raise TypeError("bufsize must be an integer")
-
- if mswindows:
- if preexec_fn is not None:
- raise ValueError("preexec_fn is not supported on Windows "
- "platforms")
- any_stdio_set = (stdin is not None or stdout is not None or
- stderr is not None)
- if close_fds is _PLATFORM_DEFAULT_CLOSE_FDS:
- if any_stdio_set:
- close_fds = False
- else:
- close_fds = True
- elif close_fds and any_stdio_set:
- raise ValueError(
- "close_fds is not supported on Windows platforms"
- " if you redirect stdin/stdout/stderr")
- else:
- # POSIX
- if close_fds is _PLATFORM_DEFAULT_CLOSE_FDS:
- close_fds = True
- if pass_fds and not close_fds:
- warnings.warn("pass_fds overriding close_fds.", RuntimeWarning)
- close_fds = True
- if startupinfo is not None:
- raise ValueError("startupinfo is only supported on Windows "
- "platforms")
- if creationflags != 0:
- raise ValueError("creationflags is only supported on Windows "
- "platforms")
-
- self.stdin = None # type: IO[Any]
- self.stdout = None # type: IO[Any]
- self.stderr = None # type: IO[Any]
- self.pid = None # type: int
- self.returncode = None # type: int
- self.universal_newlines = universal_newlines
-
- # Input and output objects. The general principle is like
- # this:
- #
- # Parent Child
- # ------ -----
- # p2cwrite ---stdin---> p2cread
- # c2pread <--stdout--- c2pwrite
- # errread <--stderr--- errwrite
- #
- # On POSIX, the child objects are file descriptors. On
- # Windows, these are Windows file handles. The parent objects
- # are file descriptors on both platforms. The parent objects
- # are -1 when not using PIPEs. The child objects are -1
- # when not redirecting.
-
- (p2cread, p2cwrite,
- c2pread, c2pwrite,
- errread, errwrite) = self._get_handles(stdin, stdout, stderr)
-
- # We wrap OS handles *before* launching the child, otherwise a
- # quickly terminating child could make our fds unwrappable
- # (see #8458).
-
- if mswindows:
- if p2cwrite != -1:
- p2cwrite = msvcrt.open_osfhandle(p2cwrite.Detach(), 0)
- if c2pread != -1:
- c2pread = msvcrt.open_osfhandle(c2pread.Detach(), 0)
- if errread != -1:
- errread = msvcrt.open_osfhandle(errread.Detach(), 0)
-
- if p2cwrite != -1:
- self.stdin = io.open(p2cwrite, 'wb', bufsize)
- if self.universal_newlines:
- self.stdin = io.TextIOWrapper(self.stdin, write_through=True)
- if c2pread != -1:
- self.stdout = io.open(c2pread, 'rb', bufsize)
- if universal_newlines:
- self.stdout = io.TextIOWrapper(self.stdout)
- if errread != -1:
- self.stderr = io.open(errread, 'rb', bufsize)
- if universal_newlines:
- self.stderr = io.TextIOWrapper(self.stderr)
-
- try:
- self._execute_child(args, executable, preexec_fn, close_fds,
- pass_fds, cwd, env, universal_newlines,
- startupinfo, creationflags, shell,
- p2cread, p2cwrite,
- c2pread, c2pwrite,
- errread, errwrite,
- restore_signals, start_new_session)
- except:
- # Cleanup if the child failed starting
- for f in filter(None, [self.stdin, self.stdout, self.stderr]):
- try:
- f.close()
- except EnvironmentError:
- # Ignore EBADF or other errors
- pass
- raise
-
-
- def _translate_newlines(self, data: bytes, encoding: str) -> str:
- data = data.replace(b"\r\n", b"\n").replace(b"\r", b"\n")
- return data.decode(encoding)
-
- def __enter__(self) -> 'Popen':
- return self
-
- def __exit__(self, type: type, value: BaseException,
- traceback: TracebackType) -> bool:
- if self.stdout:
- self.stdout.close()
- if self.stderr:
- self.stderr.close()
- if self.stdin:
- self.stdin.close()
- # Wait for the process to terminate, to avoid zombies.
- self.wait()
-
- def __del__(self, _maxsize: int = sys.maxsize,
- _active: List['Popen'] = _active) -> None:
- # If __init__ hasn't had a chance to execute (e.g. if it
- # was passed an undeclared keyword argument), we don't
- # have a _child_created attribute at all.
- if not getattr(self, '_child_created', False):
- # We didn't get to successfully create a child process.
- return
- # In case the child hasn't been waited on, check if it's done.
- self._internal_poll(_deadstate=_maxsize)
- if self.returncode is None and _active is not None:
- # Child is still running, keep us alive until we can wait on it.
- _active.append(self)
-
-
- def communicate(self, input: Any = None) -> Tuple[Any, Any]:
- """Interact with process: Send data to stdin. Read data from
- stdout and stderr, until end-of-file is reached. Wait for
- process to terminate. The optional input argument should be a
- string to be sent to the child process, or None, if no data
- should be sent to the child.
-
- communicate() returns a tuple (stdout, stderr)."""
-
- # Optimization: If we are only using one pipe, or no pipe at
- # all, using select() or threads is unnecessary.
- if [self.stdin, self.stdout, self.stderr].count(None) >= 2:
- stdout = None # type: IO[Any]
- stderr = None # type: IO[Any]
- if self.stdin:
- if input:
- try:
- self.stdin.write(input)
- except IOError as e:
- if e.errno != errno.EPIPE and e.errno != errno.EINVAL:
- raise
- self.stdin.close()
- elif self.stdout:
- stdout = _eintr_retry_call(self.stdout.read)
- self.stdout.close()
- elif self.stderr:
- stderr = _eintr_retry_call(self.stderr.read)
- self.stderr.close()
- self.wait()
- return (stdout, stderr)
-
- return self._communicate(input)
-
-
- def poll(self) -> int:
- return self._internal_poll()
-
-
- if mswindows:
- #
- # Windows methods
- #
- def _get_handles(self, stdin: Any, stdout: Any,
- stderr: Any) -> Tuple[Any, Any, Any, Any, Any, Any]:
- """Construct and return tuple with IO objects:
- p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite
- """
- if stdin is None and stdout is None and stderr is None:
- return (-1, -1, -1, -1, -1, -1)
-
- p2cread, p2cwrite = -1, -1 # type: (Any, Any)
- c2pread, c2pwrite = -1, -1 # type: (Any, Any)
- errread, errwrite = -1, -1 # type: (Any, Any)
-
- if stdin is None:
- p2cread = _subprocess.GetStdHandle(_subprocess.STD_INPUT_HANDLE)
- if p2cread is None:
- p2cread, _ = _subprocess.CreatePipe(None, 0)
- elif stdin == PIPE:
- p2cread, p2cwrite = _subprocess.CreatePipe(None, 0)
- elif isinstance(stdin, int):
- p2cread = msvcrt.get_osfhandle(stdin)
- else:
- # Assuming file-like object
- p2cread = msvcrt.get_osfhandle(stdin.fileno())
- p2cread = self._make_inheritable(p2cread)
-
- if stdout is None:
- c2pwrite = _subprocess.GetStdHandle(_subprocess.STD_OUTPUT_HANDLE)
- if c2pwrite is None:
- _, c2pwrite = _subprocess.CreatePipe(None, 0)
- elif stdout == PIPE:
- c2pread, c2pwrite = _subprocess.CreatePipe(None, 0)
- elif isinstance(stdout, int):
- c2pwrite = msvcrt.get_osfhandle(stdout)
- else:
- # Assuming file-like object
- c2pwrite = msvcrt.get_osfhandle(stdout.fileno())
- c2pwrite = self._make_inheritable(c2pwrite)
-
- if stderr is None:
- errwrite = _subprocess.GetStdHandle(_subprocess.STD_ERROR_HANDLE)
- if errwrite is None:
- _, errwrite = _subprocess.CreatePipe(None, 0)
- elif stderr == PIPE:
- errread, errwrite = _subprocess.CreatePipe(None, 0)
- elif stderr == STDOUT:
- errwrite = c2pwrite
- elif isinstance(stderr, int):
- errwrite = msvcrt.get_osfhandle(stderr)
- else:
- # Assuming file-like object
- errwrite = msvcrt.get_osfhandle(stderr.fileno())
- errwrite = self._make_inheritable(errwrite)
-
- return (p2cread, p2cwrite,
- c2pread, c2pwrite,
- errread, errwrite)
-
-
- def _make_inheritable(self, handle: _subprocess.Handle) -> int:
- """Return a duplicate of handle, which is inheritable"""
- return _subprocess.DuplicateHandle(_subprocess.GetCurrentProcess(),
- handle, _subprocess.GetCurrentProcess(), 0, 1,
- _subprocess.DUPLICATE_SAME_ACCESS)
-
-
- def _find_w9xpopen(self) -> str:
- """Find and return absolut path to w9xpopen.exe"""
- w9xpopen = os.path.join(
- os.path.dirname(_subprocess.GetModuleFileName(0)),
- "w9xpopen.exe")
- if not os.path.exists(w9xpopen):
- # Eeek - file-not-found - possibly an embedding
- # situation - see if we can locate it in sys.exec_prefix
- w9xpopen = os.path.join(os.path.dirname(sys.exec_prefix),
- "w9xpopen.exe")
- if not os.path.exists(w9xpopen):
- raise RuntimeError("Cannot locate w9xpopen.exe, which is "
- "needed for Popen to work with your "
- "shell or platform.")
- return w9xpopen
-
-
- def _execute_child(self, args: Sequence[str], executable: str,
- preexec_fn: Callable[[], Any], close_fds: Any,
- pass_fds: Any, cwd: str, env: Mapping[str, str],
- universal_newlines: int,
- startupinfo: STARTUPINFO, creationflags: int,
- shell: int,
- p2cread: Any, p2cwrite: Any,
- c2pread: Any, c2pwrite: Any,
- errread: Any, errwrite: Any,
- restore_signals: bool,
- start_new_session: bool) -> None:
- """Execute program (MS Windows version)"""
-
- assert not pass_fds, "pass_fds not supported on Windows."
-
- if not isinstance(args, str):
- args = list2cmdline(args)
-
- # Process startup details
- if startupinfo is None:
- startupinfo = STARTUPINFO()
- if -1 not in (p2cread, c2pwrite, errwrite):
- startupinfo.dwFlags |= _subprocess.STARTF_USESTDHANDLES
- startupinfo.hStdInput = p2cread
- startupinfo.hStdOutput = c2pwrite
- startupinfo.hStdError = errwrite
-
- if shell:
- startupinfo.dwFlags |= _subprocess.STARTF_USESHOWWINDOW
- startupinfo.wShowWindow = _subprocess.SW_HIDE
- comspec = os.environ.get("COMSPEC", "cmd.exe")
- args = '{} /c "{}"'.format (comspec, args)
- if (_subprocess.GetVersion() >= 0x80000000 or
- os.path.basename(comspec).lower() == "command.com"):
- # Win9x, or using command.com on NT. We need to
- # use the w9xpopen intermediate program. For more
- # information, see KB Q150956
- # (http://web.archive.org/web/20011105084002/http://support.microsoft.com/support/kb/articles/Q150/9/56.asp)
- w9xpopen = self._find_w9xpopen()
- args = '"%s" %s' % (w9xpopen, args)
- # Not passing CREATE_NEW_CONSOLE has been known to
- # cause random failures on win9x. Specifically a
- # dialog: "Your program accessed mem currently in
- # use at xxx" and a hopeful warning about the
- # stability of your system. Cost is Ctrl+C won't
- # kill children.
- creationflags |= _subprocess.CREATE_NEW_CONSOLE
-
- # Start the process
- try:
- hp, ht, pid, tid = _subprocess.CreateProcess(executable,
- cast(str, args),
- # no special security
- None, None,
- int(not close_fds),
- creationflags,
- env,
- cwd,
- startupinfo)
- except pywintypes.error as e:
- # Translate pywintypes.error to WindowsError, which is
- # a subclass of OSError. FIXME: We should really
- # translate errno using _sys_errlist (or similar), but
- # how can this be done from Python?
- raise WindowsError(*e.args)
- finally:
- # Child is launched. Close the parent's copy of those pipe
- # handles that only the child should have open. You need
- # to make sure that no handles to the write end of the
- # output pipe are maintained in this process or else the
- # pipe will not close when the child process exits and the
- # ReadFile will hang.
- if p2cread != -1:
- p2cread.Close()
- if c2pwrite != -1:
- c2pwrite.Close()
- if errwrite != -1:
- errwrite.Close()
-
- # Retain the process handle, but close the thread handle
- self._child_created = True
- self._handle = hp
- self.pid = pid
- ht.Close()
-
- def _internal_poll(self, _deadstate: int = None) -> int:
- """Check if child process has terminated. Returns returncode
- attribute.
-
- This method is called by __del__, so it can only refer to objects
- in its local scope.
-
- """
- return self._internal_poll_win(_deadstate)
-
- from _subprocess import Handle
-
- def _internal_poll_win(self, _deadstate: int = None,
- _WaitForSingleObject: Callable[[Handle, int], int] =
- _subprocess.WaitForSingleObject,
- _WAIT_OBJECT_0: int = _subprocess.WAIT_OBJECT_0,
- _GetExitCodeProcess: Callable[[Handle], int] =
- _subprocess.GetExitCodeProcess) -> int:
- if self.returncode is None:
- if _WaitForSingleObject(self._handle, 0) == _WAIT_OBJECT_0:
- self.returncode = _GetExitCodeProcess(self._handle)
- return self.returncode
-
-
- def wait(self) -> int:
- """Wait for child process to terminate. Returns returncode
- attribute."""
- if self.returncode is None:
- _subprocess.WaitForSingleObject(self._handle,
- _subprocess.INFINITE)
- self.returncode = _subprocess.GetExitCodeProcess(self._handle)
- return self.returncode
-
-
- def _readerthread(self, fh: IO[AnyStr], buffer: List[AnyStr]) -> None:
- buffer.append(fh.read())
- fh.close()
-
-
- def _communicate(self, input: Any) -> Tuple[Any, Any]:
- stdout = cast(Any, None) # Return
- stderr = cast(Any, None) # Return
-
- if self.stdout:
- stdout = []
- stdout_thread = threading.Thread(target=self._readerthread,
- args=(self.stdout, stdout))
- stdout_thread.daemon = True
- stdout_thread.start()
- if self.stderr:
- stderr = []
- stderr_thread = threading.Thread(target=self._readerthread,
- args=(self.stderr, stderr))
- stderr_thread.daemon = True
- stderr_thread.start()
-
- if self.stdin:
- if input is not None:
- try:
- self.stdin.write(input)
- except IOError as e:
- if e.errno != errno.EPIPE:
- raise
- self.stdin.close()
-
- if self.stdout:
- stdout_thread.join()
- if self.stderr:
- stderr_thread.join()
-
- # All data exchanged. Translate lists into strings.
- if stdout is not None:
- stdout = stdout[0]
- if stderr is not None:
- stderr = stderr[0]
-
- self.wait()
- return (stdout, stderr)
-
- def send_signal(self, sig: int) -> None:
- """Send a signal to the process
- """
- if sig == signal.SIGTERM:
- self.terminate()
- elif sig == signal.CTRL_C_EVENT:
- os.kill(self.pid, signal.CTRL_C_EVENT)
- elif sig == signal.CTRL_BREAK_EVENT:
- os.kill(self.pid, signal.CTRL_BREAK_EVENT)
- else:
- raise ValueError("Unsupported signal: {}".format(sig))
-
- def terminate(self) -> None:
- """Terminates the process
- """
- _subprocess.TerminateProcess(self._handle, 1)
-
- def kill(self) -> None:
- """Terminates the process
- """
- self.terminate()
-
- else:
- #
- # POSIX methods
- #
- def _get_handles(self, stdin: Any, stdout: Any,
- stderr: Any) -> Tuple[Any, Any, Any, Any, Any, Any]:
- """Construct and return tuple with IO objects:
- p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite
- """
- p2cread, p2cwrite = -1, -1
- c2pread, c2pwrite = -1, -1
- errread, errwrite = -1, -1
-
- if stdin is None:
- pass
- elif stdin == PIPE:
- p2cread, p2cwrite = _create_pipe()
- elif isinstance(stdin, int):
- p2cread = stdin
- else:
- # Assuming file-like object
- p2cread = stdin.fileno()
-
- if stdout is None:
- pass
- elif stdout == PIPE:
- c2pread, c2pwrite = _create_pipe()
- elif isinstance(stdout, int):
- c2pwrite = stdout
- else:
- # Assuming file-like object
- c2pwrite = stdout.fileno()
-
- if stderr is None:
- pass
- elif stderr == PIPE:
- errread, errwrite = _create_pipe()
- elif stderr == STDOUT:
- errwrite = c2pwrite
- elif isinstance(stderr, int):
- errwrite = stderr
- else:
- # Assuming file-like object
- errwrite = stderr.fileno()
-
- return (p2cread, p2cwrite,
- c2pread, c2pwrite,
- errread, errwrite)
-
-
- def _close_fds(self, fds_to_keep: Set[int]) -> None:
- start_fd = 3
- for fd in sorted(fds_to_keep):
- if fd >= start_fd:
- os.closerange(start_fd, fd)
- start_fd = fd + 1
- if start_fd <= MAXFD:
- os.closerange(start_fd, MAXFD)
-
-
- def _execute_child(self, args: Sequence[str], executable: str,
- preexec_fn: Callable[[], Any], close_fds: Any,
- pass_fds: Any, cwd: str, env: Mapping[str, str],
- universal_newlines: int,
- startupinfo: 'STARTUPINFO', creationflags: int,
- shell: int,
- p2cread: Any, p2cwrite: Any,
- c2pread: Any, c2pwrite: Any,
- errread: Any, errwrite: Any,
- restore_signals: bool,
- start_new_session: bool) -> None:
- """Execute program (POSIX version)"""
-
- if isinstance(args, str):
- args = [args]
- else:
- args = list(args)
-
- if shell:
- args = ["/bin/sh", "-c"] + args
- if executable:
- args[0] = executable
-
- if executable is None:
- executable = args[0]
-
- # For transferring possible exec failure from child to parent.
- # Data format: "exception name:hex errno:description"
- # Pickle is not used; it is complex and involves memory allocation.
- errpipe_read, errpipe_write = _create_pipe()
- try:
- try:
-
- if have_posixsubprocess:
- # We must avoid complex work that could involve
- # malloc or free in the child process to avoid
- # potential deadlocks, thus we do all this here.
- # and pass it to fork_exec()
-
- if env is not None:
- env_list = [os.fsencode(k) + b'=' + os.fsencode(v)
- for k, v in env.items()]
- else:
- env_list = None # Use execv instead of execve.
- executable_enc = os.fsencode(executable)
- if os.path.dirname(executable_enc):
- executable_list = (executable_enc,) # type: tuple
- else:
- # This matches the behavior of os._execvpe().
- executable_list = tuple(
- os.path.join(os.fsencode(dir), executable_enc)
- for dir in os.get_exec_path(env))
- fds_to_keep = set(pass_fds)
- fds_to_keep.add(errpipe_write)
- self.pid = _posixsubprocess.fork_exec(
- args, executable_list,
- close_fds, sorted(fds_to_keep), cwd, env_list,
- p2cread, p2cwrite, c2pread, c2pwrite,
- errread, errwrite,
- errpipe_read, errpipe_write,
- restore_signals, start_new_session, preexec_fn)
- self._child_created = True
- else:
- # Pure Python implementation: It is not thread safe.
- # This implementation may deadlock in the child if your
- # parent process has any other threads running.
-
- gc_was_enabled = gc.isenabled()
- # Disable gc to avoid bug where gc -> file_dealloc ->
- # write to stderr -> hang. See issue1336
- gc.disable()
- try:
- self.pid = os.fork()
- except:
- if gc_was_enabled:
- gc.enable()
- raise
- self._child_created = True
- if self.pid == 0:
- # Child
- try:
- # Close parent's pipe ends
- if p2cwrite != -1:
- os.close(p2cwrite)
- if c2pread != -1:
- os.close(c2pread)
- if errread != -1:
- os.close(errread)
- os.close(errpipe_read)
-
- # When duping fds, if there arises a situation
- # where one of the fds is either 0, 1 or 2, it
- # is possible that it is overwritten (#12607).
- if c2pwrite == 0:
- c2pwrite = os.dup(c2pwrite)
- if errwrite == 0 or errwrite == 1:
- errwrite = os.dup(errwrite)
-
- # Dup fds for child
- def _dup2(a: int, b: int) -> None:
- # dup2() removes the CLOEXEC flag but
- # we must do it ourselves if dup2()
- # would be a no-op (issue #10806).
- if a == b:
- _set_cloexec(a, False)
- elif a != -1:
- os.dup2(a, b)
- _dup2(p2cread, 0)
- _dup2(c2pwrite, 1)
- _dup2(errwrite, 2)
-
- # Close pipe fds. Make sure we don't close the
- # same fd more than once, or standard fds.
- closed = set() # type: Set[int]
- for fd in [p2cread, c2pwrite, errwrite]:
- if fd > 2 and fd not in closed:
- os.close(fd)
- closed.add(fd)
-
- # Close all other fds, if asked for
- if close_fds:
- fds_to_keep = set(pass_fds)
- fds_to_keep.add(errpipe_write)
- self._close_fds(fds_to_keep)
-
-
- if cwd is not None:
- os.chdir(cwd)
-
- # This is a copy of Python/pythonrun.c
- # _Py_RestoreSignals(). If that were exposed
- # as a sys._py_restoresignals func it would be
- # better.. but this pure python implementation
- # isn't likely to be used much anymore.
- if restore_signals:
- signals = ('SIGPIPE', 'SIGXFZ', 'SIGXFSZ')
- for sig in signals:
- if hasattr(signal, sig):
- signal.signal(getattr(signal, sig),
- signal.SIG_DFL)
-
- if start_new_session and hasattr(os, 'setsid'):
- os.setsid()
-
- if preexec_fn:
- preexec_fn()
-
- if env is None:
- os.execvp(executable, args)
- else:
- os.execvpe(executable, args, env)
-
- except:
- try:
- exc_type, exc_value = sys.exc_info()[:2]
- if isinstance(exc_value, OSError):
- errno_num = exc_value.errno
- else:
- errno_num = 0
- message = '%s:%x:%s' % (exc_type.__name__,
- errno_num, exc_value)
- messageb = message.encode(errors="surrogatepass")
- os.write(errpipe_write, messageb)
- except Exception:
- # We MUST not allow anything odd happening
- # above to prevent us from exiting below.
- pass
-
- # This exitcode won't be reported to applications
- # so it really doesn't matter what we return.
- os._exit(255)
-
- # Parent
- if gc_was_enabled:
- gc.enable()
- finally:
- # be sure the FD is closed no matter what
- os.close(errpipe_write)
-
- if p2cread != -1 and p2cwrite != -1:
- os.close(p2cread)
- if c2pwrite != -1 and c2pread != -1:
- os.close(c2pwrite)
- if errwrite != -1 and errread != -1:
- os.close(errwrite)
-
- # Wait for exec to fail or succeed; possibly raising an
- # exception (limited in size)
- data = bytearray()
- while True:
- part = _eintr_retry_call(os.read, errpipe_read, 50000)
- data += part
- if not part or len(data) > 50000:
- break
- finally:
- # be sure the FD is closed no matter what
- os.close(errpipe_read)
-
- if data:
- try:
- _eintr_retry_call(os.waitpid, self.pid, 0)
- except OSError as e:
- if e.errno != errno.ECHILD:
- raise
- try:
- (exception_name, hex_errno,
- err_msg_b) = bytes(data).split(b':', 2)
- except ValueError:
- print('Bad exception data:', repr(data))
- exception_name = b'RuntimeError'
- hex_errno = b'0'
- err_msg_b = b'Unknown'
- child_exception_type = getattr(
- builtins, exception_name.decode('ascii'),
- RuntimeError)
- for fd in (p2cwrite, c2pread, errread):
- if fd != -1:
- os.close(fd)
- err_msg = err_msg_b.decode(errors="surrogatepass")
- if issubclass(child_exception_type, OSError) and hex_errno:
- errno_num = int(hex_errno, 16)
- if errno_num != 0:
- err_msg = os.strerror(errno_num)
- if errno_num == errno.ENOENT:
- err_msg += ': ' + repr(args[0])
- raise child_exception_type(errno_num, err_msg)
- raise child_exception_type(err_msg)
-
-
- def _handle_exitstatus(
- self, sts: int,
- _WIFSIGNALED: Callable[[int], bool] = os.WIFSIGNALED,
- _WTERMSIG: Callable[[int], bool] = os.WTERMSIG,
- _WIFEXITED: Callable[[int], bool] = os.WIFEXITED,
- _WEXITSTATUS: Callable[[int], bool] = os.WEXITSTATUS) -> None:
- # This method is called (indirectly) by __del__, so it cannot
- # refer to anything outside of its local scope."""
- if _WIFSIGNALED(sts):
- self.returncode = -_WTERMSIG(sts)
- elif _WIFEXITED(sts):
- self.returncode = _WEXITSTATUS(sts)
- else:
- # Should never happen
- raise RuntimeError("Unknown child exit status!")
-
-
- def _internal_poll(self, _deadstate: int = None) -> int:
- """Check if child process has terminated. Returns returncode
- attribute.
-
- This method is called by __del__, so it cannot reference anything
- outside of the local scope (nor can any methods it calls).
-
- """
- return self._internal_poll_posix(_deadstate)
-
- def _internal_poll_posix(self, _deadstate: int = None,
- _waitpid: Callable[[int, int],
- Tuple[int, int]] = os.waitpid,
- _WNOHANG: int = os.WNOHANG,
- _os_error: Any = os.error) -> int:
- if self.returncode is None:
- try:
- pid, sts = _waitpid(self.pid, _WNOHANG)
- if pid == self.pid:
- self._handle_exitstatus(sts)
- except _os_error:
- if _deadstate is not None:
- self.returncode = _deadstate
- return self.returncode
-
-
- def wait(self) -> int:
- """Wait for child process to terminate. Returns returncode
- attribute."""
- if self.returncode is None:
- try:
- pid, sts = _eintr_retry_call(os.waitpid, self.pid, 0)
- except OSError as e:
- if e.errno != errno.ECHILD:
- raise
- # This happens if SIGCLD is set to be ignored or waiting
- # for child processes has otherwise been disabled for our
- # process. This child is dead, we can't get the status.
- sts = 0
- self._handle_exitstatus(sts)
- return self.returncode
-
-
- def _communicate(self, input: Any) -> Tuple[Any, Any]:
- if self.stdin:
- # Flush stdio buffer. This might block, if the user has
- # been writing to .stdin in an uncontrolled fashion.
- self.stdin.flush()
- if not input:
- self.stdin.close()
-
- if _has_poll:
- stdout, stderr = self._communicate_with_poll(input)
- else:
- stdout, stderr = self._communicate_with_select(input)
-
- # All data exchanged. Translate lists into strings.
- if stdout is not None:
- stdout2 = b''.join(stdout)
- else:
- stdout2 = None
- if stderr is not None:
- stderr2 = b''.join(stderr)
- else:
- stderr2 = None
-
- # Translate newlines, if requested.
- # This also turns bytes into strings.
- stdout3 = cast(Any, stdout2)
- stderr3 = cast(Any, stderr2)
- if self.universal_newlines:
- if stdout is not None:
- stdout3 = self._translate_newlines(
- stdout2, cast(TextIO, self.stdout).encoding)
- if stderr is not None:
- stderr3 = self._translate_newlines(
- stderr2, cast(TextIO, self.stderr).encoding)
-
- self.wait()
- return (stdout3, stderr3)
-
-
- def _communicate_with_poll(self, input: Any) -> Tuple[List[bytes],
- List[bytes]]:
- stdout = None # type: List[bytes] # Return
- stderr = None # type: List[bytes] # Return
- fd2file = {} # type: Dict[int, Any]
- fd2output = {} # type: Dict[int, List[bytes]]
-
- poller = select.poll()
- def register_and_append(file_obj: IO[Any], eventmask: int) -> None:
- poller.register(file_obj.fileno(), eventmask)
- fd2file[file_obj.fileno()] = file_obj
-
- def close_unregister_and_remove(fd: int) -> None:
- poller.unregister(fd)
- fd2file[fd].close()
- fd2file.pop(fd)
-
- if self.stdin and input:
- register_and_append(self.stdin, select.POLLOUT)
-
- select_POLLIN_POLLPRI = select.POLLIN | select.POLLPRI
- if self.stdout:
- register_and_append(self.stdout, select_POLLIN_POLLPRI)
- fd2output[self.stdout.fileno()] = stdout = []
- if self.stderr:
- register_and_append(self.stderr, select_POLLIN_POLLPRI)
- fd2output[self.stderr.fileno()] = stderr = []
-
- input_offset = 0
- while fd2file:
- try:
- ready = poller.poll()
- except select.error as e:
- if e.args[0] == errno.EINTR:
- continue
- raise
-
- # XXX Rewrite these to use non-blocking I/O on the
- # file objects; they are no longer using C stdio!
-
- for fd, mode in ready:
- if mode & select.POLLOUT:
- chunk = input[input_offset : input_offset + _PIPE_BUF]
- try:
- input_offset += os.write(fd, chunk)
- except OSError as e2:
- if e2.errno == errno.EPIPE:
- close_unregister_and_remove(fd)
- else:
- raise
- else:
- if input_offset >= len(input):
- close_unregister_and_remove(fd)
- elif mode & select_POLLIN_POLLPRI:
- data = os.read(fd, 4096)
- if not data:
- close_unregister_and_remove(fd)
- fd2output[fd].append(data)
- else:
- # Ignore hang up or errors.
- close_unregister_and_remove(fd)
-
- return (stdout, stderr)
-
-
- def _communicate_with_select(self, input: Any) -> Tuple[List[bytes],
- List[bytes]]:
- read_set = [] # type: List[IO[Any]]
- write_set = [] # type: List[IO[Any]]
- stdout = None # type: List[bytes] # Return
- stderr = None # type: List[bytes] # Return
-
- if self.stdin and input:
- write_set.append(self.stdin)
- if self.stdout:
- read_set.append(self.stdout)
- stdout = []
- if self.stderr:
- read_set.append(self.stderr)
- stderr = []
-
- input_offset = 0
- while read_set or write_set:
- try:
- rlist, wlist, xlist = select.select(read_set, write_set, [])
- except select.error as e:
- if e.args[0] == errno.EINTR:
- continue
- raise
-
- # XXX Rewrite these to use non-blocking I/O on the
- # file objects; they are no longer using C stdio!
-
- if self.stdin in wlist:
- chunk = input[input_offset : input_offset + _PIPE_BUF]
- try:
- bytes_written = os.write(self.stdin.fileno(), chunk)
- except OSError as oe:
- if oe.errno == errno.EPIPE:
- self.stdin.close()
- write_set.remove(self.stdin)
- else:
- raise
- else:
- input_offset += bytes_written
- if input_offset >= len(input):
- self.stdin.close()
- write_set.remove(self.stdin)
-
- if self.stdout in rlist:
- data = os.read(self.stdout.fileno(), 1024)
- if not data:
- self.stdout.close()
- read_set.remove(self.stdout)
- stdout.append(data)
-
- if self.stderr in rlist:
- data = os.read(self.stderr.fileno(), 1024)
- if not data:
- self.stderr.close()
- read_set.remove(self.stderr)
- stderr.append(data)
-
- return (stdout, stderr)
-
-
- def send_signal(self, sig: int) -> None:
- """Send a signal to the process
- """
- os.kill(self.pid, sig)
-
- def terminate(self) -> None:
- """Terminate the process with SIGTERM
- """
- self.send_signal(signal.SIGTERM)
-
- def kill(self) -> None:
- """Kill the process with SIGKILL
- """
- self.send_signal(signal.SIGKILL)
-
-
-def _demo_posix() -> None:
- #
- # Example 1: Simple redirection: Get process list
- #
- plist = Popen(["ps"], stdout=PIPE).communicate()[0]
- print("Process list:")
- print(plist)
-
- #
- # Example 2: Change uid before executing child
- #
- if os.getuid() == 0:
- p = Popen(["id"], preexec_fn=lambda: os.setuid(100))
- p.wait()
-
- #
- # Example 3: Connecting several subprocesses
- #
- print("Looking for 'hda'...")
- p1 = Popen(["dmesg"], stdout=PIPE)
- p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
- print(repr(p2.communicate()[0]))
-
- #
- # Example 4: Catch execution error
- #
- print()
- print("Trying a weird file...")
- try:
- print(Popen(["/this/path/does/not/exist"]).communicate())
- except OSError as e:
- if e.errno == errno.ENOENT:
- print("The file didn't exist. I thought so...")
- else:
- print("Error", e.errno)
- else:
- print("Gosh. No error.", file=sys.stderr)
-
-
-def _demo_windows() -> None:
- #
- # Example 1: Connecting several subprocesses
- #
- print("Looking for 'PROMPT' in set output...")
- p1 = Popen("set", stdout=PIPE, shell=True)
- p2 = Popen('find "PROMPT"', stdin=p1.stdout, stdout=PIPE)
- print(repr(p2.communicate()[0]))
-
- #
- # Example 2: Simple execution of program
- #
- print("Executing calc...")
- p = Popen("calc")
- p.wait()
-
-
-if __name__ == "__main__":
- if mswindows:
- _demo_windows()
- else:
- _demo_posix()
diff --git a/test-data/stdlib-samples/3.2/tempfile.py b/test-data/stdlib-samples/3.2/tempfile.py
deleted file mode 100644
index d12e21e..0000000
--- a/test-data/stdlib-samples/3.2/tempfile.py
+++ /dev/null
@@ -1,717 +0,0 @@
-"""Temporary files.
-
-This module provides generic, low- and high-level interfaces for
-creating temporary files and directories. The interfaces listed
-as "safe" just below can be used without fear of race conditions.
-Those listed as "unsafe" cannot, and are provided for backward
-compatibility only.
-
-This module also provides some data items to the user:
-
- TMP_MAX - maximum number of names that will be tried before
- giving up.
- template - the default prefix for all temporary names.
- You may change this to control the default prefix.
- tempdir - If this is set to a string before the first use of
- any routine from this module, it will be considered as
- another candidate location to store temporary files.
-"""
-
-__all__ = [
- "NamedTemporaryFile", "TemporaryFile", # high level safe interfaces
- "SpooledTemporaryFile", "TemporaryDirectory",
- "mkstemp", "mkdtemp", # low level safe interfaces
- "mktemp", # deprecated unsafe interface
- "TMP_MAX", "gettempprefix", # constants
- "tempdir", "gettempdir"
- ]
-
-
-# Imports.
-
-import warnings as _warnings
-import sys as _sys
-import io as _io
-import os as _os
-import errno as _errno
-from random import Random as _Random
-
-from typing import (
- Any as _Any, Callable as _Callable, Iterator as _Iterator,
- List as _List, Tuple as _Tuple, Dict as _Dict, Iterable as _Iterable,
- IO as _IO, cast as _cast, Optional as _Optional, Type as _Type,
-)
-from types import TracebackType as _TracebackType
-
-try:
- import fcntl as _fcntl
-except ImportError:
- def _set_cloexec(fd: int) -> None:
- pass
-else:
- def _set_cloexec(fd: int) -> None:
- try:
- flags = _fcntl.fcntl(fd, _fcntl.F_GETFD, 0)
- except IOError:
- pass
- else:
- # flags read successfully, modify
- flags |= _fcntl.FD_CLOEXEC
- _fcntl.fcntl(fd, _fcntl.F_SETFD, flags)
-
-
-try:
- import _thread
- _allocate_lock = _thread.allocate_lock # type: _Callable[[], _Any]
-except ImportError:
- import _dummy_thread
- _allocate_lock = _dummy_thread.allocate_lock
-
-_text_openflags = _os.O_RDWR | _os.O_CREAT | _os.O_EXCL
-if hasattr(_os, 'O_NOINHERIT'):
- _text_openflags |= _os.O_NOINHERIT
-if hasattr(_os, 'O_NOFOLLOW'):
- _text_openflags |= _os.O_NOFOLLOW
-
-_bin_openflags = _text_openflags
-if hasattr(_os, 'O_BINARY'):
- _bin_openflags |= _os.O_BINARY
-
-if hasattr(_os, 'TMP_MAX'):
- TMP_MAX = _os.TMP_MAX
-else:
- TMP_MAX = 10000
-
-template = "tmp"
-
-# Internal routines.
-
-_once_lock = _allocate_lock()
-
-if hasattr(_os, "lstat"):
- _stat = _os.lstat # type: _Callable[[str], object]
-elif hasattr(_os, "stat"):
- _stat = _os.stat
-else:
- # Fallback. All we need is something that raises os.error if the
- # file doesn't exist.
- def __stat(fn: str) -> object:
- try:
- f = open(fn)
- except IOError:
- raise _os.error()
- f.close()
- _stat = __stat
-
-def _exists(fn: str) -> bool:
- try:
- _stat(fn)
- except _os.error:
- return False
- else:
- return True
-
-class _RandomNameSequence(_Iterator[str]):
- """An instance of _RandomNameSequence generates an endless
- sequence of unpredictable strings which can safely be incorporated
- into file names. Each string is six characters long. Multiple
- threads can safely use the same instance at the same time.
-
- _RandomNameSequence is an iterator."""
-
- characters = "abcdefghijklmnopqrstuvwxyz0123456789_"
-
- @property
- def rng(self) -> _Random:
- cur_pid = _os.getpid()
- if cur_pid != getattr(self, '_rng_pid', None):
- self._rng = _Random()
- self._rng_pid = cur_pid
- return self._rng
-
- def __iter__(self) -> _Iterator[str]:
- return self
-
- def __next__(self) -> str:
- c = self.characters
- choose = self.rng.choice
- letters = [choose(c) for dummy in "123456"]
- return ''.join(letters)
-
-def _candidate_tempdir_list() -> _List[str]:
- """Generate a list of candidate temporary directories which
- _get_default_tempdir will try."""
-
- dirlist = [] # type: _List[str]
-
- # First, try the environment.
- for envname in 'TMPDIR', 'TEMP', 'TMP':
- dirname = _os.getenv(envname)
- if dirname: dirlist.append(dirname)
-
- # Failing that, try OS-specific locations.
- if _os.name == 'nt':
- dirlist.extend([ r'c:\temp', r'c:\tmp', r'\temp', r'\tmp' ])
- else:
- dirlist.extend([ '/tmp', '/var/tmp', '/usr/tmp' ])
-
- # As a last resort, the current directory.
- try:
- dirlist.append(_os.getcwd())
- except (AttributeError, _os.error):
- dirlist.append(_os.curdir)
-
- return dirlist
-
-def _get_default_tempdir() -> str:
- """Calculate the default directory to use for temporary files.
- This routine should be called exactly once.
-
- We determine whether or not a candidate temp dir is usable by
- trying to create and write to a file in that directory. If this
- is successful, the test file is deleted. To prevent denial of
- service, the name of the test file must be randomized."""
-
- namer = _RandomNameSequence()
- dirlist = _candidate_tempdir_list()
-
- for dir in dirlist:
- if dir != _os.curdir:
- dir = _os.path.normcase(_os.path.abspath(dir))
- # Try only a few names per directory.
- for seq in range(100):
- name = next(namer)
- filename = _os.path.join(dir, name)
- try:
- fd = _os.open(filename, _bin_openflags, 0o600)
- fp = _io.open(fd, 'wb')
- fp.write(b'blat')
- fp.close()
- _os.unlink(filename)
- fp = fd = None
- return dir
- except (OSError, IOError) as e:
- if e.args[0] != _errno.EEXIST:
- break # no point trying more names in this directory
- pass
- raise IOError(_errno.ENOENT,
- "No usable temporary directory found in %s" % dirlist)
-
-_name_sequence = None # type: _RandomNameSequence
-
-def _get_candidate_names() -> _RandomNameSequence:
- """Common setup sequence for all user-callable interfaces."""
-
- global _name_sequence
- if _name_sequence is None:
- _once_lock.acquire()
- try:
- if _name_sequence is None:
- _name_sequence = _RandomNameSequence()
- finally:
- _once_lock.release()
- return _name_sequence
-
-
-def _mkstemp_inner(dir: str, pre: str, suf: str,
- flags: int) -> _Tuple[int, str]:
- """Code common to mkstemp, TemporaryFile, and NamedTemporaryFile."""
-
- names = _get_candidate_names()
-
- for seq in range(TMP_MAX):
- name = next(names)
- file = _os.path.join(dir, pre + name + suf)
- try:
- fd = _os.open(file, flags, 0o600)
- _set_cloexec(fd)
- return (fd, _os.path.abspath(file))
- except OSError as e:
- if e.errno == _errno.EEXIST:
- continue # try again
- raise
-
- raise IOError(_errno.EEXIST, "No usable temporary file name found")
-
-
-# User visible interfaces.
-
-def gettempprefix() -> str:
- """Accessor for tempdir.template."""
- return template
-
-tempdir = None # type: str
-
-def gettempdir() -> str:
- """Accessor for tempfile.tempdir."""
- global tempdir
- if tempdir is None:
- _once_lock.acquire()
- try:
- if tempdir is None:
- tempdir = _get_default_tempdir()
- finally:
- _once_lock.release()
- return tempdir
-
-def mkstemp(suffix: str = "", prefix: str = template, dir: str = None,
- text: bool = False) -> _Tuple[int, str]:
- """User-callable function to create and return a unique temporary
- file. The return value is a pair (fd, name) where fd is the
- file descriptor returned by os.open, and name is the filename.
-
- If 'suffix' is specified, the file name will end with that suffix,
- otherwise there will be no suffix.
-
- If 'prefix' is specified, the file name will begin with that prefix,
- otherwise a default prefix is used.
-
- If 'dir' is specified, the file will be created in that directory,
- otherwise a default directory is used.
-
- If 'text' is specified and true, the file is opened in text
- mode. Else (the default) the file is opened in binary mode. On
- some operating systems, this makes no difference.
-
- The file is readable and writable only by the creating user ID.
- If the operating system uses permission bits to indicate whether a
- file is executable, the file is executable by no one. The file
- descriptor is not inherited by children of this process.
-
- Caller is responsible for deleting the file when done with it.
- """
-
- if dir is None:
- dir = gettempdir()
-
- if text:
- flags = _text_openflags
- else:
- flags = _bin_openflags
-
- return _mkstemp_inner(dir, prefix, suffix, flags)
-
-
-def mkdtemp(suffix: str = "", prefix: str = template, dir: str = None) -> str:
- """User-callable function to create and return a unique temporary
- directory. The return value is the pathname of the directory.
-
- Arguments are as for mkstemp, except that the 'text' argument is
- not accepted.
-
- The directory is readable, writable, and searchable only by the
- creating user.
-
- Caller is responsible for deleting the directory when done with it.
- """
-
- if dir is None:
- dir = gettempdir()
-
- names = _get_candidate_names()
-
- for seq in range(TMP_MAX):
- name = next(names)
- file = _os.path.join(dir, prefix + name + suffix)
- try:
- _os.mkdir(file, 0o700)
- return file
- except OSError as e:
- if e.errno == _errno.EEXIST:
- continue # try again
- raise
-
- raise IOError(_errno.EEXIST, "No usable temporary directory name found")
-
-def mktemp(suffix: str = "", prefix: str = template, dir: str = None) -> str:
- """User-callable function to return a unique temporary file name. The
- file is not created.
-
- Arguments are as for mkstemp, except that the 'text' argument is
- not accepted.
-
- This function is unsafe and should not be used. The file name
- refers to a file that did not exist at some point, but by the time
- you get around to creating it, someone else may have beaten you to
- the punch.
- """
-
-## from warnings import warn as _warn
-## _warn("mktemp is a potential security risk to your program",
-## RuntimeWarning, stacklevel=2)
-
- if dir is None:
- dir = gettempdir()
-
- names = _get_candidate_names()
- for seq in range(TMP_MAX):
- name = next(names)
- file = _os.path.join(dir, prefix + name + suffix)
- if not _exists(file):
- return file
-
- raise IOError(_errno.EEXIST, "No usable temporary filename found")
-
-
-class _TemporaryFileWrapper:
- """Temporary file wrapper
-
- This class provides a wrapper around files opened for
- temporary use. In particular, it seeks to automatically
- remove the file when it is no longer needed.
- """
-
- def __init__(self, file: _IO[_Any], name: str,
- delete: bool = True) -> None:
- self.file = file
- self.name = name
- self.close_called = False
- self.delete = delete
-
- if _os.name != 'nt':
- # Cache the unlinker so we don't get spurious errors at
- # shutdown when the module-level "os" is None'd out. Note
- # that this must be referenced as self.unlink, because the
- # name TemporaryFileWrapper may also get None'd out before
- # __del__ is called.
- self.unlink = _os.unlink
-
- def __getattr__(self, name: str) -> _Any:
- # Attribute lookups are delegated to the underlying file
- # and cached for non-numeric results
- # (i.e. methods are cached, closed and friends are not)
- file = _cast(_Any, self).__dict__['file'] # type: _IO[_Any]
- a = getattr(file, name)
- if not isinstance(a, int):
- setattr(self, name, a)
- return a
-
- # The underlying __enter__ method returns the wrong object
- # (self.file) so override it to return the wrapper
- def __enter__(self) -> '_TemporaryFileWrapper':
- self.file.__enter__()
- return self
-
- # iter() doesn't use __getattr__ to find the __iter__ method
- def __iter__(self) -> _Iterator[_Any]:
- return iter(self.file)
-
- # NT provides delete-on-close as a primitive, so we don't need
- # the wrapper to do anything special. We still use it so that
- # file.name is useful (i.e. not "(fdopen)") with NamedTemporaryFile.
- if _os.name != 'nt':
- def close(self) -> None:
- if not self.close_called:
- self.close_called = True
- self.file.close()
- if self.delete:
- self.unlink(self.name)
-
- def __del__(self) -> None:
- self.close()
-
- # Need to trap __exit__ as well to ensure the file gets
- # deleted when used in a with statement
- def __exit__(self, exc: _Type[BaseException], value: BaseException,
- tb: _Optional[_TracebackType]) -> bool:
- result = self.file.__exit__(exc, value, tb)
- self.close()
- return result
- else:
- def __exit__(self, exc: _Type[BaseException], value: BaseException,
- tb: _Optional[_TracebackType]) -> bool:
- self.file.__exit__(exc, value, tb)
-
-
-def NamedTemporaryFile(mode: str = 'w+b', buffering: int = -1,
- encoding: str = None, newline: str = None,
- suffix: str = "", prefix: str = template,
- dir: str = None, delete: bool = True) -> _IO[_Any]:
- """Create and return a temporary file.
- Arguments:
- 'prefix', 'suffix', 'dir' -- as for mkstemp.
- 'mode' -- the mode argument to io.open (default "w+b").
- 'buffering' -- the buffer size argument to io.open (default -1).
- 'encoding' -- the encoding argument to io.open (default None)
- 'newline' -- the newline argument to io.open (default None)
- 'delete' -- whether the file is deleted on close (default True).
- The file is created as mkstemp() would do it.
-
- Returns an object with a file-like interface; the name of the file
- is accessible as file.name. The file will be automatically deleted
- when it is closed unless the 'delete' argument is set to False.
- """
-
- if dir is None:
- dir = gettempdir()
-
- flags = _bin_openflags
-
- # Setting O_TEMPORARY in the flags causes the OS to delete
- # the file when it is closed. This is only supported by Windows.
- if _os.name == 'nt' and delete:
- flags |= _os.O_TEMPORARY
-
- (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
- file = _io.open(fd, mode, buffering=buffering,
- newline=newline, encoding=encoding)
-
- return _cast(_IO[_Any], _TemporaryFileWrapper(file, name, delete))
-
-if _os.name != 'posix' or _sys.platform == 'cygwin':
- # On non-POSIX and Cygwin systems, assume that we cannot unlink a file
- # while it is open.
- TemporaryFile = NamedTemporaryFile
-
-else:
- def _TemporaryFile(mode: str = 'w+b', buffering: int = -1,
- encoding: str = None, newline: str = None,
- suffix: str = "", prefix: str = template,
- dir: str = None, delete: bool = True) -> _IO[_Any]:
- """Create and return a temporary file.
- Arguments:
- 'prefix', 'suffix', 'dir' -- as for mkstemp.
- 'mode' -- the mode argument to io.open (default "w+b").
- 'buffering' -- the buffer size argument to io.open (default -1).
- 'encoding' -- the encoding argument to io.open (default None)
- 'newline' -- the newline argument to io.open (default None)
- The file is created as mkstemp() would do it.
-
- Returns an object with a file-like interface. The file has no
- name, and will cease to exist when it is closed.
- """
-
- if dir is None:
- dir = gettempdir()
-
- flags = _bin_openflags
-
- (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
- try:
- _os.unlink(name)
- return _io.open(fd, mode, buffering=buffering,
- newline=newline, encoding=encoding)
- except:
- _os.close(fd)
- raise
- TemporaryFile = _TemporaryFile
-
-class SpooledTemporaryFile:
- """Temporary file wrapper, specialized to switch from
- StringIO to a real file when it exceeds a certain size or
- when a fileno is needed.
- """
- _rolled = False
- _file = None # type: _Any # BytesIO, StringIO or TemporaryFile
-
- def __init__(self, max_size: int = 0, mode: str = 'w+b',
- buffering: int = -1, encoding: str = None,
- newline: str = None, suffix: str = "",
- prefix: str = template, dir: str = None) -> None:
- if 'b' in mode:
- self._file = _io.BytesIO()
- else:
- # Setting newline="\n" avoids newline translation;
- # this is important because otherwise on Windows we'd
- # hget double newline translation upon rollover().
- self._file = _io.StringIO(newline="\n")
- self._max_size = max_size
- self._rolled = False
- self._TemporaryFileArgs = {
- 'mode': mode, 'buffering': buffering,
- 'suffix': suffix, 'prefix': prefix,
- 'encoding': encoding, 'newline': newline,
- 'dir': dir} # type: _Dict[str, _Any]
-
- def _check(self, file: _IO[_Any]) -> None:
- if self._rolled: return
- max_size = self._max_size
- if max_size and file.tell() > max_size:
- self.rollover()
-
- def rollover(self) -> None:
- if self._rolled: return
- file = self._file
- newfile = self._file = TemporaryFile(**self._TemporaryFileArgs)
- self._TemporaryFileArgs = None
-
- newfile.write(file.getvalue())
- newfile.seek(file.tell(), 0)
-
- self._rolled = True
-
- # The method caching trick from NamedTemporaryFile
- # won't work here, because _file may change from a
- # _StringIO instance to a real file. So we list
- # all the methods directly.
-
- # Context management protocol
- def __enter__(self) -> 'SpooledTemporaryFile':
- if self._file.closed:
- raise ValueError("Cannot enter context with closed file")
- return self
-
- def __exit__(self, exc: type, value: BaseException,
- tb: _TracebackType) -> bool:
- self._file.close()
-
- # file protocol
- def __iter__(self) -> _Iterable[_Any]:
- return self._file.__iter__()
-
- def close(self) -> None:
- self._file.close()
-
- @property
- def closed(self) -> bool:
- return self._file.closed
-
- @property
- def encoding(self) -> str:
- return self._file.encoding
-
- def fileno(self) -> int:
- self.rollover()
- return self._file.fileno()
-
- def flush(self) -> None:
- self._file.flush()
-
- def isatty(self) -> bool:
- return self._file.isatty()
-
- @property
- def mode(self) -> str:
- return self._file.mode
-
- @property
- def name(self) -> str:
- return self._file.name
-
- @property
- def newlines(self) -> _Any:
- return self._file.newlines
-
- #def next(self):
- # return self._file.next
-
- def read(self, n: int = -1) -> _Any:
- return self._file.read(n)
-
- def readline(self, limit: int = -1) -> _Any:
- return self._file.readline(limit)
-
- def readlines(self, *args) -> _List[_Any]:
- return self._file.readlines(*args)
-
- def seek(self, offset: int, whence: int = 0) -> None:
- self._file.seek(offset, whence)
-
- @property
- def softspace(self) -> bool:
- return self._file.softspace
-
- def tell(self) -> int:
- return self._file.tell()
-
- def truncate(self) -> None:
- self._file.truncate()
-
- def write(self, s: _Any) -> int:
- file = self._file # type: _IO[_Any]
- rv = file.write(s)
- self._check(file)
- return rv
-
- def writelines(self, iterable: _Iterable[_Any]) -> None:
- file = self._file # type: _IO[_Any]
- file.writelines(iterable)
- self._check(file)
-
- #def xreadlines(self, *args) -> _Any:
- # return self._file.xreadlines(*args)
-
-
-class TemporaryDirectory(object):
- """Create and return a temporary directory. This has the same
- behavior as mkdtemp but can be used as a context manager. For
- example:
-
- with TemporaryDirectory() as tmpdir:
- ...
-
- Upon exiting the context, the directory and everthing contained
- in it are removed.
- """
-
- def __init__(self, suffix: str = "", prefix: str = template,
- dir: str = None) -> None:
- self._closed = False
- self.name = None # type: str # Handle mkdtemp throwing an exception
- self.name = mkdtemp(suffix, prefix, dir)
-
- # XXX (ncoghlan): The following code attempts to make
- # this class tolerant of the module nulling out process
- # that happens during CPython interpreter shutdown
- # Alas, it doesn't actually manage it. See issue #10188
- self._listdir = _os.listdir
- self._path_join = _os.path.join
- self._isdir = _os.path.isdir
- self._islink = _os.path.islink
- self._remove = _os.remove
- self._rmdir = _os.rmdir
- self._os_error = _os.error
- self._warn = _warnings.warn
-
- def __repr__(self) -> str:
- return "<{} {!r}>".format(self.__class__.__name__, self.name)
-
- def __enter__(self) -> str:
- return self.name
-
- def cleanup(self, _warn: bool = False) -> None:
- if self.name and not self._closed:
- try:
- self._rmtree(self.name)
- except (TypeError, AttributeError) as ex:
- # Issue #10188: Emit a warning on stderr
- # if the directory could not be cleaned
- # up due to missing globals
- if "None" not in str(ex):
- raise
- print("ERROR: {!r} while cleaning up {!r}".format(ex, self,),
- file=_sys.stderr)
- return
- self._closed = True
- if _warn:
- self._warn("Implicitly cleaning up {!r}".format(self),
- ResourceWarning)
-
- def __exit__(self, exc: type, value: BaseException,
- tb: _TracebackType) -> bool:
- self.cleanup()
-
- def __del__(self) -> None:
- # Issue a ResourceWarning if implicit cleanup needed
- self.cleanup(_warn=True)
-
- def _rmtree(self, path: str) -> None:
- # Essentially a stripped down version of shutil.rmtree. We can't
- # use globals because they may be None'ed out at shutdown.
- for name in self._listdir(path):
- fullname = self._path_join(path, name)
- try:
- isdir = self._isdir(fullname) and not self._islink(fullname)
- except self._os_error:
- isdir = False
- if isdir:
- self._rmtree(fullname)
- else:
- try:
- self._remove(fullname)
- except self._os_error:
- pass
- try:
- self._rmdir(path)
- except self._os_error:
- pass
diff --git a/test-data/stdlib-samples/3.2/test/randv2_32.pck b/test-data/stdlib-samples/3.2/test/randv2_32.pck
deleted file mode 100644
index 587ab24..0000000
--- a/test-data/stdlib-samples/3.2/test/randv2_32.pck
+++ /dev/null
@@ -1,633 +0,0 @@
-crandom
-Random
-p0
-(tRp1
-(I2
-(I-2147483648
-I-845974985
-I-1294090086
-I1193659239
-I-1849481736
-I-946579732
-I-34406770
-I1749049471
-I1997774682
-I1432026457
-I1288127073
-I-943175655
-I-1718073964
-I339993548
-I-1045260575
-I582505037
-I-1555108250
-I-1114765620
-I1578648750
-I-350384412
-I-20845848
-I-288255314
-I738790953
-I1901249641
-I1999324672
-I-277361068
-I-1515885839
-I2061761596
-I-809068089
-I1287981136
-I258129492
-I-6303745
-I-765148337
-I1090344911
-I1653434703
-I-1242923628
-I1639171313
-I-1870042660
-I-1655014050
-I345609048
-I2093410138
-I1963263374
-I-2122098342
-I1336859961
-I-810942729
-I945857753
-I2103049942
-I623922684
-I1418349549
-I690877342
-I754973107
-I-1605111847
-I1607137813
-I-1704917131
-I1317536428
-I1714882872
-I-1665385120
-I1823694397
-I-1790836866
-I-1696724812
-I-603979847
-I-498599394
-I-341265291
-I927388804
-I1778562135
-I1716895781
-I1023198122
-I1726145967
-I941955525
-I1240148950
-I-1929634545
-I-1288147083
-I-519318335
-I754559777
-I-707571958
-I374604022
-I420424061
-I-1095443486
-I1621934944
-I-1220502522
-I-140049608
-I-918917122
-I304341024
-I-1637446057
-I-353934485
-I1973436235
-I433380241
-I-686759465
-I-2111563154
-I-573422032
-I804304541
-I1513063483
-I1417381689
-I-804778729
-I211756408
-I544537322
-I890881641
-I150378374
-I1765739392
-I1011604116
-I584889095
-I1400520554
-I413747808
-I-1741992587
-I-1882421574
-I-1373001903
-I-1885348538
-I903819480
-I1083220038
-I-1318105424
-I1740421404
-I1693089625
-I775965557
-I1319608037
-I-2127475785
-I-367562895
-I-1416273451
-I1693000327
-I-1217438421
-I834405522
-I-128287275
-I864057548
-I-973917356
-I7304111
-I1712253182
-I1353897741
-I672982288
-I1778575559
-I-403058377
-I-38540378
-I-1393713496
-I13193171
-I1127196200
-I205176472
-I-2104790506
-I299985416
-I1403541685
-I-1018270667
-I-1980677490
-I-1182625797
-I1637015181
-I-1795357414
-I1514413405
-I-924516237
-I-1841873650
-I-1014591269
-I1576616065
-I-1319103135
-I-120847840
-I2062259778
-I-9285070
-I1160890300
-I-575137313
-I-1509108275
-I46701926
-I-287560914
-I-256824960
-I577558250
-I900598310
-I944607867
-I2121154920
-I-1170505192
-I-1347170575
-I77247778
-I-1899015765
-I1234103327
-I1027053658
-I1934632322
-I-792031234
-I1147322536
-I1290655117
-I1002059715
-I1325898538
-I896029793
-I-790940694
-I-980470721
-I-1922648255
-I-951672814
-I291543943
-I1158740218
-I-1959023736
-I-1977185236
-I1527900076
-I514104195
-I-814154113
-I-593157883
-I-1023704660
-I1285688377
-I-2117525386
-I768954360
-I-38676846
-I-799848659
-I-1305517259
-I-1938213641
-I-462146758
-I-1663302892
-I1899591069
-I-22935388
-I-275856976
-I-443736893
-I-739441156
-I93862068
-I-838105669
-I1735629845
-I-817484206
-I280814555
-I1753547179
-I1811123479
-I1974543632
-I-48447465
-I-642694345
-I-531149613
-I518698953
-I-221642627
-I-686519187
-I776644303
-I257774400
-I-1499134857
-I-1055273455
-I-237023943
-I1981752330
-I-917671662
-I-372905983
-I1588058420
-I1171936660
-I-1730977121
-I1360028989
-I1769469287
-I1910709542
-I-852692959
-I1396944667
-I-1723999155
-I-310975435
-I-1965453954
-I-1636858570
-I2005650794
-I680293715
-I1355629386
-I844514684
-I-1909152807
-I-808646074
-I1936510018
-I1134413810
-I-143411047
-I-1478436304
-I1394969244
-I-1170110660
-I1963112086
-I-1518351049
-I-1506287443
-I-455023090
-I-855366028
-I-1746785568
-I933990882
-I-703625141
-I-285036872
-I188277905
-I1471578620
-I-981382835
-I-586974220
-I945619758
-I1608778444
-I-1708548066
-I-1897629320
-I-42617810
-I-836840790
-I539154487
-I-235706962
-I332074418
-I-575700589
-I1534608003
-I632116560
-I-1819760653
-I642052958
-I-722391771
-I-1104719475
-I-1196847084
-I582413973
-I1563394876
-I642007944
-I108989456
-I361625014
-I677308625
-I-1806529496
-I-959050708
-I-1858251070
-I-216069832
-I701624579
-I501238033
-I12287030
-I1895107107
-I2089098638
-I-874806230
-I1236279203
-I563718890
-I-544352489
-I-1879707498
-I1767583393
-I-1776604656
-I-693294301
-I-88882831
-I169303357
-I1299196152
-I-1122791089
-I-379157172
-I1934671851
-I1575736961
-I-19573174
-I-1401511009
-I9305167
-I-1115174467
-I1670735537
-I1226436501
-I-2004524535
-I1767463878
-I-1722855079
-I-559413926
-I1529810851
-I1201272087
-I-1297130971
-I-1188149982
-I1396557188
-I-370358342
-I-1006619702
-I1600942463
-I906087130
-I-76991909
-I2069580179
-I-1674195181
-I-2098404729
-I-940972459
-I-573399187
-I-1930386277
-I-721311199
-I-647834744
-I1452181671
-I688681916
-I1812793731
-I1704380620
-I-1389615179
-I866287837
-I-1435265007
-I388400782
-I-147986600
-I-1613598851
-I-1040347408
-I782063323
-I-239282031
-I-575966722
-I-1865208174
-I-481365146
-I579572803
-I-1239481494
-I335361280
-I-429722947
-I1881772789
-I1908103808
-I1653690013
-I-1668588344
-I1933787953
-I-2033480609
-I22162797
-I-1516527040
-I-461232482
-I-16201372
-I-2043092030
-I114990337
-I-1524090084
-I1456374020
-I458606440
-I-1928083218
-I227773125
-I-1129028159
-I1678689
-I1575896907
-I-1792935220
-I-151387575
-I64084088
-I-95737215
-I1337335688
-I-1963466345
-I1243315130
-I-1798518411
-I-546013212
-I-607065396
-I1219824160
-I1715218469
-I-1368163783
-I1701552913
-I-381114888
-I1068821717
-I266062971
-I-2066513172
-I1767407229
-I-780936414
-I-705413443
-I-1256268847
-I1646874149
-I1107690353
-I839133072
-I67001749
-I860763503
-I884880613
-I91977084
-I755371933
-I420745153
-I-578480690
-I-1520193551
-I1011369331
-I-99754575
-I-733141064
-I-500598588
-I1081124271
-I-1341266575
-I921002612
-I-848852487
-I-1904467341
-I-1294256973
-I-94074714
-I-1778758498
-I-1401188547
-I2101830578
-I2058864877
-I-272875991
-I-1375854779
-I-1332937870
-I619425525
-I-1034529639
-I-36454393
-I-2030499985
-I-1637127500
-I-1408110287
-I-2108625749
-I-961007436
-I1475654951
-I-791946251
-I1667792115
-I1818978830
-I1897980514
-I1959546477
-I-74478911
-I-508643347
-I461594399
-I538802715
-I-2094970071
-I-2076660253
-I1091358944
-I1944029246
-I-343957436
-I-1915845022
-I1237620188
-I1144125174
-I1522190520
-I-670252952
-I-19469226
-I675626510
-I758750096
-I909724354
-I-1846259652
-I544669343
-I445182495
-I-821519930
-I-1124279685
-I-1668995122
-I1653284793
-I-678555151
-I-687513207
-I1558259445
-I-1978866839
-I1558835601
-I1732138472
-I-1904793363
-I620020296
-I1562597874
-I1942617227
-I-549632552
-I721603795
-I417978456
-I-1355281522
-I-538065208
-I-1079523196
-I187375699
-I449064972
-I1018083947
-I1632388882
-I-493269866
-I92769041
-I1477146750
-I1782708404
-I444873376
-I1085851104
-I-6823272
-I-1302251853
-I1602050688
-I-1042187824
-I287161745
-I-1972094479
-I103271491
-I2131619773
-I-2064115870
-I766815498
-I990861458
-I-1664407378
-I1083746756
-I-1018331904
-I-677315687
-I-951670647
-I-952356874
-I451460609
-I-818615564
-I851439508
-I656362634
-I-1351240485
-I823378078
-I1985597385
-I597757740
-I-1512303057
-I1590872798
-I1108424213
-I818850898
-I-1368594306
-I-201107761
-I1793370378
-I1247597611
-I-1594326264
-I-601653890
-I427642759
-I248322113
-I-292545338
-I1708985870
-I1917042771
-I429354503
-I-478470329
-I793960014
-I369939133
-I1728189157
-I-518963626
-I-278523974
-I-1877289696
-I-2088617658
-I-1367940049
-I-62295925
-I197975119
-I-252900777
-I803430539
-I485759441
-I-528283480
-I-1287443963
-I-478617444
-I-861906946
-I-649095555
-I-893184337
-I2050571322
-I803433133
-I1629574571
-I1649720417
-I-2050225209
-I1208598977
-I720314344
-I-615166251
-I-835077127
-I-1405372429
-I995698064
-I148123240
-I-943016676
-I-594609622
-I-1381596711
-I1017195301
-I-1268893013
-I-1815985179
-I-1393570351
-I-870027364
-I-476064472
-I185582645
-I569863326
-I1098584267
-I-1599147006
-I-485054391
-I-852098365
-I1477320135
-I222316762
-I-1515583064
-I-935051367
-I393383063
-I819617226
-I722921837
-I-1241806499
-I-1358566385
-I1666813591
-I1333875114
-I-1663688317
-I-47254623
-I-885800726
-I307388991
-I-1219459496
-I1374870300
-I2132047877
-I-1385624198
-I-245139206
-I1015139214
-I-926198559
-I1969798868
-I-1950480619
-I-559193432
-I-1256446518
-I-1983476981
-I790179655
-I1004289659
-I1541827617
-I1555805575
-I501127333
-I-1123446797
-I-453230915
-I2035104883
-I1296122398
-I-1843698604
-I-715464588
-I337143971
-I-1972119192
-I606777909
-I726977302
-I-1149501872
-I-1963733522
-I-1797504644
-I624
-tp2
-Ntp3
-b.
\ No newline at end of file
diff --git a/test-data/stdlib-samples/3.2/test/randv2_64.pck b/test-data/stdlib-samples/3.2/test/randv2_64.pck
deleted file mode 100644
index 090dd6f..0000000
--- a/test-data/stdlib-samples/3.2/test/randv2_64.pck
+++ /dev/null
@@ -1,633 +0,0 @@
-crandom
-Random
-p0
-(tRp1
-(I2
-(I2147483648
-I1812115682
-I2741755497
-I1028055730
-I809166036
-I2773628650
-I62321950
-I535290043
-I349877800
-I976167039
-I2490696940
-I3631326955
-I2107991114
-I2941205793
-I3199611605
-I1871971556
-I1456108540
-I2984591044
-I140836801
-I4203227310
-I3652722980
-I4031971234
-I555769760
-I697301296
-I2347638880
-I3302335858
-I320255162
-I2553586608
-I1570224361
-I2838780912
-I2315834918
-I2351348158
-I3545433015
-I2292018579
-I1177569331
-I758497559
-I2913311175
-I1014948880
-I1793619243
-I3982451053
-I3850988342
-I2393984324
-I1583100093
-I3144742543
-I3655047493
-I3507532385
-I3094515442
-I350042434
-I2455294844
-I1038739312
-I313809152
-I189433072
-I1653165452
-I4186650593
-I19281455
-I2589680619
-I4145931590
-I4283266118
-I636283172
-I943618337
-I3170184633
-I2308766231
-I634615159
-I538152647
-I2079576891
-I1029442616
-I3410689412
-I1370292761
-I1071718978
-I2139496322
-I1876699543
-I3485866187
-I3157490130
-I1633105386
-I1453253160
-I3841322080
-I3789608924
-I4110770792
-I95083673
-I931354627
-I2065389591
-I3448339827
-I3348204577
-I3263528560
-I2411324590
-I4003055026
-I1869670093
-I2737231843
-I4150701155
-I2689667621
-I2993263224
-I3239890140
-I1191430483
-I1214399779
-I3623428533
-I1817058866
-I3052274451
-I326030082
-I1505129312
-I2306812262
-I1349150363
-I1099127895
-I2543465574
-I2396380193
-I503926466
-I1607109730
-I3451716817
-I58037114
-I4290081119
-I947517597
-I3083440186
-I520522630
-I2948962496
-I4184319574
-I2957636335
-I668374201
-I2325446473
-I472785314
-I3791932366
-I573017189
-I2185725379
-I1262251492
-I3525089379
-I2951262653
-I1305347305
-I940958122
-I3343754566
-I359371744
-I3874044973
-I396897232
-I147188248
-I716683703
-I4013880315
-I1133359586
-I1794612249
-I3480815192
-I3988787804
-I1729355809
-I573408542
-I1419310934
-I1770030447
-I3552845567
-I1693976502
-I1271189893
-I2298236738
-I2049219027
-I3464198070
-I1233574082
-I1007451781
-I1838253750
-I687096593
-I1131375603
-I1223013895
-I1490478435
-I339265439
-I4232792659
-I491538536
-I2816256769
-I1044097522
-I2566227049
-I748762793
-I1511830494
-I3593259822
-I4121279213
-I3735541309
-I3609794797
-I1939942331
-I377570434
-I1437957554
-I1831285696
-I55062811
-I2046783110
-I1303902283
-I1838349877
-I420993556
-I1256392560
-I2795216506
-I2783687924
-I3322303169
-I512794749
-I308405826
-I517164429
-I3320436022
-I1328403632
-I2269184746
-I3729522810
-I3304314450
-I2238756124
-I1690581361
-I3813277532
-I4119706879
-I2659447875
-I388818978
-I2064580814
-I1586227676
-I2627522685
-I2017792269
-I547928109
-I859107450
-I1062238929
-I858886237
-I3795783146
-I4173914756
-I3835915965
-I3329504821
-I3494579904
-I838863205
-I3399734724
-I4247387481
-I3618414834
-I2984433798
-I2165205561
-I4260685684
-I3045904244
-I3450093836
-I3597307595
-I3215851166
-I3162801328
-I2558283799
-I950068105
-I1829664117
-I3108542987
-I2378860527
-I790023460
-I280087750
-I1171478018
-I2333653728
-I3976932140
-I896746152
-I1802494195
-I1232873794
-I2749440836
-I2032037296
-I2012091682
-I1296131034
-I3892133385
-I908161334
-I2296791795
-I548169794
-I696265
-I893156828
-I426904709
-I3565374535
-I2655906825
-I2792178515
-I2406814632
-I4038847579
-I3123934642
-I2197503004
-I3535032597
-I2266216689
-I2117613462
-I1787448518
-I1875089416
-I2037165384
-I1140676321
-I3606296464
-I3229138231
-I2458267132
-I1874651171
-I3331900867
-I1000557654
-I1432861701
-I473636323
-I2691783927
-I1871437447
-I1328016401
-I4118690062
-I449467602
-I681789035
-I864889442
-I1200888928
-I75769445
-I4008690037
-I2464577667
-I4167795823
-I3070097648
-I2579174882
-I1216886568
-I3810116343
-I2249507485
-I3266903480
-I3671233480
-I100191658
-I3087121334
-I365063087
-I3821275176
-I2165052848
-I1282465245
-I3601570637
-I3132413236
-I2780570459
-I3222142917
-I3129794692
-I2611590811
-I947031677
-I2991908938
-I750997949
-I3632575131
-I1632014461
-I2846484755
-I2347261779
-I2903959448
-I1397316686
-I1904578392
-I774649578
-I3164598558
-I2429587609
-I738244516
-I1563304975
-I1399317414
-I1021316297
-I3187933234
-I2126780757
-I4011907847
-I4095169219
-I3358010054
-I2729978247
-I3736811646
-I3009656410
-I2893043637
-I4027447385
-I1239610110
-I1488806900
-I2674866844
-I442876374
-I2853687260
-I2785921005
-I3151378528
-I1180567
-I2803146964
-I982221759
-I2192919417
-I3087026181
-I2480838002
-I738452921
-I687986185
-I3049371676
-I3636492954
-I3468311299
-I2379621102
-I788988633
-I1643210601
-I2983998168
-I2492730801
-I2586048705
-I604073029
-I4121082815
-I1496476928
-I2972357110
-I2663116968
-I2642628592
-I2116052039
-I487186279
-I2577680328
-I3974766614
-I730776636
-I3842528855
-I1929093695
-I44626622
-I3989908833
-I1695426222
-I3675479382
-I3051784964
-I1514876613
-I1254036595
-I2420450649
-I3034377361
-I2332990590
-I1535175126
-I185834384
-I1107372900
-I1707278185
-I1286285295
-I3332574225
-I2785672437
-I883170645
-I2005666473
-I3403131327
-I4122021352
-I1464032858
-I3702576112
-I260554598
-I1837731650
-I2594435345
-I75771049
-I2012484289
-I3058649775
-I29979703
-I3861335335
-I2506495152
-I3786448704
-I442947790
-I2582724774
-I4291336243
-I2568189843
-I1923072690
-I1121589611
-I837696302
-I3284631720
-I3865021324
-I3576453165
-I2559531629
-I1459231762
-I3506550036
-I3754420159
-I2622000757
-I124228596
-I1084328605
-I1692830753
-I547273558
-I674282621
-I655259103
-I3188629610
-I490502174
-I2081001293
-I3191330704
-I4109943593
-I1859948504
-I3163806460
-I508833168
-I1256371033
-I2709253790
-I2068956572
-I3092842814
-I3913926529
-I2039638759
-I981982529
-I536094190
-I368855295
-I51993975
-I1597480732
-I4058175522
-I2155896702
-I3196251991
-I1081913893
-I3952353788
-I3545548108
-I2370669647
-I2206572308
-I2576392991
-I1732303374
-I1153136290
-I537641955
-I1738691747
-I3232854186
-I2539632206
-I2829760278
-I3058187853
-I1202425792
-I3762361970
-I2863949342
-I2640635867
-I376638744
-I1857679757
-I330798087
-I1457400505
-I1135610046
-I606400715
-I1859536026
-I509811335
-I529772308
-I2579273244
-I1890382004
-I3959908876
-I2612335971
-I2834052227
-I1434475986
-I3684202717
-I4015011345
-I582567852
-I3689969571
-I3934753460
-I3034960691
-I208573292
-I4004113742
-I3992904842
-I2587153719
-I3529179079
-I1565424987
-I779130678
-I1048582935
-I3213591622
-I3607793434
-I3951254937
-I2047811901
-I7508850
-I248544605
-I4210090324
-I2331490884
-I70057213
-I776474945
-I1345528889
-I3290403612
-I1664955269
-I1533143116
-I545003424
-I4141564478
-I1257326139
-I868843601
-I2337603029
-I1918131449
-I1843439523
-I1125519035
-I673340118
-I421408852
-I1520454906
-I1804722630
-I3621254196
-I2329968000
-I39464672
-I430583134
-I294026512
-I53978525
-I2892276105
-I1418863764
-I3419054451
-I1391595797
-I3544981798
-I4191780858
-I825672357
-I2972000844
-I1571305069
-I4231982845
-I3611916419
-I3045163168
-I2982349733
-I278572141
-I4215338078
-I839860504
-I1819151779
-I1412347479
-I1386770353
-I3914589491
-I3783104977
-I4124296733
-I830546258
-I89825624
-I4110601328
-I2545483429
-I300600527
-I516641158
-I3693021034
-I2852912854
-I3240039868
-I4167407959
-I1479557946
-I3621188804
-I1391590944
-I3578441128
-I1227055556
-I406898396
-I3064054983
-I25835338
-I402664165
-I4097682779
-I2106728012
-I203613622
-I3045467686
-I1381726438
-I3798670110
-I1342314961
-I3552497361
-I535913619
-I2625787583
-I1606574307
-I1101269630
-I1950513752
-I1121355862
-I3586816903
-I438529984
-I2473182121
-I1229997203
-I405445940
-I1695535315
-I427014336
-I3916768430
-I392298359
-I1884642868
-I1244730821
-I741058080
-I567479957
-I3527621168
-I3191971011
-I3267069104
-I4108668146
-I1520795587
-I166581006
-I473794477
-I1562126550
-I929843010
-I889533294
-I1266556608
-I874518650
-I3520162092
-I3013765049
-I4220231414
-I547246449
-I3998093769
-I3737193746
-I3872944207
-I793651876
-I2606384318
-I875991012
-I1394836334
-I4102011644
-I854380426
-I2618666767
-I2568302000
-I1995512132
-I229491093
-I2673500286
-I3364550739
-I3836923416
-I243656987
-I3944388983
-I4064949677
-I1416956378
-I1703244487
-I3990798829
-I2023425781
-I3926702214
-I1229015501
-I3174247824
-I624
-tp2
-Ntp3
-b.
\ No newline at end of file
diff --git a/test-data/stdlib-samples/3.2/test/randv3.pck b/test-data/stdlib-samples/3.2/test/randv3.pck
deleted file mode 100644
index 09fc38b..0000000
--- a/test-data/stdlib-samples/3.2/test/randv3.pck
+++ /dev/null
@@ -1,633 +0,0 @@
-crandom
-Random
-p0
-(tRp1
-(I3
-(L2147483648L
-L994081831L
-L2806287265L
-L2228999830L
-L3396498069L
-L2956805457L
-L3273927761L
-L920726507L
-L1862624492L
-L2921292485L
-L1779526843L
-L2469105503L
-L251696293L
-L1254390717L
-L779197080L
-L3165356830L
-L2007365218L
-L1870028812L
-L2896519363L
-L1855578438L
-L979518416L
-L3481710246L
-L3191861507L
-L3993006593L
-L2967971479L
-L3353342753L
-L3576782572L
-L339685558L
-L2367675732L
-L116208555L
-L1220054437L
-L486597056L
-L1912115141L
-L1037044792L
-L4096904723L
-L3409146175L
-L3701651227L
-L315824610L
-L4138604583L
-L1385764892L
-L191878900L
-L2320582219L
-L3420677494L
-L2776503169L
-L1148247403L
-L829555069L
-L902064012L
-L2934642741L
-L2477108577L
-L2583928217L
-L1658612579L
-L2865447913L
-L129147346L
-L3691171887L
-L1569328110L
-L1372860143L
-L1054139183L
-L1617707080L
-L69020592L
-L3810271603L
-L1853953416L
-L3499803073L
-L1027545027L
-L3229043605L
-L250848720L
-L3324932626L
-L3537002962L
-L2494323345L
-L3238103962L
-L4147541579L
-L3636348186L
-L3025455083L
-L2678771977L
-L584700256L
-L3461826909L
-L854511420L
-L943463552L
-L3609239025L
-L3977577989L
-L253070090L
-L777394544L
-L2144086567L
-L1092947992L
-L854327284L
-L2222750082L
-L360183510L
-L1312466483L
-L3227531091L
-L2235022500L
-L3013060530L
-L2541091298L
-L3480126342L
-L1839762775L
-L2632608190L
-L1108889403L
-L3045050923L
-L731513126L
-L3505436788L
-L3062762017L
-L1667392680L
-L1354126500L
-L1143573930L
-L2816645702L
-L2100356873L
-L2817679106L
-L1210746010L
-L2409915248L
-L2910119964L
-L2309001420L
-L220351824L
-L3667352871L
-L3993148590L
-L2886160232L
-L4239393701L
-L1189270581L
-L3067985541L
-L147374573L
-L2355164869L
-L3696013550L
-L4227037846L
-L1905112743L
-L3312843689L
-L2930678266L
-L1828795355L
-L76933594L
-L3987100796L
-L1288361435L
-L3464529151L
-L965498079L
-L1444623093L
-L1372893415L
-L1536235597L
-L1341994850L
-L963594758L
-L2115295754L
-L982098685L
-L1053433904L
-L2078469844L
-L3059765792L
-L1753606181L
-L2130171254L
-L567588194L
-L529629426L
-L3621523534L
-L3027576564L
-L1176438083L
-L4096287858L
-L1168574683L
-L1425058962L
-L1429631655L
-L2902106759L
-L761900641L
-L1329183956L
-L1947050932L
-L447490289L
-L3282516276L
-L200037389L
-L921868197L
-L3331403999L
-L4088760249L
-L2188326318L
-L288401961L
-L1360802675L
-L314302808L
-L3314639210L
-L3749821203L
-L2286081570L
-L2768939062L
-L3200541016L
-L2133495482L
-L385029880L
-L4217232202L
-L3171617231L
-L1660846653L
-L2459987621L
-L2691776124L
-L4225030408L
-L3595396773L
-L1103680661L
-L539064057L
-L1492841101L
-L166195394L
-L757973658L
-L533893054L
-L2784879594L
-L1021821883L
-L2350548162L
-L176852116L
-L3503166025L
-L148079914L
-L1633466236L
-L2773090165L
-L1162846701L
-L3575737795L
-L1624178239L
-L2454894710L
-L3014691938L
-L526355679L
-L1870824081L
-L3362425857L
-L3907566665L
-L3462563184L
-L2229112004L
-L4203735748L
-L1557442481L
-L924133999L
-L1906634214L
-L880459727L
-L4065895870L
-L141426254L
-L1258450159L
-L3243115027L
-L1574958840L
-L313939294L
-L3055664260L
-L3459714255L
-L531778790L
-L509505506L
-L1620227491L
-L2675554942L
-L2516509560L
-L3797299887L
-L237135890L
-L3203142213L
-L1087745310L
-L1897151854L
-L3936590041L
-L132765167L
-L2385908063L
-L1360600289L
-L3574567769L
-L2752788114L
-L2644228966L
-L2377705183L
-L601277909L
-L4046480498L
-L324401408L
-L3279931760L
-L2227059377L
-L1538827493L
-L4220532064L
-L478044564L
-L2917117761L
-L635492832L
-L2319763261L
-L795944206L
-L1820473234L
-L1673151409L
-L1404095402L
-L1661067505L
-L3217106938L
-L2406310683L
-L1931309248L
-L2458622868L
-L3323670524L
-L3266852755L
-L240083943L
-L3168387397L
-L607722198L
-L1256837690L
-L3608124913L
-L4244969357L
-L1289959293L
-L519750328L
-L3229482463L
-L1105196988L
-L1832684479L
-L3761037224L
-L2363631822L
-L3297957711L
-L572766355L
-L1195822137L
-L2239207981L
-L2034241203L
-L163540514L
-L288160255L
-L716403680L
-L4019439143L
-L1536281935L
-L2345100458L
-L2786059178L
-L2822232109L
-L987025395L
-L3061166559L
-L490422513L
-L2551030115L
-L2638707620L
-L1344728502L
-L714108911L
-L2831719700L
-L2188615369L
-L373509061L
-L1351077504L
-L3136217056L
-L783521095L
-L2554949468L
-L2662499550L
-L1203826951L
-L1379632388L
-L1918858985L
-L607465976L
-L1980450237L
-L3540079211L
-L3397813410L
-L2913309266L
-L2289572621L
-L4133935327L
-L4166227663L
-L3371801704L
-L3065474909L
-L3580562343L
-L3832172378L
-L2556130719L
-L310473705L
-L3734014346L
-L2490413810L
-L347233056L
-L526668037L
-L1158393656L
-L544329703L
-L2150085419L
-L3914038146L
-L1060237586L
-L4159394837L
-L113205121L
-L309966775L
-L4098784465L
-L3635222960L
-L2417516569L
-L2089579233L
-L1725807541L
-L2728122526L
-L2365836523L
-L2504078522L
-L1443946869L
-L2384171411L
-L997046534L
-L3249131657L
-L1699875986L
-L3618097146L
-L1716038224L
-L2629818607L
-L2929217876L
-L1367250314L
-L1726434951L
-L1388496325L
-L2107602181L
-L2822366842L
-L3052979190L
-L3796798633L
-L1543813381L
-L959000121L
-L1363845999L
-L2952528150L
-L874184932L
-L1888387194L
-L2328695295L
-L3442959855L
-L841805947L
-L1087739275L
-L3230005434L
-L3045399265L
-L1161817318L
-L2898673139L
-L860011094L
-L940539782L
-L1297818080L
-L4243941623L
-L1577613033L
-L4204131887L
-L3819057225L
-L1969439558L
-L3297963932L
-L241874069L
-L3517033453L
-L2295345664L
-L1098911422L
-L886955008L
-L1477397621L
-L4279347332L
-L3616558791L
-L2384411957L
-L742537731L
-L764221540L
-L2871698900L
-L3530636393L
-L691256644L
-L758730966L
-L1717773090L
-L2751856377L
-L3188484000L
-L3767469670L
-L1623863053L
-L3533236793L
-L4099284176L
-L723921107L
-L310594036L
-L223978745L
-L2266565776L
-L201843303L
-L2969968546L
-L3351170888L
-L3465113624L
-L2712246712L
-L1521383057L
-L2384461798L
-L216357551L
-L2167301975L
-L3144653194L
-L2781220155L
-L3620747666L
-L95971265L
-L4255400243L
-L59999757L
-L4174273472L
-L3974511524L
-L1007123950L
-L3112477628L
-L806461512L
-L3148074008L
-L528352882L
-L2545979588L
-L2562281969L
-L3010249477L
-L1886331611L
-L3210656433L
-L1034099976L
-L2906893579L
-L1197048779L
-L1870004401L
-L3898300490L
-L2686856402L
-L3975723478L
-L613043532L
-L2565674353L
-L3760045310L
-L3468984376L
-L4126258L
-L303855424L
-L3988963552L
-L276256796L
-L544071807L
-L1023872062L
-L1747461519L
-L1975571260L
-L4033766958L
-L2946555557L
-L1492957796L
-L958271685L
-L46480515L
-L907760635L
-L1306626357L
-L819652378L
-L1172300279L
-L1116851319L
-L495601075L
-L1157715330L
-L534220108L
-L377320028L
-L1672286106L
-L2066219284L
-L1842386355L
-L2546059464L
-L1839457336L
-L3476194446L
-L3050550028L
-L594705582L
-L1905813535L
-L1813033412L
-L2700858157L
-L169067972L
-L4252889045L
-L1921944555L
-L497671474L
-L210143935L
-L2688398489L
-L325158375L
-L3450846447L
-L891760597L
-L712802536L
-L1132557436L
-L1417044075L
-L1639889660L
-L1746379970L
-L1478741647L
-L2817563486L
-L2573612532L
-L4266444457L
-L2911601615L
-L804745411L
-L2207254652L
-L1189140646L
-L3829725111L
-L3637367348L
-L1944731747L
-L2193440343L
-L1430195413L
-L1173515229L
-L1582618217L
-L2070767037L
-L247908936L
-L1460675439L
-L556001596L
-L327629335L
-L1036133876L
-L4228129605L
-L999174048L
-L3635804039L
-L1416550481L
-L1270540269L
-L4280743815L
-L39607659L
-L1552540623L
-L2762294062L
-L504137289L
-L4117044239L
-L1417130225L
-L1342970056L
-L1755716449L
-L1169447322L
-L2731401356L
-L2319976745L
-L2869221479L
-L23972655L
-L2251495389L
-L1429860878L
-L3728135992L
-L4241432973L
-L3698275076L
-L216416432L
-L4040046960L
-L246077176L
-L894675685L
-L3932282259L
-L3097205100L
-L2128818650L
-L1319010656L
-L1601974009L
-L2552960957L
-L3554016055L
-L4209395641L
-L2013340102L
-L3370447801L
-L2307272002L
-L1795091354L
-L202109401L
-L988345070L
-L2514870758L
-L1132726850L
-L582746224L
-L3112305421L
-L1843020683L
-L3600189223L
-L1101349165L
-L4211905855L
-L2866677581L
-L2881621130L
-L4165324109L
-L4238773191L
-L3635649550L
-L2670481044L
-L2996248219L
-L1676992480L
-L3473067050L
-L4205793699L
-L4019490897L
-L1579990481L
-L1899617990L
-L1136347713L
-L1802842268L
-L3591752960L
-L1197308739L
-L433629786L
-L4032142790L
-L3148041979L
-L3312138845L
-L3896860449L
-L3298182567L
-L907605170L
-L1658664067L
-L2682980313L
-L2523523173L
-L1208722103L
-L3808530363L
-L1079003946L
-L4282402864L
-L2041010073L
-L2667555071L
-L688018180L
-L1405121012L
-L4167994076L
-L3504695336L
-L1923944749L
-L1143598790L
-L3936268898L
-L3606243846L
-L1017420080L
-L4026211169L
-L596529763L
-L1844259624L
-L2840216282L
-L2673807759L
-L3407202575L
-L2737971083L
-L4075423068L
-L3684057432L
-L3146627241L
-L599650513L
-L69773114L
-L1257035919L
-L807485291L
-L2376230687L
-L3036593147L
-L2642411658L
-L106080044L
-L2199622729L
-L291834511L
-L2697611361L
-L11689733L
-L625123952L
-L3226023062L
-L3229663265L
-L753059444L
-L2843610189L
-L624L
-tp2
-Ntp3
-b.
\ No newline at end of file
diff --git a/test-data/stdlib-samples/3.2/test/subprocessdata/fd_status.py b/test-data/stdlib-samples/3.2/test/subprocessdata/fd_status.py
deleted file mode 100644
index 1f61e13..0000000
--- a/test-data/stdlib-samples/3.2/test/subprocessdata/fd_status.py
+++ /dev/null
@@ -1,24 +0,0 @@
-"""When called as a script, print a comma-separated list of the open
-file descriptors on stdout."""
-
-import errno
-import os
-
-try:
- _MAXFD = os.sysconf("SC_OPEN_MAX")
-except:
- _MAXFD = 256
-
-if __name__ == "__main__":
- fds = []
- for fd in range(0, _MAXFD):
- try:
- st = os.fstat(fd)
- except OSError as e:
- if e.errno == errno.EBADF:
- continue
- raise
- # Ignore Solaris door files
- if st.st_mode & 0xF000 != 0xd000:
- fds.append(fd)
- print(','.join(map(str, fds)))
diff --git a/test-data/stdlib-samples/3.2/test/subprocessdata/input_reader.py b/test-data/stdlib-samples/3.2/test/subprocessdata/input_reader.py
deleted file mode 100644
index 1dc3191..0000000
--- a/test-data/stdlib-samples/3.2/test/subprocessdata/input_reader.py
+++ /dev/null
@@ -1,7 +0,0 @@
-"""When called as a script, consumes the input"""
-
-import sys
-
-if __name__ == "__main__":
- for line in sys.stdin:
- pass
diff --git a/test-data/stdlib-samples/3.2/test/subprocessdata/qcat.py b/test-data/stdlib-samples/3.2/test/subprocessdata/qcat.py
deleted file mode 100644
index fe6f9db..0000000
--- a/test-data/stdlib-samples/3.2/test/subprocessdata/qcat.py
+++ /dev/null
@@ -1,7 +0,0 @@
-"""When ran as a script, simulates cat with no arguments."""
-
-import sys
-
-if __name__ == "__main__":
- for line in sys.stdin:
- sys.stdout.write(line)
diff --git a/test-data/stdlib-samples/3.2/test/subprocessdata/qgrep.py b/test-data/stdlib-samples/3.2/test/subprocessdata/qgrep.py
deleted file mode 100644
index 6990637..0000000
--- a/test-data/stdlib-samples/3.2/test/subprocessdata/qgrep.py
+++ /dev/null
@@ -1,10 +0,0 @@
-"""When called with a single argument, simulated fgrep with a single
-argument and no options."""
-
-import sys
-
-if __name__ == "__main__":
- pattern = sys.argv[1]
- for line in sys.stdin:
- if pattern in line:
- sys.stdout.write(line)
diff --git a/test-data/stdlib-samples/3.2/test/subprocessdata/sigchild_ignore.py b/test-data/stdlib-samples/3.2/test/subprocessdata/sigchild_ignore.py
deleted file mode 100644
index 6072aec..0000000
--- a/test-data/stdlib-samples/3.2/test/subprocessdata/sigchild_ignore.py
+++ /dev/null
@@ -1,6 +0,0 @@
-import signal, subprocess, sys
-# On Linux this causes os.waitpid to fail with OSError as the OS has already
-# reaped our child process. The wait() passing the OSError on to the caller
-# and causing us to exit with an error is what we are testing against.
-signal.signal(signal.SIGCHLD, signal.SIG_IGN)
-subprocess.Popen([sys.executable, '-c', 'print("albatross")']).wait()
diff --git a/test-data/stdlib-samples/3.2/test/support.py b/test-data/stdlib-samples/3.2/test/support.py
deleted file mode 100644
index a36ba28..0000000
--- a/test-data/stdlib-samples/3.2/test/support.py
+++ /dev/null
@@ -1,1602 +0,0 @@
-"""Supporting definitions for the Python regression tests."""
-
-if __name__ != 'test.support':
- raise ImportError('support must be imported from the test package')
-
-import contextlib
-import errno
-import functools
-import gc
-import socket
-import sys
-import os
-import platform
-import shutil
-import warnings
-import unittest
-import importlib
-import collections
-import re
-import subprocess
-import imp
-import time
-import sysconfig
-import fnmatch
-import logging.handlers
-
-import _thread, threading
-from typing import Any, Dict, cast
-#try:
-# import multiprocessing.process
-#except ImportError:
-# multiprocessing = None
-
-
-__all__ = [
- "Error", "TestFailed", "ResourceDenied", "import_module",
- "verbose", "use_resources", "max_memuse", "record_original_stdout",
- "get_original_stdout", "unload", "unlink", "rmtree", "forget",
- "is_resource_enabled", "requires", "requires_mac_ver",
- "find_unused_port", "bind_port",
- "fcmp", "is_jython", "TESTFN", "HOST", "FUZZ", "SAVEDCWD", "temp_cwd",
- "findfile", "sortdict", "check_syntax_error", "open_urlresource",
- "check_warnings", "CleanImport", "EnvironmentVarGuard",
- "TransientResource", "captured_output", "captured_stdout",
- "captured_stdin", "captured_stderr",
- "time_out", "socket_peer_reset", "ioerror_peer_reset",
- "run_with_locale", 'temp_umask', "transient_internet",
- "set_memlimit", "bigmemtest", "bigaddrspacetest", "BasicTestRunner",
- "run_unittest", "run_doctest", "threading_setup", "threading_cleanup",
- "reap_children", "cpython_only", "check_impl_detail", "get_attribute",
- "swap_item", "swap_attr", "requires_IEEE_754",
- "TestHandler", "Matcher", "can_symlink", "skip_unless_symlink",
- "import_fresh_module", "failfast",
- ]
-
-class Error(Exception):
- """Base class for regression test exceptions."""
-
-class TestFailed(Error):
- """Test failed."""
-
-class ResourceDenied(unittest.SkipTest):
- """Test skipped because it requested a disallowed resource.
-
- This is raised when a test calls requires() for a resource that
- has not be enabled. It is used to distinguish between expected
- and unexpected skips.
- """
-
- at contextlib.contextmanager
-def _ignore_deprecated_imports(ignore=True):
- """Context manager to suppress package and module deprecation
- warnings when importing them.
-
- If ignore is False, this context manager has no effect."""
- if ignore:
- with warnings.catch_warnings():
- warnings.filterwarnings("ignore", ".+ (module|package)",
- DeprecationWarning)
- yield None
- else:
- yield None
-
-
-def import_module(name, deprecated=False):
- """Import and return the module to be tested, raising SkipTest if
- it is not available.
-
- If deprecated is True, any module or package deprecation messages
- will be suppressed."""
- with _ignore_deprecated_imports(deprecated):
- try:
- return importlib.import_module(name)
- except ImportError as msg:
- raise unittest.SkipTest(str(msg))
-
-
-def _save_and_remove_module(name, orig_modules):
- """Helper function to save and remove a module from sys.modules
-
- Raise ImportError if the module can't be imported."""
- # try to import the module and raise an error if it can't be imported
- if name not in sys.modules:
- __import__(name)
- del sys.modules[name]
- for modname in list(sys.modules):
- if modname == name or modname.startswith(name + '.'):
- orig_modules[modname] = sys.modules[modname]
- del sys.modules[modname]
-
-def _save_and_block_module(name, orig_modules):
- """Helper function to save and block a module in sys.modules
-
- Return True if the module was in sys.modules, False otherwise."""
- saved = True
- try:
- orig_modules[name] = sys.modules[name]
- except KeyError:
- saved = False
- sys.modules[name] = None
- return saved
-
-
-def import_fresh_module(name, fresh=(), blocked=(), deprecated=False):
- """Imports and returns a module, deliberately bypassing the sys.modules cache
- and importing a fresh copy of the module. Once the import is complete,
- the sys.modules cache is restored to its original state.
-
- Modules named in fresh are also imported anew if needed by the import.
- If one of these modules can't be imported, None is returned.
-
- Importing of modules named in blocked is prevented while the fresh import
- takes place.
-
- If deprecated is True, any module or package deprecation messages
- will be suppressed."""
- # NOTE: test_heapq, test_json and test_warnings include extra sanity checks
- # to make sure that this utility function is working as expected
- with _ignore_deprecated_imports(deprecated):
- # Keep track of modules saved for later restoration as well
- # as those which just need a blocking entry removed
- orig_modules = {}
- names_to_remove = []
- _save_and_remove_module(name, orig_modules)
- try:
- for fresh_name in fresh:
- _save_and_remove_module(fresh_name, orig_modules)
- for blocked_name in blocked:
- if not _save_and_block_module(blocked_name, orig_modules):
- names_to_remove.append(blocked_name)
- fresh_module = importlib.import_module(name)
- except ImportError:
- fresh_module = None
- finally:
- for orig_name, module in orig_modules.items():
- sys.modules[orig_name] = module
- for name_to_remove in names_to_remove:
- del sys.modules[name_to_remove]
- return fresh_module
-
-
-def get_attribute(obj, name):
- """Get an attribute, raising SkipTest if AttributeError is raised."""
- try:
- attribute = getattr(obj, name)
- except AttributeError:
- raise unittest.SkipTest("module %s has no attribute %s" % (
- obj.__name__, name))
- else:
- return attribute
-
-verbose = 1 # Flag set to 0 by regrtest.py
-use_resources = None # type: Any # Flag set to [] by regrtest.py
-max_memuse = 0 # Disable bigmem tests (they will still be run with
- # small sizes, to make sure they work.)
-real_max_memuse = 0
-failfast = False
-match_tests = None # type: Any
-
-# _original_stdout is meant to hold stdout at the time regrtest began.
-# This may be "the real" stdout, or IDLE's emulation of stdout, or whatever.
-# The point is to have some flavor of stdout the user can actually see.
-_original_stdout = None # type: 'Any'
-def record_original_stdout(stdout):
- global _original_stdout
- _original_stdout = stdout
-
-def get_original_stdout():
- return _original_stdout or sys.stdout
-
-def unload(name):
- try:
- del sys.modules[name]
- except KeyError:
- pass
-
-def unlink(filename):
- try:
- os.unlink(filename)
- except OSError as error:
- # The filename need not exist.
- if error.errno not in (errno.ENOENT, errno.ENOTDIR):
- raise
-
-def rmtree(path):
- try:
- shutil.rmtree(path)
- except OSError as error:
- # Unix returns ENOENT, Windows returns ESRCH.
- if error.errno not in (errno.ENOENT, errno.ESRCH):
- raise
-
-def make_legacy_pyc(source):
- """Move a PEP 3147 pyc/pyo file to its legacy pyc/pyo location.
-
- The choice of .pyc or .pyo extension is done based on the __debug__ flag
- value.
-
- :param source: The file system path to the source file. The source file
- does not need to exist, however the PEP 3147 pyc file must exist.
- :return: The file system path to the legacy pyc file.
- """
- pyc_file = imp.cache_from_source(source)
- up_one = os.path.dirname(os.path.abspath(source))
- if __debug__:
- ch = 'c'
- else:
- ch = 'o'
- legacy_pyc = os.path.join(up_one, source + ch)
- os.rename(pyc_file, legacy_pyc)
- return legacy_pyc
-
-def forget(modname):
- """'Forget' a module was ever imported.
-
- This removes the module from sys.modules and deletes any PEP 3147 or
- legacy .pyc and .pyo files.
- """
- unload(modname)
- for dirname in sys.path:
- source = os.path.join(dirname, modname + '.py')
- # It doesn't matter if they exist or not, unlink all possible
- # combinations of PEP 3147 and legacy pyc and pyo files.
- unlink(source + 'c')
- unlink(source + 'o')
- unlink(imp.cache_from_source(source, debug_override=True))
- unlink(imp.cache_from_source(source, debug_override=False))
-
-# On some platforms, should not run gui test even if it is allowed
-# in `use_resources'.
-#if sys.platform.startswith('win'):
- #import ctypes
- #import ctypes.wintypes
- #def _is_gui_available():
- # UOI_FLAGS = 1
- # WSF_VISIBLE = 0x0001
- # class USEROBJECTFLAGS(ctypes.Structure):
- # _fields_ = [("fInherit", ctypes.wintypes.BOOL),
- # ("fReserved", ctypes.wintypes.BOOL),
- # ("dwFlags", ctypes.wintypes.DWORD)]
- # dll = ctypes.windll.user32
- # h = dll.GetProcessWindowStation()
- # if not h:
- # raise ctypes.WinError()
- # uof = USEROBJECTFLAGS()
- # needed = ctypes.wintypes.DWORD()
- # res = dll.GetUserObjectInformationW(h,
- # UOI_FLAGS,
- # ctypes.byref(uof),
- # ctypes.sizeof(uof),
- # ctypes.byref(needed))
- # if not res:
- # raise ctypes.WinError()
- # return bool(uof.dwFlags & WSF_VISIBLE)
-#else:
-def _is_gui_available():
- return True
-
-def is_resource_enabled(resource):
- """Test whether a resource is enabled. Known resources are set by
- regrtest.py."""
- return use_resources is not None and resource in use_resources
-
-def requires(resource, msg=None):
- """Raise ResourceDenied if the specified resource is not available.
-
- If the caller's module is __main__ then automatically return True. The
- possibility of False being returned occurs when regrtest.py is
- executing.
- """
- if resource == 'gui' and not _is_gui_available():
- raise unittest.SkipTest("Cannot use the 'gui' resource")
- # see if the caller's module is __main__ - if so, treat as if
- # the resource was set
- if sys._getframe(1).f_globals.get("__name__") == "__main__":
- return
- if not is_resource_enabled(resource):
- if msg is None:
- msg = "Use of the `%s' resource not enabled" % resource
- raise ResourceDenied(msg)
-
-def requires_mac_ver(*min_version):
- """Decorator raising SkipTest if the OS is Mac OS X and the OS X
- version if less than min_version.
-
- For example, @requires_mac_ver(10, 5) raises SkipTest if the OS X version
- is lesser than 10.5.
- """
- def decorator(func):
- @functools.wraps(func)
- def wrapper(*args, **kw):
- if sys.platform == 'darwin':
- version_txt = platform.mac_ver()[0]
- try:
- version = tuple(map(int, version_txt.split('.')))
- except ValueError:
- pass
- else:
- if version < min_version:
- min_version_txt = '.'.join(map(str, min_version))
- raise unittest.SkipTest(
- "Mac OS X %s or higher required, not %s"
- % (min_version_txt, version_txt))
- return func(*args, **kw)
- wrapper.min_version = min_version
- return wrapper
- return decorator
-
-HOST = 'localhost'
-
-def find_unused_port(family=socket.AF_INET, socktype=socket.SOCK_STREAM):
- """Returns an unused port that should be suitable for binding. This is
- achieved by creating a temporary socket with the same family and type as
- the 'sock' parameter (default is AF_INET, SOCK_STREAM), and binding it to
- the specified host address (defaults to 0.0.0.0) with the port set to 0,
- eliciting an unused ephemeral port from the OS. The temporary socket is
- then closed and deleted, and the ephemeral port is returned.
-
- Either this method or bind_port() should be used for any tests where a
- server socket needs to be bound to a particular port for the duration of
- the test. Which one to use depends on whether the calling code is creating
- a python socket, or if an unused port needs to be provided in a constructor
- or passed to an external program (i.e. the -accept argument to openssl's
- s_server mode). Always prefer bind_port() over find_unused_port() where
- possible. Hard coded ports should *NEVER* be used. As soon as a server
- socket is bound to a hard coded port, the ability to run multiple instances
- of the test simultaneously on the same host is compromised, which makes the
- test a ticking time bomb in a buildbot environment. On Unix buildbots, this
- may simply manifest as a failed test, which can be recovered from without
- intervention in most cases, but on Windows, the entire python process can
- completely and utterly wedge, requiring someone to log in to the buildbot
- and manually kill the affected process.
-
- (This is easy to reproduce on Windows, unfortunately, and can be traced to
- the SO_REUSEADDR socket option having different semantics on Windows versus
- Unix/Linux. On Unix, you can't have two AF_INET SOCK_STREAM sockets bind,
- listen and then accept connections on identical host/ports. An EADDRINUSE
- socket.error will be raised at some point (depending on the platform and
- the order bind and listen were called on each socket).
-
- However, on Windows, if SO_REUSEADDR is set on the sockets, no EADDRINUSE
- will ever be raised when attempting to bind two identical host/ports. When
- accept() is called on each socket, the second caller's process will steal
- the port from the first caller, leaving them both in an awkwardly wedged
- state where they'll no longer respond to any signals or graceful kills, and
- must be forcibly killed via OpenProcess()/TerminateProcess().
-
- The solution on Windows is to use the SO_EXCLUSIVEADDRUSE socket option
- instead of SO_REUSEADDR, which effectively affords the same semantics as
- SO_REUSEADDR on Unix. Given the propensity of Unix developers in the Open
- Source world compared to Windows ones, this is a common mistake. A quick
- look over OpenSSL's 0.9.8g source shows that they use SO_REUSEADDR when
- openssl.exe is called with the 's_server' option, for example. See
- http://bugs.python.org/issue2550 for more info. The following site also
- has a very thorough description about the implications of both REUSEADDR
- and EXCLUSIVEADDRUSE on Windows:
- http://msdn2.microsoft.com/en-us/library/ms740621(VS.85).aspx)
-
- XXX: although this approach is a vast improvement on previous attempts to
- elicit unused ports, it rests heavily on the assumption that the ephemeral
- port returned to us by the OS won't immediately be dished back out to some
- other process when we close and delete our temporary socket but before our
- calling code has a chance to bind the returned port. We can deal with this
- issue if/when we come across it.
- """
-
- tempsock = socket.socket(family, socktype)
- port = bind_port(tempsock)
- tempsock.close()
- #del tempsock
- return port
-
-def bind_port(sock, host=HOST):
- """Bind the socket to a free port and return the port number. Relies on
- ephemeral ports in order to ensure we are using an unbound port. This is
- important as many tests may be running simultaneously, especially in a
- buildbot environment. This method raises an exception if the sock.family
- is AF_INET and sock.type is SOCK_STREAM, *and* the socket has SO_REUSEADDR
- or SO_REUSEPORT set on it. Tests should *never* set these socket options
- for TCP/IP sockets. The only case for setting these options is testing
- multicasting via multiple UDP sockets.
-
- Additionally, if the SO_EXCLUSIVEADDRUSE socket option is available (i.e.
- on Windows), it will be set on the socket. This will prevent anyone else
- from bind()'ing to our host/port for the duration of the test.
- """
-
- if sock.family == socket.AF_INET and sock.type == socket.SOCK_STREAM:
- if hasattr(socket, 'SO_REUSEADDR'):
- if sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR) == 1:
- raise TestFailed("tests should never set the SO_REUSEADDR " \
- "socket option on TCP/IP sockets!")
- if hasattr(socket, 'SO_REUSEPORT'):
- if sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT) == 1:
- raise TestFailed("tests should never set the SO_REUSEPORT " \
- "socket option on TCP/IP sockets!")
- if hasattr(socket, 'SO_EXCLUSIVEADDRUSE'):
- sock.setsockopt(socket.SOL_SOCKET, socket.SO_EXCLUSIVEADDRUSE, 1)
-
- sock.bind((host, 0))
- port = sock.getsockname()[1]
- return port
-
-FUZZ = 1e-6
-
-def fcmp(x, y): # fuzzy comparison function
- if isinstance(x, float) or isinstance(y, float):
- try:
- fuzz = (abs(x) + abs(y)) * FUZZ
- if abs(x-y) <= fuzz:
- return 0
- except:
- pass
- elif type(x) == type(y) and isinstance(x, (tuple, list)):
- for i in range(min(len(x), len(y))):
- outcome = fcmp(x[i], y[i])
- if outcome != 0:
- return outcome
- return (len(x) > len(y)) - (len(x) < len(y))
- return (x > y) - (x < y)
-
-# decorator for skipping tests on non-IEEE 754 platforms
-requires_IEEE_754 = unittest.skipUnless(
- cast(Any, float).__getformat__("double").startswith("IEEE"),
- "test requires IEEE 754 doubles")
-
-is_jython = sys.platform.startswith('java')
-
-TESTFN = ''
-# Filename used for testing
-if os.name == 'java':
- # Jython disallows @ in module names
- TESTFN = '$test'
-else:
- TESTFN = '@test'
-
-# Disambiguate TESTFN for parallel testing, while letting it remain a valid
-# module name.
-TESTFN = "{}_{}_tmp".format(TESTFN, os.getpid())
-
-
-# TESTFN_UNICODE is a non-ascii filename
-TESTFN_UNICODE = TESTFN + "-\xe0\xf2\u0258\u0141\u011f"
-if sys.platform == 'darwin':
- # In Mac OS X's VFS API file names are, by definition, canonically
- # decomposed Unicode, encoded using UTF-8. See QA1173:
- # http://developer.apple.com/mac/library/qa/qa2001/qa1173.html
- import unicodedata
- TESTFN_UNICODE = unicodedata.normalize('NFD', TESTFN_UNICODE)
-TESTFN_ENCODING = sys.getfilesystemencoding()
-
-# TESTFN_UNENCODABLE is a filename (str type) that should *not* be able to be
-# encoded by the filesystem encoding (in strict mode). It can be None if we
-# cannot generate such filename.
-TESTFN_UNENCODABLE = None # type: Any
-if os.name in ('nt', 'ce'):
- # skip win32s (0) or Windows 9x/ME (1)
- if sys.getwindowsversion().platform >= 2:
- # Different kinds of characters from various languages to minimize the
- # probability that the whole name is encodable to MBCS (issue #9819)
- TESTFN_UNENCODABLE = TESTFN + "-\u5171\u0141\u2661\u0363\uDC80"
- try:
- TESTFN_UNENCODABLE.encode(TESTFN_ENCODING)
- except UnicodeEncodeError:
- pass
- else:
- print('WARNING: The filename %r CAN be encoded by the filesystem encoding (%s). '
- 'Unicode filename tests may not be effective'
- % (TESTFN_UNENCODABLE, TESTFN_ENCODING))
- TESTFN_UNENCODABLE = None
-# Mac OS X denies unencodable filenames (invalid utf-8)
-elif sys.platform != 'darwin':
- try:
- # ascii and utf-8 cannot encode the byte 0xff
- b'\xff'.decode(TESTFN_ENCODING)
- except UnicodeDecodeError:
- # 0xff will be encoded using the surrogate character u+DCFF
- TESTFN_UNENCODABLE = TESTFN \
- + b'-\xff'.decode(TESTFN_ENCODING, 'surrogateescape')
- else:
- # File system encoding (eg. ISO-8859-* encodings) can encode
- # the byte 0xff. Skip some unicode filename tests.
- pass
-
-# Save the initial cwd
-SAVEDCWD = os.getcwd()
-
- at contextlib.contextmanager
-def temp_cwd(name='tempcwd', quiet=False, path=None):
- """
- Context manager that temporarily changes the CWD.
-
- An existing path may be provided as *path*, in which case this
- function makes no changes to the file system.
-
- Otherwise, the new CWD is created in the current directory and it's
- named *name*. If *quiet* is False (default) and it's not possible to
- create or change the CWD, an error is raised. If it's True, only a
- warning is raised and the original CWD is used.
- """
- saved_dir = os.getcwd()
- is_temporary = False
- if path is None:
- path = name
- try:
- os.mkdir(name)
- is_temporary = True
- except OSError:
- if not quiet:
- raise
- warnings.warn('tests may fail, unable to create temp CWD ' + name,
- RuntimeWarning, stacklevel=3)
- try:
- os.chdir(path)
- except OSError:
- if not quiet:
- raise
- warnings.warn('tests may fail, unable to change the CWD to ' + name,
- RuntimeWarning, stacklevel=3)
- try:
- yield os.getcwd()
- finally:
- os.chdir(saved_dir)
- if is_temporary:
- rmtree(name)
-
-
- at contextlib.contextmanager
-def temp_umask(umask):
- """Context manager that temporarily sets the process umask."""
- oldmask = os.umask(umask)
- try:
- yield None
- finally:
- os.umask(oldmask)
-
-
-def findfile(file, here=__file__, subdir=None):
- """Try to find a file on sys.path and the working directory. If it is not
- found the argument passed to the function is returned (this does not
- necessarily signal failure; could still be the legitimate path)."""
- if os.path.isabs(file):
- return file
- if subdir is not None:
- file = os.path.join(subdir, file)
- path = sys.path
- path = [os.path.dirname(here)] + path
- for dn in path:
- fn = os.path.join(dn, file)
- if os.path.exists(fn): return fn
- return file
-
-def sortdict(dict):
- "Like repr(dict), but in sorted order."
- items = sorted(dict.items())
- reprpairs = ["%r: %r" % pair for pair in items]
- withcommas = ", ".join(reprpairs)
- return "{%s}" % withcommas
-
-def make_bad_fd():
- """
- Create an invalid file descriptor by opening and closing a file and return
- its fd.
- """
- file = open(TESTFN, "wb")
- try:
- return file.fileno()
- finally:
- file.close()
- unlink(TESTFN)
-
-def check_syntax_error(testcase, statement):
- raise NotImplementedError('no compile built-in')
- #testcase.assertRaises(SyntaxError, compile, statement,
- # '<test string>', 'exec')
-
-def open_urlresource(url, *args, **kw):
- from urllib import request, parse
-
- check = kw.pop('check', None)
-
- filename = parse.urlparse(url)[2].split('/')[-1] # '/': it's URL!
-
- fn = os.path.join(os.path.dirname(__file__), "data", filename)
-
- def check_valid_file(fn):
- f = open(fn, *args, **kw)
- if check is None:
- return f
- elif check(f):
- f.seek(0)
- return f
- f.close()
-
- if os.path.exists(fn):
- f = check_valid_file(fn)
- if f is not None:
- return f
- unlink(fn)
-
- # Verify the requirement before downloading the file
- requires('urlfetch')
-
- print('\tfetching %s ...' % url, file=get_original_stdout())
- f = request.urlopen(url, timeout=15)
- try:
- with open(fn, "wb") as out:
- s = f.read()
- while s:
- out.write(s)
- s = f.read()
- finally:
- f.close()
-
- f = check_valid_file(fn)
- if f is not None:
- return f
- raise TestFailed('invalid resource "%s"' % fn)
-
-
-class WarningsRecorder(object):
- """Convenience wrapper for the warnings list returned on
- entry to the warnings.catch_warnings() context manager.
- """
- def __init__(self, warnings_list):
- self._warnings = warnings_list
- self._last = 0
-
- def __getattr__(self, attr):
- if len(self._warnings) > self._last:
- return getattr(self._warnings[-1], attr)
- elif attr in warnings.WarningMessage._WARNING_DETAILS:
- return None
- raise AttributeError("%r has no attribute %r" % (self, attr))
-
- #@property
- #def warnings(self):
- # return self._warnings[self._last:]
-
- def reset(self):
- self._last = len(self._warnings)
-
-
-def _filterwarnings(filters, quiet=False):
- """Catch the warnings, then check if all the expected
- warnings have been raised and re-raise unexpected warnings.
- If 'quiet' is True, only re-raise the unexpected warnings.
- """
- # Clear the warning registry of the calling module
- # in order to re-raise the warnings.
- frame = sys._getframe(2)
- registry = frame.f_globals.get('__warningregistry__')
- if registry:
- registry.clear()
- with warnings.catch_warnings(record=True) as w:
- # Set filter "always" to record all warnings. Because
- # test_warnings swap the module, we need to look up in
- # the sys.modules dictionary.
- sys.modules['warnings'].simplefilter("always")
- yield WarningsRecorder(w)
- # Filter the recorded warnings
- reraise = list(w)
- missing = []
- for msg, cat in filters:
- seen = False
- for w in reraise[:]:
- warning = w.message
- # Filter out the matching messages
- if (re.match(msg, str(warning), re.I) and
- issubclass(warning.__class__, cat)):
- seen = True
- reraise.remove(w)
- if not seen and not quiet:
- # This filter caught nothing
- missing.append((msg, cat.__name__))
- if reraise:
- raise AssertionError("unhandled warning %s" % reraise[0])
- if missing:
- raise AssertionError("filter (%r, %s) did not catch any warning" %
- missing[0])
-
-
- at contextlib.contextmanager
-def check_warnings(*filters, **kwargs):
- """Context manager to silence warnings.
-
- Accept 2-tuples as positional arguments:
- ("message regexp", WarningCategory)
-
- Optional argument:
- - if 'quiet' is True, it does not fail if a filter catches nothing
- (default True without argument,
- default False if some filters are defined)
-
- Without argument, it defaults to:
- check_warnings(("", Warning), quiet=True)
- """
- quiet = kwargs.get('quiet')
- if not filters:
- filters = (("", Warning),)
- # Preserve backward compatibility
- if quiet is None:
- quiet = True
- return _filterwarnings(filters, quiet)
-
-
-class CleanImport(object):
- """Context manager to force import to return a new module reference.
-
- This is useful for testing module-level behaviours, such as
- the emission of a DeprecationWarning on import.
-
- Use like this:
-
- with CleanImport("foo"):
- importlib.import_module("foo") # new reference
- """
-
- def __init__(self, *module_names):
- self.original_modules = sys.modules.copy()
- for module_name in module_names:
- if module_name in sys.modules:
- module = sys.modules[module_name]
- # It is possible that module_name is just an alias for
- # another module (e.g. stub for modules renamed in 3.x).
- # In that case, we also need delete the real module to clear
- # the import cache.
- if module.__name__ != module_name:
- del sys.modules[module.__name__]
- del sys.modules[module_name]
-
- def __enter__(self):
- return self
-
- def __exit__(self, *ignore_exc):
- sys.modules.update(self.original_modules)
-
-
-class EnvironmentVarGuard(dict):
-
- """Class to help protect the environment variable properly. Can be used as
- a context manager."""
-
- def __init__(self):
- self._environ = os.environ
- self._changed = {}
-
- def __getitem__(self, envvar):
- return self._environ[envvar]
-
- def __setitem__(self, envvar, value):
- # Remember the initial value on the first access
- if envvar not in self._changed:
- self._changed[envvar] = self._environ.get(envvar)
- self._environ[envvar] = value
-
- def __delitem__(self, envvar):
- # Remember the initial value on the first access
- if envvar not in self._changed:
- self._changed[envvar] = self._environ.get(envvar)
- if envvar in self._environ:
- del self._environ[envvar]
-
- def keys(self):
- return self._environ.keys()
-
- def __iter__(self):
- return iter(self._environ)
-
- def __len__(self):
- return len(self._environ)
-
- def set(self, envvar, value):
- self[envvar] = value
-
- def unset(self, envvar):
- del self[envvar]
-
- def __enter__(self):
- return self
-
- def __exit__(self, *ignore_exc):
- for k, v in self._changed.items():
- if v is None:
- if k in self._environ:
- del self._environ[k]
- else:
- self._environ[k] = v
- os.environ = self._environ
-
-
-class DirsOnSysPath(object):
- """Context manager to temporarily add directories to sys.path.
-
- This makes a copy of sys.path, appends any directories given
- as positional arguments, then reverts sys.path to the copied
- settings when the context ends.
-
- Note that *all* sys.path modifications in the body of the
- context manager, including replacement of the object,
- will be reverted at the end of the block.
- """
-
- def __init__(self, *paths):
- self.original_value = sys.path[:]
- self.original_object = sys.path
- sys.path.extend(paths)
-
- def __enter__(self):
- return self
-
- def __exit__(self, *ignore_exc):
- sys.path = self.original_object
- sys.path[:] = self.original_value
-
-
-class TransientResource(object):
-
- """Raise ResourceDenied if an exception is raised while the context manager
- is in effect that matches the specified exception and attributes."""
-
- def __init__(self, exc, **kwargs):
- self.exc = exc
- self.attrs = kwargs
-
- def __enter__(self):
- return self
-
- def __exit__(self, type_=None, value=None, traceback=None):
- """If type_ is a subclass of self.exc and value has attributes matching
- self.attrs, raise ResourceDenied. Otherwise let the exception
- propagate (if any)."""
- if type_ is not None and issubclass(self.exc, type_):
- for attr, attr_value in self.attrs.items():
- if not hasattr(value, attr):
- break
- if getattr(value, attr) != attr_value:
- break
- else:
- raise ResourceDenied("an optional resource is not available")
-
-# Context managers that raise ResourceDenied when various issues
-# with the Internet connection manifest themselves as exceptions.
-# XXX deprecate these and use transient_internet() instead
-time_out = TransientResource(IOError, errno=errno.ETIMEDOUT)
-socket_peer_reset = TransientResource(socket.error, errno=errno.ECONNRESET)
-ioerror_peer_reset = TransientResource(IOError, errno=errno.ECONNRESET)
-
-
- at contextlib.contextmanager
-def transient_internet(resource_name, *, timeout=30.0, errnos=()):
- """Return a context manager that raises ResourceDenied when various issues
- with the Internet connection manifest themselves as exceptions."""
- default_errnos = [
- ('ECONNREFUSED', 111),
- ('ECONNRESET', 104),
- ('EHOSTUNREACH', 113),
- ('ENETUNREACH', 101),
- ('ETIMEDOUT', 110),
- ]
- default_gai_errnos = [
- ('EAI_AGAIN', -3),
- ('EAI_FAIL', -4),
- ('EAI_NONAME', -2),
- ('EAI_NODATA', -5),
- # Encountered when trying to resolve IPv6-only hostnames
- ('WSANO_DATA', 11004),
- ]
-
- denied = ResourceDenied("Resource '%s' is not available" % resource_name)
- captured_errnos = errnos
- gai_errnos = []
- if not captured_errnos:
- captured_errnos = [getattr(errno, name, num)
- for name, num in default_errnos]
- gai_errnos = [getattr(socket, name, num)
- for name, num in default_gai_errnos]
-
- def filter_error(err):
- n = getattr(err, 'errno', None)
- if (isinstance(err, socket.timeout) or
- (isinstance(err, socket.gaierror) and n in gai_errnos) or
- n in captured_errnos):
- if not verbose:
- sys.stderr.write(denied.args[0] + "\n")
- raise denied from err
-
- old_timeout = socket.getdefaulttimeout()
- try:
- if timeout is not None:
- socket.setdefaulttimeout(timeout)
- yield None
- except IOError as err:
- # urllib can wrap original socket errors multiple times (!), we must
- # unwrap to get at the original error.
- while True:
- a = err.args
- if len(a) >= 1 and isinstance(a[0], IOError):
- err = a[0]
- # The error can also be wrapped as args[1]:
- # except socket.error as msg:
- # raise IOError('socket error', msg).with_traceback(sys.exc_info()[2])
- elif len(a) >= 2 and isinstance(a[1], IOError):
- err = a[1]
- else:
- break
- filter_error(err)
- raise
- # XXX should we catch generic exceptions and look for their
- # __cause__ or __context__?
- finally:
- socket.setdefaulttimeout(old_timeout)
-
-
- at contextlib.contextmanager
-def captured_output(stream_name):
- """Return a context manager used by captured_stdout/stdin/stderr
- that temporarily replaces the sys stream *stream_name* with a StringIO."""
- import io
- orig_stdout = getattr(sys, stream_name)
- setattr(sys, stream_name, io.StringIO())
- try:
- yield getattr(sys, stream_name)
- finally:
- setattr(sys, stream_name, orig_stdout)
-
-def captured_stdout():
- """Capture the output of sys.stdout:
-
- with captured_stdout() as s:
- print("hello")
- self.assertEqual(s.getvalue(), "hello")
- """
- return captured_output("stdout")
-
-def captured_stderr():
- return captured_output("stderr")
-
-def captured_stdin():
- return captured_output("stdin")
-
-
-def gc_collect():
- """Force as many objects as possible to be collected.
-
- In non-CPython implementations of Python, this is needed because timely
- deallocation is not guaranteed by the garbage collector. (Even in CPython
- this can be the case in case of reference cycles.) This means that __del__
- methods may be called later than expected and weakrefs may remain alive for
- longer than expected. This function tries its best to force all garbage
- objects to disappear.
- """
- gc.collect()
- if is_jython:
- time.sleep(0.1)
- gc.collect()
- gc.collect()
-
-
-def python_is_optimized():
- """Find if Python was built with optimizations."""
- cflags = sysconfig.get_config_var('PY_CFLAGS') or ''
- final_opt = ""
- for opt in cflags.split():
- if opt.startswith('-O'):
- final_opt = opt
- return final_opt and final_opt != '-O0'
-
-
-#=======================================================================
-# Decorator for running a function in a different locale, correctly resetting
-# it afterwards.
-
-def run_with_locale(catstr, *locales):
- def decorator(func):
- def inner(*args, **kwds):
- try:
- import locale
- category = getattr(locale, catstr)
- orig_locale = locale.setlocale(category)
- except AttributeError:
- # if the test author gives us an invalid category string
- raise
- except:
- # cannot retrieve original locale, so do nothing
- locale = orig_locale = None
- else:
- for loc in locales:
- try:
- locale.setlocale(category, loc)
- break
- except:
- pass
-
- # now run the function, resetting the locale on exceptions
- try:
- return func(*args, **kwds)
- finally:
- if locale and orig_locale:
- locale.setlocale(category, orig_locale)
- inner.__name__ = func.__name__
- inner.__doc__ = func.__doc__
- return inner
- return decorator
-
-#=======================================================================
-# Big-memory-test support. Separate from 'resources' because memory use
-# should be configurable.
-
-# Some handy shorthands. Note that these are used for byte-limits as well
-# as size-limits, in the various bigmem tests
-_1M = 1024*1024
-_1G = 1024 * _1M
-_2G = 2 * _1G
-_4G = 4 * _1G
-
-MAX_Py_ssize_t = sys.maxsize
-
-def set_memlimit(limit):
- global max_memuse
- global real_max_memuse
- sizes = {
- 'k': 1024,
- 'm': _1M,
- 'g': _1G,
- 't': 1024*_1G,
- }
- m = re.match(r'(\d+(\.\d+)?) (K|M|G|T)b?$', limit,
- re.IGNORECASE | re.VERBOSE)
- if m is None:
- raise ValueError('Invalid memory limit %r' % (limit,))
- memlimit = int(float(m.group(1)) * sizes[m.group(3).lower()])
- real_max_memuse = memlimit
- if memlimit > MAX_Py_ssize_t:
- memlimit = MAX_Py_ssize_t
- if memlimit < _2G - 1:
- raise ValueError('Memory limit %r too low to be useful' % (limit,))
- max_memuse = memlimit
-
-def _memory_watchdog(start_evt, finish_evt, period=10.0):
- """A function which periodically watches the process' memory consumption
- and prints it out.
- """
- # XXX: because of the GIL, and because the very long operations tested
- # in most bigmem tests are uninterruptible, the loop below gets woken up
- # much less often than expected.
- # The polling code should be rewritten in raw C, without holding the GIL,
- # and push results onto an anonymous pipe.
- try:
- page_size = os.sysconf('SC_PAGESIZE')
- except (ValueError, AttributeError):
- try:
- page_size = os.sysconf('SC_PAGE_SIZE')
- except (ValueError, AttributeError):
- page_size = 4096
- procfile = '/proc/{pid}/statm'.format(pid=os.getpid())
- try:
- f = open(procfile, 'rb')
- except IOError as e:
- warnings.warn('/proc not available for stats: {}'.format(e),
- RuntimeWarning)
- sys.stderr.flush()
- return
- with f:
- start_evt.set()
- old_data = -1
- while not finish_evt.wait(period):
- f.seek(0)
- statm = f.read().decode('ascii')
- data = int(statm.split()[5])
- if data != old_data:
- old_data = data
- print(" ... process data size: {data:.1f}G"
- .format(data=data * page_size / (1024 ** 3)))
-
-def bigmemtest(size, memuse, dry_run=True):
- """Decorator for bigmem tests.
-
- 'minsize' is the minimum useful size for the test (in arbitrary,
- test-interpreted units.) 'memuse' is the number of 'bytes per size' for
- the test, or a good estimate of it.
-
- if 'dry_run' is False, it means the test doesn't support dummy runs
- when -M is not specified.
- """
- def decorator(f):
- def wrapper(self):
- size = wrapper.size
- memuse = wrapper.memuse
- if not real_max_memuse:
- maxsize = 5147
- else:
- maxsize = size
-
- if ((real_max_memuse or not dry_run)
- and real_max_memuse < maxsize * memuse):
- raise unittest.SkipTest(
- "not enough memory: %.1fG minimum needed"
- % (size * memuse / (1024 ** 3)))
-
- if real_max_memuse and verbose and threading:
- print()
- print(" ... expected peak memory use: {peak:.1f}G"
- .format(peak=size * memuse / (1024 ** 3)))
- sys.stdout.flush()
- start_evt = threading.Event()
- finish_evt = threading.Event()
- t = threading.Thread(target=_memory_watchdog,
- args=(start_evt, finish_evt, 0.5))
- t.daemon = True
- t.start()
- start_evt.set()
- else:
- t = None
-
- try:
- return f(self, maxsize)
- finally:
- if t:
- finish_evt.set()
- t.join()
-
- wrapper.size = size
- wrapper.memuse = memuse
- return wrapper
- return decorator
-
-def bigaddrspacetest(f):
- """Decorator for tests that fill the address space."""
- def wrapper(self):
- if max_memuse < MAX_Py_ssize_t:
- if MAX_Py_ssize_t >= 2**63 - 1 and max_memuse >= 2**31:
- raise unittest.SkipTest(
- "not enough memory: try a 32-bit build instead")
- else:
- raise unittest.SkipTest(
- "not enough memory: %.1fG minimum needed"
- % (MAX_Py_ssize_t / (1024 ** 3)))
- else:
- return f(self)
- return wrapper
-
-#=======================================================================
-# unittest integration.
-
-class BasicTestRunner:
- def run(self, test):
- result = unittest.TestResult()
- test(result)
- return result
-
-def _id(obj):
- return obj
-
-def requires_resource(resource):
- if resource == 'gui' and not _is_gui_available():
- return unittest.skip("resource 'gui' is not available")
- if is_resource_enabled(resource):
- return _id
- else:
- return unittest.skip("resource {0!r} is not enabled".format(resource))
-
-def cpython_only(test):
- """
- Decorator for tests only applicable on CPython.
- """
- return impl_detail(cpython=True)(test)
-
-def impl_detail(msg=None, **guards):
- if check_impl_detail(**guards):
- return _id
- if msg is None:
- guardnames, default = _parse_guards(guards)
- if default:
- msg = "implementation detail not available on {0}"
- else:
- msg = "implementation detail specific to {0}"
- guardnames = sorted(guardnames.keys())
- msg = msg.format(' or '.join(guardnames))
- return unittest.skip(msg)
-
-def _parse_guards(guards):
- # Returns a tuple ({platform_name: run_me}, default_value)
- if not guards:
- return ({'cpython': True}, False)
- is_true = list(guards.values())[0]
- assert list(guards.values()) == [is_true] * len(guards) # all True or all False
- return (guards, not is_true)
-
-# Use the following check to guard CPython's implementation-specific tests --
-# or to run them only on the implementation(s) guarded by the arguments.
-def check_impl_detail(**guards):
- """This function returns True or False depending on the host platform.
- Examples:
- if check_impl_detail(): # only on CPython (default)
- if check_impl_detail(jython=True): # only on Jython
- if check_impl_detail(cpython=False): # everywhere except on CPython
- """
- guards, default = _parse_guards(guards)
- return guards.get(platform.python_implementation().lower(), default)
-
-
-def _filter_suite(suite, pred):
- """Recursively filter test cases in a suite based on a predicate."""
- newtests = []
- for test in suite._tests:
- if isinstance(test, unittest.TestSuite):
- _filter_suite(test, pred)
- newtests.append(test)
- else:
- if pred(test):
- newtests.append(test)
- suite._tests = newtests
-
-
-def _run_suite(suite):
- """Run tests from a unittest.TestSuite-derived class."""
- if verbose:
- runner = unittest.TextTestRunner(sys.stdout, verbosity=2,
- failfast=failfast)
- else:
- runner = BasicTestRunner()
-
- result = runner.run(suite)
- if not result.wasSuccessful():
- if len(result.errors) == 1 and not result.failures:
- err = result.errors[0][1]
- elif len(result.failures) == 1 and not result.errors:
- err = result.failures[0][1]
- else:
- err = "multiple errors occurred"
- if not verbose: err += "; run in verbose mode for details"
- raise TestFailed(err)
-
-
-def run_unittest(*classes):
- """Run tests from unittest.TestCase-derived classes."""
- valid_types = (unittest.TestSuite, unittest.TestCase)
- suite = unittest.TestSuite()
- for cls in classes:
- if isinstance(cls, str):
- if cls in sys.modules:
- suite.addTest(unittest.findTestCases(sys.modules[cls]))
- else:
- raise ValueError("str arguments must be keys in sys.modules")
- elif isinstance(cls, valid_types):
- suite.addTest(cls)
- else:
- suite.addTest(unittest.makeSuite(cls))
- def case_pred(test):
- if match_tests is None:
- return True
- for name in test.id().split("."):
- if fnmatch.fnmatchcase(name, match_tests):
- return True
- return False
- _filter_suite(suite, case_pred)
- _run_suite(suite)
-
-
-#=======================================================================
-# doctest driver.
-
-def run_doctest(module, verbosity=None):
- """Run doctest on the given module. Return (#failures, #tests).
-
- If optional argument verbosity is not specified (or is None), pass
- support's belief about verbosity on to doctest. Else doctest's
- usual behavior is used (it searches sys.argv for -v).
- """
-
- import doctest
-
- if verbosity is None:
- verbosity = verbose
- else:
- verbosity = None
-
- f, t = doctest.testmod(module, verbose=verbosity)
- if f:
- raise TestFailed("%d of %d doctests failed" % (f, t))
- if verbose:
- print('doctest (%s) ... %d tests with zero failures' %
- (module.__name__, t))
- return f, t
-
-
-#=======================================================================
-# Support for saving and restoring the imported modules.
-
-def modules_setup():
- return sys.modules.copy(),
-
-def modules_cleanup(oldmodules):
- # Encoders/decoders are registered permanently within the internal
- # codec cache. If we destroy the corresponding modules their
- # globals will be set to None which will trip up the cached functions.
- encodings = [(k, v) for k, v in sys.modules.items()
- if k.startswith('encodings.')]
- sys.modules.clear()
- sys.modules.update(encodings)
- # XXX: This kind of problem can affect more than just encodings. In particular
- # extension modules (such as _ssl) don't cope with reloading properly.
- # Really, test modules should be cleaning out the test specific modules they
- # know they added (ala test_runpy) rather than relying on this function (as
- # test_importhooks and test_pkg do currently).
- # Implicitly imported *real* modules should be left alone (see issue 10556).
- sys.modules.update(oldmodules)
-
-#=======================================================================
-# Threading support to prevent reporting refleaks when running regrtest.py -R
-
-# NOTE: we use thread._count() rather than threading.enumerate() (or the
-# moral equivalent thereof) because a threading.Thread object is still alive
-# until its __bootstrap() method has returned, even after it has been
-# unregistered from the threading module.
-# thread._count(), on the other hand, only gets decremented *after* the
-# __bootstrap() method has returned, which gives us reliable reference counts
-# at the end of a test run.
-
-def threading_setup():
- if _thread:
- return _thread._count(), threading._dangling.copy()
- else:
- return 1, ()
-
-def threading_cleanup(*original_values):
- if not _thread:
- return
- _MAX_COUNT = 10
- for count in range(_MAX_COUNT):
- values = _thread._count(), threading._dangling
- if values == original_values:
- break
- time.sleep(0.1)
- gc_collect()
- # XXX print a warning in case of failure?
-
-def reap_threads(func):
- """Use this function when threads are being used. This will
- ensure that the threads are cleaned up even when the test fails.
- If threading is unavailable this function does nothing.
- """
- if not _thread:
- return func
-
- @functools.wraps(func)
- def decorator(*args):
- key = threading_setup()
- try:
- return func(*args)
- finally:
- threading_cleanup(*key)
- return decorator
-
-def reap_children():
- """Use this function at the end of test_main() whenever sub-processes
- are started. This will help ensure that no extra children (zombies)
- stick around to hog resources and create problems when looking
- for refleaks.
- """
-
- # Reap all our dead child processes so we don't leave zombies around.
- # These hog resources and might be causing some of the buildbots to die.
- if hasattr(os, 'waitpid'):
- any_process = -1
- while True:
- try:
- # This will raise an exception on Windows. That's ok.
- pid, status = os.waitpid(any_process, os.WNOHANG)
- if pid == 0:
- break
- except:
- break
-
- at contextlib.contextmanager
-def swap_attr(obj, attr, new_val):
- """Temporary swap out an attribute with a new object.
-
- Usage:
- with swap_attr(obj, "attr", 5):
- ...
-
- This will set obj.attr to 5 for the duration of the with: block,
- restoring the old value at the end of the block. If `attr` doesn't
- exist on `obj`, it will be created and then deleted at the end of the
- block.
- """
- if hasattr(obj, attr):
- real_val = getattr(obj, attr)
- setattr(obj, attr, new_val)
- try:
- yield None
- finally:
- setattr(obj, attr, real_val)
- else:
- setattr(obj, attr, new_val)
- try:
- yield None
- finally:
- delattr(obj, attr)
-
- at contextlib.contextmanager
-def swap_item(obj, item, new_val):
- """Temporary swap out an item with a new object.
-
- Usage:
- with swap_item(obj, "item", 5):
- ...
-
- This will set obj["item"] to 5 for the duration of the with: block,
- restoring the old value at the end of the block. If `item` doesn't
- exist on `obj`, it will be created and then deleted at the end of the
- block.
- """
- if item in obj:
- real_val = obj[item]
- obj[item] = new_val
- try:
- yield None
- finally:
- obj[item] = real_val
- else:
- obj[item] = new_val
- try:
- yield None
- finally:
- del obj[item]
-
-def strip_python_stderr(stderr):
- """Strip the stderr of a Python process from potential debug output
- emitted by the interpreter.
-
- This will typically be run on the result of the communicate() method
- of a subprocess.Popen object.
- """
- stderr = re.sub(br"\[\d+ refs\]\r?\n?$", b"", stderr).strip()
- return stderr
-
-def args_from_interpreter_flags():
- """Return a list of command-line arguments reproducing the current
- settings in sys.flags."""
- flag_opt_map = {
- 'bytes_warning': 'b',
- 'dont_write_bytecode': 'B',
- 'hash_randomization': 'R',
- 'ignore_environment': 'E',
- 'no_user_site': 's',
- 'no_site': 'S',
- 'optimize': 'O',
- 'verbose': 'v',
- }
- args = []
- for flag, opt in flag_opt_map.items():
- v = getattr(sys.flags, flag)
- if v > 0:
- args.append('-' + opt * v)
- return args
-
-#============================================================
-# Support for assertions about logging.
-#============================================================
-
-class TestHandler(logging.handlers.BufferingHandler):
- def __init__(self, matcher):
- # BufferingHandler takes a "capacity" argument
- # so as to know when to flush. As we're overriding
- # shouldFlush anyway, we can set a capacity of zero.
- # You can call flush() manually to clear out the
- # buffer.
- logging.handlers.BufferingHandler.__init__(self, 0)
- self.matcher = matcher
-
- def shouldFlush(self, record):
- return False
-
- def emit(self, record):
- self.format(record)
- self.buffer.append(record.__dict__)
-
- def matches(self, **kwargs):
- """
- Look for a saved dict whose keys/values match the supplied arguments.
- """
- result = False
- for d in self.buffer:
- if self.matcher.matches(d, **kwargs):
- result = True
- break
- return result
-
-class Matcher(object):
-
- _partial_matches = ('msg', 'message')
-
- def matches(self, d, **kwargs):
- """
- Try to match a single dict with the supplied arguments.
-
- Keys whose values are strings and which are in self._partial_matches
- will be checked for partial (i.e. substring) matches. You can extend
- this scheme to (for example) do regular expression matching, etc.
- """
- result = True
- for k in kwargs:
- v = kwargs[k]
- dv = d.get(k)
- if not self.match_value(k, dv, v):
- result = False
- break
- return result
-
- def match_value(self, k, dv, v):
- """
- Try to match a single stored value (dv) with a supplied value (v).
- """
- if type(v) != type(dv):
- result = False
- elif type(dv) is not str or k not in self._partial_matches:
- result = (v == dv)
- else:
- result = dv.find(v) >= 0
- return result
-
-
-_can_symlink = None # type: Any
-def can_symlink():
- global _can_symlink
- if _can_symlink is not None:
- return _can_symlink
- symlink_path = TESTFN + "can_symlink"
- try:
- os.symlink(TESTFN, symlink_path)
- can = True
- except (OSError, NotImplementedError, AttributeError):
- can = False
- else:
- os.remove(symlink_path)
- _can_symlink = can
- return can
-
-def skip_unless_symlink(test):
- """Skip decorator for tests that require functional symlink"""
- ok = can_symlink()
- msg = "Requires functional symlink implementation"
- if ok:
- return test
- else:
- return unittest.skip(msg)(test)
-
-def patch(test_instance, object_to_patch, attr_name, new_value):
- """Override 'object_to_patch'.'attr_name' with 'new_value'.
-
- Also, add a cleanup procedure to 'test_instance' to restore
- 'object_to_patch' value for 'attr_name'.
- The 'attr_name' should be a valid attribute for 'object_to_patch'.
-
- """
- # check that 'attr_name' is a real attribute for 'object_to_patch'
- # will raise AttributeError if it does not exist
- getattr(object_to_patch, attr_name)
-
- # keep a copy of the old value
- attr_is_local = False
- try:
- old_value = object_to_patch.__dict__[attr_name]
- except (AttributeError, KeyError):
- old_value = getattr(object_to_patch, attr_name, None)
- else:
- attr_is_local = True
-
- # restore the value when the test is done
- def cleanup():
- if attr_is_local:
- setattr(object_to_patch, attr_name, old_value)
- else:
- delattr(object_to_patch, attr_name)
-
- test_instance.addCleanup(cleanup)
-
- # actually override the attribute
- setattr(object_to_patch, attr_name, new_value)
diff --git a/test-data/stdlib-samples/3.2/test/test_base64.py b/test-data/stdlib-samples/3.2/test/test_base64.py
deleted file mode 100644
index 9e4dcf5..0000000
--- a/test-data/stdlib-samples/3.2/test/test_base64.py
+++ /dev/null
@@ -1,267 +0,0 @@
-import unittest
-from test import support
-import base64
-import binascii
-import sys
-import subprocess
-
-from typing import Any
-
-
-
-class LegacyBase64TestCase(unittest.TestCase):
- def test_encodebytes(self) -> None:
- eq = self.assertEqual
- eq(base64.encodebytes(b"www.python.org"), b"d3d3LnB5dGhvbi5vcmc=\n")
- eq(base64.encodebytes(b"a"), b"YQ==\n")
- eq(base64.encodebytes(b"ab"), b"YWI=\n")
- eq(base64.encodebytes(b"abc"), b"YWJj\n")
- eq(base64.encodebytes(b""), b"")
- eq(base64.encodebytes(b"abcdefghijklmnopqrstuvwxyz"
- b"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- b"0123456789!@#0^&*();:<>,. []{}"),
- b"YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNE"
- b"RUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0\nNT"
- b"Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ==\n")
- self.assertRaises(TypeError, base64.encodebytes, "")
-
- def test_decodebytes(self) -> None:
- eq = self.assertEqual
- eq(base64.decodebytes(b"d3d3LnB5dGhvbi5vcmc=\n"), b"www.python.org")
- eq(base64.decodebytes(b"YQ==\n"), b"a")
- eq(base64.decodebytes(b"YWI=\n"), b"ab")
- eq(base64.decodebytes(b"YWJj\n"), b"abc")
- eq(base64.decodebytes(b"YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNE"
- b"RUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0\nNT"
- b"Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ==\n"),
- b"abcdefghijklmnopqrstuvwxyz"
- b"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- b"0123456789!@#0^&*();:<>,. []{}")
- eq(base64.decodebytes(b''), b'')
- self.assertRaises(TypeError, base64.decodebytes, "")
-
- def test_encode(self) -> None:
- eq = self.assertEqual
- from io import BytesIO
- infp = BytesIO(b'abcdefghijklmnopqrstuvwxyz'
- b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
- b'0123456789!@#0^&*();:<>,. []{}')
- outfp = BytesIO()
- base64.encode(infp, outfp)
- eq(outfp.getvalue(),
- b'YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNE'
- b'RUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0\nNT'
- b'Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ==\n')
-
- def test_decode(self) -> None:
- from io import BytesIO
- infp = BytesIO(b'd3d3LnB5dGhvbi5vcmc=')
- outfp = BytesIO()
- base64.decode(infp, outfp)
- self.assertEqual(outfp.getvalue(), b'www.python.org')
-
-
-class BaseXYTestCase(unittest.TestCase):
- def test_b64encode(self) -> None:
- eq = self.assertEqual
- # Test default alphabet
- eq(base64.b64encode(b"www.python.org"), b"d3d3LnB5dGhvbi5vcmc=")
- eq(base64.b64encode(b'\x00'), b'AA==')
- eq(base64.b64encode(b"a"), b"YQ==")
- eq(base64.b64encode(b"ab"), b"YWI=")
- eq(base64.b64encode(b"abc"), b"YWJj")
- eq(base64.b64encode(b""), b"")
- eq(base64.b64encode(b"abcdefghijklmnopqrstuvwxyz"
- b"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- b"0123456789!@#0^&*();:<>,. []{}"),
- b"YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNE"
- b"RUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NT"
- b"Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ==")
- # Test with arbitrary alternative characters
- eq(base64.b64encode(b'\xd3V\xbeo\xf7\x1d', altchars=b'*$'), b'01a*b$cd')
- # Check if passing a str object raises an error
- self.assertRaises(TypeError, base64.b64encode, "")
- self.assertRaises(TypeError, base64.b64encode, b"", altchars="")
- # Test standard alphabet
- eq(base64.standard_b64encode(b"www.python.org"), b"d3d3LnB5dGhvbi5vcmc=")
- eq(base64.standard_b64encode(b"a"), b"YQ==")
- eq(base64.standard_b64encode(b"ab"), b"YWI=")
- eq(base64.standard_b64encode(b"abc"), b"YWJj")
- eq(base64.standard_b64encode(b""), b"")
- eq(base64.standard_b64encode(b"abcdefghijklmnopqrstuvwxyz"
- b"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- b"0123456789!@#0^&*();:<>,. []{}"),
- b"YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNE"
- b"RUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NT"
- b"Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ==")
- # Check if passing a str object raises an error
- self.assertRaises(TypeError, base64.standard_b64encode, "")
- self.assertRaises(TypeError, base64.standard_b64encode, b"", altchars="")
- # Test with 'URL safe' alternative characters
- eq(base64.urlsafe_b64encode(b'\xd3V\xbeo\xf7\x1d'), b'01a-b_cd')
- # Check if passing a str object raises an error
- self.assertRaises(TypeError, base64.urlsafe_b64encode, "")
-
- def test_b64decode(self) -> None:
- eq = self.assertEqual
- eq(base64.b64decode(b"d3d3LnB5dGhvbi5vcmc="), b"www.python.org")
- eq(base64.b64decode(b'AA=='), b'\x00')
- eq(base64.b64decode(b"YQ=="), b"a")
- eq(base64.b64decode(b"YWI="), b"ab")
- eq(base64.b64decode(b"YWJj"), b"abc")
- eq(base64.b64decode(b"YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNE"
- b"RUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0\nNT"
- b"Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ=="),
- b"abcdefghijklmnopqrstuvwxyz"
- b"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- b"0123456789!@#0^&*();:<>,. []{}")
- eq(base64.b64decode(b''), b'')
- # Test with arbitrary alternative characters
- eq(base64.b64decode(b'01a*b$cd', altchars=b'*$'), b'\xd3V\xbeo\xf7\x1d')
- # Check if passing a str object raises an error
- self.assertRaises(TypeError, base64.b64decode, "")
- self.assertRaises(TypeError, base64.b64decode, b"", altchars="")
- # Test standard alphabet
- eq(base64.standard_b64decode(b"d3d3LnB5dGhvbi5vcmc="), b"www.python.org")
- eq(base64.standard_b64decode(b"YQ=="), b"a")
- eq(base64.standard_b64decode(b"YWI="), b"ab")
- eq(base64.standard_b64decode(b"YWJj"), b"abc")
- eq(base64.standard_b64decode(b""), b"")
- eq(base64.standard_b64decode(b"YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNE"
- b"RUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NT"
- b"Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ=="),
- b"abcdefghijklmnopqrstuvwxyz"
- b"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- b"0123456789!@#0^&*();:<>,. []{}")
- # Check if passing a str object raises an error
- self.assertRaises(TypeError, base64.standard_b64decode, "")
- self.assertRaises(TypeError, base64.standard_b64decode, b"", altchars="")
- # Test with 'URL safe' alternative characters
- eq(base64.urlsafe_b64decode(b'01a-b_cd'), b'\xd3V\xbeo\xf7\x1d')
- self.assertRaises(TypeError, base64.urlsafe_b64decode, "")
-
- def test_b64decode_padding_error(self) -> None:
- self.assertRaises(binascii.Error, base64.b64decode, b'abc')
-
- def test_b64decode_invalid_chars(self) -> None:
- # issue 1466065: Test some invalid characters.
- tests = ((b'%3d==', b'\xdd'),
- (b'$3d==', b'\xdd'),
- (b'[==', b''),
- (b'YW]3=', b'am'),
- (b'3{d==', b'\xdd'),
- (b'3d}==', b'\xdd'),
- (b'@@', b''),
- (b'!', b''),
- (b'YWJj\nYWI=', b'abcab'))
- for bstr, res in tests:
- self.assertEqual(base64.b64decode(bstr), res)
- with self.assertRaises(binascii.Error):
- base64.b64decode(bstr, validate=True)
-
- def test_b32encode(self) -> None:
- eq = self.assertEqual
- eq(base64.b32encode(b''), b'')
- eq(base64.b32encode(b'\x00'), b'AA======')
- eq(base64.b32encode(b'a'), b'ME======')
- eq(base64.b32encode(b'ab'), b'MFRA====')
- eq(base64.b32encode(b'abc'), b'MFRGG===')
- eq(base64.b32encode(b'abcd'), b'MFRGGZA=')
- eq(base64.b32encode(b'abcde'), b'MFRGGZDF')
- self.assertRaises(TypeError, base64.b32encode, "")
-
- def test_b32decode(self) -> None:
- eq = self.assertEqual
- eq(base64.b32decode(b''), b'')
- eq(base64.b32decode(b'AA======'), b'\x00')
- eq(base64.b32decode(b'ME======'), b'a')
- eq(base64.b32decode(b'MFRA===='), b'ab')
- eq(base64.b32decode(b'MFRGG==='), b'abc')
- eq(base64.b32decode(b'MFRGGZA='), b'abcd')
- eq(base64.b32decode(b'MFRGGZDF'), b'abcde')
- self.assertRaises(TypeError, base64.b32decode, "")
-
- def test_b32decode_casefold(self) -> None:
- eq = self.assertEqual
- eq(base64.b32decode(b'', True), b'')
- eq(base64.b32decode(b'ME======', True), b'a')
- eq(base64.b32decode(b'MFRA====', True), b'ab')
- eq(base64.b32decode(b'MFRGG===', True), b'abc')
- eq(base64.b32decode(b'MFRGGZA=', True), b'abcd')
- eq(base64.b32decode(b'MFRGGZDF', True), b'abcde')
- # Lower cases
- eq(base64.b32decode(b'me======', True), b'a')
- eq(base64.b32decode(b'mfra====', True), b'ab')
- eq(base64.b32decode(b'mfrgg===', True), b'abc')
- eq(base64.b32decode(b'mfrggza=', True), b'abcd')
- eq(base64.b32decode(b'mfrggzdf', True), b'abcde')
- # Expected exceptions
- self.assertRaises(TypeError, base64.b32decode, b'me======')
- # Mapping zero and one
- eq(base64.b32decode(b'MLO23456'), b'b\xdd\xad\xf3\xbe')
- eq(base64.b32decode(b'M1023456', map01=b'L'), b'b\xdd\xad\xf3\xbe')
- eq(base64.b32decode(b'M1023456', map01=b'I'), b'b\x1d\xad\xf3\xbe')
- self.assertRaises(TypeError, base64.b32decode, b"", map01="")
-
- def test_b32decode_error(self) -> None:
- self.assertRaises(binascii.Error, base64.b32decode, b'abc')
- self.assertRaises(binascii.Error, base64.b32decode, b'ABCDEF==')
-
- def test_b16encode(self) -> None:
- eq = self.assertEqual
- eq(base64.b16encode(b'\x01\x02\xab\xcd\xef'), b'0102ABCDEF')
- eq(base64.b16encode(b'\x00'), b'00')
- self.assertRaises(TypeError, base64.b16encode, "")
-
- def test_b16decode(self) -> None:
- eq = self.assertEqual
- eq(base64.b16decode(b'0102ABCDEF'), b'\x01\x02\xab\xcd\xef')
- eq(base64.b16decode(b'00'), b'\x00')
- # Lower case is not allowed without a flag
- self.assertRaises(binascii.Error, base64.b16decode, b'0102abcdef')
- # Case fold
- eq(base64.b16decode(b'0102abcdef', True), b'\x01\x02\xab\xcd\xef')
- self.assertRaises(TypeError, base64.b16decode, "")
-
- def test_ErrorHeritage(self) -> None:
- self.assertTrue(issubclass(binascii.Error, ValueError))
-
-
-
-class TestMain(unittest.TestCase):
- def get_output(self, *args_tuple: str, **options: Any) -> Any:
- args = [sys.executable, '-m', 'base64'] + list(args_tuple)
- return subprocess.check_output(args, **options)
-
- def test_encode_decode(self) -> None:
- output = self.get_output('-t')
- self.assertSequenceEqual(output.splitlines(), [
- b"b'Aladdin:open sesame'",
- br"b'QWxhZGRpbjpvcGVuIHNlc2FtZQ==\n'",
- b"b'Aladdin:open sesame'",
- ])
-
- def test_encode_file(self) -> None:
- with open(support.TESTFN, 'wb') as fp:
- fp.write(b'a\xffb\n')
-
- output = self.get_output('-e', support.TESTFN)
- self.assertEqual(output.rstrip(), b'Yf9iCg==')
-
- with open(support.TESTFN, 'rb') as fp:
- output = self.get_output('-e', stdin=fp)
- self.assertEqual(output.rstrip(), b'Yf9iCg==')
-
- def test_decode(self) -> None:
- with open(support.TESTFN, 'wb') as fp:
- fp.write(b'Yf9iCg==')
- output = self.get_output('-d', support.TESTFN)
- self.assertEqual(output.rstrip(), b'a\xffb')
-
-
-
-def test_main() -> None:
- support.run_unittest(__name__)
-
-if __name__ == '__main__':
- test_main()
diff --git a/test-data/stdlib-samples/3.2/test/test_fnmatch.py b/test-data/stdlib-samples/3.2/test/test_fnmatch.py
deleted file mode 100644
index 0f5a23b..0000000
--- a/test-data/stdlib-samples/3.2/test/test_fnmatch.py
+++ /dev/null
@@ -1,93 +0,0 @@
-"""Test cases for the fnmatch module."""
-
-from test import support
-import unittest
-
-from fnmatch import fnmatch, fnmatchcase, translate, filter
-
-from typing import Any, AnyStr, Callable
-
-class FnmatchTestCase(unittest.TestCase):
-
- def check_match(self, filename: AnyStr, pattern: AnyStr,
- should_match: int = 1,
- fn: Any = fnmatch) -> None: # see #270
- if should_match:
- self.assertTrue(fn(filename, pattern),
- "expected %r to match pattern %r"
- % (filename, pattern))
- else:
- self.assertTrue(not fn(filename, pattern),
- "expected %r not to match pattern %r"
- % (filename, pattern))
-
- def test_fnmatch(self) -> None:
- check = self.check_match
- check('abc', 'abc')
- check('abc', '?*?')
- check('abc', '???*')
- check('abc', '*???')
- check('abc', '???')
- check('abc', '*')
- check('abc', 'ab[cd]')
- check('abc', 'ab[!de]')
- check('abc', 'ab[de]', 0)
- check('a', '??', 0)
- check('a', 'b', 0)
-
- # these test that '\' is handled correctly in character sets;
- # see SF bug #409651
- check('\\', r'[\]')
- check('a', r'[!\]')
- check('\\', r'[!\]', 0)
-
- # test that filenames with newlines in them are handled correctly.
- # http://bugs.python.org/issue6665
- check('foo\nbar', 'foo*')
- check('foo\nbar\n', 'foo*')
- check('\nfoo', 'foo*', False)
- check('\n', '*')
-
- def test_mix_bytes_str(self) -> None:
- self.assertRaises(TypeError, fnmatch, 'test', b'*')
- self.assertRaises(TypeError, fnmatch, b'test', '*')
- self.assertRaises(TypeError, fnmatchcase, 'test', b'*')
- self.assertRaises(TypeError, fnmatchcase, b'test', '*')
-
- def test_fnmatchcase(self) -> None:
- check = self.check_match
- check('AbC', 'abc', 0, fnmatchcase)
- check('abc', 'AbC', 0, fnmatchcase)
-
- def test_bytes(self) -> None:
- self.check_match(b'test', b'te*')
- self.check_match(b'test\xff', b'te*\xff')
- self.check_match(b'foo\nbar', b'foo*')
-
-class TranslateTestCase(unittest.TestCase):
-
- def test_translate(self) -> None:
- self.assertEqual(translate('*'), '.*\Z(?ms)')
- self.assertEqual(translate('?'), '.\Z(?ms)')
- self.assertEqual(translate('a?b*'), 'a.b.*\Z(?ms)')
- self.assertEqual(translate('[abc]'), '[abc]\Z(?ms)')
- self.assertEqual(translate('[]]'), '[]]\Z(?ms)')
- self.assertEqual(translate('[!x]'), '[^x]\Z(?ms)')
- self.assertEqual(translate('[^x]'), '[\\^x]\Z(?ms)')
- self.assertEqual(translate('[x'), '\\[x\Z(?ms)')
-
-
-class FilterTestCase(unittest.TestCase):
-
- def test_filter(self) -> None:
- self.assertEqual(filter(['a', 'b'], 'a'), ['a'])
-
-
-def test_main() -> None:
- support.run_unittest(FnmatchTestCase,
- TranslateTestCase,
- FilterTestCase)
-
-
-if __name__ == "__main__":
- test_main()
diff --git a/test-data/stdlib-samples/3.2/test/test_genericpath.py b/test-data/stdlib-samples/3.2/test/test_genericpath.py
deleted file mode 100644
index 43b78e7..0000000
--- a/test-data/stdlib-samples/3.2/test/test_genericpath.py
+++ /dev/null
@@ -1,313 +0,0 @@
-"""
-Tests common to genericpath, macpath, ntpath and posixpath
-"""
-
-import unittest
-from test import support
-import os
-
-import genericpath
-import imp
-imp.reload(genericpath) # Make sure we are using the local copy
-
-import sys
-from typing import Any, List
-
-
-def safe_rmdir(dirname: str) -> None:
- try:
- os.rmdir(dirname)
- except OSError:
- pass
-
-
-class GenericTest(unittest.TestCase):
- # The path module to be tested
- pathmodule = genericpath # type: Any
- common_attributes = ['commonprefix', 'getsize', 'getatime', 'getctime',
- 'getmtime', 'exists', 'isdir', 'isfile']
- attributes = [] # type: List[str]
-
- def test_no_argument(self) -> None:
- for attr in self.common_attributes + self.attributes:
- with self.assertRaises(TypeError):
- getattr(self.pathmodule, attr)()
- self.fail("{}.{}() did not raise a TypeError"
- .format(self.pathmodule.__name__, attr))
-
- def test_commonprefix(self) -> None:
- commonprefix = self.pathmodule.commonprefix
- self.assertEqual(
- commonprefix([]),
- ""
- )
- self.assertEqual(
- commonprefix(["/home/swenson/spam", "/home/swen/spam"]),
- "/home/swen"
- )
- self.assertEqual(
- commonprefix(["/home/swen/spam", "/home/swen/eggs"]),
- "/home/swen/"
- )
- self.assertEqual(
- commonprefix(["/home/swen/spam", "/home/swen/spam"]),
- "/home/swen/spam"
- )
- self.assertEqual(
- commonprefix(["home:swenson:spam", "home:swen:spam"]),
- "home:swen"
- )
- self.assertEqual(
- commonprefix([":home:swen:spam", ":home:swen:eggs"]),
- ":home:swen:"
- )
- self.assertEqual(
- commonprefix([":home:swen:spam", ":home:swen:spam"]),
- ":home:swen:spam"
- )
-
- self.assertEqual(
- commonprefix([b"/home/swenson/spam", b"/home/swen/spam"]),
- b"/home/swen"
- )
- self.assertEqual(
- commonprefix([b"/home/swen/spam", b"/home/swen/eggs"]),
- b"/home/swen/"
- )
- self.assertEqual(
- commonprefix([b"/home/swen/spam", b"/home/swen/spam"]),
- b"/home/swen/spam"
- )
- self.assertEqual(
- commonprefix([b"home:swenson:spam", b"home:swen:spam"]),
- b"home:swen"
- )
- self.assertEqual(
- commonprefix([b":home:swen:spam", b":home:swen:eggs"]),
- b":home:swen:"
- )
- self.assertEqual(
- commonprefix([b":home:swen:spam", b":home:swen:spam"]),
- b":home:swen:spam"
- )
-
- testlist = ['', 'abc', 'Xbcd', 'Xb', 'XY', 'abcd',
- 'aXc', 'abd', 'ab', 'aX', 'abcX']
- for s1 in testlist:
- for s2 in testlist:
- p = commonprefix([s1, s2])
- self.assertTrue(s1.startswith(p))
- self.assertTrue(s2.startswith(p))
- if s1 != s2:
- n = len(p)
- self.assertNotEqual(s1[n:n+1], s2[n:n+1])
-
- def test_getsize(self) -> None:
- f = open(support.TESTFN, "wb")
- try:
- f.write(b"foo")
- f.close()
- self.assertEqual(self.pathmodule.getsize(support.TESTFN), 3)
- finally:
- if not f.closed:
- f.close()
- support.unlink(support.TESTFN)
-
- def test_time(self) -> None:
- f = open(support.TESTFN, "wb")
- try:
- f.write(b"foo")
- f.close()
- f = open(support.TESTFN, "ab")
- f.write(b"bar")
- f.close()
- f = open(support.TESTFN, "rb")
- d = f.read()
- f.close()
- self.assertEqual(d, b"foobar")
-
- self.assertLessEqual(
- self.pathmodule.getctime(support.TESTFN),
- self.pathmodule.getmtime(support.TESTFN)
- )
- finally:
- if not f.closed:
- f.close()
- support.unlink(support.TESTFN)
-
- def test_exists(self) -> None:
- self.assertIs(self.pathmodule.exists(support.TESTFN), False)
- f = open(support.TESTFN, "wb")
- try:
- f.write(b"foo")
- f.close()
- self.assertIs(self.pathmodule.exists(support.TESTFN), True)
- if not self.pathmodule == genericpath:
- self.assertIs(self.pathmodule.lexists(support.TESTFN),
- True)
- finally:
- if not f.closed:
- f.close()
- support.unlink(support.TESTFN)
-
- def test_isdir(self) -> None:
- self.assertIs(self.pathmodule.isdir(support.TESTFN), False)
- f = open(support.TESTFN, "wb")
- try:
- f.write(b"foo")
- f.close()
- self.assertIs(self.pathmodule.isdir(support.TESTFN), False)
- os.remove(support.TESTFN)
- os.mkdir(support.TESTFN)
- self.assertIs(self.pathmodule.isdir(support.TESTFN), True)
- os.rmdir(support.TESTFN)
- finally:
- if not f.closed:
- f.close()
- support.unlink(support.TESTFN)
- safe_rmdir(support.TESTFN)
-
- def test_isfile(self) -> None:
- self.assertIs(self.pathmodule.isfile(support.TESTFN), False)
- f = open(support.TESTFN, "wb")
- try:
- f.write(b"foo")
- f.close()
- self.assertIs(self.pathmodule.isfile(support.TESTFN), True)
- os.remove(support.TESTFN)
- os.mkdir(support.TESTFN)
- self.assertIs(self.pathmodule.isfile(support.TESTFN), False)
- os.rmdir(support.TESTFN)
- finally:
- if not f.closed:
- f.close()
- support.unlink(support.TESTFN)
- safe_rmdir(support.TESTFN)
-
-
-# Following TestCase is not supposed to be run from test_genericpath.
-# It is inherited by other test modules (macpath, ntpath, posixpath).
-
-class CommonTest(GenericTest):
- # The path module to be tested
- pathmodule = None # type: Any
- common_attributes = GenericTest.common_attributes + [
- # Properties
- 'curdir', 'pardir', 'extsep', 'sep',
- 'pathsep', 'defpath', 'altsep', 'devnull',
- # Methods
- 'normcase', 'splitdrive', 'expandvars', 'normpath', 'abspath',
- 'join', 'split', 'splitext', 'isabs', 'basename', 'dirname',
- 'lexists', 'islink', 'ismount', 'expanduser', 'normpath', 'realpath',
- ]
-
- def test_normcase(self) -> None:
- normcase = self.pathmodule.normcase
- # check that normcase() is idempotent
- for p in ["FoO/./BaR", b"FoO/./BaR"]:
- p = normcase(p)
- self.assertEqual(p, normcase(p))
-
- self.assertEqual(normcase(''), '')
- self.assertEqual(normcase(b''), b'')
-
- # check that normcase raises a TypeError for invalid types
- for path in (None, True, 0, 2.5, [], bytearray(b''), {'o','o'}):
- self.assertRaises(TypeError, normcase, path)
-
- def test_splitdrive(self) -> None:
- # splitdrive for non-NT paths
- splitdrive = self.pathmodule.splitdrive
- self.assertEqual(splitdrive("/foo/bar"), ("", "/foo/bar"))
- self.assertEqual(splitdrive("foo:bar"), ("", "foo:bar"))
- self.assertEqual(splitdrive(":foo:bar"), ("", ":foo:bar"))
-
- self.assertEqual(splitdrive(b"/foo/bar"), (b"", b"/foo/bar"))
- self.assertEqual(splitdrive(b"foo:bar"), (b"", b"foo:bar"))
- self.assertEqual(splitdrive(b":foo:bar"), (b"", b":foo:bar"))
-
- def test_expandvars(self) -> None:
- if self.pathmodule.__name__ == 'macpath':
- self.skipTest('macpath.expandvars is a stub')
- expandvars = self.pathmodule.expandvars
- with support.EnvironmentVarGuard() as env:
- env.clear()
- env["foo"] = "bar"
- env["{foo"] = "baz1"
- env["{foo}"] = "baz2"
- self.assertEqual(expandvars("foo"), "foo")
- self.assertEqual(expandvars("$foo bar"), "bar bar")
- self.assertEqual(expandvars("${foo}bar"), "barbar")
- self.assertEqual(expandvars("$[foo]bar"), "$[foo]bar")
- self.assertEqual(expandvars("$bar bar"), "$bar bar")
- self.assertEqual(expandvars("$?bar"), "$?bar")
- self.assertEqual(expandvars("${foo}bar"), "barbar")
- self.assertEqual(expandvars("$foo}bar"), "bar}bar")
- self.assertEqual(expandvars("${foo"), "${foo")
- self.assertEqual(expandvars("${{foo}}"), "baz1}")
- self.assertEqual(expandvars("$foo$foo"), "barbar")
- self.assertEqual(expandvars("$bar$bar"), "$bar$bar")
-
- self.assertEqual(expandvars(b"foo"), b"foo")
- self.assertEqual(expandvars(b"$foo bar"), b"bar bar")
- self.assertEqual(expandvars(b"${foo}bar"), b"barbar")
- self.assertEqual(expandvars(b"$[foo]bar"), b"$[foo]bar")
- self.assertEqual(expandvars(b"$bar bar"), b"$bar bar")
- self.assertEqual(expandvars(b"$?bar"), b"$?bar")
- self.assertEqual(expandvars(b"${foo}bar"), b"barbar")
- self.assertEqual(expandvars(b"$foo}bar"), b"bar}bar")
- self.assertEqual(expandvars(b"${foo"), b"${foo")
- self.assertEqual(expandvars(b"${{foo}}"), b"baz1}")
- self.assertEqual(expandvars(b"$foo$foo"), b"barbar")
- self.assertEqual(expandvars(b"$bar$bar"), b"$bar$bar")
-
- def test_abspath(self) -> None:
- self.assertIn("foo", self.pathmodule.abspath("foo"))
- self.assertIn(b"foo", self.pathmodule.abspath(b"foo"))
-
- # Abspath returns bytes when the arg is bytes
- for path in (b'', b'foo', b'f\xf2\xf2', b'/foo', b'C:\\'):
- self.assertIsInstance(self.pathmodule.abspath(path), bytes)
-
- def test_realpath(self) -> None:
- self.assertIn("foo", self.pathmodule.realpath("foo"))
- self.assertIn(b"foo", self.pathmodule.realpath(b"foo"))
-
- def test_normpath_issue5827(self) -> None:
- # Make sure normpath preserves unicode
- for path in ('', '.', '/', '\\', '///foo/.//bar//'):
- self.assertIsInstance(self.pathmodule.normpath(path), str)
-
- def test_abspath_issue3426(self) -> None:
- # Check that abspath returns unicode when the arg is unicode
- # with both ASCII and non-ASCII cwds.
- abspath = self.pathmodule.abspath
- for path in ('', 'fuu', 'f\xf9\xf9', '/fuu', 'U:\\'):
- self.assertIsInstance(abspath(path), str)
-
- unicwd = '\xe7w\xf0'
- try:
- fsencoding = support.TESTFN_ENCODING or "ascii"
- unicwd.encode(fsencoding)
- except (AttributeError, UnicodeEncodeError):
- # FS encoding is probably ASCII
- pass
- else:
- with support.temp_cwd(unicwd):
- for path in ('', 'fuu', 'f\xf9\xf9', '/fuu', 'U:\\'):
- self.assertIsInstance(abspath(path), str)
-
- @unittest.skipIf(sys.platform == 'darwin',
- "Mac OS X denies the creation of a directory with an invalid utf8 name")
- def test_nonascii_abspath(self) -> None:
- # Test non-ASCII, non-UTF8 bytes in the path.
- with support.temp_cwd(b'\xe7w\xf0'):
- self.test_abspath()
-
-
-def test_main() -> None:
- support.run_unittest(GenericTest)
-
-
-if __name__=="__main__":
- test_main()
diff --git a/test-data/stdlib-samples/3.2/test/test_getopt.py b/test-data/stdlib-samples/3.2/test/test_getopt.py
deleted file mode 100644
index 3320552..0000000
--- a/test-data/stdlib-samples/3.2/test/test_getopt.py
+++ /dev/null
@@ -1,190 +0,0 @@
-# test_getopt.py
-# David Goodger <dgoodger at bigfoot.com> 2000-08-19
-
-from test.support import verbose, run_doctest, run_unittest, EnvironmentVarGuard
-import unittest
-
-import getopt
-
-from typing import cast, Any
-
-sentinel = object()
-
-class GetoptTests(unittest.TestCase):
- def setUp(self) -> None:
- self.env = EnvironmentVarGuard()
- if "POSIXLY_CORRECT" in self.env:
- del self.env["POSIXLY_CORRECT"]
-
- def tearDown(self) -> None:
- self.env.__exit__()
- del self.env
-
- def assertError(self, *args: Any, **kwargs: Any) -> None:
- # JLe: work around mypy bug #229
- cast(Any, self.assertRaises)(getopt.GetoptError, *args, **kwargs)
-
- def test_short_has_arg(self) -> None:
- self.assertTrue(getopt.short_has_arg('a', 'a:'))
- self.assertFalse(getopt.short_has_arg('a', 'a'))
- self.assertError(getopt.short_has_arg, 'a', 'b')
-
- def test_long_has_args(self) -> None:
- has_arg, option = getopt.long_has_args('abc', ['abc='])
- self.assertTrue(has_arg)
- self.assertEqual(option, 'abc')
-
- has_arg, option = getopt.long_has_args('abc', ['abc'])
- self.assertFalse(has_arg)
- self.assertEqual(option, 'abc')
-
- has_arg, option = getopt.long_has_args('abc', ['abcd'])
- self.assertFalse(has_arg)
- self.assertEqual(option, 'abcd')
-
- self.assertError(getopt.long_has_args, 'abc', ['def'])
- self.assertError(getopt.long_has_args, 'abc', [])
- self.assertError(getopt.long_has_args, 'abc', ['abcd','abcde'])
-
- def test_do_shorts(self) -> None:
- opts, args = getopt.do_shorts([], 'a', 'a', [])
- self.assertEqual(opts, [('-a', '')])
- self.assertEqual(args, [])
-
- opts, args = getopt.do_shorts([], 'a1', 'a:', [])
- self.assertEqual(opts, [('-a', '1')])
- self.assertEqual(args, [])
-
- #opts, args = getopt.do_shorts([], 'a=1', 'a:', [])
- #self.assertEqual(opts, [('-a', '1')])
- #self.assertEqual(args, [])
-
- opts, args = getopt.do_shorts([], 'a', 'a:', ['1'])
- self.assertEqual(opts, [('-a', '1')])
- self.assertEqual(args, [])
-
- opts, args = getopt.do_shorts([], 'a', 'a:', ['1', '2'])
- self.assertEqual(opts, [('-a', '1')])
- self.assertEqual(args, ['2'])
-
- self.assertError(getopt.do_shorts, [], 'a1', 'a', [])
- self.assertError(getopt.do_shorts, [], 'a', 'a:', [])
-
- def test_do_longs(self) -> None:
- opts, args = getopt.do_longs([], 'abc', ['abc'], [])
- self.assertEqual(opts, [('--abc', '')])
- self.assertEqual(args, [])
-
- opts, args = getopt.do_longs([], 'abc=1', ['abc='], [])
- self.assertEqual(opts, [('--abc', '1')])
- self.assertEqual(args, [])
-
- opts, args = getopt.do_longs([], 'abc=1', ['abcd='], [])
- self.assertEqual(opts, [('--abcd', '1')])
- self.assertEqual(args, [])
-
- opts, args = getopt.do_longs([], 'abc', ['ab', 'abc', 'abcd'], [])
- self.assertEqual(opts, [('--abc', '')])
- self.assertEqual(args, [])
-
- # Much like the preceding, except with a non-alpha character ("-") in
- # option name that precedes "="; failed in
- # http://python.org/sf/126863
- opts, args = getopt.do_longs([], 'foo=42', ['foo-bar', 'foo=',], [])
- self.assertEqual(opts, [('--foo', '42')])
- self.assertEqual(args, [])
-
- self.assertError(getopt.do_longs, [], 'abc=1', ['abc'], [])
- self.assertError(getopt.do_longs, [], 'abc', ['abc='], [])
-
- def test_getopt(self) -> None:
- # note: the empty string between '-a' and '--beta' is significant:
- # it simulates an empty string option argument ('-a ""') on the
- # command line.
- cmdline = ['-a', '1', '-b', '--alpha=2', '--beta', '-a', '3', '-a',
- '', '--beta', 'arg1', 'arg2']
-
- opts, args = getopt.getopt(cmdline, 'a:b', ['alpha=', 'beta'])
- self.assertEqual(opts, [('-a', '1'), ('-b', ''),
- ('--alpha', '2'), ('--beta', ''),
- ('-a', '3'), ('-a', ''), ('--beta', '')])
- # Note ambiguity of ('-b', '') and ('-a', '') above. This must be
- # accounted for in the code that calls getopt().
- self.assertEqual(args, ['arg1', 'arg2'])
-
- self.assertError(getopt.getopt, cmdline, 'a:b', ['alpha', 'beta'])
-
- def test_gnu_getopt(self) -> None:
- # Test handling of GNU style scanning mode.
- cmdline = ['-a', 'arg1', '-b', '1', '--alpha', '--beta=2']
-
- # GNU style
- opts, args = getopt.gnu_getopt(cmdline, 'ab:', ['alpha', 'beta='])
- self.assertEqual(args, ['arg1'])
- self.assertEqual(opts, [('-a', ''), ('-b', '1'),
- ('--alpha', ''), ('--beta', '2')])
-
- # recognize "-" as an argument
- opts, args = getopt.gnu_getopt(['-a', '-', '-b', '-'], 'ab:', [])
- self.assertEqual(args, ['-'])
- self.assertEqual(opts, [('-a', ''), ('-b', '-')])
-
- # Posix style via +
- opts, args = getopt.gnu_getopt(cmdline, '+ab:', ['alpha', 'beta='])
- self.assertEqual(opts, [('-a', '')])
- self.assertEqual(args, ['arg1', '-b', '1', '--alpha', '--beta=2'])
-
- # Posix style via POSIXLY_CORRECT
- self.env["POSIXLY_CORRECT"] = "1"
- opts, args = getopt.gnu_getopt(cmdline, 'ab:', ['alpha', 'beta='])
- self.assertEqual(opts, [('-a', '')])
- self.assertEqual(args, ['arg1', '-b', '1', '--alpha', '--beta=2'])
-
- def test_libref_examples(self) -> None:
- s = """
- Examples from the Library Reference: Doc/lib/libgetopt.tex
-
- An example using only Unix style options:
-
-
- >>> import getopt
- >>> args = '-a -b -cfoo -d bar a1 a2'.split()
- >>> args
- ['-a', '-b', '-cfoo', '-d', 'bar', 'a1', 'a2']
- >>> optlist, args = getopt.getopt(args, 'abc:d:')
- >>> optlist
- [('-a', ''), ('-b', ''), ('-c', 'foo'), ('-d', 'bar')]
- >>> args
- ['a1', 'a2']
-
- Using long option names is equally easy:
-
-
- >>> s = '--condition=foo --testing --output-file abc.def -x a1 a2'
- >>> args = s.split()
- >>> args
- ['--condition=foo', '--testing', '--output-file', 'abc.def', '-x', 'a1', 'a2']
- >>> optlist, args = getopt.getopt(args, 'x', [
- ... 'condition=', 'output-file=', 'testing'])
- >>> optlist
- [('--condition', 'foo'), ('--testing', ''), ('--output-file', 'abc.def'), ('-x', '')]
- >>> args
- ['a1', 'a2']
- """
-
- import types
- m = types.ModuleType("libreftest", s)
- run_doctest(m, verbose)
-
- def test_issue4629(self) -> None:
- longopts, shortopts = getopt.getopt(['--help='], '', ['help='])
- self.assertEqual(longopts, [('--help', '')])
- longopts, shortopts = getopt.getopt(['--help=x'], '', ['help='])
- self.assertEqual(longopts, [('--help', 'x')])
- self.assertRaises(getopt.GetoptError, getopt.getopt, ['--help='], '', ['help'])
-
-def test_main() -> None:
- run_unittest(GetoptTests)
-
-if __name__ == "__main__":
- test_main()
diff --git a/test-data/stdlib-samples/3.2/test/test_glob.py b/test-data/stdlib-samples/3.2/test/test_glob.py
deleted file mode 100644
index 08c8932..0000000
--- a/test-data/stdlib-samples/3.2/test/test_glob.py
+++ /dev/null
@@ -1,122 +0,0 @@
-import unittest
-from test.support import run_unittest, TESTFN, skip_unless_symlink, can_symlink
-import glob
-import os
-import shutil
-
-from typing import TypeVar, Iterable, List, cast
-
-T = TypeVar('T')
-
-class GlobTests(unittest.TestCase):
-
- tempdir = ''
-
- # JLe: work around mypy issue #231
- def norm(self, first: str, *parts: str) -> str:
- return os.path.normpath(os.path.join(self.tempdir, first, *parts))
-
- def mktemp(self, *parts: str) -> None:
- filename = self.norm(*parts)
- base, file = os.path.split(filename)
- if not os.path.exists(base):
- os.makedirs(base)
- f = open(filename, 'w')
- f.close()
-
- def setUp(self) -> None:
- self.tempdir = TESTFN+"_dir"
- self.mktemp('a', 'D')
- self.mktemp('aab', 'F')
- self.mktemp('aaa', 'zzzF')
- self.mktemp('ZZZ')
- self.mktemp('a', 'bcd', 'EF')
- self.mktemp('a', 'bcd', 'efg', 'ha')
- if can_symlink():
- os.symlink(self.norm('broken'), self.norm('sym1'))
- os.symlink(self.norm('broken'), self.norm('sym2'))
-
- def tearDown(self) -> None:
- shutil.rmtree(self.tempdir)
-
- def glob(self, *parts: str) -> List[str]:
- if len(parts) == 1:
- pattern = parts[0]
- else:
- pattern = os.path.join(*parts)
- p = os.path.join(self.tempdir, pattern)
- res = glob.glob(p)
- self.assertEqual(list(glob.iglob(p)), res)
- return res
-
- def assertSequencesEqual_noorder(self, l1: Iterable[T],
- l2: Iterable[T]) -> None:
- self.assertEqual(set(l1), set(l2))
-
- def test_glob_literal(self) -> None:
- eq = self.assertSequencesEqual_noorder
- eq(self.glob('a'), [self.norm('a')])
- eq(self.glob('a', 'D'), [self.norm('a', 'D')])
- eq(self.glob('aab'), [self.norm('aab')])
- eq(self.glob('zymurgy'), cast(List[str], [])) # JLe: work around #230
-
- # test return types are unicode, but only if os.listdir
- # returns unicode filenames
- uniset = set([str])
- tmp = os.listdir('.')
- if set(type(x) for x in tmp) == uniset:
- u1 = glob.glob('*')
- u2 = glob.glob('./*')
- self.assertEqual(set(type(r) for r in u1), uniset)
- self.assertEqual(set(type(r) for r in u2), uniset)
-
- def test_glob_one_directory(self) -> None:
- eq = self.assertSequencesEqual_noorder
- eq(self.glob('a*'), map(self.norm, ['a', 'aab', 'aaa']))
- eq(self.glob('*a'), map(self.norm, ['a', 'aaa']))
- eq(self.glob('aa?'), map(self.norm, ['aaa', 'aab']))
- eq(self.glob('aa[ab]'), map(self.norm, ['aaa', 'aab']))
- eq(self.glob('*q'), cast(List[str], [])) # JLe: work around #230
-
- def test_glob_nested_directory(self) -> None:
- eq = self.assertSequencesEqual_noorder
- if os.path.normcase("abCD") == "abCD":
- # case-sensitive filesystem
- eq(self.glob('a', 'bcd', 'E*'), [self.norm('a', 'bcd', 'EF')])
- else:
- # case insensitive filesystem
- eq(self.glob('a', 'bcd', 'E*'), [self.norm('a', 'bcd', 'EF'),
- self.norm('a', 'bcd', 'efg')])
- eq(self.glob('a', 'bcd', '*g'), [self.norm('a', 'bcd', 'efg')])
-
- def test_glob_directory_names(self) -> None:
- eq = self.assertSequencesEqual_noorder
- eq(self.glob('*', 'D'), [self.norm('a', 'D')])
- eq(self.glob('*', '*a'), cast(List[str], [])) # JLe: work around #230
- eq(self.glob('a', '*', '*', '*a'),
- [self.norm('a', 'bcd', 'efg', 'ha')])
- eq(self.glob('?a?', '*F'), map(self.norm, [os.path.join('aaa', 'zzzF'),
- os.path.join('aab', 'F')]))
-
- def test_glob_directory_with_trailing_slash(self) -> None:
- # We are verifying that when there is wildcard pattern which
- # ends with os.sep doesn't blow up.
- res = glob.glob(self.tempdir + '*' + os.sep)
- self.assertEqual(len(res), 1)
- # either of these results are reasonable
- self.assertIn(res[0], [self.tempdir, self.tempdir + os.sep])
-
- @skip_unless_symlink
- def test_glob_broken_symlinks(self) -> None:
- eq = self.assertSequencesEqual_noorder
- eq(self.glob('sym*'), [self.norm('sym1'), self.norm('sym2')])
- eq(self.glob('sym1'), [self.norm('sym1')])
- eq(self.glob('sym2'), [self.norm('sym2')])
-
-
-def test_main() -> None:
- run_unittest(GlobTests)
-
-
-if __name__ == "__main__":
- test_main()
diff --git a/test-data/stdlib-samples/3.2/test/test_posixpath.py b/test-data/stdlib-samples/3.2/test/test_posixpath.py
deleted file mode 100644
index de98975..0000000
--- a/test-data/stdlib-samples/3.2/test/test_posixpath.py
+++ /dev/null
@@ -1,531 +0,0 @@
-import unittest
-from test import support, test_genericpath
-
-import posixpath
-import genericpath
-
-import imp
-imp.reload(posixpath) # Make sure we are using the local copy
-imp.reload(genericpath)
-
-import os
-import sys
-from posixpath import realpath, abspath, dirname, basename
-
-import posix
-from typing import cast, Any, TypeVar, Callable
-
-T = TypeVar('T')
-
-# An absolute path to a temporary filename for testing. We can't rely on TESTFN
-# being an absolute path, so we need this.
-
-ABSTFN = abspath(support.TESTFN)
-
-def skip_if_ABSTFN_contains_backslash(
- test: Callable[[T], None]) -> Callable[[T], None]:
- """
- On Windows, posixpath.abspath still returns paths with backslashes
- instead of posix forward slashes. If this is the case, several tests
- fail, so skip them.
- """
- found_backslash = '\\' in ABSTFN
- msg = "ABSTFN is not a posix path - tests fail"
- return [test, unittest.skip(msg)(test)][found_backslash]
-
-def safe_rmdir(dirname: str) -> None:
- try:
- os.rmdir(dirname)
- except OSError:
- pass
-
-class PosixPathTest(unittest.TestCase):
-
- def setUp(self) -> None:
- self.tearDown()
-
- def tearDown(self) -> None:
- for suffix in ["", "1", "2"]:
- support.unlink(support.TESTFN + suffix)
- safe_rmdir(support.TESTFN + suffix)
-
- def test_join(self) -> None:
- self.assertEqual(posixpath.join("/foo", "bar", "/bar", "baz"),
- "/bar/baz")
- self.assertEqual(posixpath.join("/foo", "bar", "baz"), "/foo/bar/baz")
- self.assertEqual(posixpath.join("/foo/", "bar/", "baz/"),
- "/foo/bar/baz/")
-
- self.assertEqual(posixpath.join(b"/foo", b"bar", b"/bar", b"baz"),
- b"/bar/baz")
- self.assertEqual(posixpath.join(b"/foo", b"bar", b"baz"),
- b"/foo/bar/baz")
- self.assertEqual(posixpath.join(b"/foo/", b"bar/", b"baz/"),
- b"/foo/bar/baz/")
-
- self.assertRaises(TypeError, posixpath.join, b"bytes", "str")
- self.assertRaises(TypeError, posixpath.join, "str", b"bytes")
-
- def test_split(self) -> None:
- self.assertEqual(posixpath.split("/foo/bar"), ("/foo", "bar"))
- self.assertEqual(posixpath.split("/"), ("/", ""))
- self.assertEqual(posixpath.split("foo"), ("", "foo"))
- self.assertEqual(posixpath.split("////foo"), ("////", "foo"))
- self.assertEqual(posixpath.split("//foo//bar"), ("//foo", "bar"))
-
- self.assertEqual(posixpath.split(b"/foo/bar"), (b"/foo", b"bar"))
- self.assertEqual(posixpath.split(b"/"), (b"/", b""))
- self.assertEqual(posixpath.split(b"foo"), (b"", b"foo"))
- self.assertEqual(posixpath.split(b"////foo"), (b"////", b"foo"))
- self.assertEqual(posixpath.split(b"//foo//bar"), (b"//foo", b"bar"))
-
- def splitextTest(self, path: str, filename: str, ext: str) -> None:
- self.assertEqual(posixpath.splitext(path), (filename, ext))
- self.assertEqual(posixpath.splitext("/" + path), ("/" + filename, ext))
- self.assertEqual(posixpath.splitext("abc/" + path),
- ("abc/" + filename, ext))
- self.assertEqual(posixpath.splitext("abc.def/" + path),
- ("abc.def/" + filename, ext))
- self.assertEqual(posixpath.splitext("/abc.def/" + path),
- ("/abc.def/" + filename, ext))
- self.assertEqual(posixpath.splitext(path + "/"),
- (filename + ext + "/", ""))
-
- pathb = bytes(path, "ASCII")
- filenameb = bytes(filename, "ASCII")
- extb = bytes(ext, "ASCII")
-
- self.assertEqual(posixpath.splitext(pathb), (filenameb, extb))
- self.assertEqual(posixpath.splitext(b"/" + pathb),
- (b"/" + filenameb, extb))
- self.assertEqual(posixpath.splitext(b"abc/" + pathb),
- (b"abc/" + filenameb, extb))
- self.assertEqual(posixpath.splitext(b"abc.def/" + pathb),
- (b"abc.def/" + filenameb, extb))
- self.assertEqual(posixpath.splitext(b"/abc.def/" + pathb),
- (b"/abc.def/" + filenameb, extb))
- self.assertEqual(posixpath.splitext(pathb + b"/"),
- (filenameb + extb + b"/", b""))
-
- def test_splitext(self) -> None:
- self.splitextTest("foo.bar", "foo", ".bar")
- self.splitextTest("foo.boo.bar", "foo.boo", ".bar")
- self.splitextTest("foo.boo.biff.bar", "foo.boo.biff", ".bar")
- self.splitextTest(".csh.rc", ".csh", ".rc")
- self.splitextTest("nodots", "nodots", "")
- self.splitextTest(".cshrc", ".cshrc", "")
- self.splitextTest("...manydots", "...manydots", "")
- self.splitextTest("...manydots.ext", "...manydots", ".ext")
- self.splitextTest(".", ".", "")
- self.splitextTest("..", "..", "")
- self.splitextTest("........", "........", "")
- self.splitextTest("", "", "")
-
- def test_isabs(self) -> None:
- self.assertIs(posixpath.isabs(""), False)
- self.assertIs(posixpath.isabs("/"), True)
- self.assertIs(posixpath.isabs("/foo"), True)
- self.assertIs(posixpath.isabs("/foo/bar"), True)
- self.assertIs(posixpath.isabs("foo/bar"), False)
-
- self.assertIs(posixpath.isabs(b""), False)
- self.assertIs(posixpath.isabs(b"/"), True)
- self.assertIs(posixpath.isabs(b"/foo"), True)
- self.assertIs(posixpath.isabs(b"/foo/bar"), True)
- self.assertIs(posixpath.isabs(b"foo/bar"), False)
-
- def test_basename(self) -> None:
- self.assertEqual(posixpath.basename("/foo/bar"), "bar")
- self.assertEqual(posixpath.basename("/"), "")
- self.assertEqual(posixpath.basename("foo"), "foo")
- self.assertEqual(posixpath.basename("////foo"), "foo")
- self.assertEqual(posixpath.basename("//foo//bar"), "bar")
-
- self.assertEqual(posixpath.basename(b"/foo/bar"), b"bar")
- self.assertEqual(posixpath.basename(b"/"), b"")
- self.assertEqual(posixpath.basename(b"foo"), b"foo")
- self.assertEqual(posixpath.basename(b"////foo"), b"foo")
- self.assertEqual(posixpath.basename(b"//foo//bar"), b"bar")
-
- def test_dirname(self) -> None:
- self.assertEqual(posixpath.dirname("/foo/bar"), "/foo")
- self.assertEqual(posixpath.dirname("/"), "/")
- self.assertEqual(posixpath.dirname("foo"), "")
- self.assertEqual(posixpath.dirname("////foo"), "////")
- self.assertEqual(posixpath.dirname("//foo//bar"), "//foo")
-
- self.assertEqual(posixpath.dirname(b"/foo/bar"), b"/foo")
- self.assertEqual(posixpath.dirname(b"/"), b"/")
- self.assertEqual(posixpath.dirname(b"foo"), b"")
- self.assertEqual(posixpath.dirname(b"////foo"), b"////")
- self.assertEqual(posixpath.dirname(b"//foo//bar"), b"//foo")
-
- def test_islink(self) -> None:
- self.assertIs(posixpath.islink(support.TESTFN + "1"), False)
- self.assertIs(posixpath.lexists(support.TESTFN + "2"), False)
- f = open(support.TESTFN + "1", "wb")
- try:
- f.write(b"foo")
- f.close()
- self.assertIs(posixpath.islink(support.TESTFN + "1"), False)
- if support.can_symlink():
- os.symlink(support.TESTFN + "1", support.TESTFN + "2")
- self.assertIs(posixpath.islink(support.TESTFN + "2"), True)
- os.remove(support.TESTFN + "1")
- self.assertIs(posixpath.islink(support.TESTFN + "2"), True)
- self.assertIs(posixpath.exists(support.TESTFN + "2"), False)
- self.assertIs(posixpath.lexists(support.TESTFN + "2"), True)
- finally:
- if not f.closed:
- f.close()
-
- @staticmethod
- def _create_file(filename: str) -> None:
- with open(filename, 'wb') as f:
- f.write(b'foo')
-
- def test_samefile(self) -> None:
- test_fn = support.TESTFN + "1"
- self._create_file(test_fn)
- self.assertTrue(posixpath.samefile(test_fn, test_fn))
- self.assertRaises(TypeError, posixpath.samefile)
-
- @unittest.skipIf(
- sys.platform.startswith('win'),
- "posixpath.samefile does not work on links in Windows")
- @unittest.skipUnless(hasattr(os, "symlink"),
- "Missing symlink implementation")
- def test_samefile_on_links(self) -> None:
- test_fn1 = support.TESTFN + "1"
- test_fn2 = support.TESTFN + "2"
- self._create_file(test_fn1)
-
- os.symlink(test_fn1, test_fn2)
- self.assertTrue(posixpath.samefile(test_fn1, test_fn2))
- os.remove(test_fn2)
-
- self._create_file(test_fn2)
- self.assertFalse(posixpath.samefile(test_fn1, test_fn2))
-
-
- def test_samestat(self) -> None:
- test_fn = support.TESTFN + "1"
- self._create_file(test_fn)
- test_fns = [test_fn]*2
- stats = map(os.stat, test_fns)
- self.assertTrue(posixpath.samestat(*stats))
-
- @unittest.skipIf(
- sys.platform.startswith('win'),
- "posixpath.samestat does not work on links in Windows")
- @unittest.skipUnless(hasattr(os, "symlink"),
- "Missing symlink implementation")
- def test_samestat_on_links(self) -> None:
- test_fn1 = support.TESTFN + "1"
- test_fn2 = support.TESTFN + "2"
- self._create_file(test_fn1)
- test_fns = [test_fn1, test_fn2]
- cast(Any, os.symlink)(*test_fns)
- stats = map(os.stat, test_fns)
- self.assertTrue(posixpath.samestat(*stats))
- os.remove(test_fn2)
-
- self._create_file(test_fn2)
- stats = map(os.stat, test_fns)
- self.assertFalse(posixpath.samestat(*stats))
-
- self.assertRaises(TypeError, posixpath.samestat)
-
- def test_ismount(self) -> None:
- self.assertIs(posixpath.ismount("/"), True)
- self.assertIs(posixpath.ismount(b"/"), True)
-
- def test_ismount_non_existent(self) -> None:
- # Non-existent mountpoint.
- self.assertIs(posixpath.ismount(ABSTFN), False)
- try:
- os.mkdir(ABSTFN)
- self.assertIs(posixpath.ismount(ABSTFN), False)
- finally:
- safe_rmdir(ABSTFN)
-
- @unittest.skipUnless(support.can_symlink(),
- "Test requires symlink support")
- def test_ismount_symlinks(self) -> None:
- # Symlinks are never mountpoints.
- try:
- os.symlink("/", ABSTFN)
- self.assertIs(posixpath.ismount(ABSTFN), False)
- finally:
- os.unlink(ABSTFN)
-
- @unittest.skipIf(posix is None, "Test requires posix module")
- def test_ismount_different_device(self) -> None:
- # Simulate the path being on a different device from its parent by
- # mocking out st_dev.
- save_lstat = os.lstat
- def fake_lstat(path):
- st_ino = 0
- st_dev = 0
- if path == ABSTFN:
- st_dev = 1
- st_ino = 1
- return posix.stat_result((0, st_ino, st_dev, 0, 0, 0, 0, 0, 0, 0))
- try:
- setattr(os, 'lstat', fake_lstat) # mypy: can't modify os directly
- self.assertIs(posixpath.ismount(ABSTFN), True)
- finally:
- setattr(os, 'lstat', save_lstat)
-
- def test_expanduser(self) -> None:
- self.assertEqual(posixpath.expanduser("foo"), "foo")
- self.assertEqual(posixpath.expanduser(b"foo"), b"foo")
- try:
- import pwd
- except ImportError:
- pass
- else:
- self.assertIsInstance(posixpath.expanduser("~/"), str)
- self.assertIsInstance(posixpath.expanduser(b"~/"), bytes)
- # if home directory == root directory, this test makes no sense
- if posixpath.expanduser("~") != '/':
- self.assertEqual(
- posixpath.expanduser("~") + "/",
- posixpath.expanduser("~/")
- )
- self.assertEqual(
- posixpath.expanduser(b"~") + b"/",
- posixpath.expanduser(b"~/")
- )
- self.assertIsInstance(posixpath.expanduser("~root/"), str)
- self.assertIsInstance(posixpath.expanduser("~foo/"), str)
- self.assertIsInstance(posixpath.expanduser(b"~root/"), bytes)
- self.assertIsInstance(posixpath.expanduser(b"~foo/"), bytes)
-
- with support.EnvironmentVarGuard() as env:
- env['HOME'] = '/'
- self.assertEqual(posixpath.expanduser("~"), "/")
- # expanduser should fall back to using the password database
- del env['HOME']
- home = pwd.getpwuid(os.getuid()).pw_dir
- self.assertEqual(posixpath.expanduser("~"), home)
-
- def test_normpath(self) -> None:
- self.assertEqual(posixpath.normpath(""), ".")
- self.assertEqual(posixpath.normpath("/"), "/")
- self.assertEqual(posixpath.normpath("//"), "//")
- self.assertEqual(posixpath.normpath("///"), "/")
- self.assertEqual(posixpath.normpath("///foo/.//bar//"), "/foo/bar")
- self.assertEqual(posixpath.normpath("///foo/.//bar//.//..//.//baz"),
- "/foo/baz")
- self.assertEqual(posixpath.normpath("///..//./foo/.//bar"), "/foo/bar")
-
- self.assertEqual(posixpath.normpath(b""), b".")
- self.assertEqual(posixpath.normpath(b"/"), b"/")
- self.assertEqual(posixpath.normpath(b"//"), b"//")
- self.assertEqual(posixpath.normpath(b"///"), b"/")
- self.assertEqual(posixpath.normpath(b"///foo/.//bar//"), b"/foo/bar")
- self.assertEqual(posixpath.normpath(b"///foo/.//bar//.//..//.//baz"),
- b"/foo/baz")
- self.assertEqual(posixpath.normpath(b"///..//./foo/.//bar"),
- b"/foo/bar")
-
- @unittest.skipUnless(hasattr(os, "symlink"),
- "Missing symlink implementation")
- @skip_if_ABSTFN_contains_backslash
- def test_realpath_basic(self) -> None:
- # Basic operation.
- try:
- os.symlink(ABSTFN+"1", ABSTFN)
- self.assertEqual(realpath(ABSTFN), ABSTFN+"1")
- finally:
- support.unlink(ABSTFN)
-
- @unittest.skipUnless(hasattr(os, "symlink"),
- "Missing symlink implementation")
- @skip_if_ABSTFN_contains_backslash
- def test_realpath_relative(self) -> None:
- try:
- os.symlink(posixpath.relpath(ABSTFN+"1"), ABSTFN)
- self.assertEqual(realpath(ABSTFN), ABSTFN+"1")
- finally:
- support.unlink(ABSTFN)
-
- @unittest.skipUnless(hasattr(os, "symlink"),
- "Missing symlink implementation")
- @skip_if_ABSTFN_contains_backslash
- def test_realpath_symlink_loops(self) -> None:
- # Bug #930024, return the path unchanged if we get into an infinite
- # symlink loop.
- try:
- old_path = abspath('.')
- os.symlink(ABSTFN, ABSTFN)
- self.assertEqual(realpath(ABSTFN), ABSTFN)
-
- os.symlink(ABSTFN+"1", ABSTFN+"2")
- os.symlink(ABSTFN+"2", ABSTFN+"1")
- self.assertEqual(realpath(ABSTFN+"1"), ABSTFN+"1")
- self.assertEqual(realpath(ABSTFN+"2"), ABSTFN+"2")
-
- # Test using relative path as well.
- os.chdir(dirname(ABSTFN))
- self.assertEqual(realpath(basename(ABSTFN)), ABSTFN)
- finally:
- os.chdir(old_path)
- support.unlink(ABSTFN)
- support.unlink(ABSTFN+"1")
- support.unlink(ABSTFN+"2")
-
- @unittest.skipUnless(hasattr(os, "symlink"),
- "Missing symlink implementation")
- @skip_if_ABSTFN_contains_backslash
- def test_realpath_resolve_parents(self) -> None:
- # We also need to resolve any symlinks in the parents of a relative
- # path passed to realpath. E.g.: current working directory is
- # /usr/doc with 'doc' being a symlink to /usr/share/doc. We call
- # realpath("a"). This should return /usr/share/doc/a/.
- try:
- old_path = abspath('.')
- os.mkdir(ABSTFN)
- os.mkdir(ABSTFN + "/y")
- os.symlink(ABSTFN + "/y", ABSTFN + "/k")
-
- os.chdir(ABSTFN + "/k")
- self.assertEqual(realpath("a"), ABSTFN + "/y/a")
- finally:
- os.chdir(old_path)
- support.unlink(ABSTFN + "/k")
- safe_rmdir(ABSTFN + "/y")
- safe_rmdir(ABSTFN)
-
- @unittest.skipUnless(hasattr(os, "symlink"),
- "Missing symlink implementation")
- @skip_if_ABSTFN_contains_backslash
- def test_realpath_resolve_before_normalizing(self) -> None:
- # Bug #990669: Symbolic links should be resolved before we
- # normalize the path. E.g.: if we have directories 'a', 'k' and 'y'
- # in the following hierarchy:
- # a/k/y
- #
- # and a symbolic link 'link-y' pointing to 'y' in directory 'a',
- # then realpath("link-y/..") should return 'k', not 'a'.
- try:
- old_path = abspath('.')
- os.mkdir(ABSTFN)
- os.mkdir(ABSTFN + "/k")
- os.mkdir(ABSTFN + "/k/y")
- os.symlink(ABSTFN + "/k/y", ABSTFN + "/link-y")
-
- # Absolute path.
- self.assertEqual(realpath(ABSTFN + "/link-y/.."), ABSTFN + "/k")
- # Relative path.
- os.chdir(dirname(ABSTFN))
- self.assertEqual(realpath(basename(ABSTFN) + "/link-y/.."),
- ABSTFN + "/k")
- finally:
- os.chdir(old_path)
- support.unlink(ABSTFN + "/link-y")
- safe_rmdir(ABSTFN + "/k/y")
- safe_rmdir(ABSTFN + "/k")
- safe_rmdir(ABSTFN)
-
- @unittest.skipUnless(hasattr(os, "symlink"),
- "Missing symlink implementation")
- @skip_if_ABSTFN_contains_backslash
- def test_realpath_resolve_first(self) -> None:
- # Bug #1213894: The first component of the path, if not absolute,
- # must be resolved too.
-
- try:
- old_path = abspath('.')
- os.mkdir(ABSTFN)
- os.mkdir(ABSTFN + "/k")
- os.symlink(ABSTFN, ABSTFN + "link")
- os.chdir(dirname(ABSTFN))
-
- base = basename(ABSTFN)
- self.assertEqual(realpath(base + "link"), ABSTFN)
- self.assertEqual(realpath(base + "link/k"), ABSTFN + "/k")
- finally:
- os.chdir(old_path)
- support.unlink(ABSTFN + "link")
- safe_rmdir(ABSTFN + "/k")
- safe_rmdir(ABSTFN)
-
- def test_relpath(self) -> None:
- real_getcwd = os.getcwd
- # mypy: can't modify os directly
- setattr(os, 'getcwd', lambda: r"/home/user/bar")
- try:
- curdir = os.path.split(os.getcwd())[-1]
- self.assertRaises(ValueError, posixpath.relpath, "")
- self.assertEqual(posixpath.relpath("a"), "a")
- self.assertEqual(posixpath.relpath(posixpath.abspath("a")), "a")
- self.assertEqual(posixpath.relpath("a/b"), "a/b")
- self.assertEqual(posixpath.relpath("../a/b"), "../a/b")
- self.assertEqual(posixpath.relpath("a", "../b"), "../"+curdir+"/a")
- self.assertEqual(posixpath.relpath("a/b", "../c"),
- "../"+curdir+"/a/b")
- self.assertEqual(posixpath.relpath("a", "b/c"), "../../a")
- self.assertEqual(posixpath.relpath("a", "a"), ".")
- self.assertEqual(posixpath.relpath("/foo/bar/bat", "/x/y/z"), '../../../foo/bar/bat')
- self.assertEqual(posixpath.relpath("/foo/bar/bat", "/foo/bar"), 'bat')
- self.assertEqual(posixpath.relpath("/foo/bar/bat", "/"), 'foo/bar/bat')
- self.assertEqual(posixpath.relpath("/", "/foo/bar/bat"), '../../..')
- self.assertEqual(posixpath.relpath("/foo/bar/bat", "/x"), '../foo/bar/bat')
- self.assertEqual(posixpath.relpath("/x", "/foo/bar/bat"), '../../../x')
- self.assertEqual(posixpath.relpath("/", "/"), '.')
- self.assertEqual(posixpath.relpath("/a", "/a"), '.')
- self.assertEqual(posixpath.relpath("/a/b", "/a/b"), '.')
- finally:
- setattr(os, 'getcwd', real_getcwd)
-
- def test_relpath_bytes(self) -> None:
- real_getcwdb = os.getcwdb
- # mypy: can't modify os directly
- setattr(os, 'getcwdb', lambda: br"/home/user/bar")
- try:
- curdir = os.path.split(os.getcwdb())[-1]
- self.assertRaises(ValueError, posixpath.relpath, b"")
- self.assertEqual(posixpath.relpath(b"a"), b"a")
- self.assertEqual(posixpath.relpath(posixpath.abspath(b"a")), b"a")
- self.assertEqual(posixpath.relpath(b"a/b"), b"a/b")
- self.assertEqual(posixpath.relpath(b"../a/b"), b"../a/b")
- self.assertEqual(posixpath.relpath(b"a", b"../b"),
- b"../"+curdir+b"/a")
- self.assertEqual(posixpath.relpath(b"a/b", b"../c"),
- b"../"+curdir+b"/a/b")
- self.assertEqual(posixpath.relpath(b"a", b"b/c"), b"../../a")
- self.assertEqual(posixpath.relpath(b"a", b"a"), b".")
- self.assertEqual(posixpath.relpath(b"/foo/bar/bat", b"/x/y/z"), b'../../../foo/bar/bat')
- self.assertEqual(posixpath.relpath(b"/foo/bar/bat", b"/foo/bar"), b'bat')
- self.assertEqual(posixpath.relpath(b"/foo/bar/bat", b"/"), b'foo/bar/bat')
- self.assertEqual(posixpath.relpath(b"/", b"/foo/bar/bat"), b'../../..')
- self.assertEqual(posixpath.relpath(b"/foo/bar/bat", b"/x"), b'../foo/bar/bat')
- self.assertEqual(posixpath.relpath(b"/x", b"/foo/bar/bat"), b'../../../x')
- self.assertEqual(posixpath.relpath(b"/", b"/"), b'.')
- self.assertEqual(posixpath.relpath(b"/a", b"/a"), b'.')
- self.assertEqual(posixpath.relpath(b"/a/b", b"/a/b"), b'.')
-
- self.assertRaises(TypeError, posixpath.relpath, b"bytes", "str")
- self.assertRaises(TypeError, posixpath.relpath, "str", b"bytes")
- finally:
- setattr(os, 'getcwdb', real_getcwdb)
-
- def test_sameopenfile(self) -> None:
- fname = support.TESTFN + "1"
- with open(fname, "wb") as a, open(fname, "wb") as b:
- self.assertTrue(posixpath.sameopenfile(a.fileno(), b.fileno()))
-
-
-class PosixCommonTest(test_genericpath.CommonTest):
- pathmodule = posixpath
- attributes = ['relpath', 'samefile', 'sameopenfile', 'samestat']
-
-
-def test_main() -> None:
- support.run_unittest(PosixPathTest, PosixCommonTest)
-
-
-if __name__=="__main__":
- test_main()
diff --git a/test-data/stdlib-samples/3.2/test/test_pprint.py b/test-data/stdlib-samples/3.2/test/test_pprint.py
deleted file mode 100644
index cf54ebd..0000000
--- a/test-data/stdlib-samples/3.2/test/test_pprint.py
+++ /dev/null
@@ -1,488 +0,0 @@
-import pprint
-import test.support
-import unittest
-import test.test_set
-import random
-import collections
-import itertools
-
-from typing import List, Any, Dict, Tuple, cast, Callable
-
-# list, tuple and dict subclasses that do or don't overwrite __repr__
-class list2(list):
- pass
-
-class list3(list):
- def __repr__(self) -> str:
- return list.__repr__(self)
-
-class tuple2(tuple):
- pass
-
-class tuple3(tuple):
- def __repr__(self) -> str:
- return tuple.__repr__(self)
-
-class dict2(dict):
- pass
-
-class dict3(dict):
- def __repr__(self) -> str:
- return dict.__repr__(self)
-
-class Unorderable:
- def __repr__(self) -> str:
- return str(id(self))
-
-class QueryTestCase(unittest.TestCase):
-
- def setUp(self) -> None:
- self.a = list(range(100)) # type: List[Any]
- self.b = list(range(200)) # type: List[Any]
- self.a[-12] = self.b
-
- def test_basic(self) -> None:
- # Verify .isrecursive() and .isreadable() w/o recursion
- pp = pprint.PrettyPrinter()
- for safe in (2, 2.0, complex(0.0, 2.0), "abc", [3], (2,2), {3: 3}, "yaddayadda",
- self.a, self.b):
- # module-level convenience functions
- self.assertFalse(pprint.isrecursive(safe),
- "expected not isrecursive for %r" % (safe,))
- self.assertTrue(pprint.isreadable(safe),
- "expected isreadable for %r" % (safe,))
- # PrettyPrinter methods
- self.assertFalse(pp.isrecursive(safe),
- "expected not isrecursive for %r" % (safe,))
- self.assertTrue(pp.isreadable(safe),
- "expected isreadable for %r" % (safe,))
-
- def test_knotted(self) -> None:
- # Verify .isrecursive() and .isreadable() w/ recursion
- # Tie a knot.
- self.b[67] = self.a
- # Messy dict.
- self.d = {} # type: Dict[int, dict]
- self.d[0] = self.d[1] = self.d[2] = self.d
-
- pp = pprint.PrettyPrinter()
-
- for icky in self.a, self.b, self.d, (self.d, self.d):
- self.assertTrue(pprint.isrecursive(icky), "expected isrecursive")
- self.assertFalse(pprint.isreadable(icky), "expected not isreadable")
- self.assertTrue(pp.isrecursive(icky), "expected isrecursive")
- self.assertFalse(pp.isreadable(icky), "expected not isreadable")
-
- # Break the cycles.
- self.d.clear()
- del self.a[:]
- del self.b[:]
-
- for safe in self.a, self.b, self.d, (self.d, self.d):
- # module-level convenience functions
- self.assertFalse(pprint.isrecursive(safe),
- "expected not isrecursive for %r" % (safe,))
- self.assertTrue(pprint.isreadable(safe),
- "expected isreadable for %r" % (safe,))
- # PrettyPrinter methods
- self.assertFalse(pp.isrecursive(safe),
- "expected not isrecursive for %r" % (safe,))
- self.assertTrue(pp.isreadable(safe),
- "expected isreadable for %r" % (safe,))
-
- def test_unreadable(self) -> None:
- # Not recursive but not readable anyway
- pp = pprint.PrettyPrinter()
- for unreadable in type(3), pprint, pprint.isrecursive:
- # module-level convenience functions
- self.assertFalse(pprint.isrecursive(unreadable),
- "expected not isrecursive for %r" % (unreadable,))
- self.assertFalse(pprint.isreadable(unreadable),
- "expected not isreadable for %r" % (unreadable,))
- # PrettyPrinter methods
- self.assertFalse(pp.isrecursive(unreadable),
- "expected not isrecursive for %r" % (unreadable,))
- self.assertFalse(pp.isreadable(unreadable),
- "expected not isreadable for %r" % (unreadable,))
-
- def test_same_as_repr(self) -> None:
- # Simple objects, small containers and classes that overwrite __repr__
- # For those the result should be the same as repr().
- # Ahem. The docs don't say anything about that -- this appears to
- # be testing an implementation quirk. Starting in Python 2.5, it's
- # not true for dicts: pprint always sorts dicts by key now; before,
- # it sorted a dict display if and only if the display required
- # multiple lines. For that reason, dicts with more than one element
- # aren't tested here.
- for simple in (0, 0, complex(0.0), 0.0, "", b"",
- (), tuple2(), tuple3(),
- [], list2(), list3(),
- {}, dict2(), dict3(),
- self.assertTrue, pprint,
- -6, -6, complex(-6.,-6.), -1.5, "x", b"x", (3,), [3], {3: 6},
- (1,2), [3,4], {5: 6},
- tuple2((1,2)), tuple3((1,2)), tuple3(range(100)), # type: ignore
- [3,4], list2(cast(Any, [3,4])), list3(cast(Any, [3,4])),
- list3(cast(Any, range(100))), dict2(cast(Any, {5: 6})),
- dict3(cast(Any, {5: 6})), # JLe: work around mypy issue #233
- range(10, -11, -1)
- ):
- native = repr(simple)
- for function in "pformat", "saferepr":
- f = getattr(pprint, function)
- got = f(simple)
- self.assertEqual(native, got,
- "expected %s got %s from pprint.%s" %
- (native, got, function))
-
- def test_basic_line_wrap(self) -> None:
- # verify basic line-wrapping operation
- o = {'RPM_cal': 0,
- 'RPM_cal2': 48059,
- 'Speed_cal': 0,
- 'controldesk_runtime_us': 0,
- 'main_code_runtime_us': 0,
- 'read_io_runtime_us': 0,
- 'write_io_runtime_us': 43690}
- exp = """\
-{'RPM_cal': 0,
- 'RPM_cal2': 48059,
- 'Speed_cal': 0,
- 'controldesk_runtime_us': 0,
- 'main_code_runtime_us': 0,
- 'read_io_runtime_us': 0,
- 'write_io_runtime_us': 43690}"""
- # JLe: work around mypy issue #232
- for type in cast(List[Any], [dict, dict2]):
- self.assertEqual(pprint.pformat(type(o)), exp)
-
- o2 = range(100)
- exp = '[%s]' % ',\n '.join(map(str, o2))
- for type in cast(List[Any], [list, list2]):
- self.assertEqual(pprint.pformat(type(o2)), exp)
-
- o3 = tuple(range(100))
- exp = '(%s)' % ',\n '.join(map(str, o3))
- for type in cast(List[Any], [tuple, tuple2]):
- self.assertEqual(pprint.pformat(type(o3)), exp)
-
- # indent parameter
- o4 = range(100)
- exp = '[ %s]' % ',\n '.join(map(str, o4))
- for type in cast(List[Any], [list, list2]):
- self.assertEqual(pprint.pformat(type(o4), indent=4), exp)
-
- def test_nested_indentations(self) -> None:
- o1 = list(range(10))
- o2 = {'first':1, 'second':2, 'third':3}
- o = [o1, o2]
- expected = """\
-[ [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
- { 'first': 1,
- 'second': 2,
- 'third': 3}]"""
- self.assertEqual(pprint.pformat(o, indent=4, width=42), expected)
-
- def test_sorted_dict(self) -> None:
- # Starting in Python 2.5, pprint sorts dict displays by key regardless
- # of how small the dictionary may be.
- # Before the change, on 32-bit Windows pformat() gave order
- # 'a', 'c', 'b' here, so this test failed.
- d = {'a': 1, 'b': 1, 'c': 1}
- self.assertEqual(pprint.pformat(d), "{'a': 1, 'b': 1, 'c': 1}")
- self.assertEqual(pprint.pformat([d, d]),
- "[{'a': 1, 'b': 1, 'c': 1}, {'a': 1, 'b': 1, 'c': 1}]")
-
- # The next one is kind of goofy. The sorted order depends on the
- # alphabetic order of type names: "int" < "str" < "tuple". Before
- # Python 2.5, this was in the test_same_as_repr() test. It's worth
- # keeping around for now because it's one of few tests of pprint
- # against a crazy mix of types.
- self.assertEqual(pprint.pformat({"xy\tab\n": (3,), 5: [[]], (): {}}),
- r"{5: [[]], 'xy\tab\n': (3,), (): {}}")
-
- def test_ordered_dict(self) -> None:
- words = 'the quick brown fox jumped over a lazy dog'.split()
- d = collections.OrderedDict(zip(words, itertools.count()))
- self.assertEqual(pprint.pformat(d),
-"""\
-{'the': 0,
- 'quick': 1,
- 'brown': 2,
- 'fox': 3,
- 'jumped': 4,
- 'over': 5,
- 'a': 6,
- 'lazy': 7,
- 'dog': 8}""")
- def test_subclassing(self) -> None:
- o = {'names with spaces': 'should be presented using repr()',
- 'others.should.not.be': 'like.this'}
- exp = """\
-{'names with spaces': 'should be presented using repr()',
- others.should.not.be: like.this}"""
- self.assertEqual(DottedPrettyPrinter().pformat(o), exp)
-
- @test.support.cpython_only
- def test_set_reprs(self) -> None:
- # This test creates a complex arrangement of frozensets and
- # compares the pretty-printed repr against a string hard-coded in
- # the test. The hard-coded repr depends on the sort order of
- # frozensets.
- #
- # However, as the docs point out: "Since sets only define
- # partial ordering (subset relationships), the output of the
- # list.sort() method is undefined for lists of sets."
- #
- # In a nutshell, the test assumes frozenset({0}) will always
- # sort before frozenset({1}), but:
- #
- # >>> frozenset({0}) < frozenset({1})
- # False
- # >>> frozenset({1}) < frozenset({0})
- # False
- #
- # Consequently, this test is fragile and
- # implementation-dependent. Small changes to Python's sort
- # algorithm cause the test to fail when it should pass.
-
- self.assertEqual(pprint.pformat(set()), 'set()')
- self.assertEqual(pprint.pformat(set(range(3))), '{0, 1, 2}')
- self.assertEqual(pprint.pformat(frozenset()), 'frozenset()')
- self.assertEqual(pprint.pformat(frozenset(range(3))), 'frozenset({0, 1, 2})')
- cube_repr_tgt = """\
-{frozenset(): frozenset({frozenset({2}), frozenset({0}), frozenset({1})}),
- frozenset({0}): frozenset({frozenset(),
- frozenset({0, 2}),
- frozenset({0, 1})}),
- frozenset({1}): frozenset({frozenset(),
- frozenset({1, 2}),
- frozenset({0, 1})}),
- frozenset({2}): frozenset({frozenset(),
- frozenset({1, 2}),
- frozenset({0, 2})}),
- frozenset({1, 2}): frozenset({frozenset({2}),
- frozenset({1}),
- frozenset({0, 1, 2})}),
- frozenset({0, 2}): frozenset({frozenset({2}),
- frozenset({0}),
- frozenset({0, 1, 2})}),
- frozenset({0, 1}): frozenset({frozenset({0}),
- frozenset({1}),
- frozenset({0, 1, 2})}),
- frozenset({0, 1, 2}): frozenset({frozenset({1, 2}),
- frozenset({0, 2}),
- frozenset({0, 1})})}"""
- cube = test.test_set.cube(3)
- self.assertEqual(pprint.pformat(cube), cube_repr_tgt)
- cubo_repr_tgt = """\
-{frozenset({frozenset({0, 2}), frozenset({0})}): frozenset({frozenset({frozenset({0,
- 2}),
- frozenset({0,
- 1,
- 2})}),
- frozenset({frozenset({0}),
- frozenset({0,
- 1})}),
- frozenset({frozenset(),
- frozenset({0})}),
- frozenset({frozenset({2}),
- frozenset({0,
- 2})})}),
- frozenset({frozenset({0, 1}), frozenset({1})}): frozenset({frozenset({frozenset({0,
- 1}),
- frozenset({0,
- 1,
- 2})}),
- frozenset({frozenset({0}),
- frozenset({0,
- 1})}),
- frozenset({frozenset({1}),
- frozenset({1,
- 2})}),
- frozenset({frozenset(),
- frozenset({1})})}),
- frozenset({frozenset({1, 2}), frozenset({1})}): frozenset({frozenset({frozenset({1,
- 2}),
- frozenset({0,
- 1,
- 2})}),
- frozenset({frozenset({2}),
- frozenset({1,
- 2})}),
- frozenset({frozenset(),
- frozenset({1})}),
- frozenset({frozenset({1}),
- frozenset({0,
- 1})})}),
- frozenset({frozenset({1, 2}), frozenset({2})}): frozenset({frozenset({frozenset({1,
- 2}),
- frozenset({0,
- 1,
- 2})}),
- frozenset({frozenset({1}),
- frozenset({1,
- 2})}),
- frozenset({frozenset({2}),
- frozenset({0,
- 2})}),
- frozenset({frozenset(),
- frozenset({2})})}),
- frozenset({frozenset(), frozenset({0})}): frozenset({frozenset({frozenset({0}),
- frozenset({0,
- 1})}),
- frozenset({frozenset({0}),
- frozenset({0,
- 2})}),
- frozenset({frozenset(),
- frozenset({1})}),
- frozenset({frozenset(),
- frozenset({2})})}),
- frozenset({frozenset(), frozenset({1})}): frozenset({frozenset({frozenset(),
- frozenset({0})}),
- frozenset({frozenset({1}),
- frozenset({1,
- 2})}),
- frozenset({frozenset(),
- frozenset({2})}),
- frozenset({frozenset({1}),
- frozenset({0,
- 1})})}),
- frozenset({frozenset({2}), frozenset()}): frozenset({frozenset({frozenset({2}),
- frozenset({1,
- 2})}),
- frozenset({frozenset(),
- frozenset({0})}),
- frozenset({frozenset(),
- frozenset({1})}),
- frozenset({frozenset({2}),
- frozenset({0,
- 2})})}),
- frozenset({frozenset({0, 1, 2}), frozenset({0, 1})}): frozenset({frozenset({frozenset({1,
- 2}),
- frozenset({0,
- 1,
- 2})}),
- frozenset({frozenset({0,
- 2}),
- frozenset({0,
- 1,
- 2})}),
- frozenset({frozenset({0}),
- frozenset({0,
- 1})}),
- frozenset({frozenset({1}),
- frozenset({0,
- 1})})}),
- frozenset({frozenset({0}), frozenset({0, 1})}): frozenset({frozenset({frozenset(),
- frozenset({0})}),
- frozenset({frozenset({0,
- 1}),
- frozenset({0,
- 1,
- 2})}),
- frozenset({frozenset({0}),
- frozenset({0,
- 2})}),
- frozenset({frozenset({1}),
- frozenset({0,
- 1})})}),
- frozenset({frozenset({2}), frozenset({0, 2})}): frozenset({frozenset({frozenset({0,
- 2}),
- frozenset({0,
- 1,
- 2})}),
- frozenset({frozenset({2}),
- frozenset({1,
- 2})}),
- frozenset({frozenset({0}),
- frozenset({0,
- 2})}),
- frozenset({frozenset(),
- frozenset({2})})}),
- frozenset({frozenset({0, 1, 2}), frozenset({0, 2})}): frozenset({frozenset({frozenset({1,
- 2}),
- frozenset({0,
- 1,
- 2})}),
- frozenset({frozenset({0,
- 1}),
- frozenset({0,
- 1,
- 2})}),
- frozenset({frozenset({0}),
- frozenset({0,
- 2})}),
- frozenset({frozenset({2}),
- frozenset({0,
- 2})})}),
- frozenset({frozenset({1, 2}), frozenset({0, 1, 2})}): frozenset({frozenset({frozenset({0,
- 2}),
- frozenset({0,
- 1,
- 2})}),
- frozenset({frozenset({0,
- 1}),
- frozenset({0,
- 1,
- 2})}),
- frozenset({frozenset({2}),
- frozenset({1,
- 2})}),
- frozenset({frozenset({1}),
- frozenset({1,
- 2})})})}"""
-
- cubo = test.test_set.linegraph(cube)
- self.assertEqual(pprint.pformat(cubo), cubo_repr_tgt)
-
- def test_depth(self) -> None:
- nested_tuple = (1, (2, (3, (4, (5, 6)))))
- nested_dict = {1: {2: {3: {4: {5: {6: 6}}}}}}
- nested_list = [1, [2, [3, [4, [5, [6, []]]]]]]
- self.assertEqual(pprint.pformat(nested_tuple), repr(nested_tuple))
- self.assertEqual(pprint.pformat(nested_dict), repr(nested_dict))
- self.assertEqual(pprint.pformat(nested_list), repr(nested_list))
-
- lv1_tuple = '(1, (...))'
- lv1_dict = '{1: {...}}'
- lv1_list = '[1, [...]]'
- self.assertEqual(pprint.pformat(nested_tuple, depth=1), lv1_tuple)
- self.assertEqual(pprint.pformat(nested_dict, depth=1), lv1_dict)
- self.assertEqual(pprint.pformat(nested_list, depth=1), lv1_list)
-
- def test_sort_unorderable_values(self) -> None:
- # Issue 3976: sorted pprints fail for unorderable values.
- n = 20
- keys = [Unorderable() for i in range(n)]
- random.shuffle(keys)
- skeys = sorted(keys, key=id)
- clean = lambda s: s.replace(' ', '').replace('\n','') # type: Callable[[str], str]
-
- self.assertEqual(clean(pprint.pformat(set(keys))),
- '{' + ','.join(map(repr, skeys)) + '}')
- self.assertEqual(clean(pprint.pformat(frozenset(keys))),
- 'frozenset({' + ','.join(map(repr, skeys)) + '})')
- self.assertEqual(clean(pprint.pformat(dict.fromkeys(keys))),
- '{' + ','.join('%r:None' % k for k in skeys) + '}')
-
-class DottedPrettyPrinter(pprint.PrettyPrinter):
-
- def format(self, object: object, context: Dict[int, Any], maxlevels: int,
- level: int) -> Tuple[str, int, int]:
- if isinstance(object, str):
- if ' ' in object:
- return repr(object), 1, 0
- else:
- return object, 0, 0
- else:
- return pprint.PrettyPrinter.format(
- self, object, context, maxlevels, level)
-
-
-def test_main() -> None:
- test.support.run_unittest(QueryTestCase)
-
-
-if __name__ == "__main__":
- test_main()
diff --git a/test-data/stdlib-samples/3.2/test/test_random.py b/test-data/stdlib-samples/3.2/test/test_random.py
deleted file mode 100644
index 5989cee..0000000
--- a/test-data/stdlib-samples/3.2/test/test_random.py
+++ /dev/null
@@ -1,533 +0,0 @@
-#!/usr/bin/env python3
-
-import unittest
-import random
-import time
-import pickle
-import warnings
-from math import log, exp, pi, fsum, sin
-from test import support
-
-from typing import Any, Dict, List, Callable, Generic, TypeVar, cast
-
-RT = TypeVar('RT', random.Random, random.SystemRandom)
-
-class TestBasicOps(unittest.TestCase, Generic[RT]):
- # Superclass with tests common to all generators.
- # Subclasses must arrange for self.gen to retrieve the Random instance
- # to be tested.
-
- gen = None # type: RT # Either Random or SystemRandom
-
- def randomlist(self, n: int) -> List[float]:
- """Helper function to make a list of random numbers"""
- return [self.gen.random() for i in range(n)]
-
- def test_autoseed(self) -> None:
- self.gen.seed()
- state1 = self.gen.getstate()
- time.sleep(0.1)
- self.gen.seed() # diffent seeds at different times
- state2 = self.gen.getstate()
- self.assertNotEqual(state1, state2)
-
- def test_saverestore(self) -> None:
- N = 1000
- self.gen.seed()
- state = self.gen.getstate()
- randseq = self.randomlist(N)
- self.gen.setstate(state) # should regenerate the same sequence
- self.assertEqual(randseq, self.randomlist(N))
-
- def test_seedargs(self) -> None:
- for arg in [None, 0, 0, 1, 1, -1, -1, 10**20, -(10**20),
- 3.14, complex(1., 2.), 'a', tuple('abc')]:
- self.gen.seed(arg)
- for arg in [list(range(3)), {'one': 1}]:
- self.assertRaises(TypeError, self.gen.seed, arg)
- self.assertRaises(TypeError, self.gen.seed, 1, 2, 3, 4)
- self.assertRaises(TypeError, type(self.gen), []) # type: ignore # mypy issue 1846
-
- def test_choice(self) -> None:
- choice = self.gen.choice
- with self.assertRaises(IndexError):
- choice([])
- self.assertEqual(choice([50]), 50)
- self.assertIn(choice([25, 75]), [25, 75])
-
- def test_sample(self) -> None:
- # For the entire allowable range of 0 <= k <= N, validate that
- # the sample is of the correct length and contains only unique items
- N = 100
- population = range(N)
- for k in range(N+1):
- s = self.gen.sample(population, k)
- self.assertEqual(len(s), k)
- uniq = set(s)
- self.assertEqual(len(uniq), k)
- self.assertTrue(uniq <= set(population))
- self.assertEqual(self.gen.sample([], 0), []) # test edge case N==k==0
-
- def test_sample_distribution(self) -> None:
- # For the entire allowable range of 0 <= k <= N, validate that
- # sample generates all possible permutations
- n = 5
- pop = range(n)
- trials = 10000 # large num prevents false negatives without slowing normal case
- def factorial(n: int) -> int:
- if n == 0:
- return 1
- return n * factorial(n - 1)
- for k in range(n):
- expected = factorial(n) // factorial(n-k)
- perms = {} # type: Dict[tuple, object]
- for i in range(trials):
- perms[tuple(self.gen.sample(pop, k))] = None
- if len(perms) == expected:
- break
- else:
- self.fail()
-
- def test_sample_inputs(self) -> None:
- # SF bug #801342 -- population can be any iterable defining __len__()
- self.gen.sample(set(range(20)), 2)
- self.gen.sample(range(20), 2)
- self.gen.sample(range(20), 2)
- self.gen.sample(str('abcdefghijklmnopqrst'), 2)
- self.gen.sample(tuple('abcdefghijklmnopqrst'), 2)
-
- def test_sample_on_dicts(self) -> None:
- self.assertRaises(TypeError, self.gen.sample, dict.fromkeys('abcdef'), 2)
-
- def test_gauss(self) -> None:
- # Ensure that the seed() method initializes all the hidden state. In
- # particular, through 2.2.1 it failed to reset a piece of state used
- # by (and only by) the .gauss() method.
-
- for seed in 1, 12, 123, 1234, 12345, 123456, 654321:
- self.gen.seed(seed)
- x1 = self.gen.random()
- y1 = self.gen.gauss(0, 1)
-
- self.gen.seed(seed)
- x2 = self.gen.random()
- y2 = self.gen.gauss(0, 1)
-
- self.assertEqual(x1, x2)
- self.assertEqual(y1, y2)
-
- def test_pickling(self) -> None:
- state = pickle.dumps(self.gen)
- origseq = [self.gen.random() for i in range(10)]
- newgen = pickle.loads(state)
- restoredseq = [newgen.random() for i in range(10)]
- self.assertEqual(origseq, restoredseq)
-
- def test_bug_1727780(self) -> None:
- # verify that version-2-pickles can be loaded
- # fine, whether they are created on 32-bit or 64-bit
- # platforms, and that version-3-pickles load fine.
- files = [("randv2_32.pck", 780),
- ("randv2_64.pck", 866),
- ("randv3.pck", 343)]
- for file, value in files:
- f = open(support.findfile(file),"rb")
- r = pickle.load(f)
- f.close()
- self.assertEqual(int(r.random()*1000), value)
-
- def test_bug_9025(self) -> None:
- # Had problem with an uneven distribution in int(n*random())
- # Verify the fix by checking that distributions fall within expectations.
- n = 100000
- randrange = self.gen.randrange
- k = sum(randrange(6755399441055744) % 3 == 2 for i in range(n))
- self.assertTrue(0.30 < k/n and k/n < .37, (k/n))
-
-class SystemRandom_TestBasicOps(TestBasicOps[random.SystemRandom]):
- gen = random.SystemRandom()
-
- def test_autoseed(self) -> None:
- # Doesn't need to do anything except not fail
- self.gen.seed()
-
- def test_saverestore(self) -> None:
- self.assertRaises(NotImplementedError, self.gen.getstate)
- self.assertRaises(NotImplementedError, self.gen.setstate, None)
-
- def test_seedargs(self) -> None:
- # Doesn't need to do anything except not fail
- self.gen.seed(100)
-
- def test_gauss(self) -> None:
- self.gen.gauss_next = None
- self.gen.seed(100)
- self.assertEqual(self.gen.gauss_next, None)
-
- def test_pickling(self) -> None:
- self.assertRaises(NotImplementedError, pickle.dumps, self.gen)
-
- def test_53_bits_per_float(self) -> None:
- # This should pass whenever a C double has 53 bit precision.
- span = 2 ** 53 # type: int
- cum = 0
- for i in range(100):
- cum |= int(self.gen.random() * span)
- self.assertEqual(cum, span-1)
-
- def test_bigrand(self) -> None:
- # The randrange routine should build-up the required number of bits
- # in stages so that all bit positions are active.
- span = 2 ** 500 # type: int
- cum = 0
- for i in range(100):
- r = self.gen.randrange(span)
- self.assertTrue(0 <= r < span)
- cum |= r
- self.assertEqual(cum, span-1)
-
- def test_bigrand_ranges(self) -> None:
- for i in [40,80, 160, 200, 211, 250, 375, 512, 550]:
- start = self.gen.randrange(2 ** i)
- stop = self.gen.randrange(2 ** (i-2))
- if stop <= start:
- return
- self.assertTrue(start <= self.gen.randrange(start, stop) < stop)
-
- def test_rangelimits(self) -> None:
- for start, stop in [(-2,0), (-(2**60)-2,-(2**60)), (2**60,2**60+2)]:
- self.assertEqual(set(range(start,stop)),
- set([self.gen.randrange(start,stop) for i in range(100)]))
-
- def test_genrandbits(self) -> None:
- # Verify ranges
- for k in range(1, 1000):
- self.assertTrue(0 <= self.gen.getrandbits(k) < 2**k)
-
- # Verify all bits active
- getbits = self.gen.getrandbits
- for span in [1, 2, 3, 4, 31, 32, 32, 52, 53, 54, 119, 127, 128, 129]:
- cum = 0
- for i in range(100):
- cum |= getbits(span)
- self.assertEqual(cum, 2**span-1)
-
- # Verify argument checking
- self.assertRaises(TypeError, self.gen.getrandbits)
- self.assertRaises(TypeError, self.gen.getrandbits, 1, 2)
- self.assertRaises(ValueError, self.gen.getrandbits, 0)
- self.assertRaises(ValueError, self.gen.getrandbits, -1)
- self.assertRaises(TypeError, self.gen.getrandbits, 10.1)
-
- def test_randbelow_logic(self, _log: Callable[[float, float], float] = log,
- int: Callable[[float], int] = int) -> None:
- # check bitcount transition points: 2**i and 2**(i+1)-1
- # show that: k = int(1.001 + _log(n, 2))
- # is equal to or one greater than the number of bits in n
- for i in range(1, 1000):
- n = 1 << i # check an exact power of two
- numbits = i+1
- k = int(1.00001 + _log(n, 2))
- self.assertEqual(k, numbits)
- self.assertEqual(n, 2**(k-1))
-
- n += n - 1 # check 1 below the next power of two
- k = int(1.00001 + _log(n, 2))
- self.assertIn(k, [numbits, numbits+1])
- self.assertTrue(2**k > n > 2**(k-2))
-
- n -= n >> 15 # check a little farther below the next power of two
- k = int(1.00001 + _log(n, 2))
- self.assertEqual(k, numbits) # note the stronger assertion
- self.assertTrue(2**k > n > 2**(k-1)) # note the stronger assertion
-
-
-class MersenneTwister_TestBasicOps(TestBasicOps[random.Random]):
- gen = random.Random()
-
- def test_guaranteed_stable(self) -> None:
- # These sequences are guaranteed to stay the same across versions of python
- self.gen.seed(3456147, version=1)
- self.assertEqual([self.gen.random().hex() for i in range(4)],
- ['0x1.ac362300d90d2p-1', '0x1.9d16f74365005p-1',
- '0x1.1ebb4352e4c4dp-1', '0x1.1a7422abf9c11p-1'])
- self.gen.seed("the quick brown fox", version=2)
- self.assertEqual([self.gen.random().hex() for i in range(4)],
- ['0x1.1239ddfb11b7cp-3', '0x1.b3cbb5c51b120p-4',
- '0x1.8c4f55116b60fp-1', '0x1.63eb525174a27p-1'])
-
- def test_setstate_first_arg(self) -> None:
- self.assertRaises(ValueError, self.gen.setstate, (1, None, None))
-
- def test_setstate_middle_arg(self) -> None:
- # Wrong type, s/b tuple
- self.assertRaises(TypeError, self.gen.setstate, (2, None, None))
- # Wrong length, s/b 625
- self.assertRaises(ValueError, self.gen.setstate, (2, (1,2,3), None))
- # Wrong type, s/b tuple of 625 ints
- self.assertRaises(TypeError, self.gen.setstate, (2, tuple(['a',]*625), None))
- # Last element s/b an int also
- self.assertRaises(TypeError, self.gen.setstate, (2, cast(Any, (0,))*624+('a',), None))
-
- def test_referenceImplementation(self) -> None:
- # Compare the python implementation with results from the original
- # code. Create 2000 53-bit precision random floats. Compare only
- # the last ten entries to show that the independent implementations
- # are tracking. Here is the main() function needed to create the
- # list of expected random numbers:
- # void main(void){
- # int i;
- # unsigned long init[4]={61731, 24903, 614, 42143}, length=4;
- # init_by_array(init, length);
- # for (i=0; i<2000; i++) {
- # printf("%.15f ", genrand_res53());
- # if (i%5==4) printf("\n");
- # }
- # }
- expected = [0.45839803073713259,
- 0.86057815201978782,
- 0.92848331726782152,
- 0.35932681119782461,
- 0.081823493762449573,
- 0.14332226470169329,
- 0.084297823823520024,
- 0.53814864671831453,
- 0.089215024911993401,
- 0.78486196105372907]
-
- self.gen.seed(61731 + (24903<<32) + (614<<64) + (42143<<96))
- actual = self.randomlist(2000)[-10:]
- for a, e in zip(actual, expected):
- self.assertAlmostEqual(a,e,places=14)
-
- def test_strong_reference_implementation(self) -> None:
- # Like test_referenceImplementation, but checks for exact bit-level
- # equality. This should pass on any box where C double contains
- # at least 53 bits of precision (the underlying algorithm suffers
- # no rounding errors -- all results are exact).
- from math import ldexp
-
- expected = [0x0eab3258d2231f,
- 0x1b89db315277a5,
- 0x1db622a5518016,
- 0x0b7f9af0d575bf,
- 0x029e4c4db82240,
- 0x04961892f5d673,
- 0x02b291598e4589,
- 0x11388382c15694,
- 0x02dad977c9e1fe,
- 0x191d96d4d334c6]
- self.gen.seed(61731 + (24903<<32) + (614<<64) + (42143<<96))
- actual = self.randomlist(2000)[-10:]
- for a, e in zip(actual, expected):
- self.assertEqual(int(ldexp(a, 53)), e)
-
- def test_long_seed(self) -> None:
- # This is most interesting to run in debug mode, just to make sure
- # nothing blows up. Under the covers, a dynamically resized array
- # is allocated, consuming space proportional to the number of bits
- # in the seed. Unfortunately, that's a quadratic-time algorithm,
- # so don't make this horribly big.
- seed = (1 << (10000 * 8)) - 1 # about 10K bytes
- self.gen.seed(seed)
-
- def test_53_bits_per_float(self) -> None:
- # This should pass whenever a C double has 53 bit precision.
- span = 2 ** 53 # type: int
- cum = 0
- for i in range(100):
- cum |= int(self.gen.random() * span)
- self.assertEqual(cum, span-1)
-
- def test_bigrand(self) -> None:
- # The randrange routine should build-up the required number of bits
- # in stages so that all bit positions are active.
- span = 2 ** 500 # type: int
- cum = 0
- for i in range(100):
- r = self.gen.randrange(span)
- self.assertTrue(0 <= r < span)
- cum |= r
- self.assertEqual(cum, span-1)
-
- def test_bigrand_ranges(self) -> None:
- for i in [40,80, 160, 200, 211, 250, 375, 512, 550]:
- start = self.gen.randrange(2 ** i)
- stop = self.gen.randrange(2 ** (i-2))
- if stop <= start:
- return
- self.assertTrue(start <= self.gen.randrange(start, stop) < stop)
-
- def test_rangelimits(self) -> None:
- for start, stop in [(-2,0), (-(2**60)-2,-(2**60)), (2**60,2**60+2)]:
- self.assertEqual(set(range(start,stop)),
- set([self.gen.randrange(start,stop) for i in range(100)]))
-
- def test_genrandbits(self) -> None:
- # Verify cross-platform repeatability
- self.gen.seed(1234567)
- self.assertEqual(self.gen.getrandbits(100),
- 97904845777343510404718956115)
- # Verify ranges
- for k in range(1, 1000):
- self.assertTrue(0 <= self.gen.getrandbits(k) < 2**k)
-
- # Verify all bits active
- getbits = self.gen.getrandbits
- for span in [1, 2, 3, 4, 31, 32, 32, 52, 53, 54, 119, 127, 128, 129]:
- cum = 0
- for i in range(100):
- cum |= getbits(span)
- self.assertEqual(cum, 2**span-1)
-
- # Verify argument checking
- self.assertRaises(TypeError, self.gen.getrandbits)
- self.assertRaises(TypeError, self.gen.getrandbits, 'a')
- self.assertRaises(TypeError, self.gen.getrandbits, 1, 2)
- self.assertRaises(ValueError, self.gen.getrandbits, 0)
- self.assertRaises(ValueError, self.gen.getrandbits, -1)
-
- def test_randbelow_logic(self,
- _log: Callable[[int, float], float] = log,
- int: Callable[[float], int] = int) -> None:
- # check bitcount transition points: 2**i and 2**(i+1)-1
- # show that: k = int(1.001 + _log(n, 2))
- # is equal to or one greater than the number of bits in n
- for i in range(1, 1000):
- n = 1 << i # check an exact power of two
- numbits = i+1
- k = int(1.00001 + _log(n, 2))
- self.assertEqual(k, numbits)
- self.assertEqual(n, 2**(k-1))
-
- n += n - 1 # check 1 below the next power of two
- k = int(1.00001 + _log(n, 2))
- self.assertIn(k, [numbits, numbits+1])
- self.assertTrue(2**k > n > 2**(k-2))
-
- n -= n >> 15 # check a little farther below the next power of two
- k = int(1.00001 + _log(n, 2))
- self.assertEqual(k, numbits) # note the stronger assertion
- self.assertTrue(2**k > n > 2**(k-1)) # note the stronger assertion
-
- def test_randrange_bug_1590891(self) -> None:
- start = 1000000000000
- stop = -100000000000000000000
- step = -200
- x = self.gen.randrange(start, stop, step)
- self.assertTrue(stop < x <= start)
- self.assertEqual((x+stop)%step, 0)
-
-def gamma(z: float, sqrt2pi: float = (2.0*pi)**0.5) -> float:
- # Reflection to right half of complex plane
- if z < 0.5:
- return pi / sin(pi*z) / gamma(1.0-z)
- # Lanczos approximation with g=7
- az = z + (7.0 - 0.5)
- return az ** (z-0.5) / exp(az) * sqrt2pi * fsum([
- 0.9999999999995183,
- 676.5203681218835 / z,
- -1259.139216722289 / (z+1.0),
- 771.3234287757674 / (z+2.0),
- -176.6150291498386 / (z+3.0),
- 12.50734324009056 / (z+4.0),
- -0.1385710331296526 / (z+5.0),
- 0.9934937113930748e-05 / (z+6.0),
- 0.1659470187408462e-06 / (z+7.0),
- ])
-
-class TestDistributions(unittest.TestCase):
- def test_zeroinputs(self) -> None:
- # Verify that distributions can handle a series of zero inputs'
- g = random.Random()
- x = [g.random() for i in range(50)] + [0.0]*5
- def patch() -> None:
- setattr(g, 'random', x[:].pop)
- patch(); g.uniform(1.0,10.0)
- patch(); g.paretovariate(1.0)
- patch(); g.expovariate(1.0)
- patch(); g.weibullvariate(1.0, 1.0)
- patch(); g.normalvariate(0.0, 1.0)
- patch(); g.gauss(0.0, 1.0)
- patch(); g.lognormvariate(0.0, 1.0)
- patch(); g.vonmisesvariate(0.0, 1.0)
- patch(); g.gammavariate(0.01, 1.0)
- patch(); g.gammavariate(1.0, 1.0)
- patch(); g.gammavariate(200.0, 1.0)
- patch(); g.betavariate(3.0, 3.0)
- patch(); g.triangular(0.0, 1.0, 1.0/3.0)
-
- def test_avg_std(self) -> None:
- # Use integration to test distribution average and standard deviation.
- # Only works for distributions which do not consume variates in pairs
- g = random.Random()
- N = 5000
- x = [i/float(N) for i in range(1,N)]
- variate = None # type: Any
- for variate, args, mu, sigmasqrd in [
- (g.uniform, (1.0,10.0), (10.0+1.0)/2, (10.0-1.0)**2/12),
- (g.triangular, (0.0, 1.0, 1.0/3.0), 4.0/9.0, 7.0/9.0/18.0),
- (g.expovariate, (1.5,), 1/1.5, 1/1.5**2),
- (g.paretovariate, (5.0,), 5.0/(5.0-1),
- 5.0/((5.0-1)**2*(5.0-2))),
- (g.weibullvariate, (1.0, 3.0), gamma(1+1/3.0),
- gamma(1+2/3.0)-gamma(1+1/3.0)**2) ]:
- setattr(g, 'random', x[:].pop)
- y = [] # type: List[float]
- for i in range(len(x)):
- try:
- y.append(variate(*args))
- except IndexError:
- pass
- s1 = s2 = 0.0
- for e in y:
- s1 += e
- s2 += (e - mu) ** 2
- N = len(y)
- self.assertAlmostEqual(s1/N, mu, places=2)
- self.assertAlmostEqual(s2/(N-1), sigmasqrd, places=2)
-
-class TestModule(unittest.TestCase):
- def testMagicConstants(self) -> None:
- self.assertAlmostEqual(random.NV_MAGICCONST, 1.71552776992141)
- self.assertAlmostEqual(random.TWOPI, 6.28318530718)
- self.assertAlmostEqual(random.LOG4, 1.38629436111989)
- self.assertAlmostEqual(random.SG_MAGICCONST, 2.50407739677627)
-
- def test__all__(self) -> None:
- # tests validity but not completeness of the __all__ list
- self.assertTrue(set(random.__all__) <= set(dir(random)))
-
- def test_random_subclass_with_kwargs(self) -> None:
- # SF bug #1486663 -- this used to erroneously raise a TypeError
- class Subclass(random.Random):
- def __init__(self, newarg: object = None) -> None:
- random.Random.__init__(self)
- Subclass(newarg=1)
-
-
-def test_main(verbose: bool = None) -> None:
- testclasses = [MersenneTwister_TestBasicOps,
- TestDistributions,
- TestModule]
-
- try:
- random.SystemRandom().random()
- except NotImplementedError:
- pass
- else:
- testclasses.append(SystemRandom_TestBasicOps)
-
- support.run_unittest(*testclasses)
-
- # verify reference counting
- import sys
- if verbose and hasattr(sys, "gettotalrefcount"):
- counts = [None] * 5 # type: List[int]
- for i in range(len(counts)):
- support.run_unittest(*testclasses)
- counts[i] = sys.gettotalrefcount()
- print(counts)
-
-if __name__ == "__main__":
- test_main(verbose=True)
diff --git a/test-data/stdlib-samples/3.2/test/test_set.py b/test-data/stdlib-samples/3.2/test/test_set.py
deleted file mode 100644
index 23ae745..0000000
--- a/test-data/stdlib-samples/3.2/test/test_set.py
+++ /dev/null
@@ -1,1884 +0,0 @@
-import unittest
-from test import support
-import gc
-import weakref
-import operator
-import copy
-import pickle
-from random import randrange, shuffle
-import sys
-import warnings
-import collections
-from typing import Set, Any
-
-class PassThru(Exception):
- pass
-
-def check_pass_thru():
- raise PassThru
- yield 1
-
-class BadCmp:
- def __hash__(self):
- return 1
- def __eq__(self, other):
- raise RuntimeError
-
-class ReprWrapper:
- 'Used to test self-referential repr() calls'
- def __repr__(self):
- return repr(self.value)
-
-#class HashCountingInt(int):
-# 'int-like object that counts the number of times __hash__ is called'
-# def __init__(self, *args):
-# self.hash_count = 0
-# def __hash__(self):
-# self.hash_count += 1
-# return int.__hash__(self)
-
-class TestJointOps(unittest.TestCase):
- # Tests common to both set and frozenset
-
- def setUp(self):
- self.word = word = 'simsalabim'
- self.otherword = 'madagascar'
- self.letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
- self.s = self.thetype(word)
- self.d = dict.fromkeys(word)
-
- def test_new_or_init(self):
- self.assertRaises(TypeError, self.thetype, [], 2)
- self.assertRaises(TypeError, set().__init__, a=1)
-
- def test_uniquification(self):
- actual = sorted(self.s)
- expected = sorted(self.d)
- self.assertEqual(actual, expected)
- self.assertRaises(PassThru, self.thetype, check_pass_thru())
- self.assertRaises(TypeError, self.thetype, [[]])
-
- def test_len(self):
- self.assertEqual(len(self.s), len(self.d))
-
- def test_contains(self):
- for c in self.letters:
- self.assertEqual(c in self.s, c in self.d)
- self.assertRaises(TypeError, self.s.__contains__, [[]])
- s = self.thetype([frozenset(self.letters)])
- self.assertIn(self.thetype(self.letters), s)
-
- def test_union(self):
- u = self.s.union(self.otherword)
- for c in self.letters:
- self.assertEqual(c in u, c in self.d or c in self.otherword)
- self.assertEqual(self.s, self.thetype(self.word))
- self.assertEqual(type(u), self.basetype)
- self.assertRaises(PassThru, self.s.union, check_pass_thru())
- self.assertRaises(TypeError, self.s.union, [[]])
- for C in set, frozenset, dict.fromkeys, str, list, tuple:
- self.assertEqual(self.thetype('abcba').union(C('cdc')), set('abcd'))
- self.assertEqual(self.thetype('abcba').union(C('efgfe')), set('abcefg'))
- self.assertEqual(self.thetype('abcba').union(C('ccb')), set('abc'))
- self.assertEqual(self.thetype('abcba').union(C('ef')), set('abcef'))
- self.assertEqual(self.thetype('abcba').union(C('ef'), C('fg')), set('abcefg'))
-
- # Issue #6573
- x = self.thetype()
- self.assertEqual(x.union(set([1]), x, set([2])), self.thetype([1, 2]))
-
- def test_or(self):
- i = self.s.union(self.otherword)
- self.assertEqual(self.s | set(self.otherword), i)
- self.assertEqual(self.s | frozenset(self.otherword), i)
- try:
- self.s | self.otherword
- except TypeError:
- pass
- else:
- self.fail("s|t did not screen-out general iterables")
-
- def test_intersection(self):
- i = self.s.intersection(self.otherword)
- for c in self.letters:
- self.assertEqual(c in i, c in self.d and c in self.otherword)
- self.assertEqual(self.s, self.thetype(self.word))
- self.assertEqual(type(i), self.basetype)
- self.assertRaises(PassThru, self.s.intersection, check_pass_thru())
- for C in set, frozenset, dict.fromkeys, str, list, tuple:
- self.assertEqual(self.thetype('abcba').intersection(C('cdc')), set('cc'))
- self.assertEqual(self.thetype('abcba').intersection(C('efgfe')), set(''))
- self.assertEqual(self.thetype('abcba').intersection(C('ccb')), set('bc'))
- self.assertEqual(self.thetype('abcba').intersection(C('ef')), set(''))
- self.assertEqual(self.thetype('abcba').intersection(C('cbcf'), C('bag')), set('b'))
- s = self.thetype('abcba')
- z = s.intersection()
- if self.thetype == frozenset():
- self.assertEqual(id(s), id(z))
- else:
- self.assertNotEqual(id(s), id(z))
-
- def test_isdisjoint(self):
- def f(s1, s2):
- 'Pure python equivalent of isdisjoint()'
- return not set(s1).intersection(s2)
- for larg in '', 'a', 'ab', 'abc', 'ababac', 'cdc', 'cc', 'efgfe', 'ccb', 'ef':
- s1 = self.thetype(larg)
- for rarg in '', 'a', 'ab', 'abc', 'ababac', 'cdc', 'cc', 'efgfe', 'ccb', 'ef':
- for C in set, frozenset, dict.fromkeys, str, list, tuple:
- s2 = C(rarg)
- actual = s1.isdisjoint(s2)
- expected = f(s1, s2)
- self.assertEqual(actual, expected)
- self.assertTrue(actual is True or actual is False)
-
- def test_and(self):
- i = self.s.intersection(self.otherword)
- self.assertEqual(self.s & set(self.otherword), i)
- self.assertEqual(self.s & frozenset(self.otherword), i)
- try:
- self.s & self.otherword
- except TypeError:
- pass
- else:
- self.fail("s&t did not screen-out general iterables")
-
- def test_difference(self):
- i = self.s.difference(self.otherword)
- for c in self.letters:
- self.assertEqual(c in i, c in self.d and c not in self.otherword)
- self.assertEqual(self.s, self.thetype(self.word))
- self.assertEqual(type(i), self.basetype)
- self.assertRaises(PassThru, self.s.difference, check_pass_thru())
- self.assertRaises(TypeError, self.s.difference, [[]])
- for C in set, frozenset, dict.fromkeys, str, list, tuple:
- self.assertEqual(self.thetype('abcba').difference(C('cdc')), set('ab'))
- self.assertEqual(self.thetype('abcba').difference(C('efgfe')), set('abc'))
- self.assertEqual(self.thetype('abcba').difference(C('ccb')), set('a'))
- self.assertEqual(self.thetype('abcba').difference(C('ef')), set('abc'))
- self.assertEqual(self.thetype('abcba').difference(), set('abc'))
- self.assertEqual(self.thetype('abcba').difference(C('a'), C('b')), set('c'))
-
- def test_sub(self):
- i = self.s.difference(self.otherword)
- self.assertEqual(self.s - set(self.otherword), i)
- self.assertEqual(self.s - frozenset(self.otherword), i)
- try:
- self.s - self.otherword
- except TypeError:
- pass
- else:
- self.fail("s-t did not screen-out general iterables")
-
- def test_symmetric_difference(self):
- i = self.s.symmetric_difference(self.otherword)
- for c in self.letters:
- self.assertEqual(c in i, (c in self.d) ^ (c in self.otherword))
- self.assertEqual(self.s, self.thetype(self.word))
- self.assertEqual(type(i), self.basetype)
- self.assertRaises(PassThru, self.s.symmetric_difference, check_pass_thru())
- self.assertRaises(TypeError, self.s.symmetric_difference, [[]])
- for C in set, frozenset, dict.fromkeys, str, list, tuple:
- self.assertEqual(self.thetype('abcba').symmetric_difference(C('cdc')), set('abd'))
- self.assertEqual(self.thetype('abcba').symmetric_difference(C('efgfe')), set('abcefg'))
- self.assertEqual(self.thetype('abcba').symmetric_difference(C('ccb')), set('a'))
- self.assertEqual(self.thetype('abcba').symmetric_difference(C('ef')), set('abcef'))
-
- def test_xor(self):
- i = self.s.symmetric_difference(self.otherword)
- self.assertEqual(self.s ^ set(self.otherword), i)
- self.assertEqual(self.s ^ frozenset(self.otherword), i)
- try:
- self.s ^ self.otherword
- except TypeError:
- pass
- else:
- self.fail("s^t did not screen-out general iterables")
-
- def test_equality(self):
- self.assertEqual(self.s, set(self.word))
- self.assertEqual(self.s, frozenset(self.word))
- self.assertEqual(self.s == self.word, False)
- self.assertNotEqual(self.s, set(self.otherword))
- self.assertNotEqual(self.s, frozenset(self.otherword))
- self.assertEqual(self.s != self.word, True)
-
- def test_setOfFrozensets(self):
- t = map(frozenset, ['abcdef', 'bcd', 'bdcb', 'fed', 'fedccba'])
- s = self.thetype(t)
- self.assertEqual(len(s), 3)
-
- def test_sub_and_super(self):
- p, q, r = map(self.thetype, ['ab', 'abcde', 'def'])
- self.assertTrue(p < q)
- self.assertTrue(p <= q)
- self.assertTrue(q <= q)
- self.assertTrue(q > p)
- self.assertTrue(q >= p)
- self.assertFalse(q < r)
- self.assertFalse(q <= r)
- self.assertFalse(q > r)
- self.assertFalse(q >= r)
- self.assertTrue(set('a').issubset('abc'))
- self.assertTrue(set('abc').issuperset('a'))
- self.assertFalse(set('a').issubset('cbs'))
- self.assertFalse(set('cbs').issuperset('a'))
-
- def test_pickling(self):
- for i in range(pickle.HIGHEST_PROTOCOL + 1):
- p = pickle.dumps(self.s, i)
- dup = pickle.loads(p)
- self.assertEqual(self.s, dup, "%s != %s" % (self.s, dup))
- if type(self.s) not in (set, frozenset):
- self.s.x = 10
- p = pickle.dumps(self.s)
- dup = pickle.loads(p)
- self.assertEqual(self.s.x, dup.x)
-
- def test_deepcopy(self):
- class Tracer:
- def __init__(self, value):
- self.value = value
- def __hash__(self):
- return self.value
- def __deepcopy__(self, memo=None):
- return Tracer(self.value + 1)
- t = Tracer(10)
- s = self.thetype([t])
- dup = copy.deepcopy(s)
- self.assertNotEqual(id(s), id(dup))
- for elem in dup:
- newt = elem
- self.assertNotEqual(id(t), id(newt))
- self.assertEqual(t.value + 1, newt.value)
-
- def test_gc(self):
- # Create a nest of cycles to exercise overall ref count check
- class A:
- pass
- s = set(A() for i in range(1000))
- for elem in s:
- elem.cycle = s
- elem.sub = elem
- elem.set = set([elem])
-
- def test_subclass_with_custom_hash(self):
- raise NotImplementedError() # runtime computed base class below
- # Bug #1257731
- class H: # (self.thetype):
- def __hash__(self):
- return int(id(self) & 0x7fffffff)
- s=H()
- f=set()
- f.add(s)
- self.assertIn(s, f)
- f.remove(s)
- f.add(s)
- f.discard(s)
-
- def test_badcmp(self):
- s = self.thetype([BadCmp()])
- # Detect comparison errors during insertion and lookup
- self.assertRaises(RuntimeError, self.thetype, [BadCmp(), BadCmp()])
- self.assertRaises(RuntimeError, s.__contains__, BadCmp())
- # Detect errors during mutating operations
- if hasattr(s, 'add'):
- self.assertRaises(RuntimeError, s.add, BadCmp())
- self.assertRaises(RuntimeError, s.discard, BadCmp())
- self.assertRaises(RuntimeError, s.remove, BadCmp())
-
- def test_cyclical_repr(self):
- w = ReprWrapper()
- s = self.thetype([w])
- w.value = s
- if self.thetype == set:
- self.assertEqual(repr(s), '{set(...)}')
- else:
- name = repr(s).partition('(')[0] # strip class name
- self.assertEqual(repr(s), '%s({%s(...)})' % (name, name))
-
- def test_cyclical_print(self):
- w = ReprWrapper()
- s = self.thetype([w])
- w.value = s
- fo = open(support.TESTFN, "w")
- try:
- fo.write(str(s))
- fo.close()
- fo = open(support.TESTFN, "r")
- self.assertEqual(fo.read(), repr(s))
- finally:
- fo.close()
- support.unlink(support.TESTFN)
-
- def test_do_not_rehash_dict_keys(self):
- raise NotImplementedError() # cannot subclass int
- n = 10
- d = None # dict.fromkeys(map(HashCountingInt, range(n)))
- self.assertEqual(sum(elem.hash_count for elem in d), n)
- s = self.thetype(d)
- self.assertEqual(sum(elem.hash_count for elem in d), n)
- s.difference(d)
- self.assertEqual(sum(elem.hash_count for elem in d), n)
- if hasattr(s, 'symmetric_difference_update'):
- s.symmetric_difference_update(d)
- self.assertEqual(sum(elem.hash_count for elem in d), n)
- d2 = dict.fromkeys(set(d))
- self.assertEqual(sum(elem.hash_count for elem in d), n)
- d3 = dict.fromkeys(frozenset(d))
- self.assertEqual(sum(elem.hash_count for elem in d), n)
- d3 = dict.fromkeys(frozenset(d), 123)
- self.assertEqual(sum(elem.hash_count for elem in d), n)
- self.assertEqual(d3, dict.fromkeys(d, 123))
-
- def test_container_iterator(self):
- # Bug #3680: tp_traverse was not implemented for set iterator object
- class C(object):
- pass
- obj = C()
- ref = weakref.ref(obj)
- container = set([obj, 1])
- obj.x = iter(container)
- obj = None
- container = None
- gc.collect()
- self.assertTrue(ref() is None, "Cycle was not collected")
-
-class TestSet(TestJointOps):
- thetype = set
- basetype = set
-
- def test_init(self):
- s = self.thetype()
- s.__init__(self.word)
- self.assertEqual(s, set(self.word))
- s.__init__(self.otherword)
- self.assertEqual(s, set(self.otherword))
- self.assertRaises(TypeError, s.__init__, s, 2);
- self.assertRaises(TypeError, s.__init__, 1)
-
- def test_constructor_identity(self):
- s = self.thetype(range(3))
- t = self.thetype(s)
- self.assertNotEqual(id(s), id(t))
-
- def test_set_literal(self):
- raise NotImplementedError()
- #s = set([1,2,3])
- #t = {1,2,3}
- #self.assertEqual(s, t)
-
- def test_hash(self):
- self.assertRaises(TypeError, hash, self.s)
-
- def test_clear(self):
- self.s.clear()
- self.assertEqual(self.s, set())
- self.assertEqual(len(self.s), 0)
-
- def test_copy(self):
- dup = self.s.copy()
- self.assertEqual(self.s, dup)
- self.assertNotEqual(id(self.s), id(dup))
- self.assertEqual(type(dup), self.basetype)
-
- def test_add(self):
- self.s.add('Q')
- self.assertIn('Q', self.s)
- dup = self.s.copy()
- self.s.add('Q')
- self.assertEqual(self.s, dup)
- self.assertRaises(TypeError, self.s.add, [])
-
- def test_remove(self):
- self.s.remove('a')
- self.assertNotIn('a', self.s)
- self.assertRaises(KeyError, self.s.remove, 'Q')
- self.assertRaises(TypeError, self.s.remove, [])
- s = self.thetype([frozenset(self.word)])
- self.assertIn(self.thetype(self.word), s)
- s.remove(self.thetype(self.word))
- self.assertNotIn(self.thetype(self.word), s)
- self.assertRaises(KeyError, self.s.remove, self.thetype(self.word))
-
- def test_remove_keyerror_unpacking(self):
- # bug: www.python.org/sf/1576657
- for v1 in ['Q', (1,)]:
- try:
- self.s.remove(v1)
- except KeyError as e:
- v2 = e.args[0]
- self.assertEqual(v1, v2)
- else:
- self.fail()
-
- def test_remove_keyerror_set(self):
- key = self.thetype([3, 4])
- try:
- self.s.remove(key)
- except KeyError as e:
- self.assertTrue(e.args[0] is key,
- "KeyError should be {0}, not {1}".format(key,
- e.args[0]))
- else:
- self.fail()
-
- def test_discard(self):
- self.s.discard('a')
- self.assertNotIn('a', self.s)
- self.s.discard('Q')
- self.assertRaises(TypeError, self.s.discard, [])
- s = self.thetype([frozenset(self.word)])
- self.assertIn(self.thetype(self.word), s)
- s.discard(self.thetype(self.word))
- self.assertNotIn(self.thetype(self.word), s)
- s.discard(self.thetype(self.word))
-
- def test_pop(self):
- for i in range(len(self.s)):
- elem = self.s.pop()
- self.assertNotIn(elem, self.s)
- self.assertRaises(KeyError, self.s.pop)
-
- def test_update(self):
- retval = self.s.update(self.otherword)
- self.assertEqual(retval, None)
- for c in (self.word + self.otherword):
- self.assertIn(c, self.s)
- self.assertRaises(PassThru, self.s.update, check_pass_thru())
- self.assertRaises(TypeError, self.s.update, [[]])
- for p, q in (('cdc', 'abcd'), ('efgfe', 'abcefg'), ('ccb', 'abc'), ('ef', 'abcef')):
- for C in set, frozenset, dict.fromkeys, str, list, tuple:
- s = self.thetype('abcba')
- self.assertEqual(s.update(C(p)), None)
- self.assertEqual(s, set(q))
- for p in ('cdc', 'efgfe', 'ccb', 'ef', 'abcda'):
- q = 'ahi'
- for C in set, frozenset, dict.fromkeys, str, list, tuple:
- s = self.thetype('abcba')
- self.assertEqual(s.update(C(p), C(q)), None)
- self.assertEqual(s, set(s) | set(p) | set(q))
-
- def test_ior(self):
- self.s |= set(self.otherword)
- for c in (self.word + self.otherword):
- self.assertIn(c, self.s)
-
- def test_intersection_update(self):
- retval = self.s.intersection_update(self.otherword)
- self.assertEqual(retval, None)
- for c in (self.word + self.otherword):
- if c in self.otherword and c in self.word:
- self.assertIn(c, self.s)
- else:
- self.assertNotIn(c, self.s)
- self.assertRaises(PassThru, self.s.intersection_update, check_pass_thru())
- self.assertRaises(TypeError, self.s.intersection_update, [[]])
- for p, q in (('cdc', 'c'), ('efgfe', ''), ('ccb', 'bc'), ('ef', '')):
- for C in set, frozenset, dict.fromkeys, str, list, tuple:
- s = self.thetype('abcba')
- self.assertEqual(s.intersection_update(C(p)), None)
- self.assertEqual(s, set(q))
- ss = 'abcba'
- s = self.thetype(ss)
- t = 'cbc'
- self.assertEqual(s.intersection_update(C(p), C(t)), None)
- self.assertEqual(s, set('abcba')&set(p)&set(t))
-
- def test_iand(self):
- self.s &= set(self.otherword)
- for c in (self.word + self.otherword):
- if c in self.otherword and c in self.word:
- self.assertIn(c, self.s)
- else:
- self.assertNotIn(c, self.s)
-
- def test_difference_update(self):
- retval = self.s.difference_update(self.otherword)
- self.assertEqual(retval, None)
- for c in (self.word + self.otherword):
- if c in self.word and c not in self.otherword:
- self.assertIn(c, self.s)
- else:
- self.assertNotIn(c, self.s)
- self.assertRaises(PassThru, self.s.difference_update, check_pass_thru())
- self.assertRaises(TypeError, self.s.difference_update, [[]])
- self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
- for p, q in (('cdc', 'ab'), ('efgfe', 'abc'), ('ccb', 'a'), ('ef', 'abc')):
- for C in set, frozenset, dict.fromkeys, str, list, tuple:
- s = self.thetype('abcba')
- self.assertEqual(s.difference_update(C(p)), None)
- self.assertEqual(s, set(q))
-
- s = self.thetype('abcdefghih')
- s.difference_update()
- self.assertEqual(s, self.thetype('abcdefghih'))
-
- s = self.thetype('abcdefghih')
- s.difference_update(C('aba'))
- self.assertEqual(s, self.thetype('cdefghih'))
-
- s = self.thetype('abcdefghih')
- s.difference_update(C('cdc'), C('aba'))
- self.assertEqual(s, self.thetype('efghih'))
-
- def test_isub(self):
- self.s -= set(self.otherword)
- for c in (self.word + self.otherword):
- if c in self.word and c not in self.otherword:
- self.assertIn(c, self.s)
- else:
- self.assertNotIn(c, self.s)
-
- def test_symmetric_difference_update(self):
- retval = self.s.symmetric_difference_update(self.otherword)
- self.assertEqual(retval, None)
- for c in (self.word + self.otherword):
- if (c in self.word) ^ (c in self.otherword):
- self.assertIn(c, self.s)
- else:
- self.assertNotIn(c, self.s)
- self.assertRaises(PassThru, self.s.symmetric_difference_update, check_pass_thru())
- self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
- for p, q in (('cdc', 'abd'), ('efgfe', 'abcefg'), ('ccb', 'a'), ('ef', 'abcef')):
- for C in set, frozenset, dict.fromkeys, str, list, tuple:
- s = self.thetype('abcba')
- self.assertEqual(s.symmetric_difference_update(C(p)), None)
- self.assertEqual(s, set(q))
-
- def test_ixor(self):
- self.s ^= set(self.otherword)
- for c in (self.word + self.otherword):
- if (c in self.word) ^ (c in self.otherword):
- self.assertIn(c, self.s)
- else:
- self.assertNotIn(c, self.s)
-
- def test_inplace_on_self(self):
- t = self.s.copy()
- t |= t
- self.assertEqual(t, self.s)
- t &= t
- self.assertEqual(t, self.s)
- t -= t
- self.assertEqual(t, self.thetype())
- t = self.s.copy()
- t ^= t
- self.assertEqual(t, self.thetype())
-
- def test_weakref(self):
- s = self.thetype('gallahad')
- p = weakref.proxy(s)
- self.assertEqual(str(p), str(s))
- s = None
- self.assertRaises(ReferenceError, str, p)
-
- def test_rich_compare(self):
- class TestRichSetCompare:
- def __gt__(self, some_set):
- self.gt_called = True
- return False
- def __lt__(self, some_set):
- self.lt_called = True
- return False
- def __ge__(self, some_set):
- self.ge_called = True
- return False
- def __le__(self, some_set):
- self.le_called = True
- return False
-
- # This first tries the builtin rich set comparison, which doesn't know
- # how to handle the custom object. Upon returning NotImplemented, the
- # corresponding comparison on the right object is invoked.
- myset = {1, 2, 3}
-
- myobj = TestRichSetCompare()
- myset < myobj
- self.assertTrue(myobj.gt_called)
-
- myobj = TestRichSetCompare()
- myset > myobj
- self.assertTrue(myobj.lt_called)
-
- myobj = TestRichSetCompare()
- myset <= myobj
- self.assertTrue(myobj.ge_called)
-
- myobj = TestRichSetCompare()
- myset >= myobj
- self.assertTrue(myobj.le_called)
-
- # C API test only available in a debug build
- if hasattr(set, "test_c_api"):
- def test_c_api(self):
- self.assertEqual(set().test_c_api(), True)
-
-class SetSubclass(set):
- pass
-
-class TestSetSubclass(TestSet):
- thetype = SetSubclass
- basetype = set
-
-class SetSubclassWithKeywordArgs(set):
- def __init__(self, iterable=[], newarg=None):
- set.__init__(self, iterable)
-
-class TestSetSubclassWithKeywordArgs(TestSet):
-
- def test_keywords_in_subclass(self):
- 'SF bug #1486663 -- this used to erroneously raise a TypeError'
- SetSubclassWithKeywordArgs(newarg=1)
-
-class TestFrozenSet(TestJointOps):
- thetype = frozenset
- basetype = frozenset
-
- def test_init(self):
- s = self.thetype(self.word)
- s.__init__(self.otherword)
- self.assertEqual(s, set(self.word))
-
- def test_singleton_empty_frozenset(self):
- f = frozenset()
- efs = [frozenset(), frozenset([]), frozenset(()), frozenset(''),
- frozenset(), frozenset([]), frozenset(()), frozenset(''),
- frozenset(range(0)), frozenset(frozenset()),
- frozenset(f), f]
- # All of the empty frozensets should have just one id()
- self.assertEqual(len(set(map(id, efs))), 1)
-
- def test_constructor_identity(self):
- s = self.thetype(range(3))
- t = self.thetype(s)
- self.assertEqual(id(s), id(t))
-
- def test_hash(self):
- self.assertEqual(hash(self.thetype('abcdeb')),
- hash(self.thetype('ebecda')))
-
- # make sure that all permutations give the same hash value
- n = 100
- seq = [randrange(n) for i in range(n)]
- results = set()
- for i in range(200):
- shuffle(seq)
- results.add(hash(self.thetype(seq)))
- self.assertEqual(len(results), 1)
-
- def test_copy(self):
- dup = self.s.copy()
- self.assertEqual(id(self.s), id(dup))
-
- def test_frozen_as_dictkey(self):
- seq = list(range(10)) + list('abcdefg') + ['apple']
- key1 = self.thetype(seq)
- key2 = self.thetype(reversed(seq))
- self.assertEqual(key1, key2)
- self.assertNotEqual(id(key1), id(key2))
- d = {}
- d[key1] = 42
- self.assertEqual(d[key2], 42)
-
- def test_hash_caching(self):
- f = self.thetype('abcdcda')
- self.assertEqual(hash(f), hash(f))
-
- def test_hash_effectiveness(self):
- n = 13
- hashvalues = set()
- addhashvalue = hashvalues.add
- elemmasks = [(i+1, 1<<i) for i in range(n)]
- for i in range(2**n):
- addhashvalue(hash(frozenset([e for e, m in elemmasks if m&i])))
- self.assertEqual(len(hashvalues), 2**n)
-
-class FrozenSetSubclass(frozenset):
- pass
-
-class TestFrozenSetSubclass(TestFrozenSet):
- thetype = FrozenSetSubclass
- basetype = frozenset
-
- def test_constructor_identity(self):
- s = self.thetype(range(3))
- t = self.thetype(s)
- self.assertNotEqual(id(s), id(t))
-
- def test_copy(self):
- dup = self.s.copy()
- self.assertNotEqual(id(self.s), id(dup))
-
- def test_nested_empty_constructor(self):
- s = self.thetype()
- t = self.thetype(s)
- self.assertEqual(s, t)
-
- def test_singleton_empty_frozenset(self):
- Frozenset = self.thetype
- f = frozenset()
- F = Frozenset()
- efs = [Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
- Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
- Frozenset(range(0)), Frozenset(Frozenset()),
- Frozenset(frozenset()), f, F, Frozenset(f), Frozenset(F)]
- # All empty frozenset subclass instances should have different ids
- self.assertEqual(len(set(map(id, efs))), len(efs))
-
-# Tests taken from test_sets.py =============================================
-
-empty_set = set() # type: Any
-
-#==============================================================================
-
-class TestBasicOps(unittest.TestCase):
-
- def test_repr(self):
- if self.repr is not None:
- self.assertEqual(repr(self.set), self.repr)
-
- def check_repr_against_values(self):
- text = repr(self.set)
- self.assertTrue(text.startswith('{'))
- self.assertTrue(text.endswith('}'))
-
- result = text[1:-1].split(', ')
- result.sort()
- sorted_repr_values = [repr(value) for value in self.values]
- sorted_repr_values.sort()
- self.assertEqual(result, sorted_repr_values)
-
- def test_print(self):
- try:
- fo = open(support.TESTFN, "w")
- fo.write(str(self.set))
- fo.close()
- fo = open(support.TESTFN, "r")
- self.assertEqual(fo.read(), repr(self.set))
- finally:
- fo.close()
- support.unlink(support.TESTFN)
-
- def test_length(self):
- self.assertEqual(len(self.set), self.length)
-
- def test_self_equality(self):
- self.assertEqual(self.set, self.set)
-
- def test_equivalent_equality(self):
- self.assertEqual(self.set, self.dup)
-
- def test_copy(self):
- self.assertEqual(self.set.copy(), self.dup)
-
- def test_self_union(self):
- result = self.set | self.set
- self.assertEqual(result, self.dup)
-
- def test_empty_union(self):
- result = self.set | empty_set
- self.assertEqual(result, self.dup)
-
- def test_union_empty(self):
- result = empty_set | self.set
- self.assertEqual(result, self.dup)
-
- def test_self_intersection(self):
- result = self.set & self.set
- self.assertEqual(result, self.dup)
-
- def test_empty_intersection(self):
- result = self.set & empty_set
- self.assertEqual(result, empty_set)
-
- def test_intersection_empty(self):
- result = empty_set & self.set
- self.assertEqual(result, empty_set)
-
- def test_self_isdisjoint(self):
- result = self.set.isdisjoint(self.set)
- self.assertEqual(result, not self.set)
-
- def test_empty_isdisjoint(self):
- result = self.set.isdisjoint(empty_set)
- self.assertEqual(result, True)
-
- def test_isdisjoint_empty(self):
- result = empty_set.isdisjoint(self.set)
- self.assertEqual(result, True)
-
- def test_self_symmetric_difference(self):
- result = self.set ^ self.set
- self.assertEqual(result, empty_set)
-
- def test_empty_symmetric_difference(self):
- result = self.set ^ empty_set
- self.assertEqual(result, self.set)
-
- def test_self_difference(self):
- result = self.set - self.set
- self.assertEqual(result, empty_set)
-
- def test_empty_difference(self):
- result = self.set - empty_set
- self.assertEqual(result, self.dup)
-
- def test_empty_difference_rev(self):
- result = empty_set - self.set
- self.assertEqual(result, empty_set)
-
- def test_iteration(self):
- for v in self.set:
- self.assertIn(v, self.values)
- setiter = iter(self.set)
- # note: __length_hint__ is an internal undocumented API,
- # don't rely on it in your own programs
- self.assertEqual(setiter.__length_hint__(), len(self.set))
-
- def test_pickling(self):
- p = pickle.dumps(self.set)
- copy = pickle.loads(p)
- self.assertEqual(self.set, copy,
- "%s != %s" % (self.set, copy))
-
-#------------------------------------------------------------------------------
-
-class TestBasicOpsEmpty(TestBasicOps):
- def setUp(self):
- self.case = "empty set"
- self.values = []
- self.set = set(self.values)
- self.dup = set(self.values)
- self.length = 0
- self.repr = "set()"
-
-#------------------------------------------------------------------------------
-
-class TestBasicOpsSingleton(TestBasicOps):
- def setUp(self):
- self.case = "unit set (number)"
- self.values = [3]
- self.set = set(self.values)
- self.dup = set(self.values)
- self.length = 1
- self.repr = "{3}"
-
- def test_in(self):
- self.assertIn(3, self.set)
-
- def test_not_in(self):
- self.assertNotIn(2, self.set)
-
-#------------------------------------------------------------------------------
-
-class TestBasicOpsTuple(TestBasicOps):
- def setUp(self):
- self.case = "unit set (tuple)"
- self.values = [(0, "zero")]
- self.set = set(self.values)
- self.dup = set(self.values)
- self.length = 1
- self.repr = "{(0, 'zero')}"
-
- def test_in(self):
- self.assertIn((0, "zero"), self.set)
-
- def test_not_in(self):
- self.assertNotIn(9, self.set)
-
-#------------------------------------------------------------------------------
-
-class TestBasicOpsTriple(TestBasicOps):
- def setUp(self):
- self.case = "triple set"
- self.values = [0, "zero", operator.add]
- self.set = set(self.values)
- self.dup = set(self.values)
- self.length = 3
- self.repr = None
-
-#------------------------------------------------------------------------------
-
-class TestBasicOpsString(TestBasicOps):
- def setUp(self):
- self.case = "string set"
- self.values = ["a", "b", "c"]
- self.set = set(self.values)
- self.dup = set(self.values)
- self.length = 3
-
- def test_repr(self):
- self.check_repr_against_values()
-
-#------------------------------------------------------------------------------
-
-class TestBasicOpsBytes(TestBasicOps):
- def setUp(self):
- self.case = "string set"
- self.values = [b"a", b"b", b"c"]
- self.set = set(self.values)
- self.dup = set(self.values)
- self.length = 3
-
- def test_repr(self):
- self.check_repr_against_values()
-
-#------------------------------------------------------------------------------
-
-class TestBasicOpsMixedStringBytes(TestBasicOps):
- def setUp(self):
- self._warning_filters = support.check_warnings()
- self._warning_filters.__enter__()
- warnings.simplefilter('ignore', BytesWarning)
- self.case = "string and bytes set"
- self.values = ["a", "b", b"a", b"b"]
- self.set = set(self.values)
- self.dup = set(self.values)
- self.length = 4
-
- def tearDown(self):
- self._warning_filters.__exit__(None, None, None)
-
- def test_repr(self):
- self.check_repr_against_values()
-
-#==============================================================================
-
-def baditer():
- raise TypeError
- yield True
-
-def gooditer():
- yield True
-
-class TestExceptionPropagation(unittest.TestCase):
- """SF 628246: Set constructor should not trap iterator TypeErrors"""
-
- def test_instanceWithException(self):
- self.assertRaises(TypeError, set, baditer())
-
- def test_instancesWithoutException(self):
- # All of these iterables should load without exception.
- set([1,2,3])
- set((1,2,3))
- set({'one':1, 'two':2, 'three':3})
- set(range(3))
- set('abc')
- set(gooditer())
-
- def test_changingSizeWhileIterating(self):
- s = set([1,2,3])
- try:
- for i in s:
- s.update([4])
- except RuntimeError:
- pass
- else:
- self.fail("no exception when changing size during iteration")
-
-#==============================================================================
-
-class TestSetOfSets(unittest.TestCase):
- def test_constructor(self):
- inner = frozenset([1])
- outer = set([inner])
- element = outer.pop()
- self.assertEqual(type(element), frozenset)
- outer.add(inner) # Rebuild set of sets with .add method
- outer.remove(inner)
- self.assertEqual(outer, set()) # Verify that remove worked
- outer.discard(inner) # Absence of KeyError indicates working fine
-
-#==============================================================================
-
-class TestBinaryOps(unittest.TestCase):
- def setUp(self):
- self.set = set((2, 4, 6))
-
- def test_eq(self): # SF bug 643115
- self.assertEqual(self.set, set({2:1,4:3,6:5}))
-
- def test_union_subset(self):
- result = self.set | set([2])
- self.assertEqual(result, set((2, 4, 6)))
-
- def test_union_superset(self):
- result = self.set | set([2, 4, 6, 8])
- self.assertEqual(result, set([2, 4, 6, 8]))
-
- def test_union_overlap(self):
- result = self.set | set([3, 4, 5])
- self.assertEqual(result, set([2, 3, 4, 5, 6]))
-
- def test_union_non_overlap(self):
- result = self.set | set([8])
- self.assertEqual(result, set([2, 4, 6, 8]))
-
- def test_intersection_subset(self):
- result = self.set & set((2, 4))
- self.assertEqual(result, set((2, 4)))
-
- def test_intersection_superset(self):
- result = self.set & set([2, 4, 6, 8])
- self.assertEqual(result, set([2, 4, 6]))
-
- def test_intersection_overlap(self):
- result = self.set & set([3, 4, 5])
- self.assertEqual(result, set([4]))
-
- def test_intersection_non_overlap(self):
- result = self.set & set([8])
- self.assertEqual(result, empty_set)
-
- def test_isdisjoint_subset(self):
- result = self.set.isdisjoint(set((2, 4)))
- self.assertEqual(result, False)
-
- def test_isdisjoint_superset(self):
- result = self.set.isdisjoint(set([2, 4, 6, 8]))
- self.assertEqual(result, False)
-
- def test_isdisjoint_overlap(self):
- result = self.set.isdisjoint(set([3, 4, 5]))
- self.assertEqual(result, False)
-
- def test_isdisjoint_non_overlap(self):
- result = self.set.isdisjoint(set([8]))
- self.assertEqual(result, True)
-
- def test_sym_difference_subset(self):
- result = self.set ^ set((2, 4))
- self.assertEqual(result, set([6]))
-
- def test_sym_difference_superset(self):
- result = self.set ^ set((2, 4, 6, 8))
- self.assertEqual(result, set([8]))
-
- def test_sym_difference_overlap(self):
- result = self.set ^ set((3, 4, 5))
- self.assertEqual(result, set([2, 3, 5, 6]))
-
- def test_sym_difference_non_overlap(self):
- result = self.set ^ set([8])
- self.assertEqual(result, set([2, 4, 6, 8]))
-
-#==============================================================================
-
-class TestUpdateOps(unittest.TestCase):
- def setUp(self):
- self.set = set((2, 4, 6))
-
- def test_union_subset(self):
- self.set |= set([2])
- self.assertEqual(self.set, set((2, 4, 6)))
-
- def test_union_superset(self):
- self.set |= set([2, 4, 6, 8])
- self.assertEqual(self.set, set([2, 4, 6, 8]))
-
- def test_union_overlap(self):
- self.set |= set([3, 4, 5])
- self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
-
- def test_union_non_overlap(self):
- self.set |= set([8])
- self.assertEqual(self.set, set([2, 4, 6, 8]))
-
- def test_union_method_call(self):
- self.set.update(set([3, 4, 5]))
- self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
-
- def test_intersection_subset(self):
- self.set &= set((2, 4))
- self.assertEqual(self.set, set((2, 4)))
-
- def test_intersection_superset(self):
- self.set &= set([2, 4, 6, 8])
- self.assertEqual(self.set, set([2, 4, 6]))
-
- def test_intersection_overlap(self):
- self.set &= set([3, 4, 5])
- self.assertEqual(self.set, set([4]))
-
- def test_intersection_non_overlap(self):
- self.set &= set([8])
- self.assertEqual(self.set, empty_set)
-
- def test_intersection_method_call(self):
- self.set.intersection_update(set([3, 4, 5]))
- self.assertEqual(self.set, set([4]))
-
- def test_sym_difference_subset(self):
- self.set ^= set((2, 4))
- self.assertEqual(self.set, set([6]))
-
- def test_sym_difference_superset(self):
- self.set ^= set((2, 4, 6, 8))
- self.assertEqual(self.set, set([8]))
-
- def test_sym_difference_overlap(self):
- self.set ^= set((3, 4, 5))
- self.assertEqual(self.set, set([2, 3, 5, 6]))
-
- def test_sym_difference_non_overlap(self):
- self.set ^= set([8])
- self.assertEqual(self.set, set([2, 4, 6, 8]))
-
- def test_sym_difference_method_call(self):
- self.set.symmetric_difference_update(set([3, 4, 5]))
- self.assertEqual(self.set, set([2, 3, 5, 6]))
-
- def test_difference_subset(self):
- self.set -= set((2, 4))
- self.assertEqual(self.set, set([6]))
-
- def test_difference_superset(self):
- self.set -= set((2, 4, 6, 8))
- self.assertEqual(self.set, set([]))
-
- def test_difference_overlap(self):
- self.set -= set((3, 4, 5))
- self.assertEqual(self.set, set([2, 6]))
-
- def test_difference_non_overlap(self):
- self.set -= set([8])
- self.assertEqual(self.set, set([2, 4, 6]))
-
- def test_difference_method_call(self):
- self.set.difference_update(set([3, 4, 5]))
- self.assertEqual(self.set, set([2, 6]))
-
-#==============================================================================
-
-class TestMutate(unittest.TestCase):
- def setUp(self):
- self.values = ["a", "b", "c"]
- self.set = set(self.values)
-
- def test_add_present(self):
- self.set.add("c")
- self.assertEqual(self.set, set("abc"))
-
- def test_add_absent(self):
- self.set.add("d")
- self.assertEqual(self.set, set("abcd"))
-
- def test_add_until_full(self):
- tmp = set()
- expected_len = 0
- for v in self.values:
- tmp.add(v)
- expected_len += 1
- self.assertEqual(len(tmp), expected_len)
- self.assertEqual(tmp, self.set)
-
- def test_remove_present(self):
- self.set.remove("b")
- self.assertEqual(self.set, set("ac"))
-
- def test_remove_absent(self):
- try:
- self.set.remove("d")
- self.fail("Removing missing element should have raised LookupError")
- except LookupError:
- pass
-
- def test_remove_until_empty(self):
- expected_len = len(self.set)
- for v in self.values:
- self.set.remove(v)
- expected_len -= 1
- self.assertEqual(len(self.set), expected_len)
-
- def test_discard_present(self):
- self.set.discard("c")
- self.assertEqual(self.set, set("ab"))
-
- def test_discard_absent(self):
- self.set.discard("d")
- self.assertEqual(self.set, set("abc"))
-
- def test_clear(self):
- self.set.clear()
- self.assertEqual(len(self.set), 0)
-
- def test_pop(self):
- popped = {}
- while self.set:
- popped[self.set.pop()] = None
- self.assertEqual(len(popped), len(self.values))
- for v in self.values:
- self.assertIn(v, popped)
-
- def test_update_empty_tuple(self):
- self.set.update(())
- self.assertEqual(self.set, set(self.values))
-
- def test_update_unit_tuple_overlap(self):
- self.set.update(("a",))
- self.assertEqual(self.set, set(self.values))
-
- def test_update_unit_tuple_non_overlap(self):
- self.set.update(("a", "z"))
- self.assertEqual(self.set, set(self.values + ["z"]))
-
-#==============================================================================
-
-class TestSubsets(unittest.TestCase):
-
- case2method = {"<=": "issubset",
- ">=": "issuperset",
- }
-
- reverse = {"==": "==",
- "!=": "!=",
- "<": ">",
- ">": "<",
- "<=": ">=",
- ">=": "<=",
- }
-
- def test_issubset(self):
- raise NotImplementedError() # eval not supported below
- x = self.left
- y = self.right
- for case in "!=", "==", "<", "<=", ">", ">=":
- expected = case in self.cases
- # Test the binary infix spelling.
- result = None ## eval("x" + case + "y", locals())
- self.assertEqual(result, expected)
- # Test the "friendly" method-name spelling, if one exists.
- if case in TestSubsets.case2method:
- method = getattr(x, TestSubsets.case2method[case])
- result = method(y)
- self.assertEqual(result, expected)
-
- # Now do the same for the operands reversed.
- rcase = TestSubsets.reverse[case]
- result = None ## eval("y" + rcase + "x", locals())
- self.assertEqual(result, expected)
- if rcase in TestSubsets.case2method:
- method = getattr(y, TestSubsets.case2method[rcase])
- result = method(x)
- self.assertEqual(result, expected)
-#------------------------------------------------------------------------------
-
-class TestSubsetEqualEmpty(TestSubsets):
- left = set() # type: Any
- right = set() # type: Any
- name = "both empty"
- cases = "==", "<=", ">="
-
-#------------------------------------------------------------------------------
-
-class TestSubsetEqualNonEmpty(TestSubsets):
- left = set([1, 2])
- right = set([1, 2])
- name = "equal pair"
- cases = "==", "<=", ">="
-
-#------------------------------------------------------------------------------
-
-class TestSubsetEmptyNonEmpty(TestSubsets):
- left = set() # type: Any
- right = set([1, 2])
- name = "one empty, one non-empty"
- cases = "!=", "<", "<="
-
-#------------------------------------------------------------------------------
-
-class TestSubsetPartial(TestSubsets):
- left = set([1])
- right = set([1, 2])
- name = "one a non-empty proper subset of other"
- cases = "!=", "<", "<="
-
-#------------------------------------------------------------------------------
-
-class TestSubsetNonOverlap(TestSubsets):
- left = set([1])
- right = set([2])
- name = "neither empty, neither contains"
- cases = "!="
-
-#==============================================================================
-
-class TestOnlySetsInBinaryOps(unittest.TestCase):
-
- def test_eq_ne(self):
- # Unlike the others, this is testing that == and != *are* allowed.
- self.assertEqual(self.other == self.set, False)
- self.assertEqual(self.set == self.other, False)
- self.assertEqual(self.other != self.set, True)
- self.assertEqual(self.set != self.other, True)
-
- def test_ge_gt_le_lt(self):
- self.assertRaises(TypeError, lambda: self.set < self.other)
- self.assertRaises(TypeError, lambda: self.set <= self.other)
- self.assertRaises(TypeError, lambda: self.set > self.other)
- self.assertRaises(TypeError, lambda: self.set >= self.other)
-
- self.assertRaises(TypeError, lambda: self.other < self.set)
- self.assertRaises(TypeError, lambda: self.other <= self.set)
- self.assertRaises(TypeError, lambda: self.other > self.set)
- self.assertRaises(TypeError, lambda: self.other >= self.set)
-
- def test_update_operator(self):
- try:
- self.set |= self.other
- except TypeError:
- pass
- else:
- self.fail("expected TypeError")
-
- def test_update(self):
- if self.otherIsIterable:
- self.set.update(self.other)
- else:
- self.assertRaises(TypeError, self.set.update, self.other)
-
- def test_union(self):
- self.assertRaises(TypeError, lambda: self.set | self.other)
- self.assertRaises(TypeError, lambda: self.other | self.set)
- if self.otherIsIterable:
- self.set.union(self.other)
- else:
- self.assertRaises(TypeError, self.set.union, self.other)
-
- def test_intersection_update_operator(self):
- try:
- self.set &= self.other
- except TypeError:
- pass
- else:
- self.fail("expected TypeError")
-
- def test_intersection_update(self):
- if self.otherIsIterable:
- self.set.intersection_update(self.other)
- else:
- self.assertRaises(TypeError,
- self.set.intersection_update,
- self.other)
-
- def test_intersection(self):
- self.assertRaises(TypeError, lambda: self.set & self.other)
- self.assertRaises(TypeError, lambda: self.other & self.set)
- if self.otherIsIterable:
- self.set.intersection(self.other)
- else:
- self.assertRaises(TypeError, self.set.intersection, self.other)
-
- def test_sym_difference_update_operator(self):
- try:
- self.set ^= self.other
- except TypeError:
- pass
- else:
- self.fail("expected TypeError")
-
- def test_sym_difference_update(self):
- if self.otherIsIterable:
- self.set.symmetric_difference_update(self.other)
- else:
- self.assertRaises(TypeError,
- self.set.symmetric_difference_update,
- self.other)
-
- def test_sym_difference(self):
- self.assertRaises(TypeError, lambda: self.set ^ self.other)
- self.assertRaises(TypeError, lambda: self.other ^ self.set)
- if self.otherIsIterable:
- self.set.symmetric_difference(self.other)
- else:
- self.assertRaises(TypeError, self.set.symmetric_difference, self.other)
-
- def test_difference_update_operator(self):
- try:
- self.set -= self.other
- except TypeError:
- pass
- else:
- self.fail("expected TypeError")
-
- def test_difference_update(self):
- if self.otherIsIterable:
- self.set.difference_update(self.other)
- else:
- self.assertRaises(TypeError,
- self.set.difference_update,
- self.other)
-
- def test_difference(self):
- self.assertRaises(TypeError, lambda: self.set - self.other)
- self.assertRaises(TypeError, lambda: self.other - self.set)
- if self.otherIsIterable:
- self.set.difference(self.other)
- else:
- self.assertRaises(TypeError, self.set.difference, self.other)
-
-#------------------------------------------------------------------------------
-
-class TestOnlySetsNumeric(TestOnlySetsInBinaryOps):
- def setUp(self):
- self.set = set((1, 2, 3))
- self.other = 19
- self.otherIsIterable = False
-
-#------------------------------------------------------------------------------
-
-class TestOnlySetsDict(TestOnlySetsInBinaryOps):
- def setUp(self):
- self.set = set((1, 2, 3))
- self.other = {1:2, 3:4}
- self.otherIsIterable = True
-
-#------------------------------------------------------------------------------
-
-class TestOnlySetsOperator(TestOnlySetsInBinaryOps):
- def setUp(self):
- self.set = set((1, 2, 3))
- self.other = operator.add
- self.otherIsIterable = False
-
-#------------------------------------------------------------------------------
-
-class TestOnlySetsTuple(TestOnlySetsInBinaryOps):
- def setUp(self):
- self.set = set((1, 2, 3))
- self.other = (2, 4, 6)
- self.otherIsIterable = True
-
-#------------------------------------------------------------------------------
-
-class TestOnlySetsString(TestOnlySetsInBinaryOps):
- def setUp(self):
- self.set = set((1, 2, 3))
- self.other = 'abc'
- self.otherIsIterable = True
-
-#------------------------------------------------------------------------------
-
-class TestOnlySetsGenerator(TestOnlySetsInBinaryOps):
- def setUp(self):
- def gen():
- for i in range(0, 10, 2):
- yield i
- self.set = set((1, 2, 3))
- self.other = gen()
- self.otherIsIterable = True
-
-#==============================================================================
-
-class TestCopying(unittest.TestCase):
-
- def test_copy(self):
- dup = self.set.copy()
- dup_list = sorted(dup, key=repr)
- set_list = sorted(self.set, key=repr)
- self.assertEqual(len(dup_list), len(set_list))
- for i in range(len(dup_list)):
- self.assertTrue(dup_list[i] is set_list[i])
-
- def test_deep_copy(self):
- dup = copy.deepcopy(self.set)
- ##print type(dup), repr(dup)
- dup_list = sorted(dup, key=repr)
- set_list = sorted(self.set, key=repr)
- self.assertEqual(len(dup_list), len(set_list))
- for i in range(len(dup_list)):
- self.assertEqual(dup_list[i], set_list[i])
-
-#------------------------------------------------------------------------------
-
-class TestCopyingEmpty(TestCopying):
- def setUp(self):
- self.set = set()
-
-#------------------------------------------------------------------------------
-
-class TestCopyingSingleton(TestCopying):
- def setUp(self):
- self.set = set(["hello"])
-
-#------------------------------------------------------------------------------
-
-class TestCopyingTriple(TestCopying):
- def setUp(self):
- self.set = set(["zero", 0, None])
-
-#------------------------------------------------------------------------------
-
-class TestCopyingTuple(TestCopying):
- def setUp(self):
- self.set = set([(1, 2)])
-
-#------------------------------------------------------------------------------
-
-class TestCopyingNested(TestCopying):
- def setUp(self):
- self.set = set([((1, 2), (3, 4))])
-
-#==============================================================================
-
-class TestIdentities(unittest.TestCase):
- def setUp(self):
- self.a = set('abracadabra')
- self.b = set('alacazam')
-
- def test_binopsVsSubsets(self):
- a, b = self.a, self.b
- self.assertTrue(a - b < a)
- self.assertTrue(b - a < b)
- self.assertTrue(a & b < a)
- self.assertTrue(a & b < b)
- self.assertTrue(a | b > a)
- self.assertTrue(a | b > b)
- self.assertTrue(a ^ b < a | b)
-
- def test_commutativity(self):
- a, b = self.a, self.b
- self.assertEqual(a&b, b&a)
- self.assertEqual(a|b, b|a)
- self.assertEqual(a^b, b^a)
- if a != b:
- self.assertNotEqual(a-b, b-a)
-
- def test_summations(self):
- # check that sums of parts equal the whole
- a, b = self.a, self.b
- self.assertEqual((a-b)|(a&b)|(b-a), a|b)
- self.assertEqual((a&b)|(a^b), a|b)
- self.assertEqual(a|(b-a), a|b)
- self.assertEqual((a-b)|b, a|b)
- self.assertEqual((a-b)|(a&b), a)
- self.assertEqual((b-a)|(a&b), b)
- self.assertEqual((a-b)|(b-a), a^b)
-
- def test_exclusion(self):
- # check that inverse operations show non-overlap
- a, b, zero = self.a, self.b, set()
- self.assertEqual((a-b)&b, zero)
- self.assertEqual((b-a)&a, zero)
- self.assertEqual((a&b)&(a^b), zero)
-
-# Tests derived from test_itertools.py =======================================
-
-def R(seqn):
- 'Regular generator'
- for i in seqn:
- yield i
-
-class G:
- 'Sequence using __getitem__'
- def __init__(self, seqn):
- self.seqn = seqn
- def __getitem__(self, i):
- return self.seqn[i]
-
-class I:
- 'Sequence using iterator protocol'
- def __init__(self, seqn):
- self.seqn = seqn
- self.i = 0
- def __iter__(self):
- return self
- def __next__(self):
- if self.i >= len(self.seqn): raise StopIteration
- v = self.seqn[self.i]
- self.i += 1
- return v
-
-class Ig:
- 'Sequence using iterator protocol defined with a generator'
- def __init__(self, seqn):
- self.seqn = seqn
- self.i = 0
- def __iter__(self):
- for val in self.seqn:
- yield val
-
-class X:
- 'Missing __getitem__ and __iter__'
- def __init__(self, seqn):
- self.seqn = seqn
- self.i = 0
- def __next__(self):
- if self.i >= len(self.seqn): raise StopIteration
- v = self.seqn[self.i]
- self.i += 1
- return v
-
-class N:
- 'Iterator missing __next__()'
- def __init__(self, seqn):
- self.seqn = seqn
- self.i = 0
- def __iter__(self):
- return self
-
-class E:
- 'Test propagation of exceptions'
- def __init__(self, seqn):
- self.seqn = seqn
- self.i = 0
- def __iter__(self):
- return self
- def __next__(self):
- 3 // 0
-
-class S:
- 'Test immediate stop'
- def __init__(self, seqn):
- pass
- def __iter__(self):
- return self
- def __next__(self):
- raise StopIteration
-
-from itertools import chain
-def L(seqn):
- 'Test multiple tiers of iterators'
- return chain(map(lambda x:x, R(Ig(G(seqn)))))
-
-class TestVariousIteratorArgs(unittest.TestCase):
-
- def test_constructor(self):
- for cons in (set, frozenset):
- for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
- for g in (G, I, Ig, S, L, R):
- self.assertEqual(sorted(cons(g(s)), key=repr), sorted(g(s), key=repr))
- self.assertRaises(TypeError, cons , X(s))
- self.assertRaises(TypeError, cons , N(s))
- self.assertRaises(ZeroDivisionError, cons , E(s))
-
- def test_inline_methods(self):
- s = set('november')
- for data in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5), 'december'):
- for meth in (s.union, s.intersection, s.difference, s.symmetric_difference, s.isdisjoint):
- for g in (G, I, Ig, L, R):
- expected = meth(data)
- actual = meth(G(data))
- if isinstance(expected, bool):
- self.assertEqual(actual, expected)
- else:
- self.assertEqual(sorted(actual, key=repr), sorted(expected, key=repr))
- self.assertRaises(TypeError, meth, X(s))
- self.assertRaises(TypeError, meth, N(s))
- self.assertRaises(ZeroDivisionError, meth, E(s))
-
- def test_inplace_methods(self):
- for data in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5), 'december'):
- for methname in ('update', 'intersection_update',
- 'difference_update', 'symmetric_difference_update'):
- for g in (G, I, Ig, S, L, R):
- s = set('january')
- t = s.copy()
- getattr(s, methname)(list(g(data)))
- getattr(t, methname)(g(data))
- self.assertEqual(sorted(s, key=repr), sorted(t, key=repr))
-
- self.assertRaises(TypeError, getattr(set('january'), methname), X(data))
- self.assertRaises(TypeError, getattr(set('january'), methname), N(data))
- self.assertRaises(ZeroDivisionError, getattr(set('january'), methname), E(data))
-
-be_bad = set2 = dict2 = None # type: Any
-
-class bad_eq:
- def __eq__(self, other):
- if be_bad:
- set2.clear()
- raise ZeroDivisionError
- return self is other
- def __hash__(self):
- return 0
-
-class bad_dict_clear:
- def __eq__(self, other):
- if be_bad:
- dict2.clear()
- return self is other
- def __hash__(self):
- return 0
-
-class TestWeirdBugs(unittest.TestCase):
- def test_8420_set_merge(self):
- # This used to segfault
- global be_bad, set2, dict2
- be_bad = False
- set1 = {bad_eq()}
- set2 = {bad_eq() for i in range(75)}
- be_bad = True
- self.assertRaises(ZeroDivisionError, set1.update, set2)
-
- be_bad = False
- set1 = {bad_dict_clear()}
- dict2 = {bad_dict_clear(): None}
- be_bad = True
- set1.symmetric_difference_update(dict2)
-
-# Application tests (based on David Eppstein's graph recipes ====================================
-
-def powerset(U):
- """Generates all subsets of a set or sequence U."""
- U = iter(U)
- try:
- x = frozenset([next(U)])
- for S in powerset(U):
- yield S
- yield S | x
- except StopIteration:
- yield frozenset()
-
-def cube(n):
- """Graph of n-dimensional hypercube."""
- singletons = [frozenset([x]) for x in range(n)]
- return dict([(x, frozenset([x^s for s in singletons]))
- for x in powerset(range(n))])
-
-def linegraph(G):
- """Graph, the vertices of which are edges of G,
- with two vertices being adjacent iff the corresponding
- edges share a vertex."""
- L = {}
- for x in G:
- for y in G[x]:
- nx = [frozenset([x,z]) for z in G[x] if z != y]
- ny = [frozenset([y,z]) for z in G[y] if z != x]
- L[frozenset([x,y])] = frozenset(nx+ny)
- return L
-
-def faces(G):
- 'Return a set of faces in G. Where a face is a set of vertices on that face'
- # currently limited to triangles,squares, and pentagons
- f = set()
- for v1, edges in G.items():
- for v2 in edges:
- for v3 in G[v2]:
- if v1 == v3:
- continue
- if v1 in G[v3]:
- f.add(frozenset([v1, v2, v3]))
- else:
- for v4 in G[v3]:
- if v4 == v2:
- continue
- if v1 in G[v4]:
- f.add(frozenset([v1, v2, v3, v4]))
- else:
- for v5 in G[v4]:
- if v5 == v3 or v5 == v2:
- continue
- if v1 in G[v5]:
- f.add(frozenset([v1, v2, v3, v4, v5]))
- return f
-
-
-class TestGraphs(unittest.TestCase):
-
- def test_cube(self):
-
- g = cube(3) # vert --> {v1, v2, v3}
- vertices1 = set(g)
- self.assertEqual(len(vertices1), 8) # eight vertices
- for edge in g.values():
- self.assertEqual(len(edge), 3) # each vertex connects to three edges
- vertices2 = set()
- for edges in g.values():
- for v in edges:
- vertices2.add(v)
- self.assertEqual(vertices1, vertices2) # edge vertices in original set
-
- cubefaces = faces(g)
- self.assertEqual(len(cubefaces), 6) # six faces
- for face in cubefaces:
- self.assertEqual(len(face), 4) # each face is a square
-
- def test_cuboctahedron(self):
-
- # http://en.wikipedia.org/wiki/Cuboctahedron
- # 8 triangular faces and 6 square faces
- # 12 indentical vertices each connecting a triangle and square
-
- g = cube(3)
- cuboctahedron = linegraph(g) # V( --> {V1, V2, V3, V4}
- self.assertEqual(len(cuboctahedron), 12)# twelve vertices
-
- vertices = set(cuboctahedron)
- for edges in cuboctahedron.values():
- self.assertEqual(len(edges), 4) # each vertex connects to four other vertices
- othervertices = set(edge for edges in cuboctahedron.values() for edge in edges)
- self.assertEqual(vertices, othervertices) # edge vertices in original set
-
- cubofaces = faces(cuboctahedron)
- facesizes = collections.defaultdict(int)
- for face in cubofaces:
- facesizes[len(face)] += 1
- self.assertEqual(facesizes[3], 8) # eight triangular faces
- self.assertEqual(facesizes[4], 6) # six square faces
-
- for vertex in cuboctahedron:
- edge = vertex # Cuboctahedron vertices are edges in Cube
- self.assertEqual(len(edge), 2) # Two cube vertices define an edge
- for cubevert in edge:
- self.assertIn(cubevert, g)
-
-
-#==============================================================================
-
-def test_main(verbose=None):
- test_classes = (
- TestSet,
- TestSetSubclass,
- TestSetSubclassWithKeywordArgs,
- TestFrozenSet,
- TestFrozenSetSubclass,
- TestSetOfSets,
- TestExceptionPropagation,
- TestBasicOpsEmpty,
- TestBasicOpsSingleton,
- TestBasicOpsTuple,
- TestBasicOpsTriple,
- TestBasicOpsString,
- TestBasicOpsBytes,
- TestBasicOpsMixedStringBytes,
- TestBinaryOps,
- TestUpdateOps,
- TestMutate,
- TestSubsetEqualEmpty,
- TestSubsetEqualNonEmpty,
- TestSubsetEmptyNonEmpty,
- TestSubsetPartial,
- TestSubsetNonOverlap,
- TestOnlySetsNumeric,
- TestOnlySetsDict,
- TestOnlySetsOperator,
- TestOnlySetsTuple,
- TestOnlySetsString,
- TestOnlySetsGenerator,
- TestCopyingEmpty,
- TestCopyingSingleton,
- TestCopyingTriple,
- TestCopyingTuple,
- TestCopyingNested,
- TestIdentities,
- TestVariousIteratorArgs,
- TestGraphs,
- TestWeirdBugs,
- )
-
- support.run_unittest(*test_classes)
-
- # verify reference counting
- if verbose and hasattr(sys, "gettotalrefcount"):
- import gc
- counts = [None] * 5
- for i in range(len(counts)):
- support.run_unittest(*test_classes)
- gc.collect()
- counts[i] = sys.gettotalrefcount()
- print(counts)
-
-if __name__ == "__main__":
- test_main(verbose=True)
diff --git a/test-data/stdlib-samples/3.2/test/test_shutil.py b/test-data/stdlib-samples/3.2/test/test_shutil.py
deleted file mode 100644
index 32e0fd1..0000000
--- a/test-data/stdlib-samples/3.2/test/test_shutil.py
+++ /dev/null
@@ -1,978 +0,0 @@
-# Copyright (C) 2003 Python Software Foundation
-
-import unittest
-import shutil
-import tempfile
-import sys
-import stat
-import os
-import os.path
-import functools
-from test import support
-from test.support import TESTFN
-from os.path import splitdrive
-from distutils.spawn import find_executable, spawn
-from shutil import (_make_tarball, _make_zipfile, make_archive,
- register_archive_format, unregister_archive_format,
- get_archive_formats, Error, unpack_archive,
- register_unpack_format, RegistryError,
- unregister_unpack_format, get_unpack_formats)
-import tarfile
-import warnings
-
-from test import support
-from test.support import check_warnings, captured_stdout
-
-from typing import (
- Any, Callable, Tuple, List, Sequence, BinaryIO, IO, Union, cast
-)
-from types import TracebackType
-
-import bz2
-BZ2_SUPPORTED = True
-
-TESTFN2 = TESTFN + "2"
-
-import grp
-import pwd
-UID_GID_SUPPORT = True
-
-import zlib
-
-import zipfile
-ZIP_SUPPORT = True
-
-def _fake_rename(*args: Any, **kwargs: Any) -> None:
- # Pretend the destination path is on a different filesystem.
- raise OSError()
-
-def mock_rename(func: Any) -> Any:
- @functools.wraps(func)
- def wrap(*args: Any, **kwargs: Any) -> Any:
- try:
- builtin_rename = shutil.rename
- shutil.rename = cast(Any, _fake_rename)
- return func(*args, **kwargs)
- finally:
- shutil.rename = cast(Any, builtin_rename)
- return wrap
-
-class TestShutil(unittest.TestCase):
-
- def setUp(self) -> None:
- super().setUp()
- self.tempdirs = [] # type: List[str]
-
- def tearDown(self) -> None:
- super().tearDown()
- while self.tempdirs:
- d = self.tempdirs.pop()
- shutil.rmtree(d, os.name in ('nt', 'cygwin'))
-
- def write_file(self, path: Union[str, List[str], tuple], content: str = 'xxx') -> None:
- """Writes a file in the given path.
-
-
- path can be a string or a sequence.
- """
- if isinstance(path, list):
- path = os.path.join(*path)
- elif isinstance(path, tuple):
- path = cast(str, os.path.join(*path))
- f = open(path, 'w')
- try:
- f.write(content)
- finally:
- f.close()
-
- def mkdtemp(self) -> str:
- """Create a temporary directory that will be cleaned up.
-
- Returns the path of the directory.
- """
- d = tempfile.mkdtemp()
- self.tempdirs.append(d)
- return d
-
- def test_rmtree_errors(self) -> None:
- # filename is guaranteed not to exist
- filename = tempfile.mktemp()
- self.assertRaises(OSError, shutil.rmtree, filename)
-
- # See bug #1071513 for why we don't run this on cygwin
- # and bug #1076467 for why we don't run this as root.
- if (hasattr(os, 'chmod') and sys.platform[:6] != 'cygwin'
- and not (hasattr(os, 'geteuid') and os.geteuid() == 0)):
- def test_on_error(self) -> None:
- self.errorState = 0
- os.mkdir(TESTFN)
- self.childpath = os.path.join(TESTFN, 'a')
- f = open(self.childpath, 'w')
- f.close()
- old_dir_mode = os.stat(TESTFN).st_mode
- old_child_mode = os.stat(self.childpath).st_mode
- # Make unwritable.
- os.chmod(self.childpath, stat.S_IREAD)
- os.chmod(TESTFN, stat.S_IREAD)
-
- shutil.rmtree(TESTFN, onerror=self.check_args_to_onerror)
- # Test whether onerror has actually been called.
- self.assertEqual(self.errorState, 2,
- "Expected call to onerror function did not happen.")
-
- # Make writable again.
- os.chmod(TESTFN, old_dir_mode)
- os.chmod(self.childpath, old_child_mode)
-
- # Clean up.
- shutil.rmtree(TESTFN)
-
- def check_args_to_onerror(self, func: Callable[[str], Any], arg: str,
- exc: Tuple[type, BaseException,
- TracebackType]) -> None:
- # test_rmtree_errors deliberately runs rmtree
- # on a directory that is chmod 400, which will fail.
- # This function is run when shutil.rmtree fails.
- # 99.9% of the time it initially fails to remove
- # a file in the directory, so the first time through
- # func is os.remove.
- # However, some Linux machines running ZFS on
- # FUSE experienced a failure earlier in the process
- # at os.listdir. The first failure may legally
- # be either.
- if self.errorState == 0:
- if func is os.remove:
- self.assertEqual(arg, self.childpath)
- else:
- self.assertIs(func, os.listdir,
- "func must be either os.remove or os.listdir")
- self.assertEqual(arg, TESTFN)
- self.assertTrue(issubclass(exc[0], OSError))
- self.errorState = 1
- else:
- self.assertEqual(func, os.rmdir)
- self.assertEqual(arg, TESTFN)
- self.assertTrue(issubclass(exc[0], OSError))
- self.errorState = 2
-
- def test_rmtree_dont_delete_file(self) -> None:
- # When called on a file instead of a directory, don't delete it.
- handle, path = tempfile.mkstemp()
- os.fdopen(handle).close()
- self.assertRaises(OSError, shutil.rmtree, path)
- os.remove(path)
-
- def _write_data(self, path: str, data: str) -> None:
- f = open(path, "w")
- f.write(data)
- f.close()
-
- def test_copytree_simple(self) -> None:
-
- def read_data(path: str) -> str:
- f = open(path)
- data = f.read()
- f.close()
- return data
-
- src_dir = tempfile.mkdtemp()
- dst_dir = os.path.join(tempfile.mkdtemp(), 'destination')
- self._write_data(os.path.join(src_dir, 'test.txt'), '123')
- os.mkdir(os.path.join(src_dir, 'test_dir'))
- self._write_data(os.path.join(src_dir, 'test_dir', 'test.txt'), '456')
-
- try:
- shutil.copytree(src_dir, dst_dir)
- self.assertTrue(os.path.isfile(os.path.join(dst_dir, 'test.txt')))
- self.assertTrue(os.path.isdir(os.path.join(dst_dir, 'test_dir')))
- self.assertTrue(os.path.isfile(os.path.join(dst_dir, 'test_dir',
- 'test.txt')))
- actual = read_data(os.path.join(dst_dir, 'test.txt'))
- self.assertEqual(actual, '123')
- actual = read_data(os.path.join(dst_dir, 'test_dir', 'test.txt'))
- self.assertEqual(actual, '456')
- finally:
- for path in (
- os.path.join(src_dir, 'test.txt'),
- os.path.join(dst_dir, 'test.txt'),
- os.path.join(src_dir, 'test_dir', 'test.txt'),
- os.path.join(dst_dir, 'test_dir', 'test.txt'),
- ):
- if os.path.exists(path):
- os.remove(path)
- for path in (src_dir,
- os.path.dirname(dst_dir)
- ):
- if os.path.exists(path):
- shutil.rmtree(path)
-
- def test_copytree_with_exclude(self) -> None:
-
- def read_data(path: str) -> str:
- f = open(path)
- data = f.read()
- f.close()
- return data
-
- # creating data
- join = os.path.join
- exists = os.path.exists
- src_dir = tempfile.mkdtemp()
- try:
- dst_dir = join(tempfile.mkdtemp(), 'destination')
- self._write_data(join(src_dir, 'test.txt'), '123')
- self._write_data(join(src_dir, 'test.tmp'), '123')
- os.mkdir(join(src_dir, 'test_dir'))
- self._write_data(join(src_dir, 'test_dir', 'test.txt'), '456')
- os.mkdir(join(src_dir, 'test_dir2'))
- self._write_data(join(src_dir, 'test_dir2', 'test.txt'), '456')
- os.mkdir(join(src_dir, 'test_dir2', 'subdir'))
- os.mkdir(join(src_dir, 'test_dir2', 'subdir2'))
- self._write_data(join(src_dir, 'test_dir2', 'subdir', 'test.txt'),
- '456')
- self._write_data(join(src_dir, 'test_dir2', 'subdir2', 'test.py'),
- '456')
-
-
- # testing glob-like patterns
- try:
- patterns = shutil.ignore_patterns('*.tmp', 'test_dir2')
- shutil.copytree(src_dir, dst_dir, ignore=patterns)
- # checking the result: some elements should not be copied
- self.assertTrue(exists(join(dst_dir, 'test.txt')))
- self.assertTrue(not exists(join(dst_dir, 'test.tmp')))
- self.assertTrue(not exists(join(dst_dir, 'test_dir2')))
- finally:
- if os.path.exists(dst_dir):
- shutil.rmtree(dst_dir)
- try:
- patterns = shutil.ignore_patterns('*.tmp', 'subdir*')
- shutil.copytree(src_dir, dst_dir, ignore=patterns)
- # checking the result: some elements should not be copied
- self.assertTrue(not exists(join(dst_dir, 'test.tmp')))
- self.assertTrue(not exists(join(dst_dir, 'test_dir2', 'subdir2')))
- self.assertTrue(not exists(join(dst_dir, 'test_dir2', 'subdir')))
- finally:
- if os.path.exists(dst_dir):
- shutil.rmtree(dst_dir)
-
- # testing callable-style
- try:
- def _filter(src: str, names: Sequence[str]) -> List[str]:
- res = [] # type: List[str]
- for name in names:
- path = os.path.join(src, name)
-
- if (os.path.isdir(path) and
- path.split()[-1] == 'subdir'):
- res.append(name)
- elif os.path.splitext(path)[-1] in ('.py'):
- res.append(name)
- return res
-
- shutil.copytree(src_dir, dst_dir, ignore=_filter)
-
- # checking the result: some elements should not be copied
- self.assertTrue(not exists(join(dst_dir, 'test_dir2', 'subdir2',
- 'test.py')))
- self.assertTrue(not exists(join(dst_dir, 'test_dir2', 'subdir')))
-
- finally:
- if os.path.exists(dst_dir):
- shutil.rmtree(dst_dir)
- finally:
- shutil.rmtree(src_dir)
- shutil.rmtree(os.path.dirname(dst_dir))
-
- @unittest.skipUnless(hasattr(os, 'link'), 'requires os.link')
- def test_dont_copy_file_onto_link_to_itself(self) -> None:
- # Temporarily disable test on Windows.
- if os.name == 'nt':
- return
- # bug 851123.
- os.mkdir(TESTFN)
- src = os.path.join(TESTFN, 'cheese')
- dst = os.path.join(TESTFN, 'shop')
- try:
- with open(src, 'w') as f:
- f.write('cheddar')
- os.link(src, dst)
- self.assertRaises(shutil.Error, shutil.copyfile, src, dst)
- with open(src, 'r') as f:
- self.assertEqual(f.read(), 'cheddar')
- os.remove(dst)
- finally:
- shutil.rmtree(TESTFN, ignore_errors=True)
-
- @support.skip_unless_symlink
- def test_dont_copy_file_onto_symlink_to_itself(self) -> None:
- # bug 851123.
- os.mkdir(TESTFN)
- src = os.path.join(TESTFN, 'cheese')
- dst = os.path.join(TESTFN, 'shop')
- try:
- with open(src, 'w') as f:
- f.write('cheddar')
- # Using `src` here would mean we end up with a symlink pointing
- # to TESTFN/TESTFN/cheese, while it should point at
- # TESTFN/cheese.
- os.symlink('cheese', dst)
- self.assertRaises(shutil.Error, shutil.copyfile, src, dst)
- with open(src, 'r') as f:
- self.assertEqual(f.read(), 'cheddar')
- os.remove(dst)
- finally:
- shutil.rmtree(TESTFN, ignore_errors=True)
-
- @support.skip_unless_symlink
- def test_rmtree_on_symlink(self) -> None:
- # bug 1669.
- os.mkdir(TESTFN)
- try:
- src = os.path.join(TESTFN, 'cheese')
- dst = os.path.join(TESTFN, 'shop')
- os.mkdir(src)
- os.symlink(src, dst)
- self.assertRaises(OSError, shutil.rmtree, dst)
- finally:
- shutil.rmtree(TESTFN, ignore_errors=True)
-
- if hasattr(os, "mkfifo"):
- # Issue #3002: copyfile and copytree block indefinitely on named pipes
- def test_copyfile_named_pipe(self) -> None:
- os.mkfifo(TESTFN)
- try:
- self.assertRaises(shutil.SpecialFileError,
- shutil.copyfile, TESTFN, TESTFN2)
- self.assertRaises(shutil.SpecialFileError,
- shutil.copyfile, __file__, TESTFN)
- finally:
- os.remove(TESTFN)
-
- @support.skip_unless_symlink
- def test_copytree_named_pipe(self) -> None:
- os.mkdir(TESTFN)
- try:
- subdir = os.path.join(TESTFN, "subdir")
- os.mkdir(subdir)
- pipe = os.path.join(subdir, "mypipe")
- os.mkfifo(pipe)
- try:
- shutil.copytree(TESTFN, TESTFN2)
- except shutil.Error as e:
- errors = e.args[0]
- self.assertEqual(len(errors), 1)
- src, dst, error_msg = errors[0]
- self.assertEqual("`%s` is a named pipe" % pipe, error_msg)
- else:
- self.fail("shutil.Error should have been raised")
- finally:
- shutil.rmtree(TESTFN, ignore_errors=True)
- shutil.rmtree(TESTFN2, ignore_errors=True)
-
- def test_copytree_special_func(self) -> None:
-
- src_dir = self.mkdtemp()
- dst_dir = os.path.join(self.mkdtemp(), 'destination')
- self._write_data(os.path.join(src_dir, 'test.txt'), '123')
- os.mkdir(os.path.join(src_dir, 'test_dir'))
- self._write_data(os.path.join(src_dir, 'test_dir', 'test.txt'), '456')
-
- copied = [] # type: List[Tuple[str, str]]
- def _copy(src: str, dst: str) -> None:
- copied.append((src, dst))
-
- shutil.copytree(src_dir, dst_dir, copy_function=_copy)
- self.assertEqual(len(copied), 2)
-
- @support.skip_unless_symlink
- def test_copytree_dangling_symlinks(self) -> None:
-
- # a dangling symlink raises an error at the end
- src_dir = self.mkdtemp()
- dst_dir = os.path.join(self.mkdtemp(), 'destination')
- os.symlink('IDONTEXIST', os.path.join(src_dir, 'test.txt'))
- os.mkdir(os.path.join(src_dir, 'test_dir'))
- self._write_data(os.path.join(src_dir, 'test_dir', 'test.txt'), '456')
- self.assertRaises(Error, shutil.copytree, src_dir, dst_dir)
-
- # a dangling symlink is ignored with the proper flag
- dst_dir = os.path.join(self.mkdtemp(), 'destination2')
- shutil.copytree(src_dir, dst_dir, ignore_dangling_symlinks=True)
- self.assertNotIn('test.txt', os.listdir(dst_dir))
-
- # a dangling symlink is copied if symlinks=True
- dst_dir = os.path.join(self.mkdtemp(), 'destination3')
- shutil.copytree(src_dir, dst_dir, symlinks=True)
- self.assertIn('test.txt', os.listdir(dst_dir))
-
- def _copy_file(self,
- method: Callable[[str, str], None]) -> Tuple[str, str]:
- fname = 'test.txt'
- tmpdir = self.mkdtemp()
- self.write_file([tmpdir, fname])
- file1 = os.path.join(tmpdir, fname)
- tmpdir2 = self.mkdtemp()
- method(file1, tmpdir2)
- file2 = os.path.join(tmpdir2, fname)
- return (file1, file2)
-
- @unittest.skipUnless(hasattr(os, 'chmod'), 'requires os.chmod')
- def test_copy(self) -> None:
- # Ensure that the copied file exists and has the same mode bits.
- file1, file2 = self._copy_file(shutil.copy)
- self.assertTrue(os.path.exists(file2))
- self.assertEqual(os.stat(file1).st_mode, os.stat(file2).st_mode)
-
- @unittest.skipUnless(hasattr(os, 'chmod'), 'requires os.chmod')
- @unittest.skipUnless(hasattr(os, 'utime'), 'requires os.utime')
- def test_copy2(self) -> None:
- # Ensure that the copied file exists and has the same mode and
- # modification time bits.
- file1, file2 = self._copy_file(shutil.copy2)
- self.assertTrue(os.path.exists(file2))
- file1_stat = os.stat(file1)
- file2_stat = os.stat(file2)
- self.assertEqual(file1_stat.st_mode, file2_stat.st_mode)
- for attr in 'st_atime', 'st_mtime':
- # The modification times may be truncated in the new file.
- self.assertLessEqual(getattr(file1_stat, attr),
- getattr(file2_stat, attr) + 1)
- if hasattr(os, 'chflags') and hasattr(file1_stat, 'st_flags'):
- self.assertEqual(getattr(file1_stat, 'st_flags'),
- getattr(file2_stat, 'st_flags'))
-
- @unittest.skipUnless(zlib, "requires zlib")
- def test_make_tarball(self) -> None:
- # creating something to tar
- tmpdir = self.mkdtemp()
- self.write_file([tmpdir, 'file1'], 'xxx')
- self.write_file([tmpdir, 'file2'], 'xxx')
- os.mkdir(os.path.join(tmpdir, 'sub'))
- self.write_file([tmpdir, 'sub', 'file3'], 'xxx')
-
- tmpdir2 = self.mkdtemp()
- # force shutil to create the directory
- os.rmdir(tmpdir2)
- unittest.skipUnless(splitdrive(tmpdir)[0] == splitdrive(tmpdir2)[0],
- "source and target should be on same drive")
-
- base_name = os.path.join(tmpdir2, 'archive')
-
- # working with relative paths to avoid tar warnings
- old_dir = os.getcwd()
- os.chdir(tmpdir)
- try:
- _make_tarball(splitdrive(base_name)[1], '.')
- finally:
- os.chdir(old_dir)
-
- # check if the compressed tarball was created
- tarball = base_name + '.tar.gz'
- self.assertTrue(os.path.exists(tarball))
-
- # trying an uncompressed one
- base_name = os.path.join(tmpdir2, 'archive')
- old_dir = os.getcwd()
- os.chdir(tmpdir)
- try:
- _make_tarball(splitdrive(base_name)[1], '.', compress=None)
- finally:
- os.chdir(old_dir)
- tarball = base_name + '.tar'
- self.assertTrue(os.path.exists(tarball))
-
- def _tarinfo(self, path: str) -> tuple:
- tar = tarfile.open(path)
- try:
- names = tar.getnames()
- names.sort()
- return tuple(names)
- finally:
- tar.close()
-
- def _create_files(self) -> Tuple[str, str, str]:
- # creating something to tar
- tmpdir = self.mkdtemp()
- dist = os.path.join(tmpdir, 'dist')
- os.mkdir(dist)
- self.write_file([dist, 'file1'], 'xxx')
- self.write_file([dist, 'file2'], 'xxx')
- os.mkdir(os.path.join(dist, 'sub'))
- self.write_file([dist, 'sub', 'file3'], 'xxx')
- os.mkdir(os.path.join(dist, 'sub2'))
- tmpdir2 = self.mkdtemp()
- base_name = os.path.join(tmpdir2, 'archive')
- return tmpdir, tmpdir2, base_name
-
- @unittest.skipUnless(zlib, "Requires zlib")
- @unittest.skipUnless(find_executable('tar') and find_executable('gzip'),
- 'Need the tar command to run')
- def test_tarfile_vs_tar(self) -> None:
- tmpdir, tmpdir2, base_name = self._create_files()
- old_dir = os.getcwd()
- os.chdir(tmpdir)
- try:
- _make_tarball(base_name, 'dist')
- finally:
- os.chdir(old_dir)
-
- # check if the compressed tarball was created
- tarball = base_name + '.tar.gz'
- self.assertTrue(os.path.exists(tarball))
-
- # now create another tarball using `tar`
- tarball2 = os.path.join(tmpdir, 'archive2.tar.gz')
- tar_cmd = ['tar', '-cf', 'archive2.tar', 'dist']
- gzip_cmd = ['gzip', '-f9', 'archive2.tar']
- old_dir = os.getcwd()
- os.chdir(tmpdir)
- try:
- with captured_stdout() as s:
- spawn(tar_cmd)
- spawn(gzip_cmd)
- finally:
- os.chdir(old_dir)
-
- self.assertTrue(os.path.exists(tarball2))
- # let's compare both tarballs
- self.assertEqual(self._tarinfo(tarball), self._tarinfo(tarball2))
-
- # trying an uncompressed one
- base_name = os.path.join(tmpdir2, 'archive')
- old_dir = os.getcwd()
- os.chdir(tmpdir)
- try:
- _make_tarball(base_name, 'dist', compress=None)
- finally:
- os.chdir(old_dir)
- tarball = base_name + '.tar'
- self.assertTrue(os.path.exists(tarball))
-
- # now for a dry_run
- base_name = os.path.join(tmpdir2, 'archive')
- old_dir = os.getcwd()
- os.chdir(tmpdir)
- try:
- _make_tarball(base_name, 'dist', compress=None, dry_run=True)
- finally:
- os.chdir(old_dir)
- tarball = base_name + '.tar'
- self.assertTrue(os.path.exists(tarball))
-
- @unittest.skipUnless(zlib, "Requires zlib")
- @unittest.skipUnless(ZIP_SUPPORT, 'Need zip support to run')
- def test_make_zipfile(self) -> None:
- # creating something to tar
- tmpdir = self.mkdtemp()
- self.write_file([tmpdir, 'file1'], 'xxx')
- self.write_file([tmpdir, 'file2'], 'xxx')
-
- tmpdir2 = self.mkdtemp()
- # force shutil to create the directory
- os.rmdir(tmpdir2)
- base_name = os.path.join(tmpdir2, 'archive')
- _make_zipfile(base_name, tmpdir)
-
- # check if the compressed tarball was created
- tarball = base_name + '.zip'
- self.assertTrue(os.path.exists(tarball))
-
-
- def test_make_archive(self) -> None:
- tmpdir = self.mkdtemp()
- base_name = os.path.join(tmpdir, 'archive')
- self.assertRaises(ValueError, make_archive, base_name, 'xxx')
-
- @unittest.skipUnless(zlib, "Requires zlib")
- def test_make_archive_owner_group(self) -> None:
- # testing make_archive with owner and group, with various combinations
- # this works even if there's not gid/uid support
- if UID_GID_SUPPORT:
- group = grp.getgrgid(0).gr_name
- owner = pwd.getpwuid(0).pw_name
- else:
- group = owner = 'root'
-
- base_dir, root_dir, base_name = self._create_files()
- base_name = os.path.join(self.mkdtemp() , 'archive')
- res = make_archive(base_name, 'zip', root_dir, base_dir, owner=owner,
- group=group)
- self.assertTrue(os.path.exists(res))
-
- res = make_archive(base_name, 'zip', root_dir, base_dir)
- self.assertTrue(os.path.exists(res))
-
- res = make_archive(base_name, 'tar', root_dir, base_dir,
- owner=owner, group=group)
- self.assertTrue(os.path.exists(res))
-
- res = make_archive(base_name, 'tar', root_dir, base_dir,
- owner='kjhkjhkjg', group='oihohoh')
- self.assertTrue(os.path.exists(res))
-
-
- @unittest.skipUnless(zlib, "Requires zlib")
- @unittest.skipUnless(UID_GID_SUPPORT, "Requires grp and pwd support")
- def test_tarfile_root_owner(self) -> None:
- tmpdir, tmpdir2, base_name = self._create_files()
- old_dir = os.getcwd()
- os.chdir(tmpdir)
- group = grp.getgrgid(0).gr_name
- owner = pwd.getpwuid(0).pw_name
- try:
- archive_name = _make_tarball(base_name, 'dist', compress=None,
- owner=owner, group=group)
- finally:
- os.chdir(old_dir)
-
- # check if the compressed tarball was created
- self.assertTrue(os.path.exists(archive_name))
-
- # now checks the rights
- archive = tarfile.open(archive_name)
- try:
- for member in archive.getmembers():
- self.assertEqual(member.uid, 0)
- self.assertEqual(member.gid, 0)
- finally:
- archive.close()
-
- def test_make_archive_cwd(self) -> None:
- current_dir = os.getcwd()
- def _breaks(*args: Any, **kw: Any) -> None:
- raise RuntimeError()
-
- register_archive_format('xxx', _breaks, [], 'xxx file')
- try:
- try:
- make_archive('xxx', 'xxx', root_dir=self.mkdtemp())
- except Exception:
- pass
- self.assertEqual(os.getcwd(), current_dir)
- finally:
- unregister_archive_format('xxx')
-
- def test_register_archive_format(self) -> None:
-
- self.assertRaises(TypeError, register_archive_format, 'xxx', 1)
- self.assertRaises(TypeError, register_archive_format, 'xxx',
- lambda: 1/0,
- 1)
- self.assertRaises(TypeError, register_archive_format, 'xxx',
- lambda: 1/0,
- [(1, 2), (1, 2, 3)])
-
- register_archive_format('xxx', lambda: 1/0, [('x', 2)], 'xxx file')
- formats = [name for name, params in get_archive_formats()]
- self.assertIn('xxx', formats)
-
- unregister_archive_format('xxx')
- formats = [name for name, params in get_archive_formats()]
- self.assertNotIn('xxx', formats)
-
- def _compare_dirs(self, dir1: str, dir2: str) -> List[str]:
- # check that dir1 and dir2 are equivalent,
- # return the diff
- diff = [] # type: List[str]
- for root, dirs, files in os.walk(dir1):
- for file_ in files:
- path = os.path.join(root, file_)
- target_path = os.path.join(dir2, os.path.split(path)[-1])
- if not os.path.exists(target_path):
- diff.append(file_)
- return diff
-
- @unittest.skipUnless(zlib, "Requires zlib")
- def test_unpack_archive(self) -> None:
- formats = ['tar', 'gztar', 'zip']
- if BZ2_SUPPORTED:
- formats.append('bztar')
-
- for format in formats:
- tmpdir = self.mkdtemp()
- base_dir, root_dir, base_name = self._create_files()
- tmpdir2 = self.mkdtemp()
- filename = make_archive(base_name, format, root_dir, base_dir)
-
- # let's try to unpack it now
- unpack_archive(filename, tmpdir2)
- diff = self._compare_dirs(tmpdir, tmpdir2)
- self.assertEqual(diff, [])
-
- # and again, this time with the format specified
- tmpdir3 = self.mkdtemp()
- unpack_archive(filename, tmpdir3, format=format)
- diff = self._compare_dirs(tmpdir, tmpdir3)
- self.assertEqual(diff, [])
- self.assertRaises(shutil.ReadError, unpack_archive, TESTFN)
- self.assertRaises(ValueError, unpack_archive, TESTFN, format='xxx')
-
- def test_unpack_registery(self) -> None:
-
- formats = get_unpack_formats()
-
- def _boo(filename: str, extract_dir: str, extra: int) -> None:
- self.assertEqual(extra, 1)
- self.assertEqual(filename, 'stuff.boo')
- self.assertEqual(extract_dir, 'xx')
-
- register_unpack_format('Boo', ['.boo', '.b2'], _boo, [('extra', 1)])
- unpack_archive('stuff.boo', 'xx')
-
- # trying to register a .boo unpacker again
- self.assertRaises(RegistryError, register_unpack_format, 'Boo2',
- ['.boo'], _boo)
-
- # should work now
- unregister_unpack_format('Boo')
- register_unpack_format('Boo2', ['.boo'], _boo)
- self.assertIn(('Boo2', ['.boo'], ''), get_unpack_formats())
- self.assertNotIn(('Boo', ['.boo'], ''), get_unpack_formats())
-
- # let's leave a clean state
- unregister_unpack_format('Boo2')
- self.assertEqual(get_unpack_formats(), formats)
-
-
-class TestMove(unittest.TestCase):
-
- def setUp(self) -> None:
- filename = "foo"
- self.src_dir = tempfile.mkdtemp()
- self.dst_dir = tempfile.mkdtemp()
- self.src_file = os.path.join(self.src_dir, filename)
- self.dst_file = os.path.join(self.dst_dir, filename)
- with open(self.src_file, "wb") as f:
- f.write(b"spam")
-
- def tearDown(self) -> None:
- for d in (self.src_dir, self.dst_dir):
- try:
- if d:
- shutil.rmtree(d)
- except:
- pass
-
- def _check_move_file(self, src: str, dst: str, real_dst: str) -> None:
- with open(src, "rb") as f:
- contents = f.read()
- shutil.move(src, dst)
- with open(real_dst, "rb") as f:
- self.assertEqual(contents, f.read())
- self.assertFalse(os.path.exists(src))
-
- def _check_move_dir(self, src: str, dst: str, real_dst: str) -> None:
- contents = sorted(os.listdir(src))
- shutil.move(src, dst)
- self.assertEqual(contents, sorted(os.listdir(real_dst)))
- self.assertFalse(os.path.exists(src))
-
- def test_move_file(self) -> None:
- # Move a file to another location on the same filesystem.
- self._check_move_file(self.src_file, self.dst_file, self.dst_file)
-
- def test_move_file_to_dir(self) -> None:
- # Move a file inside an existing dir on the same filesystem.
- self._check_move_file(self.src_file, self.dst_dir, self.dst_file)
-
- @mock_rename
- def test_move_file_other_fs(self) -> None:
- # Move a file to an existing dir on another filesystem.
- self.test_move_file()
-
- @mock_rename
- def test_move_file_to_dir_other_fs(self) -> None:
- # Move a file to another location on another filesystem.
- self.test_move_file_to_dir()
-
- def test_move_dir(self) -> None:
- # Move a dir to another location on the same filesystem.
- dst_dir = tempfile.mktemp()
- try:
- self._check_move_dir(self.src_dir, dst_dir, dst_dir)
- finally:
- try:
- shutil.rmtree(dst_dir)
- except:
- pass
-
- @mock_rename
- def test_move_dir_other_fs(self) -> None:
- # Move a dir to another location on another filesystem.
- self.test_move_dir()
-
- def test_move_dir_to_dir(self) -> None:
- # Move a dir inside an existing dir on the same filesystem.
- self._check_move_dir(self.src_dir, self.dst_dir,
- os.path.join(self.dst_dir, os.path.basename(self.src_dir)))
-
- @mock_rename
- def test_move_dir_to_dir_other_fs(self) -> None:
- # Move a dir inside an existing dir on another filesystem.
- self.test_move_dir_to_dir()
-
- def test_existing_file_inside_dest_dir(self) -> None:
- # A file with the same name inside the destination dir already exists.
- with open(self.dst_file, "wb"):
- pass
- self.assertRaises(shutil.Error, shutil.move, self.src_file, self.dst_dir)
-
- def test_dont_move_dir_in_itself(self) -> None:
- # Moving a dir inside itself raises an Error.
- dst = os.path.join(self.src_dir, "bar")
- self.assertRaises(shutil.Error, shutil.move, self.src_dir, dst)
-
- def test_destinsrc_false_negative(self) -> None:
- os.mkdir(TESTFN)
- try:
- for src, dst in [('srcdir', 'srcdir/dest')]:
- src = os.path.join(TESTFN, src)
- dst = os.path.join(TESTFN, dst)
- self.assertTrue(shutil._destinsrc(src, dst),
- msg='_destinsrc() wrongly concluded that '
- 'dst (%s) is not in src (%s)' % (dst, src))
- finally:
- shutil.rmtree(TESTFN, ignore_errors=True)
-
- def test_destinsrc_false_positive(self) -> None:
- os.mkdir(TESTFN)
- try:
- for src, dst in [('srcdir', 'src/dest'), ('srcdir', 'srcdir.new')]:
- src = os.path.join(TESTFN, src)
- dst = os.path.join(TESTFN, dst)
- self.assertFalse(shutil._destinsrc(src, dst),
- msg='_destinsrc() wrongly concluded that '
- 'dst (%s) is in src (%s)' % (dst, src))
- finally:
- shutil.rmtree(TESTFN, ignore_errors=True)
-
-
-class TestCopyFile(unittest.TestCase):
-
- _delete = False
-
- class Faux(object):
- _entered = False
- _exited_with = None # type: tuple
- _raised = False
- def __init__(self, raise_in_exit: bool = False,
- suppress_at_exit: bool = True) -> None:
- self._raise_in_exit = raise_in_exit
- self._suppress_at_exit = suppress_at_exit
- def read(self, *args: Any) -> str:
- return ''
- def __enter__(self) -> None:
- self._entered = True
- def __exit__(self, exc_type: type, exc_val: BaseException,
- exc_tb: TracebackType) -> bool:
- self._exited_with = exc_type, exc_val, exc_tb
- if self._raise_in_exit:
- self._raised = True
- raise IOError("Cannot close")
- return self._suppress_at_exit
-
- def tearDown(self) -> None:
- shutil.open = open
-
- def _set_shutil_open(self, func: Any) -> None:
- shutil.open = func
- self._delete = True
-
- def test_w_source_open_fails(self) -> None:
- def _open(filename: str, mode: str= 'r') -> BinaryIO:
- if filename == 'srcfile':
- raise IOError('Cannot open "srcfile"')
- assert 0 # shouldn't reach here.
-
- self._set_shutil_open(_open)
-
- self.assertRaises(IOError, shutil.copyfile, 'srcfile', 'destfile')
-
- def test_w_dest_open_fails(self) -> None:
-
- srcfile = TestCopyFile.Faux()
-
- def _open(filename: str, mode: str = 'r') -> TestCopyFile.Faux:
- if filename == 'srcfile':
- return srcfile
- if filename == 'destfile':
- raise IOError('Cannot open "destfile"')
- assert 0 # shouldn't reach here.
-
- self._set_shutil_open(_open)
-
- shutil.copyfile('srcfile', 'destfile')
- self.assertTrue(srcfile._entered)
- self.assertTrue(srcfile._exited_with[0] is IOError)
- self.assertEqual(srcfile._exited_with[1].args,
- ('Cannot open "destfile"',))
-
- def test_w_dest_close_fails(self) -> None:
-
- srcfile = TestCopyFile.Faux()
- destfile = TestCopyFile.Faux(True)
-
- def _open(filename: str, mode: str = 'r') -> TestCopyFile.Faux:
- if filename == 'srcfile':
- return srcfile
- if filename == 'destfile':
- return destfile
- assert 0 # shouldn't reach here.
-
- self._set_shutil_open(_open)
-
- shutil.copyfile('srcfile', 'destfile')
- self.assertTrue(srcfile._entered)
- self.assertTrue(destfile._entered)
- self.assertTrue(destfile._raised)
- self.assertTrue(srcfile._exited_with[0] is IOError)
- self.assertEqual(srcfile._exited_with[1].args,
- ('Cannot close',))
-
- def test_w_source_close_fails(self) -> None:
-
- srcfile = TestCopyFile.Faux(True)
- destfile = TestCopyFile.Faux()
-
- def _open(filename: str, mode: str= 'r') -> TestCopyFile.Faux:
- if filename == 'srcfile':
- return srcfile
- if filename == 'destfile':
- return destfile
- assert 0 # shouldn't reach here.
-
- self._set_shutil_open(_open)
-
- self.assertRaises(IOError,
- shutil.copyfile, 'srcfile', 'destfile')
- self.assertTrue(srcfile._entered)
- self.assertTrue(destfile._entered)
- self.assertFalse(destfile._raised)
- self.assertTrue(srcfile._exited_with[0] is None)
- self.assertTrue(srcfile._raised)
-
- def test_move_dir_caseinsensitive(self) -> None:
- # Renames a folder to the same name
- # but a different case.
-
- self.src_dir = tempfile.mkdtemp()
- dst_dir = os.path.join(
- os.path.dirname(self.src_dir),
- os.path.basename(self.src_dir).upper())
- self.assertNotEqual(self.src_dir, dst_dir)
-
- try:
- shutil.move(self.src_dir, dst_dir)
- self.assertTrue(os.path.isdir(dst_dir))
- finally:
- if os.path.exists(dst_dir):
- os.rmdir(dst_dir)
-
-
-
-def test_main() -> None:
- support.run_unittest(TestShutil, TestMove, TestCopyFile)
-
-if __name__ == '__main__':
- test_main()
diff --git a/test-data/stdlib-samples/3.2/test/test_subprocess.py b/test-data/stdlib-samples/3.2/test/test_subprocess.py
deleted file mode 100644
index 772d8cc..0000000
--- a/test-data/stdlib-samples/3.2/test/test_subprocess.py
+++ /dev/null
@@ -1,1764 +0,0 @@
-import unittest
-from test import support
-import subprocess
-import sys
-import signal
-import io
-import os
-import errno
-import tempfile
-import time
-import re
-import sysconfig
-import warnings
-import select
-import shutil
-import gc
-
-import resource
-
-from typing import Any, Dict, Callable, Iterable, List, Set, Tuple, cast
-
-mswindows = (sys.platform == "win32")
-
-#
-# Depends on the following external programs: Python
-#
-
-if mswindows:
- SETBINARY = ('import msvcrt; msvcrt.setmode(sys.stdout.fileno(), '
- 'os.O_BINARY);')
-else:
- SETBINARY = ''
-
-
-try:
- mkstemp = tempfile.mkstemp
-except AttributeError:
- # tempfile.mkstemp is not available
- def _mkstemp() -> Tuple[int, str]:
- """Replacement for mkstemp, calling mktemp."""
- fname = tempfile.mktemp()
- return os.open(fname, os.O_RDWR|os.O_CREAT), fname
- mkstemp = cast(Any, _mkstemp)
-
-
-class BaseTestCase(unittest.TestCase):
- def setUp(self) -> None:
- # Try to minimize the number of children we have so this test
- # doesn't crash on some buildbots (Alphas in particular).
- support.reap_children()
-
- def tearDown(self) -> None:
- for inst in subprocess._active:
- inst.wait()
- subprocess._cleanup()
- self.assertFalse(subprocess._active, "subprocess._active not empty")
-
- def assertStderrEqual(self, stderr: bytes, expected: bytes,
- msg: object = None) -> None:
- # In a debug build, stuff like "[6580 refs]" is printed to stderr at
- # shutdown time. That frustrates tests trying to check stderr produced
- # from a spawned Python process.
- actual = support.strip_python_stderr(stderr)
- self.assertEqual(actual, expected, msg)
-
-
-class ProcessTestCase(BaseTestCase):
-
- def test_call_seq(self) -> None:
- # call() function with sequence argument
- rc = subprocess.call([sys.executable, "-c",
- "import sys; sys.exit(47)"])
- self.assertEqual(rc, 47)
-
- def test_check_call_zero(self) -> None:
- # check_call() function with zero return code
- rc = subprocess.check_call([sys.executable, "-c",
- "import sys; sys.exit(0)"])
- self.assertEqual(rc, 0)
-
- def test_check_call_nonzero(self) -> None:
- # check_call() function with non-zero return code
- with self.assertRaises(subprocess.CalledProcessError) as c:
- subprocess.check_call([sys.executable, "-c",
- "import sys; sys.exit(47)"])
- self.assertEqual(c.exception.returncode, 47)
-
- def test_check_output(self) -> None:
- # check_output() function with zero return code
- output = subprocess.check_output(
- [sys.executable, "-c", "print('BDFL')"])
- self.assertIn(b'BDFL', cast(Any, output)) # see #39
-
- def test_check_output_nonzero(self) -> None:
- # check_call() function with non-zero return code
- with self.assertRaises(subprocess.CalledProcessError) as c:
- subprocess.check_output(
- [sys.executable, "-c", "import sys; sys.exit(5)"])
- self.assertEqual(c.exception.returncode, 5)
-
- def test_check_output_stderr(self) -> None:
- # check_output() function stderr redirected to stdout
- output = subprocess.check_output(
- [sys.executable, "-c", "import sys; sys.stderr.write('BDFL')"],
- stderr=subprocess.STDOUT)
- self.assertIn(b'BDFL', cast(Any, output)) # see #39
-
- def test_check_output_stdout_arg(self) -> None:
- # check_output() function stderr redirected to stdout
- with self.assertRaises(ValueError) as c:
- output = subprocess.check_output(
- [sys.executable, "-c", "print('will not be run')"],
- stdout=sys.stdout)
- self.fail("Expected ValueError when stdout arg supplied.")
- self.assertIn('stdout', c.exception.args[0])
-
- def test_call_kwargs(self) -> None:
- # call() function with keyword args
- newenv = os.environ.copy()
- newenv["FRUIT"] = "banana"
- rc = subprocess.call([sys.executable, "-c",
- 'import sys, os;'
- 'sys.exit(os.getenv("FRUIT")=="banana")'],
- env=newenv)
- self.assertEqual(rc, 1)
-
- def test_invalid_args(self) -> None:
- # Popen() called with invalid arguments should raise TypeError
- # but Popen.__del__ should not complain (issue #12085)
- with support.captured_stderr() as s:
- self.assertRaises(TypeError, subprocess.Popen, invalid_arg_name=1)
- argcount = subprocess.Popen.__init__.__code__.co_argcount
- too_many_args = [0] * (argcount + 1)
- self.assertRaises(TypeError, subprocess.Popen, *too_many_args)
- self.assertEqual(s.getvalue(), '')
-
- def test_stdin_none(self) -> None:
- # .stdin is None when not redirected
- p = subprocess.Popen([sys.executable, "-c", 'print("banana")'],
- stdout=subprocess.PIPE, stderr=subprocess.PIPE)
- self.addCleanup(p.stdout.close)
- self.addCleanup(p.stderr.close)
- p.wait()
- self.assertEqual(p.stdin, None)
-
- def test_stdout_none(self) -> None:
- # .stdout is None when not redirected
- p = subprocess.Popen([sys.executable, "-c",
- 'print(" this bit of output is from a '
- 'test of stdout in a different '
- 'process ...")'],
- stdin=subprocess.PIPE, stderr=subprocess.PIPE)
- self.addCleanup(p.stdin.close)
- self.addCleanup(p.stderr.close)
- p.wait()
- self.assertEqual(p.stdout, None)
-
- def test_stderr_none(self) -> None:
- # .stderr is None when not redirected
- p = subprocess.Popen([sys.executable, "-c", 'print("banana")'],
- stdin=subprocess.PIPE, stdout=subprocess.PIPE)
- self.addCleanup(p.stdout.close)
- self.addCleanup(p.stdin.close)
- p.wait()
- self.assertEqual(p.stderr, None)
-
- def test_executable_with_cwd(self) -> None:
- python_dir = os.path.dirname(os.path.realpath(sys.executable))
- p = subprocess.Popen(["somethingyoudonthave", "-c",
- "import sys; sys.exit(47)"],
- executable=sys.executable, cwd=python_dir)
- p.wait()
- self.assertEqual(p.returncode, 47)
-
- @unittest.skipIf(sysconfig.is_python_build(),
- "need an installed Python. See #7774")
- def test_executable_without_cwd(self) -> None:
- # For a normal installation, it should work without 'cwd'
- # argument. For test runs in the build directory, see #7774.
- p = subprocess.Popen(["somethingyoudonthave", "-c",
- "import sys; sys.exit(47)"],
- executable=sys.executable)
- p.wait()
- self.assertEqual(p.returncode, 47)
-
- def test_stdin_pipe(self) -> None:
- # stdin redirection
- p = subprocess.Popen([sys.executable, "-c",
- 'import sys; sys.exit(sys.stdin.read() == "pear")'],
- stdin=subprocess.PIPE)
- p.stdin.write(b"pear")
- p.stdin.close()
- p.wait()
- self.assertEqual(p.returncode, 1)
-
- def test_stdin_filedes(self) -> None:
- # stdin is set to open file descriptor
- tf = tempfile.TemporaryFile()
- self.addCleanup(tf.close)
- d = tf.fileno()
- os.write(d, b"pear")
- os.lseek(d, 0, 0)
- p = subprocess.Popen([sys.executable, "-c",
- 'import sys; sys.exit(sys.stdin.read() == "pear")'],
- stdin=d)
- p.wait()
- self.assertEqual(p.returncode, 1)
-
- def test_stdin_fileobj(self) -> None:
- # stdin is set to open file object
- tf = tempfile.TemporaryFile()
- self.addCleanup(tf.close)
- tf.write(b"pear")
- tf.seek(0)
- p = subprocess.Popen([sys.executable, "-c",
- 'import sys; sys.exit(sys.stdin.read() == "pear")'],
- stdin=tf)
- p.wait()
- self.assertEqual(p.returncode, 1)
-
- def test_stdout_pipe(self) -> None:
- # stdout redirection
- p = subprocess.Popen([sys.executable, "-c",
- 'import sys; sys.stdout.write("orange")'],
- stdout=subprocess.PIPE)
- self.addCleanup(p.stdout.close)
- self.assertEqual(p.stdout.read(), b"orange")
-
- def test_stdout_filedes(self) -> None:
- # stdout is set to open file descriptor
- tf = tempfile.TemporaryFile()
- self.addCleanup(tf.close)
- d = tf.fileno()
- p = subprocess.Popen([sys.executable, "-c",
- 'import sys; sys.stdout.write("orange")'],
- stdout=d)
- p.wait()
- os.lseek(d, 0, 0)
- self.assertEqual(os.read(d, 1024), b"orange")
-
- def test_stdout_fileobj(self) -> None:
- # stdout is set to open file object
- tf = tempfile.TemporaryFile()
- self.addCleanup(tf.close)
- p = subprocess.Popen([sys.executable, "-c",
- 'import sys; sys.stdout.write("orange")'],
- stdout=tf)
- p.wait()
- tf.seek(0)
- self.assertEqual(tf.read(), b"orange")
-
- def test_stderr_pipe(self) -> None:
- # stderr redirection
- p = subprocess.Popen([sys.executable, "-c",
- 'import sys; sys.stderr.write("strawberry")'],
- stderr=subprocess.PIPE)
- self.addCleanup(p.stderr.close)
- self.assertStderrEqual(p.stderr.read(), b"strawberry")
-
- def test_stderr_filedes(self) -> None:
- # stderr is set to open file descriptor
- tf = tempfile.TemporaryFile()
- self.addCleanup(tf.close)
- d = tf.fileno()
- p = subprocess.Popen([sys.executable, "-c",
- 'import sys; sys.stderr.write("strawberry")'],
- stderr=d)
- p.wait()
- os.lseek(d, 0, 0)
- self.assertStderrEqual(os.read(d, 1024), b"strawberry")
-
- def test_stderr_fileobj(self) -> None:
- # stderr is set to open file object
- tf = tempfile.TemporaryFile()
- self.addCleanup(tf.close)
- p = subprocess.Popen([sys.executable, "-c",
- 'import sys; sys.stderr.write("strawberry")'],
- stderr=tf)
- p.wait()
- tf.seek(0)
- self.assertStderrEqual(tf.read(), b"strawberry")
-
- def test_stdout_stderr_pipe(self) -> None:
- # capture stdout and stderr to the same pipe
- p = subprocess.Popen([sys.executable, "-c",
- 'import sys;'
- 'sys.stdout.write("apple");'
- 'sys.stdout.flush();'
- 'sys.stderr.write("orange")'],
- stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT)
- self.addCleanup(p.stdout.close)
- self.assertStderrEqual(p.stdout.read(), b"appleorange")
-
- def test_stdout_stderr_file(self) -> None:
- # capture stdout and stderr to the same open file
- tf = tempfile.TemporaryFile()
- self.addCleanup(tf.close)
- p = subprocess.Popen([sys.executable, "-c",
- 'import sys;'
- 'sys.stdout.write("apple");'
- 'sys.stdout.flush();'
- 'sys.stderr.write("orange")'],
- stdout=tf,
- stderr=tf)
- p.wait()
- tf.seek(0)
- self.assertStderrEqual(tf.read(), b"appleorange")
-
- def test_stdout_filedes_of_stdout(self) -> None:
- # stdout is set to 1 (#1531862).
- cmd = r"import sys, os; sys.exit(os.write(sys.stdout.fileno(), b'.\n'))"
- rc = subprocess.call([sys.executable, "-c", cmd], stdout=1)
- self.assertEqual(rc, 2)
-
- def test_cwd(self) -> None:
- tmpdir = tempfile.gettempdir()
- # We cannot use os.path.realpath to canonicalize the path,
- # since it doesn't expand Tru64 {memb} strings. See bug 1063571.
- cwd = os.getcwd()
- os.chdir(tmpdir)
- tmpdir = os.getcwd()
- os.chdir(cwd)
- p = subprocess.Popen([sys.executable, "-c",
- 'import sys,os;'
- 'sys.stdout.write(os.getcwd())'],
- stdout=subprocess.PIPE,
- cwd=tmpdir)
- self.addCleanup(p.stdout.close)
- normcase = os.path.normcase
- self.assertEqual(normcase(p.stdout.read().decode("utf-8")),
- normcase(tmpdir))
-
- def test_env(self) -> None:
- newenv = os.environ.copy()
- newenv["FRUIT"] = "orange"
- with subprocess.Popen([sys.executable, "-c",
- 'import sys,os;'
- 'sys.stdout.write(os.getenv("FRUIT"))'],
- stdout=subprocess.PIPE,
- env=newenv) as p:
- stdout, stderr = p.communicate()
- self.assertEqual(stdout, b"orange")
-
- # Windows requires at least the SYSTEMROOT environment variable to start
- # Python
- @unittest.skipIf(sys.platform == 'win32',
- 'cannot test an empty env on Windows')
- @unittest.skipIf(sysconfig.get_config_var('Py_ENABLE_SHARED') is not None,
- 'the python library cannot be loaded '
- 'with an empty environment')
- def test_empty_env(self) -> None:
- with subprocess.Popen([sys.executable, "-c",
- 'import os; '
- 'print(list(os.environ.keys()))'],
- stdout=subprocess.PIPE,
- env={}) as p:
- stdout, stderr = p.communicate()
- self.assertIn(stdout.strip(),
- [b"[]",
- # Mac OS X adds __CF_USER_TEXT_ENCODING variable to an empty
- # environment
- b"['__CF_USER_TEXT_ENCODING']"])
-
- def test_communicate_stdin(self) -> None:
- p = subprocess.Popen([sys.executable, "-c",
- 'import sys;'
- 'sys.exit(sys.stdin.read() == "pear")'],
- stdin=subprocess.PIPE)
- p.communicate(b"pear")
- self.assertEqual(p.returncode, 1)
-
- def test_communicate_stdout(self) -> None:
- p = subprocess.Popen([sys.executable, "-c",
- 'import sys; sys.stdout.write("pineapple")'],
- stdout=subprocess.PIPE)
- (stdout, stderr) = p.communicate()
- self.assertEqual(stdout, b"pineapple")
- self.assertEqual(stderr, None)
-
- def test_communicate_stderr(self) -> None:
- p = subprocess.Popen([sys.executable, "-c",
- 'import sys; sys.stderr.write("pineapple")'],
- stderr=subprocess.PIPE)
- (stdout, stderr) = p.communicate()
- self.assertEqual(stdout, None)
- self.assertStderrEqual(stderr, b"pineapple")
-
- def test_communicate(self) -> None:
- p = subprocess.Popen([sys.executable, "-c",
- 'import sys,os;'
- 'sys.stderr.write("pineapple");'
- 'sys.stdout.write(sys.stdin.read())'],
- stdin=subprocess.PIPE,
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE)
- self.addCleanup(p.stdout.close)
- self.addCleanup(p.stderr.close)
- self.addCleanup(p.stdin.close)
- (stdout, stderr) = p.communicate(b"banana")
- self.assertEqual(stdout, b"banana")
- self.assertStderrEqual(stderr, b"pineapple")
-
- # Test for the fd leak reported in http://bugs.python.org/issue2791.
- def test_communicate_pipe_fd_leak(self) -> None:
- for stdin_pipe in (False, True):
- for stdout_pipe in (False, True):
- for stderr_pipe in (False, True):
- options = {} # type: Dict[str, Any]
- if stdin_pipe:
- options['stdin'] = subprocess.PIPE
- if stdout_pipe:
- options['stdout'] = subprocess.PIPE
- if stderr_pipe:
- options['stderr'] = subprocess.PIPE
- if not options:
- continue
- p = subprocess.Popen([sys.executable, "-c", "pass"], **options)
- p.communicate()
- if p.stdin is not None:
- self.assertTrue(p.stdin.closed)
- if p.stdout is not None:
- self.assertTrue(p.stdout.closed)
- if p.stderr is not None:
- self.assertTrue(p.stderr.closed)
-
- def test_communicate_returns(self) -> None:
- # communicate() should return None if no redirection is active
- p = subprocess.Popen([sys.executable, "-c",
- "import sys; sys.exit(47)"])
- (stdout, stderr) = p.communicate()
- self.assertEqual(stdout, None)
- self.assertEqual(stderr, None)
-
- def test_communicate_pipe_buf(self) -> None:
- # communicate() with writes larger than pipe_buf
- # This test will probably deadlock rather than fail, if
- # communicate() does not work properly.
- x, y = os.pipe()
- if mswindows:
- pipe_buf = 512
- else:
- pipe_buf = os.fpathconf(x, "PC_PIPE_BUF")
- os.close(x)
- os.close(y)
- p = subprocess.Popen([sys.executable, "-c",
- 'import sys,os;'
- 'sys.stdout.write(sys.stdin.read(47));'
- 'sys.stderr.write("xyz"*%d);'
- 'sys.stdout.write(sys.stdin.read())' % pipe_buf],
- stdin=subprocess.PIPE,
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE)
- self.addCleanup(p.stdout.close)
- self.addCleanup(p.stderr.close)
- self.addCleanup(p.stdin.close)
- string_to_write = b"abc"*pipe_buf
- (stdout, stderr) = p.communicate(string_to_write)
- self.assertEqual(stdout, string_to_write)
-
- def test_writes_before_communicate(self) -> None:
- # stdin.write before communicate()
- p = subprocess.Popen([sys.executable, "-c",
- 'import sys,os;'
- 'sys.stdout.write(sys.stdin.read())'],
- stdin=subprocess.PIPE,
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE)
- self.addCleanup(p.stdout.close)
- self.addCleanup(p.stderr.close)
- self.addCleanup(p.stdin.close)
- p.stdin.write(b"banana")
- (stdout, stderr) = p.communicate(b"split")
- self.assertEqual(stdout, b"bananasplit")
- self.assertStderrEqual(stderr, b"")
-
- def test_universal_newlines(self) -> None:
- p = subprocess.Popen([sys.executable, "-c",
- 'import sys,os;' + SETBINARY +
- 'sys.stdout.write(sys.stdin.readline());'
- 'sys.stdout.flush();'
- 'sys.stdout.write("line2\\n");'
- 'sys.stdout.flush();'
- 'sys.stdout.write(sys.stdin.read());'
- 'sys.stdout.flush();'
- 'sys.stdout.write("line4\\n");'
- 'sys.stdout.flush();'
- 'sys.stdout.write("line5\\r\\n");'
- 'sys.stdout.flush();'
- 'sys.stdout.write("line6\\r");'
- 'sys.stdout.flush();'
- 'sys.stdout.write("\\nline7");'
- 'sys.stdout.flush();'
- 'sys.stdout.write("\\nline8");'],
- stdin=subprocess.PIPE,
- stdout=subprocess.PIPE,
- universal_newlines=1)
- p.stdin.write("line1\n")
- self.assertEqual(p.stdout.readline(), "line1\n")
- p.stdin.write("line3\n")
- p.stdin.close()
- self.addCleanup(p.stdout.close)
- self.assertEqual(p.stdout.readline(),
- "line2\n")
- self.assertEqual(p.stdout.read(6),
- "line3\n")
- self.assertEqual(p.stdout.read(),
- "line4\nline5\nline6\nline7\nline8")
-
- def test_universal_newlines_communicate(self) -> None:
- # universal newlines through communicate()
- p = subprocess.Popen([sys.executable, "-c",
- 'import sys,os;' + SETBINARY +
- 'sys.stdout.write("line2\\n");'
- 'sys.stdout.flush();'
- 'sys.stdout.write("line4\\n");'
- 'sys.stdout.flush();'
- 'sys.stdout.write("line5\\r\\n");'
- 'sys.stdout.flush();'
- 'sys.stdout.write("line6\\r");'
- 'sys.stdout.flush();'
- 'sys.stdout.write("\\nline7");'
- 'sys.stdout.flush();'
- 'sys.stdout.write("\\nline8");'],
- stderr=subprocess.PIPE,
- stdout=subprocess.PIPE,
- universal_newlines=1)
- self.addCleanup(p.stdout.close)
- self.addCleanup(p.stderr.close)
- # BUG: can't give a non-empty stdin because it breaks both the
- # select- and poll-based communicate() implementations.
- (stdout, stderr) = p.communicate()
- self.assertEqual(stdout,
- "line2\nline4\nline5\nline6\nline7\nline8")
-
- def test_universal_newlines_communicate_stdin(self) -> None:
- # universal newlines through communicate(), with only stdin
- p = subprocess.Popen([sys.executable, "-c",
- 'import sys,os;' + SETBINARY + '''\nif True:
- s = sys.stdin.readline()
- assert s == "line1\\n", repr(s)
- s = sys.stdin.read()
- assert s == "line3\\n", repr(s)
- '''],
- stdin=subprocess.PIPE,
- universal_newlines=1)
- (stdout, stderr) = p.communicate("line1\nline3\n")
- self.assertEqual(p.returncode, 0)
-
- def test_no_leaking(self) -> None:
- # Make sure we leak no resources
- if not mswindows:
- max_handles = 1026 # too much for most UNIX systems
- else:
- max_handles = 2050 # too much for (at least some) Windows setups
- handles = [] # type: List[int]
- tmpdir = tempfile.mkdtemp()
- try:
- for i in range(max_handles):
- try:
- tmpfile = os.path.join(tmpdir, support.TESTFN)
- handles.append(os.open(tmpfile, os.O_WRONLY|os.O_CREAT))
- except OSError as e:
- if e.errno != errno.EMFILE:
- raise
- break
- else:
- self.skipTest("failed to reach the file descriptor limit "
- "(tried %d)" % max_handles)
- # Close a couple of them (should be enough for a subprocess)
- for i in range(10):
- os.close(handles.pop())
- # Loop creating some subprocesses. If one of them leaks some fds,
- # the next loop iteration will fail by reaching the max fd limit.
- for i in range(15):
- p = subprocess.Popen([sys.executable, "-c",
- "import sys;"
- "sys.stdout.write(sys.stdin.read())"],
- stdin=subprocess.PIPE,
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE)
- data = p.communicate(b"lime")[0]
- self.assertEqual(data, b"lime")
- finally:
- for h in handles:
- os.close(h)
- shutil.rmtree(tmpdir)
-
- def test_list2cmdline(self) -> None:
- self.assertEqual(subprocess.list2cmdline(['a b c', 'd', 'e']),
- '"a b c" d e')
- self.assertEqual(subprocess.list2cmdline(['ab"c', '\\', 'd']),
- 'ab\\"c \\ d')
- self.assertEqual(subprocess.list2cmdline(['ab"c', ' \\', 'd']),
- 'ab\\"c " \\\\" d')
- self.assertEqual(subprocess.list2cmdline(['a\\\\\\b', 'de fg', 'h']),
- 'a\\\\\\b "de fg" h')
- self.assertEqual(subprocess.list2cmdline(['a\\"b', 'c', 'd']),
- 'a\\\\\\"b c d')
- self.assertEqual(subprocess.list2cmdline(['a\\\\b c', 'd', 'e']),
- '"a\\\\b c" d e')
- self.assertEqual(subprocess.list2cmdline(['a\\\\b\\ c', 'd', 'e']),
- '"a\\\\b\\ c" d e')
- self.assertEqual(subprocess.list2cmdline(['ab', '']),
- 'ab ""')
-
-
- def test_poll(self) -> None:
- p = subprocess.Popen([sys.executable,
- "-c", "import time; time.sleep(1)"])
- count = 0
- while p.poll() is None:
- time.sleep(0.1)
- count += 1
- # We expect that the poll loop probably went around about 10 times,
- # but, based on system scheduling we can't control, it's possible
- # poll() never returned None. It "should be" very rare that it
- # didn't go around at least twice.
- self.assertGreaterEqual(count, 2)
- # Subsequent invocations should just return the returncode
- self.assertEqual(p.poll(), 0)
-
-
- def test_wait(self) -> None:
- p = subprocess.Popen([sys.executable,
- "-c", "import time; time.sleep(2)"])
- self.assertEqual(p.wait(), 0)
- # Subsequent invocations should just return the returncode
- self.assertEqual(p.wait(), 0)
-
-
- def test_invalid_bufsize(self) -> None:
- # an invalid type of the bufsize argument should raise
- # TypeError.
- with self.assertRaises(TypeError):
- subprocess.Popen([sys.executable, "-c", "pass"], cast(Any, "orange"))
-
- def test_bufsize_is_none(self) -> None:
- # bufsize=None should be the same as bufsize=0.
- p = subprocess.Popen([sys.executable, "-c", "pass"], None)
- self.assertEqual(p.wait(), 0)
- # Again with keyword arg
- p = subprocess.Popen([sys.executable, "-c", "pass"], bufsize=None)
- self.assertEqual(p.wait(), 0)
-
- def test_leaking_fds_on_error(self) -> None:
- # see bug #5179: Popen leaks file descriptors to PIPEs if
- # the child fails to execute; this will eventually exhaust
- # the maximum number of open fds. 1024 seems a very common
- # value for that limit, but Windows has 2048, so we loop
- # 1024 times (each call leaked two fds).
- for i in range(1024):
- # Windows raises IOError. Others raise OSError.
- with self.assertRaises(EnvironmentError) as c:
- subprocess.Popen(['nonexisting_i_hope'],
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE)
- # ignore errors that indicate the command was not found
- if c.exception.errno not in (errno.ENOENT, errno.EACCES):
- raise c.exception
-
- def test_issue8780(self) -> None:
- # Ensure that stdout is inherited from the parent
- # if stdout=PIPE is not used
- code = ';'.join([
- 'import subprocess, sys',
- 'retcode = subprocess.call('
- "[sys.executable, '-c', 'print(\"Hello World!\")'])",
- 'assert retcode == 0'])
- output = subprocess.check_output([sys.executable, '-c', code])
- self.assertTrue(output.startswith(b'Hello World!'), ascii(output))
-
- def test_handles_closed_on_exception(self) -> None:
- # If CreateProcess exits with an error, ensure the
- # duplicate output handles are released
- ifhandle, ifname = mkstemp()
- ofhandle, ofname = mkstemp()
- efhandle, efname = mkstemp()
- try:
- subprocess.Popen (["*"], stdin=ifhandle, stdout=ofhandle,
- stderr=efhandle)
- except OSError:
- os.close(ifhandle)
- os.remove(ifname)
- os.close(ofhandle)
- os.remove(ofname)
- os.close(efhandle)
- os.remove(efname)
- self.assertFalse(os.path.exists(ifname))
- self.assertFalse(os.path.exists(ofname))
- self.assertFalse(os.path.exists(efname))
-
- def test_communicate_epipe(self) -> None:
- # Issue 10963: communicate() should hide EPIPE
- p = subprocess.Popen([sys.executable, "-c", 'pass'],
- stdin=subprocess.PIPE,
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE)
- self.addCleanup(p.stdout.close)
- self.addCleanup(p.stderr.close)
- self.addCleanup(p.stdin.close)
- p.communicate(b"x" * 2**20)
-
- def test_communicate_epipe_only_stdin(self) -> None:
- # Issue 10963: communicate() should hide EPIPE
- p = subprocess.Popen([sys.executable, "-c", 'pass'],
- stdin=subprocess.PIPE)
- self.addCleanup(p.stdin.close)
- time.sleep(2)
- p.communicate(b"x" * 2**20)
-
- @unittest.skipUnless(hasattr(signal, 'SIGALRM'),
- "Requires signal.SIGALRM")
- def test_communicate_eintr(self) -> None:
- # Issue #12493: communicate() should handle EINTR
- def handler(signum, frame):
- pass
- old_handler = signal.signal(signal.SIGALRM, handler)
- self.addCleanup(signal.signal, signal.SIGALRM, old_handler)
-
- # the process is running for 2 seconds
- args = [sys.executable, "-c", 'import time; time.sleep(2)']
- for stream in ('stdout', 'stderr'):
- kw = {stream: subprocess.PIPE} # type: Dict[str, Any]
- with subprocess.Popen(args, **kw) as process:
- signal.alarm(1)
- # communicate() will be interrupted by SIGALRM
- process.communicate()
-
-
-# context manager
-class _SuppressCoreFiles(object):
- """Try to prevent core files from being created."""
- old_limit = None # type: Tuple[int, int]
-
- def __enter__(self) -> None:
- """Try to save previous ulimit, then set it to (0, 0)."""
- if resource is not None:
- try:
- self.old_limit = resource.getrlimit(resource.RLIMIT_CORE)
- resource.setrlimit(resource.RLIMIT_CORE, (0, 0))
- except (ValueError, resource.error):
- pass
-
- if sys.platform == 'darwin':
- # Check if the 'Crash Reporter' on OSX was configured
- # in 'Developer' mode and warn that it will get triggered
- # when it is.
- #
- # This assumes that this context manager is used in tests
- # that might trigger the next manager.
- value = subprocess.Popen(['/usr/bin/defaults', 'read',
- 'com.apple.CrashReporter', 'DialogType'],
- stdout=subprocess.PIPE).communicate()[0]
- if value.strip() == b'developer':
- print("this tests triggers the Crash Reporter, "
- "that is intentional", end='')
- sys.stdout.flush()
-
- def __exit__(self, *args: Any) -> None:
- """Return core file behavior to default."""
- if self.old_limit is None:
- return
- if resource is not None:
- try:
- resource.setrlimit(resource.RLIMIT_CORE, self.old_limit)
- except (ValueError, resource.error):
- pass
-
-
- at unittest.skipIf(mswindows, "POSIX specific tests")
-class POSIXProcessTestCase(BaseTestCase):
-
- def test_exceptions(self) -> None:
- nonexistent_dir = "/_this/pa.th/does/not/exist"
- try:
- os.chdir(nonexistent_dir)
- except OSError as e:
- # This avoids hard coding the errno value or the OS perror()
- # string and instead capture the exception that we want to see
- # below for comparison.
- desired_exception = e
- desired_exception.strerror += ': ' + repr(sys.executable)
- else:
- self.fail("chdir to nonexistant directory %s succeeded." %
- nonexistent_dir)
-
- # Error in the child re-raised in the parent.
- try:
- p = subprocess.Popen([sys.executable, "-c", ""],
- cwd=nonexistent_dir)
- except OSError as e:
- # Test that the child process chdir failure actually makes
- # it up to the parent process as the correct exception.
- self.assertEqual(desired_exception.errno, e.errno)
- self.assertEqual(desired_exception.strerror, e.strerror)
- else:
- self.fail("Expected OSError: %s" % desired_exception)
-
- def test_restore_signals(self) -> None:
- # Code coverage for both values of restore_signals to make sure it
- # at least does not blow up.
- # A test for behavior would be complex. Contributions welcome.
- subprocess.call([sys.executable, "-c", ""], restore_signals=True)
- subprocess.call([sys.executable, "-c", ""], restore_signals=False)
-
- def test_start_new_session(self) -> None:
- # For code coverage of calling setsid(). We don't care if we get an
- # EPERM error from it depending on the test execution environment, that
- # still indicates that it was called.
- try:
- output = subprocess.check_output(
- [sys.executable, "-c",
- "import os; print(os.getpgid(os.getpid()))"],
- start_new_session=True)
- except OSError as e:
- if e.errno != errno.EPERM:
- raise
- else:
- parent_pgid = os.getpgid(os.getpid())
- child_pgid = int(output)
- self.assertNotEqual(parent_pgid, child_pgid)
-
- def test_run_abort(self) -> None:
- # returncode handles signal termination
- with _SuppressCoreFiles():
- p = subprocess.Popen([sys.executable, "-c",
- 'import os; os.abort()'])
- p.wait()
- self.assertEqual(-p.returncode, signal.SIGABRT)
-
- def test_preexec(self) -> None:
- # DISCLAIMER: Setting environment variables is *not* a good use
- # of a preexec_fn. This is merely a test.
- p = subprocess.Popen([sys.executable, "-c",
- 'import sys,os;'
- 'sys.stdout.write(os.getenv("FRUIT"))'],
- stdout=subprocess.PIPE,
- preexec_fn=lambda: os.putenv("FRUIT", "apple"))
- self.addCleanup(p.stdout.close)
- self.assertEqual(p.stdout.read(), b"apple")
-
- def test_preexec_exception(self) -> None:
- def raise_it():
- raise ValueError("What if two swallows carried a coconut?")
- try:
- p = subprocess.Popen([sys.executable, "-c", ""],
- preexec_fn=raise_it)
- except RuntimeError as e:
- self.assertTrue(
- subprocess._posixsubprocess,
- "Expected a ValueError from the preexec_fn")
- except ValueError as e2:
- self.assertIn("coconut", e2.args[0])
- else:
- self.fail("Exception raised by preexec_fn did not make it "
- "to the parent process.")
-
- def test_preexec_gc_module_failure(self) -> None:
- # This tests the code that disables garbage collection if the child
- # process will execute any Python.
- def raise_runtime_error():
- raise RuntimeError("this shouldn't escape")
- enabled = gc.isenabled()
- orig_gc_disable = gc.disable
- orig_gc_isenabled = gc.isenabled
- try:
- gc.disable()
- self.assertFalse(gc.isenabled())
- subprocess.call([sys.executable, '-c', ''],
- preexec_fn=lambda: None)
- self.assertFalse(gc.isenabled(),
- "Popen enabled gc when it shouldn't.")
-
- gc.enable()
- self.assertTrue(gc.isenabled())
- subprocess.call([sys.executable, '-c', ''],
- preexec_fn=lambda: None)
- self.assertTrue(gc.isenabled(), "Popen left gc disabled.")
-
- setattr(gc, 'disable', raise_runtime_error)
- self.assertRaises(RuntimeError, subprocess.Popen,
- [sys.executable, '-c', ''],
- preexec_fn=lambda: None)
-
- del gc.isenabled # force an AttributeError
- self.assertRaises(AttributeError, subprocess.Popen,
- [sys.executable, '-c', ''],
- preexec_fn=lambda: None)
- finally:
- setattr(gc, 'disable', orig_gc_disable)
- setattr(gc, 'isenabled', orig_gc_isenabled)
- if not enabled:
- gc.disable()
-
- def test_args_string(self) -> None:
- # args is a string
- fd, fname = mkstemp()
- # reopen in text mode
- with open(fd, "w", errors=cast(Any, "surrogateescape")) as fobj: # see #260
- fobj.write("#!/bin/sh\n")
- fobj.write("exec '%s' -c 'import sys; sys.exit(47)'\n" %
- sys.executable)
- os.chmod(fname, 0o700)
- p = subprocess.Popen(fname)
- p.wait()
- os.remove(fname)
- self.assertEqual(p.returncode, 47)
-
- def test_invalid_args(self) -> None:
- # invalid arguments should raise ValueError
- self.assertRaises(ValueError, subprocess.call,
- [sys.executable, "-c",
- "import sys; sys.exit(47)"],
- startupinfo=47)
- self.assertRaises(ValueError, subprocess.call,
- [sys.executable, "-c",
- "import sys; sys.exit(47)"],
- creationflags=47)
-
- def test_shell_sequence(self) -> None:
- # Run command through the shell (sequence)
- newenv = os.environ.copy()
- newenv["FRUIT"] = "apple"
- p = subprocess.Popen(["echo $FRUIT"], shell=1,
- stdout=subprocess.PIPE,
- env=newenv)
- self.addCleanup(p.stdout.close)
- self.assertEqual(p.stdout.read().strip(b" \t\r\n\f"), b"apple")
-
- def test_shell_string(self) -> None:
- # Run command through the shell (string)
- newenv = os.environ.copy()
- newenv["FRUIT"] = "apple"
- p = subprocess.Popen("echo $FRUIT", shell=1,
- stdout=subprocess.PIPE,
- env=newenv)
- self.addCleanup(p.stdout.close)
- self.assertEqual(p.stdout.read().strip(b" \t\r\n\f"), b"apple")
-
- def test_call_string(self) -> None:
- # call() function with string argument on UNIX
- fd, fname = mkstemp()
- # reopen in text mode
- with open(fd, "w", errors=cast(Any, "surrogateescape")) as fobj: # see #260
- fobj.write("#!/bin/sh\n")
- fobj.write("exec '%s' -c 'import sys; sys.exit(47)'\n" %
- sys.executable)
- os.chmod(fname, 0o700)
- rc = subprocess.call(fname)
- os.remove(fname)
- self.assertEqual(rc, 47)
-
- def test_specific_shell(self) -> None:
- # Issue #9265: Incorrect name passed as arg[0].
- shells = [] # type: List[str]
- for prefix in ['/bin', '/usr/bin/', '/usr/local/bin']:
- for name in ['bash', 'ksh']:
- sh = os.path.join(prefix, name)
- if os.path.isfile(sh):
- shells.append(sh)
- if not shells: # Will probably work for any shell but csh.
- self.skipTest("bash or ksh required for this test")
- sh = '/bin/sh'
- if os.path.isfile(sh) and not os.path.islink(sh):
- # Test will fail if /bin/sh is a symlink to csh.
- shells.append(sh)
- for sh in shells:
- p = subprocess.Popen("echo $0", executable=sh, shell=True,
- stdout=subprocess.PIPE)
- self.addCleanup(p.stdout.close)
- self.assertEqual(p.stdout.read().strip(), bytes(sh, 'ascii'))
-
- def _kill_process(self, method: str, *args: Any) -> subprocess.Popen:
- # Do not inherit file handles from the parent.
- # It should fix failures on some platforms.
- p = subprocess.Popen([sys.executable, "-c", """if 1:
- import sys, time
- sys.stdout.write('x\\n')
- sys.stdout.flush()
- time.sleep(30)
- """],
- close_fds=True,
- stdin=subprocess.PIPE,
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE)
- # Wait for the interpreter to be completely initialized before
- # sending any signal.
- p.stdout.read(1)
- getattr(p, method)(*args)
- return p
-
- def test_send_signal(self) -> None:
- p = self._kill_process('send_signal', signal.SIGINT)
- _, stderr = p.communicate()
- self.assertIn(b'KeyboardInterrupt', stderr)
- self.assertNotEqual(p.wait(), 0)
-
- def test_kill(self) -> None:
- p = self._kill_process('kill')
- _, stderr = p.communicate()
- self.assertStderrEqual(stderr, b'')
- self.assertEqual(p.wait(), -signal.SIGKILL)
-
- def test_terminate(self) -> None:
- p = self._kill_process('terminate')
- _, stderr = p.communicate()
- self.assertStderrEqual(stderr, b'')
- self.assertEqual(p.wait(), -signal.SIGTERM)
-
- def check_close_std_fds(self, fds: Iterable[int]) -> None:
- # Issue #9905: test that subprocess pipes still work properly with
- # some standard fds closed
- stdin = 0
- newfds = [] # type: List[int]
- for a in fds:
- b = os.dup(a)
- newfds.append(b)
- if a == 0:
- stdin = b
- try:
- for fd in fds:
- os.close(fd)
- out, err = subprocess.Popen([sys.executable, "-c",
- 'import sys;'
- 'sys.stdout.write("apple");'
- 'sys.stdout.flush();'
- 'sys.stderr.write("orange")'],
- stdin=stdin,
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE).communicate()
- err = support.strip_python_stderr(err)
- self.assertEqual((out, err), (b'apple', b'orange'))
- finally:
- for b, a in zip(newfds, fds):
- os.dup2(b, a)
- for b in newfds:
- os.close(b)
-
- def test_close_fd_0(self) -> None:
- self.check_close_std_fds([0])
-
- def test_close_fd_1(self) -> None:
- self.check_close_std_fds([1])
-
- def test_close_fd_2(self) -> None:
- self.check_close_std_fds([2])
-
- def test_close_fds_0_1(self) -> None:
- self.check_close_std_fds([0, 1])
-
- def test_close_fds_0_2(self) -> None:
- self.check_close_std_fds([0, 2])
-
- def test_close_fds_1_2(self) -> None:
- self.check_close_std_fds([1, 2])
-
- def test_close_fds_0_1_2(self) -> None:
- # Issue #10806: test that subprocess pipes still work properly with
- # all standard fds closed.
- self.check_close_std_fds([0, 1, 2])
-
- def test_remapping_std_fds(self) -> None:
- # open up some temporary files
- temps = [mkstemp() for i in range(3)]
- try:
- temp_fds = [fd for fd, fname in temps]
-
- # unlink the files -- we won't need to reopen them
- for fd, fname in temps:
- os.unlink(fname)
-
- # write some data to what will become stdin, and rewind
- os.write(temp_fds[1], b"STDIN")
- os.lseek(temp_fds[1], 0, 0)
-
- # move the standard file descriptors out of the way
- saved_fds = [os.dup(fd) for fd in range(3)]
- try:
- # duplicate the file objects over the standard fd's
- for fd, temp_fd in enumerate(temp_fds):
- os.dup2(temp_fd, fd)
-
- # now use those files in the "wrong" order, so that subprocess
- # has to rearrange them in the child
- p = subprocess.Popen([sys.executable, "-c",
- 'import sys; got = sys.stdin.read();'
- 'sys.stdout.write("got %s"%got); sys.stderr.write("err")'],
- stdin=temp_fds[1],
- stdout=temp_fds[2],
- stderr=temp_fds[0])
- p.wait()
- finally:
- # restore the original fd's underneath sys.stdin, etc.
- for std, saved in enumerate(saved_fds):
- os.dup2(saved, std)
- os.close(saved)
-
- for fd in temp_fds:
- os.lseek(fd, 0, 0)
-
- out = os.read(temp_fds[2], 1024)
- err = support.strip_python_stderr(os.read(temp_fds[0], 1024))
- self.assertEqual(out, b"got STDIN")
- self.assertEqual(err, b"err")
-
- finally:
- for fd in temp_fds:
- os.close(fd)
-
- def check_swap_fds(self, stdin_no: int, stdout_no: int,
- stderr_no: int) -> None:
- # open up some temporary files
- temps = [mkstemp() for i in range(3)]
- temp_fds = [fd for fd, fname in temps]
- try:
- # unlink the files -- we won't need to reopen them
- for fd, fname in temps:
- os.unlink(fname)
-
- # save a copy of the standard file descriptors
- saved_fds = [os.dup(fd) for fd in range(3)]
- try:
- # duplicate the temp files over the standard fd's 0, 1, 2
- for fd, temp_fd in enumerate(temp_fds):
- os.dup2(temp_fd, fd)
-
- # write some data to what will become stdin, and rewind
- os.write(stdin_no, b"STDIN")
- os.lseek(stdin_no, 0, 0)
-
- # now use those files in the given order, so that subprocess
- # has to rearrange them in the child
- p = subprocess.Popen([sys.executable, "-c",
- 'import sys; got = sys.stdin.read();'
- 'sys.stdout.write("got %s"%got); sys.stderr.write("err")'],
- stdin=stdin_no,
- stdout=stdout_no,
- stderr=stderr_no)
- p.wait()
-
- for fd in temp_fds:
- os.lseek(fd, 0, 0)
-
- out = os.read(stdout_no, 1024)
- err = support.strip_python_stderr(os.read(stderr_no, 1024))
- finally:
- for std, saved in enumerate(saved_fds):
- os.dup2(saved, std)
- os.close(saved)
-
- self.assertEqual(out, b"got STDIN")
- self.assertEqual(err, b"err")
-
- finally:
- for fd in temp_fds:
- os.close(fd)
-
- # When duping fds, if there arises a situation where one of the fds is
- # either 0, 1 or 2, it is possible that it is overwritten (#12607).
- # This tests all combinations of this.
- def test_swap_fds(self) -> None:
- self.check_swap_fds(0, 1, 2)
- self.check_swap_fds(0, 2, 1)
- self.check_swap_fds(1, 0, 2)
- self.check_swap_fds(1, 2, 0)
- self.check_swap_fds(2, 0, 1)
- self.check_swap_fds(2, 1, 0)
-
- def test_surrogates_error_message(self) -> None:
- def prepare() -> None:
- raise ValueError("surrogate:\uDCff")
-
- try:
- subprocess.call(
- [sys.executable, "-c", "pass"],
- preexec_fn=prepare)
- except ValueError as err:
- # Pure Python implementations keeps the message
- self.assertIsNone(subprocess._posixsubprocess)
- self.assertEqual(str(err), "surrogate:\uDCff")
- except RuntimeError as err2:
- # _posixsubprocess uses a default message
- self.assertIsNotNone(subprocess._posixsubprocess)
- self.assertEqual(str(err2), "Exception occurred in preexec_fn.")
- else:
- self.fail("Expected ValueError or RuntimeError")
-
- def test_undecodable_env(self) -> None:
- for key, value in (('test', 'abc\uDCFF'), ('test\uDCFF', '42')):
- # test str with surrogates
- script = "import os; print(ascii(os.getenv(%s)))" % repr(key)
- env = os.environ.copy()
- env[key] = value
- # Use C locale to get ascii for the locale encoding to force
- # surrogate-escaping of \xFF in the child process; otherwise it can
- # be decoded as-is if the default locale is latin-1.
- env['LC_ALL'] = 'C'
- stdout = subprocess.check_output(
- [sys.executable, "-c", script],
- env=env)
- stdout = stdout.rstrip(b'\n\r')
- self.assertEqual(stdout.decode('ascii'), ascii(value))
-
- # test bytes
- keyb = key.encode("ascii", "surrogateescape")
- valueb = value.encode("ascii", "surrogateescape")
- script = "import os; print(ascii(os.getenvb(%s)))" % repr(keyb)
- envb = dict(os.environ.copy().items()) # type: Dict[Any, Any]
- envb[keyb] = valueb
- stdout = subprocess.check_output(
- [sys.executable, "-c", script],
- env=envb)
- stdout = stdout.rstrip(b'\n\r')
- self.assertEqual(stdout.decode('ascii'), ascii(valueb))
-
- def test_bytes_program(self) -> None:
- abs_program = os.fsencode(sys.executable)
- path, programs = os.path.split(sys.executable)
- program = os.fsencode(programs)
-
- # absolute bytes path
- exitcode = subprocess.call([abs_program, "-c", "pass"])
- self.assertEqual(exitcode, 0)
-
- # bytes program, unicode PATH
- env = os.environ.copy()
- env["PATH"] = path
- exitcode = subprocess.call([program, "-c", "pass"], env=env)
- self.assertEqual(exitcode, 0)
-
- # bytes program, bytes PATH
- envb = os.environb.copy()
- envb[b"PATH"] = os.fsencode(path)
- exitcode = subprocess.call([program, "-c", "pass"], env=envb)
- self.assertEqual(exitcode, 0)
-
- def test_pipe_cloexec(self) -> None:
- sleeper = support.findfile("input_reader.py", subdir="subprocessdata")
- fd_status = support.findfile("fd_status.py", subdir="subprocessdata")
-
- p1 = subprocess.Popen([sys.executable, sleeper],
- stdin=subprocess.PIPE, stdout=subprocess.PIPE,
- stderr=subprocess.PIPE, close_fds=False)
-
- self.addCleanup(p1.communicate, b'')
-
- p2 = subprocess.Popen([sys.executable, fd_status],
- stdout=subprocess.PIPE, close_fds=False)
-
- output, error = p2.communicate()
- result_fds = set(map(int, output.split(b',')))
- unwanted_fds = set([p1.stdin.fileno(), p1.stdout.fileno(),
- p1.stderr.fileno()])
-
- self.assertFalse(result_fds & unwanted_fds,
- "Expected no fds from %r to be open in child, "
- "found %r" %
- (unwanted_fds, result_fds & unwanted_fds))
-
- def test_pipe_cloexec_real_tools(self) -> None:
- qcat = support.findfile("qcat.py", subdir="subprocessdata")
- qgrep = support.findfile("qgrep.py", subdir="subprocessdata")
-
- subdata = b'zxcvbn'
- data = subdata * 4 + b'\n'
-
- p1 = subprocess.Popen([sys.executable, qcat],
- stdin=subprocess.PIPE, stdout=subprocess.PIPE,
- close_fds=False)
-
- p2 = subprocess.Popen([sys.executable, qgrep, subdata],
- stdin=p1.stdout, stdout=subprocess.PIPE,
- close_fds=False)
-
- self.addCleanup(p1.wait)
- self.addCleanup(p2.wait)
- def kill_p1() -> None:
- #try:
- p1.terminate()
- #except ProcessLookupError:
- # pass
- def kill_p2() -> None:
- #try:
- p2.terminate()
- #except ProcessLookupError:
- # pass
- self.addCleanup(kill_p1)
- self.addCleanup(kill_p2)
-
- p1.stdin.write(data)
- p1.stdin.close()
-
- readfiles, ignored1, ignored2 = select.select([p2.stdout], [], [], 10)
-
- self.assertTrue(readfiles, "The child hung")
- self.assertEqual(p2.stdout.read(), data)
-
- p1.stdout.close()
- p2.stdout.close()
-
- def test_close_fds(self) -> None:
- fd_status = support.findfile("fd_status.py", subdir="subprocessdata")
-
- fds = os.pipe()
- self.addCleanup(os.close, fds[0])
- self.addCleanup(os.close, fds[1])
-
- open_fds = set([fds[0], fds[1]])
- # add a bunch more fds
- for _ in range(9):
- fd = os.open("/dev/null", os.O_RDONLY)
- self.addCleanup(os.close, fd)
- open_fds.add(fd)
-
- p = subprocess.Popen([sys.executable, fd_status],
- stdout=subprocess.PIPE, close_fds=False)
- output, ignored = p.communicate()
- remaining_fds = set(map(int, output.split(b',')))
-
- self.assertEqual(remaining_fds & open_fds, open_fds,
- "Some fds were closed")
-
- p = subprocess.Popen([sys.executable, fd_status],
- stdout=subprocess.PIPE, close_fds=True)
- output, ignored = p.communicate()
- remaining_fds = set(map(int, output.split(b',')))
-
- self.assertFalse(remaining_fds & open_fds,
- "Some fds were left open")
- self.assertIn(1, remaining_fds, "Subprocess failed")
-
- # Keep some of the fd's we opened open in the subprocess.
- # This tests _posixsubprocess.c's proper handling of fds_to_keep.
- fds_to_keep = set(open_fds.pop() for _ in range(8))
- p = subprocess.Popen([sys.executable, fd_status],
- stdout=subprocess.PIPE, close_fds=True,
- pass_fds=())
- output, ignored = p.communicate()
- remaining_fds = set(map(int, output.split(b',')))
-
- self.assertFalse(remaining_fds & fds_to_keep & open_fds,
- "Some fds not in pass_fds were left open")
- self.assertIn(1, remaining_fds, "Subprocess failed")
-
- # Mac OS X Tiger (10.4) has a kernel bug: sometimes, the file
- # descriptor of a pipe closed in the parent process is valid in the
- # child process according to fstat(), but the mode of the file
- # descriptor is invalid, and read or write raise an error.
- @support.requires_mac_ver(10, 5)
- def test_pass_fds(self) -> None:
- fd_status = support.findfile("fd_status.py", subdir="subprocessdata")
-
- open_fds = set() # type: Set[int]
-
- for x in range(5):
- fds = os.pipe()
- self.addCleanup(os.close, fds[0])
- self.addCleanup(os.close, fds[1])
- open_fds.update([fds[0], fds[1]])
-
- for fd in open_fds:
- p = subprocess.Popen([sys.executable, fd_status],
- stdout=subprocess.PIPE, close_fds=True,
- pass_fds=(fd, ))
- output, ignored = p.communicate()
-
- remaining_fds = set(map(int, output.split(b',')))
- to_be_closed = open_fds - {fd}
-
- self.assertIn(fd, remaining_fds, "fd to be passed not passed")
- self.assertFalse(remaining_fds & to_be_closed,
- "fd to be closed passed")
-
- # pass_fds overrides close_fds with a warning.
- with self.assertWarns(RuntimeWarning) as context:
- self.assertFalse(subprocess.call(
- [sys.executable, "-c", "import sys; sys.exit(0)"],
- close_fds=False, pass_fds=(fd, )))
- self.assertIn('overriding close_fds', str(context.warning))
-
- def test_stdout_stdin_are_single_inout_fd(self) -> None:
- with io.open(os.devnull, "r+") as inout:
- p = subprocess.Popen([sys.executable, "-c", "import sys; sys.exit(0)"],
- stdout=inout, stdin=inout)
- p.wait()
-
- def test_stdout_stderr_are_single_inout_fd(self) -> None:
- with io.open(os.devnull, "r+") as inout:
- p = subprocess.Popen([sys.executable, "-c", "import sys; sys.exit(0)"],
- stdout=inout, stderr=inout)
- p.wait()
-
- def test_stderr_stdin_are_single_inout_fd(self) -> None:
- with io.open(os.devnull, "r+") as inout:
- p = subprocess.Popen([sys.executable, "-c", "import sys; sys.exit(0)"],
- stderr=inout, stdin=inout)
- p.wait()
-
- def test_wait_when_sigchild_ignored(self) -> None:
- # NOTE: sigchild_ignore.py may not be an effective test on all OSes.
- sigchild_ignore = support.findfile("sigchild_ignore.py",
- subdir="subprocessdata")
- p = subprocess.Popen([sys.executable, sigchild_ignore],
- stdout=subprocess.PIPE, stderr=subprocess.PIPE)
- stdout, stderr = p.communicate()
- self.assertEqual(0, p.returncode, "sigchild_ignore.py exited"
- " non-zero with this error:\n%s" %
- stderr.decode('utf8'))
-
- def test_select_unbuffered(self) -> None:
- # Issue #11459: bufsize=0 should really set the pipes as
- # unbuffered (and therefore let select() work properly).
- select = support.import_module("select")
- p = subprocess.Popen([sys.executable, "-c",
- 'import sys;'
- 'sys.stdout.write("apple")'],
- stdout=subprocess.PIPE,
- bufsize=0)
- f = p.stdout
- self.addCleanup(f.close)
- try:
- self.assertEqual(f.read(4), b"appl")
- self.assertIn(f, select.select([f], [], [], 0.0)[0])
- finally:
- p.wait()
-
- def test_zombie_fast_process_del(self) -> None:
- # Issue #12650: on Unix, if Popen.__del__() was called before the
- # process exited, it wouldn't be added to subprocess._active, and would
- # remain a zombie.
- # spawn a Popen, and delete its reference before it exits
- p = subprocess.Popen([sys.executable, "-c",
- 'import sys, time;'
- 'time.sleep(0.2)'],
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE)
- self.addCleanup(p.stdout.close)
- self.addCleanup(p.stderr.close)
- ident = id(p)
- pid = p.pid
- del p
- # check that p is in the active processes list
- self.assertIn(ident, [id(o) for o in subprocess._active])
-
- def test_leak_fast_process_del_killed(self) -> None:
- # Issue #12650: on Unix, if Popen.__del__() was called before the
- # process exited, and the process got killed by a signal, it would never
- # be removed from subprocess._active, which triggered a FD and memory
- # leak.
- # spawn a Popen, delete its reference and kill it
- p = subprocess.Popen([sys.executable, "-c",
- 'import time;'
- 'time.sleep(3)'],
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE)
- self.addCleanup(p.stdout.close)
- self.addCleanup(p.stderr.close)
- ident = id(p)
- pid = p.pid
- del p
- os.kill(pid, signal.SIGKILL)
- # check that p is in the active processes list
- self.assertIn(ident, [id(o) for o in subprocess._active])
-
- # let some time for the process to exit, and create a new Popen: this
- # should trigger the wait() of p
- time.sleep(0.2)
- with self.assertRaises(EnvironmentError) as c:
- with subprocess.Popen(['nonexisting_i_hope'],
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE) as proc:
- pass
- # p should have been wait()ed on, and removed from the _active list
- self.assertRaises(OSError, os.waitpid, pid, 0)
- self.assertNotIn(ident, [id(o) for o in subprocess._active])
-
-
- at unittest.skipUnless(mswindows, "Windows specific tests")
-class Win32ProcessTestCase(BaseTestCase):
-
- def test_startupinfo(self) -> None:
- # startupinfo argument
- # We uses hardcoded constants, because we do not want to
- # depend on win32all.
- STARTF_USESHOWWINDOW = 1
- SW_MAXIMIZE = 3
- startupinfo = subprocess.STARTUPINFO()
- startupinfo.dwFlags = STARTF_USESHOWWINDOW
- startupinfo.wShowWindow = SW_MAXIMIZE
- # Since Python is a console process, it won't be affected
- # by wShowWindow, but the argument should be silently
- # ignored
- subprocess.call([sys.executable, "-c", "import sys; sys.exit(0)"],
- startupinfo=startupinfo)
-
- def test_creationflags(self) -> None:
- # creationflags argument
- CREATE_NEW_CONSOLE = 16
- sys.stderr.write(" a DOS box should flash briefly ...\n")
- subprocess.call(sys.executable +
- ' -c "import time; time.sleep(0.25)"',
- creationflags=CREATE_NEW_CONSOLE)
-
- def test_invalid_args(self) -> None:
- # invalid arguments should raise ValueError
- self.assertRaises(ValueError, subprocess.call,
- [sys.executable, "-c",
- "import sys; sys.exit(47)"],
- preexec_fn=lambda: 1)
- self.assertRaises(ValueError, subprocess.call,
- [sys.executable, "-c",
- "import sys; sys.exit(47)"],
- stdout=subprocess.PIPE,
- close_fds=True)
-
- def test_close_fds(self) -> None:
- # close file descriptors
- rc = subprocess.call([sys.executable, "-c",
- "import sys; sys.exit(47)"],
- close_fds=True)
- self.assertEqual(rc, 47)
-
- def test_shell_sequence(self) -> None:
- # Run command through the shell (sequence)
- newenv = os.environ.copy()
- newenv["FRUIT"] = "physalis"
- p = subprocess.Popen(["set"], shell=1,
- stdout=subprocess.PIPE,
- env=newenv)
- self.addCleanup(p.stdout.close)
- self.assertIn(b"physalis", p.stdout.read())
-
- def test_shell_string(self) -> None:
- # Run command through the shell (string)
- newenv = os.environ.copy()
- newenv["FRUIT"] = "physalis"
- p = subprocess.Popen("set", shell=1,
- stdout=subprocess.PIPE,
- env=newenv)
- self.addCleanup(p.stdout.close)
- self.assertIn(b"physalis", p.stdout.read())
-
- def test_call_string(self) -> None:
- # call() function with string argument on Windows
- rc = subprocess.call(sys.executable +
- ' -c "import sys; sys.exit(47)"')
- self.assertEqual(rc, 47)
-
- def _kill_process(self, method: str, *args: Any) -> None:
- # Some win32 buildbot raises EOFError if stdin is inherited
- p = subprocess.Popen([sys.executable, "-c", """if 1:
- import sys, time
- sys.stdout.write('x\\n')
- sys.stdout.flush()
- time.sleep(30)
- """],
- stdin=subprocess.PIPE,
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE)
- self.addCleanup(p.stdout.close)
- self.addCleanup(p.stderr.close)
- self.addCleanup(p.stdin.close)
- # Wait for the interpreter to be completely initialized before
- # sending any signal.
- p.stdout.read(1)
- getattr(p, method)(*args)
- _, stderr = p.communicate()
- self.assertStderrEqual(stderr, b'')
- returncode = p.wait()
- self.assertNotEqual(returncode, 0)
-
- def test_send_signal(self) -> None:
- self._kill_process('send_signal', signal.SIGTERM)
-
- def test_kill(self) -> None:
- self._kill_process('kill')
-
- def test_terminate(self) -> None:
- self._kill_process('terminate')
-
-
-# The module says:
-# "NB This only works (and is only relevant) for UNIX."
-#
-# Actually, getoutput should work on any platform with an os.popen, but
-# I'll take the comment as given, and skip this suite.
- at unittest.skipUnless(os.name == 'posix', "only relevant for UNIX")
-class CommandTests(unittest.TestCase):
- def test_getoutput(self) -> None:
- self.assertEqual(subprocess.getoutput('echo xyzzy'), 'xyzzy')
- self.assertEqual(subprocess.getstatusoutput('echo xyzzy'),
- (0, 'xyzzy'))
-
- # we use mkdtemp in the next line to create an empty directory
- # under our exclusive control; from that, we can invent a pathname
- # that we _know_ won't exist. This is guaranteed to fail.
- dir = None # type: str
- try:
- dir = tempfile.mkdtemp()
- name = os.path.join(dir, "foo")
-
- status, output = subprocess.getstatusoutput('cat ' + name)
- self.assertNotEqual(status, 0)
- finally:
- if dir is not None:
- os.rmdir(dir)
-
-
- at unittest.skipUnless(getattr(subprocess, '_has_poll', False),
- "poll system call not supported")
-class ProcessTestCaseNoPoll(ProcessTestCase):
- def setUp(self) -> None:
- subprocess._has_poll = False
- ProcessTestCase.setUp(self)
-
- def tearDown(self) -> None:
- subprocess._has_poll = True
- ProcessTestCase.tearDown(self)
-
-
-#@unittest.skipUnless(getattr(subprocess, '_posixsubprocess', False),
-# "_posixsubprocess extension module not found.")
-#class ProcessTestCasePOSIXPurePython(ProcessTestCase, POSIXProcessTestCase):
-# @classmethod
-# def setUpClass(cls):
-# global subprocess
-# assert subprocess._posixsubprocess
-# # Reimport subprocess while forcing _posixsubprocess to not exist.
-# with support.check_warnings(('.*_posixsubprocess .* not being used.*',
-# RuntimeWarning)):
-# subprocess = support.import_fresh_module(
-# 'subprocess', blocked=['_posixsubprocess'])
-# assert not subprocess._posixsubprocess
-#
-# @classmethod
-# def tearDownClass(cls):
-# global subprocess
-# # Reimport subprocess as it should be, restoring order to the universe#.
-# subprocess = support.import_fresh_module('subprocess')
-# assert subprocess._posixsubprocess
-
-
-class HelperFunctionTests(unittest.TestCase):
- @unittest.skipIf(mswindows, "errno and EINTR make no sense on windows")
- def test_eintr_retry_call(self) -> None:
- record_calls = [] # type: List[Any]
- def fake_os_func(*args: Any) -> tuple:
- record_calls.append(args)
- if len(record_calls) == 2:
- raise OSError(errno.EINTR, "fake interrupted system call")
- return tuple(reversed(args))
-
- self.assertEqual((999, 256),
- subprocess._eintr_retry_call(fake_os_func, 256, 999))
- self.assertEqual([(256, 999)], record_calls)
- # This time there will be an EINTR so it will loop once.
- self.assertEqual((666,),
- subprocess._eintr_retry_call(fake_os_func, 666))
- self.assertEqual([(256, 999), (666,), (666,)], record_calls)
-
-
- at unittest.skipUnless(mswindows, "Windows-specific tests")
-class CommandsWithSpaces (BaseTestCase):
-
- def setUp(self) -> None:
- super().setUp()
- f, fname = mkstemp(".py", "te st")
- self.fname = fname.lower ()
- os.write(f, b"import sys;"
- b"sys.stdout.write('%d %s' % (len(sys.argv), [a.lower () for a in sys.argv]))"
- )
- os.close(f)
-
- def tearDown(self) -> None:
- os.remove(self.fname)
- super().tearDown()
-
- def with_spaces(self, *args: Any, **kwargs: Any) -> None:
- kwargs['stdout'] = subprocess.PIPE
- p = subprocess.Popen(*args, **kwargs)
- self.addCleanup(p.stdout.close)
- self.assertEqual(
- p.stdout.read ().decode("mbcs"),
- "2 [%r, 'ab cd']" % self.fname
- )
-
- def test_shell_string_with_spaces(self) -> None:
- # call() function with string argument with spaces on Windows
- self.with_spaces('"%s" "%s" "%s"' % (sys.executable, self.fname,
- "ab cd"), shell=1)
-
- def test_shell_sequence_with_spaces(self) -> None:
- # call() function with sequence argument with spaces on Windows
- self.with_spaces([sys.executable, self.fname, "ab cd"], shell=1)
-
- def test_noshell_string_with_spaces(self) -> None:
- # call() function with string argument with spaces on Windows
- self.with_spaces('"%s" "%s" "%s"' % (sys.executable, self.fname,
- "ab cd"))
-
- def test_noshell_sequence_with_spaces(self) -> None:
- # call() function with sequence argument with spaces on Windows
- self.with_spaces([sys.executable, self.fname, "ab cd"])
-
-
-class ContextManagerTests(BaseTestCase):
-
- def test_pipe(self) -> None:
- with subprocess.Popen([sys.executable, "-c",
- "import sys;"
- "sys.stdout.write('stdout');"
- "sys.stderr.write('stderr');"],
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE) as proc:
- self.assertEqual(proc.stdout.read(), b"stdout")
- self.assertStderrEqual(proc.stderr.read(), b"stderr")
-
- self.assertTrue(proc.stdout.closed)
- self.assertTrue(proc.stderr.closed)
-
- def test_returncode(self) -> None:
- with subprocess.Popen([sys.executable, "-c",
- "import sys; sys.exit(100)"]) as proc:
- pass
- # __exit__ calls wait(), so the returncode should be set
- self.assertEqual(proc.returncode, 100)
-
- def test_communicate_stdin(self) -> None:
- with subprocess.Popen([sys.executable, "-c",
- "import sys;"
- "sys.exit(sys.stdin.read() == 'context')"],
- stdin=subprocess.PIPE) as proc:
- proc.communicate(b"context")
- self.assertEqual(proc.returncode, 1)
-
- def test_invalid_args(self) -> None:
- with self.assertRaises(EnvironmentError) as c:
- with subprocess.Popen(['nonexisting_i_hope'],
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE) as proc:
- pass
-
- if c.exception.errno != errno.ENOENT: # ignore "no such file"
- raise c.exception
-
-
-def test_main():
- unit_tests = (ProcessTestCase,
- POSIXProcessTestCase,
- Win32ProcessTestCase,
- #ProcessTestCasePOSIXPurePython,
- CommandTests,
- ProcessTestCaseNoPoll,
- HelperFunctionTests,
- CommandsWithSpaces,
- ContextManagerTests,
- )
-
- support.run_unittest(*unit_tests)
- support.reap_children()
-
-if __name__ == "__main__":
- unittest.main()
diff --git a/test-data/stdlib-samples/3.2/test/test_tempfile.py b/test-data/stdlib-samples/3.2/test/test_tempfile.py
deleted file mode 100644
index 31b0fec..0000000
--- a/test-data/stdlib-samples/3.2/test/test_tempfile.py
+++ /dev/null
@@ -1,1122 +0,0 @@
-# tempfile.py unit tests.
-import tempfile
-import os
-import signal
-import sys
-import re
-import warnings
-
-import unittest
-from test import support
-
-from typing import Any, AnyStr, List, Dict, IO
-
-
-if hasattr(os, 'stat'):
- import stat
- has_stat = 1
-else:
- has_stat = 0
-
-has_textmode = (tempfile._text_openflags != tempfile._bin_openflags)
-has_spawnl = hasattr(os, 'spawnl')
-
-# TEST_FILES may need to be tweaked for systems depending on the maximum
-# number of files that can be opened at one time (see ulimit -n)
-if sys.platform in ('openbsd3', 'openbsd4'):
- TEST_FILES = 48
-else:
- TEST_FILES = 100
-
-# This is organized as one test for each chunk of code in tempfile.py,
-# in order of their appearance in the file. Testing which requires
-# threads is not done here.
-
-# Common functionality.
-class TC(unittest.TestCase):
-
- str_check = re.compile(r"[a-zA-Z0-9_-]{6}$")
-
- def setUp(self) -> None:
- self._warnings_manager = support.check_warnings()
- self._warnings_manager.__enter__()
- warnings.filterwarnings("ignore", category=RuntimeWarning,
- message="mktemp", module=__name__)
-
- def tearDown(self) -> None:
- self._warnings_manager.__exit__(None, None, None)
-
-
- def failOnException(self, what: str, ei: tuple = None) -> None:
- if ei is None:
- ei = sys.exc_info()
- self.fail("%s raised %s: %s" % (what, ei[0], ei[1]))
-
- def nameCheck(self, name: str, dir: str, pre: str, suf: str) -> None:
- (ndir, nbase) = os.path.split(name)
- npre = nbase[:len(pre)]
- nsuf = nbase[len(nbase)-len(suf):]
-
- # check for equality of the absolute paths!
- self.assertEqual(os.path.abspath(ndir), os.path.abspath(dir),
- "file '%s' not in directory '%s'" % (name, dir))
- self.assertEqual(npre, pre,
- "file '%s' does not begin with '%s'" % (nbase, pre))
- self.assertEqual(nsuf, suf,
- "file '%s' does not end with '%s'" % (nbase, suf))
-
- nbase = nbase[len(pre):len(nbase)-len(suf)]
- self.assertTrue(self.str_check.match(nbase),
- "random string '%s' does not match /^[a-zA-Z0-9_-]{6}$/"
- % nbase)
-
-test_classes = [] # type: List[type]
-
-class test_exports(TC):
- def test_exports(self) -> None:
- # There are no surprising symbols in the tempfile module
- dict = tempfile.__dict__
-
- expected = {
- "NamedTemporaryFile" : 1,
- "TemporaryFile" : 1,
- "mkstemp" : 1,
- "mkdtemp" : 1,
- "mktemp" : 1,
- "TMP_MAX" : 1,
- "gettempprefix" : 1,
- "gettempdir" : 1,
- "tempdir" : 1,
- "template" : 1,
- "SpooledTemporaryFile" : 1,
- "TemporaryDirectory" : 1,
- }
-
- unexp = [] # type: List[str]
- for key in dict:
- if key[0] != '_' and key not in expected:
- unexp.append(key)
- self.assertTrue(len(unexp) == 0,
- "unexpected keys: %s" % unexp)
-
-test_classes.append(test_exports)
-
-
-class test__RandomNameSequence(TC):
- """Test the internal iterator object _RandomNameSequence."""
-
- def setUp(self) -> None:
- self.r = tempfile._RandomNameSequence()
- super().setUp()
-
- def test_get_six_char_str(self) -> None:
- # _RandomNameSequence returns a six-character string
- s = next(self.r)
- self.nameCheck(s, '', '', '')
-
- def test_many(self) -> None:
- # _RandomNameSequence returns no duplicate strings (stochastic)
-
- dict = {} # type: Dict[str, int]
- r = self.r
- for i in range(TEST_FILES):
- s = next(r)
- self.nameCheck(s, '', '', '')
- self.assertNotIn(s, dict)
- dict[s] = 1
-
- def supports_iter(self) -> None:
- # _RandomNameSequence supports the iterator protocol
-
- i = 0
- r = self.r
- try:
- for s in r:
- i += 1
- if i == 20:
- break
- except:
- self.failOnException("iteration")
-
- @unittest.skipUnless(hasattr(os, 'fork'),
- "os.fork is required for this test")
- def test_process_awareness(self) -> None:
- # ensure that the random source differs between
- # child and parent.
- read_fd, write_fd = os.pipe()
- pid = None # type: int
- try:
- pid = os.fork()
- if not pid:
- os.close(read_fd)
- os.write(write_fd, next(self.r).encode("ascii"))
- os.close(write_fd)
- # bypass the normal exit handlers- leave those to
- # the parent.
- os._exit(0)
- parent_value = next(self.r)
- child_value = os.read(read_fd, len(parent_value)).decode("ascii")
- finally:
- if pid:
- # best effort to ensure the process can't bleed out
- # via any bugs above
- try:
- os.kill(pid, signal.SIGKILL)
- except EnvironmentError:
- pass
- os.close(read_fd)
- os.close(write_fd)
- self.assertNotEqual(child_value, parent_value)
-
-
-test_classes.append(test__RandomNameSequence)
-
-
-class test__candidate_tempdir_list(TC):
- """Test the internal function _candidate_tempdir_list."""
-
- def test_nonempty_list(self) -> None:
- # _candidate_tempdir_list returns a nonempty list of strings
-
- cand = tempfile._candidate_tempdir_list()
-
- self.assertFalse(len(cand) == 0)
- for c in cand:
- self.assertIsInstance(c, str)
-
- def test_wanted_dirs(self) -> None:
- # _candidate_tempdir_list contains the expected directories
-
- # Make sure the interesting environment variables are all set.
- with support.EnvironmentVarGuard() as env:
- for envname in 'TMPDIR', 'TEMP', 'TMP':
- dirname = os.getenv(envname)
- if not dirname:
- env[envname] = os.path.abspath(envname)
-
- cand = tempfile._candidate_tempdir_list()
-
- for envname in 'TMPDIR', 'TEMP', 'TMP':
- dirname = os.getenv(envname)
- if not dirname: raise ValueError
- self.assertIn(dirname, cand)
-
- try:
- dirname = os.getcwd()
- except (AttributeError, os.error):
- dirname = os.curdir
-
- self.assertIn(dirname, cand)
-
- # Not practical to try to verify the presence of OS-specific
- # paths in this list.
-
-test_classes.append(test__candidate_tempdir_list)
-
-
-# We test _get_default_tempdir by testing gettempdir.
-
-
-class test__get_candidate_names(TC):
- """Test the internal function _get_candidate_names."""
-
- def test_retval(self) -> None:
- # _get_candidate_names returns a _RandomNameSequence object
- obj = tempfile._get_candidate_names()
- self.assertIsInstance(obj, tempfile._RandomNameSequence)
-
- def test_same_thing(self) -> None:
- # _get_candidate_names always returns the same object
- a = tempfile._get_candidate_names()
- b = tempfile._get_candidate_names()
-
- self.assertTrue(a is b)
-
-test_classes.append(test__get_candidate_names)
-
-
-class test__mkstemp_inner(TC):
- """Test the internal function _mkstemp_inner."""
-
- class mkstemped:
- _bflags = tempfile._bin_openflags
- _tflags = tempfile._text_openflags
-
- def __init__(self, dir: str, pre: str, suf: str, bin: int) -> None:
- if bin: flags = self._bflags
- else: flags = self._tflags
-
- (self.fd, self.name) = tempfile._mkstemp_inner(dir, pre, suf, flags)
-
- self._close = os.close
- self._unlink = os.unlink
-
- def write(self, str: bytes) -> None:
- os.write(self.fd, str)
-
- def __del__(self) -> None:
- self._close(self.fd)
- self._unlink(self.name)
-
- def do_create(self, dir: str = None, pre: str = "", suf: str= "",
- bin: int = 1) -> mkstemped:
- if dir is None:
- dir = tempfile.gettempdir()
- try:
- file = test__mkstemp_inner.mkstemped(dir, pre, suf, bin) # see #259
- except:
- self.failOnException("_mkstemp_inner")
-
- self.nameCheck(file.name, dir, pre, suf)
- return file
-
- def test_basic(self) -> None:
- # _mkstemp_inner can create files
- self.do_create().write(b"blat")
- self.do_create(pre="a").write(b"blat")
- self.do_create(suf="b").write(b"blat")
- self.do_create(pre="a", suf="b").write(b"blat")
- self.do_create(pre="aa", suf=".txt").write(b"blat")
-
- def test_basic_many(self) -> None:
- # _mkstemp_inner can create many files (stochastic)
- extant = list(range(TEST_FILES)) # type: List[Any]
- for i in extant:
- extant[i] = self.do_create(pre="aa")
-
- def test_choose_directory(self) -> None:
- # _mkstemp_inner can create files in a user-selected directory
- dir = tempfile.mkdtemp()
- try:
- self.do_create(dir=dir).write(b"blat")
- finally:
- os.rmdir(dir)
-
- def test_file_mode(self) -> None:
- # _mkstemp_inner creates files with the proper mode
- if not has_stat:
- return # ugh, can't use SkipTest.
-
- file = self.do_create()
- mode = stat.S_IMODE(os.stat(file.name).st_mode)
- expected = 0o600
- if sys.platform in ('win32', 'os2emx'):
- # There's no distinction among 'user', 'group' and 'world';
- # replicate the 'user' bits.
- user = expected >> 6
- expected = user * (1 + 8 + 64)
- self.assertEqual(mode, expected)
-
- def test_noinherit(self) -> None:
- # _mkstemp_inner file handles are not inherited by child processes
- if not has_spawnl:
- return # ugh, can't use SkipTest.
-
- if support.verbose:
- v="v"
- else:
- v="q"
-
- file = self.do_create()
- fd = "%d" % file.fd
-
- try:
- me = __file__ # type: str
- except NameError:
- me = sys.argv[0]
-
- # We have to exec something, so that FD_CLOEXEC will take
- # effect. The core of this test is therefore in
- # tf_inherit_check.py, which see.
- tester = os.path.join(os.path.dirname(os.path.abspath(me)),
- "tf_inherit_check.py")
-
- # On Windows a spawn* /path/ with embedded spaces shouldn't be quoted,
- # but an arg with embedded spaces should be decorated with double
- # quotes on each end
- if sys.platform in ('win32',):
- decorated = '"%s"' % sys.executable
- tester = '"%s"' % tester
- else:
- decorated = sys.executable
-
- retval = os.spawnl(os.P_WAIT, sys.executable, decorated, tester, v, fd)
- self.assertFalse(retval < 0,
- "child process caught fatal signal %d" % -retval)
- self.assertFalse(retval > 0, "child process reports failure %d"%retval)
-
- def test_textmode(self) -> None:
- # _mkstemp_inner can create files in text mode
- if not has_textmode:
- return # ugh, can't use SkipTest.
-
- # A text file is truncated at the first Ctrl+Z byte
- f = self.do_create(bin=0)
- f.write(b"blat\x1a")
- f.write(b"extra\n")
- os.lseek(f.fd, 0, os.SEEK_SET)
- self.assertEqual(os.read(f.fd, 20), b"blat")
-
-test_classes.append(test__mkstemp_inner)
-
-
-class test_gettempprefix(TC):
- """Test gettempprefix()."""
-
- def test_sane_template(self) -> None:
- # gettempprefix returns a nonempty prefix string
- p = tempfile.gettempprefix()
-
- self.assertIsInstance(p, str)
- self.assertTrue(len(p) > 0)
-
- def test_usable_template(self) -> None:
- # gettempprefix returns a usable prefix string
-
- # Create a temp directory, avoiding use of the prefix.
- # Then attempt to create a file whose name is
- # prefix + 'xxxxxx.xxx' in that directory.
- p = tempfile.gettempprefix() + "xxxxxx.xxx"
- d = tempfile.mkdtemp(prefix="")
- try:
- p = os.path.join(d, p)
- try:
- fd = os.open(p, os.O_RDWR | os.O_CREAT)
- except:
- self.failOnException("os.open")
- os.close(fd)
- os.unlink(p)
- finally:
- os.rmdir(d)
-
-test_classes.append(test_gettempprefix)
-
-
-class test_gettempdir(TC):
- """Test gettempdir()."""
-
- def test_directory_exists(self) -> None:
- # gettempdir returns a directory which exists
-
- dir = tempfile.gettempdir()
- self.assertTrue(os.path.isabs(dir) or dir == os.curdir,
- "%s is not an absolute path" % dir)
- self.assertTrue(os.path.isdir(dir),
- "%s is not a directory" % dir)
-
- def test_directory_writable(self) -> None:
- # gettempdir returns a directory writable by the user
-
- # sneaky: just instantiate a NamedTemporaryFile, which
- # defaults to writing into the directory returned by
- # gettempdir.
- try:
- file = tempfile.NamedTemporaryFile()
- file.write(b"blat")
- file.close()
- except:
- self.failOnException("create file in %s" % tempfile.gettempdir())
-
- def test_same_thing(self) -> None:
- # gettempdir always returns the same object
- a = tempfile.gettempdir()
- b = tempfile.gettempdir()
-
- self.assertTrue(a is b)
-
-test_classes.append(test_gettempdir)
-
-
-class test_mkstemp(TC):
- """Test mkstemp()."""
-
- def do_create(self, dir: str = None, pre: str = "", suf: str = "") -> None:
- if dir is None:
- dir = tempfile.gettempdir()
- try:
- (fd, name) = tempfile.mkstemp(dir=dir, prefix=pre, suffix=suf)
- (ndir, nbase) = os.path.split(name)
- adir = os.path.abspath(dir)
- self.assertEqual(adir, ndir,
- "Directory '%s' incorrectly returned as '%s'" % (adir, ndir))
- except:
- self.failOnException("mkstemp")
-
- try:
- self.nameCheck(name, dir, pre, suf)
- finally:
- os.close(fd)
- os.unlink(name)
-
- def test_basic(self) -> None:
- # mkstemp can create files
- self.do_create()
- self.do_create(pre="a")
- self.do_create(suf="b")
- self.do_create(pre="a", suf="b")
- self.do_create(pre="aa", suf=".txt")
- self.do_create(dir=".")
-
- def test_choose_directory(self) -> None:
- # mkstemp can create directories in a user-selected directory
- dir = tempfile.mkdtemp()
- try:
- self.do_create(dir=dir)
- finally:
- os.rmdir(dir)
-
-test_classes.append(test_mkstemp)
-
-
-class test_mkdtemp(TC):
- """Test mkdtemp()."""
-
- def do_create(self, dir: str = None, pre: str = "", suf: str = "") -> str:
- if dir is None:
- dir = tempfile.gettempdir()
- try:
- name = tempfile.mkdtemp(dir=dir, prefix=pre, suffix=suf)
- except:
- self.failOnException("mkdtemp")
-
- try:
- self.nameCheck(name, dir, pre, suf)
- return name
- except:
- os.rmdir(name)
- raise
-
- def test_basic(self) -> None:
- # mkdtemp can create directories
- os.rmdir(self.do_create())
- os.rmdir(self.do_create(pre="a"))
- os.rmdir(self.do_create(suf="b"))
- os.rmdir(self.do_create(pre="a", suf="b"))
- os.rmdir(self.do_create(pre="aa", suf=".txt"))
-
- def test_basic_many(self) -> None:
- # mkdtemp can create many directories (stochastic)
- extant = list(range(TEST_FILES)) # type: List[Any]
- try:
- for i in extant:
- extant[i] = self.do_create(pre="aa")
- finally:
- for i in extant:
- if(isinstance(i, str)):
- os.rmdir(i)
-
- def test_choose_directory(self) -> None:
- # mkdtemp can create directories in a user-selected directory
- dir = tempfile.mkdtemp()
- try:
- os.rmdir(self.do_create(dir=dir))
- finally:
- os.rmdir(dir)
-
- def test_mode(self) -> None:
- # mkdtemp creates directories with the proper mode
- if not has_stat:
- return # ugh, can't use SkipTest.
-
- dir = self.do_create()
- try:
- mode = stat.S_IMODE(os.stat(dir).st_mode)
- mode &= 0o777 # Mask off sticky bits inherited from /tmp
- expected = 0o700
- if sys.platform in ('win32', 'os2emx'):
- # There's no distinction among 'user', 'group' and 'world';
- # replicate the 'user' bits.
- user = expected >> 6
- expected = user * (1 + 8 + 64)
- self.assertEqual(mode, expected)
- finally:
- os.rmdir(dir)
-
-test_classes.append(test_mkdtemp)
-
-
-class test_mktemp(TC):
- """Test mktemp()."""
-
- # For safety, all use of mktemp must occur in a private directory.
- # We must also suppress the RuntimeWarning it generates.
- def setUp(self) -> None:
- self.dir = tempfile.mkdtemp()
- super().setUp()
-
- def tearDown(self) -> None:
- if self.dir:
- os.rmdir(self.dir)
- self.dir = None
- super().tearDown()
-
- class mktemped:
- def _unlink(self, path: str) -> None:
- os.unlink(path)
-
- _bflags = tempfile._bin_openflags
-
- def __init__(self, dir: str, pre: str, suf: str) -> None:
- self.name = tempfile.mktemp(dir=dir, prefix=pre, suffix=suf)
- # Create the file. This will raise an exception if it's
- # mysteriously appeared in the meanwhile.
- os.close(os.open(self.name, self._bflags, 0o600))
-
- def __del__(self) -> None:
- self._unlink(self.name)
-
- def do_create(self, pre: str = "", suf: str = "") -> mktemped:
- try:
- file = test_mktemp.mktemped(self.dir, pre, suf) # see #259
- except:
- self.failOnException("mktemp")
-
- self.nameCheck(file.name, self.dir, pre, suf)
- return file
-
- def test_basic(self) -> None:
- # mktemp can choose usable file names
- self.do_create()
- self.do_create(pre="a")
- self.do_create(suf="b")
- self.do_create(pre="a", suf="b")
- self.do_create(pre="aa", suf=".txt")
-
- def test_many(self) -> None:
- # mktemp can choose many usable file names (stochastic)
- extant = list(range(TEST_FILES)) # type: List[Any]
- for i in extant:
- extant[i] = self.do_create(pre="aa")
-
-## def test_warning(self):
-## # mktemp issues a warning when used
-## warnings.filterwarnings("error",
-## category=RuntimeWarning,
-## message="mktemp")
-## self.assertRaises(RuntimeWarning,
-## tempfile.mktemp, dir=self.dir)
-
-test_classes.append(test_mktemp)
-
-
-# We test _TemporaryFileWrapper by testing NamedTemporaryFile.
-
-
-class test_NamedTemporaryFile(TC):
- """Test NamedTemporaryFile()."""
-
- def do_create(self, dir: str = None, pre: str = "", suf: str = "",
- delete: bool = True) -> IO[Any]:
- if dir is None:
- dir = tempfile.gettempdir()
- try:
- file = tempfile.NamedTemporaryFile(dir=dir, prefix=pre, suffix=suf,
- delete=delete)
- except:
- self.failOnException("NamedTemporaryFile")
-
- self.nameCheck(file.name, dir, pre, suf)
- return file
-
-
- def test_basic(self) -> None:
- # NamedTemporaryFile can create files
- self.do_create()
- self.do_create(pre="a")
- self.do_create(suf="b")
- self.do_create(pre="a", suf="b")
- self.do_create(pre="aa", suf=".txt")
-
- def test_creates_named(self) -> None:
- # NamedTemporaryFile creates files with names
- f = tempfile.NamedTemporaryFile()
- self.assertTrue(os.path.exists(f.name),
- "NamedTemporaryFile %s does not exist" % f.name)
-
- def test_del_on_close(self) -> None:
- # A NamedTemporaryFile is deleted when closed
- dir = tempfile.mkdtemp()
- try:
- f = tempfile.NamedTemporaryFile(dir=dir)
- f.write(b'blat')
- f.close()
- self.assertFalse(os.path.exists(f.name),
- "NamedTemporaryFile %s exists after close" % f.name)
- finally:
- os.rmdir(dir)
-
- def test_dis_del_on_close(self) -> None:
- # Tests that delete-on-close can be disabled
- dir = tempfile.mkdtemp()
- tmp = None # type: str
- try:
- f = tempfile.NamedTemporaryFile(dir=dir, delete=False)
- tmp = f.name
- f.write(b'blat')
- f.close()
- self.assertTrue(os.path.exists(f.name),
- "NamedTemporaryFile %s missing after close" % f.name)
- finally:
- if tmp is not None:
- os.unlink(tmp)
- os.rmdir(dir)
-
- def test_multiple_close(self) -> None:
- # A NamedTemporaryFile can be closed many times without error
- f = tempfile.NamedTemporaryFile()
- f.write(b'abc\n')
- f.close()
- try:
- f.close()
- f.close()
- except:
- self.failOnException("close")
-
- def test_context_manager(self) -> None:
- # A NamedTemporaryFile can be used as a context manager
- with tempfile.NamedTemporaryFile() as f:
- self.assertTrue(os.path.exists(f.name))
- self.assertFalse(os.path.exists(f.name))
- def use_closed():
- with f:
- pass
- self.assertRaises(ValueError, use_closed)
-
- # How to test the mode and bufsize parameters?
-
-test_classes.append(test_NamedTemporaryFile)
-
-class test_SpooledTemporaryFile(TC):
- """Test SpooledTemporaryFile()."""
-
- def do_create(self, max_size: int = 0, dir: str = None, pre: str = "",
- suf: str = "") -> tempfile.SpooledTemporaryFile:
- if dir is None:
- dir = tempfile.gettempdir()
- try:
- file = tempfile.SpooledTemporaryFile(max_size=max_size, dir=dir, prefix=pre, suffix=suf)
- except:
- self.failOnException("SpooledTemporaryFile")
-
- return file
-
-
- def test_basic(self) -> None:
- # SpooledTemporaryFile can create files
- f = self.do_create()
- self.assertFalse(f._rolled)
- f = self.do_create(max_size=100, pre="a", suf=".txt")
- self.assertFalse(f._rolled)
-
- def test_del_on_close(self) -> None:
- # A SpooledTemporaryFile is deleted when closed
- dir = tempfile.mkdtemp()
- try:
- f = tempfile.SpooledTemporaryFile(max_size=10, dir=dir)
- self.assertFalse(f._rolled)
- f.write(b'blat ' * 5)
- self.assertTrue(f._rolled)
- filename = f.name
- f.close()
- self.assertFalse(isinstance(filename, str) and os.path.exists(filename),
- "SpooledTemporaryFile %s exists after close" % filename)
- finally:
- os.rmdir(dir)
-
- def test_rewrite_small(self) -> None:
- # A SpooledTemporaryFile can be written to multiple within the max_size
- f = self.do_create(max_size=30)
- self.assertFalse(f._rolled)
- for i in range(5):
- f.seek(0, 0)
- f.write(b'x' * 20)
- self.assertFalse(f._rolled)
-
- def test_write_sequential(self) -> None:
- # A SpooledTemporaryFile should hold exactly max_size bytes, and roll
- # over afterward
- f = self.do_create(max_size=30)
- self.assertFalse(f._rolled)
- f.write(b'x' * 20)
- self.assertFalse(f._rolled)
- f.write(b'x' * 10)
- self.assertFalse(f._rolled)
- f.write(b'x')
- self.assertTrue(f._rolled)
-
- def test_writelines(self) -> None:
- # Verify writelines with a SpooledTemporaryFile
- f = self.do_create()
- f.writelines([b'x', b'y', b'z'])
- f.seek(0)
- buf = f.read()
- self.assertEqual(buf, b'xyz')
-
- def test_writelines_sequential(self) -> None:
- # A SpooledTemporaryFile should hold exactly max_size bytes, and roll
- # over afterward
- f = self.do_create(max_size=35)
- f.writelines([b'x' * 20, b'x' * 10, b'x' * 5])
- self.assertFalse(f._rolled)
- f.write(b'x')
- self.assertTrue(f._rolled)
-
- def test_sparse(self) -> None:
- # A SpooledTemporaryFile that is written late in the file will extend
- # when that occurs
- f = self.do_create(max_size=30)
- self.assertFalse(f._rolled)
- f.seek(100, 0)
- self.assertFalse(f._rolled)
- f.write(b'x')
- self.assertTrue(f._rolled)
-
- def test_fileno(self) -> None:
- # A SpooledTemporaryFile should roll over to a real file on fileno()
- f = self.do_create(max_size=30)
- self.assertFalse(f._rolled)
- self.assertTrue(f.fileno() > 0)
- self.assertTrue(f._rolled)
-
- def test_multiple_close_before_rollover(self) -> None:
- # A SpooledTemporaryFile can be closed many times without error
- f = tempfile.SpooledTemporaryFile()
- f.write(b'abc\n')
- self.assertFalse(f._rolled)
- f.close()
- try:
- f.close()
- f.close()
- except:
- self.failOnException("close")
-
- def test_multiple_close_after_rollover(self) -> None:
- # A SpooledTemporaryFile can be closed many times without error
- f = tempfile.SpooledTemporaryFile(max_size=1)
- f.write(b'abc\n')
- self.assertTrue(f._rolled)
- f.close()
- try:
- f.close()
- f.close()
- except:
- self.failOnException("close")
-
- def test_bound_methods(self) -> None:
- # It should be OK to steal a bound method from a SpooledTemporaryFile
- # and use it independently; when the file rolls over, those bound
- # methods should continue to function
- f = self.do_create(max_size=30)
- read = f.read
- write = f.write
- seek = f.seek
-
- write(b"a" * 35)
- write(b"b" * 35)
- seek(0, 0)
- self.assertEqual(read(70), b'a'*35 + b'b'*35)
-
- def test_text_mode(self) -> None:
- # Creating a SpooledTemporaryFile with a text mode should produce
- # a file object reading and writing (Unicode) text strings.
- f = tempfile.SpooledTemporaryFile(mode='w+', max_size=10)
- f.write("abc\n")
- f.seek(0)
- self.assertEqual(f.read(), "abc\n")
- f.write("def\n")
- f.seek(0)
- self.assertEqual(f.read(), "abc\ndef\n")
- f.write("xyzzy\n")
- f.seek(0)
- self.assertEqual(f.read(), "abc\ndef\nxyzzy\n")
- # Check that Ctrl+Z doesn't truncate the file
- f.write("foo\x1abar\n")
- f.seek(0)
- self.assertEqual(f.read(), "abc\ndef\nxyzzy\nfoo\x1abar\n")
-
- def test_text_newline_and_encoding(self) -> None:
- f = tempfile.SpooledTemporaryFile(mode='w+', max_size=10,
- newline='', encoding='utf-8')
- f.write("\u039B\r\n")
- f.seek(0)
- self.assertEqual(f.read(), "\u039B\r\n")
- self.assertFalse(f._rolled)
-
- f.write("\u039B" * 20 + "\r\n")
- f.seek(0)
- self.assertEqual(f.read(), "\u039B\r\n" + ("\u039B" * 20) + "\r\n")
- self.assertTrue(f._rolled)
-
- def test_context_manager_before_rollover(self) -> None:
- # A SpooledTemporaryFile can be used as a context manager
- with tempfile.SpooledTemporaryFile(max_size=1) as f:
- self.assertFalse(f._rolled)
- self.assertFalse(f.closed)
- self.assertTrue(f.closed)
- def use_closed():
- with f:
- pass
- self.assertRaises(ValueError, use_closed)
-
- def test_context_manager_during_rollover(self) -> None:
- # A SpooledTemporaryFile can be used as a context manager
- with tempfile.SpooledTemporaryFile(max_size=1) as f:
- self.assertFalse(f._rolled)
- f.write(b'abc\n')
- f.flush()
- self.assertTrue(f._rolled)
- self.assertFalse(f.closed)
- self.assertTrue(f.closed)
- def use_closed():
- with f:
- pass
- self.assertRaises(ValueError, use_closed)
-
- def test_context_manager_after_rollover(self) -> None:
- # A SpooledTemporaryFile can be used as a context manager
- f = tempfile.SpooledTemporaryFile(max_size=1)
- f.write(b'abc\n')
- f.flush()
- self.assertTrue(f._rolled)
- with f:
- self.assertFalse(f.closed)
- self.assertTrue(f.closed)
- def use_closed():
- with f:
- pass
- self.assertRaises(ValueError, use_closed)
-
-
-test_classes.append(test_SpooledTemporaryFile)
-
-
-class test_TemporaryFile(TC):
- """Test TemporaryFile()."""
-
- def test_basic(self) -> None:
- # TemporaryFile can create files
- # No point in testing the name params - the file has no name.
- try:
- tempfile.TemporaryFile()
- except:
- self.failOnException("TemporaryFile")
-
- def test_has_no_name(self) -> None:
- # TemporaryFile creates files with no names (on this system)
- dir = tempfile.mkdtemp()
- f = tempfile.TemporaryFile(dir=dir)
- f.write(b'blat')
-
- # Sneaky: because this file has no name, it should not prevent
- # us from removing the directory it was created in.
- try:
- os.rmdir(dir)
- except:
- ei = sys.exc_info()
- # cleanup
- f.close()
- os.rmdir(dir)
- self.failOnException("rmdir", ei)
-
- def test_multiple_close(self) -> None:
- # A TemporaryFile can be closed many times without error
- f = tempfile.TemporaryFile()
- f.write(b'abc\n')
- f.close()
- try:
- f.close()
- f.close()
- except:
- self.failOnException("close")
-
- # How to test the mode and bufsize parameters?
- def test_mode_and_encoding(self) -> None:
-
- def roundtrip(input: AnyStr, *args: Any, **kwargs: Any) -> None:
- with tempfile.TemporaryFile(*args, **kwargs) as fileobj:
- fileobj.write(input)
- fileobj.seek(0)
- self.assertEqual(input, fileobj.read())
-
- roundtrip(b"1234", "w+b")
- roundtrip("abdc\n", "w+")
- roundtrip("\u039B", "w+", encoding="utf-16")
- roundtrip("foo\r\n", "w+", newline="")
-
-
-if tempfile.NamedTemporaryFile is not tempfile.TemporaryFile:
- test_classes.append(test_TemporaryFile)
-
-
-# Helper for test_del_on_shutdown
-class NulledModules:
- def __init__(self, *modules: Any) -> None:
- self.refs = [mod.__dict__ for mod in modules]
- self.contents = [ref.copy() for ref in self.refs]
-
- def __enter__(self) -> None:
- for d in self.refs:
- for key in d:
- d[key] = None
-
- def __exit__(self, *exc_info: Any) -> None:
- for d, c in zip(self.refs, self.contents):
- d.clear()
- d.update(c)
-
-class test_TemporaryDirectory(TC):
- """Test TemporaryDirectory()."""
-
- def do_create(self, dir: str = None, pre: str = "", suf: str = "",
- recurse: int = 1) -> tempfile.TemporaryDirectory:
- if dir is None:
- dir = tempfile.gettempdir()
- try:
- tmp = tempfile.TemporaryDirectory(dir=dir, prefix=pre, suffix=suf)
- except:
- self.failOnException("TemporaryDirectory")
- self.nameCheck(tmp.name, dir, pre, suf)
- # Create a subdirectory and some files
- if recurse:
- self.do_create(tmp.name, pre, suf, recurse-1)
- with open(os.path.join(tmp.name, "test.txt"), "wb") as f:
- f.write(b"Hello world!")
- return tmp
-
- def test_mkdtemp_failure(self) -> None:
- # Check no additional exception if mkdtemp fails
- # Previously would raise AttributeError instead
- # (noted as part of Issue #10188)
- with tempfile.TemporaryDirectory() as nonexistent:
- pass
- with self.assertRaises(os.error):
- tempfile.TemporaryDirectory(dir=nonexistent)
-
- def test_explicit_cleanup(self) -> None:
- # A TemporaryDirectory is deleted when cleaned up
- dir = tempfile.mkdtemp()
- try:
- d = self.do_create(dir=dir)
- self.assertTrue(os.path.exists(d.name),
- "TemporaryDirectory %s does not exist" % d.name)
- d.cleanup()
- self.assertFalse(os.path.exists(d.name),
- "TemporaryDirectory %s exists after cleanup" % d.name)
- finally:
- os.rmdir(dir)
-
- @support.skip_unless_symlink
- def test_cleanup_with_symlink_to_a_directory(self) -> None:
- # cleanup() should not follow symlinks to directories (issue #12464)
- d1 = self.do_create()
- d2 = self.do_create()
-
- # Symlink d1/foo -> d2
- os.symlink(d2.name, os.path.join(d1.name, "foo"))
-
- # This call to cleanup() should not follow the "foo" symlink
- d1.cleanup()
-
- self.assertFalse(os.path.exists(d1.name),
- "TemporaryDirectory %s exists after cleanup" % d1.name)
- self.assertTrue(os.path.exists(d2.name),
- "Directory pointed to by a symlink was deleted")
- self.assertEqual(os.listdir(d2.name), ['test.txt'],
- "Contents of the directory pointed to by a symlink "
- "were deleted")
- d2.cleanup()
-
- @support.cpython_only
- def test_del_on_collection(self) -> None:
- # A TemporaryDirectory is deleted when garbage collected
- dir = tempfile.mkdtemp()
- try:
- d = self.do_create(dir=dir)
- name = d.name
- del d # Rely on refcounting to invoke __del__
- self.assertFalse(os.path.exists(name),
- "TemporaryDirectory %s exists after __del__" % name)
- finally:
- os.rmdir(dir)
-
- @unittest.expectedFailure # See issue #10188
- def test_del_on_shutdown(self) -> None:
- # A TemporaryDirectory may be cleaned up during shutdown
- # Make sure it works with the relevant modules nulled out
- with self.do_create() as dir:
- d = self.do_create(dir=dir)
- # Mimic the nulling out of modules that
- # occurs during system shutdown
- modules = [os, os.path]
- if has_stat:
- modules.append(stat)
- # Currently broken, so suppress the warning
- # that is otherwise emitted on stdout
- with support.captured_stderr() as err:
- with NulledModules(*modules):
- d.cleanup()
- # Currently broken, so stop spurious exception by
- # indicating the object has already been closed
- d._closed = True
- # And this assert will fail, as expected by the
- # unittest decorator...
- self.assertFalse(os.path.exists(d.name),
- "TemporaryDirectory %s exists after cleanup" % d.name)
-
- def test_warnings_on_cleanup(self) -> None:
- # Two kinds of warning on shutdown
- # Issue 10888: may write to stderr if modules are nulled out
- # ResourceWarning will be triggered by __del__
- with self.do_create() as dir:
- if os.sep != '\\':
- # Embed a backslash in order to make sure string escaping
- # in the displayed error message is dealt with correctly
- suffix = '\\check_backslash_handling'
- else:
- suffix = ''
- d = self.do_create(dir=dir, suf=suffix)
-
- #Check for the Issue 10888 message
- modules = [os, os.path]
- if has_stat:
- modules.append(stat)
- with support.captured_stderr() as err:
- with NulledModules(*modules):
- d.cleanup()
- message = err.getvalue().replace('\\\\', '\\')
- self.assertIn("while cleaning up", message)
- self.assertIn(d.name, message)
-
- # Check for the resource warning
- with support.check_warnings(('Implicitly', ResourceWarning), quiet=False):
- warnings.filterwarnings("always", category=ResourceWarning)
- d.__del__()
- self.assertFalse(os.path.exists(d.name),
- "TemporaryDirectory %s exists after __del__" % d.name)
-
- def test_multiple_close(self) -> None:
- # Can be cleaned-up many times without error
- d = self.do_create()
- d.cleanup()
- try:
- d.cleanup()
- d.cleanup()
- except:
- self.failOnException("cleanup")
-
- def test_context_manager(self) -> None:
- # Can be used as a context manager
- d = self.do_create()
- with d as name:
- self.assertTrue(os.path.exists(name))
- self.assertEqual(name, d.name)
- self.assertFalse(os.path.exists(name))
-
-
-test_classes.append(test_TemporaryDirectory)
-
-def test_main() -> None:
- support.run_unittest(*test_classes)
-
-if __name__ == "__main__":
- test_main()
diff --git a/test-data/stdlib-samples/3.2/test/test_textwrap.py b/test-data/stdlib-samples/3.2/test/test_textwrap.py
deleted file mode 100644
index 79d921a..0000000
--- a/test-data/stdlib-samples/3.2/test/test_textwrap.py
+++ /dev/null
@@ -1,601 +0,0 @@
-#
-# Test suite for the textwrap module.
-#
-# Original tests written by Greg Ward <gward at python.net>.
-# Converted to PyUnit by Peter Hansen <peter at engcorp.com>.
-# Currently maintained by Greg Ward.
-#
-# $Id$
-#
-
-import unittest
-from test import support
-
-from typing import Any, List, Sequence
-
-from textwrap import TextWrapper, wrap, fill, dedent
-
-
-class BaseTestCase(unittest.TestCase):
- '''Parent class with utility methods for textwrap tests.'''
-
- wrapper = None # type: TextWrapper
-
- def show(self, textin: Sequence[str]) -> str:
- if isinstance(textin, list):
- results = [] # type: List[str]
- for i in range(len(textin)):
- results.append(" %d: %r" % (i, textin[i]))
- result = '\n'.join(results)
- elif isinstance(textin, str):
- result = " %s\n" % repr(textin)
- return result
-
-
- def check(self, result: Sequence[str], expect: Sequence[str]) -> None:
- self.assertEqual(result, expect,
- 'expected:\n%s\nbut got:\n%s' % (
- self.show(expect), self.show(result)))
-
- def check_wrap(self, text: str, width: int, expect: Sequence[str],
- **kwargs: Any) -> None:
- result = wrap(text, width, **kwargs)
- self.check(result, expect)
-
- def check_split(self, text: str, expect: Sequence[str]) -> None:
- result = self.wrapper._split(text)
- self.assertEqual(result, expect,
- "\nexpected %r\n"
- "but got %r" % (expect, result))
-
-
-class WrapTestCase(BaseTestCase):
-
- def setUp(self) -> None:
- self.wrapper = TextWrapper(width=45)
-
- def test_simple(self) -> None:
- # Simple case: just words, spaces, and a bit of punctuation
-
- text = "Hello there, how are you this fine day? I'm glad to hear it!"
-
- self.check_wrap(text, 12,
- ["Hello there,",
- "how are you",
- "this fine",
- "day? I'm",
- "glad to hear",
- "it!"])
- self.check_wrap(text, 42,
- ["Hello there, how are you this fine day?",
- "I'm glad to hear it!"])
- self.check_wrap(text, 80, [text])
-
-
- def test_whitespace(self) -> None:
- # Whitespace munging and end-of-sentence detection
-
- text = """\
-This is a paragraph that already has
-line breaks. But some of its lines are much longer than the others,
-so it needs to be wrapped.
-Some lines are \ttabbed too.
-What a mess!
-"""
-
- expect = ["This is a paragraph that already has line",
- "breaks. But some of its lines are much",
- "longer than the others, so it needs to be",
- "wrapped. Some lines are tabbed too. What a",
- "mess!"]
-
- wrapper = TextWrapper(45, fix_sentence_endings=True)
- result = wrapper.wrap(text)
- self.check(result, expect)
-
- results = wrapper.fill(text)
- self.check(results, '\n'.join(expect))
-
- def test_fix_sentence_endings(self) -> None:
- wrapper = TextWrapper(60, fix_sentence_endings=True)
-
- # SF #847346: ensure that fix_sentence_endings=True does the
- # right thing even on input short enough that it doesn't need to
- # be wrapped.
- text = "A short line. Note the single space."
- expect = ["A short line. Note the single space."]
- self.check(wrapper.wrap(text), expect)
-
- # Test some of the hairy end cases that _fix_sentence_endings()
- # is supposed to handle (the easy stuff is tested in
- # test_whitespace() above).
- text = "Well, Doctor? What do you think?"
- expect = ["Well, Doctor? What do you think?"]
- self.check(wrapper.wrap(text), expect)
-
- text = "Well, Doctor?\nWhat do you think?"
- self.check(wrapper.wrap(text), expect)
-
- text = 'I say, chaps! Anyone for "tennis?"\nHmmph!'
- expect = ['I say, chaps! Anyone for "tennis?" Hmmph!']
- self.check(wrapper.wrap(text), expect)
-
- wrapper.width = 20
- expect = ['I say, chaps!', 'Anyone for "tennis?"', 'Hmmph!']
- self.check(wrapper.wrap(text), expect)
-
- text = 'And she said, "Go to hell!"\nCan you believe that?'
- expect = ['And she said, "Go to',
- 'hell!" Can you',
- 'believe that?']
- self.check(wrapper.wrap(text), expect)
-
- wrapper.width = 60
- expect = ['And she said, "Go to hell!" Can you believe that?']
- self.check(wrapper.wrap(text), expect)
-
- text = 'File stdio.h is nice.'
- expect = ['File stdio.h is nice.']
- self.check(wrapper.wrap(text), expect)
-
- def test_wrap_short(self) -> None:
- # Wrapping to make short lines longer
-
- text = "This is a\nshort paragraph."
-
- self.check_wrap(text, 20, ["This is a short",
- "paragraph."])
- self.check_wrap(text, 40, ["This is a short paragraph."])
-
-
- def test_wrap_short_1line(self) -> None:
- # Test endcases
-
- text = "This is a short line."
-
- self.check_wrap(text, 30, ["This is a short line."])
- self.check_wrap(text, 30, ["(1) This is a short line."],
- initial_indent="(1) ")
-
-
- def test_hyphenated(self) -> None:
- # Test breaking hyphenated words
-
- text = ("this-is-a-useful-feature-for-"
- "reformatting-posts-from-tim-peters'ly")
-
- self.check_wrap(text, 40,
- ["this-is-a-useful-feature-for-",
- "reformatting-posts-from-tim-peters'ly"])
- self.check_wrap(text, 41,
- ["this-is-a-useful-feature-for-",
- "reformatting-posts-from-tim-peters'ly"])
- self.check_wrap(text, 42,
- ["this-is-a-useful-feature-for-reformatting-",
- "posts-from-tim-peters'ly"])
-
- def test_hyphenated_numbers(self) -> None:
- # Test that hyphenated numbers (eg. dates) are not broken like words.
- text = ("Python 1.0.0 was released on 1994-01-26. Python 1.0.1 was\n"
- "released on 1994-02-15.")
-
- self.check_wrap(text, 30, ['Python 1.0.0 was released on',
- '1994-01-26. Python 1.0.1 was',
- 'released on 1994-02-15.'])
- self.check_wrap(text, 40, ['Python 1.0.0 was released on 1994-01-26.',
- 'Python 1.0.1 was released on 1994-02-15.'])
-
- text = "I do all my shopping at 7-11."
- self.check_wrap(text, 25, ["I do all my shopping at",
- "7-11."])
- self.check_wrap(text, 27, ["I do all my shopping at",
- "7-11."])
- self.check_wrap(text, 29, ["I do all my shopping at 7-11."])
-
- def test_em_dash(self) -> None:
- # Test text with em-dashes
- text = "Em-dashes should be written -- thus."
- self.check_wrap(text, 25,
- ["Em-dashes should be",
- "written -- thus."])
-
- # Probe the boundaries of the properly written em-dash,
- # ie. " -- ".
- self.check_wrap(text, 29,
- ["Em-dashes should be written",
- "-- thus."])
- expect = ["Em-dashes should be written --",
- "thus."]
- self.check_wrap(text, 30, expect)
- self.check_wrap(text, 35, expect)
- self.check_wrap(text, 36,
- ["Em-dashes should be written -- thus."])
-
- # The improperly written em-dash is handled too, because
- # it's adjacent to non-whitespace on both sides.
- text = "You can also do--this or even---this."
- expect = ["You can also do",
- "--this or even",
- "---this."]
- self.check_wrap(text, 15, expect)
- self.check_wrap(text, 16, expect)
- expect = ["You can also do--",
- "this or even---",
- "this."]
- self.check_wrap(text, 17, expect)
- self.check_wrap(text, 19, expect)
- expect = ["You can also do--this or even",
- "---this."]
- self.check_wrap(text, 29, expect)
- self.check_wrap(text, 31, expect)
- expect = ["You can also do--this or even---",
- "this."]
- self.check_wrap(text, 32, expect)
- self.check_wrap(text, 35, expect)
-
- # All of the above behaviour could be deduced by probing the
- # _split() method.
- text = "Here's an -- em-dash and--here's another---and another!"
- expect = ["Here's", " ", "an", " ", "--", " ", "em-", "dash", " ",
- "and", "--", "here's", " ", "another", "---",
- "and", " ", "another!"]
- self.check_split(text, expect)
-
- text = "and then--bam!--he was gone"
- expect = ["and", " ", "then", "--", "bam!", "--",
- "he", " ", "was", " ", "gone"]
- self.check_split(text, expect)
-
-
- def test_unix_options (self) -> None:
- # Test that Unix-style command-line options are wrapped correctly.
- # Both Optik (OptionParser) and Docutils rely on this behaviour!
-
- text = "You should use the -n option, or --dry-run in its long form."
- self.check_wrap(text, 20,
- ["You should use the",
- "-n option, or --dry-",
- "run in its long",
- "form."])
- self.check_wrap(text, 21,
- ["You should use the -n",
- "option, or --dry-run",
- "in its long form."])
- expect = ["You should use the -n option, or",
- "--dry-run in its long form."]
- self.check_wrap(text, 32, expect)
- self.check_wrap(text, 34, expect)
- self.check_wrap(text, 35, expect)
- self.check_wrap(text, 38, expect)
- expect = ["You should use the -n option, or --dry-",
- "run in its long form."]
- self.check_wrap(text, 39, expect)
- self.check_wrap(text, 41, expect)
- expect = ["You should use the -n option, or --dry-run",
- "in its long form."]
- self.check_wrap(text, 42, expect)
-
- # Again, all of the above can be deduced from _split().
- text = "the -n option, or --dry-run or --dryrun"
- expect = ["the", " ", "-n", " ", "option,", " ", "or", " ",
- "--dry-", "run", " ", "or", " ", "--dryrun"]
- self.check_split(text, expect)
-
- def test_funky_hyphens (self) -> None:
- # Screwy edge cases cooked up by David Goodger. All reported
- # in SF bug #596434.
- self.check_split("what the--hey!", ["what", " ", "the", "--", "hey!"])
- self.check_split("what the--", ["what", " ", "the--"])
- self.check_split("what the--.", ["what", " ", "the--."])
- self.check_split("--text--.", ["--text--."])
-
- # When I first read bug #596434, this is what I thought David
- # was talking about. I was wrong; these have always worked
- # fine. The real problem is tested in test_funky_parens()
- # below...
- self.check_split("--option", ["--option"])
- self.check_split("--option-opt", ["--option-", "opt"])
- self.check_split("foo --option-opt bar",
- ["foo", " ", "--option-", "opt", " ", "bar"])
-
- def test_punct_hyphens(self) -> None:
- # Oh bother, SF #965425 found another problem with hyphens --
- # hyphenated words in single quotes weren't handled correctly.
- # In fact, the bug is that *any* punctuation around a hyphenated
- # word was handled incorrectly, except for a leading "--", which
- # was special-cased for Optik and Docutils. So test a variety
- # of styles of punctuation around a hyphenated word.
- # (Actually this is based on an Optik bug report, #813077).
- self.check_split("the 'wibble-wobble' widget",
- ['the', ' ', "'wibble-", "wobble'", ' ', 'widget'])
- self.check_split('the "wibble-wobble" widget',
- ['the', ' ', '"wibble-', 'wobble"', ' ', 'widget'])
- self.check_split("the (wibble-wobble) widget",
- ['the', ' ', "(wibble-", "wobble)", ' ', 'widget'])
- self.check_split("the ['wibble-wobble'] widget",
- ['the', ' ', "['wibble-", "wobble']", ' ', 'widget'])
-
- def test_funky_parens (self) -> None:
- # Second part of SF bug #596434: long option strings inside
- # parentheses.
- self.check_split("foo (--option) bar",
- ["foo", " ", "(--option)", " ", "bar"])
-
- # Related stuff -- make sure parens work in simpler contexts.
- self.check_split("foo (bar) baz",
- ["foo", " ", "(bar)", " ", "baz"])
- self.check_split("blah (ding dong), wubba",
- ["blah", " ", "(ding", " ", "dong),",
- " ", "wubba"])
-
- def test_initial_whitespace(self) -> None:
- # SF bug #622849 reported inconsistent handling of leading
- # whitespace; let's test that a bit, shall we?
- text = " This is a sentence with leading whitespace."
- self.check_wrap(text, 50,
- [" This is a sentence with leading whitespace."])
- self.check_wrap(text, 30,
- [" This is a sentence with", "leading whitespace."])
-
- def test_no_drop_whitespace(self) -> None:
- # SF patch #1581073
- text = " This is a sentence with much whitespace."
- self.check_wrap(text, 10,
- [" This is a", " ", "sentence ",
- "with ", "much white", "space."],
- drop_whitespace=False)
-
- def test_split(self) -> None:
- # Ensure that the standard _split() method works as advertised
- # in the comments
-
- text = "Hello there -- you goof-ball, use the -b option!"
-
- result = self.wrapper._split(text)
- self.check(result,
- ["Hello", " ", "there", " ", "--", " ", "you", " ", "goof-",
- "ball,", " ", "use", " ", "the", " ", "-b", " ", "option!"])
-
- def test_break_on_hyphens(self) -> None:
- # Ensure that the break_on_hyphens attributes work
- text = "yaba daba-doo"
- self.check_wrap(text, 10, ["yaba daba-", "doo"],
- break_on_hyphens=True)
- self.check_wrap(text, 10, ["yaba", "daba-doo"],
- break_on_hyphens=False)
-
- def test_bad_width(self) -> None:
- # Ensure that width <= 0 is caught.
- text = "Whatever, it doesn't matter."
- self.assertRaises(ValueError, wrap, text, 0)
- self.assertRaises(ValueError, wrap, text, -1)
-
- def test_no_split_at_umlaut(self) -> None:
- text = "Die Empf\xe4nger-Auswahl"
- self.check_wrap(text, 13, ["Die", "Empf\xe4nger-", "Auswahl"])
-
- def test_umlaut_followed_by_dash(self) -> None:
- text = "aa \xe4\xe4-\xe4\xe4"
- self.check_wrap(text, 7, ["aa \xe4\xe4-", "\xe4\xe4"])
-
-
-class LongWordTestCase (BaseTestCase):
- def setUp(self) -> None:
- self.wrapper = TextWrapper()
- self.text = '''\
-Did you say "supercalifragilisticexpialidocious?"
-How *do* you spell that odd word, anyways?
-'''
-
- def test_break_long(self) -> None:
- # Wrap text with long words and lots of punctuation
-
- self.check_wrap(self.text, 30,
- ['Did you say "supercalifragilis',
- 'ticexpialidocious?" How *do*',
- 'you spell that odd word,',
- 'anyways?'])
- self.check_wrap(self.text, 50,
- ['Did you say "supercalifragilisticexpialidocious?"',
- 'How *do* you spell that odd word, anyways?'])
-
- # SF bug 797650. Prevent an infinite loop by making sure that at
- # least one character gets split off on every pass.
- self.check_wrap('-'*10+'hello', 10,
- ['----------',
- ' h',
- ' e',
- ' l',
- ' l',
- ' o'],
- subsequent_indent = ' '*15)
-
- # bug 1146. Prevent a long word to be wrongly wrapped when the
- # preceding word is exactly one character shorter than the width
- self.check_wrap(self.text, 12,
- ['Did you say ',
- '"supercalifr',
- 'agilisticexp',
- 'ialidocious?',
- '" How *do*',
- 'you spell',
- 'that odd',
- 'word,',
- 'anyways?'])
-
- def test_nobreak_long(self) -> None:
- # Test with break_long_words disabled
- self.wrapper.break_long_words = False
- self.wrapper.width = 30
- expect = ['Did you say',
- '"supercalifragilisticexpialidocious?"',
- 'How *do* you spell that odd',
- 'word, anyways?'
- ]
- result = self.wrapper.wrap(self.text)
- self.check(result, expect)
-
- # Same thing with kwargs passed to standalone wrap() function.
- result = wrap(self.text, width=30, break_long_words=0)
- self.check(result, expect)
-
-
-class IndentTestCases(BaseTestCase):
-
- # called before each test method
- def setUp(self) -> None:
- self.text = '''\
-This paragraph will be filled, first without any indentation,
-and then with some (including a hanging indent).'''
-
-
- def test_fill(self) -> None:
- # Test the fill() method
-
- expect = '''\
-This paragraph will be filled, first
-without any indentation, and then with
-some (including a hanging indent).'''
-
- result = fill(self.text, 40)
- self.check(result, expect)
-
-
- def test_initial_indent(self) -> None:
- # Test initial_indent parameter
-
- expect = [" This paragraph will be filled,",
- "first without any indentation, and then",
- "with some (including a hanging indent)."]
- result = wrap(self.text, 40, initial_indent=" ")
- self.check(result, expect)
-
- expects = "\n".join(expect)
- results = fill(self.text, 40, initial_indent=" ")
- self.check(results, expects)
-
-
- def test_subsequent_indent(self) -> None:
- # Test subsequent_indent parameter
-
- expect = '''\
- * This paragraph will be filled, first
- without any indentation, and then
- with some (including a hanging
- indent).'''
-
- result = fill(self.text, 40,
- initial_indent=" * ", subsequent_indent=" ")
- self.check(result, expect)
-
-
-# Despite the similar names, DedentTestCase is *not* the inverse
-# of IndentTestCase!
-class DedentTestCase(unittest.TestCase):
-
- def assertUnchanged(self, text: str) -> None:
- """assert that dedent() has no effect on 'text'"""
- self.assertEqual(text, dedent(text))
-
- def test_dedent_nomargin(self) -> None:
- # No lines indented.
- text = "Hello there.\nHow are you?\nOh good, I'm glad."
- self.assertUnchanged(text)
-
- # Similar, with a blank line.
- text = "Hello there.\n\nBoo!"
- self.assertUnchanged(text)
-
- # Some lines indented, but overall margin is still zero.
- text = "Hello there.\n This is indented."
- self.assertUnchanged(text)
-
- # Again, add a blank line.
- text = "Hello there.\n\n Boo!\n"
- self.assertUnchanged(text)
-
- def test_dedent_even(self) -> None:
- # All lines indented by two spaces.
- text = " Hello there.\n How are ya?\n Oh good."
- expect = "Hello there.\nHow are ya?\nOh good."
- self.assertEqual(expect, dedent(text))
-
- # Same, with blank lines.
- text = " Hello there.\n\n How are ya?\n Oh good.\n"
- expect = "Hello there.\n\nHow are ya?\nOh good.\n"
- self.assertEqual(expect, dedent(text))
-
- # Now indent one of the blank lines.
- text = " Hello there.\n \n How are ya?\n Oh good.\n"
- expect = "Hello there.\n\nHow are ya?\nOh good.\n"
- self.assertEqual(expect, dedent(text))
-
- def test_dedent_uneven(self) -> None:
- # Lines indented unevenly.
- text = '''\
- def foo():
- while 1:
- return foo
- '''
- expect = '''\
-def foo():
- while 1:
- return foo
-'''
- self.assertEqual(expect, dedent(text))
-
- # Uneven indentation with a blank line.
- text = " Foo\n Bar\n\n Baz\n"
- expect = "Foo\n Bar\n\n Baz\n"
- self.assertEqual(expect, dedent(text))
-
- # Uneven indentation with a whitespace-only line.
- text = " Foo\n Bar\n \n Baz\n"
- expect = "Foo\n Bar\n\n Baz\n"
- self.assertEqual(expect, dedent(text))
-
- # dedent() should not mangle internal tabs
- def test_dedent_preserve_internal_tabs(self) -> None:
- text = " hello\tthere\n how are\tyou?"
- expect = "hello\tthere\nhow are\tyou?"
- self.assertEqual(expect, dedent(text))
-
- # make sure that it preserves tabs when it's not making any
- # changes at all
- self.assertEqual(expect, dedent(expect))
-
- # dedent() should not mangle tabs in the margin (i.e.
- # tabs and spaces both count as margin, but are *not*
- # considered equivalent)
- def test_dedent_preserve_margin_tabs(self) -> None:
- text = " hello there\n\thow are you?"
- self.assertUnchanged(text)
-
- # same effect even if we have 8 spaces
- text = " hello there\n\thow are you?"
- self.assertUnchanged(text)
-
- # dedent() only removes whitespace that can be uniformly removed!
- text = "\thello there\n\thow are you?"
- expect = "hello there\nhow are you?"
- self.assertEqual(expect, dedent(text))
-
- text = " \thello there\n \thow are you?"
- self.assertEqual(expect, dedent(text))
-
- text = " \t hello there\n \t how are you?"
- self.assertEqual(expect, dedent(text))
-
- text = " \thello there\n \t how are you?"
- expect = "hello there\n how are you?"
- self.assertEqual(expect, dedent(text))
-
-
-def test_main() -> None:
- support.run_unittest(WrapTestCase,
- LongWordTestCase,
- IndentTestCases,
- DedentTestCase)
-
-if __name__ == '__main__':
- test_main()
diff --git a/test-data/stdlib-samples/3.2/test/tf_inherit_check.py b/test-data/stdlib-samples/3.2/test/tf_inherit_check.py
deleted file mode 100644
index 92ebd95..0000000
--- a/test-data/stdlib-samples/3.2/test/tf_inherit_check.py
+++ /dev/null
@@ -1,25 +0,0 @@
-# Helper script for test_tempfile.py. argv[2] is the number of a file
-# descriptor which should _not_ be open. Check this by attempting to
-# write to it -- if we succeed, something is wrong.
-
-import sys
-import os
-
-verbose = (sys.argv[1] == 'v')
-try:
- fd = int(sys.argv[2])
-
- try:
- os.write(fd, b"blat")
- except os.error:
- # Success -- could not write to fd.
- sys.exit(0)
- else:
- if verbose:
- sys.stderr.write("fd %d is open in child" % fd)
- sys.exit(1)
-
-except Exception:
- if verbose:
- raise
- sys.exit(1)
diff --git a/test-data/stdlib-samples/3.2/textwrap.py b/test-data/stdlib-samples/3.2/textwrap.py
deleted file mode 100644
index a6d0266..0000000
--- a/test-data/stdlib-samples/3.2/textwrap.py
+++ /dev/null
@@ -1,391 +0,0 @@
-"""Text wrapping and filling.
-"""
-
-# Copyright (C) 1999-2001 Gregory P. Ward.
-# Copyright (C) 2002, 2003 Python Software Foundation.
-# Written by Greg Ward <gward at python.net>
-
-import string, re
-
-from typing import Dict, List, Any
-
-__all__ = ['TextWrapper', 'wrap', 'fill', 'dedent']
-
-# Hardcode the recognized whitespace characters to the US-ASCII
-# whitespace characters. The main reason for doing this is that in
-# ISO-8859-1, 0xa0 is non-breaking whitespace, so in certain locales
-# that character winds up in string.whitespace. Respecting
-# string.whitespace in those cases would 1) make textwrap treat 0xa0 the
-# same as any other whitespace char, which is clearly wrong (it's a
-# *non-breaking* space), 2) possibly cause problems with Unicode,
-# since 0xa0 is not in range(128).
-_whitespace = '\t\n\x0b\x0c\r '
-
-class TextWrapper:
- """
- Object for wrapping/filling text. The public interface consists of
- the wrap() and fill() methods; the other methods are just there for
- subclasses to override in order to tweak the default behaviour.
- If you want to completely replace the main wrapping algorithm,
- you'll probably have to override _wrap_chunks().
-
- Several instance attributes control various aspects of wrapping:
- width (default: 70)
- the maximum width of wrapped lines (unless break_long_words
- is false)
- initial_indent (default: "")
- string that will be prepended to the first line of wrapped
- output. Counts towards the line's width.
- subsequent_indent (default: "")
- string that will be prepended to all lines save the first
- of wrapped output; also counts towards each line's width.
- expand_tabs (default: true)
- Expand tabs in input text to spaces before further processing.
- Each tab will become 1 .. 8 spaces, depending on its position in
- its line. If false, each tab is treated as a single character.
- replace_whitespace (default: true)
- Replace all whitespace characters in the input text by spaces
- after tab expansion. Note that if expand_tabs is false and
- replace_whitespace is true, every tab will be converted to a
- single space!
- fix_sentence_endings (default: false)
- Ensure that sentence-ending punctuation is always followed
- by two spaces. Off by default because the algorithm is
- (unavoidably) imperfect.
- break_long_words (default: true)
- Break words longer than 'width'. If false, those words will not
- be broken, and some lines might be longer than 'width'.
- break_on_hyphens (default: true)
- Allow breaking hyphenated words. If true, wrapping will occur
- preferably on whitespaces and right after hyphens part of
- compound words.
- drop_whitespace (default: true)
- Drop leading and trailing whitespace from lines.
- """
-
- unicode_whitespace_trans = {} # type: Dict[int, int]
- uspace = ord(' ')
- for x in _whitespace:
- unicode_whitespace_trans[ord(x)] = uspace
-
- # This funky little regex is just the trick for splitting
- # text up into word-wrappable chunks. E.g.
- # "Hello there -- you goof-ball, use the -b option!"
- # splits into
- # Hello/ /there/ /--/ /you/ /goof-/ball,/ /use/ /the/ /-b/ /option!
- # (after stripping out empty strings).
- wordsep_re = re.compile(
- r'(\s+|' # any whitespace
- r'[^\s\w]*\w+[^0-9\W]-(?=\w+[^0-9\W])|' # hyphenated words
- r'(?<=[\w\!\"\'\&\.\,\?])-{2,}(?=\w))') # em-dash
-
- # This less funky little regex just split on recognized spaces. E.g.
- # "Hello there -- you goof-ball, use the -b option!"
- # splits into
- # Hello/ /there/ /--/ /you/ /goof-ball,/ /use/ /the/ /-b/ /option!/
- wordsep_simple_re = re.compile(r'(\s+)')
-
- # XXX this is not locale- or charset-aware -- string.lowercase
- # is US-ASCII only (and therefore English-only)
- sentence_end_re = re.compile(r'[a-z]' # lowercase letter
- r'[\.\!\?]' # sentence-ending punct.
- r'[\"\']?' # optional end-of-quote
- r'\Z') # end of chunk
-
-
- def __init__(self,
- width: int = 70,
- initial_indent: str = "",
- subsequent_indent: str = "",
- expand_tabs: bool = True,
- replace_whitespace: bool = True,
- fix_sentence_endings: bool = False,
- break_long_words: bool = True,
- drop_whitespace: bool = True,
- break_on_hyphens: bool = True) -> None:
- self.width = width
- self.initial_indent = initial_indent
- self.subsequent_indent = subsequent_indent
- self.expand_tabs = expand_tabs
- self.replace_whitespace = replace_whitespace
- self.fix_sentence_endings = fix_sentence_endings
- self.break_long_words = break_long_words
- self.drop_whitespace = drop_whitespace
- self.break_on_hyphens = break_on_hyphens
-
-
- # -- Private methods -----------------------------------------------
- # (possibly useful for subclasses to override)
-
- def _munge_whitespace(self, text: str) -> str:
- """_munge_whitespace(text : string) -> string
-
- Munge whitespace in text: expand tabs and convert all other
- whitespace characters to spaces. Eg. " foo\tbar\n\nbaz"
- becomes " foo bar baz".
- """
- if self.expand_tabs:
- text = text.expandtabs()
- if self.replace_whitespace:
- text = text.translate(self.unicode_whitespace_trans)
- return text
-
-
- def _split(self, text: str) -> List[str]:
- """_split(text : string) -> [string]
-
- Split the text to wrap into indivisible chunks. Chunks are
- not quite the same as words; see _wrap_chunks() for full
- details. As an example, the text
- Look, goof-ball -- use the -b option!
- breaks into the following chunks:
- 'Look,', ' ', 'goof-', 'ball', ' ', '--', ' ',
- 'use', ' ', 'the', ' ', '-b', ' ', 'option!'
- if break_on_hyphens is True, or in:
- 'Look,', ' ', 'goof-ball', ' ', '--', ' ',
- 'use', ' ', 'the', ' ', '-b', ' ', option!'
- otherwise.
- """
- if self.break_on_hyphens is True:
- chunks = self.wordsep_re.split(text)
- else:
- chunks = self.wordsep_simple_re.split(text)
- chunks = [c for c in chunks if c]
- return chunks
-
- def _fix_sentence_endings(self, chunks: List[str]) -> None:
- """_fix_sentence_endings(chunks : [string])
-
- Correct for sentence endings buried in 'chunks'. Eg. when the
- original text contains "... foo.\nBar ...", munge_whitespace()
- and split() will convert that to [..., "foo.", " ", "Bar", ...]
- which has one too few spaces; this method simply changes the one
- space to two.
- """
- i = 0
- patsearch = self.sentence_end_re.search
- while i < len(chunks)-1:
- if chunks[i+1] == " " and patsearch(chunks[i]):
- chunks[i+1] = " "
- i += 2
- else:
- i += 1
-
- def _handle_long_word(self, reversed_chunks: List[str],
- cur_line: List[str], cur_len: int,
- width: int) -> None:
- """_handle_long_word(chunks : [string],
- cur_line : [string],
- cur_len : int, width : int)
-
- Handle a chunk of text (most likely a word, not whitespace) that
- is too long to fit in any line.
- """
- # Figure out when indent is larger than the specified width, and make
- # sure at least one character is stripped off on every pass
- if width < 1:
- space_left = 1
- else:
- space_left = width - cur_len
-
- # If we're allowed to break long words, then do so: put as much
- # of the next chunk onto the current line as will fit.
- if self.break_long_words:
- cur_line.append(reversed_chunks[-1][:space_left])
- reversed_chunks[-1] = reversed_chunks[-1][space_left:]
-
- # Otherwise, we have to preserve the long word intact. Only add
- # it to the current line if there's nothing already there --
- # that minimizes how much we violate the width constraint.
- elif not cur_line:
- cur_line.append(reversed_chunks.pop())
-
- # If we're not allowed to break long words, and there's already
- # text on the current line, do nothing. Next time through the
- # main loop of _wrap_chunks(), we'll wind up here again, but
- # cur_len will be zero, so the next line will be entirely
- # devoted to the long word that we can't handle right now.
-
- def _wrap_chunks(self, chunks: List[str]) -> List[str]:
- """_wrap_chunks(chunks : [string]) -> [string]
-
- Wrap a sequence of text chunks and return a list of lines of
- length 'self.width' or less. (If 'break_long_words' is false,
- some lines may be longer than this.) Chunks correspond roughly
- to words and the whitespace between them: each chunk is
- indivisible (modulo 'break_long_words'), but a line break can
- come between any two chunks. Chunks should not have internal
- whitespace; ie. a chunk is either all whitespace or a "word".
- Whitespace chunks will be removed from the beginning and end of
- lines, but apart from that whitespace is preserved.
- """
- lines = [] # type: List[str]
- if self.width <= 0:
- raise ValueError("invalid width %r (must be > 0)" % self.width)
-
- # Arrange in reverse order so items can be efficiently popped
- # from a stack of chucks.
- chunks.reverse()
-
- while chunks:
-
- # Start the list of chunks that will make up the current line.
- # cur_len is just the length of all the chunks in cur_line.
- cur_line = [] # type: List[str]
- cur_len = 0
-
- # Figure out which static string will prefix this line.
- if lines:
- indent = self.subsequent_indent
- else:
- indent = self.initial_indent
-
- # Maximum width for this line.
- width = self.width - len(indent)
-
- # First chunk on line is whitespace -- drop it, unless this
- # is the very beginning of the text (ie. no lines started yet).
- if self.drop_whitespace and chunks[-1].strip() == '' and lines:
- del chunks[-1]
-
- while chunks:
- l = len(chunks[-1])
-
- # Can at least squeeze this chunk onto the current line.
- if cur_len + l <= width:
- cur_line.append(chunks.pop())
- cur_len += l
-
- # Nope, this line is full.
- else:
- break
-
- # The current line is full, and the next chunk is too big to
- # fit on *any* line (not just this one).
- if chunks and len(chunks[-1]) > width:
- self._handle_long_word(chunks, cur_line, cur_len, width)
-
- # If the last chunk on this line is all whitespace, drop it.
- if self.drop_whitespace and cur_line and cur_line[-1].strip() == '':
- del cur_line[-1]
-
- # Convert current line back to a string and store it in list
- # of all lines (return value).
- if cur_line:
- lines.append(indent + ''.join(cur_line))
-
- return lines
-
-
- # -- Public interface ----------------------------------------------
-
- def wrap(self, text: str) -> List[str]:
- """wrap(text : string) -> [string]
-
- Reformat the single paragraph in 'text' so it fits in lines of
- no more than 'self.width' columns, and return a list of wrapped
- lines. Tabs in 'text' are expanded with string.expandtabs(),
- and all other whitespace characters (including newline) are
- converted to space.
- """
- text = self._munge_whitespace(text)
- chunks = self._split(text)
- if self.fix_sentence_endings:
- self._fix_sentence_endings(chunks)
- return self._wrap_chunks(chunks)
-
- def fill(self, text: str) -> str:
- """fill(text : string) -> string
-
- Reformat the single paragraph in 'text' to fit in lines of no
- more than 'self.width' columns, and return a new string
- containing the entire wrapped paragraph.
- """
- return "\n".join(self.wrap(text))
-
-
-# -- Convenience interface ---------------------------------------------
-
-def wrap(text: str, width: int = 70, **kwargs: Any) -> List[str]:
- """Wrap a single paragraph of text, returning a list of wrapped lines.
-
- Reformat the single paragraph in 'text' so it fits in lines of no
- more than 'width' columns, and return a list of wrapped lines. By
- default, tabs in 'text' are expanded with string.expandtabs(), and
- all other whitespace characters (including newline) are converted to
- space. See TextWrapper class for available keyword args to customize
- wrapping behaviour.
- """
- w = TextWrapper(width=width, **kwargs)
- return w.wrap(text)
-
-def fill(text: str, width: int = 70, **kwargs: Any) -> str:
- """Fill a single paragraph of text, returning a new string.
-
- Reformat the single paragraph in 'text' to fit in lines of no more
- than 'width' columns, and return a new string containing the entire
- wrapped paragraph. As with wrap(), tabs are expanded and other
- whitespace characters converted to space. See TextWrapper class for
- available keyword args to customize wrapping behaviour.
- """
- w = TextWrapper(width=width, **kwargs)
- return w.fill(text)
-
-
-# -- Loosely related functionality -------------------------------------
-
-_whitespace_only_re = re.compile('^[ \t]+$', re.MULTILINE)
-_leading_whitespace_re = re.compile('(^[ \t]*)(?:[^ \t\n])', re.MULTILINE)
-
-def dedent(text: str) -> str:
- """Remove any common leading whitespace from every line in `text`.
-
- This can be used to make triple-quoted strings line up with the left
- edge of the display, while still presenting them in the source code
- in indented form.
-
- Note that tabs and spaces are both treated as whitespace, but they
- are not equal: the lines " hello" and "\thello" are
- considered to have no common leading whitespace. (This behaviour is
- new in Python 2.5; older versions of this module incorrectly
- expanded tabs before searching for common leading whitespace.)
- """
- # Look for the longest leading string of spaces and tabs common to
- # all lines.
- margin = None # type: str
- text = _whitespace_only_re.sub('', text)
- indents = _leading_whitespace_re.findall(text)
- for indent in indents:
- if margin is None:
- margin = indent
-
- # Current line more deeply indented than previous winner:
- # no change (previous winner is still on top).
- elif indent.startswith(margin):
- pass
-
- # Current line consistent with and no deeper than previous winner:
- # it's the new winner.
- elif margin.startswith(indent):
- margin = indent
-
- # Current line and previous winner have no common whitespace:
- # there is no margin.
- else:
- margin = ""
- break
-
- # sanity check (testing/debugging only)
- if 0 and margin:
- for line in text.split("\n"):
- assert not line or line.startswith(margin), \
- "line = %r, margin = %r" % (line, margin)
-
- if margin:
- text = re.sub(r'(?m)^' + margin, '', text)
- return text
-
-if __name__ == "__main__":
- #print dedent("\tfoo\n\tbar")
- #print dedent(" \thello there\n \t how are you?")
- print(dedent("Hello there.\n This is indented."))
diff --git a/test-data/unit/check-abstract.test b/test-data/unit/check-abstract.test
deleted file mode 100644
index 1caeabf..0000000
--- a/test-data/unit/check-abstract.test
+++ /dev/null
@@ -1,734 +0,0 @@
--- Type checker test cases for abstract classes.
-
-
--- Subtyping with abstract classes
--- -------------------------------
-
-
-[case testAbstractClassSubclasses]
-
-from abc import abstractmethod, ABCMeta
-
-i = None # type: I
-j = None # type: J
-a = None # type: A
-b = None # type: B
-c = None # type: C
-
-j = c # E: Incompatible types in assignment (expression has type "C", variable has type "J")
-a = i # E: Incompatible types in assignment (expression has type "I", variable has type "A")
-a = j # E: Incompatible types in assignment (expression has type "J", variable has type "A")
-b = i # E: Incompatible types in assignment (expression has type "I", variable has type "B")
-
-i = a
-i = b
-i = c
-j = a
-j = b
-a = b
-
-class I(metaclass=ABCMeta):
- @abstractmethod
- def f(self): pass
-class J(metaclass=ABCMeta):
- @abstractmethod
- def g(self): pass
-class A(I, J): pass
-class B(A): pass
-class C(I): pass
-
-[case testAbstractClassSubtypingViaExtension]
-
-from abc import abstractmethod, ABCMeta
-
-i = None # type: I
-j = None # type: J
-a = None # type: A
-o = None # type: object
-
-j = i # E: Incompatible types in assignment (expression has type "I", variable has type "J")
-a = i # E: Incompatible types in assignment (expression has type "I", variable has type "A")
-a = j # E: Incompatible types in assignment (expression has type "J", variable has type "A")
-i = o # E: Incompatible types in assignment (expression has type "object", variable has type "I")
-j = o # E: Incompatible types in assignment (expression has type "object", variable has type "J")
-
-i = a
-j = a
-i = j
-o = i
-o = j
-
-class I(metaclass=ABCMeta):
- @abstractmethod
- def f(self): pass
-class J(I): pass
-class A(J): pass
-
-[case testInheritingAbstractClassInSubclass]
-
-from abc import abstractmethod, ABCMeta
-
-i = None # type: I
-a = None # type: A
-b = None # type: B
-
-i = a # E: Incompatible types in assignment (expression has type "A", variable has type "I")
-b = a # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-
-a = b
-i = b
-
-class I(metaclass=ABCMeta):
- @abstractmethod
- def f(self): pass
-class A: pass
-class B(A, I): pass
-
-
--- Abstract class objects
--- ----------------------
-
-
-[case testAbstractClassAsTypeObject]
-
-from abc import abstractmethod, ABCMeta
-
-o = None # type: object
-t = None # type: type
-
-o = I
-t = I
-
-class I(metaclass=ABCMeta):
- @abstractmethod
- def f(self): pass
-
-[case testAbstractClassInCasts]
-from typing import cast
-from abc import abstractmethod, ABCMeta
-
-class I(metaclass=ABCMeta):
- @abstractmethod
- def f(self): pass
-class A(I): pass
-class B: pass
-
-i, a, b = None, None, None # type: (I, A, B)
-o = None # type: object
-
-a = cast(I, o) # E: Incompatible types in assignment (expression has type "I", variable has type "A")
-b = cast(B, i) # Ok; a subclass of B might inherit I
-i = cast(I, b) # Ok; a subclass of B might inherit I
-
-i = cast(I, o)
-i = cast(I, a)
-
-[case testInstantiatingClassThatImplementsAbstractMethod]
-from abc import abstractmethod, ABCMeta
-import typing
-class A(metaclass=ABCMeta):
- @abstractmethod
- def f(self): pass
-class B(A):
- def f(self): pass
-B()
-[out]
-
-[case testInstantiatingAbstractClass]
-from abc import abstractmethod, ABCMeta
-import typing
-class A(metaclass=ABCMeta): pass
-class B(metaclass=ABCMeta):
- @abstractmethod
- def f(self): pass
-A() # OK
-B() # E: Cannot instantiate abstract class 'B' with abstract attribute 'f'
-[out]
-
-[case testInstantiatingClassWithInheritedAbstractMethod]
-from abc import abstractmethod, ABCMeta
-import typing
-class A(metaclass=ABCMeta):
- @abstractmethod
- def f(self): pass
- @abstractmethod
- def g(self): pass
-class B(A): pass
-B()# E: Cannot instantiate abstract class 'B' with abstract attributes 'f' and 'g'
-[out]
-
-[case testInstantiatingClassWithInheritedAbstractMethodAndSuppression]
-from abc import abstractmethod, ABCMeta
-import typing
-class A(metaclass=ABCMeta):
- @abstractmethod
- def a(self): pass
- @abstractmethod
- def b(self): pass
- @abstractmethod
- def c(self): pass
- @abstractmethod
- def d(self): pass
- @abstractmethod
- def e(self): pass
- @abstractmethod
- def f(self): pass
- @abstractmethod
- def g(self): pass
- @abstractmethod
- def h(self): pass
- @abstractmethod
- def i(self): pass
- @abstractmethod
- def j(self): pass
-a = A() # E: Cannot instantiate abstract class 'A' with abstract attributes 'a', 'b', ... and 'j' (7 methods suppressed)
-[out]
-
-
--- Implementing abstract methods
--- -----------------------------
-
-
-[case testImplementingAbstractMethod]
-from abc import abstractmethod, ABCMeta
-import typing
-class A(metaclass=ABCMeta):
- @abstractmethod
- def f(self, x: int) -> int: pass
- @abstractmethod
- def g(self, x: int) -> int: pass
-class B(A):
- def f(self, x: str) -> int: \
- # E: Argument 1 of "f" incompatible with supertype "A"
- pass
- def g(self, x: int) -> int: pass
-[out]
-
-[case testImplementingAbstractMethodWithMultipleBaseClasses]
-from abc import abstractmethod, ABCMeta
-import typing
-class I(metaclass=ABCMeta):
- @abstractmethod
- def f(self, x: int) -> int: pass
-class J(metaclass=ABCMeta):
- @abstractmethod
- def g(self, x: str) -> str: pass
-class A(I, J):
- def f(self, x: str) -> int: pass \
- # E: Argument 1 of "f" incompatible with supertype "I"
- def g(self, x: str) -> int: pass \
- # E: Return type of "g" incompatible with supertype "J"
- def h(self) -> int: pass # Not related to any base class
-[out]
-
-[case testImplementingAbstractMethodWithExtension]
-from abc import abstractmethod, ABCMeta
-import typing
-class J(metaclass=ABCMeta):
- @abstractmethod
- def f(self, x: int) -> int: pass
-class I(J): pass
-class A(I):
- def f(self, x: str) -> int: pass \
- # E: Argument 1 of "f" incompatible with supertype "J"
-[out]
-
-[case testInvalidOverridingAbstractMethod]
-from abc import abstractmethod, ABCMeta
-import typing
-class J(metaclass=ABCMeta):
- @abstractmethod
- def f(self, x: 'J') -> None: pass
-class I(J):
- @abstractmethod
- def f(self, x: 'I') -> None: pass # E: Argument 1 of "f" incompatible with supertype "J"
-[out]
-
-[case testAbstractClassCoAndContraVariance]
-from abc import abstractmethod, ABCMeta
-import typing
-class I(metaclass=ABCMeta):
- @abstractmethod
- def f(self, a: A) -> 'I': pass
- @abstractmethod
- def g(self, a: A) -> 'I': pass
- @abstractmethod
- def h(self, a: 'I') -> A: pass
-class A(I):
- def h(self, a: 'A') -> 'I': # Fail
- pass
- def f(self, a: 'I') -> 'I':
- pass
- def g(self, a: 'A') -> 'A':
- pass
-[out]
-main:11: error: Argument 1 of "h" incompatible with supertype "I"
-main:11: error: Return type of "h" incompatible with supertype "I"
-
-
--- Accessing abstract members
--- --------------------------
-
-
-[case testAccessingAbstractMethod]
-
-from abc import abstractmethod, ABCMeta
-
-class I(metaclass=ABCMeta):
- @abstractmethod
- def f(self, a: int) -> str: pass
-
-i, a, b = None, None, None # type: (I, int, str)
-
-a = i.f(a) # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-b = i.f(b) # E: Argument 1 to "f" of "I" has incompatible type "str"; expected "int"
-i.g() # E: "I" has no attribute "g"
-
-b = i.f(a)
-
-[case testAccessingInheritedAbstractMethod]
-
-from abc import abstractmethod, ABCMeta
-
-class J(metaclass=ABCMeta):
- @abstractmethod
- def f(self, a: int) -> str: pass
-class I(J): pass
-
-i, a, b = None, None, None # type: (I, int, str)
-
-a = i.f(1) # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-b = i.f(1)
-
-
--- Any (dynamic) types
--- -------------------
-
-
-[case testAbstractClassWithAllDynamicTypes]
-from abc import abstractmethod, ABCMeta
-import typing
-class I(metaclass=ABCMeta):
- @abstractmethod
- def f(self, x): pass
- @abstractmethod
- def g(self, x): pass
-class A(I):
- def f(self, x): pass
- def g(self, x, y) -> None: pass \
- # E: Signature of "g" incompatible with supertype "I"
-[out]
-
-[case testAbstractClassWithAllDynamicTypes2]
-from abc import abstractmethod, ABCMeta
-import typing
-class I(metaclass=ABCMeta):
- @abstractmethod
- def f(self, x): pass
- @abstractmethod
- def g(self, x): pass
-class A(I):
- def f(self, x): pass
- def g(self, x, y): pass
-[out]
-
-[case testAbstractClassWithImplementationUsingDynamicTypes]
-from abc import abstractmethod, ABCMeta
-import typing
-class I(metaclass=ABCMeta):
- @abstractmethod
- def f(self, x: int) -> None: pass
- @abstractmethod
- def g(self, x: int) -> None: pass
-class A(I):
- def f(self, x): pass
- def g(self, x, y): pass
-[out]
-
-
--- Special cases
--- -------------
-
-
-[case testMultipleAbstractBases]
-from abc import abstractmethod, ABCMeta
-import typing
-class A(metaclass=ABCMeta):
- @abstractmethod
- def f(self) -> None: pass
-class B(metaclass=ABCMeta):
- @abstractmethod
- def g(self) -> None: pass
-class C(A, B):
- @abstractmethod
- def h(self) -> None: pass
-
-[case testMemberAccessWithMultipleAbstractBaseClasses]
-
-from abc import abstractmethod, ABCMeta
-
-class A(metaclass=ABCMeta):
- @abstractmethod
- def f(self) -> None: pass
-class B(metaclass=ABCMeta):
- @abstractmethod
- def g(self) -> None: pass
-class C(A, B): pass
-x = None # type: C
-x.f()
-x.g()
-x.f(x) # E: Too many arguments for "f" of "A"
-x.g(x) # E: Too many arguments for "g" of "B"
-
-[case testInstantiatingAbstractClassWithMultipleBaseClasses]
-
-from abc import abstractmethod, ABCMeta
-
-class A(metaclass=ABCMeta):
- @abstractmethod
- def f(self) -> None: pass
-class B(metaclass=ABCMeta):
- @abstractmethod
- def g(self) -> None: pass
-class C(A, B):
- def f(self) -> None: pass
-class D(A, B):
- def g(self) -> None: pass
-class E(A, B):
- def f(self) -> None: pass
- def g(self) -> None: pass
-C() # E: Cannot instantiate abstract class 'C' with abstract attribute 'g'
-D() # E: Cannot instantiate abstract class 'D' with abstract attribute 'f'
-E()
-
-[case testInconsistentMro]
-from abc import abstractmethod, ABCMeta
-import typing
-
-class A(metaclass=ABCMeta): pass
-class B(object, A): pass \
- # E: Cannot determine consistent method resolution order (MRO) for "B"
-
-[case testOverloadedAbstractMethod]
-from abc import abstractmethod, ABCMeta
-from typing import overload
-
-class A(metaclass=ABCMeta):
- @abstractmethod
- @overload
- def f(self, x: int) -> int: pass
- @abstractmethod
- @overload
- def f(self, x: str) -> str: pass
-
-class B(A):
- @overload
- def f(self, x: int) -> int: pass
- @overload
- def f(self, x: str) -> str: pass
-A() # E: Cannot instantiate abstract class 'A' with abstract attribute 'f'
-B()
-B().f(1)
-a = B() # type: A
-a.f(1)
-a.f('')
-a.f(B()) # E: No overload variant of "f" of "A" matches argument types [__main__.B]
-
-[case testOverloadedAbstractMethodWithAlternativeDecoratorOrder]
-from abc import abstractmethod, ABCMeta
-from typing import overload
-
-class A(metaclass=ABCMeta):
- @overload
- @abstractmethod
- def f(self, x: int) -> int: pass
- @overload
- @abstractmethod
- def f(self, x: str) -> str: pass
-
-class B(A):
- @overload
- def f(self, x: int) -> int: pass
- @overload
- def f(self, x: str) -> str: pass
-A() # E: Cannot instantiate abstract class 'A' with abstract attribute 'f'
-B()
-B().f(1)
-a = B() # type: A
-a.f(1)
-a.f('')
-a.f(B()) # E: No overload variant of "f" of "A" matches argument types [__main__.B]
-
-[case testOverloadedAbstractMethodVariantMissingDecorator1]
-from abc import abstractmethod, ABCMeta
-from typing import overload
-
-class A(metaclass=ABCMeta):
- @abstractmethod \
- # E: Overloaded method has both abstract and non-abstract variants
- @overload
- def f(self, x: int) -> int: pass
- @overload
- def f(self, x: str) -> str: pass
-[out]
-
-[case testOverloadedAbstractMethodVariantMissingDecorator1]
-from abc import abstractmethod, ABCMeta
-from typing import overload
-
-class A(metaclass=ABCMeta):
- @overload \
- # E: Overloaded method has both abstract and non-abstract variants
- def f(self, x: int) -> int: pass
- @abstractmethod
- @overload
- def f(self, x: str) -> str: pass
-[out]
-
-[case testMultipleInheritanceAndAbstractMethod]
-import typing
-from abc import abstractmethod, ABCMeta
-class A:
- def f(self, x: str) -> None: pass
-class B(metaclass=ABCMeta):
- @abstractmethod
- def f(self, x: str) -> None: pass
-class C(A, B): pass
-
-[case testMultipleInheritanceAndAbstractMethod2]
-import typing
-from abc import abstractmethod, ABCMeta
-class A:
- def f(self, x: str) -> None: pass
-class B(metaclass=ABCMeta):
- @abstractmethod
- def f(self, x: int) -> None: pass
-class C(A, B): pass
-[out]
-main:8: error: Definition of "f" in base class "A" is incompatible with definition in base class "B"
-
-[case testCallAbstractMethodBeforeDefinition]
-import typing
-from abc import abstractmethod, ABCMeta
-class A(metaclass=ABCMeta):
- def f(self) -> None:
- self.g(1) # E: Argument 1 to "g" of "A" has incompatible type "int"; expected "str"
- @abstractmethod
- def g(self, x: str) -> None: pass
-[out]
-
-[case testAbstractOperatorMethods1]
-import typing
-from abc import abstractmethod, ABCMeta
-class A(metaclass=ABCMeta):
- @abstractmethod
- def __lt__(self, other: 'A') -> int: pass
- @abstractmethod
- def __gt__(self, other: 'A') -> int: pass
-
-[case testAbstractOperatorMethods2]
-import typing
-from abc import abstractmethod, ABCMeta
-class A(metaclass=ABCMeta):
- @abstractmethod
- def __radd__(self, other: 'C') -> str: pass # Error
-class B:
- @abstractmethod
- def __add__(self, other: 'A') -> int: pass
-class C:
- def __add__(self, other: int) -> B: pass
-[out]
-
-
--- Abstract properties
--- -------------------
-
-
-[case testReadOnlyAbstractProperty]
-from abc import abstractproperty, ABCMeta
-class A(metaclass=ABCMeta):
- @abstractproperty
- def x(self) -> int: pass
-def f(a: A) -> None:
- a.x() # E: "int" not callable
- a.x = 1 # E: Property "x" defined in "A" is read-only
-[out]
-
-[case testReadOnlyAbstractPropertyForwardRef]
-from abc import abstractproperty, ABCMeta
-def f(a: A) -> None:
- a.x() # E: "int" not callable
- a.x = 1 # E: Property "x" defined in "A" is read-only
-class A(metaclass=ABCMeta):
- @abstractproperty
- def x(self) -> int: pass
-[out]
-
-[case testReadWriteAbstractProperty]
-from abc import abstractproperty, ABCMeta
-def f(a: A) -> None:
- a.x.y # E: "int" has no attribute "y"
- a.x = 1
-class A(metaclass=ABCMeta):
- @abstractproperty
- def x(self) -> int: pass
- @x.setter
- def x(self, x: int) -> None: pass
-[out]
-
-[case testInstantiateClassWithReadOnlyAbstractProperty]
-from abc import abstractproperty, ABCMeta
-class A(metaclass=ABCMeta):
- @abstractproperty
- def x(self) -> int: pass
-class B(A): pass
-b = B() # E: Cannot instantiate abstract class 'B' with abstract attribute 'x'
-
-[case testInstantiateClassWithReadWriteAbstractProperty]
-from abc import abstractproperty, ABCMeta
-class A(metaclass=ABCMeta):
- @abstractproperty
- def x(self) -> int: pass
- @x.setter
- def x(self, x: int) -> None: pass
-class B(A): pass
-b = B() # E: Cannot instantiate abstract class 'B' with abstract attribute 'x'
-
-[case testImplementAbstractPropertyViaProperty]
-from abc import abstractproperty, ABCMeta
-class A(metaclass=ABCMeta):
- @abstractproperty
- def x(self) -> int: pass
-class B(A):
- @property
- def x(self) -> int: pass
-b = B()
-b.x() # E: "int" not callable
-[builtins fixtures/property.pyi]
-
-[case testImplementReradWriteAbstractPropertyViaProperty]
-from abc import abstractproperty, ABCMeta
-class A(metaclass=ABCMeta):
- @abstractproperty
- def x(self) -> int: pass
- @x.setter
- def x(self, v: int) -> None: pass
-class B(A):
- @property
- def x(self) -> int: pass
- @x.setter
- def x(self, v: int) -> None: pass
-b = B()
-b.x.y # E: "int" has no attribute "y"
-[builtins fixtures/property.pyi]
-
-[case testImplementAbstractPropertyViaPropertyInvalidType]
-from abc import abstractproperty, ABCMeta
-class A(metaclass=ABCMeta):
- @abstractproperty
- def x(self) -> int: pass
-class B(A):
- @property
- def x(self) -> str: pass # E
-b = B()
-b.x() # E
-[builtins fixtures/property.pyi]
-[out]
-main:7: error: Return type of "x" incompatible with supertype "A"
-main:9: error: "str" not callable
-
-[case testCantImplementAbstractPropertyViaInstanceVariable]
-from abc import abstractproperty, ABCMeta
-class A(metaclass=ABCMeta):
- @abstractproperty
- def x(self) -> int: pass
-class B(A):
- def __init__(self) -> None:
- self.x = 1 # E
-b = B() # E
-b.x.y # E
-[builtins fixtures/property.pyi]
-[out]
-main:7: error: Property "x" defined in "B" is read-only
-main:8: error: Cannot instantiate abstract class 'B' with abstract attribute 'x'
-main:9: error: "int" has no attribute "y"
-
-[case testSuperWithAbstractProperty]
-from abc import abstractproperty, ABCMeta
-class A(metaclass=ABCMeta):
- @abstractproperty
- def x(self) -> int: pass
-class B(A):
- @property
- def x(self) -> int:
- return super().x.y # E: "int" has no attribute "y"
-[builtins fixtures/property.pyi]
-[out]
-
-[case testSuperWithReadWriteAbstractProperty]
-from abc import abstractproperty, ABCMeta
-class A(metaclass=ABCMeta):
- @abstractproperty
- def x(self) -> int: pass
- @x.setter
- def x(self, v: int) -> None: pass
-class B(A):
- @property
- def x(self) -> int:
- return super().x.y # E
- @x.setter
- def x(self, v: int) -> None:
- super().x = '' # E
-[builtins fixtures/property.pyi]
-[out]
-main:10: error: "int" has no attribute "y"
-main:13: error: Invalid assignment target
-
-[case testOnlyImplementGetterOfReadWriteAbstractProperty]
-from abc import abstractproperty, ABCMeta
-class A(metaclass=ABCMeta):
- @abstractproperty
- def x(self) -> int: pass
- @x.setter
- def x(self, v: int) -> None: pass
-class B(A):
- @property # E
- def x(self) -> int: pass
-b = B()
-b.x.y # E
-[builtins fixtures/property.pyi]
-[out]
-main:8: error: Read-only property cannot override read-write property
-main:11: error: "int" has no attribute "y"
-
-[case testDynamicallyTypedReadOnlyAbstractProperty]
-from abc import abstractproperty, ABCMeta
-class A(metaclass=ABCMeta):
- @abstractproperty
- def x(self): pass
-def f(a: A) -> None:
- a.x.y
- a.x = 1 # E: Property "x" defined in "A" is read-only
-[out]
-
-[case testDynamicallyTypedReadOnlyAbstractPropertyForwardRef]
-from abc import abstractproperty, ABCMeta
-def f(a: A) -> None:
- a.x.y
- a.x = 1 # E: Property "x" defined in "A" is read-only
-class A(metaclass=ABCMeta):
- @abstractproperty
- def x(self): pass
-[out]
-
-[case testDynamicallyTypedReadWriteAbstractProperty]
-from abc import abstractproperty, ABCMeta
-def f(a: A) -> None:
- a.x.y
- a.x = 1
-class A(metaclass=ABCMeta):
- @abstractproperty
- def x(self): pass
- @x.setter
- def x(self, x): pass
-[out]
diff --git a/test-data/unit/check-async-await.test b/test-data/unit/check-async-await.test
deleted file mode 100644
index 0758165..0000000
--- a/test-data/unit/check-async-await.test
+++ /dev/null
@@ -1,376 +0,0 @@
--- Tests for async def and await (PEP 492)
--- ---------------------------------------
-
-[case testAsyncDefPass]
-# flags: --fast-parser
-async def f() -> int:
- pass
-[builtins fixtures/async_await.pyi]
-
-[case testAsyncDefReturn]
-# flags: --fast-parser
-async def f() -> int:
- return 0
-reveal_type(f()) # E: Revealed type is 'typing.Awaitable[builtins.int]'
-[builtins fixtures/async_await.pyi]
-
-[case testAwaitCoroutine]
-# flags: --fast-parser
-async def f() -> int:
- x = await f()
- reveal_type(x) # E: Revealed type is 'builtins.int*'
- return x
-[builtins fixtures/async_await.pyi]
-[out]
-
-[case testAwaitDefaultContext]
-# flags: --fast-parser
-from typing import TypeVar
-T = TypeVar('T')
-async def f(x: T) -> T:
- y = await f(x)
- reveal_type(y)
- return y
-[out]
-main:6: error: Revealed type is 'T`-1'
-
-[case testAwaitAnyContext]
-# flags: --fast-parser
-from typing import Any, TypeVar
-T = TypeVar('T')
-async def f(x: T) -> T:
- y = await f(x) # type: Any
- reveal_type(y)
- return y
-[out]
-main:6: error: Revealed type is 'Any'
-
-[case testAwaitExplicitContext]
-# flags: --fast-parser
-from typing import TypeVar
-T = TypeVar('T')
-async def f(x: T) -> T:
- y = await f(x) # type: int
- reveal_type(y)
-[out]
-main:5: error: Argument 1 to "f" has incompatible type "T"; expected "int"
-main:6: error: Revealed type is 'builtins.int'
-
-[case testAwaitGeneratorError]
-# flags: --fast-parser
-from typing import Any, Generator
-def g() -> Generator[int, None, str]:
- yield 0
- return ''
-async def f() -> int:
- x = await g()
- return x
-[out]
-main:7: error: Incompatible types in await (actual type Generator[int, None, str], expected type "Awaitable")
-
-[case testAwaitIteratorError]
-# flags: --fast-parser
-from typing import Any, Iterator
-def g() -> Iterator[Any]:
- yield
-async def f() -> int:
- x = await g()
- return x
-[out]
-main:6: error: Incompatible types in await (actual type Iterator[Any], expected type "Awaitable")
-
-[case testAwaitArgumentError]
-# flags: --fast-parser
-def g() -> int:
- return 0
-async def f() -> int:
- x = await g()
- return x
-[builtins fixtures/async_await.pyi]
-[out]
-main:5: error: Incompatible types in await (actual type "int", expected type "Awaitable")
-
-[case testAwaitResultError]
-# flags: --fast-parser
-async def g() -> int:
- return 0
-async def f() -> str:
- x = await g() # type: str
-[builtins fixtures/async_await.pyi]
-[out]
-main:5: error: Incompatible types in assignment (expression has type "int", variable has type "str")
-
-[case testAwaitReturnError]
-# flags: --fast-parser
-async def g() -> int:
- return 0
-async def f() -> str:
- x = await g()
- return x
-[builtins fixtures/async_await.pyi]
-[out]
-main:6: error: Incompatible return value type (got "int", expected "str")
-
-[case testAsyncFor]
-# flags: --fast-parser
-from typing import AsyncIterator
-class C(AsyncIterator[int]):
- async def __anext__(self) -> int: return 0
-async def f() -> None:
- async for x in C():
- reveal_type(x) # E: Revealed type is 'builtins.int*'
-[builtins fixtures/async_await.pyi]
-[out]
-
-[case testAsyncForError]
-# flags: --fast-parser
-from typing import AsyncIterator
-async def f() -> None:
- async for x in [1]:
- pass
-[builtins fixtures/async_await.pyi]
-[out]
-main:4: error: AsyncIterable expected
-main:4: error: List[int] has no attribute "__aiter__"
-
-[case testAsyncWith]
-# flags: --fast-parser
-class C:
- async def __aenter__(self) -> int: pass
- async def __aexit__(self, x, y, z) -> None: pass
-async def f() -> None:
- async with C() as x:
- reveal_type(x) # E: Revealed type is 'builtins.int*'
-[builtins fixtures/async_await.pyi]
-[out]
-
-[case testAsyncWithError]
-# flags: --fast-parser
-class C:
- def __enter__(self) -> int: pass
- def __exit__(self, x, y, z) -> None: pass
-async def f() -> None:
- async with C() as x:
- pass
-[builtins fixtures/async_await.pyi]
-[out]
-main:6: error: "C" has no attribute "__aenter__"; maybe "__enter__"?
-main:6: error: "C" has no attribute "__aexit__"; maybe "__exit__"?
-
-[case testAsyncWithErrorBadAenter]
-# flags: --fast-parser
-class C:
- def __aenter__(self) -> int: pass
- async def __aexit__(self, x, y, z) -> None: pass
-async def f() -> None:
- async with C() as x: # E: Incompatible types in "async with" for __aenter__ (actual type "int", expected type "Awaitable")
- pass
-[builtins fixtures/async_await.pyi]
-[out]
-
-[case testAsyncWithErrorBadAenter2]
-# flags: --fast-parser
-class C:
- def __aenter__(self) -> None: pass
- async def __aexit__(self, x, y, z) -> None: pass
-async def f() -> None:
- async with C() as x: # E: "__aenter__" of "C" does not return a value
- pass
-[builtins fixtures/async_await.pyi]
-[out]
-
-[case testAsyncWithErrorBadAexit]
-# flags: --fast-parser
-class C:
- async def __aenter__(self) -> int: pass
- def __aexit__(self, x, y, z) -> int: pass
-async def f() -> None:
- async with C() as x: # E: Incompatible types in "async with" for __aexit__ (actual type "int", expected type "Awaitable")
- pass
-[builtins fixtures/async_await.pyi]
-[out]
-
-[case testAsyncWithErrorBadAexit2]
-# flags: --fast-parser
-class C:
- async def __aenter__(self) -> int: pass
- def __aexit__(self, x, y, z) -> None: pass
-async def f() -> None:
- async with C() as x: # E: "__aexit__" of "C" does not return a value
- pass
-[builtins fixtures/async_await.pyi]
-[out]
-
-[case testNoYieldInAsyncDef]
-# flags: --fast-parser
-async def f():
- yield None
-async def g():
- yield
-async def h():
- x = yield
-[builtins fixtures/async_await.pyi]
-[out]
-main:3: error: 'yield' in async function
-main:5: error: 'yield' in async function
-main:7: error: 'yield' in async function
-
-[case testNoYieldFromInAsyncDef]
-# flags: --fast-parser
-async def f():
- yield from []
-async def g():
- x = yield from []
-[builtins fixtures/async_await.pyi]
-[out]
-main:3: error: 'yield from' in async function
-main:5: error: 'yield from' in async function
-
-[case testNoAsyncDefInPY2_python2]
-# flags: --fast-parser
-async def f(): # E: invalid syntax
- pass
-
-[case testYieldFromNoAwaitable]
-# flags: --fast-parser
-from typing import Any, Generator
-async def f() -> str:
- return ''
-def g() -> Generator[Any, None, str]:
- x = yield from f()
- return x
-[builtins fixtures/async_await.pyi]
-[out]
-main:6: error: "yield from" can't be applied to Awaitable[str]
-
-[case testAwaitableSubclass]
-# flags: --fast-parser
-from typing import Any, AsyncIterator, Awaitable, Generator
-class A(Awaitable[int]):
- def __await__(self) -> Generator[Any, None, int]:
- yield
- return 0
-class C:
- def __aenter__(self) -> A:
- return A()
- def __aexit__(self, *a) -> A:
- return A()
-class I(AsyncIterator[int]):
- def __aiter__(self) -> 'I':
- return self
- def __anext__(self) -> A:
- return A()
-async def main() -> None:
- x = await A()
- reveal_type(x) # E: Revealed type is 'builtins.int'
- async with C() as y:
- reveal_type(y) # E: Revealed type is 'builtins.int'
- async for z in I():
- reveal_type(z) # E: Revealed type is 'builtins.int'
-[builtins fixtures/async_await.pyi]
-[out]
-
-[case testYieldTypeCheckInDecoratedCoroutine]
-# flags: --fast-parser
-from typing import Generator
-from types import coroutine
- at coroutine
-def f() -> Generator[int, str, int]:
- x = yield 0
- x = yield '' # E: Incompatible types in yield (actual type "str", expected type "int")
- reveal_type(x) # E: Revealed type is 'builtins.str'
- if x:
- return 0
- else:
- return '' # E: Incompatible return value type (got "str", expected "int")
-[builtins fixtures/async_await.pyi]
-[out]
-
-
--- The full matrix of coroutine compatibility
--- ------------------------------------------
-
-[case testFullCoroutineMatrix]
-# flags: --fast-parser
-from typing import Any, AsyncIterator, Awaitable, Generator, Iterator
-from types import coroutine
-
-# The various things you might try to use in `await` or `yield from`.
-
-def plain_generator() -> Generator[str, None, int]:
- yield 'a'
- return 1
-
-async def plain_coroutine() -> int:
- return 1
-
- at coroutine
-def decorated_generator() -> Generator[str, None, int]:
- yield 'a'
- return 1
-
- at coroutine
-async def decorated_coroutine() -> int:
- return 1
-
-class It(Iterator[str]):
- def __iter__(self) -> 'It':
- return self
- def __next__(self) -> str:
- return 'a'
-
-def other_iterator() -> It:
- return It()
-
-class Aw(Awaitable[int]):
- def __await__(self) -> Generator[str, Any, int]:
- yield 'a'
- return 1
-
-def other_coroutine() -> Aw:
- return Aw()
-
-# The various contexts in which `await` or `yield from` might occur.
-
-def plain_host_generator() -> Generator[str, None, None]:
- yield 'a'
- x = 0
- x = yield from plain_generator()
- x = yield from plain_coroutine() # E: "yield from" can't be applied to Awaitable[int]
- x = yield from decorated_generator()
- x = yield from decorated_coroutine() # E: "yield from" can't be applied to AwaitableGenerator[Any, Any, int, Awaitable[int]]
- x = yield from other_iterator()
- x = yield from other_coroutine() # E: "yield from" can't be applied to "Aw"
-
-async def plain_host_coroutine() -> None:
- x = 0
- x = await plain_generator() # E: Incompatible types in await (actual type Generator[str, None, int], expected type "Awaitable")
- x = await plain_coroutine()
- x = await decorated_generator()
- x = await decorated_coroutine()
- x = await other_iterator() # E: Incompatible types in await (actual type "It", expected type "Awaitable")
- x = await other_coroutine()
-
- at coroutine
-def decorated_host_generator() -> Generator[str, None, None]:
- yield 'a'
- x = 0
- x = yield from plain_generator()
- x = yield from plain_coroutine()
- x = yield from decorated_generator()
- x = yield from decorated_coroutine()
- x = yield from other_iterator()
- x = yield from other_coroutine() # E: "yield from" can't be applied to "Aw"
-
- at coroutine
-async def decorated_host_coroutine() -> None:
- x = 0
- x = await plain_generator() # E: Incompatible types in await (actual type Generator[str, None, int], expected type "Awaitable")
- x = await plain_coroutine()
- x = await decorated_generator()
- x = await decorated_coroutine()
- x = await other_iterator() # E: Incompatible types in await (actual type "It", expected type "Awaitable")
- x = await other_coroutine()
-
-[builtins fixtures/async_await.pyi]
-[out]
diff --git a/test-data/unit/check-basic.test b/test-data/unit/check-basic.test
deleted file mode 100644
index 05fa1a9..0000000
--- a/test-data/unit/check-basic.test
+++ /dev/null
@@ -1,310 +0,0 @@
-[case testEmptyFile]
-[out]
-
-[case testAssignmentAndVarDef]
-
-a = None # type: A
-b = None # type: B
-a = a
-a = b # Fail
-class A: pass
-class B: pass
-[out]
-main:5: error: Incompatible types in assignment (expression has type "B", variable has type "A")
-
-[case testConstructionAndAssignment]
-
-x = None # type: A
-x = A()
-x = B()
-class A:
- def __init__(self): pass
-class B:
- def __init__(self): pass
-[out]
-main:4: error: Incompatible types in assignment (expression has type "B", variable has type "A")
-
-[case testInheritInitFromObject]
-
-x = None # type: A
-x = A()
-x = B()
-class A(object): pass
-class B(object): pass
-[out]
-main:4: error: Incompatible types in assignment (expression has type "B", variable has type "A")
-
-[case testImplicitInheritInitFromObject]
-
-x = None # type: A
-o = None # type: object
-x = o # E: Incompatible types in assignment (expression has type "object", variable has type "A")
-x = A()
-o = x
-class A: pass
-class B: pass
-[out]
-
-[case testTooManyConstructorArgs]
-import typing
-object(object())
-[out]
-main:2: error: Too many arguments for "object"
-
-[case testVarDefWithInit]
-import typing
-a = A() # type: A
-b = object() # type: A
-class A: pass
-[out]
-main:3: error: Incompatible types in assignment (expression has type "object", variable has type "A")
-
-[case testInheritanceBasedSubtyping]
-import typing
-x = B() # type: A
-y = A() # type: B # Fail
-class A: pass
-class B(A): pass
-[out]
-main:3: error: Incompatible types in assignment (expression has type "A", variable has type "B")
-
-[case testDeclaredVariableInParentheses]
-
-(x) = None # type: int
-x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-x = 1
-
-
--- Simple functions and calling
--- ----------------------------
-
-
-[case testFunction]
-import typing
-def f(x: 'A') -> None: pass
-f(A())
-f(B()) # Fail
-class A: pass
-class B: pass
-[out]
-main:4: error: Argument 1 to "f" has incompatible type "B"; expected "A"
-
-[case testNotCallable]
-import typing
-A()()
-class A: pass
-[out]
-main:2: error: "A" not callable
-
-[case testSubtypeArgument]
-import typing
-def f(x: 'A', y: 'B') -> None: pass
-f(B(), A()) # Fail
-f(B(), B())
-
-class A: pass
-class B(A): pass
-[out]
-main:3: error: Argument 2 to "f" has incompatible type "A"; expected "B"
-
-[case testInvalidArgumentCount]
-import typing
-def f(x, y) -> None: pass
-f(object())
-f(object(), object(), object())
-[out]
-main:3: error: Too few arguments for "f"
-main:4: error: Too many arguments for "f"
-
-
--- Locals
--- ------
-
-
-[case testLocalVariables]
-
-def f() -> None:
- x = None # type: A
- y = None # type: B
- x = x
- x = y # Fail
-class A: pass
-class B: pass
-[out]
-main:6: error: Incompatible types in assignment (expression has type "B", variable has type "A")
-
-[case testLocalVariableScope]
-
-def f() -> None:
- x = None # type: A
- x = A()
-def g() -> None:
- x = None # type: B
- x = A() # Fail
-class A: pass
-class B: pass
-[out]
-main:7: error: Incompatible types in assignment (expression has type "A", variable has type "B")
-
-[case testFunctionArguments]
-import typing
-def f(x: 'A', y: 'B') -> None:
- x = y # Fail
- x = x
- y = B()
-class A: pass
-class B: pass
-[out]
-main:3: error: Incompatible types in assignment (expression has type "B", variable has type "A")
-
-[case testLocalVariableInitialization]
-import typing
-def f() -> None:
- a = A() # type: A
- b = B() # type: A # Fail
-class A: pass
-class B: pass
-[out]
-main:4: error: Incompatible types in assignment (expression has type "B", variable has type "A")
-
-[case testVariableInitializationWithSubtype]
-import typing
-x = B() # type: A
-y = A() # type: B # Fail
-class A: pass
-class B(A): pass
-[out]
-main:3: error: Incompatible types in assignment (expression has type "A", variable has type "B")
-
-
--- Misc
--- ----
-
-
-[case testInvalidReturn]
-import typing
-def f() -> 'A':
- return B()
-class A: pass
-class B: pass
-[out]
-main:3: error: Incompatible return value type (got "B", expected "A")
-
-[case testTopLevelContextAndInvalidReturn]
-import typing
-def f() -> 'A':
- return B()
-a = B() # type: A
-class A: pass
-class B: pass
-[out]
-main:3: error: Incompatible return value type (got "B", expected "A")
-main:4: error: Incompatible types in assignment (expression has type "B", variable has type "A")
-
-[case testEmptyReturnInAnyTypedFunction]
-from typing import Any
-def f() -> Any:
- return
-
-[case testEmptyYieldInAnyTypedFunction]
-from typing import Any
-def f() -> Any:
- yield
-
-[case testModule__name__]
-import typing
-x = __name__ # type: str
-a = __name__ # type: A # E: Incompatible types in assignment (expression has type "str", variable has type "A")
-class A: pass
-[builtins fixtures/primitives.pyi]
-
-[case testModule__doc__]
-import typing
-x = __doc__ # type: str
-a = __doc__ # type: A # E: Incompatible types in assignment (expression has type "str", variable has type "A")
-class A: pass
-[builtins fixtures/primitives.pyi]
-
-[case testModule__file__]
-import typing
-x = __file__ # type: str
-a = __file__ # type: A # E: Incompatible types in assignment (expression has type "str", variable has type "A")
-class A: pass
-[builtins fixtures/primitives.pyi]
-
-[case test__package__]
-import typing
-x = __package__ # type: str
-a = __file__ # type: int # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-
-
--- Scoping and shadowing
--- ---------------------
-
-
-[case testLocalVariableShadowing]
-
-a = None # type: A
-a = B() # Fail
-a = A()
-def f() -> None:
- a = None # type: B
- a = A() # Fail
- a = B()
-a = B() # Fail
-a = A()
-
-class A: pass
-class B: pass
-[out]
-main:3: error: Incompatible types in assignment (expression has type "B", variable has type "A")
-main:7: error: Incompatible types in assignment (expression has type "A", variable has type "B")
-main:9: error: Incompatible types in assignment (expression has type "B", variable has type "A")
-
-[case testGlobalDefinedInBlockWithType]
-
-class A: pass
-while A:
- a = None # type: A
- a = A()
- a = object() # E: Incompatible types in assignment (expression has type "object", variable has type "A")
-
-
--- # type: signatures
--- ------------------
-
-
-[case testFunctionSignatureAsComment]
-def f(x): # type: (int) -> str
- return 1
-f('')
-[out]
-main:2: error: Incompatible return value type (got "int", expected "str")
-main:3: error: Argument 1 to "f" has incompatible type "str"; expected "int"
-
-[case testMethodSignatureAsComment]
-class A:
- def f(self, x):
- # type: (int) -> str
- self.f('') # Fail
- return 1
-A().f('') # Fail
-[out]
-main:4: error: Argument 1 to "f" of "A" has incompatible type "str"; expected "int"
-main:5: error: Incompatible return value type (got "int", expected "str")
-main:6: error: Argument 1 to "f" of "A" has incompatible type "str"; expected "int"
-
-[case testTrailingCommaParsing-skip]
-x = 1
-x in 1,
-if x in 1, :
- pass
-[out]
-
-[case testInitReturnTypeError]
-class C:
- def __init__(self):
- # type: () -> int
- pass
-[out]
-main:2: error: The return type of "__init__" must be None
diff --git a/test-data/unit/check-bound.test b/test-data/unit/check-bound.test
deleted file mode 100644
index ee935ae..0000000
--- a/test-data/unit/check-bound.test
+++ /dev/null
@@ -1,203 +0,0 @@
--- Enforcement of upper bounds
--- ---------------------------
-
-
-[case testBoundOnGenericFunction]
-from typing import TypeVar
-
-class A: pass
-class B(A): pass
-class C(A): pass
-class D: pass
-
-T = TypeVar('T', bound=A)
-U = TypeVar('U')
-def f(x: T) -> T: pass
-def g(x: U) -> U:
- return f(x) # Fail
-
-f(A())
-f(B())
-f(D()) # Fail
-
-b = B()
-b = f(b)
-b = f(C()) # Fail
-[out]
-main:12: error: Type argument 1 of "f" has incompatible value "U"
-main:16: error: Type argument 1 of "f" has incompatible value "D"
-main:20: error: Incompatible types in assignment (expression has type "C", variable has type "B")
-
-
-[case testBoundOnGenericClass]
-from typing import TypeVar, Generic
-
-class A: pass
-class B(A): pass
-T = TypeVar('T', bound=A)
-
-class G(Generic[T]):
- def __init__(self, x: T) -> None: pass
-
-v = None # type: G[A]
-w = None # type: G[B]
-x = None # type: G[str] # E: Type argument "builtins.str" of "G" must be a subtype of "__main__.A"
-y = G('a') # E: Type argument 1 of "G" has incompatible value "str"
-z = G(A())
-z = G(B())
-
-
-[case testBoundVoid]
-from typing import TypeVar, Generic
-T = TypeVar('T', bound=int)
-class C(Generic[T]):
- t = None # type: T
- def get(self) -> T:
- return self.t
-c1 = None # type: C[None]
-c1.get()
-d = c1.get() # E: Function does not return a value
-
-
-[case testBoundAny]
-from typing import TypeVar, Generic
-T = TypeVar('T', bound=int)
-class C(Generic[T]):
- def __init__(self, x: T) -> None: pass
-def f(x: T) -> T:
- return x
-
-def g(): pass
-
-f(g())
-C(g())
-z = None # type: C
-
-
-[case testBoundHigherOrderWithVoid]
-from typing import TypeVar, Callable
-class A: pass
-T = TypeVar('T', bound=A)
-def f(g: Callable[[], T]) -> T:
- return g()
-def h() -> None: pass
-f(h)
-a = f(h) # E: "h" does not return a value
-
-
-[case testBoundInheritance]
-from typing import TypeVar, Generic
-class A: pass
-T = TypeVar('T')
-TA = TypeVar('TA', bound=A)
-
-class C(Generic[TA]): pass
-class D0(C[TA], Generic[TA]): pass
-class D1(C[T], Generic[T]): pass # E: Type argument "T`1" of "C" must be a subtype of "__main__.A"
-class D2(C[A]): pass
-class D3(C[str]): pass # E: Type argument "builtins.str" of "C" must be a subtype of "__main__.A"
-
-
--- Using information from upper bounds
--- -----------------------------------
-
-
-[case testBoundGenericFunctions]
-from typing import TypeVar
-class A: pass
-class B(A): pass
-
-T = TypeVar('T')
-TA = TypeVar('TA', bound=A)
-TB = TypeVar('TB', bound=B)
-
-def f(x: T) -> T:
- return x
-def g(x: TA) -> TA:
- return f(x)
-def h(x: TB) -> TB:
- return g(x)
-def g2(x: TA) -> TA:
- return h(x) # Fail
-
-def j(x: TA) -> A:
- return x
-def k(x: TA) -> B:
- return x # Fail
-[out]
-main:16: error: Type argument 1 of "h" has incompatible value "TA"
-main:21: error: Incompatible return value type (got "TA", expected "B")
-
-
-[case testBoundMethodUsage]
-from typing import TypeVar
-class A0:
- def foo(self) -> None: pass
-class A(A0):
- def bar(self) -> None: pass
- a = 1
- @property
- def b(self) -> int:
- return self.a
-class B(A):
- def baz(self) -> None: pass
-
-T = TypeVar('T', A)
-
-def f(x: T) -> T:
- x.foo()
- x.bar()
- x.baz() # E: "A" has no attribute "baz"
- x.a
- x.b
- return x
-
-b = f(B())
-[builtins fixtures/property.pyi]
-[out]
-
-[case testBoundClassMethod]
-from typing import TypeVar
-class A0:
- @classmethod
- def foo(cls, x: int) -> int: pass
-class A(A0): pass
-
-T = TypeVar('T', bound=A)
-def f(x: T) -> int:
- return x.foo(22)
-[builtins fixtures/classmethod.pyi]
-
-
-[case testBoundStaticMethod]
-from typing import TypeVar
-class A0:
- @staticmethod
- def foo(x: int) -> int: pass
-class A(A0): pass
-
-T = TypeVar('T', bound=A)
-def f(x: T) -> int:
- return x.foo(22)
-[builtins fixtures/staticmethod.pyi]
-
-
-[case testBoundOnDecorator]
-from typing import TypeVar, Callable, Any, cast
-T = TypeVar('T', bound=Callable[..., Any])
-
-def twice(f: T) -> T:
- def result(*args, **kwargs) -> Any:
- f(*args, **kwargs)
- return f(*args, **kwargs)
- return cast(T, result)
-
- at twice
-def foo(x: int) -> int:
- return x
-
-a = 1
-b = foo(a)
-b = 'a' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-twice(a) # E: Type argument 1 of "twice" has incompatible value "int"
-[builtins fixtures/args.pyi]
diff --git a/test-data/unit/check-callable.test b/test-data/unit/check-callable.test
deleted file mode 100644
index 429ad44..0000000
--- a/test-data/unit/check-callable.test
+++ /dev/null
@@ -1,345 +0,0 @@
-[case testCallableDef]
-def f() -> None: pass
-
-if callable(f):
- f()
-else:
- f += 5
-
-[builtins fixtures/callable.pyi]
-
-[case testCallableLambda]
-f = lambda: None
-
-if callable(f):
- f()
-else:
- f += 5
-
-[builtins fixtures/callable.pyi]
-
-[case testCallableNotCallable]
-x = 5
-
-if callable(x):
- x()
-else:
- x += 5
-
-[builtins fixtures/callable.pyi]
-
-[case testUnion]
-from typing import Callable, Union
-
-x = 5 # type: Union[int, Callable[[], str]]
-
-if callable(x):
- y = x() + 'test'
-else:
- z = x + 6
-
-[builtins fixtures/callable.pyi]
-
-[case testUnionMultipleReturnTypes]
-from typing import Callable, Union
-
-x = 5 # type: Union[int, Callable[[], str], Callable[[], int]]
-
-if callable(x):
- y = x() + 2 # E: Unsupported operand types for + (likely involving Union)
-else:
- z = x + 6
-
-[builtins fixtures/callable.pyi]
-
-[case testUnionMultipleNonCallableTypes]
-from typing import Callable, Union
-
-x = 5 # type: Union[int, str, Callable[[], str]]
-
-if callable(x):
- y = x() + 'test'
-else:
- z = x + 6 # E: Unsupported operand types for + (likely involving Union)
-
-[builtins fixtures/callable.pyi]
-
-[case testCallableThenIsinstance]
-from typing import Callable, Union
-
-x = 5 # type: Union[int, str, Callable[[], str], Callable[[], int]]
-
-if callable(x):
- y = x()
- if isinstance(y, int):
- b1 = y + 2
- else:
- b2 = y + 'test'
-else:
- if isinstance(x, int):
- b3 = x + 3
- else:
- b4 = x + 'test2'
-
-[builtins fixtures/callable.pyi]
-
-[case testIsinstanceThenCallable]
-from typing import Callable, Union
-
-x = 5 # type: Union[int, str, Callable[[], str], Callable[[], int]]
-
-if isinstance(x, int):
- b1 = x + 1
-else:
- if callable(x):
- y = x()
- if isinstance(y, int):
- b2 = y + 1
- else:
- b3 = y + 'test'
- else:
- b4 = x + 'test2'
-
-[builtins fixtures/callable.pyi]
-
-[case testCallableWithDifferentArgTypes]
-from typing import Callable, Union
-
-x = 5 # type: Union[int, Callable[[], None], Callable[[int], None]]
-
-if callable(x):
- x() # E: Too few arguments
-
-[builtins fixtures/callable.pyi]
-
-[case testClassInitializer]
-from typing import Callable, Union
-
-class A:
- x = 5
-
-a = A # type: Union[A, Callable[[], A]]
-
-if callable(a):
- a = a()
-
-a.x + 6
-
-[builtins fixtures/callable.pyi]
-
-[case testCallableVariables]
-from typing import Union
-
-class A:
- x = 5
-
-class B:
- x = int
-
-x = A() # type: Union[A, B]
-
-if callable(x.x):
- y = x.x()
-else:
- y = x.x + 5
-
-[builtins fixtures/callable.pyi]
-
-[case testCallableAnd]
-from typing import Union, Callable
-
-x = 5 # type: Union[int, Callable[[], str]]
-
-if callable(x) and x() == 'test':
- x()
-else:
- x + 5 # E: Unsupported left operand type for + (some union)
-
-[builtins fixtures/callable.pyi]
-
-[case testCallableOr]
-from typing import Union, Callable
-
-x = 5 # type: Union[int, Callable[[], str]]
-
-if callable(x) or x() == 'test': # E: "int" not callable
- x() # E: "int" not callable
-else:
- x + 5
-[builtins fixtures/callable.pyi]
-
-[case testCallableOrOtherType]
-from typing import Union, Callable
-
-x = 5 # type: Union[int, Callable[[], str]]
-
-if callable(x) or x == 2:
- pass
-else:
- pass
-[builtins fixtures/callable.pyi]
-
-[case testAnyCallable]
-from typing import Any
-
-x = 5 # type: Any
-
-if callable(x):
- reveal_type(x) # E: Revealed type is 'Any'
-else:
- reveal_type(x) # E: Revealed type is 'Any'
-[builtins fixtures/callable.pyi]
-
-[case testCallableCallableClasses]
-from typing import Union
-
-
-class A:
- pass
-
-
-class B:
- def __call__(self) -> None:
- pass
-
-
-a = A() # type: A
-b = B() # type: B
-c = A() # type: Union[A, B]
-
-if callable(a):
- 5 + 'test'
-
-if not callable(b):
- 5 + 'test'
-
-if callable(c):
- reveal_type(c) # E: Revealed type is '__main__.B'
-else:
- reveal_type(c) # E: Revealed type is '__main__.A'
-
-[builtins fixtures/callable.pyi]
-
-[case testCallableNestedUnions]
-from typing import Callable, Union
-
-T = Union[Union[int, Callable[[], int]], Union[str, Callable[[], str]]]
-
-def f(t: T) -> None:
- if callable(t):
- reveal_type(t()) # E: Revealed type is 'Union[builtins.int, builtins.str]'
- else:
- reveal_type(t) # E: Revealed type is 'Union[builtins.int, builtins.str]'
-
-[builtins fixtures/callable.pyi]
-
-[case testCallableTypeVarEmpty]
-from typing import TypeVar
-
-T = TypeVar('T')
-
-def f(t: T) -> T:
- if callable(t):
- return 5
- else:
- return t
-
-[builtins fixtures/callable.pyi]
-
-[case testCallableTypeVarUnion]
-from typing import Callable, TypeVar, Union
-
-T = TypeVar('T', int, Callable[[], int], Union[str, Callable[[], str]])
-
-def f(t: T) -> None:
- if callable(t):
- reveal_type(t()) # E: Revealed type is 'builtins.int' # E: Revealed type is 'builtins.str'
- else:
- reveal_type(t) # E: Revealed type is 'builtins.int*' # E: Revealed type is 'builtins.str'
-
-[builtins fixtures/callable.pyi]
-
-[case testCallableTypeVarBound]
-from typing import TypeVar
-
-
-class A:
- def __call__(self) -> str:
- return 'hi'
-
-
-T = TypeVar('T', bound=A)
-
-def f(t: T) -> str:
- if callable(t):
- return t()
- else:
- return 5
-
-[builtins fixtures/callable.pyi]
-
-[case testCallableTypeType]
-from typing import Type
-
-
-class A:
- pass
-
-
-T = Type[A]
-
-def f(t: T) -> A:
- if callable(t):
- return t()
- else:
- return 5
-
-[builtins fixtures/callable.pyi]
-
-[case testCallableTypeUnion]
-from abc import ABCMeta, abstractmethod
-from typing import Type, Union
-
-
-class A(metaclass=ABCMeta):
- @abstractmethod
- def f(self) -> None:
- pass
-
-
-class B:
- pass
-
-
-x = B # type: Union[Type[A], Type[B]]
-if callable(x):
- # Abstract classes raise an error when called, but are indeed `callable`
- pass
-else:
- 'test' + 5
-
-[builtins fixtures/callable.pyi]
-
-[case testCallableUnionOfTypes]
-from abc import ABCMeta, abstractmethod
-from typing import Type, Union
-
-
-class A(metaclass=ABCMeta):
- @abstractmethod
- def f(self) -> None:
- pass
-
-
-class B:
- pass
-
-
-x = B # type: Type[Union[A, B]]
-if callable(x):
- # Abstract classes raise an error when called, but are indeed `callable`
- pass
-else:
- 'test' + 5
-
-[builtins fixtures/callable.pyi]
diff --git a/test-data/unit/check-class-namedtuple.test b/test-data/unit/check-class-namedtuple.test
deleted file mode 100644
index a18532d..0000000
--- a/test-data/unit/check-class-namedtuple.test
+++ /dev/null
@@ -1,378 +0,0 @@
-[case testNewNamedTupleOldPythonVersion]
-# flags: --fast-parser --python-version 3.5
-from typing import NamedTuple
-
-class E(NamedTuple): # E: NamedTuple class syntax is only supported in Python 3.6
- pass
-
-[case testNewNamedTupleNoUnderscoreFields]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple
-
-class X(NamedTuple):
- x: int
- _y: int # E: NamedTuple field name cannot start with an underscore: _y
- _z: int # E: NamedTuple field name cannot start with an underscore: _z
-
-[case testNewNamedTupleAccessingAttributes]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple
-
-class X(NamedTuple):
- x: int
- y: str
-
-x: X
-x.x
-x.y
-x.z # E: "X" has no attribute "z"
-
-[case testNewNamedTupleAttributesAreReadOnly]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple
-
-class X(NamedTuple):
- x: int
-
-x: X
-x.x = 5 # E: Property "x" defined in "X" is read-only
-x.y = 5 # E: "X" has no attribute "y"
-
-class A(X): pass
-a: A
-a.x = 5 # E: Property "x" defined in "A" is read-only
-
-[case testNewNamedTupleCreateWithPositionalArguments]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple
-
-class X(NamedTuple):
- x: int
- y: str
-
-x = X(1, '2')
-x.x
-x.z # E: "X" has no attribute "z"
-x = X(1) # E: Too few arguments for "X"
-x = X(1, '2', 3) # E: Too many arguments for "X"
-
-[case testNewNamedTupleShouldBeSingleBase]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple
-
-class A: ...
-class X(NamedTuple, A): # E: NamedTuple should be a single base
- pass
-
-[case testCreateNewNamedTupleWithKeywordArguments]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple
-
-class X(NamedTuple):
- x: int
- y: str
-
-x = X(x=1, y='x')
-x = X(1, y='x')
-x = X(x=1, z=1) # E: Unexpected keyword argument "z" for "X"
-x = X(y='x') # E: Missing positional argument "x" in call to "X"
-
-[case testNewNamedTupleCreateAndUseAsTuple]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple
-
-class X(NamedTuple):
- x: int
- y: str
-
-x = X(1, 'x')
-a, b = x
-a, b, c = x # E: Need more than 2 values to unpack (3 expected)
-
-[case testNewNamedTupleWithItemTypes]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple
-
-class N(NamedTuple):
- a: int
- b: str
-
-n = N(1, 'x')
-s: str = n.a # E: Incompatible types in assignment (expression has type "int", \
- variable has type "str")
-i: int = n.b # E: Incompatible types in assignment (expression has type "str", \
- variable has type "int")
-x, y = n
-x = y # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-
-[case testNewNamedTupleConstructorArgumentTypes]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple
-
-class N(NamedTuple):
- a: int
- b: str
-
-n = N('x', 'x') # E: Argument 1 to "N" has incompatible type "str"; expected "int"
-n = N(1, b=2) # E: Argument 2 to "N" has incompatible type "int"; expected "str"
-N(1, 'x')
-N(b='x', a=1)
-
-[case testNewNamedTupleAsBaseClass]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple
-
-class N(NamedTuple):
- a: int
- b: str
-
-class X(N):
- pass
-x = X(1, 2) # E: Argument 2 to "X" has incompatible type "int"; expected "str"
-s = ''
-i = 0
-s = x.a # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-i, s = x
-s, s = x # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-
-[case testNewNamedTupleSelfTypeWithNamedTupleAsBase]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple
-
-class A(NamedTuple):
- a: int
- b: str
-
-class B(A):
- def f(self, x: int) -> None:
- self.f(self.a)
- self.f(self.b) # E: Argument 1 to "f" of "B" has incompatible type "str"; expected "int"
- i = 0
- s = ''
- i, s = self
- i, i = self # E: Incompatible types in assignment (expression has type "str", \
- variable has type "int")
-[out]
-
-[case testNewNamedTupleTypeReferenceToClassDerivedFrom]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple
-
-class A(NamedTuple):
- a: int
- b: str
-
-class B(A):
- def f(self, x: 'B') -> None:
- i = 0
- s = ''
- self = x
- i, s = x
- i, s = x.a, x.b
- i, s = x.a, x.a # E: Incompatible types in assignment (expression has type "int", \
- variable has type "str")
- i, i = self # E: Incompatible types in assignment (expression has type "str", \
- variable has type "int")
-
-[out]
-
-[case testNewNamedTupleSubtyping]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple, Tuple
-
-class A(NamedTuple):
- a: int
- b: str
-
-class B(A): pass
-a = A(1, '')
-b = B(1, '')
-t: Tuple[int, str]
-b = a # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-a = t # E: Incompatible types in assignment (expression has type "Tuple[int, str]", variable has type "A")
-b = t # E: Incompatible types in assignment (expression has type "Tuple[int, str]", variable has type "B")
-t = a
-t = (1, '')
-t = b
-a = b
-
-[case testNewNamedTupleSimpleTypeInference]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple, Tuple
-
-class A(NamedTuple):
- a: int
-
-l = [A(1), A(2)]
-a = A(1)
-a = l[0]
-(i,) = l[0]
-i, i = l[0] # E: Need more than 1 value to unpack (2 expected)
-l = [A(1)]
-a = (1,) # E: Incompatible types in assignment (expression has type "Tuple[int]", \
- variable has type "A")
-[builtins fixtures/list.pyi]
-
-[case testNewNamedTupleMissingClassAttribute]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple
-
-class MyNamedTuple(NamedTuple):
- a: int
- b: str
-
-MyNamedTuple.x # E: "MyNamedTuple" has no attribute "x"
-
-[case testNewNamedTupleEmptyItems]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple
-
-class A(NamedTuple):
- ...
-
-[case testNewNamedTupleForwardRef]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple
-
-class A(NamedTuple):
- b: 'B'
-
-class B: ...
-
-a = A(B())
-a = A(1) # E: Argument 1 to "A" has incompatible type "int"; expected "B"
-
-[case testNewNamedTupleProperty]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple
-
-class A(NamedTuple):
- a: int
-
-class B(A):
- @property
- def b(self) -> int:
- return self.a
-class C(B): pass
-B(1).b
-C(2).b
-
-[builtins fixtures/property.pyi]
-
-[case testNewNamedTupleAsDict]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple, Any
-
-class X(NamedTuple):
- x: Any
- y: Any
-
-x: X
-reveal_type(x._asdict()) # E: Revealed type is 'builtins.dict[builtins.str, Any]'
-
-[builtins fixtures/dict.pyi]
-
-[case testNewNamedTupleReplaceTyped]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple
-
-class X(NamedTuple):
- x: int
- y: str
-
-x: X
-reveal_type(x._replace()) # E: Revealed type is 'Tuple[builtins.int, builtins.str, fallback=__main__.X]'
-x._replace(x=5)
-x._replace(y=5) # E: Argument 1 to X._replace has incompatible type "int"; expected "str"
-
-[case testNewNamedTupleFields]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple
-
-class X(NamedTuple):
- x: int
- y: str
-
-reveal_type(X._fields) # E: Revealed type is 'Tuple[builtins.str, builtins.str]'
-
-[case testNewNamedTupleUnit]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple
-
-class X(NamedTuple):
- pass
-
-x: X = X()
-x._replace()
-x._fields[0] # E: Tuple index out of range
-
-[case testNewNamedTupleJoinNamedTuple]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple
-
-class X(NamedTuple):
- x: int
- y: str
-class Y(NamedTuple):
- x: int
- y: str
-
-reveal_type([X(3, 'b'), Y(1, 'a')]) # E: Revealed type is 'builtins.list[Tuple[builtins.int, builtins.str]]'
-
-[builtins fixtures/list.pyi]
-
-[case testNewNamedTupleJoinTuple]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple
-
-class X(NamedTuple):
- x: int
- y: str
-
-reveal_type([(3, 'b'), X(1, 'a')]) # E: Revealed type is 'builtins.list[Tuple[builtins.int, builtins.str]]'
-reveal_type([X(1, 'a'), (3, 'b')]) # E: Revealed type is 'builtins.list[Tuple[builtins.int, builtins.str]]'
-
-[builtins fixtures/list.pyi]
-
-[case testNewNamedTupleWithTooManyArguments]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple
-
-class X(NamedTuple):
- x: int
- y = z = 2 # E: Invalid statement in NamedTuple definition; expected "field_name: field_type"
- def f(self): pass # E: Invalid statement in NamedTuple definition; expected "field_name: field_type"
-
-[case testNewNamedTupleWithInvalidItems2]
-# flags: --fast-parser --python-version 3.6
-import typing
-
-class X(typing.NamedTuple):
- x: int
- y: str = 'y' # E: Right hand side values are not supported in NamedTuple
- z = None # type: int # E: Invalid statement in NamedTuple definition; expected "field_name: field_type"
- x[0]: int # E: Invalid statement in NamedTuple definition; expected "field_name: field_type"
-
-[builtins fixtures/list.pyi]
-
-[case testNewNamedTupleWithoutTypesSpecified]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple
-
-class X(NamedTuple):
- x: int
- y = 2 # E: Invalid statement in NamedTuple definition; expected "field_name: field_type"
-
-[case testTypeUsingTypeCNamedTuple]
-# flags: --fast-parser --python-version 3.6
-from typing import NamedTuple, Type
-
-class N(NamedTuple):
- x: int
- y: str
-
-def f(a: Type[N]):
- a()
-[builtins fixtures/list.pyi]
-[out]
-main:8: error: Unsupported type Type["N"]
diff --git a/test-data/unit/check-classes.test b/test-data/unit/check-classes.test
deleted file mode 100644
index 2f6e029..0000000
--- a/test-data/unit/check-classes.test
+++ /dev/null
@@ -1,2430 +0,0 @@
--- Methods
--- -------
-
-
-[case testMethodCall]
-
-a = None # type: A
-b = None # type: B
-
-a.foo(B()) # Fail
-a.bar(B(), A()) # Fail
-
-a.foo(A())
-b.bar(B(), A())
-
-class A:
- def foo(self, x: 'A') -> None: pass
-class B:
- def bar(self, x: 'B', y: A) -> None: pass
-[out]
-main:5: error: Argument 1 to "foo" of "A" has incompatible type "B"; expected "A"
-main:6: error: "A" has no attribute "bar"
-
-[case testMethodCallWithSubtype]
-
-a = None # type: A
-a.foo(A())
-a.foo(B())
-a.bar(A()) # Fail
-a.bar(B())
-
-class A:
- def foo(self, x: 'A') -> None: pass
- def bar(self, x: 'B') -> None: pass
-class B(A): pass
-[out]
-main:5: error: Argument 1 to "bar" of "A" has incompatible type "A"; expected "B"
-
-[case testInheritingMethod]
-
-a = None # type: B
-a.foo(A()) # Fail
-a.foo(B())
-
-class A:
- def foo(self, x: 'B') -> None: pass
-class B(A): pass
-[out]
-main:3: error: Argument 1 to "foo" of "A" has incompatible type "A"; expected "B"
-
-[case testMethodCallWithInvalidNumberOfArguments]
-
-a = None # type: A
-a.foo() # Fail
-a.foo(object(), A()) # Fail
-
-class A:
- def foo(self, x: 'A') -> None: pass
-[out]
-main:3: error: Too few arguments for "foo" of "A"
-main:4: error: Too many arguments for "foo" of "A"
-main:4: error: Argument 1 to "foo" of "A" has incompatible type "object"; expected "A"
-
-[case testMethodBody]
-import typing
-class A:
- def f(self) -> None:
- a = object() # type: A # Fail
-[out]
-main:4: error: Incompatible types in assignment (expression has type "object", variable has type "A")
-
-[case testMethodArguments]
-import typing
-class A:
- def f(self, a: 'A', b: 'B') -> None:
- a = B() # Fail
- b = A() # Fail
- a = A()
- b = B()
- a = a
- a = b # Fail
-class B: pass
-[out]
-main:4: error: Incompatible types in assignment (expression has type "B", variable has type "A")
-main:5: error: Incompatible types in assignment (expression has type "A", variable has type "B")
-main:9: error: Incompatible types in assignment (expression has type "B", variable has type "A")
-
-[case testReturnFromMethod]
-import typing
-class A:
- def f(self) -> 'A':
- return B() # Fail
- return A()
-class B: pass
-[out]
-main:4: error: Incompatible return value type (got "B", expected "A")
-
-[case testSelfArgument]
-import typing
-class A:
- def f(self) -> None:
- o = self # type: B # Fail
- self.g() # Fail
- a = self # type: A
- self.f()
-class B: pass
-[out]
-main:4: error: Incompatible types in assignment (expression has type "A", variable has type "B")
-main:5: error: "A" has no attribute "g"
-
-[case testAssignToMethodViaInstance]
-import typing
-class A:
- def f(self): pass
-A().f = None # E: Cannot assign to a method
-
-
--- Attributes
--- ----------
-
-
-[case testReferToInvalidAttribute]
-
-class A:
- def __init__(self):
- self.x = object()
-a = None # type: A
-a.y
-a.y = object()
-a.x
-a.x = object()
-[out]
-main:6: error: "A" has no attribute "y"
-main:7: error: "A" has no attribute "y"
-
-[case testArgumentTypeInference]
-
-class A:
- def __init__(self, aa: 'A', bb: 'B') -> None:
- self.a = aa
- self.b = bb
-class B: pass
-a = None # type: A
-b = None # type: B
-a.a = b # Fail
-a.b = a # Fail
-b.a # Fail
-a.a = a
-a.b = b
-[out]
-main:9: error: Incompatible types in assignment (expression has type "B", variable has type "A")
-main:10: error: Incompatible types in assignment (expression has type "A", variable has type "B")
-main:11: error: "B" has no attribute "a"
-
-[case testExplicitAttributeInBody]
-
-a = None # type: A
-a.x = object() # Fail
-a.x = A()
-class A:
- x = None # type: A
-[out]
-main:3: error: Incompatible types in assignment (expression has type "object", variable has type "A")
-
-[case testAttributeDefinedInNonInitMethod]
-import typing
-class A:
- def f(self) -> None:
- self.x = 1
- self.y = ''
- self.x = 1
-a = A()
-a.x = 1
-a.y = ''
-a.x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-a.z = 0 # E: "A" has no attribute "z"
-
-[case testInheritanceAndAttributeAssignment]
-import typing
-class A:
- def f(self) -> None:
- self.x = 0
-class B(A):
- def f(self) -> None:
- self.x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-[out]
-
-[case testAssignmentToAttributeInMultipleMethods]
-import typing
-class A:
- def f(self) -> None:
- self.x = 0
- def g(self) -> None:
- self.x = '' # Fail
- def __init__(self) -> None:
- self.x = '' # Fail
-[out]
-main:6: error: Incompatible types in assignment (expression has type "str", variable has type "int")
-main:8: error: Incompatible types in assignment (expression has type "str", variable has type "int")
-
-
--- Method overriding
--- -----------------
-
-
-[case testMethodOverridingWithIdenticalSignature]
-import typing
-class A:
- def f(self, x: 'A') -> None: pass
- def g(self, x: 'B' , y: object) -> 'A': pass
- def h(self) -> None: pass
-class B(A):
- def f(self, x: A) -> None: pass
- def g(self, x: 'B' , y: object) -> A: pass
- def h(self) -> None: pass
-[out]
-
-[case testMethodOverridingWithCovariantType]
-import typing
-class A:
- def f(self, x: 'A', y: 'B') -> 'A': pass
- def g(self, x: 'A', y: 'B') -> 'A': pass
-class B(A):
- def f(self, x: A, y: 'B') -> 'B': pass
- def g(self, x: A, y: A) -> 'A': pass
-[out]
-
-[case testMethodOverridingWithIncompatibleTypes]
-import typing
-class A:
- def f(self, x: 'A', y: 'B') -> 'A': pass
- def g(self, x: 'A', y: 'B') -> 'A': pass
- def h(self, x: 'A', y: 'B') -> 'A': pass
-class B(A):
- def f(self, x: 'B', y: 'B') -> A: pass # Fail
- def g(self, x: A, y: A) -> A: pass
- def h(self, x: A, y: 'B') -> object: pass # Fail
-[out]
-main:7: error: Argument 1 of "f" incompatible with supertype "A"
-main:9: error: Return type of "h" incompatible with supertype "A"
-
-[case testMethodOverridingWithIncompatibleArgumentCount]
-import typing
-class A:
- def f(self, x: 'A') -> None: pass
- def g(self, x: 'A', y: 'B') -> 'A': pass
-class B(A):
- def f(self, x: A, y: A) -> None: pass # Fail
- def g(self, x: A) -> A: pass # Fail
-[out]
-main:6: error: Signature of "f" incompatible with supertype "A"
-main:7: error: Signature of "g" incompatible with supertype "A"
-
-[case testMethodOverridingAcrossDeepInheritanceHierarchy1]
-import typing
-class A:
- def f(self, x: 'B') -> None: pass
-class B(A): pass
-class C(B): # with gap in implementations
- def f(self, x: 'C') -> None: # Fail
- pass
-[out]
-main:6: error: Argument 1 of "f" incompatible with supertype "A"
-
-[case testMethodOverridingAcrossDeepInheritanceHierarchy2]
-import typing
-class A:
- def f(self) -> 'B': pass
-class B(A):
- def f(self) -> 'C': pass
-class C(B): # with multiple implementations
- def f(self) -> B: # Fail
- pass
-[out]
-main:7: error: Return type of "f" incompatible with supertype "B"
-
-[case testMethodOverridingWithVoidReturnValue]
-import typing
-class A:
- def f(self) -> None: pass
- def g(self) -> 'A': pass
-class B(A):
- def f(self) -> A: pass # Fail
- def g(self) -> None: pass # Fail
-[out]
-main:6: error: Return type of "f" incompatible with supertype "A"
-main:7: error: Return type of "g" incompatible with supertype "A"
-
-[case testOverride__new__WithDifferentSignature]
-class A:
- def __new__(cls, x: int) -> str:
- return ''
-
-class B(A):
- def __new__(cls) -> int:
- return 1
-
-[case testInnerFunctionNotOverriding]
-class A:
- def f(self) -> int: pass
-
-class B(A):
- def g(self) -> None:
- def f(self) -> str: pass
-
-
--- Constructors
--- ------------
-
-
-[case testTrivialConstructor]
-import typing
-a = A() # type: A
-b = A() # type: B # Fail
-class A:
- def __init__(self) -> None: pass
-class B: pass
-[out]
-main:3: error: Incompatible types in assignment (expression has type "A", variable has type "B")
-
-[case testConstructor]
-import typing
-a = A(B()) # type: A
-aa = A(object()) # type: A # Fail
-b = A(B()) # type: B # Fail
-class A:
- def __init__(self, x: 'B') -> None: pass
-class B: pass
-[out]
-main:3: error: Argument 1 to "A" has incompatible type "object"; expected "B"
-main:4: error: Incompatible types in assignment (expression has type "A", variable has type "B")
-
-[case testConstructorWithTwoArguments]
-import typing
-a = A(C(), B()) # type: A # Fail
-
-class A:
- def __init__(self, x: 'B', y: 'C') -> None: pass
-class B: pass
-class C(B): pass
-[out]
-main:2: error: Argument 2 to "A" has incompatible type "B"; expected "C"
-
-[case testInheritedConstructor]
-import typing
-b = B(C()) # type: B
-a = B(D()) # type: A # Fail
-class A:
- def __init__(self, x: 'C') -> None: pass
-class B(A): pass
-class C: pass
-class D: pass
-[out]
-main:3: error: Argument 1 to "B" has incompatible type "D"; expected "C"
-
-[case testOverridingWithIncompatibleConstructor]
-import typing
-A() # Fail
-B(C()) # Fail
-A(C())
-B()
-class A:
- def __init__(self, x: 'C') -> None: pass
-class B(A):
- def __init__(self) -> None: pass
-class C: pass
-[out]
-main:2: error: Too few arguments for "A"
-main:3: error: Too many arguments for "B"
-
-[case testConstructorWithReturnValueType]
-import typing
-class A:
- def __init__(self) -> 'A': pass
-[out]
-main:3: error: The return type of "__init__" must be None
-
-[case testConstructorWithImplicitReturnValueType]
-import typing
-class A:
- def __init__(self, x: int): pass
-[out]
-main:3: error: The return type of "__init__" must be None
-
-[case testInitSubclassWithReturnValueType]
-import typing
-class A:
- def __init_subclass__(cls) -> 'A': pass
-[out]
-main:3: error: The return type of "__init_subclass__" must be None
-
-[case testInitSubclassWithImplicitReturnValueType]
-import typing
-class A:
- def __init_subclass__(cls, x: int=1): pass
-[out]
-main:3: error: The return type of "__init_subclass__" must be None
-
-[case testGlobalFunctionInitWithReturnType]
-import typing
-a = __init__() # type: A
-b = __init__() # type: B # Fail
-def __init__() -> 'A': pass
-class A: pass
-class B: pass
-[out]
-main:3: error: Incompatible types in assignment (expression has type "A", variable has type "B")
-
-[case testAccessingInit]
-from typing import Any
-class A:
- def __init__(self, a: 'A') -> None: pass
-a = None # type: A
-a.__init__(a) # E: Cannot access "__init__" directly
-(Any(a)).__init__(a)
-
-[case testDeepInheritanceHierarchy]
-import typing
-d = C() # type: D # Fail
-d = B() # Fail
-d = A() # Fail
-d = D2() # Fail
-a = D() # type: A
-a = D2()
-b = D() # type: B
-b = D2()
-
-class A: pass
-class B(A): pass
-class C(B): pass
-class D(C): pass
-class D2(C): pass
-[out]
-main:2: error: Incompatible types in assignment (expression has type "C", variable has type "D")
-main:3: error: Incompatible types in assignment (expression has type "B", variable has type "D")
-main:4: error: Incompatible types in assignment (expression has type "A", variable has type "D")
-main:5: error: Incompatible types in assignment (expression has type "D2", variable has type "D")
-
-
--- Attribute access in class body
--- ------------------------------
-
-
-[case testDataAttributeRefInClassBody]
-import typing
-class B: pass
-class A:
- x = B()
- y = x
- b = x # type: B
- b = x
- c = x # type: A # E: Incompatible types in assignment (expression has type "B", variable has type "A")
- c = b # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-[out]
-
-[case testMethodRefInClassBody]
-from typing import Callable
-class B: pass
-class A:
- def f(self) -> None: pass
- g = f
- h = f # type: Callable[[A], None]
- h = f
- g = h
- ff = f # type: Callable[[B], None] # E: Incompatible types in assignment (expression has type Callable[[A], None], variable has type Callable[[B], None])
- g = ff # E: Incompatible types in assignment (expression has type Callable[[B], None], variable has type Callable[[A], None])
-[out]
-
-
--- Arbitrary statements in class body
--- ----------------------------------
-
-
-[case testStatementsInClassBody]
-import typing
-class B: pass
-class A:
- for x in [A()]:
- y = x
- y = B() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
- x = A()
- y = A()
- x = B() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-[builtins fixtures/for.pyi]
-[out]
-
-
--- Class attributes
--- ----------------
-
-
-[case testAccessMethodViaClass]
-import typing
-class A:
- def f(self) -> None: pass
-A.f(A())
-A.f(object()) # E: Argument 1 to "f" of "A" has incompatible type "object"; expected "A"
-A.f() # E: Too few arguments for "f" of "A"
-A.f(None, None) # E: Too many arguments for "f" of "A"
-
-[case testAccessAttributeViaClass]
-import typing
-class B: pass
-class A:
- x = None # type: A
-a = A.x # type: A
-b = A.x # type: B # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-
-[case testAccessingUndefinedAttributeViaClass]
-import typing
-class A: pass
-A.x # E: "A" has no attribute "x"
-
-[case testAccessingUndefinedAttributeViaClassWithOverloadedInit]
-from typing import overload
-class A:
- @overload
- def __init__(self): pass
- @overload
- def __init__(self, x): pass
-A.x # E: "A" has no attribute "x"
-
-[case testAccessMethodOfClassWithOverloadedInit]
-from typing import overload, Any
-class A:
- @overload
- def __init__(self) -> None: pass
- @overload
- def __init__(self, x: Any) -> None: pass
- def f(self) -> None: pass
-A.f(A())
-A.f() # E: Too few arguments for "f" of "A"
-
-[case testAssignmentToClassDataAttribute]
-import typing
-class B: pass
-class A:
- x = None # type: B
-A.x = B()
-A.x = object() # E: Incompatible types in assignment (expression has type "object", variable has type "B")
-
-[case testAssignmentToInferredClassDataAttribute]
-import typing
-class B: pass
-class A:
- x = B()
-A.x = B()
-A.x = A() # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-
-[case testInitMethodUnbound]
-
-class B: pass
-class A:
- def __init__(self, b: B) -> None: pass
-a = None # type: A
-b = None # type: B
-A.__init__(a, b)
-A.__init__(b, b) # E: Argument 1 to "__init__" of "A" has incompatible type "B"; expected "A"
-A.__init__(a, a) # E: Argument 2 to "__init__" of "A" has incompatible type "A"; expected "B"
-
-[case testAssignToMethodViaClass]
-import typing
-class A:
- def f(self): pass
-A.f = None # E: Cannot assign to a method
-
-[case testAssignToNestedClassViaClass]
-import typing
-class A:
- class B: pass
-A.B = None # E: Cannot assign to a type
-
-[case testAccessingClassAttributeWithTypeInferenceIssue]
-x = C.x # E: Cannot determine type of 'x'
-def f() -> int: return 1
-class C:
- x = f()
-[builtins fixtures/list.pyi]
-
-[case testAccessingClassAttributeWithTypeInferenceIssue2]
-class C:
- x = []
-x = C.x
-[builtins fixtures/list.pyi]
-[out]
-main:2: error: Need type annotation for variable
-
-
--- Nested classes
--- --------------
-
-
-[case testClassWithinFunction]
-
-def f() -> None:
- class A:
- def g(self) -> None: pass
- a = None # type: A
- a.g()
- a.g(a) # E: Too many arguments for "g" of "A"
-[out]
-
-[case testConstructNestedClass]
-import typing
-class A:
- class B: pass
- b = B()
- b = A() # E: Incompatible types in assignment (expression has type "A", variable has type "B")
- b = B(b) # E: Too many arguments for "B"
-[out]
-
-[case testConstructNestedClassWithCustomInit]
-import typing
-class A:
- def f(self) -> None:
- class B:
- def __init__(self, a: 'A') -> None: pass
- b = B(A())
- b = A() # E: Incompatible types in assignment (expression has type "A", variable has type "B")
- b = B() # E: Too few arguments for "B"
-[out]
-
-[case testDeclareVariableWithNestedClassType]
-
-def f() -> None:
- class A: pass
- a = None # type: A
- a = A()
- a = object() # E: Incompatible types in assignment (expression has type "object", variable has type "A")
-[out]
-
-[case testExternalReferenceToClassWithinClass]
-
-class A:
- class B: pass
-b = None # type: A.B
-b = A.B()
-b = A() # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-b = A.B(b) # E: Too many arguments for "B"
-
-
--- Declaring attribute type in method
--- ----------------------------------
-
-
-[case testDeclareAttributeTypeInInit]
-
-class A:
- def __init__(self):
- self.x = None # type: int
-a = None # type: A
-a.x = 1
-a.x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-
-[case testAccessAttributeDeclaredInInitBeforeDeclaration]
-
-a = None # type: A
-a.x = 1
-a.x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-class A:
- def __init__(self):
- self.x = None # type: int
-
-
--- Special cases
--- -------------
-
-
-[case testMultipleClassDefinition]
-import typing
-A()
-class A: pass
-class A: pass
-[out]
-main:4: error: Name 'A' already defined
-
-[case testDocstringInClass]
-import typing
-class A:
- """Foo"""
-class B:
- 'x'
- y = B()
-[builtins fixtures/primitives.pyi]
-
-[case testErrorMessageInFunctionNestedWithinMethod]
-import typing
-class A:
- def f(self) -> None:
- def g() -> None:
- a = None
- b = None
-[out]
-main:5: error: Need type annotation for variable
-main:6: error: Need type annotation for variable
-
-
--- Static methods
--- --------------
-
-
-[case testSimpleStaticMethod]
-import typing
-class A:
- @staticmethod
- def f(x: int) -> None: pass
-A.f(1)
-A().f(1)
-A.f('') # E: Argument 1 to "f" of "A" has incompatible type "str"; expected "int"
-A().f('') # E: Argument 1 to "f" of "A" has incompatible type "str"; expected "int"
-[builtins fixtures/staticmethod.pyi]
-
-[case testBuiltinStaticMethod]
-import typing
-int.from_bytes(b'', '')
-int.from_bytes('', '') # E: Argument 1 to "from_bytes" of "int" has incompatible type "str"; expected "bytes"
-[builtins fixtures/staticmethod.pyi]
-
-[case testAssignStaticMethodOnInstance]
-import typing
-class A:
- @staticmethod
- def f(x: int) -> None: pass
-A().f = A.f # E: Cannot assign to a method
-[builtins fixtures/staticmethod.pyi]
-
-
--- Class methods
--- -------------
-
-
-[case testSimpleClassMethod]
-import typing
-class A:
- @classmethod
- def f(cls, x: int) -> None: pass
-A.f(1)
-A().f(1)
-A.f('') # E: Argument 1 to "f" of "A" has incompatible type "str"; expected "int"
-A().f('') # E: Argument 1 to "f" of "A" has incompatible type "str"; expected "int"
-[builtins fixtures/classmethod.pyi]
-
-[case testBuiltinClassMethod]
-import typing
-int.from_bytes(b'', '')
-int.from_bytes('', '') # E: Argument 1 to "from_bytes" of "int" has incompatible type "str"; expected "bytes"
-[builtins fixtures/classmethod.pyi]
-
-[case testAssignClassMethodOnClass]
-import typing
-class A:
- @classmethod
- def f(cls, x: int) -> None: pass
-A.f = A.f # E: Cannot assign to a method
-[builtins fixtures/classmethod.pyi]
-
-[case testAssignClassMethodOnInstance]
-import typing
-class A:
- @classmethod
- def f(cls, x: int) -> None: pass
-A().f = A.f # E: Cannot assign to a method
-[builtins fixtures/classmethod.pyi]
-
-[case testClassMethodCalledInClassMethod]
-import typing
-class C:
- @classmethod
- def foo(cls) -> None: pass
- @classmethod
- def bar(cls) -> None:
- cls()
- cls(1) # E: Too many arguments for "C"
- cls.bar()
- cls.bar(1) # E: Too many arguments for "bar" of "C"
- cls.bozo() # E: "C" has no attribute "bozo"
-[builtins fixtures/classmethod.pyi]
-[out]
-
-[case testClassMethodCalledOnClass]
-import typing
-class C:
- @classmethod
- def foo(cls) -> None: pass
-C.foo()
-C.foo(1) # E: Too many arguments for "foo" of "C"
-C.bozo() # E: "C" has no attribute "bozo"
-[builtins fixtures/classmethod.pyi]
-
-[case testClassMethodCalledOnInstance]
-import typing
-class C:
- @classmethod
- def foo(cls) -> None: pass
-C().foo()
-C().foo(1) # E: Too many arguments for "foo" of "C"
-C.bozo() # E: "C" has no attribute "bozo"
-[builtins fixtures/classmethod.pyi]
-
-[case testClassMethodMayCallAbstractMethod]
-from abc import abstractmethod
-import typing
-class C:
- @classmethod
- def foo(cls) -> None:
- cls().bar()
- @abstractmethod
- def bar(self) -> None:
- pass
-[builtins fixtures/classmethod.pyi]
-
-
--- Properties
--- ----------
-
-
-[case testAccessingReadOnlyProperty]
-import typing
-class A:
- @property
- def f(self) -> str: pass
-a = A()
-reveal_type(a.f) # E: Revealed type is 'builtins.str'
-[builtins fixtures/property.pyi]
-
-[case testAssigningToReadOnlyProperty]
-import typing
-class A:
- @property
- def f(self) -> str: pass
-A().f = '' # E: Property "f" defined in "A" is read-only
-[builtins fixtures/property.pyi]
-
-[case testPropertyGetterBody]
-import typing
-class A:
- @property
- def f(self) -> str:
- self.x = 1
- self.x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-[builtins fixtures/property.pyi]
-[out]
-
-[case testDynamicallyTypedProperty]
-import typing
-class A:
- @property
- def f(self): pass
-a = A()
-a.f.xx
-a.f = '' # E: Property "f" defined in "A" is read-only
-[builtins fixtures/property.pyi]
-
-[case testPropertyWithSetter]
-import typing
-class A:
- @property
- def f(self) -> int:
- return 1
- @f.setter
- def f(self, x: int) -> None:
- pass
-a = A()
-a.f = a.f
-a.f.x # E: "int" has no attribute "x"
-a.f = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-[builtins fixtures/property.pyi]
-
-[case testPropertyWithDeleterButNoSetter]
-import typing
-class A:
- @property
- def f(self) -> int:
- return 1
- @f.deleter
- def f(self, x) -> None:
- pass
-a = A()
-a.f = a.f # E: Property "f" defined in "A" is read-only
-a.f.x # E: "int" has no attribute "x"
-[builtins fixtures/property.pyi]
-
--- Descriptors
--- -----------
-
-
-[case testAccessingNonDataDescriptor]
-from typing import Any
-class D:
- def __get__(self, inst: Any, own: Any) -> str: return 's'
-class A:
- f = D()
-a = A()
-reveal_type(a.f) # E: Revealed type is 'builtins.str'
-
-[case testSettingNonDataDescriptor]
-from typing import Any
-class D:
- def __get__(self, inst: Any, own: Any) -> str: return 's'
-class A:
- f = D()
-a = A()
-a.f = 'foo'
-a.f = D() # E: Incompatible types in assignment (expression has type "D", variable has type "str")
-
-[case testSettingDataDescriptor]
-from typing import Any
-class D:
- def __get__(self, inst: Any, own: Any) -> str: return 's'
- def __set__(self, inst: Any, value: str) -> None: pass
-class A:
- f = D()
-a = A()
-a.f = ''
-a.f = 1 # E: Argument 2 to "__set__" of "D" has incompatible type "int"; expected "str"
-
-[case testReadingDescriptorWithoutDunderGet]
-from typing import Union, Any
-class D:
- def __set__(self, inst: Any, value: str) -> None: pass
-class A:
- f = D()
- def __init__(self): self.f = 's'
-a = A()
-reveal_type(a.f) # E: Revealed type is '__main__.D'
-
-[case testAccessingDescriptorFromClass]
-# flags: --strict-optional
-from d import D, Base
-class A(Base):
- f = D()
-reveal_type(A.f) # E: Revealed type is 'd.D'
-reveal_type(A().f) # E: Revealed type is 'builtins.str'
-[file d.pyi]
-from typing import TypeVar, Type, Generic, overload
-class Base: pass
-class D:
- def __init__(self) -> None: pass
- @overload
- def __get__(self, inst: None, own: Type[Base]) -> D: pass
- @overload
- def __get__(self, inst: Base, own: Type[Base]) -> str: pass
-[builtins fixtures/bool.pyi]
-
-[case testAccessingDescriptorFromClassWrongBase]
-# flags: --strict-optional
-from d import D, Base
-class A:
- f = D()
-reveal_type(A.f)
-reveal_type(A().f)
-[file d.pyi]
-from typing import TypeVar, Type, Generic, overload
-class Base: pass
-class D:
- def __init__(self) -> None: pass
- @overload
- def __get__(self, inst: None, own: Type[Base]) -> D: pass
- @overload
- def __get__(self, inst: Base, own: Type[Base]) -> str: pass
-[builtins fixtures/bool.pyi]
-[out]
-main:5: error: Revealed type is 'Any'
-main:5: error: No overload variant of "__get__" of "D" matches argument types [builtins.None, Type[__main__.A]]
-main:6: error: Revealed type is 'Any'
-main:6: error: No overload variant of "__get__" of "D" matches argument types [__main__.A, Type[__main__.A]]
-
-
-[case testAccessingGenericNonDataDescriptor]
-from typing import TypeVar, Type, Generic, Any
-V = TypeVar('V')
-class D(Generic[V]):
- def __init__(self, v: V) -> None: self.v = v
- def __get__(self, inst: Any, own: Type) -> V: return self.v
-class A:
- f = D(10)
- g = D('10')
-a = A()
-reveal_type(a.f) # E: Revealed type is 'builtins.int*'
-reveal_type(a.g) # E: Revealed type is 'builtins.str*'
-
-[case testSettingGenericDataDescriptor]
-from typing import TypeVar, Type, Generic, Any
-V = TypeVar('V')
-class D(Generic[V]):
- def __init__(self, v: V) -> None: self.v = v
- def __get__(self, inst: Any, own: Type) -> V: return self.v
- def __set__(self, inst: Any, v: V) -> None: pass
-class A:
- f = D(10)
- g = D('10')
-a = A()
-a.f = 1
-a.f = '' # E: Argument 2 to "__set__" of "D" has incompatible type "str"; expected "int"
-a.g = ''
-a.g = 1 # E: Argument 2 to "__set__" of "D" has incompatible type "int"; expected "str"
-
-[case testAccessingGenericDescriptorFromClass]
-# flags: --strict-optional
-from d import D
-class A:
- f = D(10) # type: D[A, int]
- g = D('10') # type: D[A, str]
-reveal_type(A.f) # E: Revealed type is 'd.D[__main__.A*, builtins.int*]'
-reveal_type(A.g) # E: Revealed type is 'd.D[__main__.A*, builtins.str*]'
-reveal_type(A().f) # E: Revealed type is 'builtins.int*'
-reveal_type(A().g) # E: Revealed type is 'builtins.str*'
-[file d.pyi]
-from typing import TypeVar, Type, Generic, overload
-T = TypeVar('T')
-V = TypeVar('V')
-class D(Generic[T, V]):
- def __init__(self, v: V) -> None: pass
- @overload
- def __get__(self, inst: None, own: Type[T]) -> 'D[T, V]': pass
- @overload
- def __get__(self, inst: T, own: Type[T]) -> V: pass
-[builtins fixtures/bool.pyi]
-
-[case testAccessingGenericDescriptorFromInferredClass]
-# flags: --strict-optional
-from typing import Type
-from d import D
-class A:
- f = D(10) # type: D[A, int]
- g = D('10') # type: D[A, str]
-def f(some_class: Type[A]):
- reveal_type(some_class.f)
- reveal_type(some_class.g)
-[file d.pyi]
-from typing import TypeVar, Type, Generic, overload
-T = TypeVar('T')
-V = TypeVar('V')
-class D(Generic[T, V]):
- def __init__(self, v: V) -> None: pass
- @overload
- def __get__(self, inst: None, own: Type[T]) -> 'D[T, V]': pass
- @overload
- def __get__(self, inst: T, own: Type[T]) -> V: pass
-[builtins fixtures/bool.pyi]
-[out]
-main:8: error: Revealed type is 'd.D[__main__.A*, builtins.int*]'
-main:9: error: Revealed type is 'd.D[__main__.A*, builtins.str*]'
-
-[case testAccessingGenericDescriptorFromClassBadOverload]
-# flags: --strict-optional
-from d import D
-class A:
- f = D(10) # type: D[A, int]
-reveal_type(A.f)
-[file d.pyi]
-from typing import TypeVar, Type, Generic, overload
-T = TypeVar('T')
-V = TypeVar('V')
-class D(Generic[T, V]):
- def __init__(self, v: V) -> None: pass
- @overload
- def __get__(self, inst: None, own: None) -> 'D[T, V]': pass
- @overload
- def __get__(self, inst: T, own: Type[T]) -> V: pass
-[builtins fixtures/bool.pyi]
-[out]
-main:5: error: Revealed type is 'Any'
-main:5: error: No overload variant of "__get__" of "D" matches argument types [builtins.None, Type[__main__.A]]
-
-[case testAccessingNonDataDescriptorSubclass]
-from typing import Any
-class C:
- def __get__(self, inst: Any, own: Any) -> str: return 's'
-class D(C): pass
-class A:
- f = D()
-a = A()
-reveal_type(a.f) # E: Revealed type is 'builtins.str'
-
-[case testSettingDataDescriptorSubclass]
-from typing import Any
-class C:
- def __get__(self, inst: Any, own: Any) -> str: return 's'
- def __set__(self, inst: Any, v: str) -> None: pass
-class D(C): pass
-class A:
- f = D()
-a = A()
-a.f = ''
-a.f = 1 # E: Argument 2 to "__set__" of "C" has incompatible type "int"; expected "str"
-
-[case testReadingDescriptorSubclassWithoutDunderGet]
-from typing import Union, Any
-class C:
- def __set__(self, inst: Any, v: str) -> None: pass
-class D(C): pass
-class A:
- f = D()
- def __init__(self): self.f = 's'
-a = A()
-reveal_type(a.f) # E: Revealed type is '__main__.D'
-
-[case testAccessingGenericNonDataDescriptorSubclass]
-from typing import TypeVar, Type, Generic, Any
-V = TypeVar('V')
-class C(Generic[V]):
- def __init__(self, v: V) -> None: self.v = v
- def __get__(self, inst: Any, own: Type) -> V: return self.v
-class D(C[V], Generic[V]): pass
-class A:
- f = D(10)
- g = D('10')
-a = A()
-reveal_type(a.f) # E: Revealed type is 'builtins.int*'
-reveal_type(a.g) # E: Revealed type is 'builtins.str*'
-
-[case testSettingGenericDataDescriptorSubclass]
-from typing import TypeVar, Type, Generic
-T = TypeVar('T')
-V = TypeVar('V')
-class C(Generic[T, V]):
- def __init__(self, v: V) -> None: self.v = v
- def __get__(self, inst: T, own: Type[T]) -> V: return self.v
- def __set__(self, inst: T, v: V) -> None: pass
-class D(C[T, V], Generic[T, V]): pass
-class A:
- f = D(10) # type: D[A, int]
- g = D('10') # type: D[A, str]
-a = A()
-a.f = 1
-a.f = '' # E: Argument 2 to "__set__" of "C" has incompatible type "str"; expected "int"
-a.g = ''
-a.g = 1 # E: Argument 2 to "__set__" of "C" has incompatible type "int"; expected "str"
-
-[case testSetDescriptorOnClass]
-from typing import TypeVar, Type, Generic
-T = TypeVar('T')
-V = TypeVar('V')
-class D(Generic[T, V]):
- def __init__(self, v: V) -> None: self.v = v
- def __get__(self, inst: T, own: Type[T]) -> V: return self.v
- def __set__(self, inst: T, v: V) -> None: pass
-class A:
- f = D(10) # type: D[A, int]
-A.f = D(20)
-A.f = D('some string') # E: Argument 1 to "D" has incompatible type "str"; expected "int"
-
-[case testSetDescriptorOnInferredClass]
-from typing import TypeVar, Type, Generic, Any
-V = TypeVar('V')
-class D(Generic[V]):
- def __init__(self, v: V) -> None: self.v = v
- def __get__(self, inst: Any, own: Type) -> V: return self.v
- def __set__(self, inst: Any, v: V) -> None: pass
-class A:
- f = D(10)
-def f(some_class: Type[A]):
- A.f = D(20)
- A.f = D('some string')
-[out]
-main:11: error: Argument 1 to "D" has incompatible type "str"; expected "int"
-
-[case testDescriptorUncallableDunderSet]
-class D:
- __set__ = 's'
-class A:
- f = D()
-A().f = 'x' # E: __main__.D.__set__ is not callable
-
-[case testDescriptorDunderSetTooFewArgs]
-class D:
- def __set__(self, inst): pass
-class A:
- f = D()
-A().f = 'x' # E: Too many arguments for "__set__"
-
-[case testDescriptorDunderSetTooManyArgs]
-class D:
- def __set__(self, inst, v, other): pass
-class A:
- f = D()
-A().f = 'x' # E: Too few arguments for "__set__"
-
-[case testDescriptorDunderSetWrongArgTypes]
-class D:
- def __set__(self, inst: str, v:str) -> None: pass
-class A:
- f = D()
-A().f = 'x' # E: Argument 1 to "__set__" of "D" has incompatible type "A"; expected "str"
-
-[case testDescriptorUncallableDunderGet]
-class D:
- __get__ = 's'
-class A:
- f = D()
-A().f # E: __main__.D.__get__ is not callable
-
-[case testDescriptorDunderGetTooFewArgs]
-class D:
- def __get__(self, inst): pass
-class A:
- f = D()
-A().f # E: Too many arguments for "__get__"
-
-[case testDescriptorDunderGetTooManyArgs]
-class D:
- def __get__(self, inst, own, other): pass
-class A:
- f = D()
-A().f = 'x' # E: Too few arguments for "__get__"
-
-[case testDescriptorDunderGetWrongArgTypeForInstance]
-from typing import Any
-class D:
- def __get__(self, inst: str, own: Any) -> Any: pass
-class A:
- f = D()
-A().f # E: Argument 1 to "__get__" of "D" has incompatible type "A"; expected "str"
-
-[case testDescriptorDunderGetWrongArgTypeForOwner]
-from typing import Any
-class D:
- def __get__(self, inst: Any, own: str) -> Any: pass
-class A:
- f = D()
-A().f # E: Argument 2 to "__get__" of "D" has incompatible type Type[A]; expected "str"
-
-[case testDescriptorGetSetDifferentTypes]
-from typing import Any
-class D:
- def __get__(self, inst: Any, own: Any) -> str: return 's'
- def __set__(self, inst: Any, v: int) -> None: pass
-class A:
- f = D()
-a = A()
-a.f = 1
-reveal_type(a.f) # E: Revealed type is 'builtins.str'
-
-
--- _promote decorators
--- -------------------
-
-
-[case testSimpleDucktypeDecorator]
-from typing import _promote
-class A: pass
- at _promote(A)
-class B: pass
-a = None # type: A
-b = None # type: B
-b = a # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-a = b
-
-[case testDucktypeTransitivityDecorator]
-from typing import _promote
-class A: pass
- at _promote(A)
-class B: pass
- at _promote(B)
-class C: pass
-a = None # type: A
-c = None # type: C
-c = a # E: Incompatible types in assignment (expression has type "A", variable has type "C")
-a = c
-
-
--- Hard coded type promotions
--- --------------------------
-
-[case testHardCodedTypePromotions]
-import typing
-def f(x: float) -> None: pass
-def g(x: complex) -> None: pass
-f(1)
-g(1)
-g(1.1)
-[builtins fixtures/complex.pyi]
-
-
--- Operator methods
--- ----------------
-
-
-[case testOperatorMethodOverrideIntroducingOverloading]
-from typing import overload
-class A:
- def __add__(self, x: int) -> int: pass
-class B(A):
- @overload # E: Signature of "__add__" incompatible with supertype "A"
- def __add__(self, x: int) -> int: pass
- @overload
- def __add__(self, x: str) -> str: pass
-[out]
-
-[case testOperatorMethodOverrideWideningArgumentType]
-import typing
-class A:
- def __add__(self, x: int) -> int: pass
-class B(A):
- def __add__(self, x: object) -> int: pass
-[out]
-
-[case testOperatorMethodOverrideNarrowingReturnType]
-import typing
-class A:
- def __add__(self, x: int) -> 'A': pass
-class B(A):
- def __add__(self, x: int) -> 'B': pass
-
-[case testOperatorMethodOverrideWithDynamicallyTyped]
-import typing
-class A:
- def __add__(self, x: int) -> 'A': pass
-class B(A):
- def __add__(self, x): pass
-
-[case testOperatorMethodOverrideWithIdenticalOverloadedType]
-from typing import overload
-class A:
- @overload
- def __add__(self, x: int) -> 'A': pass
- @overload
- def __add__(self, x: str) -> 'A': pass
-class B(A):
- @overload
- def __add__(self, x: int) -> 'A': pass
- @overload
- def __add__(self, x: str) -> 'A': pass
-
-[case testOverloadedOperatorMethodOverrideWithDynamicallyTypedMethod]
-from typing import overload, Any
-class A:
- @overload
- def __add__(self, x: int) -> 'A': pass
- @overload
- def __add__(self, x: str) -> 'A': pass
-class B(A):
- def __add__(self, x): pass
-class C(A):
- def __add__(self, x: Any) -> A: pass
-
-[case testOverloadedOperatorMethodOverrideWithNewItem]
-from typing import overload, Any
-class A:
- @overload
- def __add__(self, x: int) -> 'A': pass
- @overload
- def __add__(self, x: str) -> 'A': pass
-class B(A):
- @overload
- def __add__(self, x: int) -> A: pass
- @overload
- def __add__(self, x: str) -> A: pass
- @overload
- def __add__(self, x: type) -> A: pass
-[out]
-main:8: error: Signature of "__add__" incompatible with supertype "A"
-
-[case testOverloadedOperatorMethodOverrideWithSwitchedItemOrder]
-from typing import overload, Any
-class A:
- @overload
- def __add__(self, x: 'B') -> 'B': pass
- @overload
- def __add__(self, x: 'A') -> 'A': pass
-class B(A):
- @overload
- def __add__(self, x: 'A') -> 'A': pass
- @overload
- def __add__(self, x: 'B') -> 'B': pass
-[out]
-main:8: error: Signature of "__add__" incompatible with supertype "A"
-
-[case testReverseOperatorMethodArgumentType]
-from typing import Any
-class A: pass
-class B:
- def __radd__(self, x: A) -> int: pass # Error
-class C:
- def __radd__(self, x: A) -> Any: pass
-class D:
- def __radd__(self, x: A) -> object: pass
-[out]
-
-[case testReverseOperatorMethodArgumentType2]
-from typing import Any, Tuple, Callable
-class A:
- def __radd__(self, x: Tuple[int, str]) -> int: pass
-class B:
- def __radd__(self, x: Callable[[], int]) -> int: pass
-class C:
- def __radd__(self, x: Any) -> int: pass
-[out]
-
-[case testReverseOperatorMethodForwardIsAny]
-from typing import Any
-def deco(f: Any) -> Any: return f
-class C:
- @deco
- def __add__(self, other: C) -> C: return C()
- def __radd__(self, other: C) -> C: return C()
-[out]
-
-[case testReverseOperatorMethodForwardIsAny2]
-from typing import Any
-def deco(f: Any) -> Any: return f
-class C:
- __add__ = None # type: Any
- def __radd__(self, other: C) -> C: return C()
-[out]
-
-[case testReverseOperatorMethodForwardIsAny3]
-from typing import Any
-def deco(f: Any) -> Any: return f
-class C:
- __add__ = 42
- def __radd__(self, other: C) -> C: return C()
-[out]
-main:5: error: Forward operator "__add__" is not callable
-
-[case testOverloadedReverseOperatorMethodArgumentType]
-from typing import overload, Any
-class A:
- @overload
- def __radd__(self, x: 'A') -> str: pass # Error
- @overload
- def __radd__(self, x: 'A') -> Any: pass
-[out]
-
-[case testReverseOperatorMethodArgumentTypeAndOverloadedMethod]
-from typing import overload
-class A:
- @overload
- def __add__(self, x: int) -> int: pass
- @overload
- def __add__(self, x: str) -> int: pass
- def __radd__(self, x: 'A') -> str: pass
-
-[case testAbstractReverseOperatorMethod]
-import typing
-from abc import abstractmethod
-class A:
- @abstractmethod
- def __lt__(self, x: 'A') -> int: pass
-class B:
- @abstractmethod
- def __lt__(self, x: 'B') -> int: pass
- @abstractmethod
- def __gt__(self, x: 'B') -> int: pass
-[out]
-
-[case testOperatorMethodsAndOverloadingSpecialCase]
-from typing import overload
-class A:
- @overload
- def __add__(self, x: 'A') -> int: pass
- @overload
- def __add__(self, x: str) -> int: pass
-class B:
- def __radd__(self, x: 'A') -> str: pass
-[out]
-
-[case testUnsafeOverlappingWithOperatorMethodsAndOverloading2]
-from typing import overload
-class A:
- def __add__(self, x: 'A') -> int: pass
-class B:
- @overload
- def __radd__(self, x: 'X') -> str: pass # Error
- @overload
- def __radd__(self, x: A) -> str: pass # Error
-class X:
- def __add__(self, x): pass
-[out]
-main:6: error: Signatures of "__radd__" of "B" and "__add__" of "X" are unsafely overlapping
-
-[case testUnsafeOverlappingWithLineNo]
-from typing import TypeVar
-T = TypeVar('T', Real)
-class Real:
- def __add__(self, other): ...
-class Fraction(Real):
- def __radd__(self, other: T) -> T: ...
-[out]
-main:6: error: Signatures of "__radd__" of "Fraction" and "__add__" of "Real" are unsafely overlapping
-
-[case testOverlappingNormalAndInplaceOperatorMethod]
-import typing
-class A:
- # Incompatible (potential trouble with __radd__)
- def __add__(self, x: 'A') -> int: pass
- def __iadd__(self, x: 'B') -> int: pass
-class B:
- # Safe
- def __add__(self, x: 'C') -> int: pass
- def __iadd__(self, x: A) -> int: pass
-class C(A): pass
-[out]
-main:5: error: Signatures of "__iadd__" and "__add__" are incompatible
-
-[case testOverloadedNormalAndInplaceOperatorMethod]
-from typing import overload
-class A:
- @overload
- def __add__(self, x: int) -> int: pass
- @overload
- def __add__(self, x: str) -> int: pass
- @overload # Error
- def __iadd__(self, x: int) -> int: pass
- @overload
- def __iadd__(self, x: object) -> int: pass
-class B:
- @overload
- def __add__(self, x: int) -> int: pass
- @overload
- def __add__(self, x: str) -> str: pass
- @overload
- def __iadd__(self, x: int) -> int: pass
- @overload
- def __iadd__(self, x: str) -> str: pass
-[out]
-main:7: error: Signatures of "__iadd__" and "__add__" are incompatible
-
-[case testIntroducingInplaceOperatorInSubclass]
-import typing
-class A:
- def __add__(self, x: 'A') -> 'B': pass
-class B(A):
- # __iadd__ effectively partially overrides __add__
- def __iadd__(self, x: 'A') -> 'A': pass # Error
-class C(A):
- def __iadd__(self, x: int) -> 'B': pass # Error
-class D(A):
- def __iadd__(self, x: 'A') -> 'B': pass
-[out]
-main:6: error: Return type of "__iadd__" incompatible with "__add__" of supertype "A"
-main:8: error: Argument 1 of "__iadd__" incompatible with "__add__" of supertype "A"
-main:8: error: Signatures of "__iadd__" and "__add__" are incompatible
-
-
-[case testGetAttr]
-
-a, b = None, None # type: A, B
-class A:
- def __getattr__(self, x: str) -> A:
- return A()
-class B: pass
-
-a = a.foo
-b = a.bar
-[out]
-main:9: error: Incompatible types in assignment (expression has type "A", variable has type "B")
-
-
-[case testGetAttrSignature]
-class A:
- def __getattr__(self, x: str) -> A: pass
-class B:
- def __getattr__(self, x: A) -> B: pass
-class C:
- def __getattr__(self, x: str, y: str) -> C: pass
-class D:
- def __getattr__(self, x: str) -> None: pass
-[out]
-main:4: error: Invalid signature "def (__main__.B, __main__.A) -> __main__.B"
-main:6: error: Invalid signature "def (__main__.C, builtins.str, builtins.str) -> __main__.C"
-
-
--- CallableType objects
--- ----------------
-
-
-[case testCallableObject]
-import typing
-a = A()
-b = B()
-
-a() # E: Too few arguments for "__call__" of "A"
-a(a, a) # E: Too many arguments for "__call__" of "A"
-a = a(a)
-a = a(b) # E: Argument 1 to "__call__" of "A" has incompatible type "B"; expected "A"
-b = a(a) # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-
-class A:
- def __call__(self, x: A) -> A:
- pass
-class B: pass
-
-
--- __new__
--- --------
-
-
-[case testConstructInstanceWith__new__]
-class C:
- def __new__(cls, foo: int = None) -> 'C':
- obj = object.__new__(cls)
- return obj
-
-x = C(foo=12)
-x.a # E: "C" has no attribute "a"
-C(foo='') # E: Argument 1 to "C" has incompatible type "str"; expected "int"
-[builtins fixtures/__new__.pyi]
-
-[case testConstructInstanceWithDynamicallyTyped__new__]
-class C:
- def __new__(cls, foo):
- obj = object.__new__(cls)
- return obj
-
-x = C(foo=12)
-x = C(foo='x')
-x.a # E: "C" has no attribute "a"
-C(bar='') # E: Unexpected keyword argument "bar" for "C"
-[builtins fixtures/__new__.pyi]
-
-[case testClassWith__new__AndCompatibilityWithType]
-class C:
- def __new__(cls, foo: int = None) -> 'C':
- obj = object.__new__(cls)
- return obj
-def f(x: type) -> None: pass
-def g(x: int) -> None: pass
-f(C)
-g(C) # E: Argument 1 to "g" has incompatible type "C"; expected "int"
-[builtins fixtures/__new__.pyi]
-
-[case testClassWith__new__AndCompatibilityWithType2]
-class C:
- def __new__(cls, foo):
- obj = object.__new__(cls)
- return obj
-def f(x: type) -> None: pass
-def g(x: int) -> None: pass
-f(C)
-g(C) # E: Argument 1 to "g" has incompatible type "C"; expected "int"
-[builtins fixtures/__new__.pyi]
-
-[case testGenericClassWith__new__]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-class C(Generic[T]):
- def __new__(cls, foo: T) -> 'C[T]':
- obj = object.__new__(cls)
- return obj
- def set(self, x: T) -> None: pass
-c = C('')
-c.set('')
-c.set(1) # E: Argument 1 to "set" of "C" has incompatible type "int"; expected "str"
-[builtins fixtures/__new__.pyi]
-
-[case testOverloaded__new__]
-from typing import overload
-class C:
- @overload
- def __new__(cls, foo: int) -> 'C':
- obj = object.__new__(cls)
- return obj
- @overload
- def __new__(cls, x: str, y: str) -> 'C':
- obj = object.__new__(cls)
- return obj
-c = C(1)
-c.a # E: "C" has no attribute "a"
-C('', '')
-C('') # E: No overload variant of "C" matches argument types [builtins.str]
-[builtins fixtures/__new__.pyi]
-
-
--- Special cases
--- -------------
-
-
-[case testSubclassInt]
-import typing
-class A(int): pass
-n = 0
-n = A()
-a = A()
-a = 0 # E: Incompatible types in assignment (expression has type "int", variable has type "A")
-
-[case testForwardReferenceToNestedClass]
-def f(o: 'B.C') -> None:
- o.f('') # E: Argument 1 to "f" of "C" has incompatible type "str"; expected "int"
-
-class B:
- class C:
- def f(self, x: int) -> None: pass
-[out]
-
-[case testForwardReferenceToNestedClassDeep]
-def f(o: 'B.C.D') -> None:
- o.f('') # E: Argument 1 to "f" of "D" has incompatible type "str"; expected "int"
-
-class B:
- class C:
- class D:
- def f(self, x: int) -> None: pass
-[out]
-
-[case testForwardReferenceToNestedClassWithinClass]
-class B:
- def f(self, o: 'C.D') -> None:
- o.f('') # E: Argument 1 to "f" of "D" has incompatible type "str"; expected "int"
-
- class C:
- class D:
- def f(self, x: int) -> None: pass
-[out]
-
-[case testClassVsInstanceDisambiguation]
-class A: pass
-def f(x: A) -> None: pass
-f(A) # E: Argument 1 to "f" has incompatible type "A" (type object); expected "A"
-[out]
-
--- TODO
--- attribute inherited from superclass; assign in __init__
--- refer to attribute before type has been inferred (the initialization in
--- __init__ has not been analyzed)
-
-[case testAnyBaseClassUnconstrainedConstructor]
-from typing import Any
-B = None # type: Any
-class C(B): pass
-C(0)
-C(arg=0)
-[out]
-
-[case testErrorMapToSupertype]
-import typing
-class X(Nope): pass # E: Name 'Nope' is not defined
-a, b = X() # Used to crash here (#2244)
-
-
--- Class-valued attributes
--- -----------------------
-
-[case testClassValuedAttributesBasics]
-class A: ...
-class B:
- a = A
- bad = lambda: 42
-
-B().bad() # E: Invalid method type
-reveal_type(B.a) # E: Revealed type is 'def () -> __main__.A'
-reveal_type(B().a) # E: Revealed type is 'def () -> __main__.A'
-reveal_type(B().a()) # E: Revealed type is '__main__.A'
-
-class C:
- a = A
- def __init__(self) -> None:
- self.aa = self.a()
-
-reveal_type(C().aa) # E: Revealed type is '__main__.A'
-[out]
-
-[case testClassValuedAttributesGeneric]
-from typing import Generic, TypeVar
-T = TypeVar('T')
-
-class A(Generic[T]):
- def __init__(self, x: T) -> None:
- self.x = x
-class B(Generic[T]):
- a = A[T]
-
-reveal_type(B[int]().a) # E: Revealed type is 'def (x: builtins.int*) -> __main__.A[builtins.int*]'
-B[int]().a('hi') # E: Argument 1 has incompatible type "str"; expected "int"
-
-class C(Generic[T]):
- a = A
- def __init__(self) -> None:
- self.aa = self.a(42)
-
-reveal_type(C().aa) # E: Revealed type is '__main__.A[builtins.int]'
-[out]
-
-[case testClassValuedAttributesAlias]
-from typing import Generic, TypeVar
-T = TypeVar('T')
-S = TypeVar('S')
-
-class A(Generic[T, S]): ...
-
-SameA = A[T, T]
-
-class B:
- a_any = SameA
- a_int = SameA[int]
-
-reveal_type(B().a_any) # E: Revealed type is 'def () -> __main__.A[Any, Any]'
-reveal_type(B().a_int()) # E: Revealed type is '__main__.A[builtins.int*, builtins.int*]'
-
-class C:
- a_int = SameA[int]
- def __init__(self) -> None:
- self.aa = self.a_int()
-
-reveal_type(C().aa) # E: Revealed type is '__main__.A[builtins.int*, builtins.int*]'
-[out]
-
-
--- Type[C]
--- -------
-
-
-[case testTypeUsingTypeCBasic]
-from typing import Type
-class User: pass
-class ProUser(User): pass
-def new_user(user_class: Type[User]) -> User:
- return user_class()
-reveal_type(new_user(User)) # E: Revealed type is '__main__.User'
-reveal_type(new_user(ProUser)) # E: Revealed type is '__main__.User'
-[out]
-
-[case testTypeUsingTypeCDefaultInit]
-from typing import Type
-class B:
- pass
-def f(A: Type[B]) -> None:
- A(0) # E: Too many arguments for "B"
- A()
-[out]
-
-[case testTypeUsingTypeCInitWithArg]
-from typing import Type
-class B:
- def __init__(self, a: int) -> None: pass
-def f(A: Type[B]) -> None:
- A(0)
- A() # E: Too few arguments for "B"
-[out]
-
-[case testTypeUsingTypeCTypeVar]
-from typing import Type, TypeVar
-class User: pass
-class ProUser(User): pass
-U = TypeVar('U', bound=User)
-def new_user(user_class: Type[U]) -> U:
- user = user_class()
- reveal_type(user)
- return user
-pro_user = new_user(ProUser)
-reveal_type(pro_user)
-[out]
-main:7: error: Revealed type is 'U`-1'
-main:10: error: Revealed type is '__main__.ProUser*'
-
-[case testTypeUsingTypeCTypeVarDefaultInit]
-from typing import Type, TypeVar
-class B:
- pass
-T = TypeVar('T', bound=B)
-def f(A: Type[T]) -> None:
- A()
- A(0) # E: Too many arguments for "B"
-[out]
-
-[case testTypeUsingTypeCTypeVarWithInit]
-from typing import Type, TypeVar
-class B:
- def __init__(self, a: int) -> None: pass
-T = TypeVar('T', bound=B)
-def f(A: Type[T]) -> None:
- A() # E: Too few arguments for "B"
- A(0)
-[out]
-
-[case testTypeUsingTypeCTwoTypeVars]
-from typing import Type, TypeVar
-class User: pass
-class ProUser(User): pass
-class WizUser(ProUser): pass
-U = TypeVar('U', bound=User)
-def new_user(u_c: Type[U]) -> U: pass
-P = TypeVar('P', bound=ProUser)
-def new_pro(pro_c: Type[P]) -> P:
- return new_user(pro_c)
-wiz = new_pro(WizUser)
-reveal_type(wiz)
-def error(u_c: Type[U]) -> P:
- return new_pro(u_c) # Error here, see below
-[out]
-main:11: error: Revealed type is '__main__.WizUser*'
-main:13: error: Incompatible return value type (got "U", expected "P")
-main:13: error: Type argument 1 of "new_pro" has incompatible value "U"
-
-[case testTypeUsingTypeCCovariance]
-from typing import Type, TypeVar
-class User: pass
-class ProUser(User): pass
-def new_user(user_class: Type[User]) -> User:
- return user_class()
-def new_pro_user(user_class: Type[ProUser]):
- new_user(user_class)
-[out]
-
-[case testTypeUsingTypeCErrorCovariance]
-from typing import Type, TypeVar
-class User: pass
-def new_user(user_class: Type[User]):
- return user_class()
-def foo(arg: Type[int]):
- new_user(arg) # E: Argument 1 to "new_user" has incompatible type Type[int]; expected Type[User]
-[out]
-
-[case testTypeUsingTypeCUnionOverload]
-from typing import Type, Union, overload
-class X:
- @overload
- def __init__(self) -> None: pass
- @overload
- def __init__(self, a: int) -> None: pass
-class Y:
- def __init__(self) -> None: pass
-def bar(o: Type[Union[X, Y]]): pass
-bar(X)
-bar(Y)
-[out]
-
-[case testTypeUsingTypeCTypeAny]
-from typing import Type, Any
-def foo(arg: Type[Any]):
- x = arg()
- x = arg(0)
- x = arg('', ())
- reveal_type(x) # E: Revealed type is 'Any'
- x.foo
-class X: pass
-foo(X)
-[out]
-
-[case testTypeUsingTypeCTypeNoArg]
-from typing import Type
-def foo(arg: Type):
- x = arg()
- reveal_type(x) # E: Revealed type is 'Any'
-class X: pass
-foo(X)
-[out]
-
-[case testTypeUsingTypeCBuiltinType]
-from typing import Type
-def foo(arg: type): pass
-class X: pass
-def bar(arg: Type[X]):
- foo(arg)
-foo(X)
-[builtins fixtures/tuple.pyi]
-[out]
-
-[case testTypeUsingTypeCClassMethod]
-from typing import Type
-class User:
- @classmethod
- def foo(cls) -> int: pass
- def bar(self) -> int: pass
-def process(cls: Type[User]):
- reveal_type(cls.foo()) # E: Revealed type is 'builtins.int'
- obj = cls()
- reveal_type(cls.bar(obj)) # E: Revealed type is 'builtins.int'
- cls.mro() # Defined in class type
- cls.error # E: Type[User] has no attribute "error"
-[builtins fixtures/classmethod.pyi]
-[out]
-
-[case testTypeUsingTypeCClassMethodUnion]
-# Ideally this would work, but not worth the effort; just don't crash
-from typing import Type, Union
-class User:
- @classmethod
- def foo(cls) -> int: pass
- def bar(self) -> int: pass
-class ProUser(User): pass
-class BasicUser(User): pass
-def process(cls: Type[Union[BasicUser, ProUser]]):
- cls.foo() # E: Type[Union[BasicUser, ProUser]] has no attribute "foo"
- obj = cls()
- cls.bar(obj) # E: Type[Union[BasicUser, ProUser]] has no attribute "bar"
- cls.mro() # Defined in class type
- cls.error # E: Type[Union[BasicUser, ProUser]] has no attribute "error"
-[builtins fixtures/classmethod.pyi]
-[out]
-
-[case testTypeUsingTypeCClassMethodFromTypeVar]
-from typing import Type, TypeVar
-class User:
- @classmethod
- def foo(cls) -> int: pass
- def bar(self) -> int: pass
-U = TypeVar('U', bound=User)
-def process(cls: Type[U]):
- reveal_type(cls.foo()) # E: Revealed type is 'builtins.int'
- obj = cls()
- reveal_type(cls.bar(obj)) # E: Revealed type is 'builtins.int'
- cls.mro() # Defined in class type
- cls.error # E: Type[U] has no attribute "error"
-[builtins fixtures/classmethod.pyi]
-[out]
-
-[case testTypeUsingTypeCClassMethodFromTypeVarUnionBound]
-# Ideally this would work, but not worth the effort; just don't crash
-from typing import Type, TypeVar, Union
-class User:
- @classmethod
- def foo(cls) -> int: pass
- def bar(self) -> int: pass
-class ProUser(User): pass
-class BasicUser(User): pass
-U = TypeVar('U', bound=Union[ProUser, BasicUser])
-def process(cls: Type[U]):
- cls.foo() # E: Type[U] has no attribute "foo"
- obj = cls()
- cls.bar(obj) # E: Type[U] has no attribute "bar"
- cls.mro() # Defined in class type
- cls.error # E: Type[U] has no attribute "error"
-[builtins fixtures/classmethod.pyi]
-[out]
-
-[case testTypeUsingTypeCErrorUnsupportedType]
-from typing import Type, Tuple
-def foo(arg: Type[Tuple[int]]): # E: Unsupported type Type["Tuple[int]"]
- arg()
-[builtins fixtures/tuple.pyi]
-[out]
-
-[case testTypeUsingTypeCOverloadedClass]
-from typing import Type, TypeVar, overload
-class User:
- @overload
- def __init__(self) -> None: pass
- @overload
- def __init__(self, arg: int) -> None: pass
- @classmethod
- def foo(cls) -> None: pass
-U = TypeVar('U', bound=User)
-def new(uc: Type[U]) -> U:
- uc.foo()
- u = uc()
- u.foo()
- u = uc(0)
- u.foo()
- u = uc('')
- u.foo(0)
- return uc()
-u = new(User)
-[builtins fixtures/classmethod.pyi]
-[out]
-main:16: error: No overload variant of "User" matches argument types [builtins.str]
-main:17: error: Too many arguments for "foo" of "User"
-
-[case testTypeUsingTypeCInUpperBound]
-from typing import TypeVar, Type
-class B: pass
-T = TypeVar('T', bound=Type[B])
-def f(a: T): pass
-[out]
-
-[case testTypeUsingTypeCTuple]
-from typing import Type, Tuple
-def f(a: Type[Tuple[int, int]]):
- a()
-[out]
-main:2: error: Unsupported type Type["Tuple[int, int]"]
-
-[case testTypeUsingTypeCNamedTuple]
-from typing import Type, NamedTuple
-N = NamedTuple('N', [('x', int), ('y', int)])
-def f(a: Type[N]):
- a()
-[builtins fixtures/list.pyi]
-[out]
-main:3: error: Unsupported type Type["N"]
-
-[case testTypeUsingTypeCJoin]
-from typing import Type
-class B: pass
-class C(B): pass
-class D(B): pass
-def foo(c: Type[C], d: Type[D]) -> None:
- x = [c, d]
- reveal_type(x)
-
-[builtins fixtures/list.pyi]
-[out]
-main:7: error: Revealed type is 'builtins.list[Type[__main__.B]]'
-
-[case testTypeMatchesOverloadedFunctions]
-from typing import Type, overload, Union
-
-class User: pass
-UserType = User # type: Type[User]
-
- at overload
-def f(a: object) -> int: pass
- at overload
-def f(a: int) -> str: pass
-
-reveal_type(f(User)) # E: Revealed type is 'builtins.int'
-reveal_type(f(UserType)) # E: Revealed type is 'builtins.int'
-[builtins fixtures/classmethod.pyi]
-[out]
-
-[case testTypeMatchesGeneralTypeInOverloadedFunctions]
-from typing import Type, overload
-
-class User: pass
-UserType = User # type: Type[User]
-
- at overload
-def f(a: type) -> int:
- return 1
- at overload
-def f(a: int) -> str:
- return "a"
-
-reveal_type(f(User)) # E: Revealed type is 'builtins.int'
-reveal_type(f(UserType)) # E: Revealed type is 'builtins.int'
-reveal_type(f(1)) # E: Revealed type is 'builtins.str'
-[builtins fixtures/classmethod.pyi]
-[out]
-
-[case testTypeMatchesSpecificTypeInOverloadedFunctions]
-from typing import Type, overload
-
-class User: pass
-UserType = User # type: Type[User]
-
- at overload
-def f(a: User) -> User:
- return User()
- at overload
-def f(a: Type[User]) -> int:
- return 1
- at overload
-def f(a: int) -> str:
- return "a"
-
-reveal_type(f(User)) # E: Revealed type is 'builtins.int'
-reveal_type(f(UserType)) # E: Revealed type is 'builtins.int'
-reveal_type(f(User())) # E: Revealed type is '__main__.User'
-reveal_type(f(1)) # E: Revealed type is 'builtins.str'
-[builtins fixtures/classmethod.pyi]
-[out]
-
-[case testMixingTypeTypeInOverloadedFunctions]
-from typing import Type, overload
-
-class User: pass
-
- at overload
-def f(a: User) -> Type[User]:
- return User
- at overload
-def f(a: Type[User]) -> User:
- return a()
- at overload
-def f(a: int) -> Type[User]:
- return User
- at overload
-def f(a: str) -> User:
- return User()
-
-reveal_type(f(User())) # E: Revealed type is 'Type[__main__.User]'
-reveal_type(f(User)) # E: Revealed type is '__main__.User'
-reveal_type(f(3)) # E: Revealed type is 'Type[__main__.User]'
-reveal_type(f("hi")) # E: Revealed type is '__main__.User'
-[builtins fixtures/classmethod.pyi]
-[out]
-
-[case testGeneralTypeDoesNotMatchSpecificTypeInOverloadedFunctions]
-from typing import Type, overload
-
-class User: pass
-
- at overload
-def f(a: Type[User]) -> None: pass
- at overload
-def f(a: int) -> None: pass
-
-def mock() -> type: return User
-
-f(User)
-f(mock()) # E: No overload variant of "f" matches argument types [builtins.type]
-[builtins fixtures/classmethod.pyi]
-[out]
-
-[case testNonTypeDoesNotMatchOverloadedFunctions]
-from typing import Type, overload
-
-class User: pass
-
- at overload
-def f(a: Type[User]) -> None: pass
- at overload
-def f(a: type) -> None: pass
-
-f(3) # E: No overload variant of "f" matches argument types [builtins.int]
-[builtins fixtures/classmethod.pyi]
-[out]
-
-[case testInstancesDoNotMatchTypeInOverloadedFunctions]
-from typing import Type, overload
-
-class User: pass
-
- at overload
-def f(a: Type[User]) -> None: pass
- at overload
-def f(a: int) -> None: pass
-
-f(User)
-f(User()) # E: No overload variant of "f" matches argument types [__main__.User]
-[builtins fixtures/classmethod.pyi]
-[out]
-
-[case testTypeCovarianceWithOverloadedFunctions]
-from typing import Type, overload
-
-class A: pass
-class B(A): pass
-class C(B): pass
-AType = A # type: Type[A]
-BType = B # type: Type[B]
-CType = C # type: Type[C]
-
- at overload
-def f(a: Type[B]) -> None: pass
- at overload
-def f(a: int) -> None: pass
-
-f(A) # E: No overload variant of "f" matches argument types [def () -> __main__.A]
-f(B)
-f(C)
-f(AType) # E: No overload variant of "f" matches argument types [Type[__main__.A]]
-f(BType)
-f(CType)
-[builtins fixtures/classmethod.pyi]
-[out]
-
-
-[case testOverloadedCovariantTypesFail]
-from typing import Type, overload
-
-class A: pass
-class B(A): pass
-
- at overload
-def f(a: Type[A]) -> int: pass # E: Overloaded function signatures 1 and 2 overlap with incompatible return types
- at overload
-def f(a: Type[B]) -> str: pass
-[builtins fixtures/classmethod.pyi]
-[out]
-
-[case testDistinctOverloadedCovariantTypesSucceed]
-from typing import Type, overload
-
-class A: pass
-class AChild(A): pass
-class B: pass
-class BChild(B): pass
-
- at overload
-def f(a: Type[A]) -> int: pass
- at overload
-def f(a: Type[B]) -> str: pass
- at overload
-def f(a: A) -> A: pass
- at overload
-def f(a: B) -> B: pass
-
-reveal_type(f(A)) # E: Revealed type is 'builtins.int'
-reveal_type(f(AChild)) # E: Revealed type is 'builtins.int'
-reveal_type(f(B)) # E: Revealed type is 'builtins.str'
-reveal_type(f(BChild)) # E: Revealed type is 'builtins.str'
-
-reveal_type(f(A())) # E: Revealed type is '__main__.A'
-reveal_type(f(AChild())) # E: Revealed type is '__main__.A'
-reveal_type(f(B())) # E: Revealed type is '__main__.B'
-reveal_type(f(BChild())) # E: Revealed type is '__main__.B'
-[builtins fixtures/classmethod.pyi]
-[out]
-
-[case testTypeTypeOverlapsWithObjectAndType]
-from typing import Type, overload
-
-class User: pass
-
- at overload
-def f(a: Type[User]) -> int: pass # E: Overloaded function signatures 1 and 2 overlap with incompatible return types
- at overload
-def f(a: object) -> str: pass
-
- at overload
-def g(a: Type[User]) -> int: pass # E: Overloaded function signatures 1 and 2 overlap with incompatible return types
- at overload
-def g(a: type) -> str: pass
-[builtins fixtures/classmethod.pyi]
-[out]
-
-[case testTypeOverlapsWithObject]
-from typing import Type, overload
-
-class User: pass
-
- at overload
-def f(a: type) -> int: pass # E: Overloaded function signatures 1 and 2 overlap with incompatible return types
- at overload
-def f(a: object) -> str: pass
-[builtins fixtures/classmethod.pyi]
-[out]
-
-[case testTypeConstructorReturnsTypeType]
-class User:
- @classmethod
- def test_class_method(cls) -> int: pass
- @staticmethod
- def test_static_method() -> str: pass
- def test_instance_method(self) -> None: pass
-
-u = User()
-
-reveal_type(type(u)) # E: Revealed type is 'Type[__main__.User]'
-reveal_type(type(u).test_class_method()) # E: Revealed type is 'builtins.int'
-reveal_type(type(u).test_static_method()) # E: Revealed type is 'builtins.str'
-type(u).test_instance_method() # E: Too few arguments for "test_instance_method" of "User"
-[builtins fixtures/classmethod.pyi]
-[out]
-
-[case testObfuscatedTypeConstructorReturnsTypeType]
-from typing import TypeVar
-class User: pass
-
-f1 = type
-
-A = TypeVar('A')
-def f2(func: A) -> A:
- return func
-
-u = User()
-
-reveal_type(f1(u)) # E: Revealed type is 'Type[__main__.User]'
-reveal_type(f2(type)(u)) # E: Revealed type is 'Type[__main__.User]'
-[builtins fixtures/classmethod.pyi]
-[out]
-
-[case testTypeConstructorLookalikeFails]
-class User: pass
-
-def fake1(a: object) -> type:
- return User
-def fake2(a: int) -> type:
- return User
-
-reveal_type(type(User())) # E: Revealed type is 'Type[__main__.User]'
-reveal_type(fake1(User())) # E: Revealed type is 'builtins.type'
-reveal_type(fake2(3)) # E: Revealed type is 'builtins.type'
-[builtins fixtures/classmethod.pyi]
-[out]
-
-[case testOtherTypeConstructorsSucceed]
-def foo(self) -> int: return self.attr
-
-User = type('User', (object,), {'foo': foo, 'attr': 3})
-reveal_type(User) # E: Revealed type is 'builtins.type'
-[builtins fixtures/args.pyi]
-[out]
-
-[case testTypeTypeComparisonWorks]
-class User: pass
-
-User == User
-User == type(User())
-type(User()) == User
-type(User()) == type(User())
-
-User != User
-User != type(User())
-type(User()) != User
-type(User()) != type(User())
-
-int == int
-int == type(3)
-type(3) == int
-type(3) == type(3)
-
-int != int
-int != type(3)
-type(3) != int
-type(3) != type(3)
-
-User is User
-User is type(User)
-type(User) is User
-type(User) is type(User)
-
-int is int
-int is type(3)
-type(3) is int
-type(3) is type(3)
-
-int.__eq__(int)
-int.__eq__(3, 4)
-[builtins fixtures/args.pyi]
-[out]
-main:33: error: Too few arguments for "__eq__" of "int"
-main:33: error: Unsupported operand types for == ("int" and "int")
-
-[case testMroSetAfterError]
-class C(str, str):
- foo = 0
- bar = foo
-[out]
-main:1: error: Duplicate base class "str"
-
-[case testCannotDetermineMro]
-class A: pass
-class B(A): pass
-class C(B): pass
-class D(A, B): pass # E: Cannot determine consistent method resolution order (MRO) for "D"
-class E(C, D): pass # E: Cannot determine consistent method resolution order (MRO) for "E"
-
-[case testInconsistentMroLocalRef]
-class A: pass
-class B(object, A): # E: Cannot determine consistent method resolution order (MRO) for "B"
- def readlines(self): pass
- __iter__ = readlines
-
-[case testDynamicMetaclass]
-# flags: --fast-parser
-class C(metaclass=int()): # E: Dynamic metaclass not supported for 'C'
- pass
diff --git a/test-data/unit/check-columns.test b/test-data/unit/check-columns.test
deleted file mode 100644
index ae8bab8..0000000
--- a/test-data/unit/check-columns.test
+++ /dev/null
@@ -1,68 +0,0 @@
-[case testColumnsSyntaxError]
-# flags: --show-column-numbers
-1 +
-[out]
-main:2:3: error: Parse error before end of line
-
-
-[case testColumnsNestedFunctions]
-# flags: --show-column-numbers
-import typing
-def f() -> 'A':
- def g() -> 'B':
- return A() # fail
- return B() # fail
-class A: pass
-class B: pass
-[out]
-main:5:8: error: Incompatible return value type (got "A", expected "B")
-main:6:4: error: Incompatible return value type (got "B", expected "A")
-
-[case testColumnsNestedFunctionsWithFastParse]
-# flags: --show-column-numbers --fast-parser
-import typing
-def f() -> 'A':
- def g() -> 'B':
- return A() # fail
- return B() # fail
-class A: pass
-class B: pass
-[out]
-main:5:8: error: Incompatible return value type (got "A", expected "B")
-main:6:4: error: Incompatible return value type (got "B", expected "A")
-
-
-[case testColumnsMethodDefaultArgumentsAndSignatureAsComment]
-# flags: --show-column-numbers
-import typing
-class A:
- def f(self, x = 1, y = 'hello'): # type: (int, str) -> str
- pass
-A().f()
-A().f(1)
-A().f('') # E:5: Argument 1 to "f" of "A" has incompatible type "str"; expected "int"
-A().f(1, 1) # E:5: Argument 2 to "f" of "A" has incompatible type "int"; expected "str"
-A().f(1, 'hello', 'hi') # E:5: Too many arguments for "f" of "A"
-
-[case testColumnsMultipleStatementsPerLine]
-# flags: --show-column-numbers
-x = 1
-y = 'hello'
-x = 2; y = x; y += 1
-[out]
-main:4:7: error: Incompatible types in assignment (expression has type "int", variable has type "str")
-main:4:14: error: Unsupported operand types for + ("str" and "int")
-
-[case testColumnsSimpleIsinstance]
-# flags: --show-column-numbers
-import typing
-def f(x: object, n: int, s: str) -> None:
- n = x # E:4: Incompatible types in assignment (expression has type "object", variable has type "int")
- if isinstance(x, int):
- n = x
- s = x # E:8: Incompatible types in assignment (expression has type "int", variable has type "str")
- n = x # E:4: Incompatible types in assignment (expression has type "object", variable has type "int")
-[builtins fixtures/isinstance.pyi]
-[out]
-
-
diff --git a/test-data/unit/check-dynamic-typing.test b/test-data/unit/check-dynamic-typing.test
deleted file mode 100644
index 997a996..0000000
--- a/test-data/unit/check-dynamic-typing.test
+++ /dev/null
@@ -1,676 +0,0 @@
--- Assignment
--- ----------
-
-
-[case testAssignmentWithDynamic]
-from typing import Any
-d = None # type: Any
-a = None # type: A
-
-a = d # Everything ok
-d = a
-d = d
-d.x = a
-d.x = d
-
-class A: pass
-
-[case testMultipleAssignmentWithDynamic]
-from typing import Any
-d = None # type: Any
-a, b = None, None # type: (A, B)
-
-d, a = b, b # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-d, d = d, d, d # E: Too many values to unpack (2 expected, 3 provided)
-
-a, b = d, d
-d, d = a, b
-a, b = d
-s, t = d
-
-class A: pass
-class B: pass
-
-
--- Expressions
--- -----------
-
-
-[case testCallingFunctionWithDynamicArgumentTypes]
-from typing import Any
-a, b = None, None # type: (A, B)
-
-b = f(a) # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-
-a = f(a)
-a = f(b)
-a = f(None)
-a = f(f)
-
-def f(x: Any) -> 'A':
- pass
-
-class A: pass
-class B: pass
-
-[case testCallingWithDynamicReturnType]
-from typing import Any
-a, b = None, None # type: (A, B)
-
-a = f(b) # E: Argument 1 to "f" has incompatible type "B"; expected "A"
-
-a = f(a)
-b = f(a)
-
-def f(x: 'A') -> Any:
- pass
-
-class A: pass
-class B: pass
-
-[case testBinaryOperationsWithDynamicLeftOperand]
-from typing import Any
-d = None # type: Any
-a = None # type: A
-c = None # type: C
-b = None # type: bool
-n = 0
-
-d in a # E: Unsupported right operand type for in ("A")
-d and a
-d or a
-c = d and b # Unintuitive type inference?
-c = d or b # Unintuitive type inference?
-
-c = d + a
-c = d - a
-c = d * a
-c = d / a
-c = d // a
-c = d % a
-c = d ** a
-b = d == a
-b = d != a
-b = d < a
-b = d <= a
-b = d > a
-b = d >= a
-b = d in c
-b = d and b
-b = d or b
-
-class A: pass
-class C:
- def __contains__(self, a: A) -> bool:
- pass
-[file builtins.py]
-class object:
- def __init__(self): pass
-class bool: pass
-class int: pass
-class type: pass
-class function: pass
-class str: pass
-
-[case testBinaryOperationsWithDynamicAsRightOperand]
-from typing import Any
-d = None # type: Any
-a = None # type: A
-c = None # type: C
-b = None # type: bool
-n = 0
-
-a and d
-a or d
-c = a in d
-c = b and d # Unintuitive type inference?
-c = b or d # Unintuitive type inference?
-b = a + d
-b = a / d
-
-c = a + d
-c = a - d
-c = a * d
-c = a / d
-c = a // d
-c = a % d
-c = a ** d
-b = a in d
-b = b and d
-b = b or d
-
-class A:
- def __add__(self, a: 'A') -> 'C':
- pass
- def __sub__(self, a: 'A') -> 'C':
- pass
- def __mul__(self, a: 'A') -> 'C':
- pass
- def __truediv__(self, a: 'A') -> 'C':
- pass
- def __floordiv__(self, a: 'A') -> 'C':
- pass
- def __mod__(self, a: 'A') -> 'C':
- pass
- def __pow__(self, a: 'A') -> 'C':
- pass
- def _lt(self, a: 'A') -> bool:
- pass
- def _gt(self, a: 'A') -> bool:
- pass
-
-class C: pass
-[file builtins.py]
-class object:
- def __init__(self): pass
-class bool: pass
-class int: pass
-class type: pass
-class function: pass
-class str: pass
-
-[case testDynamicWithUnaryExpressions]
-from typing import Any
-d = None # type: Any
-a = None # type: A
-b = None # type: bool
-a = not d # E: Incompatible types in assignment (expression has type "bool", variable has type "A")
-b = not d
-a = -d
-class A: pass
-[builtins fixtures/bool.pyi]
-[out]
-
-[case testDynamicWithMemberAccess]
-from typing import Any
-d = None # type: Any
-a = None # type: A
-
-a = d.foo(a()) # E: "A" not callable
-
-a = d.x
-a = d.foo(a, a)
-d.x = a
-d.x.y.z # E: "A" has no attribute "y"
-
-class A: pass
-[out]
-
-[case testIndexingWithDynamic]
-from typing import Any
-d = None # type: Any
-a = None # type: A
-
-a = d[a()] # E: "A" not callable
-d[a()] = a # E: "A" not callable
-
-a = d[a]
-d[a] = a
-d[a], d[a] = a, a
-
-class A: pass
-
-[case testTupleExpressionsWithDynamci]
-from typing import Tuple, Any
-t2 = None # type: Tuple[A, A]
-d = None # type: Any
-
-t2 = (d, d, d) # E: Incompatible types in assignment (expression has type "Tuple[Any, Any, Any]", variable has type "Tuple[A, A]")
-t2 = (d, d)
-
-class A: pass
-[builtins fixtures/tuple.pyi]
-
-[case testCastsWithDynamicType]
-from typing import Any, cast
-class A: pass
-class B: pass
-d = None # type: Any
-a = None # type: A
-b = None # type: B
-b = cast(A, d) # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-a = cast(A, d)
-b = Any(d)
-a = Any(f())
-def f() -> None: pass
-
-[case testCompatibilityOfDynamicWithOtherTypes]
-from typing import Any, Tuple
-d = None # type: Any
-t = None # type: Tuple[A, A]
-# TODO: callable types, overloaded functions
-
-d = None # All ok
-d = t
-d = g
-d = A
-t = d
-f = d
-
-def g(a: 'A') -> None:
- pass
-
-class A: pass
-class B: pass
-[builtins fixtures/tuple.pyi]
-
-
--- Statements
--- ----------
-
-
-[case testDynamicCondition]
-from typing import Any
-d = None # type: Any
-while d:
- pass
-if d:
- pass
-elif d:
- pass
-[builtins fixtures/bool.pyi]
-
-[case testRaiseWithDynamic]
-from typing import Any
-d = None # type: Any
-raise d
-[builtins fixtures/exception.pyi]
-
-[case testReturnWithDynamic]
-from typing import Any
-d = None # type: Any
-
-def f() -> None:
- return d # Ok
-
-def g() -> 'A':
- return d # Ok
-
-class A: pass
-
-
--- Implicit dynamic types for functions
--- ------------------------------------
-
-
-[case testImplicitGlobalFunctionSignature]
-from typing import Any, Callable
-x = None # type: Any
-a = None # type: A
-g = None # type: Callable[[], None]
-h = None # type: Callable[[A], None]
-
-f() # E: Too few arguments for "f"
-f(x, x) # E: Too many arguments for "f"
-g = f # E: Incompatible types in assignment (expression has type Callable[[Any], Any], variable has type Callable[[], None])
-f(a)
-f(x)
-a = f(a)
-h = f
-
-def f(x): pass
-
-class A: pass
-
-[case testImplicitGlobalFunctionSignatureWithDifferentArgCounts]
-from typing import Callable
-g0 = None # type: Callable[[], None]
-g1 = None # type: Callable[[A], None]
-g2 = None # type: Callable[[A, A], None]
-a = None # type: A
-
-g1 = f0 # E: Incompatible types in assignment (expression has type Callable[[], Any], variable has type Callable[[A], None])
-g2 = f0 # E: Incompatible types in assignment (expression has type Callable[[], Any], variable has type Callable[[A, A], None])
-g0 = f2 # E: Incompatible types in assignment (expression has type Callable[[Any, Any], Any], variable has type Callable[[], None])
-g1 = f2 # E: Incompatible types in assignment (expression has type Callable[[Any, Any], Any], variable has type Callable[[A], None])
-
-g0 = g0
-g2 = f2
-f0()
-f2(a, a)
-
-def f0(): pass
-
-def f2(x, y): pass
-
-class A: pass
-
-[case testImplicitGlobalFunctionSignatureWithDefaultArgs]
-from typing import Callable
-a, b = None, None # type: (A, B)
-
-g0 = None # type: Callable[[], None]
-g1 = None # type: Callable[[A], None]
-g2 = None # type: Callable[[A, A], None]
-g3 = None # type: Callable[[A, A, A], None]
-g4 = None # type: Callable[[A, A, A, A], None]
-
-f01(a, a) # Fail
-f13() # Fail
-f13(a, a, a, a) # Fail
-g2 = f01 # Fail
-g0 = f13 # Fail
-g4 = f13 # Fail
-
-f01()
-f01(a)
-f13(a)
-f13(a, a)
-f13(a, a, a)
-
-g0 = f01
-g1 = f01
-g1 = f13
-g2 = f13
-g3 = f13
-
-def f01(x = b): pass
-def f13(x, y = b, z = b): pass
-
-class A: pass
-class B: pass
-[out]
-main:10: error: Too many arguments for "f01"
-main:11: error: Too few arguments for "f13"
-main:12: error: Too many arguments for "f13"
-main:13: error: Incompatible types in assignment (expression has type Callable[[Any], Any], variable has type Callable[[A, A], None])
-main:14: error: Incompatible types in assignment (expression has type Callable[[Any, Any, Any], Any], variable has type Callable[[], None])
-main:15: error: Incompatible types in assignment (expression has type Callable[[Any, Any, Any], Any], variable has type Callable[[A, A, A, A], None])
-
-[case testSkipTypeCheckingWithImplicitSignature]
-
-a = None # type: A
-def f():
- a()
-def g(x):
- a()
- a.x
- a + a
- if a():
- a()
-class A: pass
-[builtins fixtures/bool.pyi]
-
-[case testSkipTypeCheckingWithImplicitSignatureAndDefaultArgs]
-
-a = None # type: A
-def f(x=a()):
- a()
-def g(x, y=a, z=a()):
- a()
-class A: pass
-
-[case testImplicitMethodSignature]
-from typing import Callable
-g0 = None # type: Callable[[], None]
-g1 = None # type: Callable[[A], None]
-g2 = None # type: Callable[[A, A], None]
-a = None # type: A
-
-g0 = a.f # E: Incompatible types in assignment (expression has type Callable[[Any], Any], variable has type Callable[[], None])
-g2 = a.f # E: Incompatible types in assignment (expression has type Callable[[Any], Any], variable has type Callable[[A, A], None])
-a = a.f # E: Incompatible types in assignment (expression has type Callable[[Any], Any], variable has type "A")
-
-class A:
- def g(self) -> None:
- a = self.f(a)
- def f(self, x): pass
-
-g1 = a.f
-a = a.f(a)
-
-[case testSkipTypeCheckingImplicitMethod]
-
-a = None # type: A
-class A:
- def f(self):
- a()
- def g(self, x, y=a()):
- a()
-
-[case testImplicitInheritedMethod]
-from typing import Callable
-g0 = None # type: Callable[[], None]
-g1 = None # type: Callable[[A], None]
-a = None # type: A
-
-g0 = a.f # E: Incompatible types in assignment (expression has type Callable[[Any], Any], variable has type Callable[[], None])
-
-g1 = a.f
-a = a.f(a)
-
-class B:
- def f(self, x):
- pass
-class A(B):
- def g(self) -> None:
- a = self.f(a)
-
-[case testEmptyReturnWithImplicitSignature]
-import typing
-def f():
- return
-class A:
- def g(self):
- return
-
-[case testVarArgsWithImplicitSignature]
-from typing import Any
-o = None # type: Any
-def f(x, *a): pass
-f() # E: Too few arguments for "f"
-f(o)
-f(o, o)
-f(o, o, o)
-[builtins fixtures/list.pyi]
-
-
--- Implicit types for constructors
--- -------------------------------
-
-
-[case testInitMethodWithImplicitSignature]
-from typing import Callable
-f1 = None # type: Callable[[A], A]
-f2 = None # type: Callable[[A, A], A]
-a = None # type: A
-
-A(a) # Fail
-f1 = A # Fail
-
-A(a, a)
-f2 = A
-
-class A:
- def __init__(self, a, b): pass
-[out]
-main:6: error: Too few arguments for "A"
-main:7: error: Incompatible types in assignment (expression has type "A", variable has type Callable[[A], A])
-
-[case testUsingImplicitTypeObjectWithIs]
-
-t = None # type: type
-t = A
-t = B
-
-class A: pass
-class B:
- def __init__(self): pass
-
-
--- Type compatibility
--- ------------------
-
-
-[case testTupleTypeCompatibility]
-from typing import Any, Tuple
-t1 = None # type: Tuple[Any, A]
-t2 = None # type: Tuple[A, Any]
-t3 = None # type: Tuple[Any, Any]
-t4 = None # type: Tuple[A, A]
-t5 = None # type: Tuple[Any, Any, Any]
-
-t3 = t5 # E: Incompatible types in assignment (expression has type "Tuple[Any, Any, Any]", variable has type "Tuple[Any, Any]")
-t5 = t4 # E: Incompatible types in assignment (expression has type "Tuple[A, A]", variable has type "Tuple[Any, Any, Any]")
-
-t1 = t1
-t1 = t2
-t1 = t3
-t1 = t4
-t2 = t1
-t2 = t3
-t2 = t4
-t3 = t1
-t3 = t2
-t3 = t4
-t4 = t1
-t4 = t2
-t4 = t3
-
-class A: pass
-[builtins fixtures/tuple.pyi]
-
-[case testFunctionTypeCompatibilityAndReturnTypes]
-from typing import Any, Callable
-f1 = None # type: Callable[[], Any]
-f11 = None # type: Callable[[], Any]
-f2 = None # type: Callable[[], A]
-f3 = None # type: Callable[[], None]
-
-f2 = f3 # E: Incompatible types in assignment (expression has type Callable[[], None], variable has type Callable[[], A])
-
-f1 = f2
-f1 = f3
-f2 = f11
-f3 = f11
-
-class A: pass
-
-[case testFunctionTypeCompatibilityAndArgumentTypes]
-from typing import Any, Callable
-f1 = None # type: Callable[[A, Any], None]
-f2 = None # type: Callable[[Any, A], None]
-f3 = None # type: Callable[[A, A], None]
-
-f1 = f1
-f1 = f2
-f1 = f3
-
-f2 = f1
-f2 = f2
-f2 = f3
-
-f3 = f1
-f3 = f2
-f3 = f3
-
-class A: pass
-
-[case testFunctionTypeCompatibilityAndArgumentCounts]
-from typing import Any, Callable
-f1 = None # type: Callable[[Any], None]
-f2 = None # type: Callable[[Any, Any], None]
-
-f1 = f2 # E: Incompatible types in assignment (expression has type Callable[[Any, Any], None], variable has type Callable[[Any], None])
-
-
--- Overriding
--- ----------
-
-
-[case testOverridingMethodWithDynamicTypes]
-from typing import Any
-a, b = None, None # type: (A, B)
-
-b.f(b) # E: Argument 1 to "f" of "B" has incompatible type "B"; expected "A"
-a = a.f(b)
-
-class B:
- def f(self, x: 'A') -> 'B':
- pass
- def g(self, x: 'B') -> None:
- pass
-class A(B):
- def f(self, x: Any) -> Any:
- pass
- def g(self, x: Any) -> None:
- pass
-
-[case testOverridingMethodWithImplicitDynamicTypes]
-
-a, b = None, None # type: (A, B)
-
-b.f(b) # E: Argument 1 to "f" of "B" has incompatible type "B"; expected "A"
-a = a.f(b)
-
-class B:
- def f(self, x: 'A') -> 'B':
- pass
- def g(self, x: 'B') -> None:
- pass
-class A(B):
- def f(self, x):
- pass
- def g(self, x):
- pass
-
-[case testOverridingMethodAcrossHierarchy]
-import typing
-class C:
- def f(self, a: 'A') -> None: pass
-class B(C):
- def f(self, a): pass
-class A(B):
- def f(self, a: 'D') -> None: # E: Argument 1 of "f" incompatible with supertype "C"
- pass
-class D: pass
-[out]
-
-[case testInvalidOverrideArgumentCountWithImplicitSignature1]
-import typing
-class B:
- def f(self, x: A) -> None: pass
-class A(B):
- def f(self, x, y): # dynamic function not type checked
- x()
-[out]
-
-[case testInvalidOverrideArgumentCountWithImplicitSignature2]
-import typing
-class B:
- def f(self, x, y): pass
-class A(B):
- def f(self, x: 'A') -> None: # E: Signature of "f" incompatible with supertype "B"
- pass
-[out]
-
-[case testInvalidOverrideArgumentCountWithImplicitSignature3]
-import typing
-class B:
- def f(self, x: A) -> None: pass
-class A(B):
- def f(self, x, y) -> None: # E: Signature of "f" incompatible with supertype "B"
- x()
-[out]
-
-
--- Don't complain about too few/many arguments in dynamic functions
--- ----------------------------------------------------------------
-
-[case testTooManyArgsInDynamic]
-def f() -> None: pass
-def g():
- f(1) # Silent
-[out]
-
-[case testTooFewArgsInDynamic]
-def f(a: int) -> None: pass
-def g():
- f() # Silent
-[out]
-
-[case testJustRightInDynamic]
-def f(a: int) -> None: pass
-def g():
- f('') # Silent
-[out]
diff --git a/test-data/unit/check-expressions.test b/test-data/unit/check-expressions.test
deleted file mode 100644
index 8b103f6..0000000
--- a/test-data/unit/check-expressions.test
+++ /dev/null
@@ -1,1652 +0,0 @@
--- Test cases for simple expressions.
---
--- See also:
--- * check-functions.test contains test cases for calls.
--- * check-varargs.test contains test cases for *args.
--- * check-dynamic.test contains test cases related to 'Any' type.
--- * check-generics.test contains test cases for generic values.
-
-
--- None expression
--- ---------------
-
-
-[case testNoneAsRvalue]
-import typing
-a = None # type: A
-class A: pass
-[out]
-
-[case testNoneAsArgument]
-import typing
-def f(x: 'A', y: 'B') -> None: pass
-f(None, None)
-class A: pass
-class B(A): pass
-[out]
-
-
--- Simple expressions
--- ------------------
-
-
-[case testIntLiteral]
-a = 0
-b = None # type: A
-b = 1 # E: Incompatible types in assignment (expression has type "int", variable has type "A")
-a = 1
-class A:
- pass
-
-[case testStrLiteral]
-a = ''
-b = None # type: A
-b = 'x' # E: Incompatible types in assignment (expression has type "str", variable has type "A")
-a = 'x'
-a = r"x"
-a = """foo"""
-class A:
- pass
-
-[case testFloatLiteral]
-a = 0.0
-b = None # type: A
-b = 1.1 # E: Incompatible types in assignment (expression has type "float", variable has type "A")
-a = 1.1
-class A:
- pass
-[file builtins.py]
-class object:
- def __init__(self): pass
-class type: pass
-class function: pass
-class float: pass
-class str: pass
-
-[case testComplexLiteral]
-a = 0.0j
-b = None # type: A
-b = 1.1j # E: Incompatible types in assignment (expression has type "complex", variable has type "A")
-a = 1.1j
-class A:
- pass
-[file builtins.py]
-class object:
- def __init__(self): pass
-class type: pass
-class function: pass
-class complex: pass
-class str: pass
-
-[case testBytesLiteral]
-b, a = None, None # type: (bytes, A)
-b = b'foo'
-b = br"foo"
-b = b'''foo'''
-a = b'foo' # E: Incompatible types in assignment (expression has type "bytes", variable has type "A")
-class A: pass
-[file builtins.py]
-class object:
- def __init__(self): pass
-class type: pass
-class tuple: pass
-class function: pass
-class bytes: pass
-class str: pass
-
-[case testUnicodeLiteralInPython3]
-s = None # type: str
-s = u'foo'
-b = None # type: bytes
-b = u'foo' # E: Incompatible types in assignment (expression has type "str", variable has type "bytes")
-[builtins fixtures/primitives.pyi]
-
-
--- Binary operators
--- ----------------
-
-
-[case testAdd]
-
-a, b, c = None, None, None # type: (A, B, C)
-c = a + c # Fail
-a = a + b # Fail
-c = b + a # Fail
-c = a + b
-
-class A:
- def __add__(self, x: 'B') -> 'C': pass
-class B: pass
-class C: pass
-[out]
-main:3: error: Unsupported operand types for + ("A" and "C")
-main:4: error: Incompatible types in assignment (expression has type "C", variable has type "A")
-main:5: error: Unsupported left operand type for + ("B")
-[case testAdd]
-
-a, b, c = None, None, None # type: (A, B, C)
-c = a + c # Fail
-a = a + b # Fail
-c = b + a # Fail
-c = a + b
-
-class A:
- def __add__(self, x: 'B') -> 'C':
- pass
-class B:
- pass
-class C:
- pass
-[out]
-main:3: error: Unsupported operand types for + ("A" and "C")
-main:4: error: Incompatible types in assignment (expression has type "C", variable has type "A")
-main:5: error: Unsupported left operand type for + ("B")
-
-[case testSub]
-
-a, b, c = None, None, None # type: (A, B, C)
-c = a - c # Fail
-a = a - b # Fail
-c = b - a # Fail
-c = a - b
-
-class A:
- def __sub__(self, x: 'B') -> 'C':
- pass
-class B:
- pass
-class C:
- pass
-[out]
-main:3: error: Unsupported operand types for - ("A" and "C")
-main:4: error: Incompatible types in assignment (expression has type "C", variable has type "A")
-main:5: error: Unsupported left operand type for - ("B")
-
-[case testMul]
-
-a, b, c = None, None, None # type: (A, B, C)
-c = a * c # Fail
-a = a * b # Fail
-c = b * a # Fail
-c = a * b
-
-class A:
- def __mul__(self, x: 'B') -> 'C':
- pass
-class B:
- pass
-class C:
- pass
-[out]
-main:3: error: Unsupported operand types for * ("A" and "C")
-main:4: error: Incompatible types in assignment (expression has type "C", variable has type "A")
-main:5: error: Unsupported left operand type for * ("B")
-
-[case testMatMul]
-a, b, c = None, None, None # type: (A, B, C)
-c = a @ c # E: Unsupported operand types for @ ("A" and "C")
-a = a @ b # E: Incompatible types in assignment (expression has type "C", variable has type "A")
-c = b @ a # E: Unsupported left operand type for @ ("B")
-c = a @ b
-
-class A:
- def __matmul__(self, x: 'B') -> 'C':
- pass
-class B:
- pass
-class C:
- pass
-
-[case testDiv]
-
-a, b, c = None, None, None # type: (A, B, C)
-c = a / c # Fail
-a = a / b # Fail
-c = b / a # Fail
-c = a / b
-
-class A:
- def __truediv__(self, x: 'B') -> 'C':
- pass
-class B:
- pass
-class C:
- pass
-[out]
-main:3: error: Unsupported operand types for / ("A" and "C")
-main:4: error: Incompatible types in assignment (expression has type "C", variable has type "A")
-main:5: error: Unsupported left operand type for / ("B")
-
-[case testIntDiv]
-
-a, b, c = None, None, None # type: (A, B, C)
-c = a // c # Fail
-a = a // b # Fail
-c = b // a # Fail
-c = a // b
-
-class A:
- def __floordiv__(self, x: 'B') -> 'C':
- pass
-class B:
- pass
-class C:
- pass
-[out]
-main:3: error: Unsupported operand types for // ("A" and "C")
-main:4: error: Incompatible types in assignment (expression has type "C", variable has type "A")
-main:5: error: Unsupported left operand type for // ("B")
-
-[case testMod]
-
-a, b, c = None, None, None # type: (A, B, C)
-c = a % c # Fail
-a = a % b # Fail
-c = b % a # Fail
-c = a % b
-
-class A:
- def __mod__(self, x: 'B') -> 'C':
- pass
-class B:
- pass
-class C:
- pass
-[out]
-main:3: error: Unsupported operand types for % ("A" and "C")
-main:4: error: Incompatible types in assignment (expression has type "C", variable has type "A")
-main:5: error: Unsupported left operand type for % ("B")
-
-[case testPow]
-
-a, b, c = None, None, None # type: (A, B, C)
-c = a ** c # Fail
-a = a ** b # Fail
-c = b ** a # Fail
-c = a ** b
-
-class A:
- def __pow__(self, x: 'B') -> 'C':
- pass
-class B:
- pass
-class C:
- pass
-[out]
-main:3: error: Unsupported operand types for ** ("A" and "C")
-main:4: error: Incompatible types in assignment (expression has type "C", variable has type "A")
-main:5: error: Unsupported left operand type for ** ("B")
-
-[case testMiscBinaryOperators]
-
-a, b = None, None # type: (A, B)
-b = a & a # Fail
-b = a | b # Fail
-b = a ^ a # Fail
-b = a << b # Fail
-b = a >> a # Fail
-
-b = a & b
-b = a | a
-b = a ^ b
-b = a << a
-b = a >> b
-class A:
- def __and__(self, x: 'B') -> 'B': pass
- def __or__(self, x: 'A') -> 'B': pass
- def __xor__(self, x: 'B') -> 'B': pass
- def __lshift__(self, x: 'A') -> 'B': pass
- def __rshift__(self, x: 'B') -> 'B': pass
-class B: pass
-[out]
-main:3: error: Unsupported operand types for & ("A" and "A")
-main:4: error: Unsupported operand types for | ("A" and "B")
-main:5: error: Unsupported operand types for ^ ("A" and "A")
-main:6: error: Unsupported operand types for << ("A" and "B")
-main:7: error: Unsupported operand types for >> ("A" and "A")
-
-[case testBooleanAndOr]
-
-a, b = None, None # type: (A, bool)
-b = b and b
-b = b or b
-b = b and a # E: Incompatible types in assignment (expression has type "Union[bool, A]", variable has type "bool")
-b = a and b # E: Incompatible types in assignment (expression has type "Union[A, bool]", variable has type "bool")
-b = b or a # E: Incompatible types in assignment (expression has type "Union[bool, A]", variable has type "bool")
-b = a or b # E: Incompatible types in assignment (expression has type "Union[A, bool]", variable has type "bool")
-class A: pass
-
-[builtins fixtures/bool.pyi]
-
-[case testRestrictedTypeAnd]
-
-b = None # type: bool
-i = None # type: str
-j = not b and i
-if j:
- reveal_type(j) # E: Revealed type is 'builtins.str'
-[builtins fixtures/bool.pyi]
-
-[case testRestrictedTypeOr]
-
-b = None # type: bool
-i = None # type: str
-j = b or i
-if not j:
- reveal_type(j) # E: Revealed type is 'builtins.str'
-[builtins fixtures/bool.pyi]
-
-[case testAndOr]
-
-s = ""
-b = bool()
-reveal_type(s and b or b) # E: Revealed type is 'builtins.bool'
-[builtins fixtures/bool.pyi]
-
-[case testNonBooleanOr]
-
-c, d, b = None, None, None # type: (C, D, bool)
-c = c or c
-c = c or d
-c = d or c
-b = c or c # E: Incompatible types in assignment (expression has type "C", variable has type "bool")
-d = c or d # E: Incompatible types in assignment (expression has type "C", variable has type "D")
-d = d or c # E: Incompatible types in assignment (expression has type "C", variable has type "D")
-class C: pass
-class D(C): pass
-[builtins fixtures/bool.pyi]
-
-[case testInOperator]
-from typing import Iterator, Iterable, Any
-a, b, c, d, e = None, None, None, None, None # type: (A, B, bool, D, Any)
-c = c in a # Fail
-a = b in a # Fail
-c = a in b # Fail
-c = b in d # Fail
-c = b in a
-c = a in d
-c = e in d
-c = a in e
-
-class A:
- def __contains__(self, x: 'B') -> bool: pass
-class B: pass
-class D(Iterable[A]):
- def __iter__(self) -> Iterator[A]: pass
-[builtins fixtures/bool.pyi]
-[out]
-main:3: error: Unsupported operand types for in ("bool" and "A")
-main:4: error: Incompatible types in assignment (expression has type "bool", variable has type "A")
-main:5: error: Unsupported right operand type for in ("B")
-main:6: error: Unsupported operand types for in ("B" and "D")
-
-[case testNotInOperator]
-from typing import Iterator, Iterable, Any
-a, b, c, d, e = None, None, None, None, None # type: (A, B, bool, D, Any)
-c = c not in a # Fail
-a = b not in a # Fail
-c = a not in b # Fail
-c = b not in d # Fail
-c = b not in a
-c = a not in d
-c = e in d
-c = a in e
-
-class A:
- def __contains__(self, x: 'B') -> bool: pass
-class B: pass
-class D(Iterable[A]):
- def __iter__(self) -> Iterator[A]: pass
-[builtins fixtures/bool.pyi]
-[out]
-main:3: error: Unsupported operand types for in ("bool" and "A")
-main:4: error: Incompatible types in assignment (expression has type "bool", variable has type "A")
-main:5: error: Unsupported right operand type for in ("B")
-main:6: error: Unsupported operand types for in ("B" and "D")
-
-[case testNonBooleanContainsReturnValue]
-
-a, b = None, None # type: (A, bool)
-b = a not in a
-b = a in a
-
-class A:
- def __contains__(self, x: 'A') -> object: pass
-[builtins fixtures/bool.pyi]
-[out]
-main:4: error: Incompatible types in assignment (expression has type "object", variable has type "bool")
-
-[case testEq]
-
-a, b = None, None # type: (A, bool)
-a = a == b # Fail
-a = a != b # Fail
-b = a == b
-b = a != b
-
-class A:
- def __eq__(self, o: object) -> bool: pass
- def __ne__(self, o: object) -> bool: pass
-[builtins fixtures/bool.pyi]
-[out]
-main:3: error: Incompatible types in assignment (expression has type "bool", variable has type "A")
-main:4: error: Incompatible types in assignment (expression has type "bool", variable has type "A")
-
-[case testLtAndGt]
-
-a, b, bo = None, None, None # type: (A, B, bool)
-a = a < b # Fail
-a = a > b # Fail
-bo = a < b
-bo = a > b
-
-class A:
- def __lt__(self, o: 'B') -> bool: pass
- def __gt__(self, o: 'B') -> bool: pass
-class B:
- def __lt__(self, o: 'B') -> bool: pass
- def __gt__(self, o: 'B') -> bool: pass
-[builtins fixtures/bool.pyi]
-[out]
-main:3: error: Incompatible types in assignment (expression has type "bool", variable has type "A")
-main:4: error: Incompatible types in assignment (expression has type "bool", variable has type "A")
-
-[case testCmp_python2]
-
-a, b, c, bo = None, None, None, None # type: (A, B, C, bool)
-bo = a == a # E: Unsupported operand types for == ("A" and "A")
-bo = a != a # E: Argument 1 to "__cmp__" of "A" has incompatible type "A"; expected "B"
-bo = a < b
-bo = a > b
-bo = b <= b
-bo = b <= c
-bo = b >= c # E: Argument 1 to "__cmp__" of "B" has incompatible type "C"; expected "B"
-bo = a >= b
-bo = c >= b
-bo = c <= b # E: Argument 1 to "__cmp__" of "C" has incompatible type "B"; expected "A"
-bo = a == c
-bo = b == c # E: Unsupported operand types for == ("C" and "B")
-
-class A:
- def __cmp__(self, o):
- # type: ('B') -> bool
- pass
- def __eq__(self, o):
- # type: ('int') -> bool
- pass
-class B:
- def __cmp__(self, o):
- # type: ('B') -> bool
- pass
- def __le__(self, o):
- # type: ('C') -> bool
- pass
-class C:
- def __cmp__(self, o):
- # type: ('A') -> bool
- pass
- def __eq__(self, o):
- # type: ('int') -> bool
- pass
-
-[builtins_py2 fixtures/bool.pyi]
-
-[case cmpIgnoredPy3]
-
-a, b, bo = None, None, None # type: (A, B, bool)
-bo = a <= b # E: Unsupported left operand type for <= ("A")
-
-class A:
- def __cmp__(self, o: 'B') -> bool: pass
-class B:
- pass
-
-[builtins fixtures/bool.pyi]
-
-[case testLeAndGe]
-
-a, b, bo = None, None, None # type: (A, B, bool)
-a = a <= b # Fail
-a = a >= b # Fail
-bo = a <= b
-bo = a >= b
-
-class A:
- def __le__(self, o: 'B') -> bool: pass
- def __ge__(self, o: 'B') -> bool: pass
-class B:
- def __le__(self, o: 'B') -> bool: pass
- def __ge__(self, o: 'B') -> bool: pass
-[builtins fixtures/bool.pyi]
-[out]
-main:3: error: Incompatible types in assignment (expression has type "bool", variable has type "A")
-main:4: error: Incompatible types in assignment (expression has type "bool", variable has type "A")
-
-[case testChainedComp]
-
-a, b, bo = None, None, None # type: (A, B, bool)
-a < a < b < b # Fail
-a < b < b < b
-a < a > a < b # Fail
-
-class A:
- def __lt__(self, o: 'B') -> bool: pass
- def __gt__(self, o: 'B') -> bool: pass
-class B:
- def __lt__(self, o: 'B') -> bool: pass
- def __gt__(self, o: 'B') -> bool: pass
-[builtins fixtures/bool.pyi]
-[out]
-main:3: error: Unsupported operand types for > ("A" and "A")
-main:5: error: Unsupported operand types for > ("A" and "A")
-main:5: error: Unsupported operand types for < ("A" and "A")
-
-
-[case testChainedCompBoolRes]
-
-a, b, bo = None, None, None # type: (A, B, bool)
-bo = a < b < b
-a = a < b < b # Fail
-
-class A:
- def __lt__(self, o: 'B') -> bool: pass
- def __gt__(self, o: 'B') -> bool: pass
-class B:
- def __lt__(self, o: 'B') -> bool: pass
- def __gt__(self, o: 'B') -> bool: pass
-[builtins fixtures/bool.pyi]
-[out]
-main:4: error: Incompatible types in assignment (expression has type "bool", variable has type "A")
-
-
-[case testChainedCompResTyp]
-
-x, y = None, None # type: (X, Y)
-a, b, p, bo = None, None, None, None # type: (A, B, P, bool)
-b = y == y == y
-bo = y == y == y # Fail
-a = x < y
-a = x < y == y # Fail
-p = x < y == y
-
-class P:
- pass
-class A(P):
- pass
-class B(P):
- pass
-
-class X:
- def __lt__(self, o: 'Y') -> A: pass
- def __gt__(self, o: 'Y') -> A: pass
-class Y:
- def __lt__(self, o: 'Y') -> A: pass
- def __gt__(self, o: 'Y') -> A: pass
- def __eq__(self, o: 'Y') -> B: pass
-[builtins fixtures/bool.pyi]
-[out]
-main:5: error: Incompatible types in assignment (expression has type "B", variable has type "bool")
-main:7: error: Incompatible types in assignment (expression has type "P", variable has type "A")
-
-
-[case testIs]
-
-a, b = None, None # type: (A, bool)
-a = a is b # Fail
-b = a is b
-b = b is a
-b = a is None
-class A: pass
-[builtins fixtures/bool.pyi]
-[out]
-main:3: error: Incompatible types in assignment (expression has type "bool", variable has type "A")
-
-[case testIsNot]
-
-a, b = None, None # type: (A, bool)
-a = a is not b # Fail
-b = a is not b
-b = b is not a
-b = a is not None
-class A: pass
-[builtins fixtures/bool.pyi]
-[out]
-main:3: error: Incompatible types in assignment (expression has type "bool", variable has type "A")
-
-[case testReverseBinaryOperator]
-
-class A:
- def __add__(self, x: int) -> int: pass
-class B:
- def __radd__(self, x: A) -> str: pass
-s = None # type: str
-n = None # type: int
-n = A() + 1
-s = A() + B()
-n = A() + B() # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-
-[case testReverseBinaryOperator2]
-
-class A:
- def __add__(self, x: 'A') -> object: pass
-class B:
- def __radd__(self, x: A) -> str: pass
-s = None # type: str
-n = None # type: int
-s = A() + B()
-n = A() + B() # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-
-[case testReverseBinaryOperator3]
-
-class N:
- def __add__(self, x: 'N') -> object: pass
-class A:
- def __add__(self, x: N) -> int: pass
-class B:
- def __radd__(self, x: N) -> str: pass
-s = None # type: str
-s = A() + B() # E: Unsupported operand types for + ("A" and "B")
-
-[case testBinaryOperatorWithAnyRightOperand]
-from typing import Any
-class A: pass
-A() + Any(1)
-
-[case testReverseComparisonOperator]
-
-class C:
- def __gt__(self, x: 'A') -> object: pass
-class A:
- def __lt__(self, x: C) -> int: pass
-class B:
- def __gt__(self, x: A) -> str: pass
-s = None # type: str
-n = None # type: int
-n = A() < C()
-s = A() < B()
-n = A() < B() # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-s = object() < B() # E: Unsupported operand types for > ("B" and "object")
-
-[case testErrorContextAndBinaryOperators]
-import typing
-class A:
- def __getitem__(self, i: str) -> int: pass
-def f() -> None:
- A()[1] # Error
-class B:
- A()[1] # Error
-A()[1] # Error
-[out]
-main:5: error: Invalid index type "int" for "A"; expected type "str"
-main:7: error: Invalid index type "int" for "A"; expected type "str"
-main:8: error: Invalid index type "int" for "A"; expected type "str"
-
-[case testErrorContextAndBinaryOperators2]
-import m
-[file m.py]
-import typing
-class A:
- def __getitem__(self, i: str) -> int: pass
-def f() -> None:
- A()[1] # Error
-class B:
- A()[1] # Error
-A()[1] # Error
-[out]
-tmp/m.py:5: error: Invalid index type "int" for "A"; expected type "str"
-tmp/m.py:7: error: Invalid index type "int" for "A"; expected type "str"
-tmp/m.py:8: error: Invalid index type "int" for "A"; expected type "str"
-
-
--- Unary operators
--- ---------------
-
-
-[case testUnaryMinus]
-
-a, b = None, None # type: (A, B)
-a = -a # Fail
-b = -b # Fail
-b = -a
-
-class A:
- def __neg__(self) -> 'B':
- pass
-class B:
- pass
-[out]
-main:3: error: Incompatible types in assignment (expression has type "B", variable has type "A")
-main:4: error: Unsupported operand type for unary - ("B")
-
-[case testUnaryPlus]
-
-a, b = None, None # type: (A, B)
-a = +a # Fail
-b = +b # Fail
-b = +a
-
-class A:
- def __pos__(self) -> 'B':
- pass
-class B:
- pass
-[out]
-main:3: error: Incompatible types in assignment (expression has type "B", variable has type "A")
-main:4: error: Unsupported operand type for unary + ("B")
-
-[case testUnaryNot]
-
-a, b = None, None # type: (A, bool)
-a = not b # Fail
-b = not a
-b = not b
-class A:
- pass
-[builtins fixtures/bool.pyi]
-[out]
-main:3: error: Incompatible types in assignment (expression has type "bool", variable has type "A")
-
-[case testUnaryBitwiseNeg]
-
-a, b = None, None # type: (A, B)
-a = ~a # Fail
-b = ~b # Fail
-b = ~a
-
-class A:
- def __invert__(self) -> 'B':
- pass
-class B:
- pass
-[out]
-main:3: error: Incompatible types in assignment (expression has type "B", variable has type "A")
-main:4: error: Unsupported operand type for ~ ("B")
-
-
--- Indexing
--- --------
-
-
-[case testIndexing]
-
-a, b, c = None, None, None # type: (A, B, C)
-c = a[c] # Fail
-a = a[b] # Fail
-c = b[a] # Fail
-c = a[b]
-
-class A:
- def __getitem__(self, x: 'B') -> 'C':
- pass
-class B: pass
-class C: pass
-[out]
-main:3: error: Invalid index type "C" for "A"; expected type "B"
-main:4: error: Incompatible types in assignment (expression has type "C", variable has type "A")
-main:5: error: Value of type "B" is not indexable
-
-[case testIndexingAsLvalue]
-
-a, b, c = None, None, None # type: (A, B, C)
-a[c] = c # Fail
-a[b] = a # Fail
-b[a] = c # Fail
-a[b] = c
-
-class A:
- def __setitem__(self, x: 'B', y: 'C') -> None:
- pass
-class B:
- pass
-class C:
- pass
-[out]
-main:3: error: Invalid index type "C" for "A"; expected type "B"
-main:4: error: Incompatible types in assignment (expression has type "A", target has type "C")
-main:5: error: Unsupported target for indexed assignment
-
-[case testOverloadedIndexing]
-
-from typing import overload
-
-a, b, c = None, None, None # type: (A, B, C)
-a[b]
-a[c]
-a[1] # E: No overload variant of "__getitem__" of "A" matches argument types [builtins.int]
-
-i, s = None, None # type: (int, str)
-i = a[b]
-s = a[b] # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-i = a[c] # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-s = a[c]
-
-class A:
- @overload
- def __getitem__(self, x: 'B') -> int:
- pass
- @overload
- def __getitem__(self, x: 'C') -> str:
- pass
-class B: pass
-class C: pass
-[out]
-
-
--- Cast expression
--- ---------------
-
-
-[case testCastExpressions]
-from typing import cast, Any
-class A: pass
-class B: pass
-class C(A): pass
-a, b, c = None, None, None # type: (A, B, C)
-
-a = cast(A, a()) # E: "A" not callable
-a = cast(Any, a()) # E: "A" not callable
-b = cast(A, a) # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-
-a = cast(A, b)
-a = cast(A, a)
-c = cast(C, a)
-a = cast(A, c)
-a = cast(Any, b)
-b = cast(Any, a)
-[out]
-
-[case testAnyCast]
-from typing import cast, Any
-a, b = None, None # type: (A, B)
-a = Any(a()) # Fail
-a = Any(b)
-b = Any(a)
-class A: pass
-class B: pass
-[out]
-main:3: error: "A" not callable
-
-
--- None return type
--- ----------------
-
-
-[case testNoneReturnTypeBasics]
-
-a, o = None, None # type: (A, object)
-a = f() # Fail
-o = A().g(a) # Fail
-A().g(f()) # Fail
-x = f() # type: A # Fail
-f()
-A().g(a)
-
-def f() -> None:
- pass
-
-class A:
- def g(self, x: object) -> None:
- pass
-[out]
-main:3: error: "f" does not return a value
-main:4: error: "g" of "A" does not return a value
-main:5: error: "f" does not return a value
-main:6: error: "f" does not return a value
-
-[case testNoneReturnTypeWithStatements]
-import typing
-raise f() # Fail
-if f(): # Fail
- pass
-elif f(): # Fail
- pass
-while f(): # Fail
- pass
-def g() -> object:
- return f() # Fail
-
-def f() -> None: pass
-[builtins fixtures/exception.pyi]
-[out]
-main:2: error: "f" does not return a value
-main:3: error: "f" does not return a value
-main:5: error: "f" does not return a value
-main:7: error: "f" does not return a value
-main:10: error: "f" does not return a value
-
-[case testNoneReturnTypeWithExpressions]
-from typing import cast
-a = None # type: A
-[f()] # E: "f" does not return a value
-f() + a # E: "f" does not return a value
-a + f() # E: "f" does not return a value
-f() == a # E: "f" does not return a value
-a != f() # E: Unsupported left operand type for != ("A")
-cast(A, f()) # E: "f" does not return a value
-f().foo # E: "f" does not return a value
-
-def f() -> None: pass
-class A:
- def __add__(self, x: 'A') -> 'A': pass
-[builtins fixtures/list.pyi]
-
-[case testNoneReturnTypeWithExpressions2]
-
-a, b = None, None # type: (A, bool)
-a < f() # E: Unsupported left operand type for < ("A")
-f() <= a # E: "f" does not return a value
-f() in a # E: Unsupported right operand type for in ("A")
-a in f() # E: "f" does not return a value
--f() # E: "f" does not return a value
-not f() # E: "f" does not return a value
-f() and b # E: "f" does not return a value
-b or f() # E: "f" does not return a value
-
-def f() -> None: pass
-class A:
- def __add__(self, x: 'A') -> 'A':
- pass
-[builtins fixtures/bool.pyi]
-
-
--- Slicing
--- -------
-
-
-[case testGetSlice]
-
-a, b = None, None # type: (A, B)
-a = a[1:2] # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-a = a[1:] # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-a = a[:2] # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-a = a[:] # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-
-b = a[1:2]
-b = a[1:]
-b = a[:2]
-b = a[:]
-
-class A:
- def __getitem__(self, s: slice) -> 'B': pass
-class B: pass
-[builtins fixtures/slice.pyi]
-
-[case testSlicingWithInvalidBase]
-
-a = None # type: A
-a[1:2] # E: Invalid index type "slice" for "A"; expected type "int"
-a[:] # E: Invalid index type "slice" for "A"; expected type "int"
-class A:
- def __getitem__(self, n: int) -> 'A': pass
-[builtins fixtures/slice.pyi]
-
-[case testSlicingWithNonindexable]
-
-o = None # type: object
-o[1:2] # E: Value of type "object" is not indexable
-o[:] # E: Value of type "object" is not indexable
-[builtins fixtures/slice.pyi]
-
-[case testNonIntSliceBounds]
-from typing import Any
-a, o = None, None # type: (Any, object)
-a[o:1] # E: Slice index must be an integer or None
-a[1:o] # E: Slice index must be an integer or None
-a[o:] # E: Slice index must be an integer or None
-a[:o] # E: Slice index must be an integer or None
-[builtins fixtures/slice.pyi]
-
-[case testNoneSliceBounds]
-from typing import Any
-a = None # type: Any
-a[None:1]
-a[1:None]
-a[None:]
-a[:None]
-[builtins fixtures/slice.pyi]
-
-
--- String interpolation
--- --------------------
-
-
-[case testStringInterpolationType]
-from typing import Tuple
-i, f, s, t = None, None, None, None # type: (int, float, str, Tuple[int])
-'%d' % i
-'%f' % f
-'%s' % s
-'%d' % (f,)
-'%d' % (s,) # E: Incompatible types in string interpolation (expression has type "str", placeholder has type "Union[int, float]")
-'%d' % t
-'%d' % s # E: Incompatible types in string interpolation (expression has type "str", placeholder has type "Union[int, float]")
-'%f' % s # E: Incompatible types in string interpolation (expression has type "str", placeholder has type "Union[int, float]")
-[builtins fixtures/primitives.pyi]
-
-[case testStringInterpolationSAcceptsAnyType]
-from typing import Any
-i, o, s = None, None, None # type: (int, object, str)
-'%s %s %s' % (i, o, s)
-[builtins fixtures/primitives.pyi]
-
-[case testStringInterpolationCount]
-'%d %d' % 1 # E: Not enough arguments for format string
-'%d %d' % (1, 2)
-'%d %d' % (1, 2, 3) # E: Not all arguments converted during string formatting
-t = 1, 's'
-'%d %s' % t
-'%s %d' % t # E: Incompatible types in string interpolation (expression has type "str", placeholder has type "Union[int, float]")
-'%d' % t # E: Not all arguments converted during string formatting
-[builtins fixtures/primitives.pyi]
-
-[case testStringInterpolationWithAnyType]
-from typing import Any
-a = None # type: Any
-'%d %d' % a
-[builtins fixtures/primitives.pyi]
-
-[case testStringInterpolationInvalidPlaceholder]
-'%W' % 1 # E: Unsupported format character 'W'
-
-[case testStringInterpolationWidth]
-'%2f' % 3.14
-'%*f' % 3.14 # E: Not enough arguments for format string
-'%*f' % (4, 3.14)
-'%*f' % (1.1, 3.14) # E: * wants int
-[builtins fixtures/primitives.pyi]
-
-[case testStringInterpolationPrecision]
-'%.2f' % 3.14
-'%.*f' % 3.14 # E: Not enough arguments for format string
-'%.*f' % (4, 3.14)
-'%.*f' % (1.1, 3.14) # E: * wants int
-[builtins fixtures/primitives.pyi]
-
-[case testStringInterpolationWidthAndPrecision]
-'%4.2f' % 3.14
-'%4.*f' % 3.14 # E: Not enough arguments for format string
-'%*.2f' % 3.14 # E: Not enough arguments for format string
-'%*.*f' % 3.14 # E: Not enough arguments for format string
-'%*.*f' % (4, 2, 3.14)
-[builtins fixtures/primitives.pyi]
-
-[case testStringInterpolationFlagsAndLengthModifiers]
-'%04hd' % 1
-'%-.4ld' % 1
-'%+*Ld' % (1, 1)
-'% .*ld' % (1, 1)
-[builtins fixtures/primitives.pyi]
-
-[case testStringInterpolationDoublePercentage]
-'%% %d' % 1
-'%3% %d' % 1
-'%*%' % 1
-'%*% %d' % 1 # E: Not enough arguments for format string
-[builtins fixtures/primitives.pyi]
-
-[case testStringInterpolationC]
-'%c' % 1
-'%c' % 's'
-'%c' % '' # E: %c requires int or char
-'%c' % 'ab' # E: %c requires int or char
-[builtins fixtures/primitives.pyi]
-
-[case testStringInterpolationMappingTypes]
-'%(a)d %(b)s' % {'a': 1, 'b': 's'}
-'%(a)d %(b)s' % {'a': 's', 'b': 1} # E: Incompatible types in string interpolation (expression has type "str", placeholder with key 'a' has type "Union[int, float]")
-[builtins fixtures/primitives.pyi]
-
-[case testStringInterpolationMappingKeys]
-'%()d' % {'': 2}
-'%(a)d' % {'a': 1, 'b': 2, 'c': 3}
-'%(q)d' % {'a': 1, 'b': 2, 'c': 3} # E: Key 'q' not found in mapping
-'%(a)d %%' % {'a': 1}
-
-[builtins fixtures/dict.pyi]
-
-[case testStringInterpolationMappingDictTypes]
-from typing import Any, Dict
-a = None # type: Any
-ds, do, di = None, None, None # type: Dict[str, int], Dict[object, int], Dict[int, int]
-'%(a)' % 1 # E: Format requires a mapping (expression has type "int", expected type for mapping is Dict[Any, Any])
-'%()d' % a
-'%()d' % ds
-'%()d' % do
-[builtins fixtures/dict.pyi]
-
-[case testStringInterpolationMappingInvalidDictTypes-skip]
-from typing import Any, Dict
-di = None # type: Dict[int, int]
-'%()d' % di # E: Format requires a mapping (expression has type Dict[int, int], expected type for mapping is Dict[str, Any])
-[builtins fixtures/dict.pyi]
-
-[case testStringInterpolationMappingInvalidSpecifiers]
-'%(a)d %d' % 1 # E: String interpolation mixes specifier with and without mapping keys
-'%(b)*d' % 1 # E: String interpolation contains both stars and mapping keys
-'%(b).*d' % 1 # E: String interpolation contains both stars and mapping keys
-
-[case testStringInterpolationMappingFlagsAndLengthModifiers]
-'%(a)1d' % {'a': 1}
-'%(a).1d' % {'a': 1}
-'%(a)#1.1ld' % {'a': 1}
-[builtins fixtures/dict.pyi]
-
-[case testStringInterpolationFloatPrecision]
-'%.f' % 1.2
-'%.3f' % 1.2
-'%.f' % 'x'
-'%.3f' % 'x'
-[builtins fixtures/primitives.pyi]
-[out]
-main:3: error: Incompatible types in string interpolation (expression has type "str", placeholder has type "Union[int, float]")
-main:4: error: Incompatible types in string interpolation (expression has type "str", placeholder has type "Union[int, float]")
-
-[case testStringInterpolationSpaceKey]
-'%( )s' % {' ': 'foo'}
-
-[case testByteByteInterpolation]
-def foo(a: bytes, b: bytes):
- b'%s:%s' % (a, b)
-foo(b'a', b'b') == b'a:b'
-
-[case testBytePercentInterpolationSupported]
-b'%s' % (b'xyz',)
-b'%(name)s' % {'name': 'jane'}
-b'%c' % (123)
-
-[case testUnicodeInterpolation_python2]
-u'%s' % (u'abc',)
-
--- Lambdas
--- -------
-
-
-[case testTrivialLambda]
-from typing import Callable
-f = lambda: 1 # type: Callable[[], int]
-f = lambda: ''.x
-f = lambda: ''
-[out]
-main:3: error: "str" has no attribute "x"
-main:4: error: Incompatible types in assignment (expression has type Callable[[], str], variable has type Callable[[], int])
-main:4: error: Incompatible return value type (got "str", expected "int")
-
-[case testVoidLambda]
-import typing
-def void() -> None:
- pass
-x = lambda: void() # type: typing.Callable[[], None]
-
-
--- List comprehensions
--- -------------------
-
-
-[case testSimpleListComprehension]
-from typing import List
-a = None # type: List[A]
-a = [x for x in a]
-b = [x for x in a] # type: List[B] # E: List comprehension has incompatible type List[A]
-class A: pass
-class B: pass
-[builtins fixtures/for.pyi]
-
-[case testSimpleListComprehensionNestedTuples]
-from typing import List, Tuple
-l = None # type: List[Tuple[A, Tuple[A, B]]]
-a = [a2 for a1, (a2, b1) in l] # type: List[A]
-b = [a2 for a1, (a2, b1) in l] # type: List[B] # E: List comprehension has incompatible type List[A]
-class A: pass
-class B: pass
-[builtins fixtures/for.pyi]
-
-[case testSimpleListComprehensionNestedTuples2]
-from typing import List, Tuple
-l = None # type: List[Tuple[int, Tuple[int, str]]]
-a = [f(d) for d, (i, s) in l]
-b = [f(s) for d, (i, s) in l] # E: Argument 1 to "f" has incompatible type "str"; expected "int"
-
-def f(x: int): pass
-[builtins fixtures/for.pyi]
-
-[case testListComprehensionWithNonDirectMapping]
-from typing import List
-a = None # type: List[A]
-b = None # type: List[B]
-b = [f(x) for x in a]
-a = [f(x) for x in a] # E: List comprehension has incompatible type List[B]
-([f(x) for x in b]) # E: Argument 1 to "f" has incompatible type "B"; expected "A"
-class A: pass
-class B: pass
-def f(a: A) -> B: pass
-[builtins fixtures/for.pyi]
-
-[case testErrorInListComprehensionCondition]
-from typing import List
-a = None # type: List[A]
-a = [x for x in a if x()] # E: "A" not callable
-class A: pass
-[builtins fixtures/for.pyi]
-
-[case testTypeInferenceOfListComprehension]
-from typing import List
-a = None # type: List[A]
-o = [x for x in a] # type: List[object]
-class A: pass
-[builtins fixtures/for.pyi]
-
-[case testSimpleListComprehensionInClassBody]
-from typing import List
-class A:
- a = None # type: List[A]
- a = [x for x in a]
- b = [x for x in a] # type: List[B] # E: List comprehension has incompatible type List[A]
-class B: pass
-[builtins fixtures/for.pyi]
-[out]
-
-
--- Set comprehension
--- -----------------
-
-
-[case testSimpleSetComprehension]
-from typing import Set
-a = None # type: Set[A]
-a = {x for x in a}
-b = {x for x in a} # type: Set[B] # E: Set comprehension has incompatible type Set[A]
-class A: pass
-class B: pass
-[builtins fixtures/set.pyi]
-
-
--- Dictionary comprehension
--- ------------------------
-
-
-[case testSimpleDictionaryComprehension]
-from typing import Dict, List, Tuple
-abd = None # type: Dict[A, B]
-abl = None # type: List[Tuple[A, B]]
-abd = {a: b for a, b in abl}
-x = {a: b for a, b in abl} # type: Dict[B, A]
-y = {a: b for a, b in abl} # type: A
-class A: pass
-class B: pass
-[builtins fixtures/dict.pyi]
-[out]
-main:5: error: Key expression in dictionary comprehension has incompatible type "A"; expected type "B"
-main:5: error: Value expression in dictionary comprehension has incompatible type "B"; expected type "A"
-main:6: error: Incompatible types in assignment (expression has type Dict[A, B], variable has type "A")
-
-
-[case testDictionaryComprehensionWithNonDirectMapping]
-from typing import Dict, List, Tuple
-abd = None # type: Dict[A, B]
-abl = None # type: List[Tuple[A, B]]
-abd = {a: f(b) for a, b in abl}
-class A: pass
-class B: pass
-class C: pass
-def f(b: A) -> C: pass
-[builtins fixtures/dict.pyi]
-[out]
-main:4: error: Value expression in dictionary comprehension has incompatible type "C"; expected type "B"
-main:4: error: Argument 1 to "f" has incompatible type "B"; expected "A"
-
-
--- Generator expressions
--- ---------------------
-
-
-[case testSimpleGeneratorExpression]
-from typing import Iterator
-# The implementation is mostly identical to list comprehensions, so a single
-# test case is ok.
-a = None # type: Iterator[int]
-a = (x for x in a)
-b = None # type: Iterator[str]
-b = (x for x in a) # E: Generator has incompatible item type "int"
-[builtins fixtures/for.pyi]
-
-
--- Conditional expressions
--- -----------------------
-
-
-[case testSimpleConditionalExpression]
-import typing
-y = ''
-x = 1 if y else 2
-x = 3
-x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-
-[case testConditionalExpressionWithEmptyCondition]
-import typing
-def f() -> None: pass
-x = 1 if f() else 2 # E: "f" does not return a value
-
-[case testConditionalExpressionWithSubtyping]
-import typing
-class A: pass
-class B(A): pass
-x = B() if bool() else A()
-x = A()
-x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "A")
-y = A() if bool() else B()
-y = A()
-y = '' # E: Incompatible types in assignment (expression has type "str", variable has type "A")
-[builtins fixtures/bool.pyi]
-
-[case testConditionalExpressionAndTypeContext]
-import typing
-x = [1] if bool() else []
-x = [1]
-x = ['x'] # E: List item 0 has incompatible type "str"
-[builtins fixtures/list.pyi]
-
-
--- Special cases
--- -------------
-
-
-[case testOperationsWithNonInstanceTypes]
-from typing import cast
-class A:
- def __add__(self, a: 'A') -> 'A': pass
-a = None # type: A
-None + a # Fail
-f + a # Fail
-a + f # Fail
-cast(A, f)
-
-def f() -> None:
- pass
-[out]
-main:5: error: Unsupported left operand type for + (None)
-main:6: error: Unsupported left operand type for + (Callable[[], None])
-main:7: error: Unsupported operand types for + ("A" and Callable[[], None])
-
-[case testOperatorMethodWithInvalidArgCount]
-
-a = None # type: A
-a + a # Fail
-
-class A:
- def __add__(self) -> 'A':
- pass
-[out]
-main:3: error: Too many arguments for "__add__" of "A"
-
-[case testOperatorMethodAsVar]
-from typing import Any
-class A:
- def __init__(self, _add: Any) -> None:
- self.__add__ = _add
-a = None # type: A
-a + a
-[out]
-
-[case testOperatorMethodAsVar2]
-
-class A:
- def f(self, x: int) -> str: pass
- __add__ = f
-s = None # type: str
-s = A() + 1
-A() + (A() + 1)
-[out]
-main:7: error: Argument 1 has incompatible type "str"; expected "int"
-
-[case testIndexedLvalueWithSubtypes]
-
-a, b, c = None, None, None # type: (A, B, C)
-a[c] = c
-a[b] = c
-a[c] = b
-
-class A:
- def __setitem__(self, x: 'B', y: 'B') -> None:
- pass
-class B:
- pass
-class C(B):
- pass
-[out]
-
-
--- Ellipsis
--- --------
-
-
-[case testEllipsis]
-
-a = None # type: A
-a = ... # E: Incompatible types in assignment (expression has type "ellipsis", variable has type "A")
-b = ...
-c = ...
-b = c
-....__class__
-....a # E: "ellipsis" has no attribute "a"
-
-class A: pass
-[file builtins.py]
-class object:
- def __init__(self): pass
-class ellipsis:
- def __init__(self): pass
- __class__ = object()
-class type: pass
-class function: pass
-class str: pass
-[out]
-
-
--- Yield expression
--- ----------------
-
-
-[case testYieldExpression]
-def f(x: int) -> None:
- x = yield f('')
- x = 1
-[builtins fixtures/for.pyi]
-[out]
-main:1: error: The return type of a generator function should be "Generator" or one of its supertypes
-main:2: error: Argument 1 to "f" has incompatible type "str"; expected "int"
-
-[case testYieldExpressionWithNone]
-from typing import Iterator
-def f(x: int) -> Iterator[None]:
- (yield)
-[builtins fixtures/for.pyi]
-[out]
-
-
--- Yield from expression
--- ----------------
-
-
-[case testYieldFromIteratorHasNoValue]
-from typing import Iterator
-def f() -> Iterator[int]:
- yield 5
-def g() -> Iterator[int]:
- a = yield from f()
-[out]
-main:5: error: Function does not return a value
-
-[case testYieldFromGeneratorHasValue]
-from typing import Iterator, Generator
-def f() -> Generator[int, None, str]:
- yield 5
- return "ham"
-def g() -> Iterator[int]:
- a = "string"
- a = yield from f()
-[out]
-
-
--- dict(...)
--- ---------
-
-
--- Note that the stub used in unit tests does not have all overload
--- variants, but it should not matter.
-
-[case testDictWithKeywordArgsOnly]
-from typing import Dict, Any
-d1 = dict(a=1, b=2) # type: Dict[str, int]
-d2 = dict(a=1, b='') # type: Dict[str, int] # E: List item 1 has incompatible type "Tuple[str, str]"
-d3 = dict(a=1) # type: Dict[int, int] # E: List item 0 has incompatible type "Tuple[str, int]"
-d4 = dict(a=1, b=1)
-d4.xyz # E: Dict[str, int] has no attribute "xyz"
-d5 = dict(a=1, b='') # type: Dict[str, Any]
-[builtins fixtures/dict.pyi]
-
-[case testDictWithoutKeywordArgs]
-from typing import Dict
-d = dict() # E: Need type annotation for variable
-d2 = dict() # type: Dict[int, str]
-dict(undefined) # E: Name 'undefined' is not defined
-[builtins fixtures/dict.pyi]
-
-[case testDictFromList]
-from typing import Dict
-d = dict([(1, 'x'), (2, 'y')])
-d() # E: Dict[int, str] not callable
-d2 = dict([(1, 'x')]) # type: Dict[str, str] # E: List item 0 has incompatible type "Tuple[int, str]"
-[builtins fixtures/dict.pyi]
-
-[case testDictFromIterableAndKeywordArg]
-from typing import Dict
-it = [('x', 1)]
-
-d = dict(it, x=1)
-d() # E: Dict[str, int] not callable
-
-d2 = dict(it, x='') # E: Cannot infer type argument 2 of "dict"
-d2() # E: Dict[Any, Any] not callable
-
-d3 = dict(it, x='') # type: Dict[str, int] # E: Argument 2 to "dict" has incompatible type "str"; expected "int"
-[builtins fixtures/dict.pyi]
-
-[case testDictFromIterableAndKeywordArg2]
-it = [(1, 'x')]
-dict(it, x='y') # E: Keyword argument only valid with "str" key type in call to "dict"
-[builtins fixtures/dict.pyi]
-
-[case testDictFromIterableAndKeywordArg3]
-d = dict([], x=1)
-d() # E: Dict[str, int] not callable
-[builtins fixtures/dict.pyi]
-
-[case testDictFromIterableAndStarStarArgs]
-from typing import Dict
-it = [('x', 1)]
-
-kw = {'x': 1}
-d = dict(it, **kw)
-d() # E: Dict[str, int] not callable
-
-kw2 = {'x': ''}
-d2 = dict(it, **kw2) # E: Cannot infer type argument 2 of "dict"
-d2() # E: Dict[Any, Any] not callable
-
-d3 = dict(it, **kw2) # type: Dict[str, int] # E: Argument 2 to "dict" has incompatible type **Dict[str, str]; expected "int"
-[builtins fixtures/dict.pyi]
-
-[case testDictFromIterableAndStarStarArgs2]
-it = [(1, 'x')]
-kw = {'x': 'y'}
-d = dict(it, **kw) # E: Keyword argument only valid with "str" key type in call to "dict"
-d() # E: Dict[int, str] not callable
-[builtins fixtures/dict.pyi]
-
-[case testUserDefinedClassNamedDict]
-from typing import Generic, TypeVar
-T = TypeVar('T')
-S = TypeVar('S')
-class dict(Generic[T, S]):
- def __init__(self, x: T, **kwargs: T) -> None: pass
-dict(1, y=1)
-[builtins fixtures/dict.pyi]
-
-[case testSpecialSignatureForSubclassOfDict]
-from typing import TypeVar, Dict, Generic
-T = TypeVar('T')
-S = TypeVar('S')
-class D1(dict): pass # Implicit base class Dict[Any, Any]
-D1([(1, 2)], x=1)
-class D2(Dict[T, S], Generic[T, S]): pass
-da = D2([('x', 2)], x=1)
-da() # E: D2[str, int] not callable
-D2([(1, 2)], x=1) # E: Keyword argument only valid with "str" key type in call to "dict"
-db = D2(x=1)
-db() # E: D2[str, int] not callable
-[builtins fixtures/dict.pyi]
-
-[case testSpecialSignatureForSubclassOfDict2]
-from typing import TypeVar, Dict, Generic
-T = TypeVar('T')
-class D(Dict[str, T], Generic[T]): pass
-D([('x', 1)], x=1)
-[builtins fixtures/dict.pyi]
-
-[case testOverridingSpecialSignatureInSubclassOfDict]
-from typing import TypeVar, Dict, Generic
-T = TypeVar('T')
-S = TypeVar('S')
-class D(Dict[T, S], Generic[T, S]):
- def __init__(self, x: S, y: T) -> None: pass
-d = D(1, y='')
-d() # E: D[str, int] not callable
-[builtins fixtures/dict.pyi]
-
-[case testRevealType]
-reveal_type(1) # E: Revealed type is 'builtins.int'
-
-[case testUndefinedRevealType]
-reveal_type(x)
-[out]
-main:1: error: Revealed type is 'Any'
-main:1: error: Name 'x' is not defined
-
-[case testUserDefinedRevealType]
-def reveal_type(x: int) -> None: pass
-reveal_type("foo") # E: Argument 1 to "reveal_type" has incompatible type "str"; expected "int"
-
-[case testRevealTypeVar]
-reveal_type = 1
-1 + "foo" # E: Unsupported operand types for + ("int" and "str")
-
-[case testRevealForward]
-def f() -> None:
- reveal_type(x)
-x = 1 + 1
-[out]
-main:2: error: Revealed type is 'builtins.int'
-
-[case testEqNone]
-None == None
-[builtins fixtures/ops.pyi]
-
-[case testLtNone]
-None < None # E: Unsupported left operand type for < (None)
-[builtins fixtures/ops.pyi]
-
-[case testDictWithStarExpr]
-# flags: --fast-parser
-b = {'z': 26, *a} # E: invalid syntax
-[builtins fixtures/dict.pyi]
-
-[case testDictWithStarStarExpr]
-# flags: --fast-parser
-from typing import Dict
-a = {'a': 1}
-b = {'z': 26, **a}
-c = {**b}
-d = {**a, **b, 'c': 3}
-e = {1: 'a', **a} # E: Argument 1 to "update" of "dict" has incompatible type Dict[str, int]; expected Mapping[int, str]
-f = {**b} # type: Dict[int, int] # E: List item 0 has incompatible type Dict[str, int]
-[builtins fixtures/dict.pyi]
diff --git a/test-data/unit/check-fastparse.test b/test-data/unit/check-fastparse.test
deleted file mode 100644
index 7f322d7..0000000
--- a/test-data/unit/check-fastparse.test
+++ /dev/null
@@ -1,191 +0,0 @@
-[case testFastParseSyntaxError]
-# flags: --fast-parser
-1 + # E: invalid syntax
-
-[case testFastParseTypeCommentSyntaxError]
-# flags: --fast-parser
-x = None # type: a : b # E: syntax error in type comment
-
-[case testFastParseInvalidTypeComment]
-# flags: --fast-parser
-x = None # type: a + b # E: invalid type comment
-
--- Function type comments are attributed to the function def line.
--- This happens in both parsers.
-[case testFastParseFunctionAnnotationSyntaxError]
-# flags: --fast-parser
-def f(): # E: syntax error in type comment
- # type: None -> None
- pass
-
-[case testFastParseInvalidFunctionAnnotation]
-# flags: --fast-parser
-def f(): # E: invalid type comment
- # type: (a + b) -> None
- pass
-
-[case testFastParseProperty]
-# flags: --fast-parser
-class C:
- @property
- def x(self) -> str: pass
- @x.setter
- def x(self, value: str) -> None: pass
-[builtins fixtures/property.pyi]
-
-[case testFastParseConditionalProperty]
-# flags: --fast-parser
-class C:
- if bool():
- @property
- def x(self) -> str: pass
- @x.setter
- def x(self, value: str) -> None: pass
-[builtins fixtures/property.pyi]
-
-[case testFastParsePerArgumentAnnotations]
-# flags: --fast-parser
-class A: pass
-class B: pass
-class C: pass
-class D: pass
-class E: pass
-class F: pass
-def f(a, # type: A
- b = None, # type: B
- *args, # type: C
- d = None, # type: D
- e, # type: E
- **kwargs # type: F
- ):
- reveal_type(a) # E: Revealed type is '__main__.A'
- reveal_type(b) # E: Revealed type is '__main__.B'
- reveal_type(args) # E: Revealed type is 'builtins.tuple[__main__.C]'
- reveal_type(d) # E: Revealed type is '__main__.D'
- reveal_type(e) # E: Revealed type is '__main__.E'
- reveal_type(kwargs) # E: Revealed type is 'builtins.dict[builtins.str, __main__.F]'
-[builtins fixtures/dict.pyi]
-[out]
-
-[case testFastParsePerArgumentAnnotationsWithReturn]
-# flags: --fast-parser
-class A: pass
-class B: pass
-class C: pass
-class D: pass
-class E: pass
-class F: pass
-def f(a, # type: A
- b = None, # type: B
- *args, # type: C
- d = None, # type: D
- e, # type: E
- **kwargs # type: F
- ):
- # type: (...) -> int
- reveal_type(a) # E: Revealed type is '__main__.A'
- reveal_type(b) # E: Revealed type is '__main__.B'
- reveal_type(args) # E: Revealed type is 'builtins.tuple[__main__.C]'
- reveal_type(d) # E: Revealed type is '__main__.D'
- reveal_type(e) # E: Revealed type is '__main__.E'
- reveal_type(kwargs) # E: Revealed type is 'builtins.dict[builtins.str, __main__.F]'
- return "not an int" # E: Incompatible return value type (got "str", expected "int")
-[builtins fixtures/dict.pyi]
-[out]
-
-[case testFastParsePerArgumentAnnotationsWithAnnotatedBareStar]
-# flags: --fast-parser
-def f(*, # type: int # E: bare * has associated type comment
- x # type: str
- ):
- # type: (...) -> int
- pass
-[builtins fixtures/dict.pyi]
-[out]
-
-[case testFastParsePerArgumentAnnotationsWithReturnAndBareStar]
-# flags: --fast-parser
-def f(*,
- x # type: str
- ):
- # type: (...) -> int
- reveal_type(x) # E: Revealed type is 'builtins.str'
- return "not an int" # E: Incompatible return value type (got "str", expected "int")
-[builtins fixtures/dict.pyi]
-[out]
-
-[case testFastParsePerArgumentAnnotations_python2]
-# flags: --fast-parser
-class A: pass
-class B: pass
-class C: pass
-class D: pass
-def f(a, # type: A
- b = None, # type: B
- *args # type: C
- # kwargs not tested due to lack of 2.7 dict fixtures
- ):
- reveal_type(a) # E: Revealed type is '__main__.A'
- reveal_type(b) # E: Revealed type is '__main__.B'
- reveal_type(args) # E: Revealed type is 'builtins.tuple[__main__.C]'
-[builtins fixtures/dict.pyi]
-[out]
-
-[case testFastParsePerArgumentAnnotationsWithReturn_python2]
-# flags: --fast-parser
-class A: pass
-class B: pass
-class C: pass
-class D: pass
-def f(a, # type: A
- b = None, # type: B
- *args # type: C
- # kwargs not tested due to lack of 2.7 dict fixtures
- ):
- # type: (...) -> int
- reveal_type(a) # E: Revealed type is '__main__.A'
- reveal_type(b) # E: Revealed type is '__main__.B'
- reveal_type(args) # E: Revealed type is 'builtins.tuple[__main__.C]'
- return "not an int" # E: Incompatible return value type (got "str", expected "int")
-[builtins fixtures/dict.pyi]
-[out]
-
-[case testFasterParseTooManyArgumentsAnnotation]
-# flags: --fast-parser
-def f(): # E: Type signature has too many arguments
- # type: (int) -> None
- pass
-
-[case testFasterParseTooFewArgumentsAnnotation]
-# flags: --fast-parser
-def f(x): # E: Type signature has too few arguments
- # type: () -> None
- pass
-
-[case testFasterParseTypeCommentError_python2]
-# flags: --fast-parser
-from typing import Tuple
-def f(a):
- # type: (Tuple(int, int)) -> int
- pass
-[out]
-main:3: error: invalid type comment
-
-[case testFastParseMatMul]
-# flags: --fast-parser
-from typing import Any
-x = None # type: Any
-x @ 1
-x @= 1
-
-[case testIncorrectTypeCommentIndex]
-# flags: --fast-parser
-from typing import Dict
-x = None # type: Dict[x: y]
-[out]
-main:3: error: syntax error in type comment
-
-[case testPrintStatementTrailingCommaFastParser_python2]
-# flags: --fast-parser
-print 0,
-print 1, 2,
diff --git a/test-data/unit/check-flags.test b/test-data/unit/check-flags.test
deleted file mode 100644
index 409f4db..0000000
--- a/test-data/unit/check-flags.test
+++ /dev/null
@@ -1,242 +0,0 @@
-[case testUnannotatedFunction]
-# flags: --disallow-untyped-defs
-def f(x): pass
-[out]
-main:2: error: Function is missing a type annotation
-
-[case testUnannotatedArgument]
-# flags: --disallow-untyped-defs
-def f(x) -> int: pass
-[out]
-main:2: error: Function is missing a type annotation for one or more arguments
-
-[case testUnannotatedArgumentWithFastParser]
-# flags: --fast-parser --disallow-untyped-defs
-def f(x) -> int: pass
-[out]
-main:2: error: Function is missing a type annotation for one or more arguments
-
-[case testNoArgumentFunction]
-# flags: --disallow-untyped-defs
-def f() -> int: pass
-[out]
-
-[case testUnannotatedReturn]
-# flags: --disallow-untyped-defs
-def f(x: int): pass
-[out]
-main:2: error: Function is missing a return type annotation
-
-[case testUnannotatedReturnWithFastParser]
-# flags: --fast-parser --disallow-untyped-defs
-def f(x: int): pass
-[out]
-main:2: error: Function is missing a return type annotation
-
-[case testLambda]
-# flags: --disallow-untyped-defs
-lambda x: x
-[out]
-
-[case testUntypedDef]
-# flags: --disallow-untyped-defs
-def f():
- 1 + "str"
-[out]
-main:2: error: Function is missing a type annotation
-
-[case testSubclassingAny]
-# flags: --disallow-subclassing-any
-from typing import Any
-FakeClass = None # type: Any
-class Foo(FakeClass): pass # E: Class cannot subclass 'FakeClass' (has type 'Any')
-[out]
-
-[case testSubclassingAnyMultipleBaseClasses]
-# flags: --disallow-subclassing-any
-from typing import Any
-FakeClass = None # type: Any
-class ActualClass: pass
-class Foo(ActualClass, FakeClass): pass # E: Class cannot subclass 'FakeClass' (has type 'Any')
-[out]
-
-[case testSubclassingAnySilentImports]
-# flags: --disallow-subclassing-any --follow-imports=skip
-# cmd: mypy -m main
-
-[file main.py]
-from ignored_module import BaseClass
-class Foo(BaseClass): pass
-
-[file ignored_module.py]
-class BaseClass: pass
-
-[out]
-tmp/main.py:2: error: Class cannot subclass 'BaseClass' (has type 'Any')
-
-[case testSubclassingAnySilentImports2]
-# flags: --disallow-subclassing-any --follow-imports=skip
-# cmd: mypy -m main
-
-[file main.py]
-import ignored_module
-class Foo(ignored_module.BaseClass): pass
-
-[file ignored_module.py]
-class BaseClass: pass
-
-[out]
-tmp/main.py:2: error: Class cannot subclass 'BaseClass' (has type 'Any')
-
-[case testWarnNoReturnIgnoresTrivialFunctions]
-# flags: --warn-no-return
-def f() -> int:
- pass
-def g() -> int:
- ...
-def h() -> int:
- """with docstring"""
- pass
-def i() -> int:
- """with docstring"""
- ...
-def j() -> int:
- u"""with unicode docstring"""
- pass
-def k() -> int:
- """docstring only"""
-
-[case testWarnNoReturnWorksWithAlwaysTrue]
-# flags: --warn-no-return
-PY3 = True
-def f() -> int:
- if PY3:
- return 0
- else:
- return 0
-[builtins fixtures/bool.pyi]
-
-[case testWarnNoReturnWorksWithAlwaysFalse]
-# flags: --warn-no-return
-PY2 = False
-def f() -> int:
- if PY2:
- return 0
- else:
- return 0
-[builtins fixtures/bool.pyi]
-
-[case testWarnNoReturnWorksWithMypyTrue]
-# flags: --warn-no-return
-MYPY = False
-def f() -> int:
- if MYPY:
- return 0
- else:
- return 0
-[builtins fixtures/bool.pyi]
-
-[case testShowErrorContextFunction]
-# flags: --show-error-context
-def f() -> None:
- 0 + ""
-[out]
-main: note: In function "f":
-main:3: error: Unsupported operand types for + ("int" and "str")
-
-[case testShowErrorContextClass]
-# flags: --show-error-context
-class A:
- 0 + ""
-[out]
-main: note: In class "A":
-main:3: error: Unsupported operand types for + ("int" and "str")
-
-[case testShowErrorContextMember]
-# flags: --show-error-context
-class A:
- def f(self, x: int) -> None:
- self.f("")
-[out]
-main: note: In member "f" of class "A":
-main:4: error: Argument 1 to "f" of "A" has incompatible type "str"; expected "int"
-
-[case testShowErrorContextModule]
-# flags: --show-error-context
-import m
-[file m.py]
-0 + ""
-[out]
-main:2: note: In module imported here:
-tmp/m.py:1: error: Unsupported operand types for + ("int" and "str")
-
-[case testShowErrorContextTopLevel]
-# flags: --show-error-context
-def f() -> None:
- 0 + ""
-0 + ""
-[out]
-main: note: In function "f":
-main:3: error: Unsupported operand types for + ("int" and "str")
-main: note: At top level:
-main:4: error: Unsupported operand types for + ("int" and "str")
-
-[case testShowErrorContextFromHere]
-# flags: --show-error-context
-import a
-[file a.py]
-import b
-[file b.py]
-0 + ""
-[out]
-tmp/a.py:1: note: In module imported here,
-main:2: note: ... from here:
-tmp/b.py:1: error: Unsupported operand types for + ("int" and "str")
-
-[case testFollowImportsNormal]
-# flags: --follow-imports=normal
-from mod import x
-x + ""
-[file mod.py]
-1 + ""
-x = 0
-[out]
-tmp/mod.py:1: error: Unsupported operand types for + ("int" and "str")
-main:3: error: Unsupported operand types for + ("int" and "str")
-
-[case testFollowImportsSilent]
-# flags: --follow-imports=silent
-from mod import x
-x + "" # E: Unsupported operand types for + ("int" and "str")
-[file mod.py]
-1 + ""
-x = 0
-
-[case testFollowImportsSkip]
-# flags: --follow-imports=skip
-from mod import x
-x + ""
-[file mod.py]
-this deliberate syntax error will not be reported
-[out]
-
-[case testFollowImportsError]
-# flags: --follow-imports=error
-from mod import x
-x + ""
-[file mod.py]
-deliberate syntax error
-[out]
-main:2: note: Import of 'mod' ignored
-main:2: note: (Using --follow-imports=error, module not passed on command line)
-
-[case testIgnoreMissingImportsFalse]
-from mod import x
-[out]
-main:1: error: Cannot find module named 'mod'
-main:1: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-
-[case testIgnoreMissingImportsTrue]
-# flags: --ignore-missing-imports
-from mod import x
-[out]
diff --git a/test-data/unit/check-functions.test b/test-data/unit/check-functions.test
deleted file mode 100644
index 31a6168..0000000
--- a/test-data/unit/check-functions.test
+++ /dev/null
@@ -1,1666 +0,0 @@
--- Test cases for the type checker related to functions, function types and
--- calls.
-
--- See also check-varargs.test.
-
-
--- Callable type basics
--- --------------------
-
-
-[case testCallingVariableWithFunctionType]
-from typing import Callable
-f = None # type: Callable[[A], B]
-a, b = None, None # type: (A, B)
-a = f(a) # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-b = f(b) # E: Argument 1 has incompatible type "B"; expected "A"
-b = f() # E: Too few arguments
-b = f(a, a) # E: Too many arguments
-b = f(a)
-
-class A: pass
-class B: pass
-
-[case testKeywordOnlyArgumentOrderInsensitivity]
-import typing
-
-class A(object):
- def f(self, *, a: int, b: str) -> None: pass
-
-class B(A):
- def f(self, *, b: str, a: int) -> None: pass
-
-class C(A):
- def f(self, *, b: int, a: str) -> None: pass # E: Signature of "f" incompatible with supertype "A"
-
-[case testPositionalOverridingArgumentNameInsensitivity]
-import typing
-
-class A(object):
- def f(self, a: int, b: str) -> None: pass
-
-class B(A):
- def f(self, b: str, a: int) -> None: pass # E: Argument 1 of "f" incompatible with supertype "A" # E: Argument 2 of "f" incompatible with supertype "A"
-
-class C(A):
- def f(self, foo: int, bar: str) -> None: pass
-
-
-[case testPositionalOverridingArgumentNamesCheckedWhenMismatchingPos]
-import typing
-
-class A(object):
- def f(self, a: int, b: str) -> None: pass
-
-class B(A):
- def f(self, b: int, a: str) -> None: pass # E: Signature of "f" incompatible with supertype "A"
-
-
-[case testSubtypingFunctionTypes]
-from typing import Callable
-
-class A: pass
-class B(A): pass
-
-f = None # type: Callable[[B], A]
-g = None # type: Callable[[A], A] # subtype of f
-h = None # type: Callable[[B], B] # subtype of f
-g = h # E: Incompatible types in assignment (expression has type Callable[[B], B], variable has type Callable[[A], A])
-h = f # E: Incompatible types in assignment (expression has type Callable[[B], A], variable has type Callable[[B], B])
-h = g # E: Incompatible types in assignment (expression has type Callable[[A], A], variable has type Callable[[B], B])
-g = f # E: Incompatible types in assignment (expression has type Callable[[B], A], variable has type Callable[[A], A])
-f = g
-f = h
-f = f
-g = g
-h = h
-
-[case testSubtypingFunctionsDoubleCorrespondence]
-
-def l(x) -> None: ...
-def r(__, *, x) -> None: ...
-r = l # E: Incompatible types in assignment (expression has type Callable[[Any], None], variable has type Callable[[Any, NamedArg('x', Any)], None])
-
-[case testSubtypingFunctionsRequiredLeftArgNotPresent]
-
-def l(x, y) -> None: ...
-def r(x) -> None: ...
-r = l # E: Incompatible types in assignment (expression has type Callable[[Any, Any], None], variable has type Callable[[Any], None])
-
-[case testSubtypingFunctionsImplicitNames]
-
-def f(a, b): pass
-def g(c: Any, d: Any) -> Any: pass
-
-ff = f
-gg = g
-
-gg = f
-ff = g
-
-[case testSubtypingFunctionsDefaultsNames]
-from typing import Callable
-
-def f(a: int, b: str) -> None: pass
-f_nonames = None # type: Callable[[int, str], None]
-def g(a: int, b: str = "") -> None: pass
-def h(aa: int, b: str = "") -> None: pass
-
-ff_nonames = f_nonames
-ff = f
-gg = g
-hh = h
-
-ff = gg
-ff_nonames = ff
-ff_nonames = f_nonames # reset
-ff = ff_nonames # E: Incompatible types in assignment (expression has type Callable[[int, str], None], variable has type Callable[[Arg('a', int), Arg('b', str)], None])
-ff = f # reset
-gg = ff # E: Incompatible types in assignment (expression has type Callable[[Arg('a', int), Arg('b', str)], None], variable has type Callable[[Arg('a', int), DefaultArg('b', str)], None])
-gg = hh # E: Incompatible types in assignment (expression has type Callable[[Arg('aa', int), DefaultArg('b', str)], None], variable has type Callable[[Arg('a', int), DefaultArg('b', str)], None])
-
-[case testSubtypingFunctionsArgsKwargs]
-from typing import Any, Callable
-
-def everything(*args: Any, **kwargs: Any) -> None: pass
-everywhere = None # type: Callable[..., None]
-
-def specific_1(a: int, b: str) -> None: pass
-def specific_2(a: int, *, b: str) -> None: pass
-
-ss_1 = specific_1
-ss_2 = specific_2
-ee_def = everything
-ee_var = everywhere
-
-ss_1 = ee_def
-ss_1 = specific_1
-ss_2 = ee_def
-ss_2 = specific_2
-ee_def = everywhere
-ee_def = everything
-ee_var = everything
-ee_var = everywhere
-
-ee_var = specific_1 # The difference between Callable[..., blah] and one with a *args: Any, **kwargs: Any is that the ... goes loosely both ways.
-ee_def = specific_1 # E: Incompatible types in assignment (expression has type Callable[[int, str], None], variable has type Callable[[StarArg(Any), KwArg(Any)], None])
-
-[builtins fixtures/dict.pyi]
-
-[case testLackOfNames]
-def f(__a: int, __b: str) -> None: pass
-def g(a: int, b: str) -> None: pass
-
-ff = f
-gg = g
-
-ff = g
-gg = f # E: Incompatible types in assignment (expression has type Callable[[int, str], None], variable has type Callable[[Arg('a', int), Arg('b', str)], None])
-
-[case testLackOfNamesFastparse]
-# flags: --fast-parser
-
-def f(__a: int, __b: str) -> None: pass
-def g(a: int, b: str) -> None: pass
-
-ff = f
-gg = g
-
-ff = g
-gg = f # E: Incompatible types in assignment (expression has type Callable[[int, str], None], variable has type Callable[[Arg('a', int), Arg('b', str)], None])
-
-[case testFunctionTypeCompatibilityWithOtherTypes]
-from typing import Callable
-f = None # type: Callable[[], None]
-a, o = None, None # type: (A, object)
-a = f # E: Incompatible types in assignment (expression has type Callable[[], None], variable has type "A")
-f = a # E: Incompatible types in assignment (expression has type "A", variable has type Callable[[], None])
-f = o # E: Incompatible types in assignment (expression has type "object", variable has type Callable[[], None])
-f = f() # E: Function does not return a value
-
-f = f
-f = None
-o = f
-
-class A: pass
-
-[case testFunctionSubtypingWithVoid]
-from typing import Callable
-f = None # type: Callable[[], None]
-g = None # type: Callable[[], object]
-f = g # E: Incompatible types in assignment (expression has type Callable[[], object], variable has type Callable[[], None])
-g = f # E: Incompatible types in assignment (expression has type Callable[[], None], variable has type Callable[[], object])
-
-f = f
-g = g
-
-[case testFunctionSubtypingWithMultipleArgs]
-from typing import Callable
-f = None # type: Callable[[A, A], None]
-g = None # type: Callable[[A, B], None]
-h = None # type: Callable[[B, B], None]
-f = g # E: Incompatible types in assignment (expression has type Callable[[A, B], None], variable has type Callable[[A, A], None])
-f = h # E: Incompatible types in assignment (expression has type Callable[[B, B], None], variable has type Callable[[A, A], None])
-g = h # E: Incompatible types in assignment (expression has type Callable[[B, B], None], variable has type Callable[[A, B], None])
-g = f
-h = f
-h = g
-f = f
-g = g
-h = h
-
-class A: pass
-class B(A): pass
-
-[case testFunctionTypesWithDifferentArgumentCounts]
-from typing import Callable
-f = None # type: Callable[[], None]
-g = None # type: Callable[[A], None]
-h = None # type: Callable[[A, A], None]
-
-f = g # E: Incompatible types in assignment (expression has type Callable[[A], None], variable has type Callable[[], None])
-f = h # E: Incompatible types in assignment (expression has type Callable[[A, A], None], variable has type Callable[[], None])
-h = f # E: Incompatible types in assignment (expression has type Callable[[], None], variable has type Callable[[A, A], None])
-h = g # E: Incompatible types in assignment (expression has type Callable[[A], None], variable has type Callable[[A, A], None])
-
-f = f
-g = g
-h = h
-
-class A: pass
-[out]
-
-[case testCompatibilityOfSimpleTypeObjectWithStdType]
-
-t = None # type: type
-a = None # type: A
-
-a = A # E: Incompatible types in assignment (expression has type "A" (type object), variable has type "A")
-t = f # E: Incompatible types in assignment (expression has type Callable[[], None], variable has type "type")
-t = A
-
-class A:
- def __init__(self, a: 'A') -> None: pass
-
-def f() -> None: pass
-
-[case testFunctionTypesWithOverloads]
-from typing import Callable, overload
-f = None # type: Callable[[AA], A]
-g = None # type: Callable[[B], B]
-h = None # type: Callable[[A], AA]
-
-h = i # E: Incompatible types in assignment (expression has type overloaded function, variable has type Callable[[A], AA])
-f = j
-
-f = i
-g = i
-g = j
-
-class A: pass
-class AA(A): pass
-
-class B: pass
-
- at overload
-def i(x: AA) -> A:
- pass
- at overload
-def i(x: B) -> B:
- pass
-
- at overload
-def j(x: B) -> B:
- pass
- at overload
-def j(x: A) -> AA:
- pass
-
-[case testOverloadWithThreeItems]
-from typing import Callable, overload
-g1 = None # type: Callable[[A], A]
-g2 = None # type: Callable[[B], B]
-g3 = None # type: Callable[[C], C]
-g4 = None # type: Callable[[A], B]
-a, b, c = None, None, None # type: (A, B, C)
-
-b = f(a) # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-a = f(b) # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-b = f(c) # E: Incompatible types in assignment (expression has type "C", variable has type "B")
-g4 = f # E: Incompatible types in assignment (expression has type overloaded function, variable has type Callable[[A], B])
-
-g1 = f
-g2 = f
-g3 = f
-a = f(a)
-b = f(b)
-c = f(c)
-
-class A: pass
-class B: pass
-class C: pass
-
- at overload
-def f(x: A) -> A: pass
- at overload
-def f(x: B) -> B: pass
- at overload
-def f(x: C) -> C: pass
-
-[case testInferConstraintsUnequalLengths]
-from typing import Any, Callable, List
-def f(fields: List[Callable[[Any], Any]]): pass
-class C: pass
-f([C]) # E: List item 0 has incompatible type
-class D:
- def __init__(self, a, b): pass
-f([D]) # E: List item 0 has incompatible type
-[builtins fixtures/list.pyi]
-
--- Default argument values
--- -----------------------
-
-
-[case testCallingFunctionsWithDefaultArgumentValues]
-
-a, b = None, None # type: (A, B)
-a = f() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-b = f(b) # E: Argument 1 to "f" has incompatible type "B"; expected "A"
-b = f(a, a) # E: Too many arguments for "f"
-
-b = f()
-b = f(a)
-b = f(AA())
-
-def f(x: 'A' = None) -> 'B': pass
-
-class A: pass
-class AA(A): pass
-class B: pass
-
-[case testDefaultArgumentExpressions]
-import typing
-def f(x: 'A' = A()) -> None:
- b = x # type: B # E: Incompatible types in assignment (expression has type "A", variable has type "B")
- a = x # type: A
-
-class B: pass
-class A: pass
-[out]
-
-[case testDefaultArgumentExpressions2]
-import typing
-def f(x: 'A' = B()) -> None: # E: Incompatible types in assignment (expression has type "B", variable has type "A")
- b = x # type: B # E: Incompatible types in assignment (expression has type "A", variable has type "B")
- a = x # type: A
-
-class B: pass
-class A: pass
-[out]
-
-[case testDefaultArgumentsWithSubtypes]
-import typing
-def f(x: 'B' = A()) -> None: # E: Incompatible types in assignment (expression has type "A", variable has type "B")
- pass
-def g(x: 'A' = B()) -> None:
- pass
-
-class A: pass
-class B(A): pass
-[out]
-
-[case testMultipleDefaultArgumentExpressions]
-import typing
-def f(x: 'A' = B(), y: 'B' = B()) -> None: # E: Incompatible types in assignment (expression has type "B", variable has type "A")
- pass
-def h(x: 'A' = A(), y: 'B' = B()) -> None:
- pass
-
-class A: pass
-class B: pass
-[out]
-
-[case testMultipleDefaultArgumentExpressions2]
-import typing
-def g(x: 'A' = A(), y: 'B' = A()) -> None: # E: Incompatible types in assignment (expression has type "A", variable has type "B")
- pass
-
-class A: pass
-class B: pass
-[out]
-
-[case testDefaultArgumentsAndSignatureAsComment]
-import typing
-def f(x = 1): # type: (int) -> str
- pass
-f()
-f(1)
-f('') # E: Argument 1 to "f" has incompatible type "str"; expected "int"
-
-[case testMethodDefaultArgumentsAndSignatureAsComment]
-import typing
-class A:
- def f(self, x = 1): # type: (int) -> str
- pass
-A().f()
-A().f(1)
-A().f('') # E: Argument 1 to "f" of "A" has incompatible type "str"; expected "int"
-
-
--- Access to method defined as a data attribute
--- --------------------------------------------
-
-
-[case testMethodAsDataAttribute]
-from typing import Any, Callable
-class B: pass
-x = None # type: Any
-class A:
- f = x # type: Callable[[A], None]
- g = x # type: Callable[[A, B], None]
-a = None # type: A
-a.f()
-a.g(B())
-a.f(a) # E: Too many arguments
-a.g() # E: Too few arguments
-
-[case testMethodWithInvalidMethodAsDataAttribute]
-from typing import Any, Callable
-class B: pass
-x = None # type: Any
-class A:
- f = x # type: Callable[[], None]
- g = x # type: Callable[[B], None]
-a = None # type: A
-a.f() # E: Invalid method type
-a.g() # E: Invalid method type
-
-[case testMethodWithDynamicallyTypedMethodAsDataAttribute]
-from typing import Any, Callable
-class B: pass
-x = None # type: Any
-class A:
- f = x # type: Callable[[Any], Any]
-a = None # type: A
-a.f()
-a.f(a) # E: Too many arguments
-
-[case testOverloadedMethodAsDataAttribute]
-from typing import overload
-class B: pass
-class A:
- @overload
- def f(self) -> None: pass
- @overload
- def f(self, b: B) -> None: pass
- g = f
-a = None # type: A
-a.g()
-a.g(B())
-a.g(a) # E: No overload variant matches argument types [__main__.A]
-
-[case testMethodAsDataAttributeInferredFromDynamicallyTypedMethod]
-
-class A:
- def f(self, x): pass
- g = f
-a = None # type: A
-a.g(object())
-a.g(a, a) # E: Too many arguments
-a.g() # E: Too few arguments
-
-[case testMethodAsDataAttributeInGenericClass]
-from typing import TypeVar, Generic
-t = TypeVar('t')
-class B: pass
-class A(Generic[t]):
- def f(self, x: t) -> None: pass
- g = f
-a = None # type: A[B]
-a.g(B())
-a.g(a) # E: Argument 1 has incompatible type A[B]; expected "B"
-
-[case testInvalidMethodAsDataAttributeInGenericClass]
-from typing import Any, TypeVar, Generic, Callable
-t = TypeVar('t')
-class B: pass
-class C: pass
-x = None # type: Any
-class A(Generic[t]):
- f = x # type: Callable[[A[B]], None]
-ab = None # type: A[B]
-ac = None # type: A[C]
-ab.f()
-ac.f() # E: Invalid method type
-
-[case testPartiallyTypedSelfInMethodDataAttribute]
-from typing import Any, TypeVar, Generic, Callable
-t = TypeVar('t')
-class B: pass
-class C: pass
-x = None # type: Any
-class A(Generic[t]):
- f = x # type: Callable[[A], None]
-ab = None # type: A[B]
-ac = None # type: A[C]
-ab.f()
-ac.f()
-
-[case testCallableDataAttribute]
-from typing import Callable
-class A:
- g = None # type: Callable[[A], None]
- def __init__(self, f: Callable[[], None]) -> None:
- self.f = f
-a = A(None)
-a.f()
-a.g()
-a.f(a) # E: Too many arguments
-a.g(a) # E: Too many arguments
-
-
--- Nested functions
--- ----------------
-
-
-[case testSimpleNestedFunction]
-import typing
-def f(a: 'A') -> None:
- def g(b: 'B') -> None:
- b = a # fail
- aa = a # type: A # ok
- b = B()
- g(a) # fail
- g(B())
-class A: pass
-class B: pass
-[out]
-main:4: error: Incompatible types in assignment (expression has type "A", variable has type "B")
-main:7: error: Argument 1 to "g" has incompatible type "A"; expected "B"
-
-[case testReturnAndNestedFunction]
-import typing
-def f() -> 'A':
- def g() -> 'B':
- return A() # fail
- return B()
- return B() # fail
- return A()
-class A: pass
-class B: pass
-[out]
-main:4: error: Incompatible return value type (got "A", expected "B")
-main:6: error: Incompatible return value type (got "B", expected "A")
-
-[case testDynamicallyTypedNestedFunction]
-import typing
-def f(x: object) -> None:
- def g(y):
- pass
- g() # E: Too few arguments for "g"
- g(x)
-[out]
-
-[case testNestedFunctionInMethod]
-import typing
-class A:
- def f(self) -> None:
- def g(x: int) -> None:
- y = x # type: int
- a = x # type: A # fail
- g(2)
- g(A()) # fail
-[out]
-main:6: error: Incompatible types in assignment (expression has type "int", variable has type "A")
-main:8: error: Argument 1 to "g" has incompatible type "A"; expected "int"
-
-[case testMutuallyRecursiveNestedFunctions]
-def f() -> None:
- def g() -> None:
- h(1)
- h('') # E
- def h(x: int) -> None:
- g()
- g(1) # E
-[out]
-main:4: error: Argument 1 to "h" has incompatible type "str"; expected "int"
-main:7: error: Too many arguments for "g"
-
-[case testMutuallyRecursiveDecoratedFunctions]
-from typing import Callable, Any
-def dec(f) -> Callable[..., Any]: pass
-def f() -> None:
- @dec
- def g() -> None:
- h()
- h.x # E
- @dec
- def h(x: int) -> None:
- g(1)
- g.x # E
-[out]
-main:7: error: Callable[..., Any] has no attribute "x"
-main:11: error: Callable[..., Any] has no attribute "x"
-
-[case testNestedGenericFunctions]
-from typing import TypeVar
-T = TypeVar('T')
-U = TypeVar('U')
-
-def outer(x: T) -> T:
- def inner(y: U) -> T: ...
- return inner(1)
-
-
--- Casts
--- -----
-
-
-[case testCastsToAndFromFunctionTypes]
-from typing import TypeVar, Callable, Any, cast
-t = TypeVar('t')
-def f(x: t,
- f1: Callable[[], None],
- f2: Callable[[Any], None], o: object) -> None:
- x = cast(t, f1)
- f1 = cast(Callable[[], None], x)
- f1 = cast(Callable[[], None], f2)
- f1 = cast(Callable[[], None], o)
-
-
--- Function decorators
--- -------------------
-
-
-[case testTrivialStaticallyTypedFunctionDecorator]
-from typing import TypeVar
-t = TypeVar('t')
-def dec(f: t) -> t:
- return f
- at dec
-def f(x: int) -> None: pass
-f(1)
-f('x') # E: Argument 1 to "f" has incompatible type "str"; expected "int"
-
-[case testTrivialStaticallyTypedMethodDecorator]
-from typing import TypeVar
-t = TypeVar('t')
-def dec(f: t) -> t:
- return f
-class A:
- @dec
- def f(self, x: int) -> None: pass
-A().f(1)
-A().f('') # E: Argument 1 to "f" of "A" has incompatible type "str"; expected "int"
-class B: pass
-
-[case testTrivialDecoratedNestedFunction]
-from typing import TypeVar
-t = TypeVar('t')
-def dec(f: t) -> t:
- return f
-def g() -> None:
- @dec
- def f(x: int) -> None: pass
- f(1)
- f('') # E: Argument 1 to "f" has incompatible type "str"; expected "int"
-[out]
-
-[case testCheckingDecoratedFunction]
-import typing
-def dec(f): pass
- at dec
-def f(x: 'A') -> None:
- a = x # type: A
- x = object() # E: Incompatible types in assignment (expression has type "object", variable has type "A")
-class A: pass
-[out]
-
-[case testDecoratorThatSwitchesType]
-from typing import Callable
-def dec(x) -> Callable[[], None]: pass
- at dec
-def f(y): pass
-f()
-f(None) # E: Too many arguments for "f"
-
-[case testDecoratorThatSwitchesTypeWithMethod]
-from typing import Any, Callable
-def dec(x) -> Callable[[Any], None]: pass
-class A:
- @dec
- def f(self, a, b, c): pass
-a = None # type: A
-a.f()
-a.f(None) # E: Too many arguments for "f" of "A"
-
-[case testNestedDecorators]
-from typing import Any, Callable
-def dec1(f: Callable[[Any], None]) -> Callable[[], None]: pass
-def dec2(f: Callable[[Any, Any], None]) -> Callable[[Any], None]: pass
- at dec1
- at dec2
-def f(x, y): pass
-f()
-f(None) # E: Too many arguments for "f"
-
-[case testInvalidDecorator1]
-from typing import Any, Callable
-def dec1(f: Callable[[Any], None]) -> Callable[[], None]: pass
-def dec2(f: Callable[[Any, Any], None]) -> Callable[[Any], None]: pass
- at dec1 # E: Argument 1 to "dec2" has incompatible type Callable[[Any], Any]; expected Callable[[Any, Any], None]
- at dec2
-def f(x): pass
-
-[case testInvalidDecorator2]
-from typing import Any, Callable
-def dec1(f: Callable[[Any, Any], None]) -> Callable[[], None]: pass
-def dec2(f: Callable[[Any, Any], None]) -> Callable[[Any], None]: pass
- at dec1 # E: Argument 1 to "dec1" has incompatible type Callable[[Any], None]; expected Callable[[Any, Any], None]
- at dec2
-def f(x, y): pass
-
-[case testNoTypeCheckDecoratorOnMethod1]
-from typing import no_type_check
-
- at no_type_check
-def foo(x: 'bar', y: {'x': 4}) -> 42:
- 1 + 'x'
-
-[case testNoTypeCheckDecoratorOnMethod2]
-import typing
-
- at typing.no_type_check
-def foo(x: 's', y: {'x': 4}) -> 42:
- 1 + 'x'
-
- at typing.no_type_check
-def bar() -> None:
- 1 + 'x'
-
-[case testCallingNoTypeCheckFunction]
-import typing
-
- at typing.no_type_check
-def foo(x: {1:2}) -> [1]:
- 1 + 'x'
-
-foo()
-foo(1, 'b')
-
-[case testCallingNoTypeCheckFunction2]
-import typing
-
-def f() -> None:
- foo()
-
- at typing.no_type_check
-def foo(x: {1:2}) -> [1]:
- 1 + 'x'
-
-[case testNoTypeCheckDecoratorSemanticError]
-import typing
-
- at typing.no_type_check
-def foo(x: {1:2}) -> [1]:
- x = y
-
-
--- Forward references to decorated functions
--- -----------------------------------------
-
-
-[case testForwardReferenceToDynamicallyTypedDecorator]
-def f(self) -> None:
- g()
- g(1)
-
-def dec(f):
- return f
-
- at dec
-def g():
- pass
-
-[case testForwardReferenceToDecoratorWithAnyReturn]
-from typing import Any
-
-def f(self) -> None:
- g()
- g(1)
-
-def dec(f) -> Any:
- return f
-
- at dec
-def g():
- pass
-
-[case testForwardReferenceToDecoratorWithIdentityMapping]
-from typing import TypeVar
-
-def f(self) -> None:
- g()
- g(1) # E: Too many arguments for "g"
- h(1).x # E: "str" has no attribute "x"
- h('') # E: Argument 1 to "h" has incompatible type "str"; expected "int"
-
-T = TypeVar('T')
-def dec(f: T) -> T:
- return f
-
- at dec
-def g(): pass
- at dec
-def h(x: int) -> str: pass
-[out]
-
-[case testForwardReferenceToDynamicallyTypedDecoratedMethod]
-def f(self) -> None:
- A().f(1).y
- A().f()
-
-class A:
- @dec
- def f(self, x): pass
-
-def dec(f): return f
-[builtins fixtures/staticmethod.pyi]
-
-[case testForwardReferenceToStaticallyTypedDecoratedMethod]
-from typing import TypeVar
-
-def f(self) -> None:
- A().f(1).y # E: "str" has no attribute "y"
- A().f('') # E: Argument 1 to "f" of "A" has incompatible type "str"; expected "int"
-
-class A:
- @dec
- def f(self, a: int) -> str: return ''
-
-T = TypeVar('T')
-def dec(f: T) -> T: return f
-[builtins fixtures/staticmethod.pyi]
-[out]
-
-[case testForwardReferenceToDynamicallyTypedProperty]
-def f(self) -> None:
- A().x.y
-
-class A:
- @property
- def x(self): pass
-[builtins fixtures/property.pyi]
-
-[case testForwardReferenceToStaticallyTypedProperty]
-def f(self) -> None:
- A().x.y # E: "int" has no attribute "y"
-
-class A:
- @property
- def x(self) -> int: return 1
-[builtins fixtures/property.pyi]
-[out]
-
-[case testForwardReferenceToDynamicallyTypedStaticMethod]
-def f(self) -> None:
- A.x(1).y
- A.x() # E: Too few arguments for "x"
-
-class A:
- @staticmethod
- def x(x): pass
-[builtins fixtures/staticmethod.pyi]
-[out]
-
-[case testForwardReferenceToStaticallyTypedStaticMethod]
-def f(self) -> None:
- A.x(1).y # E: "str" has no attribute "y"
- A.x('') # E: Argument 1 to "x" of "A" has incompatible type "str"; expected "int"
-
-class A:
- @staticmethod
- def x(a: int) -> str: return ''
-[builtins fixtures/staticmethod.pyi]
-[out]
-
-[case testForwardReferenceToDynamicallyTypedClassMethod]
-def f(self) -> None:
- A.x(1).y
- A.x() # E: Too few arguments for "x"
-
-class A:
- @classmethod
- def x(cls, a): pass
-[builtins fixtures/classmethod.pyi]
-[out]
-
-[case testForwardReferenceToStaticallyTypedClassMethod]
-def f(self) -> None:
- A.x(1).y # E: "str" has no attribute "y"
- A.x('') # E: Argument 1 to "x" of "A" has incompatible type "str"; expected "int"
-
-class A:
- @classmethod
- def x(cls, x: int) -> str: return ''
-[builtins fixtures/classmethod.pyi]
-[out]
-
-[case testForwardReferenceToDecoratedFunctionUsingMemberExpr]
-import m
-
-def f(self) -> None:
- g(1).x # E: "str" has no attribute "x"
-
- at m.dec
-def g(x: int) -> str: pass
-[file m.py]
-from typing import TypeVar
-T = TypeVar('T')
-def dec(f: T) -> T:
- return f
-[out]
-
-[case testForwardReferenceToFunctionWithMultipleDecorators]
-def f(self) -> None:
- g()
- g(1)
-
-def dec(f):
- return f
-
- at dec
- at dec2
-def g():
- pass
-
-def dec2(f):
- return f
-
-[case testForwardReferenceToDynamicallyTypedDecoratedStaticMethod]
-def f(self) -> None:
- A().f(1).y
- A().f()
- A().g(1).y
- A().g()
-
-class A:
- @dec
- @staticmethod
- def f(self, x): pass
- @staticmethod
- @dec
- def g(self, x): pass
-
-def dec(f): return f
-[builtins fixtures/staticmethod.pyi]
-
-[case testForwardRefereceToDecoratedFunctionWithCallExpressionDecorator]
-def f(self) -> None:
- g()
- g(1)
-
- at dec(1)
-def g(): pass
-
-def dec(f): pass
-
-
--- Decorator functions in import cycles
--- ------------------------------------
-
-
-[case testDecoratorWithIdentityTypeInImportCycle]
-import a
-
-[file a.py]
-import b
-from d import dec
- at dec
-def f(x: int) -> None: pass
-b.g(1) # E
-
-[file b.py]
-import a
-from d import dec
- at dec
-def g(x: str) -> None: pass
-a.f('')
-
-[file d.py]
-from typing import TypeVar
-T = TypeVar('T')
-def dec(f: T) -> T: return f
-
-[out]
-tmp/b.py:5: error: Argument 1 to "f" has incompatible type "str"; expected "int"
-tmp/a.py:5: error: Argument 1 to "g" has incompatible type "int"; expected "str"
-
-[case testDecoratorWithNoAnnotationInImportCycle]
-import a
-
-[file a.py]
-import b
-from d import dec
- at dec
-def f(x: int) -> None: pass
-b.g(1, z=4)
-
-[file b.py]
-import a
-from d import dec
- at dec
-def g(x: str) -> None: pass
-a.f('', y=2)
-
-[file d.py]
-def dec(f): return f
-
-[case testDecoratorWithFixedReturnTypeInImportCycle]
-import a
-
-[file a.py]
-import b
-from d import dec
- at dec
-def f(x: int) -> str: pass
-b.g(1)()
-
-[file b.py]
-import a
-from d import dec
- at dec
-def g(x: int) -> str: pass
-a.f(1)()
-
-[file d.py]
-from typing import Callable
-def dec(f: Callable[[int], str]) -> Callable[[int], str]: return f
-
-[out]
-tmp/b.py:5: error: "str" not callable
-tmp/a.py:5: error: "str" not callable
-
-[case testDecoratorWithCallAndFixedReturnTypeInImportCycle]
-import a
-
-[file a.py]
-import b
-from d import dec
- at dec()
-def f(x: int) -> str: pass
-b.g(1)()
-
-[file b.py]
-import a
-from d import dec
- at dec()
-def g(x: int) -> str: pass
-a.f(1)()
-
-[file d.py]
-from typing import Callable
-def dec() -> Callable[[Callable[[int], str]], Callable[[int], str]]: pass
-
-[out]
-tmp/b.py:5: error: "str" not callable
-tmp/a.py:5: error: "str" not callable
-
-[case testDecoratorWithCallAndFixedReturnTypeInImportCycleAndDecoratorArgs]
-import a
-
-[file a.py]
-import b
-from d import dec
- at dec(1)
-def f(x: int) -> str: pass
-b.g(1)()
-
-[file b.py]
-import a
-from d import dec
- at dec(1)
-def g(x: int) -> str: pass
-a.f(1)()
-
-[file d.py]
-from typing import Callable
-def dec(x: str) -> Callable[[Callable[[int], str]], Callable[[int], str]]: pass
-
-[out]
-tmp/b.py:3: error: Argument 1 to "dec" has incompatible type "int"; expected "str"
-tmp/b.py:5: error: "str" not callable
-tmp/a.py:3: error: Argument 1 to "dec" has incompatible type "int"; expected "str"
-tmp/a.py:5: error: "str" not callable
-
-[case testUndefinedDecoratorInImportCycle]
-# cmd: mypy -m foo.base
-[file foo/__init__.py]
-import foo.base
-class Derived(foo.base.Base):
- def method(self) -> None: pass
-[file foo/base.py]
-import foo
-class Base:
- @decorator
- def method(self) -> None: pass
-[out]
-tmp/foo/base.py:3: error: Name 'decorator' is not defined
-
-
--- Conditional function definition
--- -------------------------------
-
-
-[case testTypeCheckBodyOfConditionalFunction]
-from typing import Any
-x = None # type: Any
-if x:
- def f(x: int) -> None:
- x = 1
- x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-[out]
-
-[case testCallConditionalFunction]
-from typing import Any
-x = None # type: Any
-if x:
- def f(x: int) -> None: pass
- f(1)
- f('x') # E: Argument 1 to "f" has incompatible type "str"; expected "int"
-f(1)
-f('x') # E: Argument 1 to "f" has incompatible type "str"; expected "int"
-
-[case testConditionalFunctionDefinitionWithIfElse]
-from typing import Any
-x = None # type: Any
-if x:
- def f(x: int) -> None:
- x = 'x' # fail
- x = 1
-else:
- def f(x: int) -> None:
- x + 'x' # fail
- x = 1
-f(1)
-f('x') # fail
-[out]
-main:5: error: Incompatible types in assignment (expression has type "str", variable has type "int")
-main:9: error: Unsupported operand types for + ("int" and "str")
-main:12: error: Argument 1 to "f" has incompatible type "str"; expected "int"
-
-[case testNestedConditionalFunctionDefinitionWithIfElse]
-from typing import Any
-x = None # type: Any
-def top() -> None:
- if x:
- def f(x: int) -> None:
- x = 'x' # fail
- x = 1
- else:
- def f(x: int) -> None:
- x + 'x' # fail
- x = 1
- f(1)
- f('x') # fail
-[out]
-main:6: error: Incompatible types in assignment (expression has type "str", variable has type "int")
-main:10: error: Unsupported operand types for + ("int" and "str")
-main:13: error: Argument 1 to "f" has incompatible type "str"; expected "int"
-
-[case testUnconditionalRedefinitionOfConditionalFunction]
-from typing import Any
-x = None # type: Any
-if x:
- def f(): pass
-def f(): pass # E: Name 'f' already defined
-
-[case testIncompatibleConditionalFunctionDefinition]
-from typing import Any
-x = None # type: Any
-if x:
- def f(x: int) -> None: pass
-else:
- def f(x): pass # E: All conditional function variants must have identical signatures
-
-[case testIncompatibleConditionalFunctionDefinition2]
-from typing import Any
-x = None # type: Any
-if x:
- def f(x: int) -> None: pass
-else:
- def f(y: int) -> None: pass # E: All conditional function variants must have identical signatures
-
-[case testIncompatibleConditionalFunctionDefinition3]
-from typing import Any
-x = None # type: Any
-if x:
- def f(x: int) -> None: pass
-else:
- def f(x: int = 0) -> None: pass # E: All conditional function variants must have identical signatures
-
-[case testConditionalRedefinitionOfAnUnconditionalFunctionDefinition1]
-from typing import Any
-def f(x: str) -> None: pass
-x = None # type: Any
-if x:
- def f(x: int) -> None: pass # E: All conditional function variants must have identical signatures
-
-[case testConditionalRedefinitionOfAnUnconditionalFunctionDefinition1]
-from typing import Any
-def f(x: int) -> None: pass # N: "f" defined here
-x = None # type: Any
-if x:
- def f(y: int) -> None: pass # E: All conditional function variants must have identical signatures
-f(x=1) # The first definition takes precedence.
-f(y=1) # E: Unexpected keyword argument "y" for "f"
-
-[case testRedefineFunctionDefinedAsVariable]
-def g(): pass
-f = g
-if g():
- def f(): pass
-f()
-f(1) # E: Too many arguments
-
-[case testRedefineFunctionDefinedAsVariableInitializedToNone]
-def g(): pass
-f = None
-if g():
- def f(): pass
-f()
-f(1) # E: Too many arguments for "f"
-
-[case testRedefineNestedFunctionDefinedAsVariableInitializedToNone]
-def g() -> None:
- f = None
- if object():
- def f(x: int) -> None: pass
- f() # E: Too few arguments for "f"
- f(1)
- f('') # E: Argument 1 to "f" has incompatible type "str"; expected "int"
-[out]
-
-[case testRedefineFunctionDefinedAsVariableWithInvalidSignature]
-def g(): pass
-f = g
-if g():
- def f(x): pass # E: Incompatible redefinition (redefinition with type Callable[[Any], Any], original type Callable[[], Any])
-
-[case testRedefineFunctionDefinedAsVariableWithVariance1]
-class B: pass
-class C(B): pass
-def g(x: C) -> B: pass
-f = g
-if g(C()):
- def f(x: C) -> C: pass
-
-[case testRedefineFunctionDefinedAsVariableWithVariance2]
-class B: pass
-class C(B): pass
-def g(x: C) -> B: pass
-f = g
-if g(C()):
- def f(x: B) -> B: pass
-
-[case testRedefineFunctionDefinedAsVariableInitializedToEmptyList]
-f = [] # E: Need type annotation for variable
-if object():
- def f(): pass # E: Incompatible redefinition
-f()
-f(1)
-[builtins fixtures/list.pyi]
-
-
--- Conditional method definition
--- -----------------------------
-
-
-[case testTypeCheckBodyOfConditionalMethod]
-from typing import Any
-x = None # type: Any
-class A:
- if x:
- def f(self, x: int) -> None:
- x = 1
- x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-[out]
-
-[case testCallConditionalMethodInClassBody]
-from typing import Any
-x = None # type: Any
-class A:
- if x:
- def f(self, x: int) -> None: pass
- f(x, 1)
- f(x, 'x') # E: Argument 2 to "f" of "A" has incompatible type "str"; expected "int"
- f(x, 1)
- f(x, 'x') # E: Argument 2 to "f" of "A" has incompatible type "str"; expected "int"
-[out]
-
-[case testCallConditionalMethodViaInstance]
-from typing import Any
-x = None # type: Any
-class A:
- if x:
- def f(self, x: int) -> None: pass
-A().f(1)
-A().f('x') # E: Argument 1 to "f" of "A" has incompatible type "str"; expected "int"
-
-[case testConditionalMethodDefinitionWithIfElse]
-from typing import Any
-x = None # type: Any
-class A:
- if x:
- def f(self, x: int) -> None:
- x = 'x' # fail
- x = 1
- else:
- def f(self, x: int) -> None:
- x + 'x' # fail
- x = 1
-A().f(1)
-A().f('x') # fail
-[out]
-main:6: error: Incompatible types in assignment (expression has type "str", variable has type "int")
-main:10: error: Unsupported operand types for + ("int" and "str")
-main:13: error: Argument 1 to "f" of "A" has incompatible type "str"; expected "int"
-
-[case testUnconditionalRedefinitionOfConditionalMethod]
-from typing import Any
-x = None # type: Any
-class A:
- if x:
- def f(self): pass
- def f(self): pass # E: Name 'f' already defined
-
-[case testIncompatibleConditionalMethodDefinition]
-from typing import Any
-x = None # type: Any
-class A:
- if x:
- def f(self, x: int) -> None: pass
- else:
- def f(self, x): pass # E: All conditional function variants must have identical signatures
-[out]
-
-[case testConditionalFunctionDefinitionInTry]
-import typing
-try:
- def f(x: int) -> None: pass
-except:
- def g(x: str) -> None: pass
-f(1)
-f('x') # E: Argument 1 to "f" has incompatible type "str"; expected "int"
-g('x')
-g(1) # E: Argument 1 to "g" has incompatible type "int"; expected "str"
-
-
--- Callable[..., T]
--- ----------------
-
-
-[case testCallableWithArbitraryArgs]
-from typing import Callable
-def f(x: Callable[..., int]) -> None:
- x()
- x(1)
- x(z=1)
- x() + '' # E: Unsupported operand types for + ("int" and "str")
-[out]
-
-[case testCallableWithArbitraryArgs2]
-from typing import Callable
-def f(x: Callable[..., int]) -> None:
- x(*[1], **{'x': 2})
-[builtins fixtures/dict.pyi]
-
-[case testCastWithCallableAndArbitraryArgs]
-from typing import Callable, cast
-f = cast(Callable[..., int], None)
-f(x=4) + '' # E: Unsupported operand types for + ("int" and "str")
-
-[case testCallableWithArbitraryArgsInErrorMessage]
-from typing import Callable
-def f(x: Callable[..., int]) -> None:
- x = 1 # E: Incompatible types in assignment (expression has type "int", variable has type Callable[..., int])
-[out]
-
-[case testCallableWithArbitraryArgsInGenericFunction]
-from typing import Callable, TypeVar
-T = TypeVar('T')
-def f(x: Callable[..., T]) -> T: pass
-def g(*x: int) -> str: pass
-x = f(g)
-x + 1 # E: Unsupported left operand type for + ("str")
-[builtins fixtures/list.pyi]
-
-[case testCallableWithArbitraryArgsSubtyping]
-from typing import Callable
-def f(x: Callable[..., int]) -> None: pass
-def g1(): pass
-def g2(x, y) -> int: pass
-def g3(*, y: str) -> int: pass
-def g4(*, y: int) -> str: pass
-f(g1)
-f(g2)
-f(g3)
-f(g4) # E: Argument 1 to "f" has incompatible type Callable[[NamedArg('y', int)], str]; expected Callable[..., int]
-
-[case testCallableWithArbitraryArgsSubtypingWithGenericFunc]
-from typing import Callable, TypeVar
-T = TypeVar('T')
-def f(x: Callable[..., int]) -> None: pass
-def g1(x: T) -> int: pass
-def g2(*x: T) -> int: pass
-def g3(*x: T) -> T: pass
-f(g1)
-f(g2)
-f(g3)
-
--- (...) -> T
--- ----------------
-[case testEllipsisWithArbitraryArgsOnBareFunction]
-def f(x, y, z): # type: (...) -> None
- pass
-f(1, "hello", [])
-f(x=1, y="hello", z=[])
-[builtins fixtures/dict.pyi]
-
-[case testEllipsisWithArbitraryArgsOnBareFunctionWithDefaults]
-def f(x, y=1, z="hey"): # type: (...) -> None
- pass
-f(1, "hello", [])
-f(x=1, y="hello", z=[])
-[builtins fixtures/dict.pyi]
-
-[case testEllipsisWithArbitraryArgsOnBareFunctionWithKwargs]
-from typing import Dict
-def f(x, **kwargs): # type: (...) -> None
- success_dict_type = kwargs # type: Dict[str, str]
- failure_dict_type = kwargs # type: Dict[int, str] # E: Incompatible types in assignment (expression has type Dict[str, Any], variable has type Dict[int, str])
-f(1, thing_in_kwargs=["hey"])
-[builtins fixtures/dict.pyi]
-[out]
-
-[case testEllipsisWithArbitraryArgsOnBareFunctionWithVarargs]
-from typing import Tuple, Any
-def f(x, *args): # type: (...) -> None
- success_tuple_type = args # type: Tuple[Any, ...]
- fail_tuple_type = args # type: None # E: Incompatible types in assignment (expression has type Tuple[Any, ...], variable has type None)
-f(1, "hello")
-[builtins fixtures/tuple.pyi]
-[out]
-
-[case testEllipsisWithArbitraryArgsOnInstanceMethod]
-class A:
- def f(self, x, y, z): # type: (...) -> None
- pass
-
-[case testEllipsisWithArbitraryArgsOnClassMethod]
-class A:
- @classmethod
- def f(cls, x, y, z): # type: (...) -> None
- pass
-[builtins fixtures/classmethod.pyi]
-
-[case testEllipsisWithArbitraryArgsOnStaticMethod]
-class A:
- @staticmethod
- def f(x, y, z): # type: (...) -> None
- pass
-[builtins fixtures/staticmethod.pyi]
-
-[case testEllipsisWithSomethingAfterItFails]
-def f(x, y, z): # type: (..., int) -> None
- pass
-[out]
-main:1: error: Parse error before ): Ellipses cannot accompany other argument types in function type signature.
-
-[case testEllipsisWithSomethingBeforeItFails]
-def f(x, y, z): # type: (int, ...) -> None
- pass
-[out]
-main:1: error: Parse error before ): Ellipses cannot accompany other argument types in function type signature.
-
-[case testRejectCovariantArgument]
-from typing import TypeVar, Generic
-
-t = TypeVar('t', covariant=True)
-class A(Generic[t]):
- def foo(self, x: t) -> None:
- return None
-[builtins fixtures/bool.pyi]
-[out]
-main:5: error: Cannot use a covariant type variable as a parameter
-
-[case testRejectContravariantReturnType]
-from typing import TypeVar, Generic
-
-t = TypeVar('t', contravariant=True)
-class A(Generic[t]):
- def foo(self) -> t:
- return None
-[builtins fixtures/bool.pyi]
-[out]
-main:5: error: Cannot use a contravariant type variable as return type
-
-[case testAcceptCovariantReturnType]
-from typing import TypeVar, Generic
-
-t = TypeVar('t', covariant=True)
-class A(Generic[t]):
- def foo(self) -> t:
- return None
-[builtins fixtures/bool.pyi]
-[case testAcceptContravariantArgument]
-from typing import TypeVar, Generic
-
-t = TypeVar('t', contravariant=True)
-class A(Generic[t]):
- def foo(self, x: t) -> None:
- return None
-[builtins fixtures/bool.pyi]
-
-
--- Redefining functions
--- --------------------
-
-
-[case testRedefineFunction]
-def f(x) -> Any: pass
-def g(x, y): pass
-def h(x): pass
-def j(y) -> Any: pass
-f = h
-f = j # E: Incompatible types in assignment (expression has type Callable[[Arg('y', Any)], Any], variable has type Callable[[Arg('x', Any)], Any])
-f = g # E: Incompatible types in assignment (expression has type Callable[[Any, Any], Any], variable has type Callable[[Any], Any])
-
-[case testRedefineFunction2]
-def f() -> None: pass
-def f() -> None: pass # E: Name 'f' already defined
-
-
--- Special cases
--- -------------
-
-
-[case testFunctionDefinitionWithForStatement]
-for _ in [1]:
- def f(): pass
-else:
- def g(): pass
-f()
-g()
-[builtins fixtures/list.pyi]
-
-[case testFunctionDefinitionWithWhileStatement]
-while bool():
- def f(): pass
-else:
- def g(): pass
-f()
-g()
-[builtins fixtures/bool.pyi]
-
-[case testBareCallable]
-from typing import Callable, Any
-
-def foo(f: Callable) -> bool:
- return f()
-
-def f1() -> bool:
- return False
-
-foo(f1)
-[builtins fixtures/bool.pyi]
-
-[case testFunctionNestedWithinWith]
-from typing import Any
-a = 1 # type: Any
-with a:
- def f() -> None:
- pass
- f(1) # E: Too many arguments for "f"
-
-
-[case testNameForDecoratorMethod]
-from typing import Callable
-
-class A:
- def f(self) -> None:
- # In particular, test that the error message contains "g" of "A".
- self.g() # E: Too few arguments for "g" of "A"
- self.g(1)
- @dec
- def g(self, x: str) -> None: pass
-
-def dec(f: Callable[[A, str], None]) -> Callable[[A, int], None]: pass
-[out]
-
-[case testUnknownFunctionNotCallable]
-def f() -> None:
- pass
-def g(x: int) -> None:
- pass
-h = f if bool() else g
-reveal_type(h) # E: Revealed type is 'builtins.function'
-h(7) # E: Cannot call function of unknown type
-[builtins fixtures/bool.pyi]
-
--- Positional-only arguments
--- -------------------------
-
-[case testPositionalOnlyArg]
-def f(__a: int) -> None: pass
-
-f(1)
-f(__a=1) # E: Unexpected keyword argument "__a" for "f"
-
-[builtins fixtures/bool.pyi]
-[out]
-main:1: note: "f" defined here
-
-[case testPositionalOnlyArgFastparse]
-# flags: --fast-parser
-
-def f(__a: int) -> None: pass
-
-f(1)
-f(__a=1) # E: Unexpected keyword argument "__a" for "f"
-
-[builtins fixtures/bool.pyi]
-[out]
-main:3: note: "f" defined here
-
-[case testMagicMethodPositionalOnlyArg]
-class A(object):
- def __eq__(self, other) -> bool: return True # We are all equal.
-
-a = A()
-a.__eq__(a)
-a.__eq__(other=a) # E: Unexpected keyword argument "other" for "__eq__" of "A"
-
-[builtins fixtures/bool.pyi]
-
-[case testMagicMethodPositionalOnlyArgFastparse]
-# flags: --fast-parser
-
-class A(object):
- def __eq__(self, other) -> bool: return True # We are all equal.
-
-a = A()
-a.__eq__(a)
-a.__eq__(other=a) # E: Unexpected keyword argument "other" for "__eq__" of "A"
-
-[builtins fixtures/bool.pyi]
-
-[case testTupleArguments]
-# flags: --python-version 2.7
-
-def f(a, (b, c), d): pass
-
-[case testTupleArgumentsFastparse]
-# flags: --fast-parser --python-version 2.7
-
-def f(a, (b, c), d): pass
diff --git a/test-data/unit/check-generic-subtyping.test b/test-data/unit/check-generic-subtyping.test
deleted file mode 100644
index 46df3c9..0000000
--- a/test-data/unit/check-generic-subtyping.test
+++ /dev/null
@@ -1,749 +0,0 @@
--- Test cases for the type checker related to subtyping and inheritance with
--- generics.
-
-
--- Subtyping + inheritance
--- -----------------------
-
-
-[case testSubtypingAndInheritingNonGenericTypeFromGenericType]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-ac = None # type: A[C]
-ad = None # type: A[D]
-b = None # type: B
-
-b = ad # E: Incompatible types in assignment (expression has type A[D], variable has type "B")
-ad = b # E: Incompatible types in assignment (expression has type "B", variable has type A[D])
-b = ac # E: Incompatible types in assignment (expression has type A[C], variable has type "B")
-
-b = b
-ac = b
-
-class C: pass
-class A(Generic[T]): pass
-class B(A[C]): pass
-class D: pass
-
-[case testSubtypingAndInheritingGenericTypeFromNonGenericType]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-a = None # type: A
-bc = None # type: B[C]
-bd = None # type: B[D]
-
-bc = bd # E: Incompatible types in assignment (expression has type B[D], variable has type B[C])
-bd = bc # E: Incompatible types in assignment (expression has type B[C], variable has type B[D])
-bc = a # E: Incompatible types in assignment (expression has type "A", variable has type B[C])
-bd = a # E: Incompatible types in assignment (expression has type "A", variable has type B[D])
-
-a = bc
-a = bd
-
-class A: pass
-class B(A, Generic[T]): pass
-class C: pass
-class D: pass
-
-[case testSubtypingAndInheritingGenericTypeFromGenericType]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-S = TypeVar('S')
-ac = None # type: A[C]
-ad = None # type: A[D]
-bcc = None # type: B[C, C]
-bdc = None # type: B[D, C]
-
-ad = bcc # E: Incompatible types in assignment (expression has type B[C, C], variable has type A[D])
-ad = bdc # E: Incompatible types in assignment (expression has type B[D, C], variable has type A[D])
-bcc = ac # E: Incompatible types in assignment (expression has type A[C], variable has type B[C, C])
-bdc = ac # E: Incompatible types in assignment (expression has type A[C], variable has type B[D, C])
-
-bcc = bcc
-bdc = bdc
-ac = bcc
-ac = bdc
-
-class A(Generic[T]): pass
-class B(A[S], Generic[T, S]): pass
-class C: pass
-class D: pass
-
-[case testSubtypingAndInheritingGenericTypeFromGenericTypeAcrossHierarchy]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-S = TypeVar('S')
-X = TypeVar('X')
-Y = TypeVar('Y')
-ae = None # type: A[A[E]]
-af = None # type: A[A[F]]
-
-cef = None # type: C[E, F]
-cff = None # type: C[F, F]
-cfe = None # type: C[F, E]
-
-ae = cef # E: Incompatible types in assignment (expression has type C[E, F], variable has type A[A[E]])
-af = cfe # E: Incompatible types in assignment (expression has type C[F, E], variable has type A[A[F]])
-
-ae = cfe
-af = cef
-af = cff
-
-class A(Generic[T]): pass
-class B(A[S], Generic[T, S]): pass
-class C(B[A[X], A[Y]], Generic[X, Y]): pass
-class E: pass
-class F: pass
-
-[case testIncludingBaseClassTwice]
-from typing import TypeVar, Generic
-t = TypeVar('t')
-class I(Generic[t]): pass
-class A(I[C], I[object]): pass # E: Duplicate base class "I"
-class C: pass
-
-
--- Accessing inherited generic members
--- -----------------------------------
-
-
-[case testAccessingMethodInheritedFromGenericType]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-S = TypeVar('S')
-b = None # type: B[C, D]
-c, d = None, None # type: (C, D)
-
-b.f(c) # E: Argument 1 to "f" of "A" has incompatible type "C"; expected "D"
-b.f(d)
-
-class A(Generic[T]):
- def f(self, a: T) -> None:
- pass
-class B(A[S], Generic[T, S]): pass
-class C: pass
-class D: pass
-
-[case testAccessingMethodInheritedFromGenericTypeInNonGenericType]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-b, c, d = None, None, None # type: (B, C, D)
-
-b.f(c) # E: Argument 1 to "f" of "A" has incompatible type "C"; expected "D"
-b.f(d)
-
-class C: pass
-class D: pass
-class A(Generic[T]):
- def f(self, a: T) -> None:
- pass
-class B(A[D]): pass
-
-[case testAccessingMemberVarInheritedFromGenericType]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-S = TypeVar('S')
-class A(Generic[T]):
- def __init__(self, a: T) -> None:
- self.a = a
-
-b = None # type: B[C, D]
-c, d = None, None # type: (C, D)
-
-b.a = c # E: Incompatible types in assignment (expression has type "C", variable has type "D")
-b.a = d
-
-class B(A[S], Generic[T, S]): pass
-class C: pass
-class D: pass
-
-
--- Overriding with generic types
--- -----------------------------
-
-
-[case testOverridingMethodInSimpleTypeInheritingGenericType]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-class B(Generic[T]):
- def f(self, a: T) -> None: pass
- def g(self, a: T) -> None: pass
-class C: pass
-class D: pass
-class A(B[C]):
- def f(self, a: D) -> None: pass \
- # E: Argument 1 of "f" incompatible with supertype "B"
- def g(self, a: C) -> None: pass
-[out]
-
-[case testOverridingMethodInGenericTypeInheritingSimpleType]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-class C: pass
-class B:
- def f(self, a: C) -> None: pass
- def g(self, a: C) -> None: pass
-class A(B, Generic[T]):
- def f(self, a: T) -> None: pass \
- # E: Argument 1 of "f" incompatible with supertype "B"
- def g(self, a: 'C') -> None: pass
-[out]
-
-[case testOverridingMethodInGenericTypeInheritingGenericType]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-S = TypeVar('S')
-class B(Generic[T]):
- def f(self, a: T) -> None: pass
- def g(self, a: T) -> None: pass
-class A(B[S], Generic[T, S]):
- def f(self, a: T) -> None: pass \
- # E: Argument 1 of "f" incompatible with supertype "B"
- def g(self, a: S) -> None: pass
-[out]
-
-[case testOverridingMethodInMultilevelHierarchyOfGenericTypes]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-S = TypeVar('S')
-U = TypeVar('U')
-V = TypeVar('V')
-
-class D: pass
-class C(Generic[T, U, V]):
- def f(self, a: V) -> None: pass
- def g(self, a: V) -> None: pass
-class B(C[D, D, T], Generic[T]): pass
-class A(B[S], Generic[T, S]):
- def f(self, a: T) -> None: pass \
- # E: Argument 1 of "f" incompatible with supertype "C"
- def g(self, a: S) -> None: pass
-[out]
-
-[case testOverrideGenericMethodInNonGenericClass]
-from typing import TypeVar
-
-T = TypeVar('T')
-S = TypeVar('S')
-
-class A:
- def f(self, x: T, y: S) -> None: pass
-class B(A):
- def f(self, x: S, y: T) -> None: pass
-class C(A):
- # Okay, because T = object allows any type for the arguments.
- def f(self, x: T, y: T) -> None: pass
-
-[case testOverrideGenericMethodInNonGenericClassLists]
-from typing import TypeVar, List
-
-T = TypeVar('T')
-S = TypeVar('S')
-
-class A:
- def f(self, x: List[T], y: List[S]) -> None: pass
-class B(A):
- def f(self, x: List[S], y: List[T]) -> None: pass
-class C(A):
- def f(self, x: List[T], y: List[T]) -> None: pass # E: Signature of "f" incompatible with supertype "A"
-[builtins fixtures/list.pyi]
-[out]
-
-[case testOverrideGenericMethodInNonGenericClassGeneralize]
-from typing import TypeVar
-
-T = TypeVar('T')
-T1 = TypeVar('T1', bound=str)
-S = TypeVar('S')
-
-class A:
- def f(self, x: int, y: S) -> None: pass
-class B(A):
- def f(self, x: T, y: S) -> None: pass
-class C(A):
- def f(self, x: T, y: str) -> None: pass
-class D(A):
- def f(self, x: T1, y: S) -> None: pass # TODO: This error could be more specific.
-[out]
-main:12: error: Argument 2 of "f" incompatible with supertype "A"
-main:14: error: Signature of "f" incompatible with supertype "A"
-
-
--- Inheritance from generic types with implicit dynamic supertype
--- --------------------------------------------------------------
-
-
-[case testInheritanceFromGenericWithImplicitDynamicAndSubtyping]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-a = None # type: A
-bc = None # type: B[C]
-bd = None # type: B[D]
-
-a = bc # E: Incompatible types in assignment (expression has type B[C], variable has type "A")
-bc = a
-bd = a
-
-class B(Generic[T]): pass
-class A(B): pass
-class C: pass
-class D: pass
-[out]
-
-[case testInheritanceFromGenericWithImplicitDynamicAndExternalAccess]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-
-class B(Generic[T]):
- def f(self, a: 'B[T]') -> None: pass
- def __init__(self, x: 'B[T]') -> None:
- self.x = x
-class A(B): pass
-class C: pass
-
-a = None # type: A
-c = None # type: C
-bc = None # type: B[C]
-
-a.x = c # E: Incompatible types in assignment (expression has type "C", variable has type B[Any])
-a.f(c) # E: Argument 1 to "f" of "B" has incompatible type "C"; expected B[Any]
-a.x = bc
-a.f(bc)
-[out]
-
-[case testInheritanceFromGenericWithImplicitDynamic]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-a = None # type: A
-c = None # type: C
-bc = None # type: B[C]
-
-class B(Generic[T]):
- def f(self, a: 'B[T]') -> None: pass
- def __init__(self, x: 'B[T]') -> None:
- self.x = x
-
-class A(B):
- def g(self) -> None:
- self.x = c # E: Incompatible types in assignment (expression has type "C", variable has type B[Any])
- self.f(c) # E: Argument 1 to "f" of "B" has incompatible type "C"; expected B[Any]
- self.x = bc
- self.f(bc)
-
-class C: pass
-[out]
-
-[case testInheritanceFromGenericWithImplicitDynamicAndOverriding]
-from typing import TypeVar, Generic, Tuple
-T = TypeVar('T')
-class B(Generic[T]):
- def f(self, a: T, b: 'Tuple[T, B[T]]') -> None:
- pass
-class A(B):
- def f(self, a, b): pass
-[builtins fixtures/tuple.pyi]
-[out]
-
-
--- Inheritance from generic types and super expressions
--- ----------------------------------------------------
-
-
-[case testSuperExpressionsWhenInheritingFromGenericType]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-S = TypeVar('S')
-class B(Generic[T]):
- def f(self, a: T) -> None: pass
-class A(B[S], Generic[T, S]):
- def g(self, t: T, s: S) -> None:
- super().f(t) # E: Argument 1 to "f" of "B" has incompatible type "T"; expected "S"
- super().f(s)
-[out]
-
-[case testSuperExpressionsWhenInheritingFromGenericTypeAndDeepHierarchy]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-S = TypeVar('S')
-U = TypeVar('U')
-V = TypeVar('V')
-class C(Generic[T, U, V]):
- def f(self, a: V) -> None: pass
-class D: pass
-class B(C[D, D, T], Generic[T]): pass
-class A(B[S], Generic[T, S]):
- def g(self, t: T, s: S) -> None:
- super().f(t) # E: Argument 1 to "f" of "C" has incompatible type "T"; expected "S"
- super().f(s)
-[out]
-
-
--- Type of inherited constructor
--- -----------------------------
-
-
-[case testInheritedConstructor]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-class A(Generic[T]):
- def __init__(self, x: T) -> None: pass
-class B(A[T], Generic[T]): pass
-class C(A[int]): pass
-class D(A[A[T]], Generic[T]): pass
-B(1)
-C(1)
-C('a') # E: Argument 1 to "C" has incompatible type "str"; expected "int"
-D(A(1))
-D(1) # E: Argument 1 to "D" has incompatible type "int"; expected A[None]
-
-
-[case testInheritedConstructor2]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-U = TypeVar('U')
-Z = TypeVar('Z')
-class A(Generic[T, U]):
- def __init__(self, x: T, y: U, z: Z) -> None: pass
-class B(A[int, T], Generic[T]): pass
-class C(B[A[T, str]], Generic[T, U]): pass
-# C[T, U] <: B[A[T, str]] <: A[int, A[T, str]]
-C(1, A(1, 'a', 0), 'z')
-C(1, A('1', 'a', 0), 'z')
-C('1', A(1, 'a', 0), 'z') # E: Argument 1 to "C" has incompatible type "str"; expected "int"
-C(1, A(1, 1, 0), 'z') # E: Argument 2 to "A" has incompatible type "int"; expected "str"
-
-
--- Subtyping with a generic abstract base class
--- --------------------------------------------
-
-
-[case testSubtypingWithGenericTypeSubclassingGenericAbstractClass]
-from typing import TypeVar, Generic
-from abc import abstractmethod
-T = TypeVar('T')
-S = TypeVar('S')
-acd = None # type: A[C, D]
-adc = None # type: A[D, C]
-ic = None # type: I[C]
-id = None # type: I[D]
-
-ic = acd # E: Incompatible types in assignment (expression has type A[C, D], variable has type I[C])
-id = adc # E: Incompatible types in assignment (expression has type A[D, C], variable has type I[D])
-adc = ic # E: Incompatible types in assignment (expression has type I[C], variable has type A[D, C])
-
-ic = adc
-id = acd
-
-class I(Generic[T]):
- @abstractmethod
- def f(self): pass
-class A(I[S], Generic[T, S]): pass
-class C: pass
-class D: pass
-
-[case testSubtypingWithTypeImplementingGenericABCViaInheritance]
-from typing import TypeVar, Generic
-S = TypeVar('S')
-a, b = None, None # type: (A, B)
-ic, id, ie = None, None, None # type: (I[C], I[D], I[E])
-
-class I(Generic[S]): pass
-class B(I[C]): pass
-class A(B): pass
-
-ie = a # E: Incompatible types in assignment (expression has type "A", variable has type I[E])
-a = ic # E: Incompatible types in assignment (expression has type I[C], variable has type "A")
-a = id # E: Incompatible types in assignment (expression has type I[D], variable has type "A")
-a = b # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-id = a # E: Incompatible types in assignment (expression has type "A", variable has type I[D])
-
-ic = a
-b = a
-
-class C: pass
-class D: pass
-class E: pass
-[out]
-
-[case testSubtypingWithTypeImplementingGenericABCViaInheritance2-skip]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-class I(Generic[T]): pass
-class A(I[C]): pass
-class B(A, I[D]): pass # Fail
-
-class C: pass
-class D: pass
-[out]
-main:5: error: Class "B" has base "I" duplicated inconsistently
-
-[case testSubtypingAndABCExtension]
-from typing import TypeVar, Generic
-from abc import abstractmethod, ABCMeta
-t = TypeVar('t')
-a, i, j = None, None, None # type: (A[object], I[object], J[object])
-(ii, jj) = (i, j)
-ii = a
-jj = a
-jj = i
-a = i # E: Incompatible types in assignment (expression has type I[object], variable has type A[object])
-a = j # E: Incompatible types in assignment (expression has type J[object], variable has type A[object])
-
-class J(Generic[t]): pass
-class X(metaclass=ABCMeta): pass
-class I(X, J[t], Generic[t]): pass
-class A(I[t], Generic[t]): pass
-
-
--- Subclassing a generic ABC
--- -------------------------
-
-
-[case testSubclassingGenericABC1]
-from typing import TypeVar, Generic
-from abc import abstractmethod
-T = TypeVar('T')
-class I(Generic[T]):
- @abstractmethod
- def f(self, a: T) -> None: pass
- @abstractmethod
- def g(self, a: T) -> None: pass
-class A(I[C]):
- def f(self, a: 'D') -> None: pass \
- # E: Argument 1 of "f" incompatible with supertype "I"
- def g(self, a: 'C') -> None: pass
-class C: pass
-class D: pass
-[out]
-
-
--- Extending a generic ABC with deep type hierarchy
--- ------------------------------------------------
-
-
-[case testSubclassingGenericABCWithDeepHierarchy]
-from typing import Any, TypeVar, Generic
-from abc import abstractmethod
-T = TypeVar('T')
-a = None # type: A
-ic, id = None, None # type: (I[C], I[D])
-
-id = a # Fail
-ic = a
-
-class I(Generic[T]):
- @abstractmethod
- def f(self, a: T, b: T) -> None: pass
- @abstractmethod
- def g(self, a: T, b: 'D') -> None: pass
-class B(I[C]):
- def f(self, a: 'C', b: 'C') -> None: pass
- def g(self, a: 'C', b: Any) -> None: pass
-class A(B):
- def g(self, a: 'C', b: 'C') -> None: pass \
- # E: Argument 2 of "g" incompatible with supertype "I"
- def f(self, a: 'C', b: 'C') -> None: pass
-class C: pass
-class D: pass
-[out]
-main:7: error: Incompatible types in assignment (expression has type "A", variable has type I[D])
-
-[case testSubclassingGenericABCWithDeepHierarchy2]
-from typing import Any, TypeVar, Generic
-from abc import abstractmethod
-T = TypeVar('T')
-class I(Generic[T]):
- @abstractmethod
- def f(self, a: T, b: T) -> None: pass
-class B(I[C]):
- def f(self, a: 'C', b: Any) -> None: pass
-class A(B):
- def f(self, a: 'C', b: 'D') -> None: pass \
- # E: Argument 2 of "f" incompatible with supertype "I"
-class C: pass
-class D: pass
-[out]
-
-
--- Implicit Any types and subclassing generic ABC
--- ----------------------------------------------
-
-
-[case testSubclassingGenericABCWithImplicitAny]
-from typing import Any, TypeVar, Generic
-from abc import abstractmethod
-T = TypeVar('T')
-a = None # type: Any
-ic = None # type: I[C]
-id = None # type: I[D]
-
-ic = a
-id = a
-
-class I(Generic[T]):
- @abstractmethod
- def f(self, a: T) -> None: pass
-class A(I):
- def f(self, a): pass
-
-class C: pass
-class D: pass
-
-[case testSubclassingGenericABCWithImplicitAnyAndDeepHierarchy]
-from typing import Any, TypeVar, Generic
-from abc import abstractmethod
-T = TypeVar('T')
-a = None # type: Any
-ic = None # type: I[C]
-id = None # type: I[D]
-
-ic = a
-id = a
-
-class I(Generic[T]):
- @abstractmethod
- def f(self, a: T, b: T) -> None: pass
-class B(I):
- def f(self, a, b): pass
-class A(B):
- def f(self, a: 'C', b: 'D') -> None: pass
-class C: pass
-class D: pass
-
-[case testImplementingGenericABCWithImplicitAnyAndDeepHierarchy2]
-from typing import Any, TypeVar, Generic
-from abc import abstractmethod
-T = TypeVar('T')
-a = None # type: Any
-jc = None # type: J[C]
-jd = None # type: J[D]
-
-jc = a
-jd = a
-
-class J(Generic[T]):
- @abstractmethod
- def f(self, a: T, b: T) -> None: pass
-class I(J):
- @abstractmethod
- def f(self, a, b): pass
-class A(I):
- def f(self, a: 'C', b: 'D') -> None: pass
-
-class C: pass
-class D: pass
-
-
--- Accessing generic ABC members
--- -----------------------------
-
-
-[case testAccessingGenericABCMembers]
-from typing import TypeVar, Generic
-from abc import abstractmethod
-T = TypeVar('T')
-class I(Generic[T]):
- @abstractmethod
- def f(self, a: T) -> None: pass
-class A: pass
-class B: pass
-
-a, b = None, None # type: (A, B)
-ia = None # type: I[A]
-
-ia.f(b) # E: Argument 1 to "f" of "I" has incompatible type "B"; expected "A"
-ia.f(a)
-
-[case testAccessingInheritedGenericABCMembers]
-from typing import TypeVar, Generic
-from abc import abstractmethod
-T = TypeVar('T')
-class J(Generic[T]):
- @abstractmethod
- def f(self, a: T) -> None: pass
-class I(J[T], Generic[T]): pass
-class A: pass
-class B: pass
-a, b = None, None # type: (A, B)
-ia = None # type: I[A]
-
-ia.f(b) # E: Argument 1 to "f" of "J" has incompatible type "B"; expected "A"
-ia.f(a)
-
-
--- Misc
--- ----
-
-
-[case testMultipleAssignmentAndGenericSubtyping]
-from typing import Iterable
-n, s = None, None # type: int, str
-class Nums(Iterable[int]):
- def __iter__(self): pass
- def __next__(self): pass
-n, n = Nums()
-s, s = Nums() # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-[builtins fixtures/for.pyi]
-[out]
-
-
--- Variance
--- --------
-
-
-[case testCovariant]
-from typing import TypeVar, Generic
-True = 1
-
-T = TypeVar('T', covariant=True)
-
-class G(Generic[T]): pass
-class A: pass
-class B(A): pass
-class C(B): pass
-
-a = None # type: G[A]
-b = None # type: G[B]
-c = None # type: G[C]
-
-b = a # E: Incompatible types in assignment (expression has type G[A], variable has type G[B])
-b = c
-[out]
-
-[case testContravariant]
-from typing import TypeVar, Generic
-True = 1
-
-T = TypeVar('T', contravariant=True)
-
-class G(Generic[T]): pass
-class A: pass
-class B(A): pass
-class C(B): pass
-
-a = None # type: G[A]
-b = None # type: G[B]
-c = None # type: G[C]
-
-b = a
-b = c # E: Incompatible types in assignment (expression has type G[C], variable has type G[B])
-[out]
-
-[case testInvariant]
-from typing import TypeVar, Generic
-True = 1
-
-T = TypeVar('T') # invariant (default)
-
-class G(Generic[T]): pass
-class A: pass
-class B(A): pass
-class C(B): pass
-
-a = None # type: G[A]
-b = None # type: G[B]
-c = None # type: G[C]
-
-b = a # E: Incompatible types in assignment (expression has type G[A], variable has type G[B])
-b = c # E: Incompatible types in assignment (expression has type G[C], variable has type G[B])
-[out]
diff --git a/test-data/unit/check-generics.test b/test-data/unit/check-generics.test
deleted file mode 100644
index 225d66f..0000000
--- a/test-data/unit/check-generics.test
+++ /dev/null
@@ -1,1419 +0,0 @@
--- Simple generic types
--- --------------------
-
-
-[case testGenericMethodReturnType]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-a, b, c = None, None, None # type: (A[B], B, C)
-c = a.f() # Fail
-b = a.f()
-
-class A(Generic[T]):
- def f(self) -> T: pass
-
-class B: pass
-class C: pass
-[out]
-main:4: error: Incompatible types in assignment (expression has type "B", variable has type "C")
-
-[case testGenericMethodArgument]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-a.f(c) # Fail
-a.f(b)
-
-a = None # type: A[B]
-b = None # type: B
-c = None # type: C
-
-class A(Generic[T]):
- def f(self, a: T) -> None: pass
-
-class B: pass
-class C: pass
-[out]
-main:3: error: Argument 1 to "f" of "A" has incompatible type "C"; expected "B"
-
-[case testGenericMemberVariable]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-class A(Generic[T]):
- def __init__(self, v: T) -> None:
- self.v = v
-
-a, b, c = None, None, None # type: (A[B], B, C)
-a.v = c # Fail
-a.v = b
-
-class B: pass
-class C: pass
-[out]
-main:8: error: Incompatible types in assignment (expression has type "C", variable has type "B")
-
-[case testGenericMemberVariable]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-a, b, c = None, None, None # type: (A[B], B, C)
-a.v = c # Fail
-a.v = b
-
-class A(Generic[T]):
- v = None # type: T
-class B: pass
-class C: pass
-[out]
-main:4: error: Incompatible types in assignment (expression has type "C", variable has type "B")
-
-[case testSimpleGenericSubtyping]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-b, bb, c = None, None, None # type: (A[B], A[B], A[C])
-c = b # Fail
-b = c # Fail
-
-b = b
-b = bb
-
-class A(Generic[T]): pass
-class B: pass
-class C(B): pass
-[out]
-main:4: error: Incompatible types in assignment (expression has type A[B], variable has type A[C])
-main:5: error: Incompatible types in assignment (expression has type A[C], variable has type A[B])
-
-[case testGenericTypeCompatibilityWithAny]
-from typing import Any, TypeVar, Generic
-T = TypeVar('T')
-b, c, d = None, None, None # type: (A[B], A[C], A[Any])
-
-b = d
-c = d
-d = b
-d = c
-
-class A(Generic[T]): pass
-class B: pass
-class C(B): pass
-[out]
-
-[case testTypeVariableAsTypeArgument]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-a = None # type: A[B]
-b = None # type: A[B]
-c = None # type: A[C]
-
-a.v = c # Fail
-c = a.v # Fail
-a.v = b
-b = a.v
-
-class A(Generic[T]):
- v = None # type: A[T]
-
-class B: pass
-class C: pass
-[out]
-main:7: error: Incompatible types in assignment (expression has type A[C], variable has type A[B])
-main:8: error: Incompatible types in assignment (expression has type A[B], variable has type A[C])
-
-[case testMultipleGenericTypeParametersWithMemberVars]
-from typing import TypeVar, Generic
-S = TypeVar('S')
-T = TypeVar('T')
-a = None # type: A[B, C]
-s = None # type: B
-t = None # type: C
-
-t = a.s # Fail
-s = a.t # Fail
-
-s = a.s
-t = a.t
-
-class A(Generic[S, T]):
- s = None # type: S
- t = None # type: T
-class B: pass
-class C: pass
-[out]
-main:8: error: Incompatible types in assignment (expression has type "B", variable has type "C")
-main:9: error: Incompatible types in assignment (expression has type "C", variable has type "B")
-
-[case testMultipleGenericTypeParametersWithMethods]
-from typing import TypeVar, Generic
-S = TypeVar('S')
-T = TypeVar('T')
-a = None # type: A[B, C]
-s = None # type: B
-t = None # type: C
-
-a.f(s, s) # Fail
-a.f(t, t) # Fail
-a.f(s, t)
-
-class A(Generic[S, T]):
- def f(self, s: S, t: T) -> None: pass
-class B: pass
-class C: pass
-[out]
-main:8: error: Argument 2 to "f" of "A" has incompatible type "B"; expected "C"
-main:9: error: Argument 1 to "f" of "A" has incompatible type "C"; expected "B"
-
-[case testMultipleGenericTypeParametersAndSubtyping]
-from typing import TypeVar, Generic
-S = TypeVar('S')
-T = TypeVar('T')
-bc = None # type: A[B, C]
-bb = None # type: A[B, B]
-cb = None # type: A[C, B]
-
-bb = bc # Fail
-bb = cb # Fail
-bc = bb # Fail
-
-bb = bb
-bc = bc
-
-class A(Generic[S, T]):
- s = None # type: S
- t = None # type: T
-
-class B: pass
-class C(B):pass
-[out]
-main:8: error: Incompatible types in assignment (expression has type A[B, C], variable has type A[B, B])
-main:9: error: Incompatible types in assignment (expression has type A[C, B], variable has type A[B, B])
-main:10: error: Incompatible types in assignment (expression has type A[B, B], variable has type A[B, C])
-
-
--- Simple generic type bodies
--- --------------------------
-
-
-[case testGenericTypeBody1]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-class A(Generic[T]):
- a = None # type: T
-
- def f(self, b: T) -> T:
- self.f(x) # Fail
- d = self # type: A[B] # Fail
- self.a = self.f(self.a)
- return self.a
- c = self # type: A[T]
-x = None # type: B
-class B: pass
-[out]
-main:7: error: Argument 1 to "f" of "A" has incompatible type "B"; expected "T"
-main:8: error: Incompatible types in assignment (expression has type A[T], variable has type A[B])
-
-[case testGenericTypeBodyWithMultipleVariables]
-from typing import TypeVar, Generic
-S = TypeVar('S')
-T = TypeVar('T')
-class A(Generic[S, T]):
- def f(self) -> None:
- s = None # type: S
- t = None # type: T
- s = t # Fail
- t = s # Fail
- a = self # type: A[S, B] # Fail
- b = self # type: A[T, T] # Fail
- c = self # type: A[S, T]
- t = t
-
-class B: pass
-[out]
-main:8: error: Incompatible types in assignment (expression has type "T", variable has type "S")
-main:9: error: Incompatible types in assignment (expression has type "S", variable has type "T")
-main:10: error: Incompatible types in assignment (expression has type A[S, T], variable has type A[S, B])
-main:11: error: Incompatible types in assignment (expression has type A[S, T], variable has type A[T, T])
-
-[case testCompatibilityOfNoneWithTypeVar]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-class A(Generic[T]):
- def f(self) -> None:
- a = None # type: T
- a = None
-[out]
-
-[case testCompatibilityOfTypeVarWithObject]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-class A(Generic[T]):
- def f(self) -> T:
- a = object() # type: T # Fail
- a = object() # Fail
- b = self.f() # type: object
- b = self.f()
-[out]
-main:5: error: Incompatible types in assignment (expression has type "object", variable has type "T")
-main:6: error: Incompatible types in assignment (expression has type "object", variable has type "T")
-
-
--- Operations with generic types
--- -----------------------------
-
-
-[case testGenericOperations]
-from typing import TypeVar, Generic
-S = TypeVar('S')
-T = TypeVar('T')
-a = None # type: A[B, C]
-b = None # type: B
-c = None # type: C
-
-b = a + b # Fail
-c = a + c # Fail
-c = a[c] # Fail
-b = a[b] # Fail
-
-c = a + b
-b = a[c]
-
-class A(Generic[S, T]):
- def __add__(self, a: S) -> T: pass
- def __getitem__(self, i: T) -> S: pass
-
-class B: pass
-class C: pass
-[out]
-main:8: error: Incompatible types in assignment (expression has type "C", variable has type "B")
-main:9: error: Unsupported operand types for + ("A" and "C")
-main:10: error: Incompatible types in assignment (expression has type "B", variable has type "C")
-main:11: error: Invalid index type "B" for "A"; expected type "C"
-
-[case testOperatorAssignmentWithIndexLvalue1]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-b = None # type: B
-c = None # type: C
-ac = None # type: A[C]
-
-ac[b] += b # Fail
-ac[c] += c # Fail
-ac[b] += c
-ac[b] = ac[b] + c
-
-class A(Generic[T]):
- def __getitem__(self, i: 'B') -> T: pass
- def __setitem__(self, i: 'B', v: T) -> None: pass
-
-class B: pass
-class C:
- def __add__(self, o: 'C') -> 'C': pass
-[out]
-main:7: error: Unsupported operand types for + ("C" and "B")
-main:7: error: Incompatible types in assignment (expression has type "B", target has type "C")
-main:8: error: Invalid index type "C" for "A"; expected type "B"
-
-[case testOperatorAssignmentWithIndexLvalue2]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-b = None # type: B
-c = None # type: C
-ac = None # type: A[C]
-
-ac[b] += c # Fail
-ac[c] += c # Fail
-ac[b] = ac[b] + c # Fail
-
-class A(Generic[T]):
- def __getitem__(self, i: 'B') -> T: pass
- def __setitem__(self, i: 'C', v: T) -> None: pass
-
-class B: pass
-class C:
- def __add__(self, o: 'C') -> 'C': pass
-[out]
-main:7: error: Invalid index type "B" for "A"; expected type "C"
-main:8: error: Invalid index type "C" for "A"; expected type "B"
-main:9: error: Invalid index type "B" for "A"; expected type "C"
-
-
--- Nested generic types
--- --------------------
-
-
-[case testNestedGenericTypes]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-aab = None # type: A[A[B]]
-aac = None # type: A[A[C]]
-ab = None # type: A[B]
-ac = None # type: A[C]
-
-ac = aab.x # Fail
-ac.y = aab # Fail
-
-ab = aab.x
-ac = aac.x
-ab.y = aab
-ac.y = aac
-
-class A(Generic[T]):
- x = None # type: T
- y = None # type: A[A[T]]
-
-class B:
- pass
-class C:
- pass
-[out]
-main:8: error: Incompatible types in assignment (expression has type A[B], variable has type A[C])
-main:9: error: Incompatible types in assignment (expression has type A[A[B]], variable has type A[A[C]])
-
-
--- Generic functions
--- -----------------
-
-
-[case testTypeCheckingGenericFunctionBody]
-from typing import TypeVar, Generic
-S = TypeVar('S')
-T = TypeVar('T')
-class A: pass
-class p(Generic[T, S]):
- def __init__(self, t: T, a: S) -> None: pass
-def f(s: S, t: T) -> p[T, A]:
- a = t # type: S # E: Incompatible types in assignment (expression has type "T", variable has type "S")
- s = t # E: Incompatible types in assignment (expression has type "T", variable has type "S")
- p_s_a = None # type: p[S, A]
- if s:
- return p_s_a # E: Incompatible return value type (got p[S, A], expected p[T, A])
- b = t # type: T
- c = s # type: S
- p_t_a = None # type: p[T, A]
- return p_t_a
-[out]
-
-[case testTypeCheckingGenericMethodBody]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-S = TypeVar('S')
-class p(Generic[T, S]):
- def __init__(self, t: T, a: S) -> None: pass
-class A(Generic[T]):
- def f(self, s: S, t: T) -> p[S, T]:
- s = t # E: Incompatible types in assignment (expression has type "T", variable has type "S")
- p_s_s = None # type: p[S, S]
- if s:
- return p_s_s # E: Incompatible return value type (got p[S, S], expected p[S, T])
- p_t_t = None # type: p[T, T]
- if t:
- return p_t_t # E: Incompatible return value type (got p[T, T], expected p[S, T])
- t = t
- s = s
- p_s_t = None # type: p[S, T]
- return p_s_t
-[out]
-
-[case testProhibitTypeApplicationToGenericFunctions]
-from typing import TypeVar
-T = TypeVar('T')
-def f(x: T) -> T: pass
-
-y = f[int] # E: Type application is only supported for generic classes
-[out]
-
-
--- Generic types in expressions
--- ----------------------------
-
-
-[case testTypeApplicationArgs]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-class Node(Generic[T]):
- def __init__(self, x: T) -> None:
- ...
-Node[int]() # E: Too few arguments for "Node"
-Node[int](1, 1, 1) # E: Too many arguments for "Node"
-[out]
-
-[case testTypeApplicationTvars]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-S = TypeVar('S')
-class A(Generic[T, S]): pass
-A[int]() # E: Type application has too few types (2 expected)
-A[int, str, int]() # E: Type application has too many types (2 expected)
-[out]
-
-[case testInvalidTypeApplicationType]
-a = None # type: A
-class A: pass
-a[A]() # E: Value of type "A" is not indexable
-A[A]() # E: Type application targets a non-generic function or class
-[out]
-
-[case testTypeApplicationArgTypes]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-class Node(Generic[T]):
- def __init__(self, x: T) -> None:
- ...
-
-Node[int](1)
-Node[int]('a') # E: Argument 1 to "Node" has incompatible type "str"; expected "int"
-
-class Dummy(Generic[T]):
- def meth(self, x: T) -> None:
- ...
- def methout(self) -> T:
- ...
-
-Dummy[int]().meth(1)
-Dummy[int]().meth('a') # E: Argument 1 to "meth" of "Dummy" has incompatible type "str"; expected "int"
-reveal_type(Dummy[int]()) # E: Revealed type is '__main__.Dummy[builtins.int*]'
-reveal_type(Dummy[int]().methout()) # E: Revealed type is 'builtins.int*'
-[out]
-
-[case testTypeApplicationArgTypesSubclasses]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-S = TypeVar('S')
-class C(Generic[T, S]):
- def __init__(self, x: T, y: S) -> None:
- ...
-
-class D(C[int, T], Generic[T]): ...
-
-D[str](1, 'a')
-D[str](1, 1) # E: Argument 2 to "D" has incompatible type "int"; expected "str"
-
-class E(D[str]): ...
-E(1, 'a')
-E(1, 1) # E: Argument 2 to "E" has incompatible type "int"; expected "str"
-[out]
-
-[case testTypeApplicationAlias]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-class Node(Generic[T]):
- def __init__(self, x: T) -> None:
- ...
-
-Alias = Node
-Alias[int](1)
-Alias[int]("a") # E: Argument 1 to "Node" has incompatible type "str"; expected "int"
-[out]
-
-[case testTypeApplicationCrash]
-type[int] # this was crashing, see #2302 (comment) # E: Type application targets a non-generic function or class
-[out]
-
-
--- Generic type aliases
--- --------------------
-
-[case testGenericTypeAliasesBasic]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-S = TypeVar('S')
-class Node(Generic[T, S]):
- def __init__(self, x: T, y: S) -> None:
- ...
-
-IntNode = Node[int, S]
-IntIntNode = Node[int, int]
-SameNode = Node[T, T]
-
-n = Node(1, 1) # type: IntIntNode
-n1 = Node(1, 'a') # type: IntIntNode # E: Argument 2 to "Node" has incompatible type "str"; expected "int"
-
-m = Node(1, 1) # type: IntNode
-m1 = Node('x', 1) # type: IntNode # E: Argument 1 to "Node" has incompatible type "str"; expected "int"
-m2 = Node(1, 1) # type: IntNode[str] # E: Argument 2 to "Node" has incompatible type "int"; expected "str"
-
-s = Node(1, 1) # type: SameNode[int]
-reveal_type(s) # E: Revealed type is '__main__.Node[builtins.int, builtins.int]'
-s1 = Node(1, 'x') # type: SameNode[int] # E: Argument 2 to "Node" has incompatible type "str"; expected "int"
-
-[out]
-
-[case testGenericTypeAliasesBasic2]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-S = TypeVar('S')
-class Node(Generic[T, S]):
- def __init__(self, x: T, y: S) -> None:
- ...
-
-IntNode = Node[int, S]
-IntIntNode = Node[int, int]
-SameNode = Node[T, T]
-
-def output_bad() -> IntNode[str]:
- return Node(1, 1) # Eroor - bad return type, see out
-
-def input(x: IntNode[str]) -> None:
- pass
-input(Node(1, 's'))
-input(Node(1, 1)) # E: Argument 2 to "Node" has incompatible type "int"; expected "str"
-
-def output() -> IntNode[str]:
- return Node(1, 'x')
-reveal_type(output()) # E: Revealed type is '__main__.Node[builtins.int, builtins.str]'
-
-def func(x: IntNode[T]) -> IntNode[T]:
- return x
-reveal_type(func) # E: Revealed type is 'def [T] (x: __main__.Node[builtins.int, T`-1]) -> __main__.Node[builtins.int, T`-1]'
-
-func(1) # E: Argument 1 to "func" has incompatible type "int"; expected Node[int, None]
-func(Node('x', 1)) # E: Argument 1 to "Node" has incompatible type "str"; expected "int"
-reveal_type(func(Node(1, 'x'))) # E: Revealed type is '__main__.Node[builtins.int, builtins.str*]'
-
-def func2(x: SameNode[T]) -> SameNode[T]:
- return x
-reveal_type(func2) # E: Revealed type is 'def [T] (x: __main__.Node[T`-1, T`-1]) -> __main__.Node[T`-1, T`-1]'
-
-func2(Node(1, 'x')) # E: Cannot infer type argument 1 of "func2"
-y = func2(Node('x', 'x'))
-reveal_type(y) # E: Revealed type is '__main__.Node[builtins.str*, builtins.str*]'
-
-def wrap(x: T) -> IntNode[T]:
- return Node(1, x)
-
-z = None # type: str
-reveal_type(wrap(z)) # E: Revealed type is '__main__.Node[builtins.int, builtins.str*]'
-
-[out]
-main:13: error: Argument 2 to "Node" has incompatible type "int"; expected "str"
-
-[case testGenericTypeAliasesWrongAliases]
-# flags: --show-column-numbers --fast-parser --python-version 3.6
-from typing import TypeVar, Generic, List, Callable, Tuple, Union
-T = TypeVar('T')
-S = TypeVar('S')
-class Node(Generic[T, S]):
- def __init__(self, x: T, y: S) -> None:
- ...
-
-A = Node[T] # Error
-B = Node[T, T]
-C = Node[T, T, T] # Error
-D = Node[T, S]
-E = Node[Node[T, T], List[T]]
-
-F = Node[List[T, T], S] # Error
-G = Callable[..., List[T, T]] # Error
-H = Union[int, Tuple[T, Node[T]]] # Error
-h: H # Error
-h1: H[int, str] # Error
-
-x = None # type: D[int, str]
-reveal_type(x)
-y = None # type: E[int]
-reveal_type(y)
-
-X = T # Error
-
-[builtins fixtures/list.pyi]
-[out]
-main:9:4: error: "Node" expects 2 type arguments, but 1 given
-main:11:4: error: "Node" expects 2 type arguments, but 3 given
-main:15:9: error: "list" expects 1 type argument, but 2 given
-main:16:18: error: "list" expects 1 type argument, but 2 given
-main:17:24: error: "Node" expects 2 type arguments, but 1 given
-main:18:3: error: "Node" expects 2 type arguments, but 1 given
-main:19:4: error: Bad number of arguments for type alias, expected: 1, given: 2
-main:22:0: error: Revealed type is '__main__.Node[builtins.int, builtins.str]'
-main:24:0: error: Revealed type is '__main__.Node[__main__.Node[builtins.int, builtins.int], builtins.list[builtins.int]]'
-main:26:4: error: Type variable "__main__.T" is invalid as target for type alias
-
-[case testGenericTypeAliasesForAliases]
-from typing import TypeVar, Generic, List, Union
-T = TypeVar('T')
-S = TypeVar('S')
-
-class Node(Generic[T, S]):
- def __init__(self, x: T, y: S) -> None:
- pass
-
-ListedNode = Node[List[T], List[S]]
-Second = ListedNode[int, T]
-Third = Union[int, Second[str]]
-
-def f2(x: T) -> Second[T]:
- return Node([1], [x])
-reveal_type(f2('a')) # E: Revealed type is '__main__.Node[builtins.list[builtins.int], builtins.list[builtins.str*]]'
-
-def f3() -> Third:
- return Node([1], ['x'])
-reveal_type(f3()) # E: Revealed type is 'Union[builtins.int, __main__.Node[builtins.list[builtins.int], builtins.list[builtins.str]]]'
-
-[builtins fixtures/list.pyi]
-
-[case testGenericTypeAliasesAny]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-S = TypeVar('S')
-class Node(Generic[T, S]):
- def __init__(self, x: T, y: S) -> None:
- self.x = x
- self.y = y
-
-IntNode = Node[int, S]
-AnyNode = Node[S, T]
-
-def output() -> IntNode[str]:
- return Node(1, 'x')
-x = output() # type: IntNode # This is OK (implicit Any)
-
-y = None # type: IntNode
-y.x = 1
-y.x = 'x' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-y.y = 1 # Both are OK (implicit Any)
-y.y = 'x'
-
-z = Node(1, 'x') # type: AnyNode
-reveal_type(z) # E: Revealed type is '__main__.Node[Any, Any]'
-
-[out]
-
-[case testGenericTypeAliasesAcessingMethods]
-from typing import TypeVar, Generic, List
-T = TypeVar('T')
-class Node(Generic[T]):
- def __init__(self, x: T) -> None:
- self.x = x
- def meth(self) -> T:
- return self.x
-
-ListedNode = Node[List[T]]
-l = None # type: ListedNode[int]
-l.x.append(1)
-l.meth().append(1)
-reveal_type(l.meth()) # E: Revealed type is 'builtins.list*[builtins.int]'
-l.meth().append('x') # E: Argument 1 to "append" of "list" has incompatible type "str"; expected "int"
-
-ListedNode[str]([]).x = 1 # E: Incompatible types in assignment (expression has type "int", variable has type List[str])
-
-[builtins fixtures/list.pyi]
-
-[case testGenericTypeAliasesSubclassing]
-from typing import TypeVar, Generic, Tuple, List
-T = TypeVar('T')
-class Node(Generic[T]):
- def __init__(self, x: T) -> None:
- ...
-
-TupledNode = Node[Tuple[T, T]]
-
-class D(Generic[T], TupledNode[T]):
- ...
-class L(Generic[T], List[TupledNode[T]]):
- ...
-
-def f_bad(x: T) -> D[T]:
- return D(1) # Error, see out
-
-L[int]().append(Node((1, 1)))
-L[int]().append(5) # E: Argument 1 to "append" of "list" has incompatible type "int"; expected Node[Tuple[int, int]]
-
-x = D((1, 1)) # type: D[int]
-y = D(5) # type: D[int] # E: Argument 1 to "D" has incompatible type "int"; expected "Tuple[int, int]"
-
-def f(x: T) -> D[T]:
- return D((x, x))
-reveal_type(f('a')) # E: Revealed type is '__main__.D[builtins.str*]'
-
-[builtins fixtures/list.pyi]
-[out]
-main:15: error: Argument 1 to "D" has incompatible type "int"; expected "Tuple[T, T]"
-
-[case testGenericTypeAliasesSubclassingBad]
-from typing import TypeVar, Generic, Tuple, Union
-T = TypeVar('T')
-class Node(Generic[T]):
- def __init__(self, x: T) -> None:
- ...
-
-TupledNode = Node[Tuple[T, T]]
-UNode = Union[int, Node[T]]
-
-class C(TupledNode): ... # Same as TupledNode[Any]
-class D(TupledNode[T]): ... # E: Invalid type "__main__.T"
-class E(Generic[T], UNode[T]): ... # E: Invalid base class
-
-[builtins fixtures/list.pyi]
-
-[case testGenericTypeAliasesUnion]
-from typing import TypeVar, Generic, Union, Any
-T = TypeVar('T')
-class Node(Generic[T]):
- def __init__(self, x: T) -> None:
- self.x = x
-
-UNode = Union[int, Node[T]]
-x = 1 # type: UNode[int]
-
-x + 1 # E: Unsupported left operand type for + (some union)
-if not isinstance(x, Node):
- x + 1
-
-if not isinstance(x, int):
- x.x = 1
- x.x = 'a' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-
-def f(x: T) -> UNode[T]:
- if 1:
- return Node(x)
- else:
- return 1
-
-reveal_type(f(1)) # E: Revealed type is 'Union[builtins.int, __main__.Node[builtins.int*]]'
-
-TNode = Union[T, Node[int]]
-s = 1 # type: TNode[str] # E: Incompatible types in assignment (expression has type "int", variable has type "Union[str, Node[int]]")
-
-if not isinstance(s, str):
- s.x = 1
-
-z = None # type: TNode # Same as TNode[Any]
-z.x
-z.foo() # Any simplifies Union to Any now. This test should be updated after #2197
-
-[builtins fixtures/isinstance.pyi]
-
-[case testGenericTypeAliasesTuple]
-from typing import TypeVar, Tuple
-T = TypeVar('T')
-
-SameTP = Tuple[T, T]
-IntTP = Tuple[int, T]
-
-def f1(x: T) -> SameTP[T]:
- return x, x
-
-a, b, c = f1(1) # E: Need more than 2 values to unpack (3 expected)
-x, y = f1(1)
-reveal_type(x) # E: Revealed type is 'builtins.int'
-
-def f2(x: IntTP[T]) -> IntTP[T]:
- return x
-
-f2((1, 2, 3)) # E: Argument 1 to "f2" has incompatible type "Tuple[int, int, int]"; expected "Tuple[int, None]"
-reveal_type(f2((1, 'x'))) # E: Revealed type is 'Tuple[builtins.int, builtins.str*]'
-
-[builtins fixtures/for.pyi]
-
-[case testGenericTypeAliasesCallable]
-from typing import TypeVar, Generic, Callable
-T = TypeVar('T')
-class Node(Generic[T]):
- def __init__(self, x: T) -> None:
- ...
-
-BadC = Callable[T] # E: Invalid function type
-
-C = Callable[..., T]
-C2 = Callable[[T, T], Node[T]]
-
-def make_cb(x: T) -> C[T]:
- return lambda *args: x
-
-reveal_type(make_cb(1)) # E: Revealed type is 'def (*Any, **Any) -> builtins.int*'
-
-def use_cb(arg: T, cb: C2[T]) -> Node[T]:
- return cb(arg, arg)
-
-use_cb(1, 1) # E: Argument 2 to "use_cb" has incompatible type "int"; expected Callable[[int, int], Node[int]]
-my_cb = None # type: C2[int]
-use_cb('x', my_cb) # E: Argument 2 to "use_cb" has incompatible type Callable[[int, int], Node[int]]; expected Callable[[str, str], Node[str]]
-reveal_type(use_cb(1, my_cb)) # E: Revealed type is '__main__.Node[builtins.int]'
-
-[out]
-
-[case testGenericTypeAliasesPEPBasedExample]
-from typing import TypeVar, List, Tuple
-T = TypeVar('T', int, bool)
-
-Vec = List[Tuple[T, T]]
-
-vec = [] # type: Vec[bool]
-vec.append('x') # E: Argument 1 to "append" of "list" has incompatible type "str"; expected "Tuple[bool, bool]"
-reveal_type(vec[0]) # E: Revealed type is 'Tuple[builtins.bool, builtins.bool]'
-
-def fun1(v: Vec[T]) -> T:
- return v[0][0]
-def fun2(v: Vec[T], scale: T) -> Vec[T]:
- return v
-
-reveal_type(fun1([(1, 1)])) # E: Revealed type is 'builtins.int*'
-fun1(1) # E: Argument 1 to "fun1" has incompatible type "int"; expected List[Tuple[int, int]]
-fun1([(1, 'x')]) # E: Cannot infer type argument 1 of "fun1"
-
-reveal_type(fun2([(1, 1)], 1)) # E: Revealed type is 'builtins.list[Tuple[builtins.int*, builtins.int*]]'
-fun2([('x', 'x')], 'x') # E: Type argument 1 of "fun2" has incompatible value "str"
-
-[builtins fixtures/list.pyi]
-
-[case testGenericTypeAliasesImporting]
-from typing import TypeVar
-from a import Node, TupledNode
-T = TypeVar('T')
-
-n = None # type: TupledNode[int]
-n.x = 1
-n.y = (1, 1)
-n.y = 'x' # E: Incompatible types in assignment (expression has type "str", variable has type "Tuple[int, int]")
-
-def f(x: Node[T, T]) -> TupledNode[T]:
- return Node(x.x, (x.x, x.x))
-
-f(1) # E: Argument 1 to "f" has incompatible type "int"; expected Node[None, None]
-f(Node(1, 'x')) # E: Cannot infer type argument 1 of "f"
-reveal_type(Node('x', 'x')) # E: Revealed type is 'a.Node[builtins.str*, builtins.str*]'
-
-[file a.py]
-from typing import TypeVar, Generic, Tuple
-T = TypeVar('T')
-S = TypeVar('S')
-class Node(Generic[T, S]):
- def __init__(self, x: T, y: S) -> None:
- self.x = x
- self.y = y
-
-TupledNode = Node[T, Tuple[T, T]]
-
-[builtins fixtures/list.pyi]
-
-[case testGenericTypeAliasesRuntimeExpressionsInstance]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-S = TypeVar('S')
-class Node(Generic[T, S]):
- def __init__(self, x: T, y: S) -> None:
- ...
-
-IntNode = Node[int, T]
-IntNode[int](1, 1)
-IntNode[int](1, 'a') # E: Argument 2 to "Node" has incompatible type "str"; expected "int"
-
-SameNode = Node[T, T]
-ff = SameNode[T](1, 1) # E: Need type annotation for variable
-a = SameNode(1, 'x')
-reveal_type(a) # E: Revealed type is '__main__.Node[Any, Any]'
-b = SameNode[int](1, 1)
-reveal_type(b) # E: Revealed type is '__main__.Node[builtins.int*, builtins.int*]'
-SameNode[int](1, 'x') # E: Argument 2 to "Node" has incompatible type "str"; expected "int"
-
-[out]
-
-[case testGenericTypeAliasesRuntimeExpressionsOther]
-from typing import TypeVar, Union, Tuple, Callable, Any
-T = TypeVar('T')
-
-CA = Callable[[T], int]
-TA = Tuple[T, int]
-UA = Union[T, int]
-
-cs = CA[str] + 1 # E: Unsupported left operand type for + ("Type alias to Callable")
-reveal_type(cs) # E: Revealed type is 'Any'
-
-ts = TA[str]() # E: "Type alias to Tuple" not callable
-reveal_type(ts) # E: Revealed type is 'Any'
-
-us = UA[str].x # E: "Type alias to Union" has no attribute "x"
-reveal_type(us) # E: Revealed type is 'Any'
-
-[out]
-
-[case testGenericTypeAliasesTypeVarBinding]
-from typing import TypeVar, Generic, List
-T = TypeVar('T')
-S = TypeVar('S')
-
-class A(Generic[T, S]):
- def __init__(self, x: T, y: S) -> None: ...
-
-class B(Generic[T, S]):
- def __init__(self, x: List[T], y: List[S]) -> None: ...
-
-SameA = A[T, T]
-SameB = B[T, T]
-
-class C(Generic[T]):
- a = None # type: SameA[T]
- b = SameB[T]([], [])
-
-reveal_type(C[int]().a) # E: Revealed type is '__main__.A[builtins.int*, builtins.int*]'
-reveal_type(C[str]().b) # E: Revealed type is '__main__.B[builtins.str*, builtins.str*]'
-
-[builtins fixtures/list.pyi]
-
-[case testGenericTypeAliasesTypeVarConstraints]
-# flags: --show-column-numbers
-from typing import TypeVar, Generic
-T = TypeVar('T', int, list)
-S = TypeVar('S', int, list)
-
-class A(Generic[T, S]):
- def __init__(self, x: T, y: S) -> None: ...
-
-BadA = A[str, T] # One error here
-SameA = A[T, T]
-
-x = None # type: SameA[int]
-y = None # type: SameA[str] # Two errors here, for both args of A
-
-[builtins fixtures/list.pyi]
-[out]
-main:9:7: error: Type argument 1 of "A" has incompatible value "str"
-main:13: error: Type argument 1 of "A" has incompatible value "str"
-main:13: error: Type argument 2 of "A" has incompatible value "str"
-
-[case testGenericTypeAliasesIgnoredPotentialAlias]
-class A: ...
-Bad = A[int] # type: ignore
-
-reveal_type(Bad) # E: Revealed type is 'Any'
-[out]
-
-
--- Multiple assignment with lists
--- ------------------------------
-
-
-[case testMultipleAssignmentWithLists]
-from typing import List
-class A: pass
-class B: pass
-class B2(B): pass
-a = None # type: A
-b = None # type: B
-b2 = None # type: B2
-
-list_a = [a]
-list_b = [b]
-list_b2 = [b2]
-
-a, b = list_a # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-b, a = list_a # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-b2, b2 = list_b # E: Incompatible types in assignment (expression has type "B", variable has type "B2")
-
-a, a = list_a
-b, b2, b = list_b2
-[builtins fixtures/for.pyi]
-
-[case testMultipleAssignmentWithListsInInitialization]
-from typing import List
-class A: pass
-list_object = [object()]
-list_a = [A()]
-a, b = list_object # type: (A, object) # E: Incompatible types in assignment (expression has type "object", variable has type "A")
-c, d = list_object # type: (object, A) # E: Incompatible types in assignment (expression has type "object", variable has type "A")
-e, f = list_a # type: (A, object)
-[builtins fixtures/for.pyi]
-
-[case testMultipleAssignmentWithListAndIndexing]
-from typing import List
-a = None # type: List[A]
-b = None # type: List[int]
-
-a[1], b[1] = a # E: Incompatible types in assignment (expression has type "A", target has type "int")
-a[1], a[2] = a
-
-class A: pass
-[file builtins.py]
-from typing import TypeVar, Generic, Iterable
-T = TypeVar('T')
-class object: pass
-class list(Iterable[T], Generic[T]):
- def __setitem__(self, x: int, v: T) -> None: pass
-class int: pass
-class type: pass
-class tuple: pass
-class function: pass
-class str: pass
-
-[case testMultipleAssignmentWithIterable]
-from typing import Iterable, TypeVar
-a = None # type: int
-b = None # type: str
-T = TypeVar('T')
-
-def f(x: T) -> Iterable[T]: pass
-
-a, b = f(a) # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-b, b = f(a) # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-a, a = f(a)
-b, b = f(b)
-[builtins fixtures/for.pyi]
-
-
--- Error messages
--- --------------
-
-
-[case testErrorWithLongGenericTypeName]
-from typing import TypeVar, Generic
-B = TypeVar('B')
-C = TypeVar('C')
-D = TypeVar('D')
-E = TypeVar('E')
-F = TypeVar('F')
-G = TypeVar('G')
-H = TypeVar('H')
-I = TypeVar('I')
-J = TypeVar('J')
-K = TypeVar('K')
-L = TypeVar('L')
-M = TypeVar('M')
-N = TypeVar('N')
-O = TypeVar('O')
-P = TypeVar('P')
-Q = TypeVar('Q')
-R = TypeVar('R')
-S = TypeVar('S')
-T = TypeVar('T')
-U = TypeVar('U')
-V = TypeVar('V')
-W = TypeVar('W')
-X = TypeVar('X')
-Y = TypeVar('Y')
-Z = TypeVar('Z')
-class OO: pass
-a = None # type: A[object, object, object, object, object, object, object, object, object, object, object, object, object, object, object, object, object, object, object, object, object, object, object, object, object]
-
-f(a) # E: Argument 1 to "f" has incompatible type A[...]; expected "OO"
-
-def f(a: OO) -> None:
- pass
-class A(Generic[B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z]): pass
-
-[case testErrorWithShorterGenericTypeName]
-from typing import TypeVar, Generic
-S = TypeVar('S')
-T = TypeVar('T')
-a = None # type: A[object, B]
-f(a) # E: Argument 1 to "f" has incompatible type A[object, B]; expected "B"
-
-def f(a: 'B') -> None: pass
-class A(Generic[S, T]): pass
-class B: pass
-
-[case testErrorWithShorterGenericTypeName2]
-from typing import Callable, TypeVar, Generic
-S = TypeVar('S')
-T = TypeVar('T')
-a = None # type: A[object, Callable[[], None]]
-f(a) # E: Argument 1 to "f" has incompatible type A[object, Callable[[], None]]; expected "B"
-
-def f(a: 'B') -> None: pass
-class A(Generic[S, T]): pass
-class B: pass
-
-
--- Overloads + generics
--- --------------------
-
-
-[case testGenericArgumentInOverload]
-from typing import overload, List
-class A: pass
-class B: pass
-a, b = None, None # type: (A, B)
-
- at overload
-def f(a: List[A]) -> A: pass
- at overload
-def f(a: B) -> B: pass
-
-b = f([a]) # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-a = f([b]) # E: List item 0 has incompatible type "B"
-a = f(b) # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-
-a = f([a])
-b = f(b)
-[builtins fixtures/list.pyi]
-
-[case testGenericFunctionAsOverloadItem]
-from typing import overload, TypeVar, List
-T = TypeVar('T')
-class A: pass
-class B: pass
-
- at overload
-def f(a: B) -> B: pass
- at overload
-def f(a: List[T]) -> T: pass
-
-a, b = None, None # type: (A, B)
-
-b = f([a]) # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-a = f([b]) # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-a = f(b) # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-
-a = f([a])
-b = f([b])
-b = f(b)
-[builtins fixtures/list.pyi]
-
-
--- Type variable scoping
--- ---------------------
-
-
-[case testLocalTypeVariable]
-from typing import TypeVar
-def f() -> None:
- T = TypeVar('T')
- def g(x: T) -> T: pass
- a = g(1)
- a = 1
- a = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-[out]
-
-[case testClassLevelTypeVariable]
-from typing import TypeVar
-class A:
- T = TypeVar('T')
- def g(self, x: T) -> T: pass
-a = A().g(1)
-a = 1
-a = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-
-[case testGenericClassInnerFunctionTypeVariable]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-class A(Generic[T]):
- def __init__(self, a: T) -> None:
- self.a = a
- def f(self, n: int) -> None:
- def g(a: T):
- self.a = a
- g(self.a)
- g(n) # E: Argument 1 to "g" has incompatible type "int"; expected "T"
-[out]
-
-
--- Callable subtyping with generic functions
--- -----------------------------------------
-
-
-[case testSubtypingWithGenericFunctions]
-from typing import TypeVar
-A = TypeVar('A')
-B = TypeVar('B')
-
-def f1(x: A) -> A: ...
-def f2(x: A) -> B: ...
-def f3(x: B) -> B: ...
-def f4(x: int) -> A: ...
-
-y1 = f1
-y1 = f1
-y1 = f2
-y1 = f3
-y1 = f4 # E: Incompatible types in assignment (expression has type Callable[[int], A], variable has type Callable[[A], A])
-
-y2 = f2
-y2 = f2
-y2 = f1 # E: Incompatible types in assignment (expression has type Callable[[A], A], variable has type Callable[[A], B])
-y2 = f3 # E: Incompatible types in assignment (expression has type Callable[[B], B], variable has type Callable[[A], B])
-y2 = f4 # E: Incompatible types in assignment (expression has type Callable[[int], A], variable has type Callable[[A], B])
-
-y3 = f3
-y3 = f3
-y3 = f1
-y3 = f2
-y3 = f4 # E: Incompatible types in assignment (expression has type Callable[[int], A], variable has type Callable[[B], B])
-
-y4 = f4
-y4 = f4
-y4 = f1 # E: Incompatible types in assignment (expression has type Callable[[A], A], variable has type Callable[[int], A])
-y4 = f2
-y4 = f3 # E: Incompatible types in assignment (expression has type Callable[[B], B], variable has type Callable[[int], A])
-
-[case testSubtypingWithGenericInnerFunctions]
-from typing import TypeVar
-A = TypeVar('A')
-B = TypeVar('B')
-T = TypeVar('T')
-def outer(t: T) -> None:
- def f1(x: A) -> A: ...
- def f2(x: A) -> B: ...
- def f3(x: T) -> A: ...
- def f4(x: A) -> T: ...
- def f5(x: T) -> T: ...
-
- y1 = f1
- y1 = f2
- y1 = f3 # E: Incompatible types in assignment (expression has type Callable[[T], A], variable has type Callable[[A], A])
- y1 = f4 # E: Incompatible types in assignment (expression has type Callable[[A], T], variable has type Callable[[A], A])
- y1 = f5 # E: Incompatible types in assignment (expression has type Callable[[T], T], variable has type Callable[[A], A])
-
- y2 = f2
- y2 = f1 # E: Incompatible types in assignment (expression has type Callable[[A], A], variable has type Callable[[A], B])
-
- y3 = f3
- y3 = f1 # E: Incompatible types in assignment (expression has type Callable[[A], A], variable has type Callable[[T], A])
- y3 = f2
- y3 = f4 # E: Incompatible types in assignment (expression has type Callable[[A], T], variable has type Callable[[T], A])
- y3 = f5 # E: Incompatible types in assignment (expression has type Callable[[T], T], variable has type Callable[[T], A])
-
- y4 = f4
- y4 = f1 # E: Incompatible types in assignment (expression has type Callable[[A], A], variable has type Callable[[A], T])
- y4 = f2
- y4 = f3 # E: Incompatible types in assignment (expression has type Callable[[T], A], variable has type Callable[[A], T])
- y4 = f5 # E: Incompatible types in assignment (expression has type Callable[[T], T], variable has type Callable[[A], T])
-
- y5 = f5
- y5 = f1
- y5 = f2
- y5 = f3
- y5 = f4
-[out]
-
-[case testSubtypingWithGenericFunctionUsingTypevarWithValues]
-from typing import TypeVar, Callable
-T = TypeVar('T', int, str)
-def f(x: T) -> T: pass
-def g1(f: Callable[[str], str]) -> None: pass
-g1(f)
-def g2(f: Callable[[int], int]) -> None: pass
-g2(f)
-def g3(f: Callable[[object], object]) -> None: pass
-g3(f) # E: Argument 1 to "g3" has incompatible type Callable[[T], T]; \
- expected Callable[[object], object]
-
-[case testSubtypingWithGenericFunctionUsingTypevarWithValues2-skip]
-from typing import TypeVar, Callable
-T = TypeVar('T', int, str)
-def f(x: T) -> T: pass
-g = f
-g = f
-
-
---Operations on type variable types
--- ---------------------------------
-
-
-[case testTypeVariableTypeEquality]
-from typing import TypeVar
-T = TypeVar('T')
-def f(a: T, b: T) -> T:
- a.__ne__(b)
- if a == b:
- return a
- else:
- return b
-[builtins fixtures/ops.pyi]
-
-[case testTypeVariableTypeIs]
-from typing import TypeVar
-T = TypeVar('T')
-def f(a: T, b: T) -> T:
- if a is b or a is 1:
- return a
- else:
- return b
-[builtins fixtures/ops.pyi]
-
-[case testTypeVariableTypeLessThan]
-from typing import TypeVar
-T = TypeVar('T')
-def f(a: T, b: T) -> T:
- if a < b:
- return a
- else:
- return b
-[builtins fixtures/ops.pyi]
-[out]
-main:4: error: Unsupported left operand type for < ("T")
-
-
--- Subtyping generic callables
--- ---------------------------
-
-[case testSubtypingGenericTypeObject]
-from typing import Callable, Generic, TypeVar
-T = TypeVar('T')
-class C(Generic[T]):
- def __init__(self) -> None: pass
-x = C # type: Callable[[], C[int]]
-y = C # type: Callable[[], int] # E: Incompatible types in assignment (expression has type C[T], variable has type Callable[[], int])
-
-
--- Special cases
--- -------------
-
-
-[case testIdentityHigherOrderFunction]
-from typing import Callable, TypeVar
-A = TypeVar('A')
-B = TypeVar('B')
-def square(n: int) -> int:
- return n
-def id(f: Callable[[A], B]) -> Callable[[A], B]:
- return f
-g = id(square)
-g(1)
-g('x') # E: Argument 1 has incompatible type "str"; expected "int"
-
-
-[case testIdentityHigherOrderFunction2]
-from typing import Callable, TypeVar
-A = TypeVar('A')
-def voidify(n: int) -> None: pass
-def identity(f: Callable[[A], None]) -> Callable[[A], None]:
- return f
-identity(voidify)(3)
-
-[case testIdentityHigherOrderFunction3]
-from typing import Callable, TypeVar
-A = TypeVar('A')
-B = TypeVar('B')
-def fn(n: B) -> None: pass
-def identity(f: A) -> A:
- return f
-identity(fn)
-identity(fn)('x')
-
-[case testTypeVariableUnionAndCallableInTypeInference]
-from typing import Union, Callable, TypeVar
-T = TypeVar('T')
-def f(x: T, y: Union[T, Callable[[T], None]]) -> None: pass
-f('', '')
-
-[case testGenericFunctionsWithUnalignedIds]
-from typing import TypeVar
-A = TypeVar('A')
-B = TypeVar('B')
-def f1(x: int, y: A) -> A: ...
-def f2(x: int, y: A) -> B: ...
-def f3(x: A, y: B) -> B: ...
-g = f1
-g = f2
-g = f3
-
-[case testTypeVariableWithContainerAndTuple]
-from typing import TypeVar, Container
-T = TypeVar('T')
-def f(x: Container[T]) -> T: ...
-reveal_type(f((1, 2))) # E: Revealed type is 'builtins.int*'
-
-[case testClassMethodInGenericClassWithGenericConstructorArg]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-class A(Generic[T]):
- def __init__(self, a: T) -> None: pass
- @classmethod
- def f(cls) -> None: pass
-[builtins fixtures/classmethod.pyi]
-
-[case testClassMethodInClassWithGenericConstructor]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-class A:
- def __init__(self, a: T) -> None: pass
- @classmethod
- def f(cls) -> None: pass
-[builtins fixtures/classmethod.pyi]
diff --git a/test-data/unit/check-ignore.test b/test-data/unit/check-ignore.test
deleted file mode 100644
index b6d127c..0000000
--- a/test-data/unit/check-ignore.test
+++ /dev/null
@@ -1,218 +0,0 @@
-[case testIgnoreTypeError]
-x = 1
-x() # type: ignore
-x() # E: "int" not callable
-
-[case testIgnoreUndefinedName]
-x = 1
-y # type: ignore
-z # E: Name 'z' is not defined
-
-[case testIgnoreImportError]
-import xyz_m # type: ignore
-xyz_m.foo
-1() # E: "int" not callable
-
-[case testIgnoreImportFromError]
-from xyz_m import a, b # type: ignore
-a.foo
-b()
-1() # E: "int" not callable
-
-[case testIgnoreImportFromErrorMultiline]
-from xyz_m import ( # type: ignore
- a, b
-)
-a.foo
-b()
-1() # E: "int" not callable
-
-[case testIgnoreImportAllError]
-from xyz_m import * # type: ignore
-x # E: Name 'x' is not defined
-1() # E: "int" not callable
-
-[case testIgnoreImportBadModule]
-import m # type: ignore
-from m import a # type: ignore
-[file m.py]
-+
-[out]
-tmp/m.py:1: error: invalid syntax
-
-[case testIgnoreAppliesOnlyToMissing]
-import a # type: ignore
-import b # type: ignore
-reveal_type(a.foo) # E: Revealed type is 'Any'
-reveal_type(b.foo) # E: Revealed type is 'builtins.int'
-a.bar()
-b.bar() # E: "module" has no attribute "bar"
-
-[file b.py]
-foo = 3
-
-[builtins fixtures/module_all.pyi]
-[out]
-
-[case testIgnoreImportStarFromBadModule]
-from m import * # type: ignore
-[file m.py]
-+
-[out]
-tmp/m.py:1: error: invalid syntax
-
-[case testIgnoreAssignmentTypeError]
-x = 1
-x = '' # type: ignore
-x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-
-[case testIgnoreInvalidOverride]
-class A:
- def f(self) -> int: pass
-class B(A):
- def f(self) -> str: pass # type: ignore
-
-[case testIgnoreMissingModuleAttribute]
-import m
-m.x = object # type: ignore
-m.f() # type: ignore
-m.y # E: "module" has no attribute "y"
-[file m.py]
-[builtins fixtures/module.pyi]
-
-[case testIgnoreTypeInferenceError]
-x = [] # type: ignore
-y = x
-x.append(1)
-[builtins fixtures/list.pyi]
-
-[case testIgnoreTypeInferenceError2]
-def f() -> None: pass
-x = f() # type: ignore
-y = x
-x = 1
-[builtins fixtures/list.pyi]
-
-[case testIgnoreTypeInferenceErrorAndMultipleAssignment]
-x, y = [], [] # type: ignore
-z = x
-z = y
-[builtins fixtures/list.pyi]
-
-[case testIgnoreSomeStarImportErrors]
-from m1 import *
-from m2 import * # type: ignore
-# We should still import things that don't conflict.
-y() # E: "str" not callable
-z() # E: "int" not callable
-x() # E: "int" not callable
-[file m1.py]
-x = 1
-y = ''
-[file m2.py]
-x = ''
-z = 1
-
-[case testIgnoredModuleDefinesBaseClass1]
-from m import B # type: ignore
-
-class C(B):
- def f(self) -> None:
- self.f(1) # E: Too many arguments for "f" of "C"
- self.g(1)
-[out]
-
-[case testIgnoredModuleDefinesBaseClass2]
-import m # type: ignore
-
-class C(m.B):
- def f(self) -> None: ...
-
-c = C()
-c.f(1) # E: Too many arguments for "f" of "C"
-c.g(1)
-c.x = 1
-[out]
-
-[case testIgnoredModuleDefinesBaseClassAndClassAttribute]
-import m # type: ignore
-
-class C(m.B):
- @staticmethod
- def f() -> None: pass
-
-C.f(1) # E: Too many arguments for "f" of "C"
-C.g(1)
-C.x = 1
-[builtins fixtures/staticmethod.pyi]
-[out]
-
-[case testIgnoredModuleDefinesBaseClassWithInheritance1]
-from m import B # type: ignore
-
-class C: pass
-class D(C, B):
- def f(self) -> None:
- self.f(1) # E: Too many arguments for "f" of "D"
- self.g(1)
-[out]
-
-[case testIgnoredModuleDefinesBaseClassWithInheritance2]
-from m import B # type: ignore
-
-class C(B): pass
-class D(C):
- def f(self) -> None:
- self.f(1) # E: Too many arguments for "f" of "D"
- self.g(1)
-[out]
-
-[case testIgnoreWithFollowingIndentedComment]
-if 1: # type: ignore
- # blah
- pass
-[out]
-
-[case testIgnoreTooManyTypeArguments]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-U = TypeVar('U')
-
-class Base(Generic[T, U]):
- pass
-
-class PartialBase(Base[T, int], Generic[T]):
- pass
-
-class Child(PartialBase[str, int]): # type: ignore
- pass
-
-
-def foo(x: Base[str, int]) -> None: pass
-foo(Child())
-
-def bar(x: Base[str, str]) -> None: pass
-bar(Child())
-[out]
-main:19: error: Argument 1 to "bar" has incompatible type "Child"; expected Base[str, str]
-
-[case testTypeIgnoreLineNumberWithinFile]
-import m
-pass # type: ignore
-m.f(kw=1)
-[file m.py]
-pass
-def f() -> None: pass
-[out]
-main:3: error: Unexpected keyword argument "kw" for "f"
-tmp/m.py:2: note: "f" defined here
-
-[case testIgnoreUnexpectedKeywordArgument]
-import m
-m.f(kw=1) # type: ignore
-[file m.py]
-def f() -> None: pass
-[out]
-
-[case testCannotIgnoreBlockingError]
-yield # type: ignore # E: 'yield' outside function
diff --git a/test-data/unit/check-incremental.test b/test-data/unit/check-incremental.test
deleted file mode 100644
index 439d536..0000000
--- a/test-data/unit/check-incremental.test
+++ /dev/null
@@ -1,1780 +0,0 @@
--- Checks for incremental mode (see testcheck.py).
--- Each test is run twice, once with a cold cache, once with a warm cache.
--- Before the tests are run the second time, any *.py.next files are copied to *.py.
---
--- Errors expected in the first run should be in the `[out1]` section, and
--- errors expected in the second run should be in the `[out2]` section. If a
--- section is omitted, it is expected there are no errors on that run.
---
--- Any files that we expect to be rechecked should be annotated in the [rechecked]
--- annotation, and any files expect to be stale (aka have a modified interface)
--- should be annotated in the [stale] annotation. Note that a file that ends up
--- producing an error does not create a new cache file and so is not considered stale.
---
--- The test suite will automatically assume that __main__ is stale and rechecked in
--- all cases so we can avoid constantly having to annotate it. The list of
--- rechecked/stale files can be in any arbitrary order, or can be left empty
--- if no files should be rechecked/stale.
-
-[case testIncrementalEmpty]
-[rechecked]
-[stale]
-
-[case testIncrementalBasics]
-import m
-[file m.py]
-def foo():
- pass
-[file m.py.next]
-def foo() -> None:
- pass
-[rechecked m]
-[stale m]
-
-[case testIncrementalError]
-import m
-[file m.py]
-def foo() -> None:
- pass
-[file m.py.next]
-def foo() -> None:
- bar()
-[rechecked m]
-[stale]
-[out2]
-tmp/m.py:2: error: Name 'bar' is not defined
-
-[case testIncrementalSimpleImportSequence]
-import mod1
-mod1.func1()
-
-[file mod1.py]
-import mod2
-def func1() -> None: mod2.func2()
-
-[file mod2.py]
-import mod3
-def func2() -> None: mod3.func3()
-
-[file mod3.py]
-def func3() -> None: pass
-
-[rechecked]
-[stale]
-
-
-[case testIncrementalInternalChangeOnly]
-import mod1
-mod1.func1()
-
-[file mod1.py]
-import mod2
-def func1() -> None: mod2.func2()
-
-[file mod2.py]
-import mod3
-def func2() -> None: mod3.func3()
-
-[file mod3.py]
-def func3() -> None: pass
-
-[file mod3.py.next]
-def func3() -> None: 3 + 2
-
-[rechecked mod3]
-[stale]
-
-
-[case testIncrementalImportGone]
-import mod1
-
-[file mod1.py]
-from mod2 import A
-def func1() -> A: pass
-
-[file mod2.py]
-class A: pass
-
-[file mod1.py.next]
-def func1() -> A: pass
-
-[rechecked mod1]
-[stale]
-[out2]
-tmp/mod1.py:1: error: Name 'A' is not defined
-
-[case testIncrementalSameNameChange]
-import mod1
-
-[file mod1.py]
-from mod2 import A
-def func1() -> A: pass
-
-[file mod2.py]
-class A: pass
-
-[file mod2.py.next]
-class Parent: pass
-class A(Parent): pass
-
-[rechecked mod1, mod2]
-[stale mod2]
-
-[case testIncrementalPartialInterfaceChange]
-import mod1
-mod1.func1()
-
-[file mod1.py]
-import mod2
-def func1() -> None: mod2.func2()
-
-[file mod2.py]
-import mod3
-def func2() -> None: mod3.func3()
-
-[file mod3.py]
-def func3() -> None: pass
-
-[file mod3.py.next]
-def func3() -> int: return 2
-
-[rechecked mod2, mod3]
-[stale mod3]
-
-[case testIncrementalInternalFunctionDefinitionChange]
-import mod1
-
-[file mod1.py]
-import mod2
-def accepts_int(a: int) -> int: return a
-accepts_int(mod2.foo())
-
-[file mod2.py]
-def foo() -> int:
- def inner() -> int:
- return 42
- return inner()
-
-[file mod2.py.next]
-def foo() -> int:
- def inner2() -> str:
- return "foo"
- return inner2()
-
-[rechecked mod2]
-[stale]
-[out2]
-tmp/mod2.py:4: error: Incompatible return value type (got "str", expected "int")
-
-[case testIncrementalInternalScramble]
-import mod1
-
-[file mod1.py]
-import mod2
-mod2.foo()
-
-[file mod2.py]
-def baz() -> int:
- return 3
-
-def bar() -> int:
- return baz()
-
-def foo() -> int:
- return bar()
-
-[file mod2.py.next]
-def foo() -> int:
- return baz()
-
-def bar() -> int:
- return bar()
-
-def baz() -> int:
- return 42
-[rechecked mod2]
-[stale]
-
-[case testIncrementalMethodInterfaceChange]
-import mod1
-
-[file mod1.py]
-import mod2
-
-[file mod2.py]
-class Foo:
- def bar(self, a: str) -> str:
- return "a"
-
-[file mod2.py.next]
-class Foo:
- def bar(self, a: float) -> str:
- return "a"
-
-[rechecked mod1, mod2]
-[stale mod2]
-
-[case testIncrementalBaseClassChange]
-import mod1
-
-[file mod1.py]
-from mod2 import Child
-Child().good_method()
-
-[file mod2.py]
-class Good:
- def good_method(self) -> int: return 1
-class Bad: pass
-class Child(Good): pass
-
-[file mod2.py.next]
-class Good:
- def good_method(self) -> int: return 1
-class Bad: pass
-class Child(Bad): pass
-
-[rechecked mod1, mod2]
-[stale mod2]
-[out2]
-tmp/mod1.py:2: error: "Child" has no attribute "good_method"
-
-[case testIncrementalCascadingChange]
-import mod1
-
-[file mod1.py]
-from mod2 import A
-def accepts_int(a: int) -> None: pass
-accepts_int(A)
-
-[file mod2.py]
-from mod3 import B
-A = B
-
-[file mod3.py]
-from mod4 import C
-B = C
-
-[file mod4.py]
-C = 3
-
-[file mod4.py.next]
-C = "A"
-
-[rechecked mod1, mod2, mod3, mod4]
-[stale mod2, mod3, mod4]
-[out2]
-tmp/mod1.py:3: error: Argument 1 to "accepts_int" has incompatible type "str"; expected "int"
-
-[case testIncrementalBrokenCascade]
-import mod1
-
-[file mod1.py]
-import mod2
-def accept_int(a: int) -> int: return a
-accept_int(mod2.mod3.mod4.const)
-
-[file mod2.py]
-import mod3
-
-[file mod3.py]
-import mod4
-
-[file mod4.py]
-const = 3
-
-[file mod3.py.next]
-# Import to mod4 is gone!
-
-[rechecked mod1, mod2, mod3]
-[stale mod3]
-[builtins fixtures/module.pyi]
-[out2]
-tmp/mod1.py:3: error: "module" has no attribute "mod4"
-
-[case testIncrementalLongBrokenCascade]
-import mod1
-
-[file mod1.py]
-import mod2
-def accept_int(a: int) -> int: return a
-accept_int(mod2.mod3.mod4.mod5.mod6.mod7.const)
-
-[file mod2.py]
-import mod3
-
-[file mod3.py]
-import mod4
-
-[file mod4.py]
-import mod5
-
-[file mod5.py]
-import mod6
-
-[file mod6.py]
-import mod7
-
-[file mod7.py]
-const = 3
-
-[file mod6.py.next]
-# Import to mod7 is gone!
-
-[rechecked mod1, mod5, mod6]
-[stale mod6]
-[builtins fixtures/module.pyi]
-[out2]
-tmp/mod1.py:3: error: "module" has no attribute "mod7"
-
-[case testIncrementalNestedBrokenCascade]
-import mod1
-
-[file mod1.py]
-import mod2
-def accept_int(a: int) -> int: return a
-accept_int(mod2.mod3.mod4.const)
-
-[file mod2/__init__.py]
-import mod2.mod3 as mod3
-
-[file mod2/mod3/__init__.py]
-import mod2.mod3.mod4 as mod4
-
-[file mod2/mod3/__init__.py.next]
-# Import is gone!
-
-[file mod2/mod3/mod4.py]
-const = 3
-
-[rechecked mod1, mod2, mod2.mod3]
-[stale mod2.mod3]
-[builtins fixtures/module.pyi]
-[out2]
-tmp/mod1.py:3: error: "module" has no attribute "mod4"
-
-[case testIncrementalNestedBrokenCascadeWithType1]
-import mod1, mod2.mod3.mod5
-
-[file mod1.py]
-import mod2
-def accept_int(x: int) -> None: pass
-def produce() -> mod2.CustomType:
- return mod2.CustomType()
-a = produce()
-accept_int(a.foo())
-
-[file mod2/__init__.py]
-from mod2.mod3 import CustomType
-
-[file mod2/mod3/__init__.py]
-from mod2.mod3.mod4 import CustomType
-
-[file mod2/mod3/__init__.py.next]
-# Import a different class that also happens to be called 'CustomType'
-from mod2.mod3.mod5 import CustomType
-def produce() -> CustomType:
- return CustomType()
-
-[file mod2/mod3/mod4.py]
-class CustomType:
- def foo(self) -> int: return 1
-
-[file mod2/mod3/mod5.py]
-class CustomType:
- def foo(self) -> str: return "a"
-
-[rechecked mod1, mod2, mod2.mod3]
-[stale mod2, mod2.mod3]
-[builtins fixtures/module.pyi]
-[out1]
-[out2]
-tmp/mod1.py:6: error: Argument 1 to "accept_int" has incompatible type "str"; expected "int"
-
-[case testIncrementalNestedBrokenCascadeWithType2]
-import mod1, mod2.mod3.mod5
-
-[file mod1.py]
-from mod2 import produce
-def accept_int(x: int) -> None: pass
-a = produce()
-accept_int(a.foo())
-
-[file mod2/__init__.py]
-from mod2.mod3 import produce
-
-[file mod2/mod3/__init__.py]
-from mod2.mod3.mod4 import CustomType
-def produce() -> CustomType:
- return CustomType()
-
-[file mod2/mod3/__init__.py.next]
-# Import a different class that also happens to be called 'CustomType'
-from mod2.mod3.mod5 import CustomType
-def produce() -> CustomType:
- return CustomType()
-
-[file mod2/mod3/mod4.py]
-class CustomType:
- def foo(self) -> int: return 1
-
-[file mod2/mod3/mod5.py]
-class CustomType:
- def foo(self) -> str: return "a"
-
-[rechecked mod1, mod2, mod2.mod3]
-[stale mod2.mod3]
-[builtins fixtures/module.pyi]
-[out1]
-[out2]
-tmp/mod1.py:4: error: Argument 1 to "accept_int" has incompatible type "str"; expected "int"
-
-[case testIncrementalRemoteChange]
-import mod1
-
-[file mod1.py]
-import mod2
-def accepts_int(a: int) -> None: pass
-accepts_int(mod2.mod3.mod4.const)
-
-[file mod2.py]
-import mod3
-
-[file mod3.py]
-import mod4
-
-[file mod4.py]
-const = 3
-
-[file mod4.py.next]
-const = "foo"
-
-[rechecked mod1, mod3, mod4]
-[stale mod4]
-[out2]
-tmp/mod1.py:3: error: Argument 1 to "accepts_int" has incompatible type "str"; expected "int"
-
-[case testIncrementalBadChange]
-import mod1
-
-[file mod1.py]
-from mod2 import func2
-
-def func1() -> int:
- return func2()
-
-[file mod2.py]
-def func2() -> int:
- return 1
-
-[file mod2.py.next]
-def func2() -> str:
- return "foo"
-
-[rechecked mod1, mod2]
-[stale mod2]
-[out2]
-tmp/mod1.py:4: error: Incompatible return value type (got "str", expected "int")
-
-[case testIncrementalBadChangeWithSave]
-import mod0
-
-[file mod0.py]
-import mod1
-A = mod1.func2()
-
-[file mod1.py]
-from mod2 import func2
-
-def func1() -> int:
- return func2()
-
-[file mod2.py]
-def func2() -> int:
- return 1
-
-[file mod2.py.next]
-def func2() -> str:
- return "foo"
-
-[rechecked mod0, mod1, mod2]
-[stale mod2]
-[out2]
-tmp/mod1.py:4: error: Incompatible return value type (got "str", expected "int")
-
-[case testIncrementalOkChangeWithSave]
-import mod0
-
-[file mod0.py]
-import mod1
-A = mod1.func2()
-
-[file mod1.py]
-from mod2 import func2
-
-def func1() -> int:
- func2()
- return 1
-
-[file mod2.py]
-def func2() -> int:
- return 1
-
-[file mod2.py.next]
-def func2() -> str:
- return "foo"
-
-[rechecked mod0, mod1, mod2]
-[stale mod0, mod2]
-[out2]
-
-[case testIncrementalWithComplexDictExpression]
-import mod1
-
-[file mod1.py]
-import mod1_private
-
-[file mod1_private.py]
-my_dict = {
- 'a': [1, 2, 3],
- 'b': [4, 5, 6]
-}
-
-[file mod1_private.py.next]
-my_dict = {
- 'a': [1, 2, 3],
- 'b': [4, 5, 'a']
-}
-
-[rechecked mod1, mod1_private]
-[stale mod1_private]
-[builtins fixtures/dict.pyi]
-
-[case testIncrementalWithComplexConstantExpressionNoAnnotation]
-import mod1
-
-[file mod1.py]
-import mod1_private
-
-[file mod1_private.py]
-def foobar() -> int: return 1
-def baz() -> int: return 2
-const = 1 + foobar()
-
-[file mod1_private.py.next]
-def foobar() -> int: return 1
-def baz() -> int: return 2
-const = 1 + baz()
-
-[rechecked mod1_private]
-[stale]
-
-[case testIncrementalWithComplexConstantExpressionWithAnnotation]
-import mod1
-
-[file mod1.py]
-import mod1_private
-
-[file mod1_private.py]
-def foobar() -> int: return 1
-def baz() -> int: return 2
-const = 1 + foobar() # type: int
-
-[file mod1_private.py.next]
-def foobar() -> int: return 1
-def baz() -> int: return 2
-const = 1 + baz() # type: int
-
-[rechecked mod1_private]
-[stale]
-
-[case testIncrementalSmall]
-import mod1
-
-[file mod1.py]
-import mod1_private
-def accepts_int(a: int) -> None: pass
-accepts_int(mod1_private.some_func(12))
-
-[file mod1_private.py]
-def some_func(a: int) -> int:
- return 1
-
-[file mod1_private.py.next]
-def some_func(a: int) -> str:
- return "a"
-
-[rechecked mod1, mod1_private]
-[stale mod1_private]
-[builtins fixtures/ops.pyi]
-[out2]
-tmp/mod1.py:3: error: Argument 1 to "accepts_int" has incompatible type "str"; expected "int"
-
-[case testIncrementalWithDecorators]
-import mod1
-
-[file mod1.py]
-import mod1_private
-def accepts_int(a: int) -> None: pass
-accepts_int(mod1_private.some_func(12))
-
-[file mod1_private.py]
-from typing import Callable
-def multiply(f: Callable[[int], int]) -> Callable[[int], int]:
- return lambda a: f(a) * 10
-
-def stringify(f: Callable[[int], int]) -> Callable[[int], str]:
- return lambda a: str(f(a))
-
- at multiply
-def some_func(a: int) -> int:
- return a + 2
-
-[file mod1_private.py.next]
-from typing import Callable
-def multiply(f: Callable[[int], int]) -> Callable[[int], int]:
- return lambda a: f(a) * 10
-
-def stringify(f: Callable[[int], int]) -> Callable[[int], str]:
- return lambda a: str(f(a))
-
- at stringify
-def some_func(a: int) -> int:
- return a + 2
-[rechecked mod1, mod1_private]
-[stale mod1_private]
-[builtins fixtures/ops.pyi]
-[out2]
-tmp/mod1.py:3: error: Argument 1 to "accepts_int" has incompatible type "str"; expected "int"
-
-[case testIncrementalChangingClassAttributes]
-import mod1
-
-[file mod1.py]
-import mod2
-mod2.Foo.A
-
-[file mod2.py]
-class Foo:
- A = 3
-
-[file mod2.py.next]
-class Foo:
- A = "hello"
-
-[rechecked mod1, mod2]
-[stale mod2]
-
-[case testIncrementalChangingFields]
-import mod1
-
-[file mod1.py]
-import mod2
-f = mod2.Foo()
-f.A
-
-[file mod2.py]
-class Foo:
- def __init__(self) -> None:
- self.A = 3
-
-[file mod2.py.next]
-class Foo:
- def __init__(self) -> None:
- self.A = "hello"
-
-[rechecked mod1, mod2]
-[stale mod2]
-[out2]
-
-[case testIncrementalChangingFieldsWithAssignment]
-import mod1
-
-[file mod1.py]
-import mod2
-f = mod2.Foo()
-B = f.A
-
-[file mod2.py]
-class Foo:
- def __init__(self) -> None:
- self.A = 3
-
-[file mod2.py.next]
-class Foo:
- def __init__(self) -> None:
- self.A = "hello"
-
-[rechecked mod1, mod2]
-[stale mod1, mod2]
-
-[case testIncrementalCheckingChangingFields]
-import mod1
-
-[file mod1.py]
-import mod2
-def accept_int(a: int) -> int: return a
-f = mod2.Foo()
-accept_int(f.A)
-
-[file mod2.py]
-class Foo:
- def __init__(self) -> None:
- self.A = 3
-
-[file mod2.py.next]
-class Foo:
- def __init__(self) -> None:
- self.A = "hello"
-
-[rechecked mod1, mod2]
-[stale mod2]
-[out2]
-tmp/mod1.py:4: error: Argument 1 to "accept_int" has incompatible type "str"; expected "int"
-
-[case testIncrementalNestedClassDefinition]
-import mod1
-
-[file mod1.py]
-import mod2
-b = mod2.Foo.Bar()
-b.attr
-
-[file mod2.py]
-class Foo:
- class Bar:
- attr = 3
-
-[file mod2.py.next]
-class Foo:
- class Bar:
- attr = "foo"
-
-[rechecked mod1, mod2]
-[stale mod2]
-
-[case testIncrementalSimpleBranchingModules]
-import mod1
-import mod2
-
-[file mod1.py]
-def func() -> None: pass
-
-[file mod2.py]
-def func() -> None: pass
-
-[file mod1.py.next]
-def func() -> int: return 1
-
-[rechecked mod1]
-[stale mod1]
-
-[case testIncrementalSubmoduleImport]
-from parent.childA import Foo
-
-def func1() -> Foo:
- return Foo()
-
-[file parent/__init__.py]
-from parent.childA import Foo
-from parent.childB import Bar
-
-__all__ = ['Foo', 'Bar']
-
-[file parent/childA.py]
-import parent
-
-class Foo:
- def test(self) -> int:
- return parent.Bar().test()
-
-[file parent/childB.py]
-class Bar:
- def test(self) -> int: return 3
-
-[builtins fixtures/module_all.pyi]
-[rechecked]
-[stale]
-
-[case testIncrementalSubmoduleWithAttr]
-import mod.child
-x = mod.child.Foo()
-x.bar()
-
-[file mod/__init__.py]
-
-[file mod/child.py]
-class Foo:
- def bar(self) -> None: pass
-[builtins fixtures/module.pyi]
-[rechecked]
-[stale]
-
-[case testIncrementalNestedSubmoduleImportFromWithAttr]
-from mod1.mod2 import mod3
-def accept_int(a: int) -> None: pass
-
-accept_int(mod3.val3)
-
-[file mod1/__init__.py]
-val1 = 1
-
-[file mod1/mod2/__init__.py]
-val2 = 1
-
-[file mod1/mod2/mod3.py]
-val3 = 1
-
-[builtins fixtures/module.pyi]
-[rechecked]
-[stale]
-
-[case testIncrementalNestedSubmoduleWithAttr]
-import mod1.mod2.mod3
-def accept_int(a: int) -> None: pass
-
-accept_int(mod1.mod2.mod3.val3)
-accept_int(mod1.mod2.val2)
-accept_int(mod1.val1)
-
-[file mod1/__init__.py]
-val1 = 1
-
-[file mod1/mod2/__init__.py]
-val2 = 1
-
-[file mod1/mod2/mod3.py]
-val3 = 1
-
-[builtins fixtures/module.pyi]
-[rechecked]
-[stale]
-
-[case testIncrementalSubmoduleParentWithImportFrom]
-import parent
-
-[file parent/__init__.py]
-from parent import a
-
-[file parent/a.py]
-val = 3
-
-[builtins fixtures/args.pyi]
-[stale]
-
-[case testIncrementalSubmoduleParentBackreference]
-import parent
-
-[file parent/__init__.py]
-from parent import a
-
-[file parent/a.py]
-import parent.b
-
-[file parent/b.py]
-
-[builtins fixtures/args.pyi]
-[stale]
-
-[case testIncrementalSubmoduleParentBackreferenceComplex]
-import parent
-
-[file parent/__init__.py]
-import parent.a
-
-[file parent/a.py]
-import parent.b
-import parent.c
-
-[file parent/b.py]
-import parent.a
-
-[file parent/c.py]
-import parent.a
-
-[builtins fixtures/args.pyi]
-[stale]
-
-[case testIncrementalReferenceNewFileWithImportFrom]
-from parent import a
-
-[file parent/__init__.py]
-
-[file parent/a.py]
-
-[file parent/a.py.next]
-from parent import b
-
-[file parent/b.py.next]
-
-[stale parent, parent.a, parent.b]
-
-[case testIncrementalReferenceExistingFileWithImportFrom]
-from parent import a, b
-
-[file parent/__init__.py]
-
-[file parent/a.py]
-
-[file parent/b.py]
-
-[file parent/a.py.next]
-from parent import b
-
-[stale parent.a]
-
-[case testIncrementalWithTypeIgnoreOnDirectImport]
-import a, b
-
-[file a.py]
-import b # type: ignore
-
-[file b.py]
-import c
-
-[file c.py]
-
-[stale]
-
-[case testIncrementalWithTypeIgnoreOnImportFrom]
-import a, b
-
-[file a.py]
-from b import something # type: ignore
-
-[file b.py]
-import c
-something = 3
-
-[file c.py]
-
-[stale]
-
-[case testIncrementalWithPartialTypeIgnore]
-import a # type: ignore
-import a.b
-
-[file a/__init__.py]
-
-[file a/b.py]
-
-[stale]
-
-[case testIncrementalAnyIsDifferentFromIgnore]
-import b
-
-[file b.py]
-from typing import Any
-import a.b
-
-[file b.py.next]
-from typing import Any
-
-a = 3 # type: Any
-import a.b
-
-[file a/__init__.py]
-
-[file a/b.py]
-
-[rechecked b]
-[stale]
-[out2]
-tmp/b.py:4: error: Name 'a' already defined
-
-[case testIncrementalSilentImportsAndImportsInClass]
-# flags: --ignore-missing-imports
-class MyObject(object):
- from bar import FooBar
-[stale]
-
-[case testIncrementalSameFileSize]
-import m
-
-[file m.py]
-def foo(a: int) -> None: pass
-def bar(a: str) -> None: pass
-
-foo(3)
-
-[file m.py.next]
-def foo(a: int) -> None: pass
-def bar(a: str) -> None: pass
-
-bar(3)
-
-[rechecked m]
-[stale]
-[out2]
-tmp/m.py:4: error: Argument 1 to "bar" has incompatible type "int"; expected "str"
-
-[case testIncrementalUnsilencingModule]
-# cmd: mypy -m main package.subpackage.mod2
-# cmd2: mypy -m main package.subpackage.mod1
-# flags: --follow-imports=skip
-
-[file main.py]
-from package.subpackage.mod1 import Class
-
-def handle(c: Class) -> None:
- c.some_attribute
-
-[file package/__init__.py]
-# empty
-
-[file package/subpackage/__init__.py]
-# empty
-
-[file package/subpackage/mod1.py]
-import collections # Any previously unloaded package works here
-
-class Class: pass
-
-[file package/subpackage/mod2.py]
-# empty
-
-[builtins fixtures/args.pyi]
-[rechecked collections, main, package.subpackage.mod1]
-[stale collections, package.subpackage.mod1]
-[out2]
-tmp/main.py:4: error: "Class" has no attribute "some_attribute"
-
-[case testIncrementalWithIgnores]
-import foo # type: ignore
-
-[builtins fixtures/module.pyi]
-[stale]
-
-[case testIncrementalWithSilentImportsAndIgnore]
-# cmd: mypy -m main b
-# cmd2: mypy -m main c c.submodule
-# flags: --follow-imports=skip
-
-[file main.py]
-import a # type: ignore
-import b
-import c
-
-a.A().foo()
-b.B().foo()
-c.C().foo()
-
-[file b.py]
-class B:
- def foo(self) -> None: pass
-
-[file b.py.next]
-
-[file c/__init__.py]
-class C: pass
-
-[file c/submodule.py]
-val = 3 # type: int
-val = "foo"
-
-[builtins fixtures/module_all.pyi]
-[rechecked main, c, c.submodule]
-[stale]
-[out2]
-tmp/c/submodule.py:2: error: Incompatible types in assignment (expression has type "str", variable has type "int")
-tmp/main.py:7: error: "C" has no attribute "foo"
-
-[case testIncrementalRemoteError]
-import m
-m.C().foo().bar()
-[file m.py]
-import n
-class C:
- def foo(self) -> n.A: pass
-[file n.py]
-class A:
- def bar(self): pass
-[file n.py.next]
-class A:
- pass
-[rechecked m, n]
-[stale n]
-[out2]
-main:2: error: "A" has no attribute "bar"
-
-[case testIncrementalRemoteErrorFixed]
-import m
-m.C().foo().bar()
-[file m.py]
-import n
-class C:
- def foo(self) -> n.A: pass
-[file n.py]
-class A:
- pass
-[file n.py.next]
-class A:
- def bar(self): pass
-[rechecked m, n]
-[stale n]
-[out1]
-main:2: error: "A" has no attribute "bar"
-
-[case testIncrementalChangedError]
-import m
-[file m.py]
-import n
-def accept_int(x: int) -> None: pass
-accept_int(n.foo)
-[file n.py]
-foo = "hello"
-reveal_type(foo)
-[file n.py.next]
-foo = 3.14
-reveal_type(foo)
-[rechecked m, n]
-[stale]
-[out1]
-tmp/n.py:2: error: Revealed type is 'builtins.str'
-tmp/m.py:3: error: Argument 1 to "accept_int" has incompatible type "str"; expected "int"
-[out2]
-tmp/n.py:2: error: Revealed type is 'builtins.float'
-tmp/m.py:3: error: Argument 1 to "accept_int" has incompatible type "float"; expected "int"
-
-[case testIncrementalReplacingImports]
-import good, bad, client
-
-[file good.py]
-def foo(a: int) -> None: pass
-
-[file bad.py]
-def foo(a: str) -> None: pass
-
-[file client.py]
-import good
-import bad
-from good import foo
-foo(3)
-
-[file client.py.next]
-import good
-import bad
-from bad import foo
-foo(3)
-
-[rechecked client]
-[stale]
-[out2]
-tmp/client.py:4: error: Argument 1 to "foo" has incompatible type "int"; expected "str"
-
-[case testIncrementalChangingAlias]
-import m1, m2, m3, m4, m5
-
-[file m1.py]
-from m2 import A
-def accepts_int(x: int) -> None: pass
-accepts_int(A())
-
-[file m2.py]
-from m3 import A
-
-[file m3.py]
-from m4 import B
-A = B
-
-[file m3.py.next]
-from m5 import C
-A = C
-
-[file m4.py]
-def B() -> int:
- return 42
-
-[file m5.py]
-def C() -> str:
- return "hello"
-
-[rechecked m1, m2, m3]
-[stale m3]
-[out2]
-tmp/m1.py:3: error: Argument 1 to "accepts_int" has incompatible type "str"; expected "int"
-
-[case testIncrementalSilentImportsWithBlatantError]
-# cmd: mypy -m main
-# flags: --follow-imports=skip
-
-[file main.py]
-from evil import Hello
-
-[file main.py.next]
-from evil import Hello
-reveal_type(Hello())
-
-[file evil.py]
-def accept_int(x: int) -> None: pass
-accept_int("not an int")
-
-[rechecked main]
-[stale]
-[out2]
-tmp/main.py:2: error: Revealed type is 'Any'
-
-[case testIncrementalImportIsNewlySilenced]
-# cmd: mypy -m main foo
-# cmd2: mypy -m main
-# flags: --follow-imports=skip
-
-[file main.py]
-from foo import bar
-def accept_int(x: int) -> None: pass
-accept_int(bar)
-
-[file foo.py]
-bar = 3
-
-[file foo.py.next]
-# Empty!
-
-[rechecked main]
-[stale main]
-
-[case testIncrementalSilencedModuleNoLongerCausesError]
-# cmd: mypy -m main evil
-# cmd2: mypy -m main
-# flags: --follow-imports=skip
-
-[file main.py]
-from evil import bar
-def accept_int(x: int) -> None: pass
-accept_int(bar)
-reveal_type(bar)
-
-[file evil.py]
-bar = "str"
-
-[rechecked main]
-[stale]
-[out1]
-tmp/main.py:3: error: Argument 1 to "accept_int" has incompatible type "str"; expected "int"
-tmp/main.py:4: error: Revealed type is 'builtins.str'
-[out2]
-tmp/main.py:4: error: Revealed type is 'Any'
-
-[case testIncrementalFixedBugCausesPropagation]
-import mod1
-
-[file mod1.py]
-from mod2 import A
-val = A().makeB().makeC().foo()
-reveal_type(val)
-
-[file mod2.py]
-from mod3 import B
-class A:
- def makeB(self) -> B: return B()
-
-[file mod3.py]
-from mod4 import C
-class B:
- def makeC(self) -> C:
- val = 3 # type: int
- val = "str" # deliberately triggering error
- return C()
-
-[file mod3.py.next]
-from mod4 import C
-class B:
- def makeC(self) -> C: return C()
-
-[file mod4.py]
-class C:
- def foo(self) -> int: return 1
-
-[rechecked mod3, mod2, mod1]
-[stale mod3, mod2]
-[out1]
-tmp/mod3.py:5: error: Incompatible types in assignment (expression has type "str", variable has type "int")
-tmp/mod1.py:3: error: Revealed type is 'builtins.int'
-
-[out2]
-tmp/mod1.py:3: error: Revealed type is 'builtins.int'
-
-[case testIncrementalIncidentalChangeWithBugCausesPropagation]
-import mod1
-
-[file mod1.py]
-from mod2 import A
-val = A().makeB().makeC().foo()
-reveal_type(val)
-
-[file mod2.py]
-from mod3 import B
-class A:
- def makeB(self) -> B: return B()
-
-[file mod3.py]
-from mod4 import C
-class B:
- def makeC(self) -> C:
- val = 3 # type: int
- val = "str" # deliberately triggering error
- return C()
-
-[file mod4.py]
-class C:
- def foo(self) -> int: return 1
-
-[file mod4.py.next]
-class C:
- def foo(self) -> str: return 'a'
-
-[rechecked mod4, mod3, mod2, mod1]
-[stale mod4]
-[out1]
-tmp/mod3.py:5: error: Incompatible types in assignment (expression has type "str", variable has type "int")
-tmp/mod1.py:3: error: Revealed type is 'builtins.int'
-
-[out2]
-tmp/mod3.py:5: error: Incompatible types in assignment (expression has type "str", variable has type "int")
-tmp/mod1.py:3: error: Revealed type is 'builtins.str'
-
-[case testIncrementalIncidentalChangeWithBugFixCausesPropagation]
-import mod1
-
-[file mod1.py]
-from mod2 import A
-val = A().makeB().makeC().foo()
-reveal_type(val)
-
-[file mod2.py]
-from mod3 import B
-class A:
- def makeB(self) -> B: return B()
-
-[file mod3.py]
-from mod4 import C
-class B:
- def makeC(self) -> C:
- val = 3 # type: int
- val = "str" # deliberately triggering error
- return C()
-
-[file mod3.py.next]
-from mod4 import C
-class B:
- def makeC(self) -> C: return C()
-
-[file mod4.py]
-class C:
- def foo(self) -> int: return 1
-
-[file mod4.py.next]
-class C:
- def foo(self) -> str: return 'a'
-
-[rechecked mod4, mod3, mod2, mod1]
-[stale mod4, mod3, mod2]
-[out1]
-tmp/mod3.py:5: error: Incompatible types in assignment (expression has type "str", variable has type "int")
-tmp/mod1.py:3: error: Revealed type is 'builtins.int'
-
-[out2]
-tmp/mod1.py:3: error: Revealed type is 'builtins.str'
-
-[case testIncrementalSilentImportsWithInnerImports]
-# cmd: mypy -m main foo
-# flags: --ignore-missing-imports
-
-[file main.py]
-from foo import MyClass
-m = MyClass()
-
-[file main.py.next]
-from foo import MyClass
-m = MyClass()
-reveal_type(m.val)
-
-[file foo.py]
-class MyClass:
- def __init__(self) -> None:
- import unrelated
- self.val = unrelated.test()
-
-[rechecked main]
-[stale]
-[out2]
-tmp/main.py:3: error: Revealed type is 'Any'
-
-[case testIncrementalSilentImportsWithInnerImportsAndNewFile]
-# cmd: mypy -m main foo
-# cmd2: mypy -m main foo unrelated
-# flags: --follow-imports=skip
-
-[file main.py]
-from foo import MyClass
-m = MyClass()
-
-[file main.py.next]
-from foo import MyClass
-m = MyClass()
-reveal_type(m.val)
-
-[file foo.py]
-class MyClass:
- def __init__(self) -> None:
- import unrelated
- self.val = unrelated.test()
-
-[file unrelated.py]
-def test() -> str: return "foo"
-
-[rechecked main, foo, unrelated]
-[stale foo, unrelated]
-[out2]
-tmp/main.py:3: error: Revealed type is 'builtins.str'
-
-[case testIncrementalWorksWithNestedClasses]
-import foo
-
-[file foo.py]
-class MyClass:
- class NestedClass:
- pass
-
- class_attr = NestedClass()
-
-[rechecked]
-[stale]
-
-[case testIncrementalWorksWithNamedTuple]
-import foo
-
-[file foo.py]
-from mid import MyTuple
-def accept_int(x: int) -> None: pass
-accept_int(MyTuple(1, "b", "c").a)
-
-[file mid.py]
-from bar import MyTuple
-
-[file bar.py]
-from typing import NamedTuple
-MyTuple = NamedTuple('MyTuple', [
- ('a', int),
- ('b', str),
- ('c', str)
-])
-
-[file bar.py.next]
-from typing import NamedTuple
-MyTuple = NamedTuple('MyTuple', [
- ('b', int), # a and b are swapped
- ('a', str),
- ('c', str)
-])
-
-[rechecked bar, mid, foo]
-[stale bar]
-[out2]
-tmp/foo.py:3: error: Argument 1 to "accept_int" has incompatible type "str"; expected "int"
-
-[case testIncrementalWorksWithNestedNamedTuple]
-import foo
-
-[file foo.py]
-from mid import Outer
-def accept_int(x: int) -> None: pass
-accept_int(Outer.MyTuple(1, "b", "c").a)
-
-[file mid.py]
-from bar import Outer
-
-[file bar.py]
-from typing import NamedTuple
-class Outer:
- MyTuple = NamedTuple('MyTuple', [
- ('a', int),
- ('b', str),
- ('c', str)
- ])
-
-[file bar.py.next]
-from typing import NamedTuple
-class Outer:
- MyTuple = NamedTuple('MyTuple', [
- ('b', int), # a and b are swapped
- ('a', str),
- ('c', str)
- ])
-
-[rechecked bar, mid, foo]
-[stale bar]
-[out2]
-tmp/foo.py:3: error: Argument 1 to "accept_int" has incompatible type "str"; expected "int"
-
-[case testIncrementalPartialSubmoduleUpdate]
-# cmd: mypy -m a
-# cmd2: mypy -m a a.c
-# flags: --follow-imports=skip
-
-[file a/__init__.py]
-from .b import B
-from .c import C
-
-[file a/b.py]
-class B: pass
-
-[file a/c.py]
-class C: pass
-
-[file a/c.py.next]
-class C: pass
-pass
-
-[rechecked a, a.c]
-[stale a, a.c]
-[out]
-
-[case testIncrementalNestedClassRef]
-import top
-
-[file top.py]
-from funcs import callee
-from classes import Outer
-def caller(a: Outer.Inner) -> None:
- callee(a)
-
-[file funcs.py]
-from classes import Outer
-def callee(a: Outer.Inner) -> None:
- pass
-
-[file classes.py]
-class Outer:
- class Inner:
- pass
-
-[file top.py.next]
-from funcs import callee
-from classes import Outer
-def caller(a: Outer.Inner) -> int:
- callee(a)
-
-[case testIncrementalLoadsParentAfterChild]
-# cmd: mypy -m r.s
-
-[file r/__init__.py]
-from . import s
-
-[file r/m.py]
-class R: pass
-
-[file r/s.py]
-from . import m
-R = m.R
-a = None # type: R
-
-[file r/s.py.next]
-from . import m
-R = m.R
-a = None # type: R
-
-[case testIncrementalBaseClassAttributeConflict]
-class A: pass
-class B: pass
-
-class X:
- attr = None # type: A
-class Y:
- attr = None # type: B
-class Z(X, Y): pass
-[stale]
-[out]
-main:8: error: Definition of "attr" in base class "X" is incompatible with definition in base class "Y"
-[out2]
-main:8: error: Definition of "attr" in base class "X" is incompatible with definition in base class "Y"
-
-[case testIncrementalFollowImportsSilent]
-# flags: --follow-imports=silent
-import a
-[file a.py]
-x = 0
-[file a.py.next]
-x = 0
-x + ''
-
-[case testIncrementalFollowImportsSkip]
-# flags: --follow-imports=skip
-import a
-reveal_type(a.x)
-[file a.py]
-/
-[file a.py.next]
-//
-[out]
-main:3: error: Revealed type is 'Any'
-[out2]
-main:3: error: Revealed type is 'Any'
-
-[case testIncrementalFollowImportsError]
-# flags: --follow-imports=error
-import a
-[file a.py]
-/
-[file a.py.next]
-//
-[out1]
-main:2: note: Import of 'a' ignored
-main:2: note: (Using --follow-imports=error, module not passed on command line)
-[out2]
-main:2: note: Import of 'a' ignored
-main:2: note: (Using --follow-imports=error, module not passed on command line)
-
-[case testIncrementalFollowImportsVariable]
-# flags: --config-file tmp/mypy.ini
-import a
-reveal_type(a.x)
-[file a.py]
-x = 0
-[file mypy.ini]
-[[mypy]
-follow_imports = normal
-[file mypy.ini.next]
-[[mypy]
-follow_imports = skip
-[out1]
-main:3: error: Revealed type is 'builtins.int'
-[out2]
-main:3: error: Revealed type is 'Any'
-
-[case testIncrementalNamedTupleInMethod]
-from ntcrash import nope
-[file ntcrash.py]
-from typing import NamedTuple
-class C:
- def f(self) -> None:
- A = NamedTuple('A', [('x', int), ('y', int)])
-[out1]
-main:1: error: Module 'ntcrash' has no attribute 'nope'
-[out2]
-main:1: error: Module 'ntcrash' has no attribute 'nope'
-
-[case testIncrementalNamedTupleInMethod2]
-from ntcrash import nope
-[file ntcrash.py]
-from typing import NamedTuple
-class C:
- class D:
- def f(self) -> None:
- A = NamedTuple('A', [('x', int), ('y', int)])
-[out1]
-main:1: error: Module 'ntcrash' has no attribute 'nope'
-[out2]
-main:1: error: Module 'ntcrash' has no attribute 'nope'
-
-[case testIncrementalNamedTupleInMethod3]
-from ntcrash import nope
-[file ntcrash.py]
-from typing import NamedTuple
-class C:
- def a(self):
- class D:
- def f(self) -> None:
- A = NamedTuple('A', [('x', int), ('y', int)])
-[out1]
-main:1: error: Module 'ntcrash' has no attribute 'nope'
-[out2]
-main:1: error: Module 'ntcrash' has no attribute 'nope'
-
-[case testIncrementalNamedTupleInMethod4]
-from ntcrash import C
-reveal_type(C().a)
-reveal_type(C().b)
-reveal_type(C().c)
-[file ntcrash.py]
-from typing import NamedTuple
-class C:
- def __init__(self) -> None:
- A = NamedTuple('A', [('x', int)])
- self.a = A(0)
- self.b = A(0) # type: A
- self.c = A
-[out1]
-main:2: error: Revealed type is 'Tuple[builtins.int, fallback=ntcrash.C.A at 4]'
-main:3: error: Revealed type is 'Tuple[builtins.int, fallback=ntcrash.C.A at 4]'
-main:4: error: Revealed type is 'def (x: builtins.int) -> Tuple[builtins.int, fallback=ntcrash.C.A at 4]'
-[out2]
-main:2: error: Revealed type is 'Tuple[builtins.int, fallback=ntcrash.C.A at 4]'
-main:3: error: Revealed type is 'Tuple[builtins.int, fallback=ntcrash.C.A at 4]'
-main:4: error: Revealed type is 'def (x: builtins.int) -> Tuple[builtins.int, fallback=ntcrash.C.A at 4]'
-
-[case testIncrementalTypedDictInMethod]
-from tdcrash import nope
-[file tdcrash.py]
-from mypy_extensions import TypedDict
-class C:
- def f(self) -> None:
- A = TypedDict('A', {'x': int, 'y': int})
-[builtins fixtures/dict.pyi]
-[out1]
-main:1: error: Module 'tdcrash' has no attribute 'nope'
-[out2]
-main:1: error: Module 'tdcrash' has no attribute 'nope'
-
-[case testIncrementalTypedDictInMethod2]
-from tdcrash import nope
-[file tdcrash.py]
-from mypy_extensions import TypedDict
-class C:
- class D:
- def f(self) -> None:
- A = TypedDict('A', {'x': int, 'y': int})
-[builtins fixtures/dict.pyi]
-[out1]
-main:1: error: Module 'tdcrash' has no attribute 'nope'
-[out2]
-main:1: error: Module 'tdcrash' has no attribute 'nope'
-
-[case testIncrementalTypedDictInMethod3]
-from tdcrash import nope
-[file tdcrash.py]
-from mypy_extensions import TypedDict
-class C:
- def a(self):
- class D:
- def f(self) -> None:
- A = TypedDict('A', {'x': int, 'y': int})
-[builtins fixtures/dict.pyi]
-[out1]
-main:1: error: Module 'tdcrash' has no attribute 'nope'
-[out2]
-main:1: error: Module 'tdcrash' has no attribute 'nope'
-
-[case testIncrementalTypedDictInMethod4]
-from ntcrash import C
-reveal_type(C().a)
-reveal_type(C().b)
-reveal_type(C().c)
-[file ntcrash.py]
-from mypy_extensions import TypedDict
-class C:
- def __init__(self) -> None:
- A = TypedDict('A', {'x': int})
- self.a = A(x=0)
- self.b = A(x=0) # type: A
- self.c = A
-[builtins fixtures/dict.pyi]
-[out1]
-main:2: error: Revealed type is 'TypedDict(x=builtins.int, _fallback=typing.Mapping[builtins.str, builtins.int])'
-main:3: error: Revealed type is 'TypedDict(x=builtins.int, _fallback=ntcrash.C.A at 4)'
-main:4: error: Revealed type is 'def () -> ntcrash.C.A at 4'
-[out2]
-main:2: error: Revealed type is 'TypedDict(x=builtins.int, _fallback=typing.Mapping[builtins.str, builtins.int])'
-main:3: error: Revealed type is 'TypedDict(x=builtins.int, _fallback=ntcrash.C.A at 4)'
-main:4: error: Revealed type is 'def () -> ntcrash.C.A at 4'
-
-[case testIncrementalPerFileFlags]
-# flags: --config-file tmp/mypy.ini
-import a
-[file a.py]
-pass
-[file mypy.ini]
-[[mypy]
-warn_no_return = False
-[[mypy-a]
-warn_no_return = True
-[rechecked]
diff --git a/test-data/unit/check-inference-context.test b/test-data/unit/check-inference-context.test
deleted file mode 100644
index 7673093..0000000
--- a/test-data/unit/check-inference-context.test
+++ /dev/null
@@ -1,820 +0,0 @@
-
-
--- Basic test cases
--- ----------------
-
-
-[case testBasicContextInference]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-ab = None # type: A[B]
-ao = None # type: A[object]
-b = None # type: B
-
-ao = f()
-ab = f()
-b = f() # E: Incompatible types in assignment (expression has type A[None], variable has type "B")
-
-def f() -> 'A[T]': pass
-
-class A(Generic[T]): pass
-class B: pass
-
-[case testBasicContextInferenceForConstructor]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-ab = None # type: A[B]
-ao = None # type: A[object]
-b = None # type: B
-
-ao = A()
-ab = A()
-b = A() # E: Incompatible types in assignment (expression has type A[None], variable has type "B")
-
-class A(Generic[T]): pass
-class B: pass
-
-[case testIncompatibleContextInference]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-b = None # type: B
-c = None # type: C
-ab = None # type: A[B]
-ao = None # type: A[object]
-ac = None # type: A[C]
-
-ac = f(b) # E: Argument 1 to "f" has incompatible type "B"; expected "C"
-ab = f(c) # E: Argument 1 to "f" has incompatible type "C"; expected "B"
-
-ao = f(b)
-ab = f(b)
-ao = f(c)
-ac = f(c)
-
-def f(a: T) -> 'A[T]':
- pass
-
-class A(Generic[T]): pass
-
-class B: pass
-class C: pass
-
-
--- Local variables
--- ---------------
-
-
-[case testInferGenericLocalVariableTypeWithEmptyContext]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-def g() -> None:
- ao = None # type: A[object]
- ab = None # type: A[B]
- o = None # type: object
- b = None # type: B
-
- x = f(o)
- ab = x # E: Incompatible types in assignment (expression has type A[object], variable has type A[B])
- ao = x
- y = f(b)
- ao = y # E: Incompatible types in assignment (expression has type A[B], variable has type A[object])
- ab = y
-
-def f(a: T) -> 'A[T]': pass
-
-class A(Generic[T]): pass
-class B: pass
-[out]
-
-[case testInferLocalVariableTypeWithUnderspecifiedGenericType]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-def g() -> None:
- x = f() # E: Need type annotation for variable
-
-def f() -> 'A[T]': pass
-class A(Generic[T]): pass
-[out]
-
-[case testInferMultipleLocalVariableTypesWithTupleRvalue]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-def g() -> None:
- ao = None # type: A[object]
- ab = None # type: A[B]
- b = None # type: B
- x, y = f(b), f(b)
- ao = x # E: Incompatible types in assignment (expression has type A[B], variable has type A[object])
- ao = y # E: Incompatible types in assignment (expression has type A[B], variable has type A[object])
- ab = x
- ab = y
-
-def f(a: T) -> 'A[T]': pass
-class A(Generic[T]): pass
-class B: pass
-[out]
-
-[case testInferMultipleLocalVariableTypesWithArrayRvalueAndNesting]
-from typing import TypeVar, List, Generic
-T = TypeVar('T')
-def h() -> None:
- ao = None # type: A[object]
- ab = None # type: A[B]
- b = None # type: B
- x, y = g(f(b))
- ao = x # E: Incompatible types in assignment (expression has type A[B], variable has type A[object])
- ao = y # E: Incompatible types in assignment (expression has type A[B], variable has type A[object])
- ab = x
- ab = y
-
-def f(a: T) -> 'A[T]': pass
-def g(a: T) -> List[T]: pass
-
-class A(Generic[T]): pass
-class B: pass
-[builtins fixtures/for.pyi]
-[out]
-
-
--- Return types with multiple tvar instances
--- -----------------------------------------
-
-
-[case testInferenceWithTypeVariableTwiceInReturnType]
-from typing import TypeVar, Tuple, Generic
-T = TypeVar('T')
-b = None # type: B
-o = None # type: object
-ab = None # type: A[B]
-ao = None # type: A[object]
-
-ab, ao = f(b) # Fail
-ao, ab = f(b) # Fail
-
-ao, ao = f(b)
-ab, ab = f(b)
-ao, ao = f(o)
-
-def f(a: T) -> 'Tuple[A[T], A[T]]': pass
-
-class A(Generic[T]): pass
-class B: pass
-[builtins fixtures/tuple.pyi]
-[out]
-main:8: error: Incompatible types in assignment (expression has type A[B], variable has type A[object])
-main:9: error: Incompatible types in assignment (expression has type A[B], variable has type A[object])
-
-[case testInferenceWithTypeVariableTwiceInReturnTypeAndMultipleVariables]
-from typing import TypeVar, Tuple, Generic
-S = TypeVar('S')
-T = TypeVar('T')
-b = None # type: B
-o = None # type: object
-ab = None # type: A[B]
-ao = None # type: A[object]
-
-ao, ao, ab = f(b, b) # Fail
-ao, ab, ao = g(b, b) # Fail
-ao, ab, ab, ab = h(b, b) # Fail
-ab, ab, ao, ab = h(b, b) # Fail
-
-ao, ab, ab = f(b, b)
-ab, ab, ao = g(b, b)
-ab, ab, ab, ab = h(b, b)
-
-def f(a: S, b: T) -> 'Tuple[A[S], A[T], A[T]]': pass
-def g(a: S, b: T) -> 'Tuple[A[S], A[S], A[T]]': pass
-def h(a: S, b: T) -> 'Tuple[A[S], A[S], A[T], A[T]]': pass
-
-class A(Generic[T]): pass
-class B: pass
-[builtins fixtures/tuple.pyi]
-[out]
-main:9: error: Incompatible types in assignment (expression has type A[B], variable has type A[object])
-main:10: error: Incompatible types in assignment (expression has type A[B], variable has type A[object])
-main:11: error: Incompatible types in assignment (expression has type A[B], variable has type A[object])
-main:12: error: Incompatible types in assignment (expression has type A[B], variable has type A[object])
-
-
--- Multiple tvar instances in arguments
--- ------------------------------------
-
-
-[case testMultipleTvatInstancesInArgs]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-ac = None # type: A[C]
-ab = None # type: A[B]
-ao = None # type: A[object]
-b = None # type: B
-c = None # type: C
-o = None # type: object
-
-ab = f(b, o) # E: Argument 2 to "f" has incompatible type "object"; expected "B"
-ab = f(o, b) # E: Argument 1 to "f" has incompatible type "object"; expected "B"
-ac = f(b, c) # E: Argument 1 to "f" has incompatible type "B"; expected "C"
-ac = f(c, b) # E: Argument 2 to "f" has incompatible type "B"; expected "C"
-
-ao = f(b, c)
-ao = f(c, b)
-ab = f(c, b)
-
-def f(a: T, b: T) -> 'A[T]': pass
-
-class A(Generic[T]): pass
-class B: pass
-class C(B): pass
-
-
--- Nested generic function calls
--- -----------------------------
-
-
-[case testNestedGenericFunctionCall1]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-aab = None # type: A[A[B]]
-aao = None # type: A[A[object]]
-ao = None # type: A[object]
-b = None # type: B
-o = None # type: object
-
-aab = f(f(o)) # E: Argument 1 to "f" has incompatible type "object"; expected "B"
-
-aab = f(f(b))
-aao = f(f(b))
-ao = f(f(b))
-
-def f(a: T) -> 'A[T]': pass
-
-class A(Generic[T]): pass
-class B: pass
-
-[case testNestedGenericFunctionCall2]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-ab = None # type: A[B]
-ao = None # type: A[object]
-b = None # type: B
-o = None # type: object
-
-ab = f(g(o)) # E: Argument 1 to "g" has incompatible type "object"; expected "B"
-
-ab = f(g(b))
-ao = f(g(b))
-
-def f(a: T) -> T: pass
-
-def g(a: T) -> 'A[T]': pass
-
-class A(Generic[T]): pass
-class B: pass
-
-[case testNestedGenericFunctionCall3]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-ab = None # type: A[B]
-ao = None # type: A[object]
-b = None # type: B
-o = None # type: object
-
-ab = f(g(o), g(b)) # E: Argument 1 to "g" has incompatible type "object"; expected "B"
-ab = f(g(b), g(o)) # E: Argument 1 to "g" has incompatible type "object"; expected "B"
-
-ab = f(g(b), g(b))
-ao = f(g(b), g(o))
-ao = f(g(o), g(b))
-
-def f(a: T, b: T) -> T:
- pass
-
-def g(a: T) -> 'A[T]': pass
-
-class A(Generic[T]): pass
-class B: pass
-
-
--- Method calls
--- ------------
-
-
-[case testMethodCallWithContextInference]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-o = None # type: object
-b = None # type: B
-c = None # type: C
-ao = None # type: A[object]
-ab = None # type: A[B]
-ac = None # type: A[C]
-
-ab.g(f(o)) # E: Argument 1 to "f" has incompatible type "object"; expected "B"
-ac = f(b).g(f(c)) # E: Incompatible types in assignment (expression has type A[B], variable has type A[C])
-ac = f(c).g(f(b)) # E: Argument 1 to "f" has incompatible type "B"; expected "C"
-
-ab = f(b).g(f(c))
-ab.g(f(c))
-
-def f(a: T) -> 'A[T]': pass
-
-class A(Generic[T]):
- def g(self, a: 'A[T]') -> 'A[T]': pass
-
-class B: pass
-class C(B): pass
-
-
--- List expressions
--- ----------------
-
-
-[case testEmptyListExpression]
-from typing import List
-aa = None # type: List[A]
-ao = None # type: List[object]
-a = None # type: A
-
-a = [] # E: Incompatible types in assignment (expression has type List[None], variable has type "A")
-
-aa = []
-ao = []
-
-class A: pass
-[builtins fixtures/list.pyi]
-
-[case testSingleItemListExpressions]
-from typing import List
-aa = None # type: List[A]
-ab = None # type: List[B]
-ao = None # type: List[object]
-a = None # type: A
-b = None # type: B
-
-aa = [b] # E: List item 0 has incompatible type "B"
-ab = [a] # E: List item 0 has incompatible type "A"
-
-aa = [a]
-ab = [b]
-ao = [a]
-aa = [None]
-ao = [None]
-
-class A: pass
-class B: pass
-[builtins fixtures/list.pyi]
-
-[case testMultiItemListExpressions]
-from typing import List
-aa = None # type: List[A]
-ab = None # type: List[B]
-ao = None # type: List[object]
-a = None # type: A
-b = None # type: B
-
-ab = [b, a] # E: List item 1 has incompatible type "A"
-ab = [a, b] # E: List item 0 has incompatible type "A"
-
-aa = [a, b, a]
-ao = [a, b]
-
-class A: pass
-class B(A): pass
-[builtins fixtures/list.pyi]
-
-[case testLocalVariableInferenceFromEmptyList]
-import typing
-def f() -> None:
- a = [] # E: Need type annotation for variable
- b = [None] # E: Need type annotation for variable
- c = [B()]
- c = [object()] # E: List item 0 has incompatible type "object"
- c = [B()]
-class B: pass
-[builtins fixtures/list.pyi]
-[out]
-
-[case testNestedListExpressions]
-from typing import List
-aao = None # type: List[List[object]]
-aab = None # type: List[List[B]]
-ab = None # type: List[B]
-b = None # type: B
-o = None # type: object
-
-aao = [[o], ab] # E: List item 1 has incompatible type List[B]
-aab = [[], [o]] # E: List item 0 has incompatible type "object"
-
-aao = [[None], [b], [], [o]]
-aab = [[None], [b], []]
-aab = [ab, []]
-
-class B: pass
-[builtins fixtures/list.pyi]
-
-
--- Complex context
--- ---------------
-
-
-[case testParenthesesAndContext]
-from typing import List
-l = ([A()]) # type: List[object]
-class A: pass
-[builtins fixtures/list.pyi]
-
-[case testComplexTypeInferenceWithTuple]
-from typing import TypeVar, Tuple, Generic
-k = TypeVar('k')
-t = TypeVar('t')
-v = TypeVar('v')
-def f(x: Tuple[k]) -> 'A[k]': pass
-
-d = f((A(),)) # type: A[A[B]]
-
-class A(Generic[t]): pass
-class B: pass
-class C: pass
-class D(Generic[k, v]): pass
-[builtins fixtures/list.pyi]
-
-
--- Dictionary literals
--- -------------------
-
-
-[case testDictionaryLiteralInContext]
-from typing import Dict, TypeVar, Generic
-t = TypeVar('t')
-class A(Generic[t]): pass
-class B: pass
-class C: pass
-a_b = A() # type: A[B]
-a_c = A() # type: A[C]
-d = {A() : a_c,
- a_b : A()} # type: Dict[A[B], A[C]]
-[builtins fixtures/dict.pyi]
-
-
--- Special cases (regression tests etc.)
--- -------------------------------------
-
-
-[case testInitializationWithInferredGenericType]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-c = f(A()) # type: C[A] # E: Argument 1 to "f" has incompatible type "A"; expected C[A]
-
-def f(x: T) -> T: pass
-class C(Generic[T]): pass
-class A: pass
-
-[case testInferredGenericTypeAsReturnValue]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-def t() -> 'A[B]':
- return f(D()) # E: Argument 1 to "f" has incompatible type "D"; expected "B"
- return A()
- return f(C())
-
-def f(a: T) -> 'A[T]': pass
-class A(Generic[T]): pass
-class B: pass
-class C(B): pass
-class D: pass
-[out]
-
-[case testIntersectionWithInferredGenericArgument]
-from typing import overload, TypeVar, Generic
-T = TypeVar('T')
-f(A())
-
- at overload
-def f(x: 'A[B]') -> None: pass
- at overload
-def f(x: 'B') -> None: pass
-class A(Generic[T]): pass
-class B: pass
-
-[case testInferenceWithAbstractClassContext]
-from typing import TypeVar, Generic
-from abc import abstractmethod, ABCMeta
-t = TypeVar('t')
-x = A() # type: I[int]
-a_object = A() # type: A[object]
-y = a_object # type: I[int] # E: Incompatible types in assignment (expression has type A[object], variable has type I[int])
-
-class I(Generic[t]):
- @abstractmethod
- def f(self): pass
-class A(I[t], Generic[t]):
- def f(self): pass
-
-[case testInferenceWithAbstractClassContext2]
-from typing import TypeVar, Generic
-from abc import abstractmethod, ABCMeta
-t = TypeVar('t')
-a = f(A()) # type: A[int]
-a_int = A() # type: A[int]
-aa = f(a_int)
-class I(Generic[t]): pass
-class A(I[t], Generic[t]): pass
-def f(i: I[t]) -> A[t]: pass
-
-[case testInferenceWithAbstractClassContext3]
-from typing import TypeVar, Generic, Iterable
-t = TypeVar('t')
-class set(Generic[t]):
- def __init__(self, iterable: Iterable[t]) -> None: pass
-b = bool()
-l = set([b])
-l = set([object()]) # E: List item 0 has incompatible type "object"
-[builtins fixtures/for.pyi]
-
-
--- Infer generic type in 'Any' context
--- -----------------------------------
-
-
-[case testInferGenericTypeInAnyContext]
-from typing import Any, TypeVar, Generic
-s = TypeVar('s')
-t = TypeVar('t')
-x = [] # type: Any
-y = C() # type: Any
-class C(Generic[s, t]): pass
-[builtins fixtures/list.pyi]
-
-
--- Lambdas
--- -------
-
-
-[case testInferLambdaArgumentTypeUsingContext]
-from typing import Callable
-f = None # type: Callable[[B], A]
-f = lambda x: x.o
-f = lambda x: x.x # E: "B" has no attribute "x"
-class A: pass
-class B:
- o = None # type: A
-
-[case testInferLambdaReturnTypeUsingContext]
-from typing import List, Callable
-f = None # type: Callable[[], List[A]]
-f = lambda: []
-f = lambda: [B()] # E: List item 0 has incompatible type "B"
-class A: pass
-class B: pass
-[builtins fixtures/list.pyi]
-
-[case testInferLambdaAsGenericFunctionArgument]
-from typing import TypeVar, List, Any, Callable
-t = TypeVar('t')
-class A:
- x = None # type: A
-def f(a: List[t], fn: Callable[[t], Any]) -> None: pass
-list_a = [] # type: List[A]
-f(list_a, lambda a: a.x)
-[builtins fixtures/list.pyi]
-
-[case testLambdaWithoutContext]
-reveal_type(lambda x: x) # E: Revealed type is 'def (x: Any) -> Any'
-reveal_type(lambda x: 1) # E: Revealed type is 'def (x: Any) -> builtins.int'
-
-[case testLambdaContextVararg]
-from typing import Callable
-def f(t: Callable[[str], str]) -> str: ''
-f(lambda *_: '')
-
-[case testInvalidContextForLambda]
-from typing import Callable
-f = lambda x: A() # type: Callable[[], A]
-f2 = lambda: A() # type: Callable[[A], A]
-class A: pass
-[out]
-main:2: error: Incompatible types in assignment (expression has type Callable[[Any], A], variable has type Callable[[], A])
-main:2: error: Cannot infer type of lambda
-main:3: error: Incompatible types in assignment (expression has type Callable[[], A], variable has type Callable[[A], A])
-main:3: error: Cannot infer type of lambda
-
-[case testEllipsisContextForLambda]
-from typing import Callable
-f1 = lambda x: 1 # type: Callable[..., int]
-f2 = lambda: 1 # type: Callable[..., int]
-f3 = lambda *args, **kwargs: 1 # type: Callable[..., int]
-f4 = lambda x: x # type: Callable[..., int]
-g = lambda x: 1 # type: Callable[..., str]
-[builtins fixtures/dict.pyi]
-[out]
-main:6: error: Incompatible types in assignment (expression has type Callable[[Any], int], variable has type Callable[..., str])
-main:6: error: Incompatible return value type (got "int", expected "str")
-
-[case testEllipsisContextForLambda2]
-from typing import TypeVar, Callable
-T = TypeVar('T')
-def foo(arg: Callable[..., T]) -> None: pass
-foo(lambda: 1)
-
-[case testLambdaNoneInContext]
-from typing import Callable
-def f(x: Callable[[], None]) -> None: pass
-def g(x: Callable[[], int]) -> None: pass
-f(lambda: None)
-g(lambda: None)
-
-[case testIsinstanceInInferredLambda]
-from typing import TypeVar, Callable
-T = TypeVar('T')
-S = TypeVar('S')
-class A: pass
-class B(A): pass
-class C(A): pass
-def f(func: Callable[[T], S], *z: T, r: S = None) -> S: pass
-f(lambda x: 0 if isinstance(x, B) else 1) # E: Cannot infer type argument 1 of "f"
-f(lambda x: 0 if isinstance(x, B) else 1, A())() # E: "int" not callable
-f(lambda x: x if isinstance(x, B) else B(), A(), r=B())() # E: "B" not callable
-f( # E: Argument 1 to "f" has incompatible type Callable[[A], A]; expected Callable[[A], B]
- lambda x: B() if isinstance(x, B) else x, # E: Incompatible return value type (got "A", expected "B")
- A(), r=B())
-[builtins fixtures/isinstance.pyi]
-
-
--- Overloads + generic functions
--- -----------------------------
-
-
-[case testMapWithOverloadedFunc]
-from typing import TypeVar, Callable, List, overload, Any
-t = TypeVar('t')
-s = TypeVar('s')
-def map(f: Callable[[t], s], seq: List[t]) -> List[s]: pass
-
- at overload
-def g(o: object) -> 'B': pass
- at overload
-def g(o: 'A', x: Any = None) -> 'B': pass
-
-class A: pass
-class B: pass
-
-m = map(g, [A()])
-b = m # type: List[B]
-a = m # type: List[A] # E: Incompatible types in assignment (expression has type List[B], variable has type List[A])
-[builtins fixtures/list.pyi]
-
-
--- Boolean operators
--- -----------------
-
-
-[case testOrOperationInferredFromContext]
-from typing import List
-a, b, c = None, None, None # type: (List[A], List[B], List[C])
-a = a or []
-a = [] or a
-b = b or [C()]
-a = a or b # E: Incompatible types in assignment (expression has type "Union[List[A], List[B]]", variable has type List[A])
-b = b or c # E: Incompatible types in assignment (expression has type "Union[List[B], List[C]]", variable has type List[B])
-
-class A: pass
-class B: pass
-class C(B): pass
-[builtins fixtures/list.pyi]
-
-
--- Special cases
--- -------------
-
-
-[case testSomeTypeVarsInferredFromContext]
-from typing import List, TypeVar
-t = TypeVar('t')
-s = TypeVar('s')
-# Some type variables can be inferred using context, but not all of them.
-a = None # type: List[A]
-a = f(A(), B())
-a = f(B(), B()) # E: Argument 1 to "f" has incompatible type "B"; expected "A"
-def f(a: s, b: t) -> List[s]: pass
-class A: pass
-class B: pass
-[builtins fixtures/list.pyi]
-
-[case testSomeTypeVarsInferredFromContext2]
-from typing import List, TypeVar
-s = TypeVar('s')
-t = TypeVar('t')
-# Like testSomeTypeVarsInferredFromContext, but tvars in different order.
-a = None # type: List[A]
-a = f(A(), B())
-a = f(B(), B()) # E: Argument 1 to "f" has incompatible type "B"; expected "A"
-def f(a: s, b: t) -> List[s]: pass
-class A: pass
-class B: pass
-[builtins fixtures/list.pyi]
-
-[case testLambdaInListAndHigherOrderFunction]
-from typing import TypeVar, Callable, List
-t = TypeVar('t')
-s = TypeVar('s')
-map(
- [lambda x: x], [])
-def map(f: List[Callable[[t], s]], a: List[t]) -> List[s]: pass
-class A: pass
-[builtins fixtures/list.pyi]
-[out]
-
-[case testChainedAssignmentInferenceContexts]
-from typing import List
-i = None # type: List[int]
-s = None # type: List[str]
-i = i = []
-i = s = [] # E: Incompatible types in assignment (expression has type List[str], variable has type List[int])
-[builtins fixtures/list.pyi]
-
-[case testContextForAttributeDeclaredInInit]
-from typing import List
-class A:
- def __init__(self):
- self.x = [] # type: List[int]
-a = A()
-a.x = []
-a.x = [1]
-a.x = [''] # E: List item 0 has incompatible type "str"
-[builtins fixtures/list.pyi]
-
-[case testListMultiplyInContext]
-from typing import List
-a = None # type: List[int]
-a = [None] * 3
-a = [''] * 3 # E: List item 0 has incompatible type "str"
-[builtins fixtures/list.pyi]
-
-[case testUnionTypeContext]
-from typing import Union, List, TypeVar
-T = TypeVar('T')
-def f(x: Union[List[T], str]) -> None: pass
-f([1])
-f('')
-f(1) # E: Argument 1 to "f" has incompatible type "int"; expected "Union[List[None], str]"
-[builtins fixtures/isinstancelist.pyi]
-
-[case testIgnoringInferenceContext]
-from typing import TypeVar, List
-T = TypeVar('T')
-def f(x: List[T]) -> T: pass
-def g(y: object) -> None: pass
-a = [1]
-g(f(a))
-[builtins fixtures/list.pyi]
-
-[case testStar2Context]
-from typing import Any, Dict, Tuple, Iterable
-def f1(iterable: Iterable[Tuple[str, Any]] = None) -> None:
- f2(**dict(iterable))
-def f2(iterable: Iterable[Tuple[str, Any]], **kw: Any) -> None:
- pass
-[builtins fixtures/dict.pyi]
-[out]
-
-[case testInferenceInGenericFunction]
-from typing import TypeVar, List
-T = TypeVar('T')
-def f(a: T) -> None:
- l = [] # type: List[T]
- l.append(a)
- l.append(1) # E: Argument 1 to "append" of "list" has incompatible type "int"; expected "T"
-[builtins fixtures/list.pyi]
-[out]
-
-[case testInferenceInGenericClass]
-from typing import TypeVar, Generic, List
-S = TypeVar('S')
-T = TypeVar('T')
-class A(Generic[S]):
- def f(self, a: T, b: S) -> None:
- l = [] # type: List[T]
- l.append(a)
- l.append(b) # E: Argument 1 to "append" of "list" has incompatible type "S"; expected "T"
-[builtins fixtures/list.pyi]
-[out]
-
-[case testLambdaInGenericFunction]
-from typing import TypeVar, Callable
-T = TypeVar('T')
-S = TypeVar('S')
-def f(a: T, b: S) -> None:
- c = lambda x: x # type: Callable[[T], S]
-[out]
-main:5: error: Incompatible types in assignment (expression has type Callable[[T], T], variable has type Callable[[T], S])
-main:5: error: Incompatible return value type (got "T", expected "S")
-
-[case testLambdaInGenericClass]
-from typing import TypeVar, Callable, Generic
-T = TypeVar('T')
-S = TypeVar('S')
-class A(Generic[T]):
- def f(self, b: S) -> None:
- c = lambda x: x # type: Callable[[T], S]
-[out]
-main:6: error: Incompatible types in assignment (expression has type Callable[[T], T], variable has type Callable[[T], S])
-main:6: error: Incompatible return value type (got "T", expected "S")
diff --git a/test-data/unit/check-inference.test b/test-data/unit/check-inference.test
deleted file mode 100644
index 54f73f5..0000000
--- a/test-data/unit/check-inference.test
+++ /dev/null
@@ -1,1765 +0,0 @@
--- Inferring locals/globals with simple types
--- ------------------------------------------
-
-
-[case testInferSimpleGvarType]
-import typing
-x = A()
-y = B()
-x = B() # Fail
-x = A()
-x = y # Fail
-x = x
-class A: pass
-class B: pass
-[out]
-main:4: error: Incompatible types in assignment (expression has type "B", variable has type "A")
-main:6: error: Incompatible types in assignment (expression has type "B", variable has type "A")
-
-[case testInferSimpleLvarType]
-import typing
-def f() -> None:
- x = A()
- y = B()
- x = B() # Fail
- x = A()
- x = y # Fail
- x = x
-class A: pass
-class B: pass
-[out]
-main:5: error: Incompatible types in assignment (expression has type "B", variable has type "A")
-main:7: error: Incompatible types in assignment (expression has type "B", variable has type "A")
-
-[case testLvarInitializedToVoid]
-import typing
-def f() -> None:
- a = g() # E: "g" does not return a value
- #b, c = g() # "g" does not return a value TODO
-
-def g() -> None: pass
-[out]
-
-[case testInferringLvarTypeFromArgument]
-import typing
-def f(a: 'A') -> None:
- b = a
- b = B() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
- b = a
- a = b
-
-class A: pass
-class B: pass
-[out]
-
-[case testInferringLvarTypeFromGvar]
-
-g = None # type: B
-
-def f() -> None:
- a = g
- a = A() # E: Incompatible types in assignment (expression has type "A", variable has type "B")
- a = B()
-
-class A: pass
-class B: pass
-[out]
-
-[case testInferringImplicitDynamicTypeForLvar]
-import typing
-def f() -> None:
- a = g()
- None(a) # E: None not callable
- a.x()
-
-def g(): pass
-[out]
-
-[case testInferringExplicitDynamicTypeForLvar]
-from typing import Any
-g = None # type: Any
-
-def f(a: Any) -> None:
- b = g
- None(b) # E: None not callable
- a.x()
-[out]
-
-
--- Inferring types of local variables with complex types
--- -----------------------------------------------------
-
-
-[case testInferringTupleTypeForLvar]
-
-def f() -> None:
- a = A(), B()
- aa = None # type: A
- bb = None # type: B
- bb = a[0] # E: Incompatible types in assignment (expression has type "A", variable has type "B")
- aa = a[1] # E: Incompatible types in assignment (expression has type "B", variable has type "A")
- aa = a[0]
- bb = a[1]
-
-class A: pass
-class B: pass
-[builtins fixtures/tuple.pyi]
-[out]
-
-[case testInferringTupleTypeForLvarWithNones]
-import typing
-def f() -> None:
- a = A(), None # E: Need type annotation for variable
- b = None, A() # E: Need type annotation for variable
-
-class A: pass
-[builtins fixtures/tuple.pyi]
-[out]
-
-[case testInferringGenericTypeForLvar]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-class A(Generic[T]): pass
-a_i = None # type: A[int]
-a_s = None # type: A[str]
-
-def f() -> None:
- a_int = A() # type: A[int]
- a = a_int
- a = a_s # E: Incompatible types in assignment (expression has type A[str], variable has type A[int])
- a = a_i
-[builtins fixtures/tuple.pyi]
-[out]
-
-[case testInferringFunctionTypeForLvar]
-import typing
-def f() -> None:
- a = g
- a(B()) # E: Argument 1 has incompatible type "B"; expected "A"
- a(A())
-
-def g(a: 'A') -> None: pass
-
-class A: pass
-class B: pass
-[out]
-
-[case testInferringFunctionTypeForLvarFromTypeObject]
-import typing
-def f() -> None:
- a = A
- a(A()) # E: Too many arguments
- a()
- t = a # type: type
-
-class A: pass
-[out]
-
-
--- Inferring variable types in multiple definition
--- -----------------------------------------------
-
-
-[case testInferringLvarTypesInMultiDef]
-import typing
-def f() -> None:
- a, b = A(), B()
- a = b # E: Incompatible types in assignment (expression has type "B", variable has type "A")
- a = B() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
- b = A() # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-
- a = A()
- b = B()
-
-class A: pass
-class B: pass
-[out]
-
-[case testInferringLvarTypesInTupleAssignment]
-from typing import Tuple
-def f() -> None:
- t = None # type: Tuple[A, B]
- a, b = t
- a = b # E: Incompatible types in assignment (expression has type "B", variable has type "A")
- a = B() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
- b = A() # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-
- a = A()
- b = B()
-
-class A: pass
-class B: pass
-[out]
-
-[case testInferringLvarTypesInNestedTupleAssignment1]
-from typing import Tuple
-def f() -> None:
- t = None # type: Tuple[A, B]
- a1, (a, b) = A(), t
- a = b # E: Incompatible types in assignment (expression has type "B", variable has type "A")
- a = B() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
- b = A() # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-
- a = A()
- b = B()
-
-class A: pass
-class B: pass
-[out]
-
-[case testInferringLvarTypesInNestedTupleAssignment2]
-import typing
-def f() -> None:
- a, (b, c) = A(), (B(), C())
- a = b # E: Incompatible types in assignment (expression has type "B", variable has type "A")
- a = B() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
- b = A() # E: Incompatible types in assignment (expression has type "A", variable has type "B")
- c = A() # E: Incompatible types in assignment (expression has type "A", variable has type "C")
-
- a = A()
- b = B()
- c = C()
-
-class A: pass
-class B: pass
-class C: pass
-[out]
-
-[case testInferringLvarTypesInNestedListAssignment]
-import typing
-def f() -> None:
- a, (b, c) = A(), [B(), C()]
- a = b # E: Incompatible types in assignment (expression has type "B", variable has type "A")
- a = B() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
- b = A() # E: Incompatible types in assignment (expression has type "A", variable has type "B")
- c = A() # E: Incompatible types in assignment (expression has type "A", variable has type "C")
-
- a = A()
- b = B()
- c = C()
-
-class A: pass
-class B: pass
-class C: pass
-[out]
-
-[case testInferringLvarTypesInMultiDefWithNoneTypes]
-import typing
-def f() -> None:
- a, b = A(), None # E: Need type annotation for variable
- c, d = None, A() # E: Need type annotation for variable
-
-class A: pass
-[out]
-
-[case testInferringLvarTypesInNestedTupleAssignmentWithNoneTypes]
-import typing
-def f() -> None:
- a1, (a2, b) = A(), (A(), None) # E: Need type annotation for variable
-
-class A: pass
-[out]
-
-[case testInferringLvarTypesInMultiDefWithInvalidTuple]
-from typing import Tuple
-t = None # type: Tuple[object, object, object]
-
-def f() -> None:
- a, b = t # Fail
- c, d, e, f = t # Fail
- g, h, i = t
-[builtins fixtures/tuple.pyi]
-[out]
-main:5: error: Too many values to unpack (2 expected, 3 provided)
-main:6: error: Need more than 3 values to unpack (4 expected)
-
-[case testInvalidRvalueTypeInInferredMultipleLvarDefinition]
-import typing
-def f() -> None:
- a, b = f # E: 'def ()' object is not iterable
- c, d = A() # E: '__main__.A' object is not iterable
-class A: pass
-[builtins fixtures/for.pyi]
-[out]
-
-[case testInvalidRvalueTypeInInferredNestedTupleAssignment]
-import typing
-def f() -> None:
- a1, (a2, b) = A(), f # E: 'def ()' object is not iterable
- a3, (c, d) = A(), A() # E: '__main__.A' object is not iterable
-class A: pass
-[builtins fixtures/for.pyi]
-[out]
-
-[case testInferringMultipleLvarDefinitionWithListRvalue]
-from typing import List
-
-class C: pass
-class D: pass
-
-def f() -> None:
- list_c = [C()]
- list_d = [D()]
- a, b = list_c
- c, d, e = list_d
- a = D() # E: Incompatible types in assignment (expression has type "D", variable has type "C")
- b = D() # E: Incompatible types in assignment (expression has type "D", variable has type "C")
- c = C() # E: Incompatible types in assignment (expression has type "C", variable has type "D")
- b = c # E: Incompatible types in assignment (expression has type "D", variable has type "C")
-
- a = C()
- b = C()
- c = D()
- d = D()
- e = D()
-
- a = b
- c = d
- d = e
-[builtins fixtures/for.pyi]
-[out]
-
-[case testInferringNestedTupleAssignmentWithListRvalue]
-from typing import List
-
-class C: pass
-class D: pass
-
-def f() -> None:
- list_c = [C()]
- list_d = [D()]
- c1, (a, b) = C(), list_c
- c2, (c, d, e) = C(), list_d
- a = D() # E: Incompatible types in assignment (expression has type "D", variable has type "C")
- b = D() # E: Incompatible types in assignment (expression has type "D", variable has type "C")
- c = C() # E: Incompatible types in assignment (expression has type "C", variable has type "D")
- b = c # E: Incompatible types in assignment (expression has type "D", variable has type "C")
-
- a = C()
- b = C()
- c = D()
- d = D()
- e = D()
-
- a = b
- c = d
- d = e
-[builtins fixtures/for.pyi]
-[out]
-
-[case testInferringMultipleLvarDefinitionWithImplicitDynamicRvalue]
-import typing
-def f() -> None:
- a, b = g()
- a.x
- b.x
-def g(): pass
-
-[case testInferringMultipleLvarDefinitionWithExplicitDynamicRvalue]
-from typing import Any
-def f(d: Any) -> None:
- a, b = d
- a.x
- b.x
-
-[case testInferringTypesFromIterable]
-from typing import Iterable
-class Nums(Iterable[int]):
- def __iter__(self): pass
- def __next__(self): pass
-a, b = Nums()
-a = b = 1
-a = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-b = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-[builtins fixtures/for.pyi]
-
-
--- Type variable inference for generic functions
--- ---------------------------------------------
-
-
-[case testInferSimpleGenericFunction]
-from typing import Tuple, TypeVar
-T = TypeVar('T')
-a = None # type: A
-b = None # type: B
-c = None # type: Tuple[A, object]
-
-b = id(a) # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-a = id(b) # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-a = id(c) # E: Incompatible types in assignment (expression has type "Tuple[A, object]", variable has type "A")
-
-a = id(a)
-b = id(b)
-c = id(c)
-
-def id(a: T) -> T: pass
-
-class A: pass
-class B: pass
-[builtins fixtures/tuple.pyi]
-
-[case testInferringGenericFunctionTypeForLvar]
-from typing import TypeVar
-T = TypeVar('T')
-def f() -> None:
- a = id
- b = None # type: int
- c = None # type: str
- b = a(c) # E: Incompatible types in assignment (expression has type "str", variable has type "int")
- b = a(b)
- c = a(c)
-def id(x: T) -> T:
- return x
-[out]
-
-[case testUnderspecifiedInferenceResult]
-from typing import TypeVar
-T = TypeVar('T')
-class A: pass
-a = None # type: A
-
-def ff() -> None:
- x = f() # E: Need type annotation for variable
-
-g(None) # Ok
-f() # Ok because not used to infer local variable type
-g(a)
-
-def f() -> T: pass
-def g(a: T) -> None: pass
-[out]
-
-[case testUnsolvableInferenceResult]
-from typing import TypeVar
-T = TypeVar('T')
-f(A(), g()) # Fail
-f(A(), A())
-
-def f(a: T, b: T) -> None: pass
-def g() -> None: pass
-class A: pass
-[out]
-main:3: error: Cannot infer type argument 1 of "f"
-main:3: error: "g" does not return a value
-
-[case testInferenceWithMultipleConstraints]
-from typing import TypeVar
-T = TypeVar('T')
-a = None # type: A
-b = None # type: B
-
-b = f(a, b) # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-b = f(b, a) # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-a = f(a, b)
-a = f(b, a)
-
-def f(a: T, b: T) -> T: pass
-
-class A: pass
-class B(A): pass
-
-[case testInferenceWithMultipleVariables]
-from typing import Tuple, TypeVar
-T = TypeVar('T')
-S = TypeVar('S')
-a, b = None, None # type: (A, B)
-taa = None # type: Tuple[A, A]
-tab = None # type: Tuple[A, B]
-tba = None # type: Tuple[B, A]
-
-taa = f(a, b) # Fail
-taa = f(b, a) # Fail
-tba = f(a, b) # Fail
-
-tab = f(a, b)
-tba = f(b, a)
-
-def f(a: T, b: S) -> Tuple[T, S]: pass
-
-class A: pass
-class B: pass
-[builtins fixtures/tuple.pyi]
-[out]
-main:9: error: Argument 2 to "f" has incompatible type "B"; expected "A"
-main:10: error: Argument 1 to "f" has incompatible type "B"; expected "A"
-main:11: error: Argument 1 to "f" has incompatible type "A"; expected "B"
-main:11: error: Argument 2 to "f" has incompatible type "B"; expected "A"
-
-[case testConstraintSolvingWithSimpleGenerics]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-ao = None # type: A[object]
-ab = None # type: A[B]
-ac = None # type: A[C]
-
-ab = f(ao) # E: Argument 1 to "f" has incompatible type A[object]; expected A[B]
-ao = f(ab) # E: Argument 1 to "f" has incompatible type A[B]; expected A[object]
-ab = f(ac) # E: Argument 1 to "f" has incompatible type A[C]; expected A[B]
-ab = g(ao) # E: Argument 1 to "g" has incompatible type A[object]; expected A[B]
-ao = g(ab) # E: Argument 1 to "g" has incompatible type A[B]; expected A[object]
-
-ab = f(ab)
-ac = f(ac)
-ao = f(ao)
-
-ab = g(ab)
-ao = g(ao)
-
-def f(a: 'A[T]') -> 'A[T]': pass
-
-def g(a: T) -> T: pass
-
-class A(Generic[T]): pass
-class B: pass
-class C: pass
-
-[case testConstraintSolvingFailureWithSimpleGenerics]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-ao = None # type: A[object]
-ab = None # type: A[B]
-
-f(ao, ab) # E: Cannot infer type argument 1 of "f"
-f(ab, ao) # E: Cannot infer type argument 1 of "f"
-f(ao, ao)
-f(ab, ab)
-
-def f(a: 'A[T]', b: 'A[T]') -> None: pass
-
-class A(Generic[T]): pass
-class B: pass
-
-[case testTypeInferenceWithCalleeDefaultArgs]
-from typing import TypeVar
-T = TypeVar('T')
-a = None # type: A
-o = None # type: object
-
-a = f(o) # E: Incompatible types in assignment (expression has type "object", variable has type "A")
-a = g(a, o) # E: Incompatible types in assignment (expression has type "object", variable has type "A")
-
-o = f()
-o = f(o)
-a = f(a)
-a = g(a)
-
-def f(a: T = None) -> T: pass
-def g(a: T, b: T = None) -> T: pass
-
-class A: pass
-
-
--- Generic function inference with multiple inheritance
--- ----------------------------------------------------
-
-
-[case testGenericFunctionInferenceWithMultipleInheritance]
-from typing import TypeVar
-
-class I: pass
-class J: pass
-
-class A(I, J): pass
-class B(I, J): pass
-class C(I): pass
-class D(J): pass
-
-T = TypeVar('T')
-def f(a: T, b: T) -> T: pass
-def g(x: I) -> None: pass
-
-a = f(A(), C())
-g(a)
-b = f(A(), B())
-g(b)
-c = f(A(), D())
-g(c) # E: Argument 1 to "g" has incompatible type "J"; expected "I"
-d = f(D(), A())
-g(d) # E: Argument 1 to "g" has incompatible type "J"; expected "I"
-e = f(D(), C())
-g(e) # E: Argument 1 to "g" has incompatible type "object"; expected "I"
-
-[case testGenericFunctionInferenceWithMultipleInheritance2]
-from typing import TypeVar
-
-class I: pass
-class J: pass
-
-class A(I): pass
-class B(A, J): pass
-class C(I, J): pass
-
-T = TypeVar('T')
-def f(a: T, b: T) -> T: pass
-def g(x: I) -> None: pass
-def h(x: J) -> None: pass
-
-a = f(B(), C())
-g(a)
-h(a) # E: Argument 1 to "h" has incompatible type "I"; expected "J"
-b = f(C(), B())
-g(b)
-h(b) # E: Argument 1 to "h" has incompatible type "I"; expected "J"
-c = f(A(), B())
-g(a)
-h(b) # E: Argument 1 to "h" has incompatible type "I"; expected "J"
-
-[case testGenericFunctionInferenceWithMultipleInheritance3]
-from typing import TypeVar
-
-class I: pass
-class J: pass
-class K(J): pass
-
-class A(K): pass
-class B(A, I): pass
-class C(I, J): pass
-
-T = TypeVar('T')
-def f(a: T, b: T) -> T: pass
-def g(x: K) -> None: pass
-
-a = f(B(), C())
-g(a) # E: Argument 1 to "g" has incompatible type "J"; expected "K"
-b = f(A(), C())
-g(b) # E: Argument 1 to "g" has incompatible type "J"; expected "K"
-c = f(A(), B())
-g(c)
-
-[case testPrecedenceOfFirstBaseAsInferenceResult]
-from typing import TypeVar
-from abc import abstractmethod, ABCMeta
-T = TypeVar('T')
-a, i, j = None, None, None # type: (A, I, J)
-
-a = f(B(), C())
-
-class I(metaclass=ABCMeta): pass
-class J(metaclass=ABCMeta): pass
-
-def f(a: T, b: T) -> T: pass
-
-class A: pass
-class B(A, I, J): pass
-class C(A, I, J): pass
-
-
--- Generic function inference with function arguments
--- --------------------------------------------------
-
-
-[case testNonOverloadedMapInference]
-from typing import TypeVar, Callable, List
-t = TypeVar('t')
-s = TypeVar('s')
-class A: pass
-b = bool()
-def f(x: bool) -> A: pass
-def mymap(f: Callable[[t], s], a: List[t]) -> List[s]: pass
-
-l = mymap(f, [b])
-l = [A()]
-lb = [b]
-l = lb # E: Incompatible types in assignment (expression has type List[bool], variable has type List[A])
-[builtins fixtures/for.pyi]
-
-
--- Generic function inference with unions
--- --------------------------------------
-
-
-[case testUnionInference]
-from typing import TypeVar, Union, List
-T = TypeVar('T')
-U = TypeVar('U')
-def f(x: Union[T, int], y: T) -> T: pass
-f(1, 'a')() # E: "str" not callable
-f('a', 1)() # E: "object" not callable
-f('a', 'a')() # E: "str" not callable
-f(1, 1)() # E: "int" not callable
-
-def g(x: Union[T, List[T]]) -> List[T]: pass
-def h(x: List[str]) -> None: pass
-g('a')() # E: List[str] not callable
-
-# The next line is a case where there are multiple ways to satisfy a constraint
-# involving a Union. Either T = List[str] or T = str would turn out to be valid,
-# but mypy doesn't know how to branch on these two options (and potentially have
-# to backtrack later) and defaults to T = None. The result is an awkward error
-# message. Either a better error message, or simply accepting the call, would be
-# preferable here.
-g(['a']) # E: Argument 1 to "g" has incompatible type List[str]; expected List[None]
-
-h(g(['a']))
-
-def i(x: Union[List[T], List[U]], y: List[T], z: List[U]) -> None: pass
-a = [1]
-b = ['b']
-i(a, a, b)
-i(b, a, b)
-i(a, b, b) # E: Argument 1 to "i" has incompatible type List[int]; expected List[str]
-[builtins fixtures/list.pyi]
-
-
-[case testUnionInferenceWithTypeVarValues]
-from typing import TypeVar, Union
-AnyStr = TypeVar('AnyStr', bytes, str)
-def f(x: Union[AnyStr, int], *a: AnyStr) -> None: pass
-f('foo')
-f('foo', 'bar')
-f('foo', b'bar') # E: Type argument 1 of "f" has incompatible value "object"
-f(1)
-f(1, 'foo')
-f(1, 'foo', b'bar') # E: Type argument 1 of "f" has incompatible value "object"
-[builtins fixtures/primitives.pyi]
-
-
-[case testUnionTwoPassInference-skip]
-from typing import TypeVar, Union, List
-T = TypeVar('T')
-U = TypeVar('U')
-def j(x: Union[List[T], List[U]], y: List[T]) -> List[U]: pass
-
-a = [1]
-b = ['b']
-# We could infer: Since List[str] <: List[T], we must have T = str.
-# Then since List[int] <: Union[List[str], List[U]], and List[int] is
-# not a subtype of List[str], we must have U = int.
-# This is not currently implemented.
-j(a, b)
-[builtins fixtures/list.pyi]
-
-
-[case testUnionContext]
-from typing import TypeVar, Union, List
-T = TypeVar('T')
-def f() -> List[T]: pass
-d1 = f() # type: Union[List[int], str]
-d2 = f() # type: Union[int, str] # E: Incompatible types in assignment (expression has type List[None], variable has type "Union[int, str]")
-def g(x: T) -> List[T]: pass
-d3 = g(1) # type: Union[List[int], List[str]]
-[builtins fixtures/list.pyi]
-
-
-[case testGenericFunctionSubtypingWithUnions]
-from typing import TypeVar, Union, List
-T = TypeVar('T')
-S = TypeVar('S')
-def k1(x: int, y: List[T]) -> List[Union[T, int]]: pass
-def k2(x: S, y: List[T]) -> List[Union[T, int]]: pass
-a = k2
-a = k2
-a = k1 # E: Incompatible types in assignment (expression has type Callable[[int, List[T]], List[Union[T, int]]], variable has type Callable[[S, List[T]], List[Union[T, int]]])
-b = k1
-b = k1
-b = k2
-[builtins fixtures/list.pyi]
-
-
--- Literal expressions
--- -------------------
-
-
-[case testDictLiteral]
-from typing import Dict
-class A: pass
-class B: pass
-def d_ab() -> Dict[A, B]: return {}
-def d_aa() -> Dict[A, A]: return {}
-a, b = None, None # type: (A, B)
-d = {a:b}
-d = d_ab()
-d = d_aa() # E: Incompatible types in assignment (expression has type Dict[A, A], variable has type Dict[A, B])
-[builtins fixtures/dict.pyi]
-
-[case testSetLiteral]
-from typing import Any, Set
-a, x = None, None # type: (int, Any)
-def s_i() -> Set[int]: return set()
-def s_s() -> Set[str]: return set()
-s = {a}
-s = {x}
-s = s_i()
-s = s_s() # E: Incompatible types in assignment (expression has type Set[str], variable has type Set[int])
-[builtins fixtures/set.pyi]
-
-[case testSetWithStarExpr]
-# flags: --fast-parser
-s = {1, 2, *(3, 4)}
-t = {1, 2, *s}
-reveal_type(s) # E: Revealed type is 'builtins.set[builtins.int*]'
-reveal_type(t) # E: Revealed type is 'builtins.set[builtins.int*]'
-[builtins fixtures/set.pyi]
-
-
--- For statements
--- --------------
-
-
-[case testInferenceOfFor1]
-a, b = None, None # type: (A, B)
-
-for x in [A()]:
- b = x # E: Incompatible types in assignment (expression has type "A", variable has type "B")
- a = x
-
-for y in []: # E: Need type annotation for variable
- a = y
-
-class A: pass
-class B: pass
-[builtins fixtures/for.pyi]
-
-[case testInferenceOfFor2]
-
-a, b, c = None, None, None # type: (A, B, C)
-for x, (y, z) in [(A(), (B(), C()))]:
- b = x # Fail
- c = y # Fail
- a = z # Fail
- a = x
- b = y
- c = z
-for xx, yy, zz in [(A(), B())]: # Fail
- pass
-for xx, (yy, zz) in [(A(), B())]: # Fail
- pass
-for xxx, yyy in [(None, None)]: # Fail
- pass
-
-class A: pass
-class B: pass
-class C: pass
-[builtins fixtures/for.pyi]
-[out]
-main:4: error: Incompatible types in assignment (expression has type "A", variable has type "B")
-main:5: error: Incompatible types in assignment (expression has type "B", variable has type "C")
-main:6: error: Incompatible types in assignment (expression has type "C", variable has type "A")
-main:10: error: Need more than 2 values to unpack (3 expected)
-main:12: error: '__main__.B' object is not iterable
-main:14: error: Need type annotation for variable
-
-[case testInferenceOfFor3]
-
-a, b = None, None # type: (A, B)
-
-for x, y in [[A()]]:
- b = x # E: Incompatible types in assignment (expression has type "A", variable has type "B")
- b = y # E: Incompatible types in assignment (expression has type "A", variable has type "B")
- a = x
- a = y
-
-for e, f in [[]]: # E: Need type annotation for variable
- pass
-
-class A: pass
-class B: pass
-[builtins fixtures/for.pyi]
-
-[case testForStatementInferenceWithVoid]
-import typing
-for x in f(): # E: "f" does not return a value
- pass
-def f() -> None: pass
-[builtins fixtures/for.pyi]
-
-[case testReusingInferredForIndex]
-import typing
-for a in [A()]: pass
-a = A()
-a = B() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-for a in []: pass
-a = A()
-a = B() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-class A: pass
-class B: pass
-[builtins fixtures/for.pyi]
-
-[case testReusingInferredForIndex2]
-import typing
-def f() -> None:
- for a in [A()]: pass
- a = A()
- a = B() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
- for a in []: pass
- a = A()
- a = B() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-class A: pass
-class B: pass
-[builtins fixtures/for.pyi]
-[out]
-
-
--- Regression tests
--- ----------------
-
-
-[case testMultipleAssignmentWithPartialDefinition]
-
-a = None # type: A
-x, a = a, a
-x = a
-a = x
-x = object() # E: Incompatible types in assignment (expression has type "object", variable has type "A")
-a = object() # E: Incompatible types in assignment (expression has type "object", variable has type "A")
-class A: pass
-
-[case testMultipleAssignmentWithPartialDefinition2]
-
-a = None # type: A
-a, x = [a, a]
-x = a
-a = x
-x = object() # E: Incompatible types in assignment (expression has type "object", variable has type "A")
-a = object() # E: Incompatible types in assignment (expression has type "object", variable has type "A")
-class A: pass
-[builtins fixtures/for.pyi]
-
-[case testMultipleAssignmentWithPartialDefinition3]
-from typing import Any
-a = None # type: A
-x, a = Any(a)
-x = a
-a = x
-x = object()
-a = object() # E: Incompatible types in assignment (expression has type "object", variable has type "A")
-class A: pass
-
-[case testInferGlobalDefinedInBlock]
-import typing
-if A:
- a = A()
- a = A()
- a = B() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-class A: pass
-class B: pass
-
-
--- Inferring attribute types
--- -------------------------
-
-
-[case testInferAttributeType]
-import typing
-class A:
- a = B()
-class B: pass
-
-A().a = B()
-A().a = A() # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-
-[case testInferAttributeTypeAndAssignInInit]
-import typing
-class A:
- a = B()
- def __init__(self) -> None:
- self.a = A() # E: Incompatible types in assignment (expression has type "A", variable has type "B")
- self.a = B()
-class B: pass
-[out]
-
-[case testInferAttributeInInit]
-import typing
-class B: pass
-class A:
- def __init__(self) -> None:
- self.a = A()
- self.b = B()
-a = A()
-a.a = A()
-a.b = B()
-a.a = B() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-a.b = A() # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-
-[case testInferAttributeInInitUsingChainedAssignment]
-import typing
-class B: pass
-class A:
- def __init__(self) -> None:
- self.a = self.b = A()
-a = A()
-a.a = A()
-a.b = A()
-a.a = B() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-a.b = B() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-
-
--- Lambdas
--- -------
-
-
-[case testInferLambdaType]
-from typing import List, Callable
-li = [1]
-l = lambda: li
-f1 = l # type: Callable[[], List[int]]
-f2 = l # type: Callable[[], List[str]] # E: Incompatible types in assignment (expression has type Callable[[], List[int]], variable has type Callable[[], List[str]])
-[builtins fixtures/list.pyi]
-
-[case testInferLambdaType2]
-from typing import List, Callable
-l = lambda: [B()]
-f1 = l # type: Callable[[], List[B]]
-f2 = l # type: Callable[[], List[A]] # E: Incompatible types in assignment (expression has type Callable[[], List[B]], variable has type Callable[[], List[A]])
-
-class A: pass
-class B: pass
-[builtins fixtures/list.pyi]
-
-[case testUninferableLambda]
-from typing import TypeVar, Callable
-X = TypeVar('X')
-def f(x: Callable[[X], X]) -> X: pass
-y = f(lambda x: x) # E: Cannot infer type argument 1 of "f"
-
-[case testUninferableLambdaWithTypeError]
-from typing import TypeVar, Callable
-X = TypeVar('X')
-def f(x: Callable[[X], X], y: str) -> X: pass
-y = f(lambda x: x, 1) # Fail
-[out]
-main:4: error: Cannot infer type argument 1 of "f"
-main:4: error: Argument 2 to "f" has incompatible type "int"; expected "str"
-
-[case testInferLambdaNone]
-from typing import Callable
-def f(x: Callable[[], None]) -> None: pass
-def g(x: Callable[[], int]) -> None: pass
-a = lambda: None
-f(a)
-g(a) # E: Argument 1 to "g" has incompatible type Callable[[], None]; expected Callable[[], int]
-b = lambda: None # type: Callable[[], None]
-f(b)
-g(b) # E: Argument 1 to "g" has incompatible type Callable[[], None]; expected Callable[[], int]
-
-
--- Boolean operators
--- -----------------
-
-
-[case testOrOperationWithGenericOperands]
-from typing import List
-a = None # type: List[A]
-o = None # type: List[object]
-a2 = a or []
-a = a2
-a2 = o # E: Incompatible types in assignment (expression has type List[object], variable has type List[A])
-class A: pass
-[builtins fixtures/list.pyi]
-
-
--- Accessing variable before its type has been inferred
--- ----------------------------------------------------
-
-
-[case testAccessGlobalVarBeforeItsTypeIsAvailable]
-import typing
-x.y # E: Cannot determine type of 'x'
-x = object()
-x.y # E: "object" has no attribute "y"
-
-[case testAccessDataAttributeBeforeItsTypeIsAvailable]
-
-a = None # type: A
-a.x.y # E: Cannot determine type of 'x'
-class A:
- def __init__(self) -> None:
- self.x = object()
-a.x.y # E: "object" has no attribute "y"
-
-
--- Ducktype declarations
--- ---------------------
-
-
-[case testListWithDucktypeCompatibility]
-from typing import List, _promote
-class A: pass
- at _promote(A)
-class B: pass
-a = None # type: List[A]
-x1 = [A(), B()]
-x2 = [B(), A()]
-x3 = [B(), B()]
-a = x1
-a = x2
-a = x3 # E: Incompatible types in assignment (expression has type List[B], variable has type List[A])
-[builtins fixtures/list.pyi]
-
-[case testListWithDucktypeCompatibilityAndTransitivity]
-from typing import List, _promote
-class A: pass
- at _promote(A)
-class B: pass
- at _promote(B)
-class C: pass
-a = None # type: List[A]
-x1 = [A(), C()]
-x2 = [C(), A()]
-x3 = [B(), C()]
-a = x1
-a = x2
-a = x3 # E: Incompatible types in assignment (expression has type List[B], variable has type List[A])
-[builtins fixtures/list.pyi]
-
-
--- Inferring type of variable when initialized to an empty collection
--- ------------------------------------------------------------------
-
-
-[case testInferListInitializedToEmpty]
-a = []
-a.append(1)
-a.append('') # E: Argument 1 to "append" of "list" has incompatible type "str"; expected "int"
-[builtins fixtures/list.pyi]
-[out]
-
-[case testInferListInitializedToEmptyUsingUpdate]
-a = []
-a.extend([''])
-a.append(0) # E: Argument 1 to "append" of "list" has incompatible type "int"; expected "str"
-[builtins fixtures/list.pyi]
-[out]
-
-[case testInferListInitializedToEmptyAndNotAnnotated]
-a = [] # E: Need type annotation for variable
-[builtins fixtures/list.pyi]
-[out]
-
-[case testInferListInitializedToEmptyAndReadBeforeAppend]
-a = [] # E: Need type annotation for variable
-if a: pass
-a.xyz
-a.append('')
-[builtins fixtures/list.pyi]
-[out]
-
-[case testInferListInitializedToEmptyAndIncompleteTypeInAppend]
-a = [] # E: Need type annotation for variable
-a.append([])
-a()
-[builtins fixtures/list.pyi]
-[out]
-
-[case testInferListInitializedToEmptyAndMultipleAssignment]
-a, b = [], []
-a.append(1)
-b.append('')
-a() # E: List[int] not callable
-b() # E: List[str] not callable
-[builtins fixtures/list.pyi]
-[out]
-
-[case testInferListInitializedToEmptyInFunction]
-def f() -> None:
- a = []
- a.append(1)
- a.append('') # E: Argument 1 to "append" of "list" has incompatible type "str"; expected "int"
-[builtins fixtures/list.pyi]
-[out]
-
-[case testInferListInitializedToEmptyAndNotAnnotatedInFunction]
-def f() -> None:
- a = [] # E: Need type annotation for variable
-
-def g() -> None: pass
-
-a = []
-a.append(1)
-[builtins fixtures/list.pyi]
-[out]
-
-[case testInferListInitializedToEmptyAndReadBeforeAppendInFunction]
-def f() -> None:
- a = [] # E: Need type annotation for variable
- if a: pass
- a.xyz
- a.append('')
-[builtins fixtures/list.pyi]
-[out]
-
-[case testInferListInitializedToEmptyInClassBody]
-class A:
- a = []
- a.append(1)
- a.append('') # E: Argument 1 to "append" of "list" has incompatible type "str"; expected "int"
-[builtins fixtures/list.pyi]
-[out]
-
-[case testInferListInitializedToEmptyAndNotAnnotatedInClassBody]
-class A:
- a = [] # E: Need type annotation for variable
-
-class B:
- a = []
- a.append(1)
-[builtins fixtures/list.pyi]
-[out]
-
-[case testInferListInitializedToEmptyInMethod]
-class A:
- def f(self) -> None:
- a = []
- a.append(1)
- a.append('') # E: Argument 1 to "append" of "list" has incompatible type "str"; expected "int"
-[builtins fixtures/list.pyi]
-[out]
-
-[case testInferListInitializedToEmptyAndNotAnnotatedInMethod]
-class A:
- def f(self) -> None:
- a = [] # E: Need type annotation for variable
-[builtins fixtures/list.pyi]
-[out]
-
-[case testInferListInitializedToEmptyInMethodViaAttribute]
-class A:
- def f(self) -> None:
- # Attributes aren't supported right now.
- self.a = [] # E: Need type annotation for variable
- self.a.append(1) # E: Cannot determine type of 'a'
- self.a.append('') # E: Cannot determine type of 'a'
-[builtins fixtures/list.pyi]
-[out]
-
-[case testInferSetInitializedToEmpty]
-a = set()
-a.add(1)
-a.add('') # E: Argument 1 to "add" of "set" has incompatible type "str"; expected "int"
-[builtins fixtures/set.pyi]
-[out]
-
-[case testInferSetInitializedToEmptyUsingDiscard]
-a = set()
-a.discard('')
-a.add(0) # E: Argument 1 to "add" of "set" has incompatible type "int"; expected "str"
-[builtins fixtures/set.pyi]
-[out]
-
-[case testInferSetInitializedToEmptyUsingUpdate]
-a = set()
-a.update({0})
-a.add('') # E: Argument 1 to "add" of "set" has incompatible type "str"; expected "int"
-[builtins fixtures/set.pyi]
-[out]
-
-[case testInferDictInitializedToEmpty]
-a = {}
-a[1] = ''
-a() # E: Dict[int, str] not callable
-[builtins fixtures/dict.pyi]
-[out]
-
-[case testInferDictInitializedToEmptyUsingUpdate]
-a = {}
-a.update({'': 42})
-a() # E: Dict[str, int] not callable
-[builtins fixtures/dict.pyi]
-[out]
-
-[case testInferDictInitializedToEmptyUsingUpdateError]
-a = {} # E: Need type annotation for variable
-a.update([1, 2])
-a()
-[builtins fixtures/dict.pyi]
-[out]
-
-[case testInferDictInitializedToEmptyAndIncompleteTypeInUpdate]
-a = {} # E: Need type annotation for variable
-a[1] = {}
-b = {} # E: Need type annotation for variable
-b[{}] = 1
-[builtins fixtures/dict.pyi]
-[out]
-
-[case testInferDictInitializedToEmptyAndUpdatedFromMethod]
-map = {}
-def add():
- map[1] = 2
-[builtins fixtures/dict.pyi]
-[out]
-
-[case testSpecialCaseEmptyListInitialization]
-def f(blocks: Any): # E: Name 'Any' is not defined
- to_process = [] # E: Need type annotation for variable
- to_process = list(blocks)
-[builtins fixtures/list.pyi]
-[out]
-
-[case testSpecialCaseEmptyListInitialization2]
-def f(blocks: object):
- to_process = [] # E: Need type annotation for variable
- to_process = list(blocks) # E: No overload variant of "list" matches argument types [builtins.object]
-[builtins fixtures/list.pyi]
-[out]
-
-
--- Inferring types of variables first initialized to None (partial types)
--- ----------------------------------------------------------------------
-
-
-[case testLocalVariablePartiallyInitializedToNone]
-def f() -> None:
- if object():
- x = None
- else:
- x = 1
- x() # E: "int" not callable
-[out]
-
-[case testLocalVariablePartiallyTwiceInitializedToNone]
-def f() -> None:
- if object():
- x = None
- elif object():
- x = None
- else:
- x = 1
- x() # E: "int" not callable
-[out]
-
-[case testLvarInitializedToNoneWithoutType]
-import typing
-def f() -> None:
- a = None # E: Need type annotation for variable
- a.x() # E: None has no attribute "x"
-[out]
-
-[case testGvarPartiallyInitializedToNone]
-x = None
-if object():
- x = 1
-x() # E: "int" not callable
-
-[case testPartiallyInitializedToNoneAndThenToPartialList]
-x = None
-if object():
- # Promote from partial None to partial list.
- x = []
- x.append(1)
-x.append('') # E: Argument 1 to "append" of "list" has incompatible type "str"; expected "int"
-[builtins fixtures/list.pyi]
-
-[case testPartiallyInitializedToNoneAndThenReadPartialList]
-x = None
-if object():
- # Promote from partial None to partial list.
- x = [] # E: Need type annotation for variable
- x
-[builtins fixtures/list.pyi]
-
-[case testPartiallyInitializedToNoneAndPartialListAndLeftPartial]
-def f() -> None:
- x = None
- if object():
- # Promote from partial None to partial list.
- x = [] # E: Need type annotation for variable
-[builtins fixtures/list.pyi]
-[out]
-
-[case testPartiallyInitializedToNoneAndThenToIncompleteType]
-from typing import TypeVar, Dict
-T = TypeVar('T')
-def f(*x: T) -> Dict[int, T]: pass
-x = None # E: Need type annotation for variable
-if object():
- x = f()
-[builtins fixtures/dict.pyi]
-
-[case testPartiallyInitializedVariableDoesNotEscapeScope1]
-def f() -> None:
- x = None # E: Need type annotation for variable
-x = 1
-[out]
-
-[case testPartiallyInitializedVariableDoesNotEscapeScope2]
-x = None # E: Need type annotation for variable
-def f() -> None:
- x = None
- x = 1
-x() # E: None not callable
-
-[case testAttributePartiallyInitializedToNone]
-class A:
- def f(self) -> None:
- self.x = None
- self.x = 1
- self.x() # E: "int" not callable
-[out]
-
-[case testAttributePartiallyInitializedToNoneWithMissingAnnotation]
-class A:
- def f(self) -> None:
- self.x = None
-
- def g(self) -> None:
- self.x = 1
- self.x()
-[out]
-main:3: error: Need type annotation for variable
-main:7: error: "int" not callable
-
-[case testGlobalInitializedToNoneSetFromFunction]
-a = None
-def f():
- global a
- a = 42
-[out]
-
-[case testGlobalInitializedToNoneSetFromMethod]
-a = None
-class C:
- def m(self):
- global a
- a = 42
-[out]
-
--- More partial type errors
--- ------------------------
-
-[case testPartialTypeErrorSpecialCase1]
-# This used to crash.
-class A:
- x = None
- def f(self) -> None:
- for a in self.x:
- pass
-[builtins fixtures/for.pyi]
-[out]
-main:3: error: Need type annotation for variable
-main:5: error: None has no attribute "__iter__"
-
-[case testPartialTypeErrorSpecialCase2]
-# This used to crash.
-class A:
- x = []
- def f(self) -> None:
- for a in self.x:
- pass
-[builtins fixtures/for.pyi]
-[out]
-main:3: error: Need type annotation for variable
-
-[case testPartialTypeErrorSpecialCase3]
-class A:
- x = None
- def f(self) -> None:
- for a in A.x:
- pass
-[builtins fixtures/for.pyi]
-[out]
-main:2: error: Need type annotation for variable
-main:4: error: None has no attribute "__iter__"
-
-
--- Multipass
--- ---------
-
-
-[case testMultipassAndAccessVariableBeforeDefinition]
-def f() -> None:
- y = x
- y() # E: "int" not callable
-x = 1
-[out]
-
-[case testMultipassAndAccessInstanceVariableBeforeDefinition]
-class A:
- def f(self) -> None:
- y = self.x
- y() # E: "int" not callable
-
- def g(self) -> None:
- self.x = 1
-[out]
-
-[case testMultipassAndTopLevelVariable]
-y = x # E: Cannot determine type of 'x'
-y()
-x = 1+0
-[out]
-
-[case testMultipassAndDecoratedMethod]
-from typing import Callable, TypeVar
-
-T = TypeVar('T')
-
-class A:
- def f(self) -> None:
- self.g() # E: Too few arguments for "g" of "A"
- self.g(1)
- @dec
- def g(self, x: str) -> None: pass
-
-def dec(f: Callable[[A, str], T]) -> Callable[[A, int], T]: pass
-[out]
-
-[case testMultipassAndDefineAttributeBasedOnNotReadyAttribute]
-class A:
- def f(self) -> None:
- self.y = self.x
-
- def g(self) -> None:
- self.x = 1
-
- def h(self) -> None:
- self.y() # E: "int" not callable
-[out]
-
-[case testMultipassAndDefineAttributeBasedOnNotReadyAttribute2]
-class A:
- def f(self) -> None:
- self.y = self.x
- self.z = self.y
- self.z() # E
- self.y() # E
-
- def g(self) -> None:
- self.x = 1
-
- def h(self) -> None:
- self.y() # E
-[out]
-main:5: error: "int" not callable
-main:6: error: "int" not callable
-main:12: error: "int" not callable
-
-[case testMultipassAndPartialTypes]
-def f() -> None:
- x = []
- y
- x.append(1)
- x.append('') # E: Argument 1 to "append" of "list" has incompatible type "str"; expected "int"
- x.append(y) # E: Argument 1 to "append" of "list" has incompatible type "str"; expected "int"
-y = ''
-[builtins fixtures/list.pyi]
-[out]
-
-[case testMultipassAndPartialTypes2]
-s = ''
-n = 0
-def f() -> None:
- global s, n
- x = []
- x.append(y)
- s = x[0]
- n = x[0] # E: Incompatible types in assignment (expression has type "str", variable has type "int")
- x.append(1) # E: Argument 1 to "append" of "list" has incompatible type "int"; expected "str"
-y = ''
-[builtins fixtures/list.pyi]
-[out]
-
-[case testMultipassAndPartialTypes3]
-from typing import Dict
-def g(d: Dict[str, int]) -> None: pass
-def f() -> None:
- x = {}
- x[1] = y
- g(x) # E: Argument 1 to "g" has incompatible type Dict[int, str]; expected Dict[str, int]
- x[1] = 1 # E: Incompatible types in assignment (expression has type "int", target has type "str")
- x[1] = ''
-y = ''
-[builtins fixtures/dict.pyi]
-[out]
-
-[case testMultipassAndPartialTypes4]
-from typing import Dict
-def g(d: Dict[str, int]) -> None: pass
-def f() -> None:
- x = {}
- y
- x[1] = 1
- g(x) # E: Argument 1 to "g" has incompatible type Dict[int, int]; expected Dict[str, int]
-y = ''
-[builtins fixtures/dict.pyi]
-[out]
-
-[case testMultipassAndCircularDependency]
-class A:
- def f(self) -> None:
- self.x = self.y # E: Cannot determine type of 'y'
-
- def g(self) -> None:
- self.y = self.x
-[out]
-
-[case testMultipassAndPartialTypesSpecialCase1]
-def f() -> None:
- y = o
- x = []
- x.append(y)
- x() # E: List[int] not callable
-o = 1
-[builtins fixtures/list.pyi]
-[out]
-
-[case testMultipassAndPartialTypesSpecialCase2]
-def f() -> None:
- y = o
- x = {}
- x[''] = y
- x() # E: Dict[str, int] not callable
-o = 1
-[builtins fixtures/dict.pyi]
-[out]
-
-[case testMultipassAndPartialTypesSpecialCase3]
-def f() -> None:
- x = {} # E: Need type annotation for variable
- y = o
- z = {} # E: Need type annotation for variable
-o = 1
-[builtins fixtures/dict.pyi]
-[out]
-
-[case testMultipassAndPartialTypesSpecialCase4]
-def f() -> None:
- y = o
- x = None
- x = y
- x() # E: "int" not callable
-o = 1
-[out]
-
-[case testMultipassAndPartialTypesSpecialCase5]
-def f() -> None:
- x = None
- y = o
- x = y
- x() # E: "int" not callable
-o = 1
-[out]
-
-[case testMultipassAndClassAttribute]
-class S:
- def foo(self) -> int:
- return R.X
-
-class R:
- X = 2
-
-[case testMultipassAndMultipleFiles]
-import m
-def f() -> None:
- x()
-x = 0
-[file m.py]
-def g() -> None:
- y()
-y = 0
-[out]
-tmp/m.py:2: error: "int" not callable
-main:3: error: "int" not callable
-
-
--- Tests for special cases of unification
--- --------------------------------------
-
-[case testUnificationRedundantUnion]
-from typing import Union
-a = None # type: Union[int, str]
-b = None # type: Union[str, tuple]
-def f(): pass
-def g(x: Union[int, str]): pass
-c = a if f() else b
-g(c) # E: Argument 1 to "g" has incompatible type "Union[int, str, tuple]"; expected "Union[int, str]"
-
-[case testUnificationMultipleInheritance]
-class A: pass
-class B:
- def foo(self): pass
-class C(A, B): pass
-def f(): pass
-a1 = B() if f() else C()
-a1.foo()
-a2 = C() if f() else B()
-a2.foo()
-
-[case testUnificationMultipleInheritanceAmbiguous]
-# Show that join_instances_via_supertype() breaks ties using the first base class.
-class A1: pass
-class B1:
- def foo1(self): pass
-class C1(A1, B1): pass
-
-class A2: pass
-class B2:
- def foo2(self): pass
-class C2(A2, B2): pass
-
-class D1(C1, C2): pass
-class D2(C2, C1): pass
-
-def f(): pass
-
-a1 = D1() if f() else D2()
-a1.foo1()
-a2 = D2() if f() else D1()
-a2.foo2()
-
-[case testUnificationEmptyListLeft]
-def f(): pass
-a = [] if f() else [0]
-a() # E: List[int] not callable
-[builtins fixtures/list.pyi]
-
-[case testUnificationEmptyListRight]
-def f(): pass
-a = [0] if f() else []
-a() # E: List[int] not callable
-[builtins fixtures/list.pyi]
-
-[case testUnificationEmptyListLeftInContext]
-from typing import List
-def f(): pass
-a = [] if f() else [0] # type: List[int]
-a() # E: List[int] not callable
-[builtins fixtures/list.pyi]
-
-[case testUnificationEmptyListRightInContext]
-# TODO Find an example that really needs the context
-from typing import List
-def f(): pass
-a = [0] if f() else [] # type: List[int]
-a() # E: List[int] not callable
-[builtins fixtures/list.pyi]
-
-[case testUnificationEmptySetLeft]
-def f(): pass
-a = set() if f() else {0}
-a() # E: Set[int] not callable
-[builtins fixtures/set.pyi]
-
-[case testUnificationEmptyDictLeft]
-def f(): pass
-a = {} if f() else {0: 0}
-a() # E: Dict[int, int] not callable
-[builtins fixtures/dict.pyi]
-
-[case testUnificationEmptyDictRight]
-def f(): pass
-a = {0: 0} if f() else {}
-a() # E: Dict[int, int] not callable
-[builtins fixtures/dict.pyi]
-
-[case testUnificationDictWithEmptyListLeft]
-def f(): pass
-a = {0: []} if f() else {0: [0]}
-a() # E: Dict[int, List[int]] not callable
-[builtins fixtures/dict.pyi]
-
-[case testUnificationDictWithEmptyListRight]
-def f(): pass
-a = {0: [0]} if f() else {0: []}
-a() # E: Dict[int, List[int]] not callable
-[builtins fixtures/dict.pyi]
-
-[case testMisguidedSetItem]
-from typing import Generic, Sequence, TypeVar
-T = TypeVar('T')
-class C(Sequence[T], Generic[T]): pass
-C[0] = 0
-[out]
-main:4: error: Type expected within [...]
-main:4: error: Unsupported target for indexed assignment
diff --git a/test-data/unit/check-isinstance.test b/test-data/unit/check-isinstance.test
deleted file mode 100644
index d6041cc..0000000
--- a/test-data/unit/check-isinstance.test
+++ /dev/null
@@ -1,1330 +0,0 @@
-[case testForcedAssignment]
-x = 1 # type: object
-y = 1
-y = x # E: Incompatible types in assignment (expression has type "object", variable has type "int")
-x = 2
-y = x
-[case testJoinAny]
-from typing import List, Any
-
-x = None # type: List[Any]
-
-def foo() -> List[int]: pass
-def bar() -> List[str]: pass
-
-if bool():
- x = foo()
-else:
- x = bar()
-
-x * 2
-[builtins fixtures/list.pyi]
-
-[case testGeneratorExpressionTypes]
-
-class A: y = 1
-x = [A()]
-y = [x]
-
-z = [1,2]
-z = [a.y for b in y for a in b]
-
-[builtins fixtures/list.pyi]
-
-[case testClassAttributeInitialization-skip]
-class A:
- x = None # type: int
- def __init__(self) -> None:
- self.y = None # type: int
- z = self.x
- w = self.y
-[case testAssignmentSubtypes-skip]
-from typing import Union
-
-def foo(x: Union[str, int]):
- if isinstance(x, int):
- x = 'a'
- x + 'a' # Works in the current code
- z = x # We probably want this to be of type str.
- y = [x] # But what type should this be?
- y[0] + 'a' # (1) Should this work?
- y + [1] # (2) Or this?
- z = 1 # Also, is this valid?
-
-x = None # type: int
-y = [x]
-[builtins fixtures/isinstancelist.pyi]
-[out]
-
-[case testFunctionDefaultArgs]
-
-class A: pass
-class B(A): y = 1
-
-x = A()
-
-def foo(x: A = B()):
- x.y # E: "A" has no attribute "y"
-[builtins fixtures/isinstance.pyi]
-[out]
-
-[case testIsinstanceFancyConditionals]
-
-class A: pass
-class B(A): y = 1
-
-x = A()
-
-if isinstance(x, B):
- x.y
-
-while isinstance(x, B):
- x.y
-
-while isinstance(x, B):
- x.y
- x = B()
-
-[builtins fixtures/isinstance.pyi]
-
-
-[case testSubtypingWithAny]
-
-class A: y = 1
-class B(A): z = 1
-
-def foo(): pass
-
-x = A()
-x = B()
-x.z
-x = foo()
-x.z # E: "A" has no attribute "z"
-x.y
-
-[case testSingleMultiAssignment-skip]
-
-x = 'a'
-(x, ) = ('a',)
-
-[case testUnionMultiAssignment]
-from typing import Union
-
-x = None # type: Union[int, str]
-x = 1
-x = 'a'
-x + 1 # E: Unsupported operand types for + ("str" and "int")
-x = 1
-(x, y) = ('a', 1)
-x + 1 # E: Unsupported operand types for + ("str" and "int")
-
-[builtins fixtures/isinstancelist.pyi]
-
-[case testUnionIfZigzag]
-from typing import Union
-
-def f(x: Union[int, str]) -> None:
- x = 1
- if x:
- x = 'a'
- x = 1
- x + 1
-[builtins fixtures/isinstancelist.pyi]
-
-
-[case testTwoLoopsUnion]
-from typing import Union
-
-def foo() -> Union[int, str]: pass
-
-def bar() -> None:
- x = foo()
- if isinstance(x, int):
- return
- while bool():
- x + 'a'
- while bool():
- x = foo()
- if bool():
- return
- x = 'a'
- x + 'a'
-
-[builtins fixtures/isinstancelist.pyi]
-
-[case testComplicatedBlocks]
-from typing import Union
-
-def foo() -> Union[int, str]: pass
-
-def bar() -> None:
- x = foo()
- if isinstance(x, int):
- return
- while bool():
- x + 'a'
- while bool():
- x = foo()
- if bool():
- return
- x = 'a'
- x + 'a'
-
- x = foo()
- if isinstance(x, int):
- return
- while bool():
- x + 'a'
- while bool():
- x + 'a' # E: Unsupported operand types for + (likely involving Union)
- x = foo()
- if bool():
- continue
- x = 'a'
- x = 'a'
- x + 'a'
-[builtins fixtures/isinstancelist.pyi]
-[out]
-
-[case testUnionTryExcept]
-
-class A: y = A()
-class B(A): z = 1
-
-x = A()
-x = B()
-x.z
-try:
- x.z
- x = A()
- x = B()
- x.z
-except:
- pass
-x.z # E: "A" has no attribute "z"
-
-
-[case testUnionTryExcept2]
-
-class A: y = A()
-class B(A): z = 1
-
-x = A()
-try:
- x.z # E: "A" has no attribute "z"
- x = A()
- x = B()
- x.z
-except:
- x.z # E: "A" has no attribute "z"
- x = B()
- x.z
-else:
- x = B()
-x.z
-
-[case testUnionTryExcept3]
-class A: y = A()
-class B(A): z = 1
-x = A()
-x = B()
-try:
- raise BaseException()
- x = A()
-except:
- pass
-x.z
-x = B()
-try:
- x = A()
- raise BaseException()
-except:
- pass
-x.z # E: "A" has no attribute "z"
-x = B()
-try:
- pass
-except:
- x = A()
- raise BaseException()
-x.z
-try:
- x = A()
-except:
- pass
-x.z # E: "A" has no attribute "z"
-x = B()
-try:
- pass
-except:
- x = A()
-x.z # E: "A" has no attribute "z"
-[builtins fixtures/exception.pyi]
-[case testUnionTryExcept4]
-
-class A: pass
-class B(A): z = 1
-
-x = A()
-while bool():
- try:
- x.z # E: "A" has no attribute "z"
- x = A()
- except:
- x = B()
- else:
- x = B()
- x.z
-[builtins fixtures/exception.pyi]
-[case testUnionTryFinally]
-class A: pass
-class B(A): b = 1
-
-x = A()
-x = B()
-try:
- x = A()
- x.b # E: "A" has no attribute "b"
- x = B()
-finally:
- x.b # E: "A" has no attribute "b"
-x.b
-[case testUnionTryFinally2]
-class A: pass
-class B(A): b = 1
-
-x = A()
-x = B()
-try:
- x = A()
- x = B()
-except:
- pass
-finally:
- pass
-x.b # E: "A" has no attribute "b"
-[case testUnionTryFinally3]
-class A: pass
-class B(A): b = 1
-
-x = A()
-x = B()
-try:
- x = A()
- x = B()
-except:
- pass
-finally:
- x = B()
-x.b
-[case testUnionTryFinally4]
-class A: pass
-class B(A): b = 1
-
-while 2:
- x = A()
- x = B()
- try:
- x = A()
- x = B()
- except:
- pass
- finally:
- x.b # E: "A" has no attribute "b"
- if not isinstance(x, B):
- break
- x.b
-[builtins fixtures/isinstancelist.pyi]
-[case testUnionTryFinally5]
-class A: pass
-class B(A): b = 1
-
-while 2:
- x = A()
- try:
- x = A()
- x = B()
- finally:
- x.b # E: "A" has no attribute "b"
- break
- x.b
- x.b
-[case testUnionTryFinally6]
-class A: pass
-class B(A): b = 1
-
-def f() -> int:
- x = B() # type: A
- try:
- x = B()
- except:
- x = A()
- # An exception could occur here
- x = B()
- finally:
- return x.b # E: "A" has no attribute "b"
-[out]
-[case testUnionListIsinstance]
-
-from typing import Union, List
-
-class A: y = A()
-class B(A): z = C()
-
-class C: pass
-class D(C): d = 1
-
-
-def f(x: Union[List[int], List[str], int]) -> None:
- if isinstance(x, list):
- a = x[0]
- if isinstance(a, int):
- a + 1
- a + 'x' # E: Unsupported operand types for + ("int" and "str")
-
- # type of a?
- x + 1 # E: Unsupported operand types for + (likely involving Union)
- else:
- x[0] # E: Value of type "int" is not indexable
- x + 1
- x[0] # E: Value of type "Union[List[int], List[str], int]" is not indexable
- x + 1 # E: Unsupported operand types for + (likely involving Union)
-[builtins fixtures/isinstancelist.pyi]
-[out]
-
-[case testUnionListIsinstance2]
-
-from typing import Union, List
-class A: a = 1
-class B: pass
-class C: pass
-
-def g(x: Union[A, B]) -> A: pass
-def h(x: C) -> A: pass
-
-def f(x: Union[A, B, C]) -> None:
- if isinstance(x, C):
- x = h(x)
- else:
- x = g(x)
- x.a
-[builtins fixtures/isinstancelist.pyi]
-
-[case testUnionStrictDefnBasic]
-from typing import Union
-
-def foo() -> Union[int, str]: pass
-
-x = foo()
-x = 1
-x = x + 1
-x = foo()
-x = x + 1 # E: Unsupported operand types for + (likely involving Union)
-if isinstance(x, str):
- x = x + 1 # E: Unsupported operand types for + ("str" and "int")
- x = 1
- x = x + 1
-
-[builtins fixtures/isinstancelist.pyi]
-
-[case testSubtypeRedefinitionBasic]
-from typing import Union
-
-class A: pass
-class B(A): y = 1
-
-x = A()
-x.y # E: "A" has no attribute "y"
-x = B()
-x.y # OK: x is known to be a B
-
-[builtins fixtures/isinstancelist.pyi]
-
-[case testIsInstanceBasic]
-from typing import Union
-
-x = None # type: Union[int, str]
-
-if isinstance(x, str):
- x = x + 1 # E: Unsupported operand types for + ("str" and "int")
- x = x + 'a'
-else:
- x = x + 'a' # E: Unsupported operand types for + ("int" and "str")
- x = x + 1
-[builtins fixtures/isinstancelist.pyi]
-
-[case testIsInstanceIndexing]
-from typing import Union
-
-x = None # type: Union[int, str]
-j = [x]
-
-if isinstance(j[0], str):
- j[0] = j[0] + 'a'
- j[0] = j[0] + 1 # E: Unsupported operand types for + ("str" and "int")
-else:
- j[0] = j[0] + 'a' # E: Unsupported operand types for + ("int" and "str")
- j[0] = j[0] + 1
-[builtins fixtures/isinstancelist.pyi]
-
-[case testIsInstanceSubClassMember]
-from typing import Union
-
-class Animal:
- pass
-
-class Dog(Animal):
- paws = 4 # type: Union[int, str]
-
- def bark(self): pass
-
-class House:
- pet = None # type: Animal
-
-h = House()
-h.pet = Dog()
-
-while bool():
- if isinstance(h.pet, Dog):
- if isinstance(h.pet.paws, str):
- x = h.pet.paws + 'a'
- y = h.pet.paws + 1 # E: Unsupported operand types for + (likely involving Union)
- z = h.pet.paws + 'a' # E: Unsupported operand types for + (likely involving Union)
- if isinstance(h.pet.paws, str):
- x = h.pet.paws + 'a'
- break
- y = h.pet.paws + 1
- z = h.pet.paws + 'a' # E: Unsupported operand types for + ("int" and "str")
-[builtins fixtures/isinstancelist.pyi]
-[case testIsInstanceSubClassReset]
-class A: pass
-class B(A): b=1
-
-class C:
- a = A()
-
-x = C()
-x.a.b # E: "A" has no attribute "b"
-if isinstance(x.a, B):
- x.a.b
- x = C()
- x.a.b # E: "A" has no attribute "b"
-[builtins fixtures/isinstance.pyi]
-[case testIsinstanceTuple]
-from typing import Union
-
-class A:
- pass
-
-class B:
- def method2(self, arg: int):
- return 123
-
-class C:
- def method2(self, arg: int):
- return 456
-
- def method3(self, arg: str):
- return 'abc'
-
-v = A() # type: Union[A, B, C]
-
-if isinstance(v, (B, C)):
- v.method2(123)
- v.method3('xyz') # E: Some element of union has no attribute "method3"
-[builtins fixtures/isinstance.pyi]
-
-[case testMemberAssignmentChanges-skip]
-from typing import Union
-
-class Dog:
- paws = 1 # type: Union[int, str]
-
-pet = Dog()
-
-pet.paws + 'a' # E: moo
-pet.paws = 'a'
-pet.paws + 'a'
-pet.paws = 1
-pet.paws + 1
-
-[builtins fixtures/isinstancelist.pyi]
-
-[case testIsInstanceSubClassMemberHard-skip]
-from typing import Union
-
-class Animal:
- pass
-
-class Dog(Animal):
- paws = 4 # type: Union[int, str]
-
- def bark(self): pass
-
-class House:
- pet = None # type: Animal
-
-h = House()
-h.pet = Dog()
-
-if isinstance(h.pet, Dog):
- if isinstance(h.pet.paws, str):
- for i in [1]:
- h.pet.paws + 'a'
- if bool():
- break
- h.pet.paws = 1
- h.pet.paws + 1
-
- if isinstance(h.pet.paws, str):
- h.pet.paws + 'a'
- else:
- h.pet.paws + 1
-
-[builtins fixtures/isinstancelist.pyi]
-
-[case testIsInstanceReturn]
-from typing import Union
-
-def foo() -> None:
- x = 1 # type: Union[int, str]
- if isinstance(x, int):
- return
- y = x + 'asdad'
-
-def bar() -> None:
- x = 1 # type: Union[int, str]
- if isinstance(x, int):
- return
- else:
- pass
- y = x + 'asdad'
-
-foo()
-[builtins fixtures/isinstancelist.pyi]
-[case testIsInstanceBadBreak]
-from typing import Union
-
-def foo() -> None:
- x = None # type: Union[int, str]
- if isinstance(x, int):
- for z in [1,2]:
- break
- else:
- pass
- y = x + 'asdad' # E: Unsupported operand types for + (likely involving Union)
-
-foo()
-[builtins fixtures/isinstancelist.pyi]
-[out]
-[case testIsInstanceThreeUnion]
-from typing import Union, List
-
-x = None # type: Union[int, str, List[int]]
-
-while bool():
- if isinstance(x, int):
- x + 1
- elif isinstance(x, str):
- x + 'a'
- else:
- x + [1]
- x + 'a' # E: Unsupported operand types for + (likely involving Union)
-x + [1] # E: Unsupported operand types for + (likely involving Union)
-
-[builtins fixtures/isinstancelist.pyi]
-[case testIsInstanceThreeUnion2]
-from typing import Union, List
-
-x = None # type: Union[int, str, List[int]]
-
-while bool():
- if isinstance(x, int):
- x + 1
- break
- elif isinstance(x, str):
- x + 'a'
- break
- x + [1]
- x + 'a' # E: Unsupported operand types for + ("list" and "str")
-x + [1] # E: Unsupported operand types for + (likely involving Union)
-
-[builtins fixtures/isinstancelist.pyi]
-
-[case testIsInstanceThreeUnion3]
-from typing import Union, List
-
-while bool():
- x = None # type: Union[int, str, List[int]]
- x = 1
- if isinstance(x, int):
- x + 1
- break
- elif isinstance(x, str):
- x + 'a'
- break
- x + [1] # These lines aren't reached because x was an int
- x + 'a'
-x + [1] # E: Unsupported operand types for + (likely involving Union)
-
-[builtins fixtures/isinstancelist.pyi]
-
-[case testRemovingTypeRepeatedly]
-from typing import Union
-
-def foo() -> Union[int, str]: pass
-
-for i in [1, 2]:
- x = foo()
- x + 'a' # E: Unsupported operand types for + (likely involving Union)
- if isinstance(x, int):
- break
- x + 'a'
-
- x = foo()
- x + 'a' # E: Unsupported operand types for + (likely involving Union)
- if isinstance(x, int):
- break
- x + 'a'
-
- x = foo()
- x + 'a' # E: Unsupported operand types for + (likely involving Union)
- if isinstance(x, int):
- break
- x + 'a'
-
-x + 'a' # E: Unsupported operand types for + (likely involving Union)
-
-[builtins fixtures/isinstancelist.pyi]
-
-
-
-[case testModifyRepeatedly]
-from typing import Union
-
-def foo() -> Union[int, str]: pass
-
-x = foo()
-x + 1 # E: Unsupported operand types for + (likely involving Union)
-x + 'a' # E: Unsupported operand types for + (likely involving Union)
-
-x = 1
-x + 1
-x + 'a' # E: Unsupported operand types for + ("int" and "str")
-
-x = 'a'
-x + 1 # E: Unsupported operand types for + ("str" and "int")
-x + 'a'
-
-x = foo()
-x + 1 # E: Unsupported operand types for + (likely involving Union)
-x + 'a' # E: Unsupported operand types for + (likely involving Union)
-
-[builtins fixtures/isinstancelist.pyi]
-
-[case testModifyLoop]
-from typing import Union
-
-def foo() -> Union[int, str]: pass
-
-x = foo()
-x + 1 # E: Unsupported operand types for + (likely involving Union)
-x = 'a'
-x + 1 # E: Unsupported operand types for + ("str" and "int")
-x = 1
-x + 1
-
-while bool():
- x + 1 # E: Unsupported operand types for + (likely involving Union)
- x = 'a'
-[builtins fixtures/isinstancelist.pyi]
-
-[case testModifyLoop2]
-from typing import Union
-
-def foo() -> Union[int, str]: pass
-
-x = foo()
-x + 1 # E: Unsupported operand types for + (likely involving Union)
-x = 'a'
-x + 1 # E: Unsupported operand types for + ("str" and "int")
-x = 1
-x + 1
-
-for i in [1]:
- x = 'a'
-
-x + 1 # E: Unsupported operand types for + (likely involving Union)
-
-[builtins fixtures/isinstancelist.pyi]
-
-
-[case testModifyLoop3]
-from typing import Union
-
-def foo() -> Union[int, str]: pass
-
-x = foo()
-x = 1
-
-while bool():
- x + 1
- x = 'a'
- break
-else:
- x + 1
-x + 1 # E: Unsupported operand types for + (likely involving Union)
-x = 1
-for y in [1]:
- x + 1
- x = 'a'
- break
-else:
- x + 1
-x + 1 # E: Unsupported operand types for + (likely involving Union)
-[builtins fixtures/isinstancelist.pyi]
-
-[case testModifyLoopWhile4]
-from typing import Union
-
-def foo() -> Union[int, str]: pass
-
-x = foo()
-x = 1
-
-while bool():
- x + 1
- if bool():
- x = 'a'
- break
-else:
- x + 1
- x = 'a'
-x + 'a'
-x = 1
-while bool():
- x + 1 # E: Unsupported operand types for + (likely involving Union)
- if bool():
- x = 'a'
- continue
-else:
- x + 1 # E: Unsupported operand types for + (likely involving Union)
- x = 'a'
-x + 'a'
-[builtins fixtures/isinstancelist.pyi]
-[case testModifyLoopFor4]
-from typing import Union
-
-def foo() -> Union[int, str]: pass
-
-x = foo()
-x = 1
-
-for y in [1]:
- x + 1
- if bool():
- x = 'a'
- break
-else:
- x + 1
- x = 'a'
-x + 'a'
-x = 1
-for y in [1]:
- x + 1 # E: Unsupported operand types for + (likely involving Union)
- if bool():
- x = 'a'
- continue
-else:
- x + 1 # E: Unsupported operand types for + (likely involving Union)
- x = 'a'
-x + 'a'
-[builtins fixtures/isinstancelist.pyi]
-[case testModifyNestedLoop]
-from typing import Union
-
-def foo() -> Union[int, str]: pass
-
-x = foo()
-x = 1
-
-for y in [1]:
- for z in [1]:
- break
- else:
- x = 'a'
- break
-else:
- x + 1
-x + 1 # E: Unsupported operand types for + (likely involving Union)
-x = 1
-while bool():
- while bool():
- break
- else:
- x = 'a'
- break
-else:
- x + 1
-x + 1 # E: Unsupported operand types for + (likely involving Union)
-[builtins fixtures/isinstancelist.pyi]
-
-[case testModifyLoopLong]
-from typing import Union
-
-class A: a = 1
-
-def foo() -> Union[int, str, A]: pass
-
-def bar() -> None:
- x = foo()
- x + 1 # E: Unsupported left operand type for + (some union)
- if isinstance(x, A):
- x.a
- else:
- if isinstance(x, int):
- x + 1
- x + 'a' # E: Unsupported operand types for + ("int" and "str")
- else:
- x + 'a'
- x.a # E: "str" has no attribute "a"
- x = A()
-
- if isinstance(x, str):
- x + 'a'
- else:
- while bool():
- if isinstance(x, int):
- x + 1
- else:
- x.a
- break
- while bool():
- if isinstance(x, int):
- x + 1
- else:
- x.a
- continue
-
- #for i in [1]:
- while bool():
- if isinstance(x, int):
- x + 1
- else:
- x.a # E: Some element of union has no attribute "a"
- x = 'a'
-
-[builtins fixtures/isinstancelist.pyi]
-[out]
-
-[case testWhileExitCondition1]
-from typing import Union
-x = 1 # type: Union[int, str]
-while isinstance(x, int):
- if bool():
- continue
- x = 'a'
-else:
- reveal_type(x) # E: Revealed type is 'builtins.str'
-reveal_type(x) # E: Revealed type is 'builtins.str'
-[builtins fixtures/isinstance.pyi]
-
-[case testWhileExitCondition2]
-from typing import Union
-x = 1 # type: Union[int, str]
-while isinstance(x, int):
- if bool():
- break
- x = 'a'
-else:
- reveal_type(x) # E: Revealed type is 'builtins.str'
-reveal_type(x) # E: Revealed type is 'Union[builtins.int, builtins.str]'
-[builtins fixtures/isinstance.pyi]
-
-[case testWhileLinkedList]
-from typing import Union
-LinkedList = Union['Cons', 'Nil']
-class Nil: pass
-class Cons:
- tail = None # type: LinkedList
-def last(x: LinkedList) -> Nil:
- while isinstance(x, Cons):
- x = x.tail
- return x
-[builtins fixtures/isinstance.pyi]
-
-[case testReturnAndFlow]
-def foo() -> int:
- return 1 and 2
- return 'a'
-[case testCastIsinstance]
-from typing import Union
-
-def foo() -> Union[int, str]: pass
-
-x = foo()
-y = 1 # type: int
-
-if isinstance(x, str):
- x = y
-x + 1
-x + 'a' # E: Unsupported operand types for + ("int" and "str")
-
-[builtins fixtures/isinstancelist.pyi]
-
-
-[case testUnreachableCode]
-x = 1 # type: int
-
-while bool():
- x = 'a' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
- break
- x = 'a' # Note: no error because unreachable code
-[builtins fixtures/isinstancelist.pyi]
-
-[case testUnreachableCode2]
-x = 1
-while bool():
- try:
- pass
- except:
- continue
- else:
- continue
- x + 'a'
-[builtins fixtures/isinstance.pyi]
-
-[case testUnreachableWhileTrue]
-def f(x: int) -> None:
- while True:
- if x:
- return
- 1()
-[builtins fixtures/bool.pyi]
-
-[case testUnreachableAssertFalse]
-def f() -> None:
- assert False
- 1()
-[builtins fixtures/bool.pyi]
-
-[case testUnreachableAssertFalse2]
-# flags: --fast-parser
-def f() -> None:
- # The old parser doesn't understand the syntax below
- assert False, "hi"
- 1()
-[builtins fixtures/bool.pyi]
-
-[case testUnreachableReturnOrAssertFalse]
-def f(x: int) -> int:
- if x:
- return x
- else:
- assert False
- 1()
-[builtins fixtures/bool.pyi]
-
-[case testUnreachableTryExcept]
-def f() -> None:
- try:
- f()
- return
- except BaseException:
- return
- 1()
-[builtins fixtures/exception.pyi]
-
-[case testUnreachableTryExceptElse]
-def f() -> None:
- try:
- f()
- except BaseException:
- return
- else:
- return
- 1()
-[builtins fixtures/exception.pyi]
-
-[case testUnreachableTryReturnFinally1]
-def f() -> None:
- try:
- return
- finally:
- pass
- 1()
-
-[case testUnreachableTryReturnFinally2]
-def f() -> None:
- try:
- pass
- finally:
- return
- 1()
-
-[case testUnreachableTryReturnExceptRaise]
-def f() -> None:
- try:
- return
- except:
- raise
- 1()
-
-[case testUnreachableReturnLambda]
-from typing import Callable
-def g(t: Callable[[int], int]) -> int: pass
-def f() -> int:
- return g(lambda x: x)
- 1()
-
-[case testIsinstanceAnd]
-class A:
- pass
-
-class B(A):
- flag = 1
-
-x = B() # type: A
-
-if isinstance(x, B) and 1:
- x.flag
-[builtins fixtures/isinstancelist.pyi]
-[case testIsinstanceShortcircuit]
-class A:
- pass
-
-class B(A):
- flag = 1
-
-x = B() # type: A
-
-if isinstance(x, B) and x.flag:
- pass
-if isinstance(x, B) or x.flag: # E: "A" has no attribute "flag"
- pass
-if not isinstance(x, B) or x.flag:
- pass
-if not isinstance(x, B) and x.flag: # E: "A" has no attribute "flag"
- pass
-[builtins fixtures/isinstancelist.pyi]
-[case testIsinstanceExpression]
-class A:
- pass
-
-class B(A):
- flag = 1
-
-x = B() # type: A
-
-x.flag if isinstance(x, B) else 0
-0 if not isinstance(x, B) else x.flag
-0 if isinstance(x, B) else x.flag # E: "A" has no attribute "flag"
-[builtins fixtures/isinstancelist.pyi]
-
-[case testIsinstanceMultiAnd]
-class A:
- pass
-
-class B(A):
- flag = 1
-
-class C(A):
- glaf = 1
-
-x = B() # type: A
-y = C() # type: A
-
-if isinstance(x, B) and isinstance(y, C):
- x.flag += 1
- y.glaf += 1
- x() # E: "B" not callable
- y() # E: "C" not callable
-else:
- x() # E: "A" not callable
- y() # E: "A" not callable
-[builtins fixtures/isinstancelist.pyi]
-
-[case testIsinstanceMultiAndSpecialCase]
-class A:
- pass
-
-class B(A):
- flag = 1
-
-class C(A):
- glaf = 1
-
-x = B() # type: A
-y = C() # type: A
-
-if isinstance(x, B) and isinstance(y, int):
- 1() # type checking skipped
-if isinstance(y, int) and isinstance(x, B):
- 1() # type checking skipped
-[builtins fixtures/isinstancelist.pyi]
-
-[case testReturnWithCallExprAndIsinstance]
-
-from typing import Union
-def f(x: Union[int, str]) -> None:
- if not isinstance(x, int):
- return foo()
- x() # E: "int" not callable
-def foo(): pass
-[builtins fixtures/isinstancelist.pyi]
-[out]
-
-[case testIsinstanceOr1]
-from typing import Optional
-def f(a: bool, x: object) -> Optional[int]:
- if a or not isinstance(x, int):
- return None
- reveal_type(x) # E: Revealed type is 'builtins.int'
- return x
-[builtins fixtures/isinstance.pyi]
-[out]
-
-[case testIsinstanceOr2]
-from typing import Optional
-def g(a: bool, x: object) -> Optional[int]:
- if not isinstance(x, int) or a:
- return None
- reveal_type(x) # E: Revealed type is 'builtins.int'
- return x
-[builtins fixtures/isinstance.pyi]
-[out]
-
-[case testIsinstanceOr3]
-from typing import Optional
-def h(a: bool, x: object) -> Optional[int]:
- if a or isinstance(x, int):
- return None
- return x # E: Incompatible return value type (got "object", expected "int")
-[builtins fixtures/isinstance.pyi]
-[out]
-
-[case testIsinstanceWithOverlappingUnionType]
-from typing import Union
-def f(x: Union[float, int]) -> None:
- if isinstance(x, float):
- pass
- if not isinstance(x, int):
- f(x)
-[builtins fixtures/isinstance.pyi]
-
-[case testIsinstanceWithOverlappingUnionType2]
-from typing import Union
-class A: pass
-class B(A): pass
-def f(x: Union[A, B]) -> None:
- if isinstance(x, A):
- pass
- if not isinstance(x, B):
- f(x)
-[builtins fixtures/isinstance.pyi]
-
-[case testIsinstanceOfSuperclass]
-class A: pass
-class B(A): pass
-x = B()
-if isinstance(x, A):
- reveal_type(x) # E: Revealed type is '__main__.B'
-if not isinstance(x, A):
- reveal_type(x) # unreachable
- x = A()
-reveal_type(x) # E: Revealed type is '__main__.B'
-[builtins fixtures/isinstance.pyi]
-
-[case testIsinstanceOfNonoverlapping]
-class A: pass
-class B: pass
-x = B()
-if isinstance(x, A):
- reveal_type(x) # unreachable
-else:
- reveal_type(x) # E: Revealed type is '__main__.B'
-[builtins fixtures/isinstance.pyi]
-
-[case testAssertIsinstance]
-def f(x: object):
- assert isinstance(x, int)
- y = 0 # type: int
- y = x
-[builtins fixtures/isinstance.pyi]
-
-[case testUnionAssertIsinstance]
-from typing import Union
-def f(x: Union[str, int]):
- assert isinstance(x, int)
- y = 0 # type: int
- y = x
-[builtins fixtures/isinstance.pyi]
-
-[case testAnyAssertIsinstance]
-from typing import Any
-def f(x: Any):
- assert isinstance(x, int) # this should narrow x to type int
- x + "foo" # E: Unsupported operand types for + ("int" and "str")
-[builtins fixtures/isinstance.pyi]
-[out]
-
-[case testIsinstanceOfGenericClassRetainsParameters]
-from typing import List, Union
-def f(x: Union[List[int], str]) -> None:
- if isinstance(x, list):
- x[0]()
-[builtins fixtures/isinstancelist.pyi]
-[out]
-main:4: error: "int" not callable
-
-[case testIsinstanceOrIsinstance]
-class A: pass
-class B(A):
- flag = 1
-class C(A):
- flag = 2
-x1 = A()
-if isinstance(x1, B) or isinstance(x1, C):
- reveal_type(x1) # E: Revealed type is 'Union[__main__.B, __main__.C]'
- f = x1.flag # type: int
-else:
- reveal_type(x1) # E: Revealed type is '__main__.A'
- f = 0
-x2 = A()
-if isinstance(x2, A) or isinstance(x2, C):
- reveal_type(x2) # E: Revealed type is '__main__.A'
- f = x2.flag # E: "A" has no attribute "flag"
-else:
- # unreachable
- 1()
-[builtins fixtures/isinstance.pyi]
-[out]
-[case testComprehensionIsInstance]
-from typing import List, Union
-a = [] # type: List[Union[int, str]]
-l = [x for x in a if isinstance(x, int)]
-g = (x for x in a if isinstance(x, int))
-d = {0: x for x in a if isinstance(x, int)}
-reveal_type(l) # E: Revealed type is 'builtins.list[builtins.int*]'
-reveal_type(g) # E: Revealed type is 'typing.Iterator[builtins.int*]'
-reveal_type(d) # E: Revealed type is 'builtins.dict[builtins.int*, builtins.int*]'
-[builtins fixtures/isinstancelist.pyi]
-
-[case testIsinstanceInWrongOrderInBooleanOp]
-class A:
- m = 1
-def f(x: object) -> None:
- if x.m and isinstance(x, A) or False: # E: "object" has no attribute "m"
- pass
-[builtins fixtures/isinstance.pyi]
-[out]
-
-[case testIsinstanceAndOr]
-class A:
- a = None # type: A
-
-def f(x: object) -> None:
- b = isinstance(x, A) and x.a or A()
- reveal_type(b) # E: Revealed type is '__main__.A'
-[builtins fixtures/isinstance.pyi]
-[out]
diff --git a/test-data/unit/check-kwargs.test b/test-data/unit/check-kwargs.test
deleted file mode 100644
index ac8f388..0000000
--- a/test-data/unit/check-kwargs.test
+++ /dev/null
@@ -1,339 +0,0 @@
--- Test cases for keyword arguments.
-
-
-[case testTypeErrorInKeywordArgument]
-import typing
-def f(o: object) -> None: pass
-f(o=None()) # E: None not callable
-
-[case testSimpleKeywordArgument]
-import typing
-def f(a: 'A') -> None: pass
-f(a=A())
-f(a=object()) # E: Argument 1 to "f" has incompatible type "object"; expected "A"
-class A: pass
-
-[case testTwoKeywordArgumentsNotInOrder]
-import typing
-def f(a: 'A', b: 'B') -> None: pass
-f(b=A(), a=A()) # E: Argument 1 to "f" has incompatible type "A"; expected "B"
-f(b=B(), a=B()) # E: Argument 2 to "f" has incompatible type "B"; expected "A"
-f(a=A(), b=B())
-f(b=B(), a=A())
-class A: pass
-class B: pass
-
-[case testOneOfSeveralOptionalKeywordArguments]
-import typing
-def f(a: 'A' = None, b: 'B' = None, c: 'C' = None) -> None: pass
-f(a=A())
-f(b=B())
-f(c=C())
-f(b=B(), c=C())
-f(a=B()) # E: Argument 1 to "f" has incompatible type "B"; expected "A"
-f(b=A()) # E: Argument 1 to "f" has incompatible type "A"; expected "B"
-f(c=B()) # E: Argument 1 to "f" has incompatible type "B"; expected "C"
-f(b=B(), c=A()) # E: Argument 2 to "f" has incompatible type "A"; expected "C"
-class A: pass
-class B: pass
-class C: pass
-
-[case testBothPositionalAndKeywordArguments]
-import typing
-def f(a: 'A', b: 'B') -> None: pass
-f(A(), b=A()) # E: Argument 2 to "f" has incompatible type "A"; expected "B"
-f(A(), b=B())
-class A: pass
-class B: pass
-
-[case testContextSensitiveTypeInferenceForKeywordArg]
-from typing import List
-def f(a: 'A', b: 'List[A]') -> None: pass
-f(b=[], a=A())
-class A: pass
-[builtins fixtures/list.pyi]
-
-[case testGivingSameKeywordArgumentTwice]
-import typing
-def f(a: 'A', b: 'B') -> None: pass
-f(a=A(), b=B(), a=A()) # E: keyword argument repeated
-class A: pass
-class B: pass
-
-[case testGivingArgumentAsPositionalAndKeywordArg]
-import typing
-def f(a: 'A', b: 'B' = None) -> None: pass
-f(A(), a=A()) # E: "f" gets multiple values for keyword argument "a"
-class A: pass
-class B: pass
-
-[case testGivingArgumentAsPositionalAndKeywordArg2]
-import typing
-def f(a: 'A' = None, b: 'B' = None) -> None: pass
-f(A(), a=A()) # E: "f" gets multiple values for keyword argument "a"
-class A: pass
-class B: pass
-
-[case testPositionalAndKeywordForSameArg]
-# This used to crash in check_argument_count(). See #1095.
-def f(a: int): pass
-def g(): f(0, a=1)
-[out]
-
-[case testInvalidKeywordArgument]
-import typing
-def f(a: 'A') -> None: pass # N: "f" defined here
-f(b=object()) # E: Unexpected keyword argument "b" for "f"
-class A: pass
-
-[case testKeywordArgumentsWithDynamicallyTypedCallable]
-from typing import Any
-f = None # type: Any
-f(x=f(), z=None()) # E: None not callable
-f(f, zz=None()) # E: None not callable
-f(x=None)
-
-[case testKeywordArgumentWithFunctionObject]
-from typing import Callable
-f = None # type: Callable[[A, B], None]
-f(a=A(), b=B())
-f(A(), b=B())
-class A: pass
-class B: pass
-[out]
-main:3: error: Unexpected keyword argument "a"
-main:3: error: Unexpected keyword argument "b"
-main:4: error: Unexpected keyword argument "b"
-
-[case testKeywordOnlyArguments]
-import typing
-def f(a: 'A', *, b: 'B' = None) -> None: pass
-def g(a: 'A', *, b: 'B') -> None: pass
-def h(a: 'A', *, b: 'B', aa: 'A') -> None: pass
-def i(a: 'A', *, b: 'B', aa: 'A' = None) -> None: pass
-f(A(), b=B())
-f(b=B(), a=A())
-f(A())
-f(A(), B()) # E: Too many positional arguments for "f"
-g(A(), b=B())
-g(b=B(), a=A())
-g(A()) # E: Missing named argument "b" for function "g"
-g(A(), B()) # E: Too many positional arguments for "g"
-h(A()) # E: Missing named argument "b" for function "h" # E: Missing named argument "aa" for function "h"
-h(A(), b=B()) # E: Missing named argument "aa" for function "h"
-h(A(), aa=A()) # E: Missing named argument "b" for function "h"
-h(A(), b=B(), aa=A())
-h(A(), aa=A(), b=B())
-i(A()) # E: Missing named argument "b" for function "i"
-i(A(), b=B())
-i(A(), aa=A()) # E: Missing named argument "b" for function "i"
-i(A(), b=B(), aa=A())
-i(A(), aa=A(), b=B())
-
-class A: pass
-class B: pass
-
-[case testKeywordOnlyArgumentsFastparse]
-# flags: --fast-parser
-import typing
-def f(a: 'A', *, b: 'B' = None) -> None: pass
-def g(a: 'A', *, b: 'B') -> None: pass
-def h(a: 'A', *, b: 'B', aa: 'A') -> None: pass
-def i(a: 'A', *, b: 'B', aa: 'A' = None) -> None: pass
-f(A(), b=B())
-f(b=B(), a=A())
-f(A())
-f(A(), B()) # E: Too many positional arguments for "f"
-g(A(), b=B())
-g(b=B(), a=A())
-g(A()) # E: Missing named argument "b" for function "g"
-g(A(), B()) # E: Too many positional arguments for "g"
-h(A()) # E: Missing named argument "b" for function "h" # E: Missing named argument "aa" for function "h"
-h(A(), b=B()) # E: Missing named argument "aa" for function "h"
-h(A(), aa=A()) # E: Missing named argument "b" for function "h"
-h(A(), b=B(), aa=A())
-h(A(), aa=A(), b=B())
-i(A()) # E: Missing named argument "b" for function "i"
-i(A(), b=B())
-i(A(), aa=A()) # E: Missing named argument "b" for function "i"
-i(A(), b=B(), aa=A())
-i(A(), aa=A(), b=B())
-
-class A: pass
-class B: pass
-
-[case testKwargsAfterBareArgs]
-from typing import Tuple, Any
-def f(a, *, b=None) -> None: pass
-a = None # type: Any
-b = None # type: Any
-f(a, **b)
-
-[builtins fixtures/dict.pyi]
-
-[case testKeywordArgAfterVarArgs]
-import typing
-def f(*a: 'A', b: 'B' = None) -> None: pass
-f()
-f(A())
-f(A(), A())
-f(b=B())
-f(A(), b=B())
-f(A(), A(), b=B())
-f(B()) # E: Argument 1 to "f" has incompatible type "B"; expected "A"
-f(A(), B()) # E: Argument 2 to "f" has incompatible type "B"; expected "A"
-f(b=A()) # E: Argument 1 to "f" has incompatible type "A"; expected "B"
-class A: pass
-class B: pass
-[builtins fixtures/list.pyi]
-
-[case testKeywordArgAfterVarArgsWithBothCallerAndCalleeVarArgs]
-from typing import List
-def f(*a: 'A', b: 'B' = None) -> None: pass
-a = None # type: List[A]
-f(*a)
-f(A(), *a)
-f(b=B())
-f(*a, b=B())
-f(A(), *a, b=B())
-f(A(), B()) # E: Argument 2 to "f" has incompatible type "B"; expected "A"
-f(A(), b=A()) # E: Argument 2 to "f" has incompatible type "A"; expected "B"
-f(*a, b=A()) # E: Argument 2 to "f" has incompatible type "A"; expected "B"
-class A: pass
-class B: pass
-[builtins fixtures/list.pyi]
-
-[case testCallingDynamicallyTypedFunctionWithKeywordArgs]
-import typing
-def f(x, y=A()): pass
-f(x=A(), y=A())
-f(y=A(), x=A())
-f(y=A()) # E: Missing positional argument "x" in call to "f"
-f(A(), z=A()) # E: Unexpected keyword argument "z" for "f"
-class A: pass
-
-[case testKwargsArgumentInFunctionBody]
-from typing import Dict, Any
-def f( **kwargs: 'A') -> None:
- d1 = kwargs # type: Dict[str, A]
- d2 = kwargs # type: Dict[A, Any] # E: Incompatible types in assignment (expression has type Dict[str, A], variable has type Dict[A, Any])
- d3 = kwargs # type: Dict[Any, str] # E: Incompatible types in assignment (expression has type Dict[str, A], variable has type Dict[Any, str])
-class A: pass
-[builtins fixtures/dict.pyi]
-[out]
-
-[case testKwargsArgumentInFunctionBodyWithImplicitAny]
-from typing import Dict, Any
-def f(**kwargs) -> None:
- d1 = kwargs # type: Dict[str, A]
- d2 = kwargs # type: Dict[str, str]
- d3 = kwargs # type: Dict[A, Any] # E: Incompatible types in assignment (expression has type Dict[str, Any], variable has type Dict[A, Any])
-class A: pass
-[builtins fixtures/dict.pyi]
-[out]
-
-[case testCallingFunctionThatAcceptsVarKwargs]
-import typing
-def f( **kwargs: 'A') -> None: pass
-f()
-f(x=A())
-f(y=A(), z=A())
-f(x=B()) # E: Argument 1 to "f" has incompatible type "B"; expected "A"
-f(A()) # E: Too many arguments for "f"
-# Perhaps a better message would be "Too many *positional* arguments..."
-class A: pass
-class B: pass
-[builtins fixtures/dict.pyi]
-
-[case testCallingFunctionWithKeywordVarArgs]
-from typing import Dict
-def f( **kwargs: 'A') -> None: pass
-d = None # type: Dict[str, A]
-f(**d)
-f(x=A(), **d)
-d2 = None # type: Dict[str, B]
-f(**d2) # E: Argument 1 to "f" has incompatible type **Dict[str, B]; expected "A"
-f(x=A(), **d2) # E: Argument 2 to "f" has incompatible type **Dict[str, B]; expected "A"
-class A: pass
-class B: pass
-[builtins fixtures/dict.pyi]
-
-[case testInvalidTypeForKeywordVarArg]
-from typing import Dict
-def f( **kwargs: 'A') -> None: pass
-d = None # type: Dict[A, A]
-f(**d) # E: Keywords must be strings
-f(**A()) # E: Argument after ** must be a dictionary
-class A: pass
-[builtins fixtures/dict.pyi]
-
-[case testPassingKeywordVarArgsToNonVarArgsFunction]
-from typing import Any, Dict
-def f(a: 'A', b: 'B') -> None: pass
-d = None # type: Dict[str, Any]
-f(**d)
-d2 = None # type: Dict[str, A]
-f(**d2) # E: Argument 1 to "f" has incompatible type **Dict[str, A]; expected "B"
-class A: pass
-class B: pass
-[builtins fixtures/dict.pyi]
-
-[case testBothKindsOfVarArgs]
-from typing import Any, List, Dict
-def f(a: 'A', b: 'A') -> None: pass
-l = None # type: List[Any]
-d = None # type: Dict[Any, Any]
-f(*l, **d)
-class A: pass
-[builtins fixtures/dict.pyi]
-
-[case testKeywordArgumentAndCommentSignature]
-import typing
-def f(x): # type: (int) -> str # N: "f" defined here
- pass
-f(x='') # E: Argument 1 to "f" has incompatible type "str"; expected "int"
-f(x=0)
-f(y=0) # E: Unexpected keyword argument "y" for "f"
-
-[case testKeywordArgumentAndCommentSignature2]
-import typing
-class A:
- def f(self, x): # type: (int) -> str
- pass
-A().f(x='') # E: Argument 1 to "f" of "A" has incompatible type "str"; expected "int"
-A().f(x=0)
-A().f(y=0) # E: Unexpected keyword argument "y" for "f" of "A"
-
-[case testKeywordVarArgsAndCommentSignature]
-import typing
-def f(**kwargs): # type: (**int) -> None
- pass
-f(z=1)
-f(x=1, y=1)
-f(x='', y=1) # E: Argument 1 to "f" has incompatible type "str"; expected "int"
-f(x=1, y='') # E: Argument 2 to "f" has incompatible type "str"; expected "int"
-[builtins fixtures/dict.pyi]
-
-[case testCallsWithStars]
-def f(a: int) -> None:
- pass
-
-s = ('',)
-f(*s) # E: Argument 1 to "f" has incompatible type *"Tuple[str]"; expected "int"
-
-a = {'': 0}
-f(a) # E: Argument 1 to "f" has incompatible type Dict[str, int]; expected "int"
-f(**a) # okay
-
-b = {'': ''}
-f(b) # E: Argument 1 to "f" has incompatible type Dict[str, str]; expected "int"
-f(**b) # E: Argument 1 to "f" has incompatible type **Dict[str, str]; expected "int"
-
-c = {0: 0}
-f(**c) # E: Keywords must be strings
-[builtins fixtures/dict.pyi]
-
-[case testCallStar2WithStar]
-def f(**k): pass
-f(*(1, 2)) # E: Too many arguments for "f"
-[builtins fixtures/dict.pyi]
diff --git a/test-data/unit/check-lists.test b/test-data/unit/check-lists.test
deleted file mode 100644
index c9c67e8..0000000
--- a/test-data/unit/check-lists.test
+++ /dev/null
@@ -1,72 +0,0 @@
--- Nested list assignment
--- -----------------------------
-
-[case testNestedListAssignment]
-from typing import List
-a1, b1, c1 = None, None, None # type: (A, B, C)
-a2, b2, c2 = None, None, None # type: (A, B, C)
-
-a1, [b1, c1] = a2, [b2, c2]
-a1, [a1, [b1, c1]] = a2, [a2, [b2, c2]]
-a1, [a1, [a1, b1]] = a1, [a1, [a1, c1]] # E: Incompatible types in assignment (expression has type "C", variable has type "B")
-
-class A: pass
-class B: pass
-class C: pass
-[builtins fixtures/list.pyi]
-[out]
-
-[case testNestedListAssignmentToTuple]
-from typing import List
-a, b, c = None, None, None # type: (A, B, C)
-
-a, b = [a, b]
-a, b = [a] # E: Need more than 1 value to unpack (2 expected)
-a, b = [a, b, c] # E: Too many values to unpack (2 expected, 3 provided)
-
-class A: pass
-class B: pass
-class C: pass
-[builtins fixtures/list.pyi]
-[out]
-
-[case testListAssignmentFromTuple]
-from typing import List
-a, b, c = None, None, None # type: (A, B, C)
-t = a, b
-
-[a, b], c = t, c
-[a, c], c = t, c # E: Incompatible types in assignment (expression has type "B", variable has type "C")
-[a, a, a], c = t, c # E: Need more than 2 values to unpack (3 expected)
-[a], c = t, c # E: Too many values to unpack (1 expected, 2 provided)
-
-class A: pass
-class B: pass
-class C: pass
-[builtins fixtures/list.pyi]
-[out]
-
-[case testListAssignmentUnequalAmountToUnpack]
-from typing import List
-a, b, c = None, None, None # type: (A, B, C)
-
-def f() -> None: # needed because test parser tries to parse [a, b] as section header
- [a, b] = [a, b]
- [a, b] = [a] # E: Need more than 1 value to unpack (2 expected)
- [a, b] = [a, b, c] # E: Too many values to unpack (2 expected, 3 provided)
-
-class A: pass
-class B: pass
-class C: pass
-[builtins fixtures/list.pyi]
-[out]
-
-[case testListWithStarExpr]
-(x, *a) = [1, 2, 3]
-a = [1, *[2, 3]]
-reveal_type(a) # E: Revealed type is 'builtins.list[builtins.int]'
-b = [0, *a]
-reveal_type(b) # E: Revealed type is 'builtins.list[builtins.int*]'
-c = [*a, 0]
-reveal_type(c) # E: Revealed type is 'builtins.list[builtins.int*]'
-[builtins fixtures/list.pyi]
diff --git a/test-data/unit/check-modules.test b/test-data/unit/check-modules.test
deleted file mode 100644
index 2444ce7..0000000
--- a/test-data/unit/check-modules.test
+++ /dev/null
@@ -1,1408 +0,0 @@
--- Type checker test cases dealing with modules and imports.
-
-[case testAccessImportedDefinitions]
-import m
-import typing
-m.f() # E: Too few arguments for "f"
-m.f(object()) # E: Argument 1 to "f" has incompatible type "object"; expected "A"
-m.x = object() # E: Incompatible types in assignment (expression has type "object", variable has type "A")
-m.f(m.A())
-m.x = m.A()
-[file m.py]
-class A: pass
-def f(a: A) -> None: pass
-x = A()
-
-[case testAccessImportedDefinitions]
-import m
-import typing
-m.f(object()) # E: Argument 1 to "f" has incompatible type "object"; expected "A"
-m.f(m.A())
-[file m.py]
-class A: pass
-def f(a: A) -> None: pass
-
-[case testAccessImportedDefinitions2]
-from m import f, A
-import typing
-f(object()) # E: Argument 1 to "f" has incompatible type "object"; expected "A"
-f(A())
-[file m.py]
-class A: pass
-def f(a: A) -> None: pass
-
-[case testImportedExceptionType]
-import m
-import typing
-try:
- pass
-except m.Err:
- pass
-except m.Bad: # E: Exception type must be derived from BaseException
- pass
-[file m.py]
-class Err(BaseException): pass
-class Bad: pass
-[builtins fixtures/exception.pyi]
-
-[case testImportedExceptionType2]
-from m import Err, Bad
-import typing
-try:
- pass
-except Err:
- pass
-except Bad: # E: Exception type must be derived from BaseException
- pass
-[file m.py]
-class Err(BaseException): pass
-class Bad: pass
-[builtins fixtures/exception.pyi]
-
-[case testImportWithinBlock]
-import typing
-if 1:
- import m
- m.a = m.b # E: Incompatible types in assignment (expression has type "B", variable has type "A")
- m.a = m.a
- m.f()
- m.f(m.a) # E: Too many arguments for "f"
- m.a = m.A()
- m.a = m.B() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-[file m.py]
-class A: pass
-class B: pass
-a = A()
-b = B()
-def f() -> None: pass
-
-[case testImportWithinFunction]
-import typing
-def f() -> None:
- from m import a, b, f, A, B
- a = b # E: Incompatible types in assignment (expression has type "B", variable has type "A")
- a = a
- f()
- f(a) # E: Too many arguments for "f"
- a = A()
- a = B() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-[file m.py]
-class A: pass
-class B: pass
-a = A()
-b = B()
-def f() -> None: pass
-[out]
-
-[case testImportWithinMethod]
-import typing
-class C:
- def f(self) -> None:
- from m import *
- a = b # E: Incompatible types in assignment (expression has type "B", variable has type "A")
- a = a
- f()
- f(a) # E: Too many arguments for "f"
- a = A()
- a = B() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-[file m.py]
-class A: pass
-class B: pass
-a = A()
-b = B()
-def f() -> None: pass
-[out]
-
-[case testImportWithinClassBody]
-import typing
-class C:
- import m
- m.f()
- m.f(C) # E: Too many arguments for "f"
-[file m.py]
-def f() -> None: pass
-[out]
-
-[case testImportWithinClassBody2]
-import typing
-class C:
- from m import f
- f()
- f(C) # E: Too many arguments for "f"
-[file m.py]
-def f() -> None: pass
-[out]
-
-[case testImportWithStub]
-import _m
-_m.f("hola")
-[file _m.pyi]
-def f(c:str) -> None: pass
-[out]
-
-[case testImportWithStubIncompatibleType]
-import _m
-_m.f("hola")
-_m.f(12) # E: Argument 1 to "f" has incompatible type "int"; expected "str"
-[file _m.py]
-def f(c):
- print(c)
-[file _m.pyi]
-def f(c:str) -> None: pass
-
-[case testInvalidOperationsOnModules]
-import m
-import typing
-class A: pass
-m() # E: "module" not callable
-a = m # type: A # E: Incompatible types in assignment (expression has type "module", variable has type "A")
-m + None # E: Unsupported left operand type for + ("module")
-[file m.py]
-[builtins fixtures/module.pyi]
-
-[case testNameDefinedInDifferentModule]
-import m, n
-import typing
-m.x # E: "module" has no attribute "x"
-[file m.py]
-y = object()
-[file n.py]
-x = object()
-[builtins fixtures/module.pyi]
-
-[case testChainedAssignmentAndImports]
-import m
-
-i, s = None, None # type: (int, str)
-i = m.x
-i = m.y
-s = m.x # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-s = m.y # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-[file m.py]
-x = y = 1
-[builtins fixtures/primitives.pyi]
-
-[case testConditionalFunctionDefinitionAndImports]
-import m
-import typing
-m.f(1)
-m.f('x') # E: Argument 1 to "f" has incompatible type "str"; expected "int"
-[file m.py]
-x = object()
-if x:
- def f(x: int) -> None: pass
-else:
- def f(x: int) -> None: pass
-
-[case testTypeCheckWithUnknownModule]
-import nonexistent
-None + ''
-[out]
-main:1: error: Cannot find module named 'nonexistent'
-main:1: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-main:2: error: Unsupported left operand type for + (None)
-
-[case testTypeCheckWithUnknownModule2]
-import m, nonexistent
-None + ''
-m.x = 1
-m.x = ''
-[file m.py]
-x = 1
-[out]
-main:1: error: Cannot find module named 'nonexistent'
-main:1: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-main:2: error: Unsupported left operand type for + (None)
-main:4: error: Incompatible types in assignment (expression has type "str", variable has type "int")
-
-[case testTypeCheckWithUnknownModule3]
-import nonexistent, m
-None + ''
-m.x = 1
-m.x = ''
-[file m.py]
-x = 1
-[out]
-main:1: error: Cannot find module named 'nonexistent'
-main:1: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-main:2: error: Unsupported left operand type for + (None)
-main:4: error: Incompatible types in assignment (expression has type "str", variable has type "int")
-
-[case testTypeCheckWithUnknownModule4]
-import nonexistent, another
-None + ''
-[out]
-main:1: error: Cannot find module named 'nonexistent'
-main:1: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-main:1: error: Cannot find module named 'another'
-main:2: error: Unsupported left operand type for + (None)
-
-[case testTypeCheckWithUnknownModule5]
-import nonexistent as x
-None + ''
-[out]
-main:1: error: Cannot find module named 'nonexistent'
-main:1: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-main:2: error: Unsupported left operand type for + (None)
-
-[case testTypeCheckWithUnknownModuleUsingFromImport]
-from nonexistent import x
-None + ''
-[out]
-main:1: error: Cannot find module named 'nonexistent'
-main:1: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-main:2: error: Unsupported left operand type for + (None)
-
-[case testTypeCheckWithUnknownModuleUsingImportStar]
-from nonexistent import *
-None + ''
-[out]
-main:1: error: Cannot find module named 'nonexistent'
-main:1: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-main:2: error: Unsupported left operand type for + (None)
-
-[case testAccessingUnknownModule]
-import xyz
-xyz.foo()
-xyz()
-[out]
-main:1: error: Cannot find module named 'xyz'
-main:1: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-
-[case testAccessingUnknownModule2]
-import xyz, bar
-xyz.foo()
-bar()
-[out]
-main:1: error: Cannot find module named 'xyz'
-main:1: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-main:1: error: Cannot find module named 'bar'
-
-[case testAccessingUnknownModule3]
-import xyz as z
-xyz.foo()
-z()
-[out]
-main:1: error: Cannot find module named 'xyz'
-main:1: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-main:2: error: Name 'xyz' is not defined
-
-[case testAccessingNameImportedFromUnknownModule]
-from xyz import y, z
-y.foo()
-z()
-[out]
-main:1: error: Cannot find module named 'xyz'
-main:1: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-
-[case testAccessingNameImportedFromUnknownModule2]
-from xyz import *
-y
-[out]
-main:1: error: Cannot find module named 'xyz'
-main:1: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-main:2: error: Name 'y' is not defined
-
-[case testAccessingNameImportedFromUnknownModule3]
-from xyz import y as z
-y
-z
-[out]
-main:1: error: Cannot find module named 'xyz'
-main:1: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-main:2: error: Name 'y' is not defined
-
-[case testUnknownModuleRedefinition]
-import xab
-def xab(): pass
-[out]
-main:1: error: Cannot find module named 'xab'
-main:1: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-
-[case testAccessingUnknownModuleFromOtherModule]
-import x
-x.nonexistent.foo
-x.z
-[file x.py]
-import nonexistent
-[builtins fixtures/module.pyi]
-[out]
-tmp/x.py:1: error: Cannot find module named 'nonexistent'
-tmp/x.py:1: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-main:3: error: "module" has no attribute "z"
-
-[case testUnknownModuleImportedWithinFunction]
-def f():
- import foobar
-def foobar(): pass
-foobar('')
-[out]
-main:2: error: Cannot find module named 'foobar'
-main:2: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-main:4: error: Too many arguments for "foobar"
-
-[case testUnknownModuleImportedWithinFunction2]
-def f():
- from foobar import x
-def x(): pass
-x('')
-[out]
-main:2: error: Cannot find module named 'foobar'
-main:2: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-main:4: error: Too many arguments for "x"
-
-[case testRelativeImports]
-import typing
-import m.a
-m.a.x = m.a.y # Error
-[file m/__init__.py]
-[file m/a.py]
-import typing
-from .b import A, B, x, y
-z = x
-z = y # Error
-[file m/b.py]
-import typing
-class A: pass
-class B: pass
-x = A()
-y = B()
-[out]
-tmp/m/a.py:4: error: Incompatible types in assignment (expression has type "B", variable has type "A")
-main:3: error: Incompatible types in assignment (expression has type "B", variable has type "A")
-
-[case testRelativeImports2]
-import typing
-import m.a
-m.a.x = m.a.y # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-[file m/__init__.py]
-[file m/a.py]
-import typing
-from .b import A, B, x, y
-[file m/b.py]
-import typing
-class A: pass
-class B: pass
-x = A()
-y = B()
-
-[case testExportedValuesInImportAll]
-import typing
-from m import *
-_ = a
-_ = b
-_ = c
-_ = d
-_ = e
-_ = f # E: Name 'f' is not defined
-_ = _g # E: Name '_g' is not defined
-[file m.py]
-__all__ = ['a']
-__all__ += ('b',)
-__all__.append('c')
-__all__.extend(('d', 'e'))
-
-a = b = c = d = e = f = _g = 1
-[builtins fixtures/module_all.pyi]
-
-[case testAllMustBeSequenceStr]
-import typing
-__all__ = [1, 2, 3]
-[builtins fixtures/module_all.pyi]
-[out]
-main:2: error: Type of __all__ must be Sequence[str], not List[int]
-
-[case testAllMustBeSequenceStr_python2]
-import typing
-__all__ = [1, 2, 3]
-[builtins_py2 fixtures/module_all_python2.pyi]
-[out]
-main:2: error: Type of __all__ must be Sequence[unicode], not List[int]
-
-[case testAllUnicodeSequenceOK_python2]
-import typing
-__all__ = [u'a', u'b', u'c']
-[builtins_py2 fixtures/module_all_python2.pyi]
-
-[out]
-
-[case testEllipsisInitializerInStubFileWithType]
-import m
-m.x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-[file m.pyi]
-x = ... # type: int
-
-[case testEllipsisInitializerInStubFileWithoutType]
-import m
-m.x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "ellipsis")
-[file m.pyi]
-# Ellipsis is only special with a # type: comment (not sure though if this is great)
-x = ...
-
-[case testEllipsisInitializerInModule]
-x = ... # type: int # E: Incompatible types in assignment (expression has type "ellipsis", variable has type "int")
-
-[case testEllipsisDefaultArgValueInStub]
-import m
-m.f(1)
-m.f('') # E: Argument 1 to "f" has incompatible type "str"; expected "int"
-[file m.pyi]
-def f(x: int = ...) -> None: pass
-
-[case testEllipsisDefaultArgValueInStub2]
-import m
-def f(x: int = ...) -> None: pass
-[file m.pyi]
-def g(x: int = '') -> None: pass
-[out]
-tmp/m.pyi:1: error: Incompatible types in assignment (expression has type "str", variable has type "int")
-main:2: error: Incompatible types in assignment (expression has type "ellipsis", variable has type "int")
-
-[case testEllipsisDefaultArgValueInNonStub]
-def f(x: int = ...) -> None: pass # E: Incompatible types in assignment (expression has type "ellipsis", variable has type "int")
-[out]
-
-[case testStarImportOverlapping]
-from m1 import *
-from m2 import *
-j = ''
-[file m1.py]
-x = 1
-[file m2.py]
-x = 1
-
-[case testStarImportOverlappingMismatch]
-from m1 import *
-from m2 import * # E: Incompatible import of "x" (imported name has type "int", local name has type "str")
-j = ''
-[file m1.py]
-x = ''
-[file m2.py]
-x = 1
-
-[case testStarImportOverridingLocalImports-skip]
-from m1 import *
-from m2 import *
-x = '' # E: TODO (cannot assign str to int)
-[file m1.py]
-x = 1
-[file m2.py]
-x = 1
-
-[case testAssignToFuncDefViaImport]
-from m import * # E: Incompatible import of "x" (imported name has type "int", local name has type "str")
-f = None # E: Need type annotation for variable
-x = ''
-[file m.py]
-def f(): pass
-x = 1+0
-[out]
-
-
--- Conditional definitions and function redefinitions via module object
--- --------------------------------------------------------------------
-
-
-[case testConditionalImportAndAssign]
-try:
- from m import x
-except:
- x = None
-try:
- from m import x as y
-except:
- y = 1 # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-[file m.py]
-x = ''
-
-[case testAssignAndConditionalImport]
-x = ''
-try:
- from m import x
-except:
- pass
-y = 1
-try:
- from m import x as y # E: Incompatible import of "y" (imported name has type "str", local name has type "int")
-except:
- pass
-[file m.py]
-x = ''
-
-[case testAssignAndConditionalStarImport]
-x = ''
-y = 1
-try:
- from m import * # E: Incompatible import of "y" (imported name has type "str", local name has type "int")
-except:
- pass
-[file m.py]
-x = ''
-y = ''
-
-[case testRedefineImportedFunctionViaImport]
-try:
- from m import f, g
-except:
- def f(x): pass
- def g(x): pass # E: All conditional function variants must have identical signatures
-[file m.py]
-def f(x): pass
-def g(x, y): pass
-
-[case testImportedVariableViaImport]
-try:
- from m import x
-except:
- from n import x # E: Incompatible import of "x" (imported name has type "str", local name has type "int")
-[file m.py]
-x = 1
-[file n.py]
-x = ''
-
-[case testRedefineFunctionViaImport]
-def f(x): pass
-def g(x): pass
-try:
- from m import f, g # E: Incompatible import of "g" (imported name has type Callable[[Any, Any], Any], local name has type Callable[[Any], Any])
-except:
- pass
-[file m.py]
-def f(x): pass
-def g(x, y): pass
-
-[case testImportVariableAndAssignNone]
-try:
- from m import x
-except:
- x = None
-[file m.py]
-x = 1
-
-[case testImportFunctionAndAssignNone]
-try:
- from m import f
-except:
- f = None
-[file m.py]
-def f(): pass
-
-[case testImportFunctionAndAssignFunction]
-def g(x): pass
-try:
- from m import f
-except:
- f = g
-[file m.py]
-def f(x): pass
-
-[case testImportFunctionAndAssignIncompatible]
-try:
- from m import f
-except:
- f = 1 # E: Incompatible types in assignment (expression has type "int", variable has type Callable[[], Any])
-[file m.py]
-def f(): pass
-
-[case testAssignToFuncDefViaGlobalDecl2]
-import typing
-from m import f
-def g() -> None:
- global f
- f = None
- f = 1 # E: Incompatible types in assignment (expression has type "int", variable has type Callable[[], Any])
-[file m.py]
-def f(): pass
-[out]
-
-[case testAssignToFuncDefViaNestedModules]
-import m.n
-m.n.f = None
-m.n.f = 1 # E: Incompatible types in assignment (expression has type "int", variable has type Callable[[], Any])
-[file m/__init__.py]
-[file m/n.py]
-def f(): pass
-[out]
-
-[case testAssignToFuncDefViaModule]
-import m
-m.f = None
-m.f = 1 # E: Incompatible types in assignment (expression has type "int", variable has type Callable[[], Any])
-[file m.py]
-def f(): pass
-[out]
-
-[case testConditionalImportAndAssignNoneToModule]
-if object():
- import m
-else:
- m = None
-m.f(1) # E: Argument 1 to "f" has incompatible type "int"; expected "str"
-[file m.py]
-def f(x: str) -> None: pass
-[builtins fixtures/module.pyi]
-[out]
-
-[case testConditionalImportAndAssignInvalidToModule]
-if object():
- import m
-else:
- m = 1 # E: Incompatible types in assignment (expression has type "int", variable has type "module")
-[file m.py]
-[builtins fixtures/module.pyi]
-[out]
-
-[case testImportAndAssignToModule]
-import m
-m = None
-m.f(1) # E: Argument 1 to "f" has incompatible type "int"; expected "str"
-[file m.py]
-def f(x: str) -> None: pass
-[builtins fixtures/module.pyi]
-[out]
-
-
--- Test cases that simulate 'mypy -m modname'
---
--- The module name to import is encoded in a comment.
-
-[case testTypeCheckNamedModule]
-# cmd: mypy -m m.a
-[file m/__init__.py]
-None + 1
-[file m/a.py]
-[out]
-tmp/m/__init__.py:1: error: Unsupported left operand type for + (None)
-
-[case testTypeCheckNamedModule2]
-# cmd: mypy -m m.a
-[file m/__init__.py]
-[file m/a.py]
-None + 1
-[out]
-tmp/m/a.py:1: error: Unsupported left operand type for + (None)
-
-[case testTypeCheckNamedModule3]
-# cmd: mypy -m m
-[file m/__init__.py]
-None + 1
-[file m/a.py]
-[out]
-tmp/m/__init__.py:1: error: Unsupported left operand type for + (None)
-
-[case testTypeCheckNamedModule4]
-# cmd: mypy -m m
-[file m/__init__.py]
-[file m/a.py]
-None + 1 # Not analyzed.
-[out]
-
-[case testTypeCheckNamedModule5]
-# cmd: mypy -m m
-None + '' # Not analyzed.
-[file m.py]
-None + 1
-[out]
-tmp/m.py:1: error: Unsupported left operand type for + (None)
-
-[case testTypeCheckNamedModuleWithImportCycle]
-# cmd: mypy -m m.a
-None + 1 # Does not generate error, as this file won't be analyzed.
-[file m/__init__.py]
-import m.a
-[file m/a.py]
-[out]
-
-
--- Checks dealing with submodules and different kinds of imports
--- -------------------------------------------------------------
-
-[case testSubmoduleRegularImportAddsAllParents]
-import a.b.c
-reveal_type(a.value) # E: Revealed type is 'builtins.int'
-reveal_type(a.b.value) # E: Revealed type is 'builtins.str'
-reveal_type(a.b.c.value) # E: Revealed type is 'builtins.float'
-b.value # E: Name 'b' is not defined
-c.value # E: Name 'c' is not defined
-
-[file a/__init__.py]
-value = 3
-[file a/b/__init__.py]
-value = "a"
-[file a/b/c.py]
-value = 3.2
-[out]
-
-[case testSubmoduleImportAsDoesNotAddParents]
-import a.b.c as foo
-reveal_type(foo.value) # E: Revealed type is 'builtins.float'
-a.value # E: Name 'a' is not defined
-b.value # E: Name 'b' is not defined
-c.value # E: Name 'c' is not defined
-
-[file a/__init__.py]
-value = 3
-[file a/b/__init__.py]
-value = "a"
-[file a/b/c.py]
-value = 3.2
-[out]
-
-[case testSubmoduleImportFromDoesNotAddParents]
-from a import b
-reveal_type(b.value) # E: Revealed type is 'builtins.str'
-b.c.value # E: "module" has no attribute "c"
-a.value # E: Name 'a' is not defined
-
-[file a/__init__.py]
-value = 3
-[file a/b/__init__.py]
-value = "a"
-[file a/b/c.py]
-value = 3.2
-[builtins fixtures/module.pyi]
-[out]
-
-[case testSubmoduleImportFromDoesNotAddParents2]
-from a.b import c
-reveal_type(c.value) # E: Revealed type is 'builtins.float'
-a.value # E: Name 'a' is not defined
-b.value # E: Name 'b' is not defined
-
-[file a/__init__.py]
-value = 3
-[file a/b/__init__.py]
-value = "a"
-[file a/b/c.py]
-value = 3.2
-[out]
-
-[case testSubmoduleRegularImportNotDirectlyAddedToParent]
-import a.b.c
-def accept_float(x: float) -> None: pass
-accept_float(a.b.c.value)
-
-[file a/__init__.py]
-value = 3
-b.value
-a.b.value
-
-[file a/b/__init__.py]
-value = "a"
-c.value
-a.b.c.value
-
-[file a/b/c.py]
-value = 3.2
-[out]
-tmp/a/b/__init__.py:2: error: Name 'c' is not defined
-tmp/a/b/__init__.py:3: error: Name 'a' is not defined
-tmp/a/__init__.py:2: error: Name 'b' is not defined
-tmp/a/__init__.py:3: error: Name 'a' is not defined
-
-[case testSubmoduleMixingLocalAndQualifiedNames]
-from a.b import MyClass
-val1 = None # type: a.b.MyClass # E: Name 'a' is not defined
-val2 = None # type: MyClass
-
-[file a/__init__.py]
-[file a/b.py]
-class MyClass: pass
-[out]
-
-[case testSubmoduleMixingImportFrom]
-import parent.child
-
-[file parent/__init__.py]
-
-[file parent/common.py]
-class SomeClass: pass
-
-[file parent/child.py]
-from parent.common import SomeClass
-from parent import common
-foo = parent.common.SomeClass()
-
-[builtins fixtures/module.pyi]
-[out]
-tmp/parent/child.py:3: error: Name 'parent' is not defined
-
-[case testSubmoduleMixingImportFromAndImport]
-import parent.child
-
-[file parent/__init__.py]
-
-[file parent/common.py]
-class SomeClass: pass
-
-[file parent/unrelated.py]
-class ShouldNotLoad: pass
-
-[file parent/child.py]
-from parent.common import SomeClass
-import parent
-
-# Note, since this might be unintuitive -- when `parent.common` is loaded in any way,
-# shape, or form, it's added to `parent`'s namespace, which is why the below line
-# succeeds.
-foo = parent.common.SomeClass()
-reveal_type(foo)
-bar = parent.unrelated.ShouldNotLoad()
-
-[builtins fixtures/module.pyi]
-[out]
-tmp/parent/child.py:8: error: Revealed type is 'parent.common.SomeClass'
-tmp/parent/child.py:9: error: "module" has no attribute "unrelated"
-
-[case testSubmoduleMixingImportFromAndImport2]
-import parent.child
-
-[file parent/__init__.py]
-
-[file parent/common.py]
-class SomeClass: pass
-
-[file parent/child.py]
-from parent import common
-import parent
-foo = parent.common.SomeClass()
-reveal_type(foo)
-
-[builtins fixtures/module.pyi]
-[out]
-tmp/parent/child.py:4: error: Revealed type is 'parent.common.SomeClass'
-
--- Tests repeated imports
-
-[case testIdenticalImportFromTwice]
-from a import x, y, z
-from b import x, y, z
-[file a.py]
-from common import x, y, z
-[file b.py]
-from common import x, y, z
-[file common.py]
-x = 3
-def y() -> int: return 3
-class z: pass
-[out]
-
-[case testIdenticalImportStarTwice]
-from a import *
-from b import *
-[file a.py]
-from common import x, y, z
-[file b.py]
-from common import x, y, z
-[file common.py]
-x = 3
-def y() -> int: return 3
-class z: pass
-[out]
-
-[case testDifferentImportSameNameTwice]
-from a import x, y, z
-from b import x, y, z
-[file a.py]
-x = 3
-def y() -> int: return 1
-class z: pass
-[file b.py]
-x = "foo"
-def y() -> str: return "foo"
-class z: pass
-[out]
-main:2: error: Incompatible import of "x" (imported name has type "str", local name has type "int")
-main:2: error: Incompatible import of "y" (imported name has type Callable[[], str], local name has type Callable[[], int])
-main:2: error: Incompatible import of "z" (imported name has type "z" (type object), local name has type "z" (type object))
-
--- Misc
-
-[case testInheritFromBadImport]
-# cmd: mypy -m bar
-[file foo.py]
-pass
-[file bar.py]
-from foo import B
-class C(B):
- pass
-[out]
-tmp/bar.py:1: error: Module 'foo' has no attribute 'B'
-
-[case testImportSuppressedWhileAlmostSilent]
-# cmd: mypy -m main
-# flags: --follow-imports=error
-[file main.py]
-import mod
-[file mod.py]
-[builtins fixtures/module.pyi]
-[out]
-tmp/main.py:1: note: Import of 'mod' ignored
-tmp/main.py:1: note: (Using --follow-imports=error, module not passed on command line)
-
-[case testAncestorSuppressedWhileAlmostSilent]
-# cmd: mypy -m foo.bar
-# flags: --follow-imports=error
-[file foo/bar.py]
-[file foo/__init__.py]
-[builtins fixtures/module.pyi]
-[out]
-tmp/foo/bar.py: note: Ancestor package 'foo' ignored
-tmp/foo/bar.py: note: (Using --follow-imports=error, submodule passed on command line)
-
-[case testStubImportNonStubWhileSilent]
-# cmd: mypy -m main
-# flags: --follow-imports=skip
-[file main.py]
-from stub import x # Permitted
-from other import y # Disallowed
-x + '' # Error here
-y + '' # But not here
-[file stub.pyi]
-from non_stub import x
-[file non_stub.py]
-x = 42
-[file other.py]
-y = 42
-[builtins fixtures/module.pyi]
-[out]
-tmp/main.py:3: error: Unsupported left operand type for + ("int")
-
-[case testSilentSubmoduleImport]
-# cmd: mypy -m foo
-# flags: --follow-imports=skip
-[file foo/__init__.py]
-from foo import bar
-[file foo/bar.py]
-pass
-
-[case testSuperclassInImportCycle]
-import a
-import d
-a.A().f(d.D())
-[file a.py]
-if 0:
- import d
-class B: pass
-class C(B): pass
-class A:
- def f(self, x: B) -> None: pass
-[file d.py]
-import a
-class D(a.C): pass
-
-[case testSuperclassInImportCycleReversedImports]
-import d
-import a
-a.A().f(d.D())
-[file a.py]
-if 0:
- import d
-class B: pass
-class C(B): pass
-class A:
- def f(self, x: B) -> None: pass
-[file d.py]
-import a
-class D(a.C): pass
-
-[case testPreferPackageOverFile]
-import a
-[file a.py]
-/ # intentional syntax error -- this file shouldn't be parsed
-[file a/__init__.py]
-pass
-[out]
-
-[case testPreferPackageOverFile2]
-from a import x
-[file a.py]
-/ # intentional syntax error -- this file shouldn't be parsed
-[file a/__init__.py]
-x = 0
-[out]
-
-[case testImportInClass]
-class C:
- import foo
-reveal_type(C.foo.bar) # E: Revealed type is 'builtins.int'
-[file foo.py]
-bar = 0
-[builtins fixtures/module.pyi]
-[out]
-
-[case testIfFalseImport]
-if False:
- import a
-def f(x: 'a.A') -> int:
- return x.f()
-[file a.py]
-class A:
- def f(self) -> int:
- return 0
-[builtins fixtures/bool.pyi]
-
-
--- Test stability under import cycles
--- ----------------------------------
-
--- The first two tests are identical except one main has 'import x'
--- and the other 'import y'. Previously (before build.order_ascc()
--- was added) one of these would fail because the imports were
--- processed in the (reverse) order in which the files were
--- encountered.
-
-[case testImportCycleStability1]
-import x
-[file x.py]
-def f() -> str: return ''
-class Base:
- attr = f()
-def foo():
- import y
-[file y.py]
-import x
-class Sub(x.Base):
- attr = x.Base.attr
-[out]
-
-[case testImportCycleStability2]
-import y
-[file x.py]
-def f() -> str: return ''
-class Base:
- attr = f()
-def foo():
- import y
-[file y.py]
-import x
-class Sub(x.Base):
- attr = x.Base.attr
-[out]
-
--- This case isn't fixed by order_ascc(), but is fixed by the
--- lightweight type inference added to semanal.py
--- (analyze_simple_literal_type()).
-
-[case testImportCycleStability3]
-import y
-[file x.py]
-class Base:
- pass
-def foo() -> int:
- import y
- reveal_type(y.Sub.attr)
- return y.Sub.attr
-[file y.py]
-import x
-class Sub(x.Base):
- attr = 0
-[out]
-tmp/x.py:5: error: Revealed type is 'builtins.int'
-
--- This case has a symmetrical cycle, so it doesn't matter in what
--- order the files are processed. It depends on the lightweight type
--- interference.
-
-[case testImportCycleStability4]
-import x
-[file x.py]
-import y
-class C:
- attr = ''
-def foo() -> int:
- return y.D.attr
-[file y.py]
-import x
-class D:
- attr = 0
-def bar() -> str:
- return x.C.attr
-
--- These cases test all supported literal types.
-
-[case testImportCycleStability5]
-import y
-[file x.py]
-class Base:
- pass
-def foo() -> None:
- import y
- i = y.Sub.iattr # type: int
- f = y.Sub.fattr # type: float
- s = y.Sub.sattr # type: str
- b = y.Sub.battr # type: bytes
-[file y.py]
-import x
-class Sub(x.Base):
- iattr = 0
- fattr = 0.0
- sattr = ''
- battr = b''
-[out]
-
-[case testImportCycleStability6_python2]
-import y
-[file x.py]
-class Base:
- pass
-def foo():
- # type: () -> None
- import y
- i = y.Sub.iattr # type: int
- f = y.Sub.fattr # type: float
- s = y.Sub.sattr # type: str
- u = y.Sub.uattr # type: unicode
-[file y.py]
-import x
-class Sub(x.Base):
- iattr = 0
- fattr = 0.0
- sattr = ''
- uattr = u''
-[out]
-
--- This case tests module-level variables.
-
-[case testImportCycleStability7]
-import x
-[file x.py]
-def foo() -> int:
- import y
- reveal_type(y.value)
- return y.value
-[file y.py]
-import x
-value = 12
-[out]
-tmp/x.py:3: error: Revealed type is 'builtins.int'
-
--- This is not really cycle-related but still about the lightweight
--- type checker.
-
-[case testImportCycleStability8]
-x = 1 # type: str
-reveal_type(x)
-[out]
-main:1: error: Incompatible types in assignment (expression has type "int", variable has type "str")
-main:2: error: Revealed type is 'builtins.str'
-
--- Tests for cross-module second_pass checking.
-
-[case testSymmetricImportCycle1]
-import a
-[file a.py]
-import b
-def f() -> int:
- return b.x
-y = 0 + 0
-[file b.py]
-import a
-def g() -> int:
- reveal_type(a.y)
- return a.y
-x = 1 + 1
-[out]
-tmp/b.py:3: error: Revealed type is 'builtins.int'
-
-[case testSymmetricImportCycle2]
-import b
-[file a.py]
-import b
-def f() -> int:
- reveal_type(b.x)
- return b.x
-y = 0 + 0
-[file b.py]
-import a
-def g() -> int:
- return a.y
-x = 1 + 1
-[out]
-tmp/a.py:3: error: Revealed type is 'builtins.int'
-
-[case testThreePassesRequired]
-import b
-[file a.py]
-import b
-class C:
- def f1(self) -> None:
- self.x2
- def f2(self) -> None:
- self.x2 = b.b
-[file b.py]
-import a
-b = 1 + 1
-[out]
-tmp/a.py:4: error: Cannot determine type of 'x2'
-
-[case testErrorInPassTwo1]
-import b
-[file a.py]
-import b
-def f() -> None:
- a = b.x + 1
- a + ''
-[file b.py]
-import a
-x = 1 + 1
-[out]
-tmp/a.py:4: error: Unsupported operand types for + ("int" and "str")
-
-[case testErrorInPassTwo2]
-import a
-[file a.py]
-import b
-def f() -> None:
- a = b.x + 1
- a + ''
-[file b.py]
-import a
-x = 1 + 1
-[out]
-tmp/a.py:4: error: Unsupported operand types for + ("int" and "str")
-
-[case testDeferredDecorator]
-import a
-[file a.py]
-import b
-def g() -> None:
- f('')
- at b.deco
-def f(a: str) -> int: pass
-reveal_type(f)
-x = 1 + 1
-[file b.py]
-from typing import Callable, TypeVar
-import a
-T = TypeVar('T')
-def deco(f: Callable[[T], int]) -> Callable[[T], int]:
- a.x
- return f
-[out]
-tmp/a.py:6: error: Revealed type is 'def (builtins.str*) -> builtins.int'
-
-[case testDeferredClassContext]
-class A:
- def f(self) -> str: return 'foo'
-class B(A):
- def f(self) -> str: return self.x
- def initialize(self): self.x = 'bar'
-[out]
-
-
--- Scripts and __main__
-
-[case testScriptsAreModules]
-# flags: --scripts-are-modules
-[file a]
-pass
-[file b]
-pass
-
-[case testScriptsAreNotModules]
-# cmd: mypy a b
-[file a]
-pass
-[file b]
-pass
-[out]
-
-[case testTypeCheckPrio]
-# cmd: mypy -m part1 part2 part3 part4
-
-[file part1.py]
-from part3 import Thing
-class FirstThing: pass
-
-[file part2.py]
-from part4 import part4_thing as Thing
-
-[file part3.py]
-from part2 import Thing
-reveal_type(Thing)
-
-[file part4.py]
-from typing import TYPE_CHECKING
-if TYPE_CHECKING:
- from part1 import FirstThing
-def part4_thing(a: int) -> str: pass
-
-[builtins fixtures/bool.pyi]
-[out]
-tmp/part3.py:2: error: Revealed type is 'def (a: builtins.int) -> builtins.str'
-
-[case testImportStarAliasAnyList]
-import bar
-
-[file bar.py]
-from foo import *
-def bar(y: AnyAlias) -> None: pass
-
-l = None # type: ListAlias[int]
-reveal_type(l)
-
-[file foo.py]
-from typing import Any, List
-AnyAlias = Any
-ListAlias = List
-[builtins fixtures/list.pyi]
-[out]
-tmp/bar.py:5: error: Revealed type is 'builtins.list[builtins.int]'
-
-[case testImportStarAliasSimpleGeneric]
-from ex2a import *
-
-def do_something(dic: Row) -> None:
- pass
-
-def do_another() -> Row:
- return {}
-
-do_something({'good': 'bad'}) # E: List item 0 has incompatible type "Tuple[str, str]"
-reveal_type(do_another()) # E: Revealed type is 'builtins.dict[builtins.str, builtins.int]'
-
-[file ex2a.py]
-from typing import Dict
-Row = Dict[str, int]
-[builtins fixtures/dict.pyi]
-[out]
-
-[case testImportStarAliasGeneric]
-from y import *
-notes = None # type: G[X]
-another = G[X]()
-second = XT[str]()
-last = XT[G]()
-
-reveal_type(notes) # E: Revealed type is 'y.G[y.G[builtins.int]]'
-reveal_type(another) # E: Revealed type is 'y.G[y.G*[builtins.int]]'
-reveal_type(second) # E: Revealed type is 'y.G[builtins.str*]'
-reveal_type(last) # E: Revealed type is 'y.G[y.G*]'
-
-[file y.py]
-from typing import Generic, TypeVar
-
-T = TypeVar('T')
-
-class G(Generic[T]):
- pass
-
-X = G[int]
-XT = G[T]
-[out]
-
-[case testImportStarAliasCallable]
-from foo import *
-from typing import Any
-
-def bar(x: Any, y: AnyCallable) -> Any:
- return 'foo'
-
-cb = None # type: AnyCallable
-reveal_type(cb) # E: Revealed type is 'def (*Any, **Any) -> Any'
-
-[file foo.py]
-from typing import Callable, Any
-AnyCallable = Callable[..., Any]
-[out]
diff --git a/test-data/unit/check-multiple-inheritance.test b/test-data/unit/check-multiple-inheritance.test
deleted file mode 100644
index 678ccad..0000000
--- a/test-data/unit/check-multiple-inheritance.test
+++ /dev/null
@@ -1,242 +0,0 @@
--- Test cases for multiple inheritance.
---
--- Related: check-abstract.test
-
-
--- No name collisions
--- ------------------
-
-
-[case testSimpleMultipleInheritanceAndMethods]
-import typing
-class A:
- def f(self, x: int) -> None: pass
-class B:
- def g(self, x: str) -> None: pass
-class C(A, B): pass
-c = C()
-c.f(1)
-c.f('') # E: Argument 1 to "f" of "A" has incompatible type "str"; expected "int"
-c.g('')
-c.g(1) # E: Argument 1 to "g" of "B" has incompatible type "int"; expected "str"
-
-[case testSimpleMultipleInheritanceAndMethods2]
-import typing
-class A:
- def f(self, x: int) -> None: pass
-class B:
- def g(self, x): pass
-class C(A, B): pass
-c = C()
-c.f(1)
-c.f('') # E: Argument 1 to "f" of "A" has incompatible type "str"; expected "int"
-c.g('')
-c.g(1)
-
-[case testSimpleMultipleInheritanceAndInstanceVariables]
-import typing
-class A:
- def f(self) -> None:
- self.x = 1
-class B:
- def g(self) -> None:
- self.y = ''
-class C(A, B): pass
-c = C()
-c.x = 1
-c.x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-c.y = ''
-c.y = 1 # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-
-[case testSimpleMultipleInheritanceAndInstanceVariableInClassBody]
-import typing
-class A:
- x = 1
-class B:
- y = ''
-class C(A, B): pass
-c = C()
-c.x = 1
-c.x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-c.y = ''
-c.y = 1 # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-
-[case testSimpleMultipleInheritanceAndClassVariable]
-import typing
-class A:
- x = 1
-class B:
- y = ''
-class C(A, B): pass
-C.x = 1
-C.x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-C.y = ''
-C.y = 1 # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-
-
--- Name collisions
--- ---------------
-
-
-[case testMethodNameCollisionInMultipleInheritanceWithValidSigs]
-import typing
-class A:
- def f(self, x: int) -> None: pass
-class B:
- def f(self, x: int) -> None: pass
-class C(A, B): pass
-c = C()
-c.f(1)
-c.f('') # E: Argument 1 to "f" of "A" has incompatible type "str"; expected "int"
-
-[case testInstanceVarNameOverlapInMultipleInheritanceWithCompatibleTypes]
-import typing
-class A:
- def f(self) -> None:
- self.x = 1
-class B:
- def g(self) -> None:
- self.x = 1
-class C(A, B): pass
-c = C()
-c.x = 1
-c.x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-
-[case testClassVarNameOverlapInMultipleInheritanceWithCompatibleTypes]
-import typing
-class A:
- x = 1
-class B:
- x = 1
-class C(A, B): pass
-c = C()
-c.x = 1
-c.x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-C.x = 1
-C.x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-
-[case testMethodNameCollisionInMultipleInheritanceWithIncompatibleSigs]
-import typing
-class A:
- def f(self, x: int) -> None: pass
-class B:
- def f(self, x: str) -> None: pass
-class C(A, B): pass
-[out]
-main:6: error: Definition of "f" in base class "A" is incompatible with definition in base class "B"
-
-[case testMethodNameCollisionInMultipleInheritanceWithIncompatibleSigs2]
-import typing
-class A:
- def f(self, x: int) -> None: pass
-class B:
- def f(self, x, y): pass
-class C(A, B): pass
-class D(B, A): pass
-[out]
-main:6: error: Definition of "f" in base class "A" is incompatible with definition in base class "B"
-main:7: error: Definition of "f" in base class "B" is incompatible with definition in base class "A"
-
-
-[case testMethodOverridingWithBothDynamicallyAndStaticallyTypedMethods]
-class A:
- def f(self) -> int: pass
-class B:
- def f(self): pass
-class C(B, A): pass
-class D(A, B): pass
-[out]
-
-[case testInstanceVarNameOverlapInMultipleInheritanceWithInvalidTypes]
-import typing
-class A:
- def f(self) -> None:
- self.x = 1
-class B:
- def g(self) -> None:
- self.x = ''
-class C(A, B): pass
-[out]
-main:8: error: Definition of "x" in base class "A" is incompatible with definition in base class "B"
-
-[case testClassVarNameOverlapInMultipleInheritanceWithInvalidTypes]
-import typing
-class A:
- x = 1
-class B:
- x = ''
-class C(A, B): pass
-[out]
-main:6: error: Definition of "x" in base class "A" is incompatible with definition in base class "B"
-
-[case testMethodOverlapsWithClassVariableInMultipleInheritance]
-from typing import Callable
-class A:
- def f(self) -> None: pass
-class B:
- f = ''
-class C(A, B): pass
-[out]
-main:6: error: Definition of "f" in base class "A" is incompatible with definition in base class "B"
-
-[case testMethodOverlapsWithInstanceVariableInMultipleInheritance]
-from typing import Callable
-class A:
- def f(self) -> None: pass
-class B:
- def g(self) -> None:
- self.f = ''
-class C(A, B): pass
-[out]
-main:7: error: Definition of "f" in base class "A" is incompatible with definition in base class "B"
-
-[case testMultipleInheritanceAndInit]
-import typing
-class A:
- def __init__(self, x: int) -> None: pass
-class B:
- def __init__(self) -> None: pass
-class C(A, B): pass
-
-[case testMultipleInheritanceAndDifferentButCompatibleSignatures]
-class A:
- def clear(self): pass
-
-class B:
- def clear(self, x=None): pass
-
-class C(B, A): pass
-class D(A, B): pass
-[out]
-main:8: error: Definition of "clear" in base class "A" is incompatible with definition in base class "B"
-
-
--- Special cases
--- -------------
-
-
-[case testGenericInheritanceAndOverridingWithMultipleInheritance]
-from typing import Generic, TypeVar
-T = TypeVar('T')
-class G(Generic[T]):
- def f(self, s: int) -> 'G[T]': pass
-class A(G[int]):
- def f(self, s: int) -> 'A': pass
-class B(A, int): pass
-
-[case testCannotDetermineTypeInMultipleInheritance]
-from typing import Callable, TypeVar
-T = TypeVar('T')
-class A(B, C):
- def f(self): pass
-class B:
- @dec
- def f(self): pass
-class C:
- @dec
- def f(self): pass
-def dec(f: Callable[..., T]) -> Callable[..., T]:
- return f
-[out]
-main:3: error: Cannot determine type of 'f' in base class 'B'
-main:3: error: Cannot determine type of 'f' in base class 'C'
diff --git a/test-data/unit/check-namedtuple.test b/test-data/unit/check-namedtuple.test
deleted file mode 100644
index 71a058b..0000000
--- a/test-data/unit/check-namedtuple.test
+++ /dev/null
@@ -1,429 +0,0 @@
-[case testNamedTupleUsedAsTuple]
-from collections import namedtuple
-
-X = namedtuple('X', ['x', 'y'])
-x = None # type: X
-a, b = x
-b = x[0]
-a = x[1]
-a, b, c = x # E: Need more than 2 values to unpack (3 expected)
-x[2] # E: Tuple index out of range
-
-[case testNamedTupleWithTupleFieldNamesUsedAsTuple]
-from collections import namedtuple
-
-X = namedtuple('X', ('x', 'y'))
-x = None # type: X
-a, b = x
-b = x[0]
-a = x[1]
-a, b, c = x # E: Need more than 2 values to unpack (3 expected)
-x[2] # E: Tuple index out of range
-
-[case testNamedTupleNoUnderscoreFields]
-from collections import namedtuple
-
-X = namedtuple('X', 'x, _y, _z') # E: namedtuple() field names cannot start with an underscore: _y, _z
-
-[case testNamedTupleAccessingAttributes]
-from collections import namedtuple
-
-X = namedtuple('X', ['x', 'y'])
-x = None # type: X
-x.x
-x.y
-x.z # E: "X" has no attribute "z"
-
-
-[case testNamedTupleAttributesAreReadOnly]
-from collections import namedtuple
-
-X = namedtuple('X', ['x', 'y'])
-x = None # type: X
-x.x = 5 # E: Property "x" defined in "X" is read-only
-x.y = 5 # E: Property "y" defined in "X" is read-only
-x.z = 5 # E: "X" has no attribute "z"
-
-class A(X): pass
-a = None # type: A
-a.x = 5 # E: Property "x" defined in "A" is read-only
-a.y = 5 # E: Property "y" defined in "A" is read-only
--- a.z = 5 # not supported yet
-
-
-[case testNamedTupleCreateWithPositionalArguments]
-from collections import namedtuple
-
-X = namedtuple('X', ['x', 'y'])
-x = X(1, 'x')
-x.x
-x.z # E: "X" has no attribute "z"
-x = X(1) # E: Too few arguments for "X"
-x = X(1, 2, 3) # E: Too many arguments for "X"
-
-[case testCreateNamedTupleWithKeywordArguments]
-from collections import namedtuple
-
-X = namedtuple('X', ['x', 'y'])
-x = X(x=1, y='x')
-x = X(1, y='x')
-x = X(x=1, z=1) # E: Unexpected keyword argument "z" for "X"
-x = X(y=1) # E: Missing positional argument "x" in call to "X"
-
-
-[case testNamedTupleCreateAndUseAsTuple]
-from collections import namedtuple
-
-X = namedtuple('X', ['x', 'y'])
-x = X(1, 'x')
-a, b = x
-a, b, c = x # E: Need more than 2 values to unpack (3 expected)
-
-
-[case testNamedTupleWithItemTypes]
-from typing import NamedTuple
-N = NamedTuple('N', [('a', int),
- ('b', str)])
-n = N(1, 'x')
-s = n.a # type: str # E: Incompatible types in assignment (expression has type "int", \
- variable has type "str")
-i = n.b # type: int # E: Incompatible types in assignment (expression has type "str", \
- variable has type "int")
-x, y = n
-x = y # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-
-
-[case testNamedTupleWithTupleFieldNamesWithItemTypes]
-from typing import NamedTuple
-N = NamedTuple('N', (('a', int),
- ('b', str)))
-n = N(1, 'x')
-s = n.a # type: str # E: Incompatible types in assignment (expression has type "int", \
- variable has type "str")
-i = n.b # type: int # E: Incompatible types in assignment (expression has type "str", \
- variable has type "int")
-x, y = n
-x = y # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-
-
-[case testNamedTupleConstructorArgumentTypes]
-from typing import NamedTuple
-N = NamedTuple('N', [('a', int),
- ('b', str)])
-n = N('x', 'x') # E: Argument 1 to "N" has incompatible type "str"; expected "int"
-n = N(1, b=2) # E: Argument 2 to "N" has incompatible type "int"; expected "str"
-N(1, 'x')
-N(b='x', a=1)
-
-[case testNamedTupleAsBaseClass]
-from typing import NamedTuple
-N = NamedTuple('N', [('a', int),
- ('b', str)])
-class X(N):
- pass
-x = X(1, 2) # E: Argument 2 to "X" has incompatible type "int"; expected "str"
-s = ''
-i = 0
-s = x.a # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-i, s = x
-s, s = x # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-
-[case testNamedTupleAsBaseClass2]
-from typing import NamedTuple
-class X(NamedTuple('N', [('a', int),
- ('b', str)])):
- pass
-x = X(1, 2) # E: Argument 2 to "X" has incompatible type "int"; expected "str"
-s = ''
-i = 0
-s = x.a # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-i, s = x
-s, s = x # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-
-
-[case testNamedTuplesTwoAsBaseClasses]
-from typing import NamedTuple
-A = NamedTuple('A', [('a', int)])
-B = NamedTuple('B', [('a', int)])
-class X(A, B): # E: Class has two incompatible bases derived from tuple
- pass
-
-
-[case testNamedTuplesTwoAsBaseClasses2]
-from typing import NamedTuple
-A = NamedTuple('A', [('a', int)])
-class X(A, NamedTuple('B', [('a', int)])): # E: Class has two incompatible bases derived from tuple
- pass
-
-
-[case testNamedTupleSelfTypeWithNamedTupleAsBase]
-from typing import NamedTuple
-A = NamedTuple('A', [('a', int), ('b', str)])
-class B(A):
- def f(self, x: int) -> None:
- self.f(self.a)
- self.f(self.b) # E: Argument 1 to "f" of "B" has incompatible type "str"; expected "int"
- i = 0
- s = ''
- i, s = self
- i, i = self # E: Incompatible types in assignment (expression has type "str", \
- variable has type "int")
-
-
-[out]
-
-[case testNamedTupleTypeReferenceToClassDerivedFrom]
-from typing import NamedTuple
-A = NamedTuple('A', [('a', int), ('b', str)])
-class B(A):
- def f(self, x: 'B') -> None:
- i = 0
- s = ''
- self = x
- i, s = x
- i, s = x.a, x.b
- i, s = x.a, x.a # E: Incompatible types in assignment (expression has type "int", \
- variable has type "str")
- i, i = self # E: Incompatible types in assignment (expression has type "str", \
- variable has type "int")
-
-[out]
-
-[case testNamedTupleSubtyping]
-from typing import NamedTuple, Tuple
-A = NamedTuple('A', [('a', int), ('b', str)])
-class B(A): pass
-a = A(1, '')
-b = B(1, '')
-t = None # type: Tuple[int, str]
-b = a # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-a = t # E: Incompatible types in assignment (expression has type "Tuple[int, str]", variable has type "A")
-b = t # E: Incompatible types in assignment (expression has type "Tuple[int, str]", variable has type "B")
-t = a
-t = (1, '')
-t = b
-a = b
-
-
-[case testNamedTupleSimpleTypeInference]
-from typing import NamedTuple, Tuple
-A = NamedTuple('A', [('a', int)])
-l = [A(1), A(2)]
-a = A(1)
-a = l[0]
-(i,) = l[0]
-i, i = l[0] # E: Need more than 1 value to unpack (2 expected)
-l = [A(1)]
-a = (1,) # E: Incompatible types in assignment (expression has type "Tuple[int]", \
- variable has type "A")
-[builtins fixtures/list.pyi]
-
-[case testNamedTupleMissingClassAttribute]
-import collections
-MyNamedTuple = collections.namedtuple('MyNamedTuple', ['spam', 'eggs'])
-MyNamedTuple.x # E: "MyNamedTuple" has no attribute "x"
-
-
-[case testNamedTupleEmptyItems]
-from typing import NamedTuple
-A = NamedTuple('A', [])
-
-
-[case testNamedTupleProperty]
-from typing import NamedTuple
-A = NamedTuple('A', [('a', int)])
-class B(A):
- @property
- def b(self) -> int:
- return self.a
-class C(B): pass
-B(1).b
-C(2).b
-
-[builtins fixtures/property.pyi]
-
-[case testNamedTupleAsDict]
-from collections import namedtuple
-
-X = namedtuple('X', ['x', 'y'])
-x = None # type: X
-reveal_type(x._asdict()) # E: Revealed type is 'builtins.dict[builtins.str, Any]'
-
-[builtins fixtures/dict.pyi]
-
-[case testNamedTupleReplace]
-from collections import namedtuple
-
-X = namedtuple('X', ['x', 'y'])
-x = None # type: X
-reveal_type(x._replace()) # E: Revealed type is 'Tuple[Any, Any, fallback=__main__.X]'
-x._replace(y=5)
-x._replace(x=3)
-x._replace(x=3, y=5)
-x._replace(z=5) # E: Unexpected keyword argument "z" for X._replace
-x._replace(5) # E: Too many positional arguments for X._replace
-
-[case testNamedTupleReplaceAsClass]
-from collections import namedtuple
-
-X = namedtuple('X', ['x', 'y'])
-x = None # type: X
-X._replace(x, x=1, y=2)
-X._replace(x=1, y=2) # E: Missing positional argument "self" in call to X._replace
-
-
-[case testNamedTupleReplaceTyped]
-from typing import NamedTuple
-
-X = NamedTuple('X', [('x', int), ('y', str)])
-x = None # type: X
-reveal_type(x._replace()) # E: Revealed type is 'Tuple[builtins.int, builtins.str, fallback=__main__.X]'
-x._replace(x=5)
-x._replace(y=5) # E: Argument 1 to X._replace has incompatible type "int"; expected "str"
-
-[case testNamedTupleMake]
-from typing import NamedTuple
-
-X = NamedTuple('X', [('x', int), ('y', str)])
-reveal_type(X._make([5, 'a'])) # E: Revealed type is 'Tuple[builtins.int, builtins.str, fallback=__main__.X]'
-X._make('a b') # E: Argument 1 to X._make has incompatible type "str"; expected Iterable[Any]
-
--- # FIX: not a proper class method
--- x = None # type: X
--- reveal_type(x._make([5, 'a'])) # E: Revealed type is 'Tuple[builtins.int, builtins.str, fallback=__main__.X]'
--- x._make('a b') # E: Argument 1 to X._make has incompatible type "str"; expected Iterable[Any]
-
-[builtins fixtures/list.pyi]
-
-[case testNamedTupleFields]
-from typing import NamedTuple
-
-X = NamedTuple('X', [('x', int), ('y', str)])
-reveal_type(X._fields) # E: Revealed type is 'Tuple[builtins.str, builtins.str]'
-
-[case testNamedTupleSource]
-from typing import NamedTuple
-
-X = NamedTuple('X', [('x', int), ('y', str)])
-reveal_type(X._source) # E: Revealed type is 'builtins.str'
-x = None # type: X
-reveal_type(x._source) # E: Revealed type is 'builtins.str'
-
-[case testNamedTupleUnit]
-from typing import NamedTuple
-
-X = NamedTuple('X', [])
-x = X() # type: X
-x._replace()
-x._fields[0] # E: Tuple index out of range
-
-[case testNamedTupleJoinNamedTuple]
-from typing import NamedTuple
-
-X = NamedTuple('X', [('x', int), ('y', str)])
-Y = NamedTuple('Y', [('x', int), ('y', str)])
-reveal_type([X(3, 'b'), Y(1, 'a')]) # E: Revealed type is 'builtins.list[Tuple[builtins.int, builtins.str]]'
-
-[builtins fixtures/list.pyi]
-
-[case testNamedTupleJoinTuple]
-from typing import NamedTuple, Tuple
-
-X = NamedTuple('X', [('x', int), ('y', str)])
-reveal_type([(3, 'b'), X(1, 'a')]) # E: Revealed type is 'builtins.list[Tuple[builtins.int, builtins.str]]'
-reveal_type([X(1, 'a'), (3, 'b')]) # E: Revealed type is 'builtins.list[Tuple[builtins.int, builtins.str]]'
-
-[builtins fixtures/list.pyi]
-
-[case testNamedTupleFieldTypes]
-from typing import NamedTuple
-
-X = NamedTuple('X', [('x', int), ('y', str)])
-reveal_type(X._field_types) # E: Revealed type is 'builtins.dict[builtins.str, Any]'
-x = None # type: X
-reveal_type(x._field_types) # E: Revealed type is 'builtins.dict[builtins.str, Any]'
-
-[builtins fixtures/dict.pyi]
-
-[case testNamedTupleAndOtherSuperclass]
-from typing import NamedTuple
-
-class A: pass
-def f(x: A) -> None: pass
-
-class B(NamedTuple('B', []), A): pass
-f(B())
-x = None # type: A
-x = B()
-
-# Sanity check: fail if baseclass does not match
-class C: pass
-def g(x: C) -> None: pass
-class D(NamedTuple('D', []), A): pass
-
-g(D()) # E: Argument 1 to "g" has incompatible type "D"; expected "C"
-y = None # type: C
-y = D() # E: Incompatible types in assignment (expression has type "D", variable has type "C")
-
-[case testNamedTupleSelfTypeMethod]
-from typing import TypeVar, NamedTuple
-
-T = TypeVar('T', bound='A')
-
-class A(NamedTuple('A', [('x', str)])):
- def member(self: T) -> T:
- return self
-
-class B(A):
- pass
-
-a = None # type: A
-a = A('').member()
-b = None # type: B
-b = B('').member()
-a = B('')
-a = B('').member()
-
-[case testNamedTupleSelfTypeReplace]
-from typing import NamedTuple, TypeVar
-A = NamedTuple('A', [('x', str)])
-reveal_type(A('hello')._replace(x='')) # E: Revealed type is 'Tuple[builtins.str, fallback=__main__.A]'
-a = None # type: A
-a = A('hello')._replace(x='')
-
-class B(A):
- pass
-
-reveal_type(B('hello')._replace(x='')) # E: Revealed type is 'Tuple[builtins.str, fallback=__main__.B]'
-b = None # type: B
-b = B('hello')._replace(x='')
-
-[case testNamedTupleSelfTypeMake]
-from typing import NamedTuple, TypeVar
-A = NamedTuple('A', [('x', str)])
-reveal_type(A._make([''])) # E: Revealed type is 'Tuple[builtins.str, fallback=__main__.A]'
-a = A._make(['']) # type: A
-
-class B(A):
- pass
-
-reveal_type(B._make([''])) # E: Revealed type is 'Tuple[builtins.str, fallback=__main__.B]'
-b = B._make(['']) # type: B
-
-[builtins fixtures/list.pyi]
-
-[case testNamedTupleInClassNamespace]
-# https://github.com/python/mypy/pull/2553#issuecomment-266474341
-from typing import NamedTuple
-class C:
- def f(self):
- A = NamedTuple('A', [('x', int)])
- def g(self):
- A = NamedTuple('A', [('y', int)])
-C.A # E: "C" has no attribute "A"
-
-[case testNamedTupleInFunction]
-from typing import NamedTuple
-def f() -> None:
- A = NamedTuple('A', [('x', int)])
-A # E: Name 'A' is not defined
diff --git a/test-data/unit/check-newsyntax.test b/test-data/unit/check-newsyntax.test
deleted file mode 100644
index b2a2662..0000000
--- a/test-data/unit/check-newsyntax.test
+++ /dev/null
@@ -1,87 +0,0 @@
-[case testNewSyntaxRequire36]
-# flags: --fast-parser --python-version 3.5
-x: int = 5 # E: Variable annotation syntax is only suppoted in Python 3.6, use type comment instead
-[out]
-
-[case testNewSyntaxSyntaxError]
-# flags: --fast-parser --python-version 3.6
-x: int: int # E: invalid syntax
-[out]
-
-[case testNewSyntaxBasics]
-# flags: --fast-parser --python-version 3.6
-x: int
-x = 5
-y: int = 5
-
-a: str
-a = 5 # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-b: str = 5 # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-
-zzz: int
-zzz: str # E: Name 'zzz' already defined
-[out]
-
-[case testNewSyntaxWithDict]
-# flags: --fast-parser --python-version 3.6
-from typing import Dict, Any
-
-d: Dict[int, str] = {}
-d[42] = 'ab'
-d[42] = 42 # E: Incompatible types in assignment (expression has type "int", target has type "str")
-d['ab'] = 'ab' # E: Invalid index type "str" for "dict"; expected type "int"
-[builtins fixtures/dict.pyi]
-[out]
-
-[case testNewSyntaxWithRevealType]
-# flags: --fast-parser --python-version 3.6
-from typing import Dict
-
-def tst_local(dct: Dict[int, T]) -> Dict[T, int]:
- ret: Dict[T, int] = {}
- return ret
-
-reveal_type(tst_local({1: 'a'})) # E: Revealed type is 'builtins.dict[builtins.str*, builtins.int]'
-[builtins fixtures/dict.pyi]
-[out]
-
-[case testNewSyntaxWithInstanceVars]
-# flags: --fast-parser --python-version 3.6
-class TstInstance:
- a: str
- def __init__(self) -> None:
- self.x: int
-
-TstInstance().x = 5
-TstInstance().x = 'ab' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-TstInstance().a = 5 # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-TstInstance().a = 'ab'
-[out]
-
-[case testNewSyntaxWithClassVars]
-# flags: --fast-parser --strict-optional --python-version 3.6
-class CCC:
- a: str = None # E: Incompatible types in assignment (expression has type None, variable has type "str")
-[out]
-
-[case testNewSyntaxWithStrictOptional]
-# flags: --fast-parser --strict-optional --python-version 3.6
-strict: int
-strict = None # E: Incompatible types in assignment (expression has type None, variable has type "int")
-strict2: int = None # E: Incompatible types in assignment (expression has type None, variable has type "int")
-[out]
-
-[case testNewSyntaxWithStrictOptionalFunctions]
-# flags: --fast-parser --strict-optional --python-version 3.6
-def f() -> None:
- x: int
- x = None # E: Incompatible types in assignment (expression has type None, variable has type "int")
-[out]
-
-[case testNewSyntaxWithStrictOptionalClasses]
-# flags: --fast-parser --strict-optional --python-version 3.6
-class C:
- def meth(self) -> None:
- x: int = None # E: Incompatible types in assignment (expression has type None, variable has type "int")
- self.x: int = None # E: Incompatible types in assignment (expression has type None, variable has type "int")
-[out]
diff --git a/test-data/unit/check-newtype.test b/test-data/unit/check-newtype.test
deleted file mode 100644
index 880a00f..0000000
--- a/test-data/unit/check-newtype.test
+++ /dev/null
@@ -1,319 +0,0 @@
--- Checks NewType(...)
-
--- Checks for basic functionality
-
-[case testNewTypePEP484Example1]
-from typing import NewType
-
-UserId = NewType('UserId', int)
-
-def name_by_id(user_id: UserId) -> str:
- return "foo"
-
-UserId('user') # E: Argument 1 to "UserId" has incompatible type "str"; expected "int"
-name_by_id(42) # E: Argument 1 to "name_by_id" has incompatible type "int"; expected "UserId"
-name_by_id(UserId(42))
-
-id = UserId(5)
-num = id + 1
-
-reveal_type(id) # E: Revealed type is '__main__.UserId'
-reveal_type(num) # E: Revealed type is 'builtins.int'
-[out]
-
-[case testNewTypePEP484Example2]
-from typing import NewType
-
-class PacketId:
- def __init__(self, major: int, minor: int) -> None:
- self._major = major
- self._minor = minor
-
-TcpPacketId = NewType('TcpPacketId', PacketId)
-
-packet = PacketId(100, 100)
-tcp_packet = TcpPacketId(packet)
-tcp_packet = TcpPacketId(127, 0)
-
-[out]
-main:12: error: Too many arguments for "TcpPacketId"
-main:12: error: Argument 1 to "TcpPacketId" has incompatible type "int"; expected "PacketId"
-
-[case testNewTypeWithTuples]
-from typing import NewType, Tuple
-TwoTuple = NewType('TwoTuple', Tuple[int, str])
-a = TwoTuple((3, "a"))
-b = TwoTuple(("a", 3)) # E: Argument 1 to "TwoTuple" has incompatible type "Tuple[str, int]"; expected "Tuple[int, str]"
-
-reveal_type(a[0]) # E: Revealed type is 'builtins.int'
-reveal_type(a[1]) # E: Revealed type is 'builtins.str'
-[builtins fixtures/tuple.pyi]
-[out]
-
-[case testNewTypeWithLists]
-from typing import NewType, List
-UserId = NewType('UserId', int)
-IdList = NewType('IdList', List[UserId])
-
-bad1 = IdList([1]) # E: List item 0 has incompatible type "int"
-
-foo = IdList([])
-foo.append(3) # E: Argument 1 to "append" of "list" has incompatible type "int"; expected "UserId"
-foo.append(UserId(3))
-foo.extend([UserId(1), UserId(2), UserId(3)])
-foo.extend(IdList([UserId(1), UserId(2), UserId(3)]))
-bar = IdList([UserId(2)])
-
-baz = foo + bar
-reveal_type(foo) # E: Revealed type is '__main__.IdList'
-reveal_type(bar) # E: Revealed type is '__main__.IdList'
-reveal_type(baz) # E: Revealed type is 'builtins.list[__main__.UserId*]'
-
-[builtins fixtures/list.pyi]
-[out]
-
-[case testNewTypeWithGenerics]
-from typing import TypeVar, Generic, NewType, Any
-
-T = TypeVar('T')
-
-class Base(Generic[T]):
- def __init__(self, item: T) -> None:
- self.item = item
-
- def getter(self) -> T:
- return self.item
-
-Derived1 = NewType('Derived1', Base[str])
-Derived2 = NewType('Derived2', Base) # Implicit 'Any'
-Derived3 = NewType('Derived3', Base[Any]) # Explicit 'Any'
-
-Derived1(Base(1)) # E: Argument 1 to "Base" has incompatible type "int"; expected "str"
-Derived1(Base('a'))
-Derived2(Base(1))
-Derived2(Base('a'))
-Derived3(Base(1))
-Derived3(Base('a'))
-
-reveal_type(Derived1(Base('a')).getter()) # E: Revealed type is 'builtins.str*'
-reveal_type(Derived3(Base('a')).getter()) # E: Revealed type is 'Any'
-[out]
-
-[case testNewTypeWithNamedTuple]
-from collections import namedtuple
-from typing import NewType, NamedTuple
-
-Vector1 = namedtuple('Vector1', ['x', 'y'])
-Point1 = NewType('Point1', Vector1)
-p1 = Point1(Vector1(1, 2))
-reveal_type(p1.x) # E: Revealed type is 'Any'
-reveal_type(p1.y) # E: Revealed type is 'Any'
-
-Vector2 = NamedTuple('Vector2', [('x', int), ('y', int)])
-Point2 = NewType('Point2', Vector2)
-p2 = Point2(Vector2(1, 2))
-reveal_type(p2.x) # E: Revealed type is 'builtins.int'
-reveal_type(p2.y) # E: Revealed type is 'builtins.int'
-
-class Vector3:
- def __init__(self, x: int, y: int) -> None:
- self.x = x
- self.y = y
-Point3 = NewType('Point3', Vector3)
-p3 = Point3(Vector3(1, 3))
-reveal_type(p3.x) # E: Revealed type is 'builtins.int'
-reveal_type(p3.y) # E: Revealed type is 'builtins.int'
-[out]
-
-[case testNewTypeWithCasts]
-from typing import NewType, cast
-UserId = NewType('UserId', int)
-foo = UserId(3)
-foo = cast(UserId, 3)
-foo = cast(UserId, "foo")
-foo = cast(UserId, UserId(4))
-[out]
-
-[case testNewTypeWithTypeAliases]
-from typing import NewType
-Foo = int
-Bar = NewType('Bar', Foo)
-Bar2 = Bar
-
-def func1(x: Foo) -> Bar:
- return Bar(x)
-
-def func2(x: int) -> Bar:
- return Bar(x)
-
-def func3(x: Bar2) -> Bar:
- return x
-
-x = Bar(42)
-y = Bar2(42)
-
-y = func3(x)
-[out]
-
-
--- Make sure NewType works as expected in a variety of different scopes/across files
-
-[case testNewTypeInLocalScope]
-from typing import NewType
-A = NewType('A', int)
-a = A(3)
-
-def func() -> None:
- A = NewType('A', str)
- B = NewType('B', str)
-
- a = A(3) # E: Argument 1 to "A" has incompatible type "int"; expected "str"
- a = A('xyz')
- b = B('xyz')
-
-class MyClass:
- C = NewType('C', float)
-
- def foo(self) -> 'MyClass.C':
- return MyClass.C(3.2)
-
-b = A(3)
-c = MyClass.C(3.5)
-[out]
-
-[case testNewTypeInMultipleFiles]
-import a
-import b
-list1 = [a.UserId(1), a.UserId(2)]
-list1.append(b.UserId(3)) # E: Argument 1 to "append" of "list" has incompatible type "b.UserId"; expected "a.UserId"
-
-[file a.py]
-from typing import NewType
-UserId = NewType('UserId', int)
-
-[file b.py]
-from typing import NewType
-UserId = NewType('UserId', int)
-
-[builtins fixtures/list.pyi]
-[out]
-
-[case testNewTypeWithIncremental]
-import m
-
-[file m.py]
-from typing import NewType
-
-UserId = NewType('UserId', int)
-
-def name_by_id(user_id: UserId) -> str:
- return "foo"
-
-name_by_id(UserId(42))
-
-id = UserId(5)
-num = id + 1
-
-[file m.py.next]
-from typing import NewType
-
-UserId = NewType('UserId', int)
-
-def name_by_id(user_id: UserId) -> str:
- return "foo"
-
-name_by_id(UserId(42))
-
-id = UserId(5)
-num = id + 1
-
-reveal_type(id)
-reveal_type(num)
-[rechecked m]
-[stale]
-[out1]
-[out2]
-tmp/m.py:13: error: Revealed type is 'm.UserId'
-tmp/m.py:14: error: Revealed type is 'builtins.int'
-
-
--- Check misuses of NewType fail
-
-[case testNewTypeBadInitializationFails]
-from typing import NewType
-
-a = NewType('b', int) # E: String argument 1 'b' to NewType(...) does not match variable name 'a'
-b = NewType('b', 3) # E: Argument 2 to NewType(...) must be a valid type
-c = NewType(2, int) # E: Argument 1 to NewType(...) must be a string literal
-foo = "d"
-d = NewType(foo, int) # E: Argument 1 to NewType(...) must be a string literal
-e = NewType(name='e', tp=int) # E: NewType(...) expects exactly two positional arguments
-f = NewType('f', tp=int) # E: NewType(...) expects exactly two positional arguments
-[out]
-
-[case testNewTypeWithAnyFails]
-from typing import NewType, Any
-A = NewType('A', Any) # E: Argument 2 to NewType(...) must be subclassable (got Any)
-[out]
-
-[case testNewTypeWithUnionsFails]
-from typing import NewType, Union
-Foo = NewType('Foo', Union[int, float]) # E: Argument 2 to NewType(...) must be subclassable (got Union[builtins.int, builtins.float])
-[out]
-
-[case testNewTypeWithTypeTypeFails]
-from typing import NewType, Type
-Foo = NewType('Foo', Type[int]) # E: Argument 2 to NewType(...) must be subclassable (got Type[builtins.int])
-a = Foo(type(3))
-[builtins fixtures/args.pyi]
-[out]
-
-[case testNewTypeWithTypeVarsFails]
-from typing import NewType, TypeVar, List
-T = TypeVar('T')
-A = NewType('A', T)
-B = NewType('B', List[T])
-[builtins fixtures/list.pyi]
-[out]
-main:3: error: Argument 2 to NewType(...) must be subclassable (got T?)
-main:3: error: Invalid type "__main__.T"
-main:4: error: Invalid type "__main__.T"
-
-[case testNewTypeWithNewTypeFails]
-from typing import NewType
-A = NewType('A', int)
-B = NewType('B', A) # E: Argument 2 to NewType(...) cannot be another NewType
-C = A
-D = C
-E = NewType('E', D) # E: Argument 2 to NewType(...) cannot be another NewType
-[out]
-
-[case testNewTypeRedefiningVariablesFails]
-from typing import NewType
-
-a = 3
-a = NewType('a', int)
-
-b = NewType('b', int)
-b = NewType('b', float) # this line throws two errors
-
-c = NewType('c', str) # type: str
-[out]
-main:4: error: Cannot redefine 'a' as a NewType
-main:7: error: Invalid assignment target
-main:7: error: Cannot redefine 'b' as a NewType
-main:9: error: Cannot declare the type of a NewType declaration
-
-[case testNewTypeAddingExplicitTypesFails]
-from typing import NewType
-UserId = NewType('UserId', int)
-
-a = 3 # type: UserId # E: Incompatible types in assignment (expression has type "int", variable has type "UserId")
-[out]
-
-[case testNewTypeTestSubclassingFails]
-from typing import NewType
-class A: pass
-B = NewType('B', A)
-class C(B): pass # E: Cannot subclass NewType
-[out]
diff --git a/test-data/unit/check-optional.test b/test-data/unit/check-optional.test
deleted file mode 100644
index eca81bf..0000000
--- a/test-data/unit/check-optional.test
+++ /dev/null
@@ -1,527 +0,0 @@
--- Tests for strict Optional behavior
-
-[case testImplicitNoneType]
-x = None
-x() # E: None not callable
-
-[case testExplicitNoneType]
-x = None # type: None
-x() # E: None not callable
-
-[case testNoneMemberOfOptional]
-from typing import Optional
-x = None # type: Optional[int]
-
-[case testTypeMemberOfOptional]
-from typing import Optional
-x = 0 # type: Optional[int]
-
-[case testNoneNotMemberOfType]
-x = None # type: int
-[out]
-main:1: error: Incompatible types in assignment (expression has type None, variable has type "int")
-
-[case testTypeNotMemberOfNone]
-x = 0 # type: None
-[out]
-main:1: error: Incompatible types in assignment (expression has type "int", variable has type None)
-
-[case testOptionalNotMemberOfType]
-from typing import Optional
-def f(a: int) -> None: pass
-x = None # type: Optional[int]
-f(x) # E: Argument 1 to "f" has incompatible type "Optional[int]"; expected "int"
-
-[case testIsinstanceCases]
-from typing import Optional
-x = None # type: Optional[int]
-if isinstance(x, int):
- reveal_type(x) # E: Revealed type is 'builtins.int'
-else:
- reveal_type(x) # E: Revealed type is 'builtins.None'
-[builtins fixtures/isinstance.pyi]
-
-[case testIfCases]
-from typing import Optional
-x = None # type: Optional[int]
-if x:
- reveal_type(x) # E: Revealed type is 'builtins.int'
-else:
- reveal_type(x) # E: Revealed type is 'Union[builtins.int, builtins.None]'
-[builtins fixtures/bool.pyi]
-
-[case testIfNotCases]
-from typing import Optional
-x = None # type: Optional[int]
-if not x:
- reveal_type(x) # E: Revealed type is 'Union[builtins.int, builtins.None]'
-else:
- reveal_type(x) # E: Revealed type is 'builtins.int'
-[builtins fixtures/bool.pyi]
-
-[case testIsNotNoneCases]
-from typing import Optional
-x = None # type: Optional[int]
-if x is not None:
- reveal_type(x) # E: Revealed type is 'builtins.int'
-else:
- reveal_type(x) # E: Revealed type is 'builtins.None'
-[builtins fixtures/bool.pyi]
-
-[case testIsNoneCases]
-from typing import Optional
-x = None # type: Optional[int]
-if x is None:
- reveal_type(x) # E: Revealed type is 'builtins.None'
-else:
- reveal_type(x) # E: Revealed type is 'builtins.int'
-[builtins fixtures/bool.pyi]
-
-[case testOrCases]
-from typing import Optional
-x = None # type: Optional[str]
-y1 = x or 'a'
-reveal_type(y1) # E: Revealed type is 'builtins.str'
-y2 = x or 1
-reveal_type(y2) # E: Revealed type is 'Union[builtins.str, builtins.int]'
-z1 = 'a' or x
-reveal_type(z1) # E: Revealed type is 'Union[builtins.str, builtins.None]'
-z2 = int() or x
-reveal_type(z2) # E: Revealed type is 'Union[builtins.int, builtins.str, builtins.None]'
-
-[case testAndCases]
-from typing import Optional
-x = None # type: Optional[str]
-y1 = x and 'b'
-reveal_type(y1) # E: Revealed type is 'Union[builtins.str, builtins.None]'
-y2 = x and 1 # x could be '', so...
-reveal_type(y2) # E: Revealed type is 'Union[builtins.str, builtins.None, builtins.int]'
-z1 = 'b' and x
-reveal_type(z1) # E: Revealed type is 'Union[builtins.str, builtins.None]'
-z2 = int() and x
-reveal_type(z2) # E: Revealed type is 'Union[builtins.int, builtins.str, builtins.None]'
-
-[case testLambdaReturningNone]
-f = lambda: None
-x = f() # E: Function does not return a value
-
-[case testNoneArgumentType]
-def f(x: None) -> None: pass
-f(None)
-
-[case testInferOptionalFromDefaultNone]
-def f(x: int = None) -> None:
- x + 1 # E: Unsupported left operand type for + (some union)
-f(None)
-[out]
-
-[case testInferOptionalFromDefaultNoneWithFastParser]
-# flags: --fast-parser
-def f(x: int = None) -> None:
- x + 1 # E: Unsupported left operand type for + (some union)
-f(None)
-[out]
-
-[case testInferOptionalFromDefaultNoneComment]
-def f(x=None):
- # type: (int) -> None
- x + 1 # E: Unsupported left operand type for + (some union)
-f(None)
-[out]
-
-[case testInferOptionalFromDefaultNoneCommentWithFastParser]
-# flags: --fast-parser
-def f(x=None):
- # type: (int) -> None
- x + 1 # E: Unsupported left operand type for + (some union)
-f(None)
-[out]
-
-[case testInferOptionalType]
-x = None
-if bool():
- # scope limit assignment
- x = 1
- # in scope of the assignment, x is an int
- reveal_type(x) # E: Revealed type is 'builtins.int'
-# out of scope of the assignment, it's an Optional[int]
-reveal_type(x) # E: Revealed type is 'Union[builtins.int, builtins.None]'
-[builtins fixtures/bool.pyi]
-
-[case testInferOptionalTypeLocallyBound]
-x = None
-x = 1
-reveal_type(x) # E: Revealed type is 'builtins.int'
-
-
-[case testInferOptionalTypeFromOptional]
-from typing import Optional
-y = None # type: Optional[int]
-x = None
-x = y
-reveal_type(x) # E: Revealed type is 'Union[builtins.int, builtins.None]'
-
-[case testInferOptionalListType]
-x = [None]
-x.append(1) # E: Argument 1 to "append" of "list" has incompatible type "int"; expected None
-[builtins fixtures/list.pyi]
-
-[case testInferNonOptionalListType]
-x = []
-x.append(1)
-x() # E: List[int] not callable
-[builtins fixtures/list.pyi]
-
-[case testInferOptionalDictKeyValueTypes]
-x = {None: None}
-x["bar"] = 1
-[builtins fixtures/dict.pyi]
-[out]
-main:2: error: Invalid index type "str" for "dict"; expected type None
-main:2: error: Incompatible types in assignment (expression has type "int", target has type None)
-
-[case testInferNonOptionalDictType]
-x = {}
-x["bar"] = 1
-x() # E: Dict[str, int] not callable
-[builtins fixtures/dict.pyi]
-
-[case testNoneClassVariable]
-from typing import Optional
-class C:
- x = None # type: int
- def __init__(self) -> None:
- self.x = 0
-
-[case testNoneClassVariableInInit]
-from typing import Optional
-class C:
- x = None # type: int
- def __init__(self) -> None:
- self.x = None # E: Incompatible types in assignment (expression has type None, variable has type "int")
-[out]
-
-[case testMultipleAssignmentNoneClassVariableInInit]
-from typing import Optional
-class C:
- x, y = None, None # type: int, str
- def __init__(self) -> None:
- self.x = None # E: Incompatible types in assignment (expression has type None, variable has type "int")
- self.y = None # E: Incompatible types in assignment (expression has type None, variable has type "str")
-[out]
-
-[case testOverloadWithNone]
-from typing import overload
- at overload
-def f(x: None) -> str: pass
- at overload
-def f(x: int) -> int: pass
-reveal_type(f(None)) # E: Revealed type is 'builtins.str'
-reveal_type(f(0)) # E: Revealed type is 'builtins.int'
-
-[case testOptionalTypeOrTypePlain]
-from typing import Optional
-def f(a: Optional[int]) -> int:
- return a or 0
-[out]
-
-[case testOptionalTypeOrTypeTypeVar]
-from typing import Optional, TypeVar
-T = TypeVar('T')
-def f(a: Optional[T], b: T) -> T:
- return a or b
-[out]
-
-[case testOptionalTypeOrTypeBothOptional]
-from typing import Optional
-def f(a: Optional[int], b: Optional[int]) -> None:
- reveal_type(a or b)
-def g(a: int, b: Optional[int]) -> None:
- reveal_type(a or b)
-[out]
-main:3: error: Revealed type is 'Union[builtins.int, builtins.None]'
-main:5: error: Revealed type is 'Union[builtins.int, builtins.None]'
-
-[case testOptionalTypeOrTypeComplexUnion]
-from typing import Union
-def f(a: Union[int, str, None]) -> None:
- reveal_type(a or 'default')
-[out]
-main:3: error: Revealed type is 'Union[builtins.int, builtins.str]'
-
-[case testOptionalTypeOrTypeNoTriggerPlain]
-from typing import Optional
-def f(a: Optional[int], b: int) -> int:
- return b or a
-[out]
-main:3: error: Incompatible return value type (got "Optional[int]", expected "int")
-
-[case testOptionalTypeOrTypeNoTriggerTypeVar]
-from typing import Optional, TypeVar
-T = TypeVar('T')
-def f(a: Optional[T], b: T) -> T:
- return b or a
-[out]
-main:4: error: Incompatible return value type (got "Optional[T]", expected "T")
-
-[case testNoneOrStringIsString]
-def f() -> str:
- a = None
- b = ''
- return a or b
-[out]
-
-[case testNoneOrTypeVarIsTypeVar]
-from typing import TypeVar
-T = TypeVar('T')
-def f(b: T) -> T:
- a = None
- return a or b
-[out]
-
-[case testYieldNothingInFunctionReturningGenerator]
-from typing import Generator
-def f() -> Generator[None, None, None]:
- yield
-[out]
-
-[case testNoneAndStringIsNone]
-a = None
-b = "foo"
-reveal_type(a and b) # E: Revealed type is 'builtins.None'
-
-[case testNoneMatchesObjectInOverload]
-import a
-a.f(None)
-
-[file a.pyi]
-from typing import overload
- at overload
-def f() -> None: ...
- at overload
-def f(o: object) -> None: ...
-
-[case testGenericSubclassReturningNone]
-from typing import Generic, TypeVar
-
-T = TypeVar('T')
-
-class Base(Generic[T]):
- def f(self) -> T:
- pass
-
-class SubNone(Base[None]):
- def f(self) -> None:
- pass
-
-class SubInt(Base[int]):
- def f(self) -> int:
- return 1
-
-[case testUseOfNoneReturningFunction]
-from typing import Optional
-def f() -> None:
- pass
-
-def g(x: Optional[int]) -> int:
- pass
-
-x = f() # E: Function does not return a value
-f() + 1 # E: Function does not return a value
-g(f()) # E: Function does not return a value
-
-[case testEmptyReturn]
-def f() -> None:
- return
-
-[case testReturnNone]
-def f() -> None:
- return None
-
-[case testNoneCallable]
-from typing import Callable
-def f() -> None: pass
-x = f # type: Callable[[], None]
-
-[case testOptionalCallable]
-from typing import Callable, Optional
-T = Optional[Callable[..., None]]
-
-[case testAnyTypeInPartialTypeList]
-# flags: --check-untyped-defs
-def f(): ...
-
-def lookup_field(name, obj):
- try:
- pass
- except:
- attr = f()
- else:
- attr = None
-
-[case testTernaryWithNone]
-reveal_type(None if bool() else 0) # E: Revealed type is 'Union[builtins.int, builtins.None]'
-[builtins fixtures/bool.pyi]
-
-[case testListWithNone]
-reveal_type([0, None, 0]) # E: Revealed type is 'builtins.list[Union[builtins.int, builtins.None]]'
-[builtins fixtures/list.pyi]
-
-[case testOptionalWhitelistSuppressesOptionalErrors]
-# flags: --strict-optional-whitelist
-import a
-import b
-[file a.py]
-from typing import Optional
-x = None # type: Optional[str]
-x + "foo"
-
-[file b.py]
-from typing import Optional
-x = None # type: Optional[int]
-x + 1
-
-[case testOptionalWhitelistPermitsOtherErrors]
-# flags: --strict-optional-whitelist
-import a
-import b
-[file a.py]
-from typing import Optional
-x = None # type: Optional[str]
-x + "foo"
-
-[file b.py]
-from typing import Optional
-x = None # type: Optional[int]
-x + 1
-1 + "foo"
-[out]
-tmp/b.py:4: error: Unsupported operand types for + ("int" and "str")
-
-[case testOptionalWhitelistPermitsWhitelistedFiles]
-# flags: --strict-optional-whitelist **/a.py
-import a
-import b
-[file a.py]
-from typing import Optional
-x = None # type: Optional[str]
-x + "foo"
-
-[file b.py]
-from typing import Optional
-x = None # type: Optional[int]
-x + 1
-[out]
-tmp/a.py:3: error: Unsupported left operand type for + (some union)
-
-[case testNoneContextInference]
-from typing import Dict, List
-def f() -> List[None]:
- return []
-def g() -> Dict[None, None]:
- return {}
-[builtins fixtures/dict.pyi]
-
-[case testRaiseFromNone]
-raise BaseException from None
-[builtins fixtures/exception.pyi]
-
-[case testOptionalNonPartialTypeWithNone]
-from typing import Generator
-def f() -> Generator[str, None, None]: pass
-x = f()
-reveal_type(x) # E: Revealed type is 'typing.Generator[builtins.str, builtins.None, builtins.None]'
-l = [f()]
-reveal_type(l) # E: Revealed type is 'builtins.list[typing.Generator*[builtins.str, builtins.None, builtins.None]]'
-[builtins fixtures/list.pyi]
-
-[case testNoneListTernary]
-x = [None] if "" else [1] # E: List item 0 has incompatible type "int"
-[builtins fixtures/list.pyi]
-
-[case testInferEqualsNotOptional]
-from typing import Optional
-x = '' # type: Optional[str]
-if x == '<string>':
- reveal_type(x) # E: Revealed type is 'builtins.str'
-else:
- reveal_type(x) # E: Revealed type is 'Union[builtins.str, builtins.None]'
-[builtins fixtures/ops.pyi]
-
-[case testInferEqualsNotOptionalWithUnion]
-from typing import Union
-x = '' # type: Union[str, int, None]
-if x == '<string>':
- reveal_type(x) # E: Revealed type is 'Union[builtins.str, builtins.int]'
-else:
- reveal_type(x) # E: Revealed type is 'Union[builtins.str, builtins.int, builtins.None]'
-[builtins fixtures/ops.pyi]
-
-[case testInferEqualsNotOptionalWithOverlap]
-from typing import Union
-x = '' # type: Union[str, int, None]
-if x == object():
- reveal_type(x) # E: Revealed type is 'Union[builtins.str, builtins.int]'
-else:
- reveal_type(x) # E: Revealed type is 'Union[builtins.str, builtins.int, builtins.None]'
-[builtins fixtures/ops.pyi]
-
-[case testInferEqualsStillOptionalWithNoOverlap]
-from typing import Optional
-x = '' # type: Optional[str]
-if x == 0:
- reveal_type(x) # E: Revealed type is 'Union[builtins.str, builtins.None]'
-else:
- reveal_type(x) # E: Revealed type is 'Union[builtins.str, builtins.None]'
-[builtins fixtures/ops.pyi]
-
-[case testInferEqualsStillOptionalWithBothOptional]
-from typing import Union
-x = '' # type: Union[str, int, None]
-y = '' # type: Union[str, None]
-if x == y:
- reveal_type(x) # E: Revealed type is 'Union[builtins.str, builtins.int, builtins.None]'
-else:
- reveal_type(x) # E: Revealed type is 'Union[builtins.str, builtins.int, builtins.None]'
-[builtins fixtures/ops.pyi]
-
-[case testWarnNoReturnWorksWithStrictOptional]
-# flags: --warn-no-return
-def f() -> None:
- 1 + 1 # no error
-
-def g() -> int:
- 1 + 1 #
-[out]
-main:5: note: Missing return statement
-
-[case testGenericTypeAliasesOptional]
-from typing import TypeVar, Generic, Optional
-T = TypeVar('T')
-class Node(Generic[T]):
- def __init__(self, x: T) -> None:
- self.x = x
-
-ONode = Optional[Node[T]]
-def f(x: T) -> ONode[T]:
- if 1 > 0:
- return Node(x)
- else:
- return None
-
-x = None # type: ONode[int]
-x = f(1)
-x = f('x') # E: Argument 1 to "f" has incompatible type "str"; expected "int"
-
-x.x = 1 # E: Some element of union has no attribute "x"
-if x is not None:
- x.x = 1 # OK here
-
-[builtins fixtures/ops.pyi]
-
-[case testOptionalLambdaInference]
-from typing import Optional, Callable
-f = None # type: Optional[Callable[[int], None]]
-f = lambda x: None
-f(0)
-[builtins fixtures/function.pyi]
diff --git a/test-data/unit/check-overloading.test b/test-data/unit/check-overloading.test
deleted file mode 100644
index e173fb2..0000000
--- a/test-data/unit/check-overloading.test
+++ /dev/null
@@ -1,759 +0,0 @@
--- Test cases for function overloading
-
-
-[case testTypeCheckOverloadedFunctionBody]
-from typing import overload
- at overload
-def f(x: 'A'):
- x = B() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
- x = A()
- at overload
-def f(x: 'B'):
- x = A() # E: Incompatible types in assignment (expression has type "A", variable has type "B")
- x = B()
-class A: pass
-class B: pass
-[out]
-
-[case testTypeCheckOverloadedMethodBody]
-from typing import overload
-class A:
- @overload
- def f(self, x: 'A'):
- x = B() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
- x = A()
- @overload
- def f(self, x: 'B'):
- x = A() # E: Incompatible types in assignment (expression has type "A", variable has type "B")
- x = B()
-class B: pass
-[out]
-
-[case testCallToOverloadedFunction]
-from typing import overload
-f(C()) # E: No overload variant of "f" matches argument types [__main__.C]
-f(A())
-f(B())
-
- at overload
-def f(x: 'A') -> None: pass
- at overload
-def f(x: 'B') -> None: pass
-
-class A: pass
-class B: pass
-class C: pass
-
-[case testOverloadedFunctionReturnValue]
-from typing import overload
-a, b = None, None # type: (A, B)
-b = f(a) # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-a = f(b) # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-a = f(a)
-b = f(b)
-
- at overload
-def f(x: 'A') -> 'A': pass
- at overload
-def f(x: 'B') -> 'B': pass
-class A: pass
-class B: pass
-
-[case testCallToOverloadedMethod]
-from typing import overload
-A().f(C()) # E: No overload variant of "f" of "A" matches argument types [__main__.C]
-A().f(A())
-A().f(B())
-
-class A:
- @overload
- def f(self, x: 'A') -> None: pass
- @overload
- def f(self, x: 'B') -> None: pass
-
-class B: pass
-class C: pass
-
-[case testOverloadedMethodReturnValue]
-from typing import overload
-a, b = None, None # type: (A, B)
-b = a.f(a) # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-a = a.f(b) # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-a = a.f(a)
-b = a.f(b)
-
-class A:
- @overload
- def f(self, x: 'A') -> 'A': pass
- @overload
- def f(self, x: 'B') -> 'B': pass
-class B: pass
-
-[case testOverloadsWithDifferentArgumentCounts]
-from typing import overload
-a, b = None, None # type: (A, B)
-a = f(a)
-b = f(a) # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-f(b) # E: No overload variant of "f" matches argument types [__main__.B]
-b = f(b, a)
-a = f(b, a) # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-f(a, a) # E: No overload variant of "f" matches argument types [__main__.A, __main__.A]
-f(b, b) # E: No overload variant of "f" matches argument types [__main__.B, __main__.B]
-
- at overload
-def f(x: 'A') -> 'A': pass
- at overload
-def f(x: 'B', y: 'A') -> 'B': pass
-class A: pass
-class B: pass
-
-[case testGenericOverloadVariant]
-from typing import overload, TypeVar, Generic
-t = TypeVar('t')
-ab, ac, b, c = None, None, None, None # type: (A[B], A[C], B, C)
-b = f(ab)
-c = f(ac)
-b = f(ac) # E: Incompatible types in assignment (expression has type "C", variable has type "B")
-b = f(b)
-c = f(b) # E: Incompatible types in assignment (expression has type "B", variable has type "C")
- at overload
-def f(x: 'A[t]') -> t: pass
- at overload
-def f(x: 'B') -> 'B': pass
-class A(Generic[t]): pass
-class B: pass
-class C: pass
-
-[case testOverloadedInit]
-from typing import overload
-a, b = None, None # type: (A, B)
-a = A(a)
-a = A(b)
-a = A(object()) # E: No overload variant of "A" matches argument types [builtins.object]
-
-class A:
- @overload
- def __init__(self, a: 'A') -> None: pass
- @overload
- def __init__(self, b: 'B') -> None: pass
-class B: pass
-
-[case testIntersectionTypeCompatibility]
-from typing import overload, Callable
-o = None # type: object
-a = None # type: A
-
-a = f # E: Incompatible types in assignment (expression has type overloaded function, variable has type "A")
-o = f
-
- at overload
-def f(a: 'A') -> None: pass
- at overload
-def f(a: Callable[[], None]) -> None: pass
-class A: pass
-
-[case testCompatibilityOfIntersectionTypeObjectWithStdType]
-from typing import overload
-t, a = None, None # type: (type, A)
-
-a = A # E: Incompatible types in assignment (expression has type "A" (type object), variable has type "A")
-t = A
-
-class A:
- @overload
- def __init__(self, a: 'A') -> None: pass
- @overload
- def __init__(self, a: 'B') -> None: pass
-class B: pass
-
-[case testOverloadedGetitem]
-from typing import overload
-a, b = None, None # type: int, str
-a = A()[a]
-b = A()[a] # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-b = A()[b]
-a = A()[b] # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-
-class A:
- @overload
- def __getitem__(self, a: int) -> int: pass
- @overload
- def __getitem__(self, b: str) -> str: pass
-
-[case testOverloadedGetitemWithGenerics]
-from typing import TypeVar, Generic, overload
-t = TypeVar('t')
-a, b, c = None, None, None # type: (A, B, C[A])
-a = c[a]
-b = c[a] # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-a = c[b]
-b = c[b] # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-
-class C(Generic[t]):
- @overload
- def __getitem__(self, a: 'A') -> t: pass
- @overload
- def __getitem__(self, b: 'B') -> t: pass
-class A: pass
-class B: pass
-
-[case testImplementingOverloadedMethod]
-from typing import overload
-from abc import abstractmethod, ABCMeta
-
-class I(metaclass=ABCMeta):
- @overload
- @abstractmethod
- def f(self) -> None: pass
- @overload
- @abstractmethod
- def f(self, a: 'A') -> None: pass
-class A(I):
- @overload
- def f(self) -> None: pass
- @overload
- def f(self, a: 'A') -> None: pass
-
-[case testOverloadWithFunctionType]
-from typing import overload, Callable
-class A: pass
- at overload
-def f(x: A) -> None: pass
- at overload
-def f(x: Callable[[], None]) -> None: pass
-
-f(A())
-[builtins fixtures/function.pyi]
-
-[case testVarArgsOverload]
-from typing import overload, Any
- at overload
-def f(x: 'A', *more: Any) -> 'A': pass
- at overload
-def f(x: 'B', *more: Any) -> 'A': pass
-f(A())
-f(A(), A, A)
-f(B())
-f(B(), B)
-f(B(), B, B)
-f(object()) # E: No overload variant of "f" matches argument types [builtins.object]
-class A: pass
-class B: pass
-[builtins fixtures/list.pyi]
-
-[case testVarArgsOverload2]
-from typing import overload
- at overload
-def f(x: 'A', *more: 'B') -> 'A': pass
- at overload
-def f(x: 'B', *more: 'A') -> 'A': pass
-f(A(), B())
-f(A(), B(), B())
-f(A(), A(), B()) # E: No overload variant of "f" matches argument types [__main__.A, __main__.A, __main__.B]
-f(A(), B(), A()) # E: No overload variant of "f" matches argument types [__main__.A, __main__.B, __main__.A]
-class A: pass
-class B: pass
-[builtins fixtures/list.pyi]
-
-[case testOverloadWithTypeObject]
-from typing import overload
- at overload
-def f(a: 'A', t: type) -> None: pass
- at overload
-def f(a: 'B', t: type) -> None: pass
-f(A(), B)
-f(B(), A)
-class A: pass
-class B: pass
-[builtins fixtures/function.pyi]
-
-[case testOverloadedInitAndTypeObjectInOverload]
-from typing import overload
- at overload
-def f(t: type) -> 'A': pass
- at overload
-def f(t: 'A') -> 'B': pass
-a, b = None, None # type: (A, B)
-a = f(A)
-b = f(a)
-b = f(A) # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-a = f(a) # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-class A:
- @overload
- def __init__(self) -> None: pass
- @overload
- def __init__(self, a: 'A') -> None: pass
-class B:
- pass
-
-[case testOverlappingErasedSignatures]
-from typing import overload, List
- at overload
-def f(a: List[int]) -> int: pass
- at overload
-def f(a: List[str]) -> int: pass
-list_int = [] # type: List[int]
-list_str = [] # type: List[str]
-list_object = [] # type: List[object]
-n = f(list_int)
-m = f(list_str)
-n = 1
-m = 1
-n = 'x' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-m = 'x' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-f(list_object) # E: Argument 1 to "f" has incompatible type List[object]; expected List[int]
-[builtins fixtures/list.pyi]
-
-[case testOverlappingOverloadSignatures]
-from typing import overload
-class A: pass
-class B(A): pass
- at overload
-def f(x: B) -> int: pass # E: Overloaded function signatures 1 and 2 overlap with incompatible return types
- at overload
-def f(x: A) -> str: pass
-
-[case testContravariantOverlappingOverloadSignatures]
-from typing import overload
-class A: pass
-class B(A): pass
- at overload
-def f(x: A) -> A: pass
- at overload
-def f(x: B) -> B: pass # This is more specific than the first item, and thus
- # will never be called.
-
-[case testPartiallyCovariantOverlappingOverloadSignatures]
-from typing import overload
-class A: pass
-class B(A): pass
- at overload
-def f(x: B) -> A: pass # E: Overloaded function signatures 1 and 2 overlap with incompatible return types
- at overload
-def f(x: A) -> B: pass
-
-[case testPartiallyContravariantOverloadSignatures]
-from typing import overload
-class A: pass
-class B(A): pass
- at overload
-def g(x: A) -> int: pass # Fine, since A us supertype of B.
- at overload
-def g(x: B) -> str: pass
-
-[case testCovariantOverlappingOverloadSignatures]
-from typing import overload
-class A: pass
-class B(A): pass
- at overload
-def g(x: B) -> B: pass
- at overload
-def g(x: A) -> A: pass
-
-[case testCovariantOverlappingOverloadSignaturesWithSomeSameArgTypes]
-from typing import overload
-class A: pass
-class B(A): pass
- at overload
-def g(x: int, y: B) -> B: pass
- at overload
-def g(x: int, y: A) -> A: pass
-
-[case testCovariantOverlappingOverloadSignaturesWithAnyType]
-from typing import Any, overload
- at overload
-def g(x: int) -> int: pass
- at overload
-def g(x: Any) -> Any: pass
-
-[case testContravariantOverlappingOverloadSignaturesWithAnyType]
-from typing import Any, overload
- at overload
-def g(x: Any) -> Any: pass # E: Overloaded function signatures 1 and 2 overlap with incompatible return types
- at overload
-def g(x: int) -> int: pass
-
-[case testOverloadedLtAndGtMethods]
-from typing import overload
-class A:
- def __lt__(self, x: A) -> int: pass
- def __gt__(self, x: A) -> int: pass
-class B:
- @overload
- def __lt__(self, x: B) -> int: pass
- @overload
- def __lt__(self, x: A) -> int: pass
- @overload
- def __gt__(self, x: B) -> int: pass
- @overload
- def __gt__(self, x: A) -> int: pass
-A() < A()
-A() < B()
-B() < A()
-B() < B()
-A() < object() # E: Unsupported operand types for < ("A" and "object")
-B() < object() # E: No overload variant of "__lt__" of "B" matches argument types [builtins.object]
-
-[case testOverloadedForwardMethodAndCallingReverseMethod]
-from typing import overload
-class A:
- @overload
- def __add__(self, x: 'A') -> int: pass
- @overload
- def __add__(self, x: int) -> int: pass
-class B:
- def __radd__(self, x: A) -> int: pass
-A() + A()
-A() + 1
-A() + B()
-A() + '' # E: No overload variant of "__add__" of "A" matches argument types [builtins.str]
-
-[case testOverrideOverloadedMethodWithMoreGeneralArgumentTypes]
-from typing import overload
-
-class IntSub(int): pass
-
-class StrSub(str): pass
-class A:
- @overload
- def f(self, x: IntSub) -> int: return 0
- @overload
- def f(self, x: StrSub) -> str: return ''
-class B(A):
- @overload
- def f(self, x: int) -> int: return 0
- @overload
- def f(self, x: str) -> str: return ''
-[out]
-
-[case testOverrideOverloadedMethodWithMoreSpecificArgumentTypes]
-from typing import overload
-
-class IntSub(int): pass
-
-class StrSub(str): pass
-class A:
- @overload
- def f(self, x: int) -> int: return 0
- @overload
- def f(self, x: str) -> str: return ''
-class B(A):
- @overload
- def f(self, x: IntSub) -> int: return 0
- @overload
- def f(self, x: str) -> str: return ''
-class C(A):
- @overload
- def f(self, x: int) -> int: return 0
- @overload
- def f(self, x: StrSub) -> str: return ''
-class D(A):
- @overload
- def f(self, x: int) -> int: return 0
- @overload
- def f(self, x: str) -> str: return ''
-[out]
-main:12: error: Signature of "f" incompatible with supertype "A"
-main:17: error: Signature of "f" incompatible with supertype "A"
-
-[case testOverloadingAndDucktypeCompatibility]
-from typing import overload, _promote
-
-class A: pass
-
- at _promote(A)
-class B: pass
-
- at overload
-def f(n: B) -> B:
- return n
- at overload
-def f(n: A) -> A:
- return n
-
-f(B()) + 'x' # E: Unsupported left operand type for + ("B")
-f(A()) + 'x' # E: Unsupported left operand type for + ("A")
-
-[case testOverloadingAndIntFloatSubtyping]
-from typing import overload
- at overload
-def f(x: float) -> None: pass
- at overload
-def f(x: str) -> None: pass
-f(1.1)
-f('')
-f(1)
-f(()) # E: No overload variant of "f" matches argument types [Tuple[]]
-[builtins fixtures/primitives.pyi]
-[out]
-
-[case testOverloadingVariableInputs]
-from typing import overload
- at overload
-def f(x: int, y: int) -> None: pass
- at overload
-def f(x: int) -> None: pass
-f(1)
-f(1, 2)
-z = (1, 2)
-f(*z)
-[builtins fixtures/primitives.pyi]
-[out]
-
-[case testTypeInferenceSpecialCaseWithOverloading]
-from typing import overload
-
-class A:
- def __add__(self, x: A) -> A: pass
-class B:
- def __radd__(self, x: A) -> B: pass
-
- at overload
-def f(x: A) -> A: pass
- at overload
-def f(x: B) -> B: pass
-
-f(A() + B())() # E: "B" not callable
-
-[case testKeywordArgOverload]
-from typing import overload
- at overload
-def f(x: int, y: str) -> int: pass
- at overload
-def f(x: str, y: int) -> str: pass
-f(x=1, y='')() # E: "int" not callable
-f(y=1, x='')() # E: "str" not callable
-
-[case testIgnoreOverloadVariantBasedOnKeywordArg]
-from typing import overload
- at overload
-def f(x: int) -> int: pass
- at overload
-def f(y: int) -> str: pass
-f(x=1)() # E: "int" not callable
-f(y=1)() # E: "str" not callable
-
-[case testOverloadWithTupleVarArg]
-from typing import overload
- at overload
-def f(x: int, y: str) -> int: pass
- at overload
-def f(*x: str) -> str: pass
-f(*(1,))() # E: No overload variant of "f" matches argument types [Tuple[builtins.int]]
-f(*('',))() # E: "str" not callable
-f(*(1, ''))() # E: "int" not callable
-f(*(1, '', 1))() # E: No overload variant of "f" matches argument types [Tuple[builtins.int, builtins.str, builtins.int]]
-
-[case testPreferExactSignatureMatchInOverload]
-from typing import overload, List
- at overload
-def f(x: int, y: List[int] = None) -> int: pass
- at overload
-def f(x: int, y: List[str] = None) -> int: pass
-f(y=[1], x=0)() # E: "int" not callable
-f(y=[''], x=0)() # E: "int" not callable
-a = f(y=[['']], x=0) # E: List item 0 has incompatible type List[str]
-a() # E: "int" not callable
-[builtins fixtures/list.pyi]
-
-[case testOverloadWithDerivedFromAny]
-from typing import Any, overload
-Base = None # type: Any
-
-class C:
- @overload
- def __init__(self, a: str) -> None: pass
- @overload
- def __init__(self, a: int) -> None: pass
-
-class Derived(Base):
- def to_dict(self) -> C:
- return C(self) # fails without the fix for #1363
-C(Derived()) # fails without the hack
-C(Base()) # Always ok
-
-[case testOverloadWithBoundedTypeVar]
-from typing import overload, TypeVar
-T = TypeVar('T', bound=str)
- at overload
-def f(x: T) -> T: pass
- at overload
-def f(x: int) -> bool: pass
-class mystr(str): pass
-
-f('x')() # E: "str" not callable
-f(1)() # E: "bool" not callable
-f(1.1) # E: No overload variant of "f" matches argument types [builtins.float]
-f(mystr())() # E: "mystr" not callable
-[builtins fixtures/primitives.pyi]
-
-[case testOverloadedCallWithVariableTypes]
-from typing import overload, TypeVar, List
-T = TypeVar('T', bound=str)
- at overload
-def f(x: T) -> T: pass
- at overload
-def f(x: List[T]) -> None: pass
-class mystr(str): pass
-
-U = TypeVar('U', bound=mystr)
-V = TypeVar('V')
-def g(x: U, y: V) -> None:
- f(x)() # E: "mystr" not callable
- f(y) # E: No overload variant of "f" matches argument types [V`-2]
- a = f([x]) # E: "f" does not return a value
- f([y]) # E: Type argument 1 of "f" has incompatible value "V"
- f([x, y]) # E: Type argument 1 of "f" has incompatible value "object"
-[builtins fixtures/list.pyi]
-[out]
-
-[case testOverlapWithTypeVars]
-from typing import overload, TypeVar, Sequence
-T = TypeVar('T', bound=str)
- at overload
-def f(x: Sequence[T]) -> None: pass
- at overload
-def f(x: Sequence[int]) -> int: pass
-# These are considered overlapping despite the bound on T due to runtime type erasure.
-[out]
-main:4: error: Overloaded function signatures 1 and 2 overlap with incompatible return types
-
-[case testOverlapWithTypeVarsWithValues]
-from typing import overload, TypeVar
-AnyStr = TypeVar('AnyStr', bytes, str)
-
- at overload
-def f(x: int) -> int: pass
- at overload
-def f(x: AnyStr) -> str: pass
-
-f(1)() # E: "int" not callable
-f('1')() # E: "str" not callable
-f(b'1')() # E: "str" not callable
-f(1.0) # E: No overload variant of "f" matches argument types [builtins.float]
-
- at overload
-def g(x: AnyStr, *a: AnyStr) -> None: pass
- at overload
-def g(x: int, *a: AnyStr) -> None: pass
-
-g('foo')
-g('foo', 'bar')
-g('foo', b'bar') # E: Type argument 1 of "g" has incompatible value "object"
-g(1)
-g(1, 'foo')
-g(1, 'foo', b'bar') # E: Type argument 1 of "g" has incompatible value "object"
-[builtins fixtures/primitives.pyi]
-
-[case testBadOverlapWithTypeVarsWithValues]
-from typing import overload, TypeVar
-AnyStr = TypeVar('AnyStr', bytes, str)
-
- at overload
-def f(x: AnyStr) -> None: pass # E: Overloaded function signatures 1 and 2 overlap with incompatible return types
- at overload
-def f(x: str) -> bool: pass
-[builtins fixtures/primitives.pyi]
-
-[case testOverlappingOverloadCounting]
-from typing import overload
-class A: pass
-class B(A): pass
- at overload
-def f(x: int) -> None: pass
- at overload
-def f(x: B) -> str: pass # E: Overloaded function signatures 2 and 3 overlap with incompatible return types
- at overload
-def f(x: A) -> int: pass
-
-[case testOverloadWithTupleMatchingTypeVar]
-from typing import TypeVar, Generic, Tuple, overload
-
-T = TypeVar('T')
-
-class A(Generic[T]):
- @overload
- def f(self, arg: T) -> None:
- pass
- @overload
- def f(self, arg: T, default: int) -> None:
- pass
-
-b = A() # type: A[Tuple[int, int]]
-b.f((0, 0))
-b.f((0, '')) # E: Argument 1 to "f" of "A" has incompatible type "Tuple[int, str]"; expected "Tuple[int, int]"
-
-[case testSingleOverload]
-from typing import overload
- at overload
-def f(a: int) -> None: pass
-def f(a: str) -> None: pass
-[out]
-main:2: error: Single overload definition, multiple required
-main:4: error: Name 'f' already defined
-
-[case testSingleOverload2]
-from typing import overload
-def f(a: int) -> None: pass
- at overload
-def f(a: str) -> None: pass
-[out]
-main:3: error: Name 'f' already defined
-main:3: error: Single overload definition, multiple required
-
-[case testNonconsecutiveOverloads]
-from typing import overload
- at overload
-def f(a: int) -> None: pass
-1
- at overload
-def f(a: str) -> None: pass
-[out]
-main:2: error: Single overload definition, multiple required
-main:5: error: Name 'f' already defined
-main:5: error: Single overload definition, multiple required
-
-[case testNonconsecutiveOverloadsMissingFirstOverload]
-from typing import overload
-def f(a: int) -> None: pass
-1
- at overload
-def f(a: str) -> None: pass
-[out]
-main:4: error: Name 'f' already defined
-main:4: error: Single overload definition, multiple required
-
-[case testNonconsecutiveOverloadsMissingLaterOverload]
-from typing import overload
- at overload
-def f(a: int) -> None: pass
-1
-def f(a: str) -> None: pass
-[out]
-main:2: error: Single overload definition, multiple required
-main:5: error: Name 'f' already defined
-
-[case testOverloadTuple]
-from typing import overload, Tuple
- at overload
-def f(x: int, y: Tuple[str, ...]) -> None: pass
- at overload
-def f(x: int, y: str) -> None: pass
-f(1, ('2', '3'))
-f(1, (2, '3')) # E: Argument 2 to "f" has incompatible type "Tuple[int, str]"; expected Tuple[str, ...]
-f(1, ('2',))
-f(1, '2')
-f(1, (2, 3)) # E: Argument 2 to "f" has incompatible type "Tuple[int, int]"; expected Tuple[str, ...]
-x = ('2', '3') # type: Tuple[str, ...]
-f(1, x)
-y = (2, 3) # type: Tuple[int, ...]
-f(1, y) # E: Argument 2 to "f" has incompatible type Tuple[int, ...]; expected Tuple[str, ...]
-[builtins fixtures/tuple.pyi]
-
-[case testCallableSpecificOverload]
-from typing import overload, Callable
- at overload
-def f(a: Callable[[], int]) -> None: pass
- at overload
-def f(a: str) -> None: pass
-f(0) # E: No overload variant of "f" matches argument types [builtins.int]
diff --git a/test-data/unit/check-python2.test b/test-data/unit/check-python2.test
deleted file mode 100644
index 99a55f0..0000000
--- a/test-data/unit/check-python2.test
+++ /dev/null
@@ -1,221 +0,0 @@
--- Type checker test cases for Python 2.x mode.
-
-
-[case testUnicode]
-u = u'foo'
-u = unicode()
-s = ''
-s = u'foo' # E: Incompatible types in assignment (expression has type "unicode", variable has type "str")
-s = b'foo'
-[builtins_py2 fixtures/python2.pyi]
-
-[case testTypeVariableUnicode]
-from typing import TypeVar
-T = TypeVar(u'T')
-
-[case testNamedTuple*sh Unicode]
-from typing import NamedTuple
-from collections import namedtuple
-N = NamedTuple(u'N', [(u'x', int)])
-n = namedtuple(u'n', u'x y')
-
-[builtins fixtures/dict.pyi]
-
-[case testPrintStatement]
-print ''() # E: "str" not callable
-print 1, 1() # E: "int" not callable
-
-[case testPrintStatementWithTarget]
-class A:
- def write(self, s: str) -> None: pass
-
-print >>A(), ''
-print >>None, ''
-print >>1, '' # E: "int" has no attribute "write"
-print >>(None + ''), None # E: Unsupported left operand type for + (None)
-
-[case testDivision]
-class A:
- def __div__(self, x: int) -> str: pass
-s = A() / 1
-s = ''
-s = 1 # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-
-[case testStrUnicodeCompatibility]
-import typing
-def f(x: unicode) -> None: pass
-f('')
-f(u'')
-f(b'')
-[builtins_py2 fixtures/python2.pyi]
-
-[case testStaticMethodWithCommentSignature]
-class A:
- @staticmethod
- def f(x): # type: (int) -> str
- return ''
-A.f(1)
-A.f('') # E: Argument 1 to "f" of "A" has incompatible type "str"; expected "int"
-[builtins_py2 fixtures/staticmethod.pyi]
-
-[case testRaiseTuple]
-import typing
-raise BaseException, "a"
-raise BaseException, "a", None
-raise BaseException, "a", None, None # E: Exception must be derived from BaseException
-[builtins_py2 fixtures/exception.pyi]
-
-[case testTryExceptWithTuple]
-try:
- None
-except BaseException, e:
- e() # E: "BaseException" not callable
-[builtins_py2 fixtures/exception.pyi]
-
-[case testAlternateNameSuggestions]
-class Foo(object):
- def say_hello(self):
- pass
- def say_hell(self):
- pass
- def say_hullo(self):
- pass
- def say_goodbye(self):
- pass
- def go_away(self):
- pass
- def go_around(self):
- pass
- def append(self):
- pass
- def extend(self):
- pass
- def _add(self):
- pass
-
-f = Foo()
-f.say_hallo() # E: "Foo" has no attribute "say_hallo"; maybe "say_hullo", "say_hello", or "say_hell"?
-f.go_array() # E: "Foo" has no attribute "go_array"; maybe "go_away"?
-f.add() # E: "Foo" has no attribute "add"; maybe "append", "extend", or "_add"?
-
-[case testTupleArgListDynamicallyTyped]
-def f(x, (y, z)):
- x = y + z
-f(1, 1)
-f(1, (1, 2))
-
-[case testTupleArgListAnnotated]
-from typing import Tuple
-def f(x, (y, z)): # type: (object, Tuple[int, str]) -> None
- x() # E
- y() # E
- z() # E
-f(object(), (1, ''))
-f(1, 1) # E
-[builtins_py2 fixtures/tuple.pyi]
-[out]
-main:3: error: "object" not callable
-main:4: error: "int" not callable
-main:5: error: "str" not callable
-main:7: error: Argument 2 to "f" has incompatible type "int"; expected "Tuple[int, str]"
-
-[case testNestedTupleArgListAnnotated]
-from typing import Tuple
-def f(x, (y, (a, b))): # type: (object, Tuple[int, Tuple[str, int]]) -> None
- x() # E
- y() # E
- a() # E
- b() # E
-f(object(), (1, ('', 2)))
-f(1, 1) # E
-[builtins fixtures/tuple.pyi]
-[out]
-main:3: error: "object" not callable
-main:4: error: "int" not callable
-main:5: error: "str" not callable
-main:6: error: "int" not callable
-main:8: error: Argument 2 to "f" has incompatible type "int"; expected "Tuple[int, Tuple[str, int]]"
-
-[case testBackquoteExpr]
-`1`.x # E: "str" has no attribute "x"
-
-[case testPython2OnlyStdLibModuleWithoutStub]
-import asyncio
-import Bastion
-[out]
-main:1: error: Cannot find module named 'asyncio'
-main:1: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-main:2: error: No library stub file for standard library module 'Bastion'
-main:2: note: (Stub files are from https://github.com/python/typeshed)
-
-[case testImportFromPython2Builtin]
-from __builtin__ import int as i
-x = 1 # type: i
-y = '' # type: i # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-
-[case testImportPython2Builtin]
-import __builtin__
-x = 1 # type: __builtin__.int
-y = '' # type: __builtin__.int # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-
-[case testImportAsPython2Builtin]
-import __builtin__ as bi
-x = 1 # type: bi.int
-y = '' # type: bi.int # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-
-[case testImportFromPython2BuiltinOverridingDefault]
-from __builtin__ import int
-x = 1 # type: int
-y = '' # type: int # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-
--- Copied from check-functions.test
-[case testEllipsisWithArbitraryArgsOnBareFunctionInPython2]
-def f(x, y, z): # type: (...) -> None
- pass
-
--- Copied from check-functions.test
-[case testEllipsisWithSomethingAfterItFailsInPython2]
-def f(x, y, z): # type: (..., int) -> None
- pass
-[out]
-main:1: error: Parse error before ): Ellipses cannot accompany other argument types in function type signature.
-
-[case testLambdaTupleArgInPython2]
-f = lambda (x, y): x + y
-f((0, 0))
-[out]
-
-[case testLambdaSingletonTupleArgInPython2]
-f = lambda (x,): x + 1
-f((0,))
-[out]
-
-[case testLambdaNoTupleArgInPython2]
-f = lambda (x): x + 1
-f(0)
-[out]
-
-[case testDefTupleEdgeCasesPython2]
-def f((x,)): return x
-def g((x)): return x
-f(0) + g(0)
-[out]
-
-[case testLambdaAsSortKeyForTuplePython2]
-from typing import Any, Tuple, Callable
-def bar(key: Callable[[Tuple[int, int]], int]) -> int:
- pass
-def foo() -> int:
- return bar(key=lambda (a, b): a)
-[out]
-
-[case testImportBuiltins]
-# flags: --fast-parser
-import __builtin__
-__builtin__.str
-
-[case testUnicodeAlias]
-from typing import List
-Alias = List[u'Foo']
-class Foo: pass
-[builtins_py2 fixtures/python2.pyi]
diff --git a/test-data/unit/check-selftype.test b/test-data/unit/check-selftype.test
deleted file mode 100644
index 98bcfa1..0000000
--- a/test-data/unit/check-selftype.test
+++ /dev/null
@@ -1,358 +0,0 @@
-[case testSelfTypeInstance]
-from typing import TypeVar
-
-T = TypeVar('T', bound='A', covariant=True)
-
-class A:
- def copy(self: T) -> T: pass
-
-class B(A):
- pass
-
-reveal_type(A().copy) # E: Revealed type is 'def () -> __main__.A*'
-reveal_type(B().copy) # E: Revealed type is 'def () -> __main__.B*'
-reveal_type(A().copy()) # E: Revealed type is '__main__.A*'
-reveal_type(B().copy()) # E: Revealed type is '__main__.B*'
-
-[builtins fixtures/bool.pyi]
-
-[case testSelfTypeStaticAccess]
-from typing import TypeVar
-
-T = TypeVar('T', bound='A', covariant=True)
-class A:
- def copy(self: T) -> T: pass
-
-class B(A):
- pass
-
-# Erased instances appear on reveal_type; unrelated to self type
-def f(a: A) -> None: pass
-f(A.copy(A()))
-f(A.copy(B()))
-f(B.copy(B()))
-
-# TODO: make it an error
-# f(B.copy(A()))
-
-def g(a: B) -> None: pass
-g(A.copy(A())) # E: Argument 1 to "g" has incompatible type "A"; expected "B"
-g(A.copy(B()))
-g(B.copy(B()))
-
-[builtins fixtures/bool.pyi]
-
-[case testSelfTypeReturn]
-from typing import TypeVar, Type
-
-R = TypeVar('R')
-def _type(self: R) -> Type[R]: pass
-
-T = TypeVar('T', bound='A', covariant=True)
-class A:
- def copy(self: T) -> T:
- if B():
- return A() # E: Incompatible return value type (got "A", expected "T")
- elif A():
- return B() # E: Incompatible return value type (got "B", expected "T")
- reveal_type(_type(self)) # E: Revealed type is 'Type[T`-1]'
- return reveal_type(_type(self)()) # E: Revealed type is 'T`-1'
-
-class B(A):
- pass
-
-Q = TypeVar('Q', bound='C', covariant=True)
-class C:
- def __init__(self, a: int) -> None: pass
-
- def copy(self: Q) -> Q:
- if self:
- return reveal_type(_type(self)(1)) # E: Revealed type is 'Q`-1'
- else:
- return _type(self)() # E: Too few arguments for "C"
-
-
-[builtins fixtures/bool.pyi]
-
-[case testSelfTypeClass]
-from typing import TypeVar, Type
-
-T = TypeVar('T', bound='A')
-
-class A:
- @classmethod
- def new(cls: Type[T]) -> T:
- return reveal_type(cls()) # E: Revealed type is 'T`-1'
-
-class B(A):
- pass
-
-Q = TypeVar('Q', bound='C', covariant=True)
-class C:
- def __init__(self, a: int) -> None: pass
-
- @classmethod
- def new(cls: Type[Q]) -> Q:
- if cls:
- return cls(1)
- else:
- return cls() # E: Too few arguments for "C"
-
-
-reveal_type(A.new) # E: Revealed type is 'def () -> __main__.A*'
-reveal_type(B.new) # E: Revealed type is 'def () -> __main__.B*'
-reveal_type(A.new()) # E: Revealed type is '__main__.A*'
-reveal_type(B.new()) # E: Revealed type is '__main__.B*'
-
-[builtins fixtures/classmethod.pyi]
-
-[case testSelfTypeOverride]
-from typing import TypeVar, cast
-
-T = TypeVar('T', bound='A', covariant=True)
-
-class A:
- def copy(self: T) -> T: pass
-
-class B(A):
- pass
-
-Q = TypeVar('Q', bound='C', covariant=True)
-class C(A):
- def copy(self: Q) -> Q: pass
-
-reveal_type(C().copy) # E: Revealed type is 'def () -> __main__.C*'
-reveal_type(C().copy()) # E: Revealed type is '__main__.C*'
-reveal_type(cast(A, C()).copy) # E: Revealed type is 'def () -> __main__.A*'
-reveal_type(cast(A, C()).copy()) # E: Revealed type is '__main__.A*'
-
-[builtins fixtures/bool.pyi]
-
-[case testSelfTypeSuper]
-from typing import TypeVar, cast
-
-T = TypeVar('T', bound='A', covariant=True)
-
-class A:
- def copy(self: T) -> T: pass
-
-Q = TypeVar('Q', bound='B', covariant=True)
-class B(A):
- def copy(self: Q) -> Q:
- reveal_type(self) # E: Revealed type is 'Q`-1'
- reveal_type(super().copy) # E: Revealed type is 'def () -> Q`-1'
- return super().copy()
-
-[builtins fixtures/bool.pyi]
-
-[case testSelfTypeRecursiveBinding]
-from typing import TypeVar, Callable, Type
-
-T = TypeVar('T', bound='A', covariant=True)
-class A:
- # TODO: This is potentially unsafe, as we use T in an argument type
- def copy(self: T, factory: Callable[[T], T]) -> T:
- return factory(self)
-
- @classmethod
- def new(cls: Type[T], factory: Callable[[T], T]) -> T:
- reveal_type(cls) # E: Revealed type is 'Type[T`-1]'
- reveal_type(cls()) # E: Revealed type is 'T`-1'
- cls(2) # E: Too many arguments for "A"
- return cls()
-
-class B(A):
- pass
-
-reveal_type(A().copy) # E: Revealed type is 'def (factory: def (__main__.A*) -> __main__.A*) -> __main__.A*'
-reveal_type(B().copy) # E: Revealed type is 'def (factory: def (__main__.B*) -> __main__.B*) -> __main__.B*'
-reveal_type(A.new) # E: Revealed type is 'def (factory: def (__main__.A*) -> __main__.A*) -> __main__.A*'
-reveal_type(B.new) # E: Revealed type is 'def (factory: def (__main__.B*) -> __main__.B*) -> __main__.B*'
-
-[builtins fixtures/classmethod.pyi]
-
-[case testSelfTypeBound]
-from typing import TypeVar, Callable, cast
-
-TA = TypeVar('TA', bound='A', covariant=True)
-
-class A:
- def copy(self: TA) -> TA:
- pass
-
-class C(A):
- def copy(self: C) -> C:
- pass
-
-class D(A):
- def copy(self: A) -> A: # E: Return type of "copy" incompatible with supertype "A"
- pass
-
-TB = TypeVar('TB', bound='B', covariant=True)
-class B(A):
- x = 1
- def copy(self: TB) -> TB:
- reveal_type(self.x) # E: Revealed type is 'builtins.int'
- return cast(TB, None)
-
-[builtins fixtures/bool.pyi]
-
--- # TODO: fail for this
--- [case testSelfTypeBare]
--- from typing import TypeVar, Type
---
--- T = TypeVar('T', bound='E')
---
--- class E:
--- def copy(self: T, other: T) -> T: pass
-
-[case testSelfTypeClone]
-from typing import TypeVar, Type
-
-T = TypeVar('T', bound='C')
-
-class C:
- def copy(self: T) -> T:
- return self
-
- @classmethod
- def new(cls: Type[T]) -> T:
- return cls()
-
-def clone(arg: T) -> T:
- reveal_type(arg.copy) # E: Revealed type is 'def () -> T`-1'
- return arg.copy()
-
-
-def make(cls: Type[T]) -> T:
- reveal_type(cls.new) # E: Revealed type is 'def () -> T`-1'
- return cls.new()
-
-[builtins fixtures/classmethod.pyi]
-
-[case testSelfTypeGeneric]
-from typing import TypeVar
-
-T = TypeVar('T', int, str)
-
-class A:
- pass
-
-class B(A):
- def __init__(self, arg: T) -> None:
- super(B, self).__init__()
-
-[case testSelfTypeNonsensical]
-from typing import TypeVar, Type
-
-T = TypeVar('T', bound=str)
-class A:
- def foo(self: T) -> T: # E: The erased type of self 'builtins.str' is not a supertype of its class '__main__.A'
- return self
-
- @classmethod
- def cfoo(cls: Type[T]) -> T: # E: The erased type of self 'Type[builtins.str]' is not a supertype of its class 'Type[__main__.A]'
- return cls()
-
-Q = TypeVar('Q', bound='B')
-class B:
- def foo(self: Q) -> Q:
- return self
-
- @classmethod
- def cfoo(cls: Type[Q]) -> Q:
- return cls()
-
-class C:
- def foo(self: C) -> C: return self
-
- @classmethod
- def cfoo(cls: Type[C]) -> C:
- return cls()
-
-class D:
- def foo(self: str) -> str: # E: The erased type of self 'builtins.str' is not a supertype of its class '__main__.D'
- return self
-
- @staticmethod
- def bar(self: str) -> str:
- return self
-
- @classmethod
- def cfoo(cls: Type[str]) -> str: # E: The erased type of self 'Type[builtins.str]' is not a supertype of its class 'Type[__main__.D]'
- return cls()
-
-[builtins fixtures/classmethod.pyi]
-
-[case testSelfTypeLambdaDefault]
-from typing import Callable
-class C:
- @classmethod
- def foo(cls,
- arg: Callable[[int], str] = lambda a: ''
- ) -> None:
- pass
-
- def bar(self,
- arg: Callable[[int], str] = lambda a: ''
- ) -> None:
- pass
-[builtins fixtures/classmethod.pyi]
-
-[case testSelfTypeNew]
-from typing import TypeVar, Type
-
-T = TypeVar('T', bound=A)
-class A:
- def __new__(cls: Type[T]) -> T:
- return cls()
-
- def __init_subclass__(cls: Type[T]) -> None:
- pass
-
-class B:
- def __new__(cls: Type[T]) -> T: # E: The erased type of self 'Type[__main__.A]' is not a supertype of its class 'Type[__main__.B]'
- return cls()
-
- def __init_subclass__(cls: Type[T]) -> None: # E: The erased type of self 'Type[__main__.A]' is not a supertype of its class 'Type[__main__.B]'
- pass
-
-class C:
- def __new__(cls: Type[C]) -> C:
- return cls()
-
- def __init_subclass__(cls: Type[C]) -> None:
- pass
-
-class D:
- def __new__(cls: D) -> D: # E: The erased type of self '__main__.D' is not a supertype of its class 'Type[__main__.D]'
- return cls
-
- def __init_subclass__(cls: D) -> None: # E: The erased type of self '__main__.D' is not a supertype of its class 'Type[__main__.D]'
- pass
-
-class E:
- def __new__(cls) -> E:
- reveal_type(cls) # E: Revealed type is 'def () -> __main__.E'
- return cls()
-
- def __init_subclass__(cls) -> None:
- reveal_type(cls) # E: Revealed type is 'def () -> __main__.E'
-
-[case testSelfTypeProperty]
-from typing import TypeVar
-
-T = TypeVar('T', bound='A')
-
-class A:
- @property
- def member(self: T) -> T:
- pass
-
-class B(A):
- pass
-
-reveal_type(A().member) # E: Revealed type is '__main__.A*'
-reveal_type(B().member) # E: Revealed type is '__main__.B*'
-
-[builtins fixtures/property.pyi]
diff --git a/test-data/unit/check-semanal-error.test b/test-data/unit/check-semanal-error.test
deleted file mode 100644
index 0a07829..0000000
--- a/test-data/unit/check-semanal-error.test
+++ /dev/null
@@ -1,81 +0,0 @@
--- Type checking after an error during semantic analysis
--- -----------------------------------------------------
---
--- This tests both the semantic analyzer (that it does not generate
--- corrupt state on error) and the type checker (that it can deal with
--- whatever state the semantic analyzer sets up).
-
--- TODO:
--- - invalid type in annotation
--- - invalid function comment type annotation
--- - invalid multiple assignment type annotation
--- - using a type variable as a value
--- - using special names defined in typing as values
-
-[case testMissingModuleImport1]
-import m # E
-m.foo()
-m.x = m.y
-1() # E
-[out]
-main:1: error: Cannot find module named 'm'
-main:1: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-main:4: error: "int" not callable
-
-[case testMissingModuleImport2]
-from m import x # E
-x.foo()
-x.a = x.b
-1() # E
-[out]
-main:1: error: Cannot find module named 'm'
-main:1: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-main:4: error: "int" not callable
-
-[case testMissingModuleImport3]
-from m import * # E
-x # E
-1() # E
-[out]
-main:1: error: Cannot find module named 'm'
-main:1: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-main:2: error: Name 'x' is not defined
-main:3: error: "int" not callable
-
-[case testInvalidBaseClass1]
-class A(X): # E: Name 'X' is not defined
- x = 1
-A().foo(1)
-A().x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-
-[case testInvalidBaseClass2]
-X = 1
-class A(X): # E
- x = 1
-A().foo(1)
-A().x = '' # E
-[out]
-main:2: error: Invalid type "__main__.X"
-main:2: error: Invalid base class
-main:5: error: Incompatible types in assignment (expression has type "str", variable has type "int")
-
-
-[case testInvalidNumberOfTypeArgs]
-from typing import TypeVar
-T = TypeVar('T')
-class C: # Forgot to add type params here
- def __init__(self, t: T) -> None: pass
-c = C(t=3) # type: C[int] # E: "C" expects no type arguments, but 1 given
-
-[case testBreakOutsideLoop]
-break # E: 'break' outside loop
-
-[case testContinueOutsideLoop]
-continue # E: 'continue' outside loop
-
-[case testYieldOutsideFunction]
-yield # E: 'yield' outside function
-
-[case testYieldFromOutsideFunction]
-x = 1
-yield from x # E: 'yield from' outside function
diff --git a/test-data/unit/check-statements.test b/test-data/unit/check-statements.test
deleted file mode 100644
index b945fd1..0000000
--- a/test-data/unit/check-statements.test
+++ /dev/null
@@ -1,1322 +0,0 @@
--- Return statement
--- ----------------
-
-
-[case testReturnValue]
-import typing
-def f() -> 'A':
- return A()
-def g() -> 'B':
- return A()
-class A:
- pass
-class B:
- pass
-[out]
-main:5: error: Incompatible return value type (got "A", expected "B")
-
-[case testReturnSubtype]
-import typing
-def f() -> 'B':
- return A()
-def g() -> 'A':
- return B()
-class A:
- pass
-class B(A):
- pass
-[out]
-main:3: error: Incompatible return value type (got "A", expected "B")
-
-[case testReturnWithoutAValue]
-import typing
-def f() -> 'A':
- return
-def g() -> None:
- return
-class A:
- pass
-[out]
-main:3: error: Return value expected
-
-[case testReturnNoneInFunctionReturningNone]
-import typing
-def f() -> None:
- return None
-def g() -> None:
- return f() # E: No return value expected
-[out]
-
-[case testReturnInGenerator]
-from typing import Generator
-def f() -> Generator[int, None, str]:
- yield 1
- return "foo"
-[out]
-
-[case testEmptyReturnInGenerator]
-from typing import Generator
-def f() -> Generator[int, None, str]:
- yield 1
- return # E: Return value expected
-[out]
-
-[case testEmptyReturnInNoneTypedGenerator]
-from typing import Generator
-def f() -> Generator[int, None, None]:
- yield 1
- return
-[out]
-
-[case testNonEmptyReturnInNoneTypedGenerator]
-from typing import Generator
-def f() -> Generator[int, None, None]:
- yield 1
- return 42 # E: No return value expected
-[out]
-
-[case testReturnInIterator]
-from typing import Iterator
-def f() -> Iterator[int]:
- yield 1
- return "foo"
-[out]
-
-
--- If statement
--- ------------
-
-
-[case testIfStatement]
-
-a = None # type: A
-a2 = None # type: A
-a3 = None # type: A
-b = None # type: bool
-if a:
- a = b # E: Incompatible types in assignment (expression has type "bool", variable has type "A")
-elif a2:
- a = b # E: Incompatible types in assignment (expression has type "bool", variable has type "A")
-elif a3:
- a = b # E: Incompatible types in assignment (expression has type "bool", variable has type "A")
-else:
- a = b # E: Incompatible types in assignment (expression has type "bool", variable has type "A")
-if b:
- pass
-elif b:
- pass
-if b:
- pass
-
-class A: pass
-[builtins fixtures/bool.pyi]
-
-
--- Loops
--- -----
-
-
-[case testWhileStatement]
-
-a = None # type: A
-b = None # type: bool
-while a:
- a = b # Fail
-else:
- a = b # Fail
-while b:
- b = b
-
-class A: pass
-[builtins fixtures/bool.pyi]
-[out]
-main:5: error: Incompatible types in assignment (expression has type "bool", variable has type "A")
-main:7: error: Incompatible types in assignment (expression has type "bool", variable has type "A")
-
-[case testForStatement]
-
-a = None # type: A
-b = None # type: object
-for a in [A()]:
- a = b # Fail
-else:
- a = b # Fail
-
-class A: pass
-[builtins fixtures/list.pyi]
-[out]
-main:5: error: Incompatible types in assignment (expression has type "object", variable has type "A")
-main:7: error: Incompatible types in assignment (expression has type "object", variable has type "A")
-
-[case testBreakStatement]
-import typing
-while None:
- break
-[builtins fixtures/bool.pyi]
-[out]
-
-[case testContinueStatement]
-import typing
-while None:
- continue
-[builtins fixtures/bool.pyi]
-[out]
-
-
--- Operator assignment
--- -------------------
-
-
-[case testPlusAssign]
-
-a, b, c = None, None, None # type: (A, B, C)
-a += b # Fail
-b += a # Fail
-c += a # Fail
-a += c
-
-class A:
- def __add__(self, x: 'C') -> 'A': pass
-
-class B:
- def __add__(self, x: A) -> 'C': pass
-
-class C: pass
-[out]
-main:3: error: Unsupported operand types for + ("A" and "B")
-main:4: error: Result type of + incompatible in assignment
-main:5: error: Unsupported left operand type for + ("C")
-
-[case testMinusAssign]
-
-a, b, c = None, None, None # type: (A, B, C)
-a -= b # Fail
-b -= a # Fail
-c -= a # Fail
-a -= c
-
-class A:
- def __sub__(self, x: 'C') -> 'A': pass
-
-class B:
- def __sub__(self, x: A) -> 'C': pass
-
-class C: pass
-[out]
-main:3: error: Unsupported operand types for - ("A" and "B")
-main:4: error: Result type of - incompatible in assignment
-main:5: error: Unsupported left operand type for - ("C")
-
-[case testMulAssign]
-
-a, c = None, None # type: (A, C)
-a *= a # Fail
-c *= a # Fail
-a *= c
-
-class A:
- def __mul__(self, x: 'C') -> 'A': pass
-
-class C: pass
-[out]
-main:3: error: Unsupported operand types for * ("A" and "A")
-main:4: error: Unsupported left operand type for * ("C")
-
-[case testMatMulAssign]
-a, c = None, None # type: (A, C)
-a @= a # E: Unsupported operand types for @ ("A" and "A")
-c @= a # E: Unsupported left operand type for @ ("C")
-a @= c
-
-class A:
- def __matmul__(self, x: 'C') -> 'A': pass
-
-class C: pass
-
-[case testDivAssign]
-
-a, c = None, None # type: (A, C)
-a /= a # Fail
-c /= a # Fail
-a /= c
-
-class A:
- def __truediv__(self, x: 'C') -> 'A': pass
-
-class C: pass
-[out]
-main:3: error: Unsupported operand types for / ("A" and "A")
-main:4: error: Unsupported left operand type for / ("C")
-
-[case testPowAssign]
-
-a, c = None, None # type: (A, C)
-a **= a # Fail
-c **= a # Fail
-a **= c
-
-class A:
- def __pow__(self, x: 'C') -> 'A': pass
-
-class C: pass
-[out]
-main:3: error: Unsupported operand types for ** ("A" and "A")
-main:4: error: Unsupported left operand type for ** ("C")
-
-[case testSubtypesInOperatorAssignment]
-
-a, b = None, None # type: (A, B)
-b += b
-b += a
-a += b
-
-class A:
- def __add__(self, x: 'A') -> 'B': pass
-
-class B(A): pass
-[out]
-
-[case testAdditionalOperatorsInOpAssign]
-
-a, c = None, None # type: (A, C)
-a &= a # Fail
-a >>= a # Fail
-a //= a # Fail
-a &= c
-a >>= c
-a //= c
-class A:
- def __and__(self, x: 'C') -> 'A': pass
- def __rshift__(self, x: 'C') -> 'A': pass
- def __floordiv__(self, x: 'C') -> 'A': pass
-class C: pass
-[out]
-main:3: error: Unsupported operand types for & ("A" and "A")
-main:4: error: Unsupported operand types for >> ("A" and "A")
-main:5: error: Unsupported operand types for // ("A" and "A")
-
-[case testInplaceOperatorMethods]
-import typing
-class A:
- def __iadd__(self, x: int) -> 'A': pass
- def __imul__(self, x: str) -> 'A': pass
- def __imatmul__(self, x: str) -> 'A': pass
-a = A()
-a += 1
-a *= ''
-a @= ''
-a += '' # E: Argument 1 to "__iadd__" of "A" has incompatible type "str"; expected "int"
-a *= 1 # E: Argument 1 to "__imul__" of "A" has incompatible type "int"; expected "str"
-a @= 1 # E: Argument 1 to "__imatmul__" of "A" has incompatible type "int"; expected "str"
-
-[case testInplaceSetitem]
-class A(object):
- def __init__(self):
- self.a = 0
-
- def __iadd__(self, a):
- # type: (int) -> A
- self.a += 1
- return self
-
-a = A()
-b = [a]
-b[0] += 1
-[builtins fixtures/list.pyi]
-[out]
-
-
--- Assert statement
--- ----------------
-
-
-[case testAssert]
-import typing
-assert None + None # Fail
-assert None
-[out]
-main:2: error: Unsupported left operand type for + (None)
-
-
--- Exception handling
--- ------------------
-
-
-[case testRaiseStatement]
-
-e = None # type: BaseException
-f = None # type: MyError
-a = None # type: A
-raise a # Fail
-raise e
-raise f
-class A: pass
-class MyError(BaseException): pass
-[builtins fixtures/exception.pyi]
-[out]
-main:5: error: Exception must be derived from BaseException
-
-[case testRaiseClassobject]
-import typing
-class A: pass
-class MyError(BaseException): pass
-def f(): pass
-raise BaseException
-raise MyError
-raise A # E: Exception must be derived from BaseException
-raise object # E: Exception must be derived from BaseException
-raise f # E: Exception must be derived from BaseException
-[builtins fixtures/exception.pyi]
-
-[case testRaiseFromStatement]
-
-e = None # type: BaseException
-f = None # type: MyError
-a = None # type: A
-raise e from a # E: Exception must be derived from BaseException
-raise e from e
-raise e from f
-class A: pass
-class MyError(BaseException): pass
-[builtins fixtures/exception.pyi]
-
-[case testRaiseFromClassobject]
-import typing
-class A: pass
-class MyError(BaseException): pass
-def f(): pass
-raise BaseException from BaseException
-raise BaseException from MyError
-raise BaseException from A # E: Exception must be derived from BaseException
-raise BaseException from object # E: Exception must be derived from BaseException
-raise BaseException from f # E: Exception must be derived from BaseException
-[builtins fixtures/exception.pyi]
-
-[case testTryFinallyStatement]
-import typing
-try:
- b = object() # type: A # Fail
-finally:
- c = object() # type: A # Fail
-class A: pass
-[out]
-main:3: error: Incompatible types in assignment (expression has type "object", variable has type "A")
-main:5: error: Incompatible types in assignment (expression has type "object", variable has type "A")
-
-[case testSimpleTryExcept]
-
-try:
- pass
-except BaseException as e:
- a, o = None, None # type: (BaseException, object)
- e = a
- e = o # Fail
-class A: pass
-class B: pass
-[builtins fixtures/exception.pyi]
-[out]
-main:7: error: Incompatible types in assignment (expression has type "object", variable has type "BaseException")
-
-[case testTypeErrorInBlock]
-
-while object:
- x = None # type: A
- x = object()
- x = B()
-class A: pass
-class B: pass
-[out]
-main:4: error: Incompatible types in assignment (expression has type "object", variable has type "A")
-main:5: error: Incompatible types in assignment (expression has type "B", variable has type "A")
-
-[case testTypeErrorInvolvingBaseException]
-
-x, a = None, None # type: (BaseException, A)
-a = BaseException() # Fail
-a = object() # Fail
-x = object() # Fail
-x = A() # Fail
-x = BaseException()
-class A: pass
-[builtins fixtures/exception.pyi]
-[out]
-main:3: error: Incompatible types in assignment (expression has type "BaseException", variable has type "A")
-main:4: error: Incompatible types in assignment (expression has type "object", variable has type "A")
-main:5: error: Incompatible types in assignment (expression has type "object", variable has type "BaseException")
-main:6: error: Incompatible types in assignment (expression has type "A", variable has type "BaseException")
-
-[case testSimpleTryExcept2]
-import typing
-try:
- pass
-except BaseException as e:
- e = object() # Fail
- e = BaseException()
-[builtins fixtures/exception.pyi]
-[out]
-main:5: error: Incompatible types in assignment (expression has type "object", variable has type "BaseException")
-
-[case testBaseClassAsExceptionTypeInExcept]
-import typing
-try:
- pass
-except Err as e:
- e = BaseException() # Fail
- e = Err()
-class Err(BaseException): pass
-[builtins fixtures/exception.pyi]
-[out]
-main:5: error: Incompatible types in assignment (expression has type "BaseException", variable has type "Err")
-
-[case testMultipleExceptHandlers]
-import typing
-try:
- pass
-except BaseException as e:
- pass
-except Err as f:
- f = BaseException() # Fail
- f = Err()
-class Err(BaseException): pass
-[builtins fixtures/exception.pyi]
-[out]
-main:7: error: Incompatible types in assignment (expression has type "BaseException", variable has type "Err")
-
-[case testTryExceptStatement]
-import typing
-try:
- a = B() # type: A # Fail
-except BaseException as e:
- e = A() # Fail
- e = Err()
-except Err as f:
- f = BaseException() # Fail
- f = Err()
-class A: pass
-class B: pass
-class Err(BaseException): pass
-[builtins fixtures/exception.pyi]
-[out]
-main:3: error: Incompatible types in assignment (expression has type "B", variable has type "A")
-main:5: error: Incompatible types in assignment (expression has type "A", variable has type "BaseException")
-main:8: error: Incompatible types in assignment (expression has type "BaseException", variable has type "Err")
-
-[case testTryExceptWithinFunction]
-import typing
-def f() -> None:
- try: pass
- except BaseException as e:
- e = object() # Fail
- e = BaseException()
- except Err as f:
- f = BaseException() # Fail
- f = Err()
-class Err(BaseException): pass
-[builtins fixtures/exception.pyi]
-[out]
-main:5: error: Incompatible types in assignment (expression has type "object", variable has type "BaseException")
-main:8: error: Incompatible types in assignment (expression has type "BaseException", variable has type "Err")
-
-[case testTryExceptFlow]
-def f() -> None:
- x = 1
- try:
- pass
- except:
- raise
- x + 'a' # E: Unsupported left operand type for + ("int")
-[builtins fixtures/exception.pyi]
-[out]
-
-[case testTryWithElse]
-import typing
-try: pass
-except BaseException: pass
-else:
- object(None) # E: Too many arguments for "object"
-[builtins fixtures/exception.pyi]
-
-[case testRedefinedFunctionInTryWithElse]
-def f() -> None: pass
-try:
- pass
-except BaseException:
- f2 = f
-else:
- def f2() -> str: pass
-try:
- pass
-except BaseException:
- f3 = f
-else:
- def f3() -> None: pass
-[builtins fixtures/exception.pyi]
-[out]
-main:7: error: Incompatible redefinition (redefinition with type Callable[[], str], original type Callable[[], None])
-
-[case testExceptWithoutType]
-import typing
-try:
- -None # E: Unsupported operand type for unary - (None)
-except:
- ~None # E: Unsupported operand type for ~ (None)
-[builtins fixtures/exception.pyi]
-
-[case testRaiseWithoutArgument]
-import typing
-try:
- None
-except:
- raise
-[builtins fixtures/exception.pyi]
-
-[case testExceptWithMultipleTypes]
-import typing
-class E1(BaseException): pass
-class E2(E1): pass
-try:
- pass
-except (E1, E2): pass
-except (E1, object): pass # E: Exception type must be derived from BaseException
-except (object, E2): pass # E: Exception type must be derived from BaseException
-except (E1, (E2,)): pass # E: Exception type must be derived from BaseException
-
-except (E1, E2): pass
-except ((E1, E2)): pass
-except (((E1, E2))): pass
-[builtins fixtures/exception.pyi]
-
-[case testExceptWithMultipleTypes2]
-import typing
-class E1(BaseException): pass
-class E2(E1): pass
-try:
- pass
-except (E1, E2) as e1:
- x = e1 # type: E1
- y = e1 # type: E2 # E: Incompatible types in assignment (expression has type "E1", variable has type "E2")
-except (E2, E1) as e2:
- a = e2 # type: E1
- b = e2 # type: E2 # E: Incompatible types in assignment (expression has type "E1", variable has type "E2")
-except (E1, E2, int) as e3: # E: Exception type must be derived from BaseException
- pass
-[builtins fixtures/exception.pyi]
-
-[case testExceptWithMultipleTypes3]
-import typing
-class E1(BaseException): pass
-class E1_1(E1): pass
-class E1_2(E1): pass
-try: pass
-except (E1, E1_1, E1_2) as e1:
- x = e1 # type: E1
- y = e1 # type: E1_1 # E: Incompatible types in assignment (expression has type "E1", variable has type "E1_1")
- z = e1 # type: E1_2 # E: Incompatible types in assignment (expression has type "E1", variable has type "E1_2")
-except (E1_1, E1_2) as e2:
- a = e2 # type: E1
- b = e2 # type: E1_1 # E: Incompatible types in assignment (expression has type "Union[E1_1, E1_2]", variable has type "E1_1")
- c = e2 # type: E1_2 # E: Incompatible types in assignment (expression has type "Union[E1_1, E1_2]", variable has type "E1_2")
-[builtins fixtures/exception.pyi]
-
-[case testExceptWithAnyTypes]
-from typing import Any
-
-E1 = None # type: Any
-class E2(BaseException): pass
-class NotBaseDerived: pass
-
-try:
- pass
-except BaseException as e1:
- reveal_type(e1) # E: Revealed type is 'builtins.BaseException'
-except (E1, BaseException) as e2:
- reveal_type(e2) # E: Revealed type is 'Any'
-except (E1, E2) as e3:
- reveal_type(e3) # E: Revealed type is 'Any'
-except (E1, E2, BaseException) as e4:
- reveal_type(e4) # E: Revealed type is 'Any'
-
-try: pass
-except E1 as e1:
- reveal_type(e1) # E: Revealed type is 'Any'
-except E2 as e2:
- reveal_type(e2) # E: Revealed type is '__main__.E2'
-except NotBaseDerived as e3: # E: Exception type must be derived from BaseException
- pass
-except (NotBaseDerived, E1) as e4: # E: Exception type must be derived from BaseException
- pass
-except (NotBaseDerived, E2) as e5: # E: Exception type must be derived from BaseException
- pass
-except (NotBaseDerived, E1, E2) as e6: # E: Exception type must be derived from BaseException
- pass
-except (E1, E2, NotBaseDerived) as e6: # E: Exception type must be derived from BaseException
- pass
-[builtins fixtures/exception.pyi]
-
-[case testReuseTryExceptionVariable]
-import typing
-class E1(BaseException): pass
-class E2(BaseException): pass
-try: pass
-except E1 as e: pass
-try: pass
-except E1 as e: pass
-try: pass
-except E2 as e: pass
-e + 1 # E: Trying to read deleted variable 'e'
-e = E1() # E: Assignment to variable 'e' outside except: block
-[builtins fixtures/exception.pyi]
-
-[case testReuseDefinedTryExceptionVariable]
-import typing
-class E1(BaseException): pass
-class E2(BaseException): pass
-e = 1
-e = 1
-try: pass
-except E1 as e: pass
-e = 1 # E: Assignment to variable 'e' outside except: block
-e = E1() # E: Assignment to variable 'e' outside except: block
-[builtins fixtures/exception.pyi]
-
-[case testExceptionVariableReuseInDeferredNode1]
-def f(*a: BaseException) -> int:
- x
- try: pass
- except BaseException as err: pass
- try: pass
- except BaseException as err: f(err)
-x = f()
-[builtins fixtures/exception.pyi]
-
-[case testExceptionVariableReuseInDeferredNode2]
-def f(*a: BaseException) -> int:
- try: pass
- except BaseException as err: pass
- x
- try: pass
- except BaseException as err: f(err)
-x = f()
-[builtins fixtures/exception.pyi]
-
-[case testExceptionVariableReuseInDeferredNode3]
-def f(*a: BaseException) -> int:
- try: pass
- except BaseException as err: pass
- try: pass
- except BaseException as err: f(err)
- x
-x = f()
-[builtins fixtures/exception.pyi]
-
-[case testExceptionVariableReuseInDeferredNode4]
-class EA(BaseException):
- a = None # type: int
-class EB(BaseException):
- b = None # type: str
-def f(*arg: BaseException) -> int:
- x
- try: pass
- except EA as err:
- f(err)
- a = err.a
- reveal_type(a)
- try: pass
- except EB as err:
- f(err)
- b = err.b
- reveal_type(b)
-x = f()
-[builtins fixtures/exception.pyi]
-[out]
-main:11: error: Revealed type is 'builtins.int'
-main:16: error: Revealed type is 'builtins.str'
-
-[case testExceptionVariableReuseInDeferredNode5]
-class EA(BaseException):
- a = None # type: int
-class EB(BaseException):
- b = None # type: str
-def f(*arg: BaseException) -> int:
- try: pass
- except EA as err:
- f(err)
- a = err.a
- reveal_type(a)
- x
- try: pass
- except EB as err:
- f(err)
- b = err.b
- reveal_type(b)
-x = f()
-[builtins fixtures/exception.pyi]
-[out]
-main:10: error: Revealed type is 'builtins.int'
-main:16: error: Revealed type is 'builtins.str'
-
-[case testExceptionVariableReuseInDeferredNode6]
-class EA(BaseException):
- a = None # type: int
-class EB(BaseException):
- b = None # type: str
-def f(*arg: BaseException) -> int:
- try: pass
- except EA as err:
- f(err)
- a = err.a
- reveal_type(a)
- try: pass
- except EB as err:
- f(err)
- b = err.b
- reveal_type(b)
- x
-x = f()
-[builtins fixtures/exception.pyi]
-[out]
-main:10: error: Revealed type is 'builtins.int'
-main:15: error: Revealed type is 'builtins.str'
-
-[case testArbitraryExpressionAsExceptionType]
-import typing
-a = BaseException
-try: pass
-except a as b:
- b = BaseException()
- b = object() # E: Incompatible types in assignment (expression has type "object", variable has type "BaseException")
-[builtins fixtures/exception.pyi]
-
-[case testInvalidExceptionCallable]
-import typing
-def exc() -> BaseException: pass
-try: pass
-except exc as e: pass # E: Exception type must be derived from BaseException
-except BaseException() as b: pass # E: Exception type must be derived from BaseException
-[builtins fixtures/exception.pyi]
-
-[case testTupleValueAsExceptionType]
-import typing
-def exc() -> BaseException: pass
-class E1(BaseException): pass
-class E1_1(E1): pass
-class E1_2(E1): pass
-
-exs1 = (E1, E1_1, E1_2)
-try: pass
-except exs1 as e1:
- x = e1 # type: E1
- y = e1 # type: E1_1 # E: Incompatible types in assignment (expression has type "E1", variable has type "E1_1")
- z = e1 # type: E1_2 # E: Incompatible types in assignment (expression has type "E1", variable has type "E1_2")
-
-exs2 = (E1_1, E1_2)
-try: pass
-except exs2 as e2:
- a = e2 # type: E1
- b = e2 # type: E1_1 # E: Incompatible types in assignment (expression has type "Union[E1_1, E1_2]", variable has type "E1_1")
- c = e2 # type: E1_2 # E: Incompatible types in assignment (expression has type "Union[E1_1, E1_2]", variable has type "E1_2")
-
-exs3 = (E1, (E1_1, (E1_2,)))
-try: pass
-except exs3 as e3: pass # E: Exception type must be derived from BaseException
-[builtins fixtures/exception.pyi]
-
-[case testInvalidTupleValueAsExceptionType]
-import typing
-def exc() -> BaseException: pass
-class E1(BaseException): pass
-class E2(E1): pass
-
-exs1 = (E1, E2, int)
-try: pass
-except exs1 as e: pass # E: Exception type must be derived from BaseException
-[builtins fixtures/exception.pyi]
-
-[case testOverloadedExceptionType]
-from typing import overload
-class E(BaseException):
- @overload
- def __init__(self) -> None: pass
- @overload
- def __init__(self, x) -> None: pass
-try:
- pass
-except E as e:
- e = E()
- e = BaseException() # E: Incompatible types in assignment (expression has type "BaseException", variable has type "E")
-[builtins fixtures/exception.pyi]
-
-[case testExceptionWithAnyBaseClass]
-from typing import Any
-E = None # type: Any
-class EE(E): pass
-raise EE()
-raise EE
-[builtins fixtures/exception.pyi]
-
-[case testExceptionIsType]
-from typing import Type
-class B(BaseException): pass
-def f(e: Type[B]):
- try: pass
- except e: pass
-def g(e: Type[BaseException]):
- try: pass
- except e as err:
- reveal_type(err)
-def h(e: Type[int]):
- try: pass
- except e: pass
-[builtins fixtures/exception.pyi]
-[out]
-main:9: error: Revealed type is 'builtins.BaseException'
-main:12: error: Exception type must be derived from BaseException
-
-
--- Del statement
--- -------------
-
-
-[case testDelStmtWithIndex]
-a, b = None, None # type: (A, B)
-del b[a]
-del b[b] # E: Argument 1 to "__delitem__" of "B" has incompatible type "B"; expected "A"
-del a[a] # E: "A" has no attribute "__delitem__"
-del a[b] # E: "A" has no attribute "__delitem__"
-class B:
- def __delitem__(self, index: 'A'): pass
-class A: pass
-
-[case testDelStmtWithAttribute]
-class A:
- def f(self): pass
- x = 0
-a = A()
-del a.f
-del a.x
-del a.z # E: "A" has no attribute "z"
-
-[case testDelStatementWithTuple]
-class A:
- x = 0
-a = A()
-del a.x, a.y # E: "A" has no attribute "y"
-
-
-[case testDelStatementWithAssignmentSimple]
-a = 1
-a + 1
-del a
-a + 1 # E: Trying to read deleted variable 'a'
-[builtins fixtures/ops.pyi]
-
-[case testDelStatementWithAssignmentTuple]
-a = 1
-b = 1
-del (a, b)
-b + 1 # E: Trying to read deleted variable 'b'
-[builtins fixtures/ops.pyi]
-
-[case testDelStatementWithAssignmentClass]
-class C:
- a = 1
-
-c = C()
-c.a = 1
-c.a + 1
-del c.a
-c.a + 1
-[builtins fixtures/ops.pyi]
-
--- Yield statement
--- ---------------
-
-
-[case testSimpleYield]
-from typing import Iterator
-def f() -> Iterator[int]:
- yield 1
- yield '' # E: Incompatible types in yield (actual type "str", expected type "int")
-[builtins fixtures/for.pyi]
-[out]
-
-[case testYieldInFunctionReturningGenerator]
-from typing import Generator
-def f() -> Generator[int, None, None]:
- yield 1
-[builtins fixtures/for.pyi]
-[out]
-
-[case testYieldInFunctionReturningIterable]
-from typing import Iterable
-def f() -> Iterable[int]:
- yield 1
-[builtins fixtures/for.pyi]
-[out]
-
-[case testYieldInFunctionReturningObject]
-def f() -> object:
- yield 1
-[builtins fixtures/for.pyi]
-[out]
-
-[case testYieldInFunctionReturningAny]
-from typing import Any
-def f() -> Any:
- yield object()
-[out]
-
-[case testYieldInFunctionReturningFunction]
-from typing import Callable
-def f() -> Callable[[], None]: # E: The return type of a generator function should be "Generator" or one of its supertypes
- yield object()
-[out]
-
-[case testYieldInDynamicallyTypedFunction]
-import typing
-def f():
- yield f
-
-[case testWithInvalidInstanceReturnType]
-import typing
-def f() -> int: # E: The return type of a generator function should be "Generator" or one of its supertypes
- yield 1
-[builtins fixtures/for.pyi]
-[out]
-
-[case testTypeInferenceContextAndYield]
-from typing import List, Iterator
-def f() -> 'Iterator[List[int]]':
- yield []
- yield [object()] # E: List item 0 has incompatible type "object"
-[builtins fixtures/for.pyi]
-[out]
-
-[case testYieldAndReturnWithoutValue]
-from typing import Iterator
-def f() -> Iterator[int]:
- yield 1
- return
-[builtins fixtures/for.pyi]
-
-[case testYieldWithNoValue]
-from typing import Iterator
-def f() -> Iterator[None]:
- yield
-[builtins fixtures/for.pyi]
-
-[case testYieldWithNoValueWhenValueRequired]
-from typing import Iterator
-def f() -> Iterator[int]:
- yield # E: Yield value expected
-[builtins fixtures/for.pyi]
-[out]
-
-[case testYieldWithExplicitNone]
-from typing import Iterator
-def f() -> Iterator[None]:
- yield None # E: Incompatible types in yield (actual type None, expected type None)
-[builtins fixtures/for.pyi]
-[out]
-
-
--- Yield from statement
--- --------------------
-
--- Iterables
--- ----------
-
-[case testSimpleYieldFromWithIterator]
-from typing import Iterator
-def g() -> Iterator[str]:
- yield '42'
-def h() -> Iterator[int]:
- yield 42
-def f() -> Iterator[str]:
- yield from g()
- yield from h() # E: Incompatible types in "yield from" (actual type "int", expected type "str")
-[out]
-
-[case testYieldFromAppliedToAny]
-from typing import Any
-def g() -> Any:
- yield object()
-def f() -> Any:
- yield from g()
-[out]
-
-[case testYieldFromInFunctionReturningFunction]
-from typing import Iterator, Callable
-def g() -> Iterator[int]:
- yield 42
-def f() -> Callable[[], None]: # E: The return type of a generator function should be "Generator" or one of its supertypes
- yield from g()
-[out]
-
-[case testYieldFromNotIterableReturnType]
-from typing import Iterator
-def g() -> Iterator[int]:
- yield 42
-def f() -> int: # E: The return type of a generator function should be "Generator" or one of its supertypes
- yield from g()
-[out]
-
-[case testYieldFromNotAppliedIterator]
-from typing import Iterator
-def g() -> int:
- return 42
-def f() -> Iterator[int]:
- yield from g() # E: "yield from" can't be applied to "int"
-[out]
-
-[case testYieldFromCheckIncompatibleTypesTwoIterables]
-from typing import List, Iterator
-def g() -> Iterator[List[int]]:
- yield [2, 3, 4]
-def f() -> Iterator[List[int]]:
- yield from g()
- yield from [1, 2, 3] # E: Incompatible types in "yield from" (actual type "int", expected type List[int])
-[builtins fixtures/for.pyi]
-[out]
-
-[case testYieldFromNotAppliedToNothing]
-def h():
- yield from # E: invalid syntax
-[out]
-
-[case testYieldFromAndYieldTogether]
-from typing import Iterator
-def f() -> Iterator[str]:
- yield "g1 ham"
- yield from g()
- yield "g1 eggs"
-def g() -> Iterator[str]:
- yield "g2 spam"
- yield "g2 more spam"
-[out]
-
-[case testYieldFromAny]
-from typing import Iterator
-def f(a):
- b = yield from a
- return b
-[out]
-
--- With statement
--- --------------
-
-
-[case testSimpleWith]
-import typing
-class A:
- def __enter__(self) -> None: pass
- def __exit__(self, x, y, z) -> None: pass
-with A():
- object(A) # E: Too many arguments for "object"
-
-[case testWithStmtAndInvalidExit]
-import typing
-class A:
- def __enter__(self) -> None: pass
- def __exit__(self, x, y) -> None: pass
-with A(): # E: Too many arguments for "__exit__" of "A"
- pass
-
-[case testWithStmtAndMissingExit]
-import typing
-class A:
- def __enter__(self) -> None: pass
-with A(): # E: "A" has no attribute "__exit__"
- pass
-
-[case testWithStmtAndInvalidEnter]
-import typing
-class A:
- def __enter__(self, x) -> None: pass
- def __exit__(self, x, y, z) -> None: pass
-with A(): # E: Too few arguments for "__enter__" of "A"
- pass
-
-[case testWithStmtAndMissingEnter]
-import typing
-class A:
- def __exit__(self, x, y, z) -> None: pass
-with A(): # E: "A" has no attribute "__enter__"
- pass
-
-[case testWithStmtAndMultipleExprs]
-import typing
-class A:
- def __enter__(self) -> None: pass
- def __exit__(self, x, y, z) -> None: pass
-class B:
- def __enter__(self) -> None: pass
-with A(), B(): # E: "B" has no attribute "__exit__"
- pass
-with B(), A(): # E: "B" has no attribute "__exit__"
- pass
-
-[case testWithStmtAndResult]
-import typing
-class B: pass
-class A:
- def __enter__(self) -> B: pass
- def __exit__(self, x, y, z): pass
-with A() as b:
- b = B()
- b = A() # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-
-[case testWithStmtAndMultipleResults]
-from typing import TypeVar, Generic
-t = TypeVar('t')
-class B: pass
-class C: pass
-class A(Generic[t]):
- def __enter__(self) -> t: pass
- def __exit__(self, x, y, z): pass
-a_b = A() # type: A[B]
-a_c = A() # type: A[C]
-with a_b as b, a_c as c:
- b = B()
- c = C()
- b = c # E: Incompatible types in assignment (expression has type "C", variable has type "B")
- c = b # E: Incompatible types in assignment (expression has type "B", variable has type "C")
-
-[case testWithStmtAndComplexTarget]
-from typing import Tuple
-class A:
- def __enter__(self) -> Tuple[int, str]: pass
- def __exit__(self, x, y, z): pass
-with A() as (a, b):
- a = 1
- b = ''
- a = b # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-[builtins fixtures/tuple.pyi]
-
-
--- Chained assignment
--- ------------------
-
-
-[case testChainedAssignment]
-import typing
-class A: pass
-class B: pass
-x = y = A()
-x = A()
-y = A()
-x = B() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-y = B() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-
-[case testChainedAssignment2]
-import typing
-def f() -> None:
- x = 1
- y = 'x'
- x = y = 'x' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
- x = y = 1 # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-[builtins fixtures/primitives.pyi]
-[out]
-
-[case testChainedAssignmentWithType]
-
-x = y = None # type: int
-x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-y = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-x = 1
-y = 1
-
-
--- Star assignment
--- ---------------
-
-
-[case testAssignListToStarExpr]
-from typing import List
-bs, cs = None, None # type: List[A], List[B]
-*bs, b = bs
-*bs, c = cs # E: Incompatible types in assignment (expression has type List[B], variable has type List[A])
-*ns, c = cs
-nc = cs
-
-class A: pass
-class B: pass
-[builtins fixtures/list.pyi]
-
-
--- Type aliases
--- ------------
-
-
-[case testSimpleTypeAlias]
-import typing
-foo = int
-def f(x: foo) -> None: pass
-f(1)
-f('x') # E: Argument 1 to "f" has incompatible type "str"; expected "int"
-
-[case testTypeAliasDefinedInAModule]
-import typing
-import m
-def f(x: m.foo) -> None: pass
-f(1)
-f('x') # E: Argument 1 to "f" has incompatible type "str"; expected "int"
-[file m.py]
-import typing
-foo = int
-
-[case testTypeAliasDefinedInAModule2]
-import typing
-from m import foo
-def f(x: foo) -> None: pass
-f(1)
-f('x') # E: Argument 1 to "f" has incompatible type "str"; expected "int"
-[file m.py]
-import typing
-foo = int
-
-
--- nonlocal and global
--- -------------------
-
-
-[case testTypeOfGlobalUsed]
-import typing
-g = A()
-def f() -> None:
- global g
- g = B()
-
-class A(): pass
-class B(): pass
-[out]
-main:5: error: Incompatible types in assignment (expression has type "B", variable has type "A")
-
-[case testTypeOfNonlocalUsed]
-import typing
-def f() -> None:
- a = A()
- def g() -> None:
- nonlocal a
- a = B()
-
-class A(): pass
-class B(): pass
-[out]
-main:6: error: Incompatible types in assignment (expression has type "B", variable has type "A")
-
-[case testTypeOfOuterMostNonlocalUsed]
-import typing
-def f() -> None:
- a = A()
- def g() -> None:
- a = B()
- def h() -> None:
- nonlocal a
- a = A()
- a = B()
-
-class A(): pass
-class B(): pass
-[out]
-main:8: error: Incompatible types in assignment (expression has type "A", variable has type "B")
diff --git a/test-data/unit/check-super.test b/test-data/unit/check-super.test
deleted file mode 100644
index 2993113..0000000
--- a/test-data/unit/check-super.test
+++ /dev/null
@@ -1,109 +0,0 @@
--- Test cases for type checker related to super().
-
-
--- Supertype member reference
--- --------------------------
-
-
-[case testAccessingSupertypeMethod]
-
-class B:
- def f(self) -> 'B': pass
-class A(B):
- def f(self) -> 'A':
- a, b = None, None # type: (A, B)
- a = super().f() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
- a = super().g() # E: "g" undefined in superclass
- b = super().f()
-[out]
-
-[case testAccessingSuperTypeMethodWithArgs]
-from typing import Any
-class B:
- def f(self, y: 'A') -> None: pass
-class A(B):
- def f(self, y: Any) -> None:
- a, b = None, None # type: (A, B)
- super().f(b) # E: Argument 1 to "f" of "B" has incompatible type "B"; expected "A"
- super().f(a)
- self.f(b)
- self.f(a)
-[out]
-
-[case testAccessingSuperInit]
-import typing
-class B:
- def __init__(self, x: A) -> None: pass
-class A(B):
- def __init__(self) -> None:
- super().__init__(B(None)) # E: Argument 1 to "__init__" of "B" has incompatible type "B"; expected "A"
- super().__init__() # E: Too few arguments for "__init__" of "B"
- super().__init__(A())
-[out]
-
-[case testAccessingSuperMemberWithDeepHierarchy]
-import typing
-class C:
- def f(self) -> None: pass
-class B(C): pass
-class A(B):
- def f(self) -> None:
- super().g() # E: "g" undefined in superclass
- super().f()
-[out]
-
-[case testAssignToBaseClassMethod]
-import typing
-class A:
- def f(self) -> None: pass
-class B(A):
- def g(self) -> None:
- super().f = None
-[out]
-main:6: error: Invalid assignment target
-
-[case testSuperWithMultipleInheritance]
-import typing
-class A:
- def f(self) -> None: pass
-class B:
- def g(self, x: int) -> None: pass
-class C(A, B):
- def f(self) -> None:
- super().f()
- super().g(1)
- super().f(1) # E: Too many arguments for "f" of "A"
- super().g() # E: Too few arguments for "g" of "B"
- super().not_there() # E: "not_there" undefined in superclass
-[out]
-
-[case testSuperWithNew]
-class A:
- def __new__(cls, x: int) -> 'A':
- return object.__new__(cls)
-
-class B(A):
- def __new__(cls, x: int, y: str = '') -> 'A':
- super().__new__(cls, 1)
- super().__new__(cls, 1, '') # E: Too many arguments for "__new__" of "A"
-B('') # E: Argument 1 to "B" has incompatible type "str"; expected "int"
-B(1)
-B(1, 'x')
-[builtins fixtures/__new__.pyi]
-
-[case testSuperWithUnknownBase]
-from typing import Any
-B = None # type: Any
-class C(B):
- def __init__(self, arg=0):
- super(C, self).__init__(arg, arg=arg)
-[out]
-
-[case testSuperSilentInDynamicFunction]
-class A:
- pass
-
-class B(A):
- def foo(self):
- super(B, self).foo() # Not an error
-[out]
diff --git a/test-data/unit/check-tuples.test b/test-data/unit/check-tuples.test
deleted file mode 100644
index 50d6a2d..0000000
--- a/test-data/unit/check-tuples.test
+++ /dev/null
@@ -1,927 +0,0 @@
--- Normal assignment and subtyping
--- -------------------------------
-
-
-[case testTupleAssignmentWithTupleTypes]
-from typing import Tuple
-t1 = None # type: Tuple[A]
-t2 = None # type: Tuple[B]
-t3 = None # type: Tuple[A, A]
-t4 = None # type: Tuple[A, B]
-t5 = None # type: Tuple[B, A]
-
-t1 = t2 # E: Incompatible types in assignment (expression has type "Tuple[B]", variable has type "Tuple[A]")
-t1 = t3 # E: Incompatible types in assignment (expression has type "Tuple[A, A]", variable has type "Tuple[A]")
-t3 = t1 # E: Incompatible types in assignment (expression has type "Tuple[A]", variable has type "Tuple[A, A]")
-t3 = t4 # E: Incompatible types in assignment (expression has type "Tuple[A, B]", variable has type "Tuple[A, A]")
-t3 = t5 # E: Incompatible types in assignment (expression has type "Tuple[B, A]", variable has type "Tuple[A, A]")
-
-# Ok
-t1 = t1
-t2 = t2
-t3 = t3
-t4 = t4
-t5 = t5
-
-class A: pass
-class B: pass
-[builtins fixtures/tuple.pyi]
-
-[case testTupleSubtyping]
-from typing import Tuple
-t1 = None # type: Tuple[A, A]
-t2 = None # type: Tuple[A, B]
-t3 = None # type: Tuple[B, A]
-
-t2 = t1 # E: Incompatible types in assignment (expression has type "Tuple[A, A]", variable has type "Tuple[A, B]")
-t2 = t3 # E: Incompatible types in assignment (expression has type "Tuple[B, A]", variable has type "Tuple[A, B]")
-t3 = t1 # E: Incompatible types in assignment (expression has type "Tuple[A, A]", variable has type "Tuple[B, A]")
-t3 = t2 # E: Incompatible types in assignment (expression has type "Tuple[A, B]", variable has type "Tuple[B, A]")
-
-t1 = t2
-t1 = t3
-
-class A: pass
-class B(A): pass
-[builtins fixtures/tuple.pyi]
-
-[case testTupleCompatibilityWithOtherTypes]
-from typing import Tuple
-a, o = None, None # type: (A, object)
-t = None # type: Tuple[A, A]
-
-a = t # E: Incompatible types in assignment (expression has type "Tuple[A, A]", variable has type "A")
-t = o # E: Incompatible types in assignment (expression has type "object", variable has type "Tuple[A, A]")
-t = a # E: Incompatible types in assignment (expression has type "A", variable has type "Tuple[A, A]")
-# TODO: callable types + tuples
-
-# Ok
-o = t
-t = None
-
-class A: pass
-[builtins fixtures/tuple.pyi]
-
-[case testNestedTupleTypes]
-from typing import Tuple
-t1 = None # type: Tuple[A, Tuple[A, A]]
-t2 = None # type: Tuple[B, Tuple[B, B]]
-
-t2 = t1 # E: Incompatible types in assignment (expression has type "Tuple[A, Tuple[A, A]]", variable has type "Tuple[B, Tuple[B, B]]")
-t1 = t2
-
-class A: pass
-class B(A): pass
-[builtins fixtures/tuple.pyi]
-
-[case testNestedTupleTypes2]
-from typing import Tuple
-t1 = None # type: Tuple[A, Tuple[A, A]]
-t2 = None # type: Tuple[B, Tuple[B, B]]
-
-t2 = t1 # E: Incompatible types in assignment (expression has type "Tuple[A, Tuple[A, A]]", variable has type "Tuple[B, Tuple[B, B]]")
-t1 = t2
-
-class A: pass
-class B(A): pass
-[builtins fixtures/tuple.pyi]
-
-[case testSubtypingWithNamedTupleType]
-from typing import Tuple
-t1 = None # type: Tuple[A, A]
-t2 = None # type: tuple
-
-t1 = t2 # E: Incompatible types in assignment (expression has type Tuple[Any, ...], variable has type "Tuple[A, A]")
-t2 = t1
-
-class A: pass
-[builtins fixtures/tuple.pyi]
-
-[case testTupleInitializationWithNone]
-from typing import Tuple
-t = None # type: Tuple[A, A]
-t = None
-class A: pass
-[builtins fixtures/tuple.pyi]
-
-
--- Tuple expressions
--- -----------------
-
-
-[case testTupleExpressions]
-from typing import Tuple
-t1 = None # type: tuple
-t2 = None # type: Tuple[A]
-t3 = None # type: Tuple[A, B]
-
-a, b, c = None, None, None # type: (A, B, C)
-
-t2 = () # E: Incompatible types in assignment (expression has type "Tuple[]", variable has type "Tuple[A]")
-t2 = (a, a) # E: Incompatible types in assignment (expression has type "Tuple[A, A]", variable has type "Tuple[A]")
-t3 = (a, a) # E: Incompatible types in assignment (expression has type "Tuple[A, A]", variable has type "Tuple[A, B]")
-t3 = (b, b) # E: Incompatible types in assignment (expression has type "Tuple[B, B]", variable has type "Tuple[A, B]")
-t3 = (a, b, a) # E: Incompatible types in assignment (expression has type "Tuple[A, B, A]", variable has type "Tuple[A, B]")
-
-t1 = ()
-t1 = (a,)
-t2 = (a,)
-t3 = (a, b)
-t3 = (a, c)
-t3 = (None, None)
-
-class A: pass
-class B: pass
-class C(B): pass
-[builtins fixtures/tuple.pyi]
-
-[case testVoidValueInTuple]
-import typing
-(None, f()) # E: "f" does not return a value
-(f(), None) # E: "f" does not return a value
-
-def f() -> None: pass
-[builtins fixtures/tuple.pyi]
-
-
--- Indexing
--- --------
-
-
-[case testIndexingTuples]
-from typing import Tuple
-t1 = None # type: Tuple[A, B]
-t2 = None # type: Tuple[A]
-t3 = None # type: Tuple[A, B, C, D, E]
-a, b = None, None # type: (A, B)
-x = None # type: Tuple[A, B, C]
-y = None # type: Tuple[A, C, E]
-n = 0
-
-a = t1[1] # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-b = t1[0] # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-t1[2] # E: Tuple index out of range
-t1[3] # E: Tuple index out of range
-t2[1] # E: Tuple index out of range
-t1[n] # E: Tuple index must be an integer literal
-t3[n:] # E: Tuple slice must be an integer literal
-b = t1[(0)] # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-
-a = t1[0]
-b = t1[1]
-b = t1[-1]
-a = t1[(0)]
-x = t3[0:3] # type (A, B, C)
-y = t3[0:5:2] # type (A, C, E)
-x = t3[:-2] # type (A, B, C)
-
-class A: pass
-class B: pass
-class C: pass
-class D: pass
-class E: pass
-[builtins fixtures/tuple.pyi]
-
-[case testIndexingTuplesWithNegativeIntegers]
-from typing import Tuple
-t1 = None # type: Tuple[A, B]
-t2 = None # type: Tuple[A]
-a, b = None, None # type: A, B
-
-a = t1[-1] # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-b = t1[-2] # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-t1[-3] # E: Tuple index out of range
-t1[-4] # E: Tuple index out of range
-b = t2[(-1)] # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-
-a = t1[-2]
-b = t1[-1]
-a = t2[(-1)]
-
-class A: pass
-class B: pass
-[builtins fixtures/tuple.pyi]
-
-[case testAssigningToTupleItems]
-from typing import Tuple
-t = None # type: Tuple[A, B]
-n = 0
-
-t[0] = A() # E: Unsupported target for indexed assignment
-t[2] = A() # E: Unsupported target for indexed assignment
-t[n] = A() # E: Unsupported target for indexed assignment
-
-class A: pass
-class B: pass
-[builtins fixtures/tuple.pyi]
-
-
--- Multiple assignment
--- -------------------
-
-
-[case testMultipleAssignmentWithTuples]
-from typing import Tuple
-t1 = None # type: Tuple[A, B]
-t2 = None # type: Tuple[A, B, A]
-a, b = None, None # type: (A, B)
-
-a, a = t1 # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-b, b = t1 # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-a, b, b = t2 # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-
-a, b = t1
-a, b, a = t2
-
-class A: pass
-class B: pass
-[builtins fixtures/tuple.pyi]
-
-[case testMultipleAssignmentWithInvalidNumberOfValues]
-from typing import Tuple
-t1 = None # type: Tuple[A, A, A]
-a = None # type: A
-
-a, a = t1 # E: Too many values to unpack (2 expected, 3 provided)
-a, a, a, a = t1 # E: Need more than 3 values to unpack (4 expected)
-
-a, a, a = t1
-
-class A: pass
-[builtins fixtures/tuple.pyi]
-
-[case testMultipleAssignmentWithTupleExpressionRvalue]
-
-a, b = None, None # type: (A, B)
-
-a, b = a, a # Fail
-a, b = b, a # Fail
-
-a, b = a, b
-a, a = a, a
-
-class A: pass
-class B: pass
-[builtins fixtures/tuple.pyi]
-[out]
-main:4: error: Incompatible types in assignment (expression has type "A", variable has type "B")
-main:5: error: Incompatible types in assignment (expression has type "B", variable has type "A")
-main:5: error: Incompatible types in assignment (expression has type "A", variable has type "B")
-
-[case testSubtypingInMultipleAssignment]
-
-a, b = None, None # type: (A, B)
-
-b, b = a, b # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-b, b = b, a # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-
-a, b = b, b
-b, a = b, b
-
-class A: pass
-class B(A): pass
-[builtins fixtures/tuple.pyi]
-
-[case testInitializationWithMultipleValues]
-
-a, b = None, None # type: (A, B)
-
-a1, b1 = a, a # type: (A, B) # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-a2, b2 = b, b # type: (A, B) # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-a3, b3 = a # type: (A, B) # E: '__main__.A' object is not iterable
-a4, b4 = None # type: (A, B) # E: 'builtins.None' object is not iterable
-a5, b5 = a, b, a # type: (A, B) # E: Too many values to unpack (2 expected, 3 provided)
-
-ax, bx = a, b # type: (A, B)
-
-class A: pass
-class B: pass
-[builtins fixtures/tuple.pyi]
-
-[case testMultipleAssignmentWithNonTupleRvalue]
-
-a, b = None, None # type: (A, B)
-def f(): pass
-
-a, b = None # E: 'builtins.None' object is not iterable
-a, b = a # E: '__main__.A' object is not iterable
-a, b = f # E: 'def () -> Any' object is not iterable
-
-class A: pass
-class B: pass
-[builtins fixtures/tuple.pyi]
-
-[case testMultipleAssignmentWithIndexedLvalues]
-
-a, b = None, None # type: (A, B)
-aa, bb = None, None # type: (AA, BB)
-
-a[a], b[b] = a, bb # E: Incompatible types in assignment (expression has type "A", target has type "AA")
-a[a], b[b] = aa, b # E: Incompatible types in assignment (expression has type "B", target has type "BB")
-a[aa], b[b] = aa, bb # E: Invalid index type "AA" for "A"; expected type "A"
-a[a], b[bb] = aa, bb # E: Invalid index type "BB" for "B"; expected type "B"
-a[a], b[b] = aa, bb
-
-class A:
- def __setitem__(self, x: 'A', y: 'AA') -> None: pass
-class B:
- def __setitem__(self, x: 'B', y: 'BB') -> None: pass
-
-class AA: pass
-class BB: pass
-[builtins fixtures/tuple.pyi]
-
-[case testMultipleDeclarationWithParentheses]
-
-(a, b) = (None, None) # type: int, str
-a = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-b = 1 # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-a = 1
-b = ''
-
-[case testMultipleAssignmentWithExtraParentheses]
-
-a, b = None, None # type: (A, B)
-
-(a, b) = (a, a) # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-(a, b) = (b, b) # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-((a), (b)) = ((a), (a)) # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-((a), (b)) = ((b), (b)) # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-[a, b] = a, a # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-[a, b] = b, b # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-
-(a, b) = (a, b)
-((a), (b)) = ((a), (b))
-[a, b] = a, b
-
-class A: pass
-class B: pass
-[builtins fixtures/tuple.pyi]
-
-[case testMultipleAssignmentUsingSingleTupleType]
-from typing import Tuple
-a, b = None, None # type: Tuple[int, str]
-a = 1
-b = ''
-a = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-b = 1 # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-
-[case testMultipleAssignmentWithMixedVariables]
-a = b, c = 1, 1
-x, y = p, q = 1, 1
-u, v, w = r, s = 1, 1 # E: Need more than 2 values to unpack (3 expected)
-d, e = f, g, h = 1, 1 # E: Need more than 2 values to unpack (3 expected)
-
-
--- Assignment to starred expressions
--- ---------------------------------
-
-
-[case testAssignmentToStarMissingAnnotation]
-from typing import List
-t = 1, 2
-a, b, *c = 1, 2 # E: Need type annotation for variable
-aa, bb, *cc = t # E: Need type annotation for variable
-[builtins fixtures/list.pyi]
-
-[case testAssignmentToStarAnnotation]
-from typing import List
-li, lo = None, None # type: List[int], List[object]
-a, b, *c = 1, 2 # type: int, int, *List[int]
-c = lo # E: Incompatible types in assignment (expression has type List[object], variable has type List[int])
-c = li
-[builtins fixtures/list.pyi]
-
-[case testAssignmentToStarCount1]
-from typing import List
-ca = None # type: List[int]
-c = [1]
-a, b, *c = 1, # E: Need more than 1 value to unpack (2 expected)
-a, b, *c = 1, 2
-a, b, *c = 1, 2, 3
-a, b, *c = 1, 2, 3, 4
-[builtins fixtures/list.pyi]
-
-[case testAssignmentToStarCount2]
-from typing import List
-ca = None # type: List[int]
-t1 = 1,
-t2 = 1, 2
-t3 = 1, 2, 3
-t4 = 1, 2, 3, 4
-c = [1]
-a, b, *c = t1 # E: Need more than 1 value to unpack (2 expected)
-a, b, *c = t2
-a, b, *c = t3
-a, b, *c = t4
-[builtins fixtures/list.pyi]
-
-[case testAssignmentToStarFromAny]
-from typing import Any
-a, c = Any(1), C()
-p, *q = a
-c = a
-c = q
-
-class C: pass
-
-[case testAssignmentToComplexStar]
-from typing import List
-li = None # type: List[int]
-a, *(li) = 1,
-a, *(b, c) = 1, 2 # E: Need more than 1 value to unpack (2 expected)
-a, *(b, c) = 1, 2, 3
-a, *(b, c) = 1, 2, 3, 4 # E: Too many values to unpack (2 expected, 3 provided)
-[builtins fixtures/list.pyi]
-
-[case testAssignmentToStarFromTupleType]
-from typing import List, Tuple
-li = None # type: List[int]
-la = None # type: List[A]
-ta = None # type: Tuple[A, A, A]
-a, *la = ta
-a, *li = ta # E
-a, *na = ta
-na = la
-na = a # E
-
-class A: pass
-[builtins fixtures/list.pyi]
-[out]
-main:6: error: List item 0 has incompatible type "A"
-main:6: error: List item 1 has incompatible type "A"
-main:9: error: Incompatible types in assignment (expression has type "A", variable has type List[A])
-
-[case testAssignmentToStarFromTupleInference]
-from typing import List
-li = None # type: List[int]
-la = None # type: List[A]
-a, *l = A(), A()
-l = li # E: Incompatible types in assignment (expression has type List[int], variable has type List[A])
-l = la
-
-class A: pass
-[builtins fixtures/list.pyi]
-[out]
-
-[case testAssignmentToStarFromListInference]
-from typing import List
-li = None # type: List[int]
-la = None # type: List[A]
-a, *l = [A(), A()]
-l = li # E: Incompatible types in assignment (expression has type List[int], variable has type List[A])
-l = la
-
-class A: pass
-[builtins fixtures/list.pyi]
-[out]
-
-[case testAssignmentToStarFromTupleTypeInference]
-from typing import List, Tuple
-li = None # type: List[int]
-la = None # type: List[A]
-ta = None # type: Tuple[A, A, A]
-a, *l = ta
-l = li # E: Incompatible types in assignment (expression has type List[int], variable has type List[A])
-l = la
-
-class A: pass
-[builtins fixtures/list.pyi]
-[out]
-
-[case testAssignmentToStarFromListTypeInference]
-from typing import List
-li = None # type: List[int]
-la = None # type: List[A]
-a, *l = la
-l = li # E: Incompatible types in assignment (expression has type List[int], variable has type List[A])
-l = la
-
-class A: pass
-[builtins fixtures/list.pyi]
-[out]
-
-
--- Nested tuple assignment
--- ----------------------------
-
-
-[case testNestedTupleAssignment1]
-
-a1, b1, c1 = None, None, None # type: (A, B, C)
-a2, b2, c2 = None, None, None # type: (A, B, C)
-
-a1, (b1, c1) = a2, (b2, c2)
-a1, (a1, (b1, c1)) = a2, (a2, (b2, c2))
-a1, (a1, (a1, b1)) = a1, (a1, (a1, c1)) # Fail
-
-class A: pass
-class B: pass
-class C: pass
-[out]
-main:7: error: Incompatible types in assignment (expression has type "C", variable has type "B")
-
-[case testNestedTupleAssignment2]
-
-a1, b1, c1 = None, None, None # type: (A, B, C)
-a2, b2, c2 = None, None, None # type: (A, B, C)
-t = a1, b1
-
-a2, b2 = t
-(a2, b2), c2 = t, c1
-(a2, c2), c2 = t, c1 # Fail
-t, c2 = (a2, b2), c2
-t, c2 = (a2, a2), c2 # Fail
-t = a1, a1, a1 # Fail
-t = a1 # Fail
-a2, a2, a2 = t # Fail
-a2, = t # Fail
-a2 = t # Fail
-
-class A: pass
-class B: pass
-class C: pass
-[out]
-main:8: error: Incompatible types in assignment (expression has type "B", variable has type "C")
-main:10: error: Incompatible types in assignment (expression has type "Tuple[A, A]", variable has type "Tuple[A, B]")
-main:11: error: Incompatible types in assignment (expression has type "Tuple[A, A, A]", variable has type "Tuple[A, B]")
-main:12: error: Incompatible types in assignment (expression has type "A", variable has type "Tuple[A, B]")
-main:13: error: Need more than 2 values to unpack (3 expected)
-main:14: error: Too many values to unpack (1 expected, 2 provided)
-main:15: error: Incompatible types in assignment (expression has type "Tuple[A, B]", variable has type "A")
-
-
--- Error messages
--- --------------
-
-
-[case testTupleErrorMessages]
-
-a = None # type: A
-
-(a, a) + a # E: Unsupported left operand type for + ("Tuple[A, A]")
-a + (a, a) # E: Unsupported operand types for + ("A" and "Tuple[A, A]")
-f((a, a)) # E: Argument 1 to "f" has incompatible type "Tuple[A, A]"; expected "A"
-(a, a).foo # E: "Tuple[A, A]" has no attribute "foo"
-
-def f(x: 'A') -> None: pass
-
-class A:
- def __add__(self, x: 'A') -> 'A': pass
-[builtins fixtures/tuple.pyi]
-
-[case testLargeTuplesInErrorMessages]
-
-a = None # type: LongTypeName
-a + (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a) # Fail
-
-class LongTypeName:
- def __add__(self, x: 'LongTypeName') -> 'LongTypeName': pass
-[builtins fixtures/tuple.pyi]
-[out]
-main:3: error: Unsupported operand types for + ("LongTypeName" and tuple(length 50))
-
-
--- Tuple methods
--- -------------
-
-
-[case testTupleMethods]
-from typing import Tuple
-t = None # type: Tuple[int, str]
-i = 0
-s = ''
-b = bool()
-
-s = t.__len__() # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-i = t.__str__() # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-i = s in t # E: Incompatible types in assignment (expression has type "bool", variable has type "int")
-t.foo # E: "Tuple[int, str]" has no attribute "foo"
-
-i = t.__len__()
-s = t.__str__()
-b = s in t
-
-[file builtins.py]
-from typing import TypeVar, Generic
-_T = TypeVar('_T')
-class object:
- def __init__(self) -> None: pass
-class tuple(Generic[_T]):
- def __len__(self) -> int: pass
- def __str__(self) -> str: pass
- def __contains__(self, o: object) -> bool: pass
-class int: pass
-class str: pass
-class bool: pass
-class type: pass
-class function: pass
-
-
--- For loop over tuple
--- -------------------
-
-
-[case testForLoopOverTuple]
-import typing
-t = 1, 2
-for x in t:
- x = 1
- x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-[builtins fixtures/for.pyi]
-
-[case testForLoopOverEmptyTuple]
-import typing
-t = ()
-for x in t: pass # E: Need type annotation for variable
-[builtins fixtures/for.pyi]
-
-[case testForLoopOverNoneValuedTuple]
-import typing
-t = ()
-for x in None, None: pass # E: Need type annotation for variable
-[builtins fixtures/for.pyi]
-
-[case testForLoopOverTupleAndSubtyping]
-import typing
-class A: pass
-class B(A): pass
-for x in B(), A():
- x = A()
- x = B()
- x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "A")
-[builtins fixtures/for.pyi]
-
-[case testTupleIterable]
-y = 'a'
-x = sum((1,2))
-y = x # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-[builtins fixtures/tuple.pyi]
-
-
--- Tuple as a base type
--- --------------------
-
-
-[case testTupleBaseClass]
-import m
-[file m.pyi]
-from typing import Tuple
-class A(Tuple[int, str]):
- def f(self, x: int) -> None:
- a, b = 1, ''
- a, b = self
- b, a = self # Error
- self.f('') # Error
-[builtins fixtures/tuple.pyi]
-[out]
-tmp/m.pyi:6: error: Incompatible types in assignment (expression has type "int", variable has type "str")
-tmp/m.pyi:6: error: Incompatible types in assignment (expression has type "str", variable has type "int")
-tmp/m.pyi:7: error: Argument 1 to "f" of "A" has incompatible type "str"; expected "int"
-
-[case testValidTupleBaseClass2]
-from typing import Tuple
-class A(Tuple[int, str]): pass
-
-x, y = A()
-reveal_type(x) # E: Revealed type is 'builtins.int'
-reveal_type(y) # E: Revealed type is 'builtins.str'
-
-x1 = A()[0] # type: int
-x2 = A()[1] # type: int # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-A()[2] # E: Tuple index out of range
-
-class B(Tuple[int, ...]): pass
-
-z1 = B()[0] # type: int
-z2 = B()[1] # type: str # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-B()[100]
-[builtins fixtures/tuple.pyi]
-[out]
-
-[case testValidTupleBaseClass]
-from typing import Tuple
-class A(tuple): pass
-[out]
-
-[case testTupleBaseClass2-skip]
-import m
-[file m.pyi]
-# This doesn't work correctly -- no errors are reported (#867)
-from typing import Tuple
-a = None # type: A
-class A(Tuple[int, str]): pass
-x, y = a
-x() # Expected: "int" not callable
-y() # Expected: "str" not callable
-[out]
-(should fail)
-
-[case testGenericClassWithTupleBaseClass]
-from typing import TypeVar, Generic, Tuple
-T = TypeVar('T')
-class Test(Generic[T], Tuple[T]): pass
-x = Test() # type: Test[int]
-[builtins fixtures/tuple.pyi]
-[out]
-main:4: error: Generic tuple types not supported
-
-
--- Variable-length tuples (Tuple[t, ...] with literal '...')
--- ---------------------------------------------------------
-
-
-[case testIndexingVariableLengthTuple]
-from typing import Tuple
-x = () # type: Tuple[str, ...]
-n = 5
-x[n]() # E: "str" not callable
-x[3]() # E: "str" not callable
-[builtins fixtures/tuple.pyi]
-
-[case testSubtypingVariableLengthTuple]
-from typing import Tuple
-class A: pass
-class B(A): pass
-def fa(t: Tuple[A, ...]) -> None: pass
-def fb(t: Tuple[B, ...]) -> None: pass
-ta = () # type: Tuple[A, ...]
-tb = () # type: Tuple[B, ...]
-fa(ta)
-fa(tb)
-fb(tb)
-fb(ta) # E: Argument 1 to "fb" has incompatible type Tuple[A, ...]; expected Tuple[B, ...]
-[builtins fixtures/tuple.pyi]
-
-[case testSubtypingFixedAndVariableLengthTuples]
-from typing import Tuple
-class A: pass
-class B(A): pass
-def fa(t: Tuple[A, ...]) -> None: pass
-def fb(t: Tuple[B, ...]) -> None: pass
-aa = (A(), A())
-ab = (A(), B())
-bb = (B(), B())
-fa(aa)
-fa(ab)
-fa(bb)
-fb(bb)
-fb(ab) # E: Argument 1 to "fb" has incompatible type "Tuple[A, B]"; expected Tuple[B, ...]
-fb(aa) # E: Argument 1 to "fb" has incompatible type "Tuple[A, A]"; expected Tuple[B, ...]
-[builtins fixtures/tuple.pyi]
-
-[case testSubtypingTupleIsContainer]
-from typing import Container
-a = None # type: Container[str]
-a = ()
-
-[case testSubtypingTupleIsSized]
-from typing import Sized
-a = None # type: Sized
-a = ()
-
-[case testTupleWithStarExpr1]
-# flags: --fast-parser
-a = (1, 2)
-b = (*a, '')
-reveal_type(b) # E: Revealed type is 'Tuple[builtins.int, builtins.int, builtins.str]'
-
-[case testTupleWithStarExpr2]
-a = [1]
-b = (0, *a)
-reveal_type(b) # E: Revealed type is 'builtins.tuple[builtins.int*]'
-[builtins fixtures/tuple.pyi]
-
-[case testTupleWithStarExpr3]
-a = ['']
-b = (0, *a)
-reveal_type(b) # E: Revealed type is 'builtins.tuple[builtins.object*]'
-c = (*a, '')
-reveal_type(c) # E: Revealed type is 'builtins.tuple[builtins.str*]'
-[builtins fixtures/tuple.pyi]
-
-[case testTupleWithStarExpr4]
-a = (1, 1, 'x', 'x')
-b = (1, 'x')
-a = (0, *b, '')
-[builtins fixtures/tuple.pyi]
-
-[case testTupleMeetTupleAny]
-from typing import Union, Tuple
-class A: pass
-class B: pass
-
-def f(x: Union[B, Tuple[A, A]]) -> None:
- if isinstance(x, tuple):
- reveal_type(x) # E: Revealed type is 'Tuple[__main__.A, __main__.A]'
- else:
- reveal_type(x) # E: Revealed type is '__main__.B'
-
-def g(x: Union[str, Tuple[str, str]]) -> None:
- if isinstance(x, tuple):
- reveal_type(x) # E: Revealed type is 'Tuple[builtins.str, builtins.str]'
- else:
- reveal_type(x) # E: Revealed type is 'builtins.str'
-
-[builtins fixtures/tuple.pyi]
-[out]
-
-[case testTupleMeetTUpleAnyComplex]
-from typing import Tuple, Union
-
-Pair = Tuple[int, int]
-Variant = Union[int, Pair]
-def tuplify(v: Variant) -> None:
- reveal_type(v) # E: Revealed type is 'Union[builtins.int, Tuple[builtins.int, builtins.int]]'
- if not isinstance(v, tuple):
- reveal_type(v) # E: Revealed type is 'builtins.int'
- v = (v, v)
- reveal_type(v) # E: Revealed type is 'Tuple[builtins.int, builtins.int]'
- reveal_type(v) # E: Revealed type is 'Tuple[builtins.int, builtins.int]'
- reveal_type(v[0]) # E: Revealed type is 'builtins.int'
-
-Pair2 = Tuple[int, str]
-Variant2 = Union[int, Pair2]
-def tuplify2(v: Variant2) -> None:
- if isinstance(v, tuple):
- reveal_type(v) # E: Revealed type is 'Tuple[builtins.int, builtins.str]'
- else:
- reveal_type(v) # E: Revealed type is 'builtins.int'
-[builtins fixtures/tuple.pyi]
-[out]
-
-[case testTupleMeetTupleAnyAfter]
-from typing import Tuple, Union
-
-def good(blah: Union[Tuple[int, int], int]) -> None:
- reveal_type(blah) # E: Revealed type is 'Union[Tuple[builtins.int, builtins.int], builtins.int]'
- if isinstance(blah, tuple):
- reveal_type(blah) # E: Revealed type is 'Tuple[builtins.int, builtins.int]'
- reveal_type(blah) # E: Revealed type is 'Union[Tuple[builtins.int, builtins.int], builtins.int]'
-[builtins fixtures/tuple.pyi]
-[out]
-
-[case testTupleMeetTupleVariable]
-from typing import Tuple, TypeVar, Generic, Union
-T = TypeVar('T')
-
-class A: pass
-class B1(A): pass
-class B2(A): pass
-class C: pass
-
-x = None # type: Tuple[A, ...]
-y = None # type: Tuple[Union[B1, C], Union[B2, C]]
-
-def g(x: T) -> Tuple[T, T]:
- return (x, x)
-
-z = 1
-x, y = g(z) # E: Argument 1 to "g" has incompatible type "int"; expected "Tuple[B1, B2]"
-[builtins fixtures/tuple.pyi]
-[out]
-
-[case testTupleWithUndersizedContext]
-a = ([1], 'x')
-a = ([], 'x', 1) # E: Incompatible types in assignment (expression has type "Tuple[List[int], str, int]", variable has type "Tuple[List[int], str]")
-[builtins fixtures/tuple.pyi]
-
-[case testTupleWithOversizedContext]
-a = (1, [1], 'x')
-a = (1, []) # E: Incompatible types in assignment (expression has type "Tuple[int, List[int]]", variable has type "Tuple[int, List[int], str]")
-[builtins fixtures/tuple.pyi]
-
-[case testTupleWithoutContext]
-a = (1, []) # E: Need type annotation for variable
-[builtins fixtures/tuple.pyi]
-
-[case testTupleWithUnionContext]
-from typing import List, Union, Tuple
-def f() -> Union[int, Tuple[List[str]]]:
- return ([],)
-[builtins fixtures/tuple.pyi]
-
-[case testTupleWithVariableSizedTupleContext]
-from typing import List, Tuple
-def f() -> Tuple[List[str], ...]:
- return ([],)
-[builtins fixtures/tuple.pyi]
-
-[case testTupleWithoutArgs]
-from typing import Tuple
-def f(a: Tuple) -> None: pass
-f(())
-f((1,))
-f(('', ''))
-f(0) # E: Argument 1 to "f" has incompatible type "int"; expected Tuple[Any, ...]
-[builtins fixtures/tuple.pyi]
-
-[case testTupleSingleton]
-# flags: --fast-parser
-from typing import Tuple
-def f(a: Tuple[()]) -> None: pass
-f(())
-f((1,)) # E: Argument 1 to "f" has incompatible type "Tuple[int]"; expected "Tuple[]"
-f(('', '')) # E: Argument 1 to "f" has incompatible type "Tuple[str, str]"; expected "Tuple[]"
-f(0) # E: Argument 1 to "f" has incompatible type "int"; expected "Tuple[]"
-[builtins fixtures/tuple.pyi]
diff --git a/test-data/unit/check-type-aliases.test b/test-data/unit/check-type-aliases.test
deleted file mode 100644
index 20022cc..0000000
--- a/test-data/unit/check-type-aliases.test
+++ /dev/null
@@ -1,74 +0,0 @@
-[case testSimpleTypeAlias]
-import typing
-i = int
-def f(x: i) -> None: pass
-f(1)
-f('') # E: Argument 1 to "f" has incompatible type "str"; expected "int"
-
-[case testUnionTypeAlias]
-from typing import Union
-U = Union[int, str]
-def f(x: U) -> None: pass
-f(1)
-f('')
-f(()) # E: Argument 1 to "f" has incompatible type "Tuple[]"; expected "Union[int, str]"
-
-[case testTupleTypeAlias]
-from typing import Tuple
-T = Tuple[int, str]
-def f(x: T) -> None: pass
-f((1, 'x'))
-f(1) # E: Argument 1 to "f" has incompatible type "int"; expected "Tuple[int, str]"
-
-[case testCallableTypeAlias]
-from typing import Callable
-A = Callable[[int], None]
-f = None # type: A
-f(1)
-f('') # E: Argument 1 has incompatible type "str"; expected "int"
-
-[case testListTypeAlias]
-from typing import List
-A = List[int]
-def f(x: A) -> None: pass
-f([1])
-f(['x']) # E: List item 0 has incompatible type "str"
-[builtins fixtures/list.pyi]
-[out]
-
-[case testAnyTypeAlias]
-from typing import Any
-A = Any
-def f(x: A) -> None:
- x.foo()
-f(1)
-f('x')
-
-[case testImportUnionAlias]
-import typing
-from _m import U
-def f(x: U) -> None: pass
-f(1)
-f('x')
-f(()) # E: Argument 1 to "f" has incompatible type "Tuple[]"; expected "Union[int, str]"
-[file _m.py]
-from typing import Union
-U = Union[int, str]
-[builtins fixtures/tuple.pyi]
-
-[case testTypeAliasInBuiltins]
-def f(x: bytes): pass
-bytes
-f(1) # E: Argument 1 to "f" has incompatible type "int"; expected "str"
-[builtins fixtures/alias.pyi]
-
-[case testEmptyTupleTypeAlias]
-from typing import Tuple, Callable
-EmptyTuple = Tuple[()]
-x = None # type: EmptyTuple
-reveal_type(x) # E: Revealed type is 'Tuple[]'
-
-EmptyTupleCallable = Callable[[Tuple[()]], None]
-f = None # type: EmptyTupleCallable
-reveal_type(f) # E: Revealed type is 'def (Tuple[])'
-[builtins fixtures/list.pyi]
diff --git a/test-data/unit/check-type-checks.test b/test-data/unit/check-type-checks.test
deleted file mode 100644
index c4905a7..0000000
--- a/test-data/unit/check-type-checks.test
+++ /dev/null
@@ -1,113 +0,0 @@
--- Conditional type checks.
-
-
-[case testSimpleIsinstance]
-
-x = None # type: object
-n = None # type: int
-s = None # type: str
-n = x # E: Incompatible types in assignment (expression has type "object", variable has type "int")
-if isinstance(x, int):
- n = x
- s = x # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-n = x # E: Incompatible types in assignment (expression has type "object", variable has type "int")
-[builtins fixtures/isinstance.pyi]
-
-[case testSimpleIsinstance2]
-import typing
-def f(x: object, n: int, s: str) -> None:
- n = x # E: Incompatible types in assignment (expression has type "object", variable has type "int")
- if isinstance(x, int):
- n = x
- s = x # E: Incompatible types in assignment (expression has type "int", variable has type "str")
- n = x # E: Incompatible types in assignment (expression has type "object", variable has type "int")
-[builtins fixtures/isinstance.pyi]
-[out]
-
-[case testSimpleIsinstance3]
-
-class A:
- x = None # type: object
- n = None # type: int
- s = None # type: str
- n = x # E: Incompatible types in assignment (expression has type "object", variable has type "int")
- if isinstance(x, int):
- n = x
- s = x # E: Incompatible types in assignment (expression has type "int", variable has type "str")
- else:
- n = x # E: Incompatible types in assignment (expression has type "object", variable has type "int")
-[builtins fixtures/isinstance.pyi]
-[out]
-
-[case testMultipleIsinstanceTests]
-import typing
-class A: pass
-class B(A): pass
-def f(x: object, a: A, b: B, c: int) -> None:
- if isinstance(x, A):
- if isinstance(x, B):
- b = x
- x = a
- a = x
- c = x # E: Incompatible types in assignment (expression has type "A", variable has type "int")
-[builtins fixtures/isinstance.pyi]
-[out]
-
-[case testMultipleIsinstanceTests2]
-import typing
-class A: pass
-class B(A): pass
-def f(x: object, y: object, n: int, s: str) -> None:
- if isinstance(x, int):
- if isinstance(y, str):
- n = x
- s = y
- s = x # E: Incompatible types in assignment (expression has type "int", variable has type "str")
- n = y # E: Incompatible types in assignment (expression has type "str", variable has type "int")
- s = y # E: Incompatible types in assignment (expression has type "object", variable has type "str")
- n = y # E: Incompatible types in assignment (expression has type "object", variable has type "int")
- n = x
-[builtins fixtures/isinstance.pyi]
-[out]
-
-[case testIsinstanceAndElif]
-import typing
-def f(x: object, n: int, s: str) -> None:
- n = x # E: Incompatible types in assignment (expression has type "object", variable has type "int")
- if isinstance(x, int):
- n = x
- s = x # E: Incompatible types in assignment (expression has type "int", variable has type "str")
- elif isinstance(x, str):
- s = x
- n = x # E: Incompatible types in assignment (expression has type "str", variable has type "int")
- else:
- n = x # E: Incompatible types in assignment (expression has type "object", variable has type "int")
- s = x # E: Incompatible types in assignment (expression has type "object", variable has type "str")
- n = x # E: Incompatible types in assignment (expression has type "object", variable has type "int")
-[builtins fixtures/isinstance.pyi]
-[out]
-
-[case testIsinstanceAndAnyType]
-from typing import Any
-def f(x: Any, n: int, s: str) -> None:
- s = x
- if isinstance(x, int):
- n = x
- s = x # E: Incompatible types in assignment (expression has type "int", variable has type "str")
- s = x
-[builtins fixtures/isinstance.pyi]
-[out]
-
-[case testIsinstanceAndGenericType]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-class C(Generic[T]):
- def f(self, x: T) -> None: pass
-def f(x: object) -> None:
- if isinstance(x, C):
- x.f(1)
- x.f('')
- x.g() # E: C[Any] has no attribute "g"
- x.g() # E: "object" has no attribute "g"
-[builtins fixtures/isinstance.pyi]
-[out]
diff --git a/test-data/unit/check-type-promotion.test b/test-data/unit/check-type-promotion.test
deleted file mode 100644
index 0a39996..0000000
--- a/test-data/unit/check-type-promotion.test
+++ /dev/null
@@ -1,39 +0,0 @@
--- Test cases for type promotion (e.g. int -> float).
-
-
-[case testPromoteIntToFloat]
-def f(x: float) -> None: pass
-f(1)
-[builtins fixtures/primitives.pyi]
-
-[case testCantPromoteFloatToInt]
-def f(x: int) -> None: pass
-f(1.1) # E: Argument 1 to "f" has incompatible type "float"; expected "int"
-[builtins fixtures/primitives.pyi]
-
-[case testPromoteFloatToComplex]
-def f(x: complex) -> None: pass
-f(1)
-[builtins fixtures/primitives.pyi]
-
-[case testPromoteIntToComplex]
-def f(x: complex) -> None: pass
-f(1)
-[builtins fixtures/primitives.pyi]
-
-[case testPromoteBytearrayToByte]
-def f(x: bytes) -> None: pass
-f(bytearray())
-[builtins fixtures/primitives.pyi]
-
-[case testNarrowingDownFromPromoteTargetType]
-y = 0.0
-y = 1
-y() # E: "int" not callable
-[builtins fixtures/primitives.pyi]
-
-[case testNarrowingDownFromPromoteTargetType2]
-y = 0.0
-y = 1
-y.x # E: "int" has no attribute "x"
-[builtins fixtures/primitives.pyi]
diff --git a/test-data/unit/check-typeddict.test b/test-data/unit/check-typeddict.test
deleted file mode 100644
index 424c8b2..0000000
--- a/test-data/unit/check-typeddict.test
+++ /dev/null
@@ -1,462 +0,0 @@
--- Create Instance
-
-[case testCanCreateTypedDictInstanceWithKeywordArguments]
-from mypy_extensions import TypedDict
-Point = TypedDict('Point', {'x': int, 'y': int})
-p = Point(x=42, y=1337)
-reveal_type(p) # E: Revealed type is 'TypedDict(x=builtins.int, y=builtins.int, _fallback=typing.Mapping[builtins.str, builtins.int])'
-[builtins fixtures/dict.pyi]
-
-[case testCanCreateTypedDictInstanceWithDictCall]
-from mypy_extensions import TypedDict
-Point = TypedDict('Point', {'x': int, 'y': int})
-p = Point(dict(x=42, y=1337))
-reveal_type(p) # E: Revealed type is 'TypedDict(x=builtins.int, y=builtins.int, _fallback=typing.Mapping[builtins.str, builtins.int])'
-[builtins fixtures/dict.pyi]
-
-[case testCanCreateTypedDictInstanceWithDictLiteral]
-from mypy_extensions import TypedDict
-Point = TypedDict('Point', {'x': int, 'y': int})
-p = Point({'x': 42, 'y': 1337})
-reveal_type(p) # E: Revealed type is 'TypedDict(x=builtins.int, y=builtins.int, _fallback=typing.Mapping[builtins.str, builtins.int])'
-[builtins fixtures/dict.pyi]
-
-[case testCanCreateTypedDictInstanceWithNoArguments]
-from mypy_extensions import TypedDict
-EmptyDict = TypedDict('EmptyDict', {})
-p = EmptyDict()
-reveal_type(p) # E: Revealed type is 'TypedDict(_fallback=typing.Mapping[builtins.str, builtins.None])'
-[builtins fixtures/dict.pyi]
-
-
--- Create Instance (Errors)
-
-[case testCannotCreateTypedDictInstanceWithUnknownArgumentPattern]
-from mypy_extensions import TypedDict
-Point = TypedDict('Point', {'x': int, 'y': int})
-p = Point(42, 1337) # E: Expected keyword arguments, {...}, or dict(...) in TypedDict constructor
-[builtins fixtures/dict.pyi]
-
-[case testCannotCreateTypedDictInstanceNonLiteralItemName]
-from mypy_extensions import TypedDict
-Point = TypedDict('Point', {'x': int, 'y': int})
-x = 'x'
-p = Point({x: 42, 'y': 1337}) # E: Expected TypedDict item name to be string literal
-[builtins fixtures/dict.pyi]
-
-[case testCannotCreateTypedDictInstanceWithExtraItems]
-from mypy_extensions import TypedDict
-Point = TypedDict('Point', {'x': int, 'y': int})
-p = Point(x=42, y=1337, z=666) # E: Expected items ['x', 'y'] but found ['x', 'y', 'z'].
-[builtins fixtures/dict.pyi]
-
-[case testCannotCreateTypedDictInstanceWithMissingItems]
-from mypy_extensions import TypedDict
-Point = TypedDict('Point', {'x': int, 'y': int})
-p = Point(x=42) # E: Expected items ['x', 'y'] but found ['x'].
-[builtins fixtures/dict.pyi]
-
-[case testCannotCreateTypedDictInstanceWithIncompatibleItemType]
-from mypy_extensions import TypedDict
-Point = TypedDict('Point', {'x': int, 'y': int})
-p = Point(x='meaning_of_life', y=1337) # E: Incompatible types (expression has type "str", TypedDict item "x" has type "int")
-[builtins fixtures/dict.pyi]
-
-
--- Subtyping
-
-[case testCanConvertTypedDictToItself]
-from mypy_extensions import TypedDict
-Point = TypedDict('Point', {'x': int, 'y': int})
-def identity(p: Point) -> Point:
- return p
-[builtins fixtures/dict.pyi]
-
-[case testCanConvertTypedDictToEquivalentTypedDict]
-from mypy_extensions import TypedDict
-PointA = TypedDict('PointA', {'x': int, 'y': int})
-PointB = TypedDict('PointB', {'x': int, 'y': int})
-def identity(p: PointA) -> PointB:
- return p
-[builtins fixtures/dict.pyi]
-
-[case testCannotConvertTypedDictToSimilarTypedDictWithNarrowerItemTypes]
-from mypy_extensions import TypedDict
-Point = TypedDict('Point', {'x': int, 'y': int})
-ObjectPoint = TypedDict('ObjectPoint', {'x': object, 'y': object})
-def convert(op: ObjectPoint) -> Point:
- return op # E: Incompatible return value type (got "ObjectPoint", expected "Point")
-[builtins fixtures/dict.pyi]
-
-[case testCannotConvertTypedDictToSimilarTypedDictWithWiderItemTypes]
-from mypy_extensions import TypedDict
-Point = TypedDict('Point', {'x': int, 'y': int})
-ObjectPoint = TypedDict('ObjectPoint', {'x': object, 'y': object})
-def convert(p: Point) -> ObjectPoint:
- return p # E: Incompatible return value type (got "Point", expected "ObjectPoint")
-[builtins fixtures/dict.pyi]
-
-[case testCannotConvertTypedDictToSimilarTypedDictWithIncompatibleItemTypes]
-from mypy_extensions import TypedDict
-Point = TypedDict('Point', {'x': int, 'y': int})
-Chameleon = TypedDict('Chameleon', {'x': str, 'y': str})
-def convert(p: Point) -> Chameleon:
- return p # E: Incompatible return value type (got "Point", expected "Chameleon")
-[builtins fixtures/dict.pyi]
-
-[case testCanConvertTypedDictToNarrowerTypedDict]
-from mypy_extensions import TypedDict
-Point = TypedDict('Point', {'x': int, 'y': int})
-Point1D = TypedDict('Point1D', {'x': int})
-def narrow(p: Point) -> Point1D:
- return p
-[builtins fixtures/dict.pyi]
-
-[case testCannotConvertTypedDictToWiderTypedDict]
-from mypy_extensions import TypedDict
-Point = TypedDict('Point', {'x': int, 'y': int})
-Point3D = TypedDict('Point3D', {'x': int, 'y': int, 'z': int})
-def widen(p: Point) -> Point3D:
- return p # E: Incompatible return value type (got "Point", expected "Point3D")
-[builtins fixtures/dict.pyi]
-
-[case testCanConvertTypedDictToCompatibleMapping]
-from mypy_extensions import TypedDict
-from typing import Mapping
-Point = TypedDict('Point', {'x': int, 'y': int})
-def as_mapping(p: Point) -> Mapping[str, int]:
- return p
-[builtins fixtures/dict.pyi]
-
-[case testCannotConvertTypedDictToCompatibleMapping]
-from mypy_extensions import TypedDict
-from typing import Mapping
-Point = TypedDict('Point', {'x': int, 'y': int})
-def as_mapping(p: Point) -> Mapping[str, str]:
- return p # E: Incompatible return value type (got "Point", expected Mapping[str, str])
-[builtins fixtures/dict.pyi]
-
--- TODO: Fix mypy stubs so that the following passes in the test suite
---[case testCanConvertTypedDictToAnySuperclassOfMapping]
---from mypy_extensions import TypedDict
---from typing import Sized, Iterable, Container
---Point = TypedDict('Point', {'x': int, 'y': int})
---def as_sized(p: Point) -> Sized:
--- return p
---def as_iterable(p: Point) -> Iterable[str]:
--- return p
---def as_container(p: Point) -> Container[str]:
--- return p
---def as_object(p: Point) -> object:
--- return p
---[builtins fixtures/dict.pyi]
-
-[case testCannotConvertTypedDictToDictOrMutableMapping]
-from mypy_extensions import TypedDict
-from typing import Dict, MutableMapping
-Point = TypedDict('Point', {'x': int, 'y': int})
-def as_dict(p: Point) -> Dict[str, int]:
- return p # E: Incompatible return value type (got "Point", expected Dict[str, int])
-def as_mutable_mapping(p: Point) -> MutableMapping[str, int]:
- return p # E: Incompatible return value type (got "Point", expected MutableMapping[str, int])
-[builtins fixtures/dict.pyi]
-
-[case testCanConvertTypedDictToAny]
-from mypy_extensions import TypedDict
-from typing import Any
-Point = TypedDict('Point', {'x': int, 'y': int})
-def unprotect(p: Point) -> Any:
- return p
-[builtins fixtures/dict.pyi]
-
-
--- Join
-
-[case testJoinOfTypedDictHasOnlyCommonKeysAndNewFallback]
-from mypy_extensions import TypedDict
-TaggedPoint = TypedDict('TaggedPoint', {'type': str, 'x': int, 'y': int})
-Point3D = TypedDict('Point3D', {'x': int, 'y': int, 'z': int})
-p1 = TaggedPoint(type='2d', x=0, y=0)
-p2 = Point3D(x=1, y=1, z=1)
-joined_points = [p1, p2]
-reveal_type(p1) # E: Revealed type is 'TypedDict(type=builtins.str, x=builtins.int, y=builtins.int, _fallback=typing.Mapping[builtins.str, builtins.object])'
-reveal_type(p2) # E: Revealed type is 'TypedDict(x=builtins.int, y=builtins.int, z=builtins.int, _fallback=typing.Mapping[builtins.str, builtins.int])'
-reveal_type(joined_points) # E: Revealed type is 'builtins.list[TypedDict(x=builtins.int, y=builtins.int, _fallback=typing.Mapping[builtins.str, builtins.int])]'
-[builtins fixtures/dict.pyi]
-
-[case testJoinOfTypedDictRemovesNonequivalentKeys]
-from mypy_extensions import TypedDict
-CellWithInt = TypedDict('CellWithInt', {'value': object, 'meta': int})
-CellWithObject = TypedDict('CellWithObject', {'value': object, 'meta': object})
-c1 = CellWithInt(value=1, meta=42)
-c2 = CellWithObject(value=2, meta='turtle doves')
-joined_cells = [c1, c2]
-reveal_type(c1) # E: Revealed type is 'TypedDict(value=builtins.int, meta=builtins.int, _fallback=typing.Mapping[builtins.str, builtins.int])'
-reveal_type(c2) # E: Revealed type is 'TypedDict(value=builtins.int, meta=builtins.str, _fallback=typing.Mapping[builtins.str, builtins.object])'
-reveal_type(joined_cells) # E: Revealed type is 'builtins.list[TypedDict(value=builtins.int, _fallback=typing.Mapping[builtins.str, builtins.int])]'
-[builtins fixtures/dict.pyi]
-
-[case testJoinOfDisjointTypedDictsIsEmptyTypedDict]
-from mypy_extensions import TypedDict
-Point = TypedDict('Point', {'x': int, 'y': int})
-Cell = TypedDict('Cell', {'value': object})
-d1 = Point(x=0, y=0)
-d2 = Cell(value='pear tree')
-joined_dicts = [d1, d2]
-reveal_type(d1) # E: Revealed type is 'TypedDict(x=builtins.int, y=builtins.int, _fallback=typing.Mapping[builtins.str, builtins.int])'
-reveal_type(d2) # E: Revealed type is 'TypedDict(value=builtins.str, _fallback=typing.Mapping[builtins.str, builtins.str])'
-reveal_type(joined_dicts) # E: Revealed type is 'builtins.list[TypedDict(_fallback=typing.Mapping[builtins.str, builtins.None])]'
-[builtins fixtures/dict.pyi]
-
-[case testJoinOfTypedDictWithCompatibleMappingIsMapping]
-from mypy_extensions import TypedDict
-from typing import Mapping
-Cell = TypedDict('Cell', {'value': int})
-left = Cell(value=42)
-right = {'score': 999} # type: Mapping[str, int]
-joined1 = [left, right]
-joined2 = [right, left]
-reveal_type(joined1) # E: Revealed type is 'builtins.list[typing.Mapping*[builtins.str, builtins.int]]'
-reveal_type(joined2) # E: Revealed type is 'builtins.list[typing.Mapping*[builtins.str, builtins.int]]'
-[builtins fixtures/dict.pyi]
-
--- TODO: Fix mypy stubs so that the following passes in the test suite
---[case testJoinOfTypedDictWithCompatibleMappingSupertypeIsSupertype]
---from mypy_extensions import TypedDict
---from typing import Sized
---Cell = TypedDict('Cell', {'value': int})
---left = Cell(value=42)
---right = {'score': 999} # type: Sized
---joined1 = [left, right]
---joined2 = [right, left]
---reveal_type(joined1) # E: Revealed type is 'builtins.list[typing.Sized*]'
---reveal_type(joined2) # E: Revealed type is 'builtins.list[typing.Sized*]'
---[builtins fixtures/dict.pyi]
-
-[case testJoinOfTypedDictWithIncompatibleMappingIsObject]
-from mypy_extensions import TypedDict
-from typing import Mapping
-Cell = TypedDict('Cell', {'value': int})
-left = Cell(value=42)
-right = {'score': 'zero'} # type: Mapping[str, str]
-joined1 = [left, right]
-joined2 = [right, left]
-reveal_type(joined1) # E: Revealed type is 'builtins.list[builtins.object*]'
-reveal_type(joined2) # E: Revealed type is 'builtins.list[builtins.object*]'
-[builtins fixtures/dict.pyi]
-
-[case testJoinOfTypedDictWithIncompatibleTypeIsObject]
-from mypy_extensions import TypedDict
-from typing import Mapping
-Cell = TypedDict('Cell', {'value': int})
-left = Cell(value=42)
-right = 42
-joined1 = [left, right]
-joined2 = [right, left]
-reveal_type(joined1) # E: Revealed type is 'builtins.list[builtins.object*]'
-reveal_type(joined2) # E: Revealed type is 'builtins.list[builtins.object*]'
-[builtins fixtures/dict.pyi]
-
-
--- Meet
-
-[case testMeetOfTypedDictsWithCompatibleCommonKeysHasAllKeysAndNewFallback]
-from mypy_extensions import TypedDict
-from typing import TypeVar, Callable
-XY = TypedDict('XY', {'x': int, 'y': int})
-YZ = TypedDict('YZ', {'y': int, 'z': int})
-T = TypeVar('T')
-def f(x: Callable[[T, T], None]) -> T: pass
-def g(x: XY, y: YZ) -> None: pass
-reveal_type(f(g)) # E: Revealed type is 'TypedDict(x=builtins.int, y=builtins.int, z=builtins.int, _fallback=typing.Mapping[builtins.str, builtins.int])'
-[builtins fixtures/dict.pyi]
-
-[case testMeetOfTypedDictsWithIncompatibleCommonKeysIsUninhabited]
-# flags: --strict-optional
-from mypy_extensions import TypedDict
-from typing import TypeVar, Callable
-XYa = TypedDict('XYa', {'x': int, 'y': int})
-YbZ = TypedDict('YbZ', {'y': object, 'z': int})
-T = TypeVar('T')
-def f(x: Callable[[T, T], None]) -> T: pass
-def g(x: XYa, y: YbZ) -> None: pass
-reveal_type(f(g)) # E: Revealed type is '<uninhabited>'
-[builtins fixtures/dict.pyi]
-
-[case testMeetOfTypedDictsWithNoCommonKeysHasAllKeysAndNewFallback]
-from mypy_extensions import TypedDict
-from typing import TypeVar, Callable
-X = TypedDict('X', {'x': int})
-Z = TypedDict('Z', {'z': int})
-T = TypeVar('T')
-def f(x: Callable[[T, T], None]) -> T: pass
-def g(x: X, y: Z) -> None: pass
-reveal_type(f(g)) # E: Revealed type is 'TypedDict(x=builtins.int, z=builtins.int, _fallback=typing.Mapping[builtins.str, builtins.int])'
-[builtins fixtures/dict.pyi]
-
-# TODO: It would be more accurate for the meet to be TypedDict instead.
-[case testMeetOfTypedDictWithCompatibleMappingIsUninhabitedForNow]
-# flags: --strict-optional
-from mypy_extensions import TypedDict
-from typing import TypeVar, Callable, Mapping
-X = TypedDict('X', {'x': int})
-M = Mapping[str, int]
-T = TypeVar('T')
-def f(x: Callable[[T, T], None]) -> T: pass
-def g(x: X, y: M) -> None: pass
-reveal_type(f(g)) # E: Revealed type is '<uninhabited>'
-[builtins fixtures/dict.pyi]
-
-[case testMeetOfTypedDictWithIncompatibleMappingIsUninhabited]
-# flags: --strict-optional
-from mypy_extensions import TypedDict
-from typing import TypeVar, Callable, Mapping
-X = TypedDict('X', {'x': int})
-M = Mapping[str, str]
-T = TypeVar('T')
-def f(x: Callable[[T, T], None]) -> T: pass
-def g(x: X, y: M) -> None: pass
-reveal_type(f(g)) # E: Revealed type is '<uninhabited>'
-[builtins fixtures/dict.pyi]
-
-# TODO: It would be more accurate for the meet to be TypedDict instead.
-[case testMeetOfTypedDictWithCompatibleMappingSuperclassIsUninhabitedForNow]
-# flags: --strict-optional
-from mypy_extensions import TypedDict
-from typing import TypeVar, Callable, Iterable
-X = TypedDict('X', {'x': int})
-I = Iterable[str]
-T = TypeVar('T')
-def f(x: Callable[[T, T], None]) -> T: pass
-def g(x: X, y: I) -> None: pass
-reveal_type(f(g)) # E: Revealed type is '<uninhabited>'
-[builtins fixtures/dict.pyi]
-
-
--- Constraint Solver
-
--- TODO: Figure out some way to trigger the ConstraintBuilderVisitor.visit_typeddict_type() path.
-
-
--- Methods
-
--- TODO: iter() doesn't accept TypedDictType as an argument type. Figure out why.
---[case testCanCallMappingMethodsOnTypedDict]
---from mypy_extensions import TypedDict
---Cell = TypedDict('Cell', {'value': int})
---c = Cell(value=42)
---c['value']
---iter(c)
---len(c)
---'value' in c
---c.keys()
---c.items()
---c.values()
---c.get('value')
---c == c
---c != c
---[builtins fixtures/dict.pyi]
-
-
--- Special Method: __getitem__
-
-[case testCanGetItemOfTypedDictWithValidStringLiteralKey]
-from mypy_extensions import TypedDict
-TaggedPoint = TypedDict('TaggedPoint', {'type': str, 'x': int, 'y': int})
-p = TaggedPoint(type='2d', x=42, y=1337)
-reveal_type(p['type']) # E: Revealed type is 'builtins.str'
-reveal_type(p['x']) # E: Revealed type is 'builtins.int'
-reveal_type(p['y']) # E: Revealed type is 'builtins.int'
-[builtins fixtures/dict.pyi]
-
-[case testCanGetItemOfTypedDictWithValidBytesOrUnicodeLiteralKey]
-# flags: --python-version 2.7
-from mypy_extensions import TypedDict
-Cell = TypedDict('Cell', {'value': int})
-c = Cell(value=42)
-reveal_type(c['value']) # E: Revealed type is 'builtins.int'
-reveal_type(c[u'value']) # E: Revealed type is 'builtins.int'
-[builtins_py2 fixtures/dict.pyi]
-
-[case testCannotGetItemOfTypedDictWithInvalidStringLiteralKey]
-from mypy_extensions import TypedDict
-TaggedPoint = TypedDict('TaggedPoint', {'type': str, 'x': int, 'y': int})
-p = TaggedPoint(type='2d', x=42, y=1337)
-p['z'] # E: 'z' is not a valid item name; expected one of ['type', 'x', 'y']
-[builtins fixtures/dict.pyi]
-
-[case testCannotGetItemOfTypedDictWithNonLiteralKey]
-from mypy_extensions import TypedDict
-from typing import Union
-TaggedPoint = TypedDict('TaggedPoint', {'type': str, 'x': int, 'y': int})
-p = TaggedPoint(type='2d', x=42, y=1337)
-def get_coordinate(p: TaggedPoint, key: str) -> Union[str, int]:
- return p[key] # E: Cannot prove expression is a valid item name; expected one of ['type', 'x', 'y']
-[builtins fixtures/dict.pyi]
-
-
--- Special Method: __setitem__
-
-[case testCanSetItemOfTypedDictWithValidStringLiteralKeyAndCompatibleValueType]
-from mypy_extensions import TypedDict
-TaggedPoint = TypedDict('TaggedPoint', {'type': str, 'x': int, 'y': int})
-p = TaggedPoint(type='2d', x=42, y=1337)
-p['type'] = 'two_d'
-p['x'] = 1
-[builtins fixtures/dict.pyi]
-
-[case testCannotSetItemOfTypedDictWithIncompatibleValueType]
-from mypy_extensions import TypedDict
-TaggedPoint = TypedDict('TaggedPoint', {'type': str, 'x': int, 'y': int})
-p = TaggedPoint(type='2d', x=42, y=1337)
-p['x'] = 'y' # E: Argument 2 has incompatible type "str"; expected "int"
-[builtins fixtures/dict.pyi]
-
-[case testCannotSetItemOfTypedDictWithInvalidStringLiteralKey]
-from mypy_extensions import TypedDict
-TaggedPoint = TypedDict('TaggedPoint', {'type': str, 'x': int, 'y': int})
-p = TaggedPoint(type='2d', x=42, y=1337)
-p['z'] = 1 # E: 'z' is not a valid item name; expected one of ['type', 'x', 'y']
-[builtins fixtures/dict.pyi]
-
-[case testCannotSetItemOfTypedDictWithNonLiteralKey]
-from mypy_extensions import TypedDict
-from typing import Union
-TaggedPoint = TypedDict('TaggedPoint', {'type': str, 'x': int, 'y': int})
-p = TaggedPoint(type='2d', x=42, y=1337)
-def set_coordinate(p: TaggedPoint, key: str, value: int) -> None:
- p[key] = value # E: Cannot prove expression is a valid item name; expected one of ['type', 'x', 'y']
-[builtins fixtures/dict.pyi]
-
-
--- Special Method: get
-
--- TODO: Implement support for these cases:
---[case testGetOfTypedDictWithValidStringLiteralKeyReturnsPreciseType]
---[case testGetOfTypedDictWithInvalidStringLiteralKeyIsError]
---[case testGetOfTypedDictWithNonLiteralKeyReturnsImpreciseType]
-
-
--- isinstance
-
--- TODO: Implement support for this case.
---[case testCannotIsInstanceTypedDictType]
-
--- scoping
-[case testTypedDictInClassNamespace]
-# https://github.com/python/mypy/pull/2553#issuecomment-266474341
-from mypy_extensions import TypedDict
-class C:
- def f(self):
- A = TypedDict('A', {'x': int})
- def g(self):
- A = TypedDict('A', {'y': int})
-C.A # E: "C" has no attribute "A"
-[builtins fixtures/dict.pyi]
-
-[case testTypedDictInFunction]
-from mypy_extensions import TypedDict
-def f() -> None:
- A = TypedDict('A', {'x': int})
-A # E: Name 'A' is not defined
-[builtins fixtures/dict.pyi]
diff --git a/test-data/unit/check-typevar-values.test b/test-data/unit/check-typevar-values.test
deleted file mode 100644
index 26e56a5..0000000
--- a/test-data/unit/check-typevar-values.test
+++ /dev/null
@@ -1,505 +0,0 @@
--- Test cases for type variables with values restriction.
-
-
-[case testCallGenericFunctionWithTypeVarValueRestriction]
-from typing import TypeVar
-T = TypeVar('T', int, str)
-def f(x: T) -> None: pass
-f(1)
-f('x')
-f(object()) # E: Type argument 1 of "f" has incompatible value "object"
-
-[case testCallGenericFunctionWithTypeVarValueRestrictionUsingContext]
-from typing import TypeVar, List
-T = TypeVar('T', int, str)
-def f(x: T) -> List[T]: pass
-i = [1]
-s = ['x']
-o = [object()]
-i = f(1)
-s = f('')
-o = f(1) # E: Type argument 1 of "f" has incompatible value "object"
-[builtins fixtures/list.pyi]
-
-[case testCallGenericFunctionWithTypeVarValueRestrictionAndAnyArgs]
-from typing import TypeVar, Any
-T = TypeVar('T', int, str)
-def f(x: T) -> None: pass
-f(Any(object()))
-[out]
-
-[case testCallGenericFunctionWithTypeVarValueRestrictionInDynamicFunc]
-from typing import TypeVar, Any
-T = TypeVar('T', int, str)
-def f(x: T) -> None: pass
-def g():
- f(object())
-[out]
-
-[case testCallGenericFunctionWithTypeVarValueRestrictionUsingSubtype]
-from typing import TypeVar
-T = TypeVar('T', int, str)
-def f(x: T) -> None: pass
-class S(str): pass
-f(S())
-[out]
-
-[case testCheckGenericFunctionBodyWithTypeVarValues]
-from typing import TypeVar
-class A:
- def f(self, x: int) -> A: return self
-class B:
- def f(self, x: int) -> B: return self
-AB = TypeVar('AB', A, B)
-def f(x: AB) -> AB:
- x = x.f(1)
- return x.f(1)
-
-[case testCheckGenericFunctionBodyWithTypeVarValues2]
-from typing import TypeVar
-class A:
- def f(self) -> A: return A()
- def g(self) -> B: return B()
-class B:
- def f(self) -> A: return A()
- def g(self) -> B: return B()
-AB = TypeVar('AB', A, B)
-def f(x: AB) -> AB:
- return x.f() # Error
-def g(x: AB) -> AB:
- return x.g() # Error
-[out]
-main:10: error: Incompatible return value type (got "A", expected "B")
-main:12: error: Incompatible return value type (got "B", expected "A")
-
-[case testTypeInferenceAndTypeVarValues]
-from typing import TypeVar
-class A:
- def f(self) -> A: return self
- def g(self) -> B: return B()
-class B:
- def f(self) -> B: return self
- def g(self) -> B: return B()
-AB = TypeVar('AB', A, B)
-def f(x: AB) -> AB:
- y = x
- if y:
- return y.f()
- else:
- return y.g() # E: Incompatible return value type (got "B", expected "A")
-[out]
-
-[case testTypeDeclaredBasedOnTypeVarWithValues]
-from typing import TypeVar
-T = TypeVar('T', int, str)
-def f(x: T) -> T:
- a = None # type: T
- b = None # type: T
- a = x
- b = x
- a = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
- b = 1 # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-[out]
-
-[case testIsinstanceAndTypeVarValues]
-from typing import TypeVar
-T = TypeVar('T', int, str)
-def f(x: T) -> T:
- if isinstance(x, int):
- return 2
-def g(x: T) -> T:
- if isinstance(x, str):
- return ''
-def h(x: T) -> T:
- if isinstance(x, int):
- return '' # E: Incompatible return value type (got "str", expected "int")
- return x
-[builtins fixtures/isinstance.pyi]
-[out]
-
-[case testIsinstanceAndTypeVarValues2]
-from typing import TypeVar
-T = TypeVar('T', int, str)
-def f(x: T) -> T:
- if isinstance(x, int):
- return 2
- else:
- return ''
-def g(x: T) -> T:
- if isinstance(x, int):
- return '' # E: Incompatible return value type (got "str", expected "int")
- else:
- return 2 # E: Incompatible return value type (got "int", expected "str")
- return x
-[builtins fixtures/isinstance.pyi]
-[out]
-
-[case testIsinstanceAndTypeVarValues3]
-from typing import TypeVar
-T = TypeVar('T', int, str)
-def f(x: T) -> T:
- if isinstance(x, int):
- y = 1
- else:
- y = ''
- return y
-[builtins fixtures/isinstance.pyi]
-
-[case testIsinstanceAndTypeVarValues4]
-from typing import TypeVar
-T = TypeVar('T', int, str)
-def f(x: T) -> T:
- if isinstance(x, int):
- y = 1
- else:
- y = object()
- return y # E: Incompatible return value type (got "object", expected "str")
-[builtins fixtures/isinstance.pyi]
-[out]
-
-[case testIsinstanceAndTypeVarValues5]
-from typing import TypeVar
-T = TypeVar('T', int, str)
-def f(x: T) -> T:
- if isinstance(x, int):
- y = object()
- else:
- y = ''
- return y # E: Incompatible return value type (got "object", expected "int")
-[builtins fixtures/isinstance.pyi]
-[out]
-
-[case testIsinstanceWithUserDefinedTypeAndTypeVarValues]
-from typing import TypeVar
-class A: pass
-class B: pass
-T = TypeVar('T', A, B)
-def f(x: T) -> None:
- y = x
- if isinstance(x, A):
- # This is only checked when x is A, since A and B are not considered overlapping.
- x = y
- x = A()
- else:
- x = B()
- x = y
- x.foo() # E: "B" has no attribute "foo"
-S = TypeVar('S', int, str)
-def g(x: S) -> None:
- y = x
- if isinstance(x, int):
- x = y
-[builtins fixtures/isinstance.pyi]
-[out]
-
-[case testIsinstanceWithUserDefinedTypeAndTypeVarValues2]
-from typing import TypeVar
-class S(str): pass
-T = TypeVar('T', S, int)
-def f(x: T) -> None:
- y = x
- if isinstance(x, S):
- # This is checked only when type of x is str.
- x = y
- x = S()
- x = 1 # E: Incompatible types in assignment (expression has type "int", variable has type "S")
- else:
- x = y
- x = 1
- x = S() # E: Incompatible types in assignment (expression has type "S", variable has type "int")
-[builtins fixtures/isinstance.pyi]
-[out]
-
-[case testTypeVarValuesAndNestedCalls]
-from typing import TypeVar
-T = TypeVar('T', int, str)
-def f(m: T) -> int: pass
-def h(x: int) -> int: pass
-def g(a: T) -> None:
- h(f(a))
-[out]
-
-[case testGenericTypeWithTypevarValues]
-from typing import TypeVar, Generic, Any
-X = TypeVar('X', int, str)
-class A(Generic[X]): pass
-a = None # type: A[int]
-b = None # type: A[str]
-d = None # type: A[object] # E: Type argument 1 of "A" has incompatible value "object"
-c = None # type: A[Any]
-
-[case testConstructGenericTypeWithTypevarValuesAndTypeInference]
-from typing import TypeVar, Generic, Any
-X = TypeVar('X', int, str)
-class A(Generic[X]):
- def __init__(self, x: X) -> None: pass
-A(1)
-A('x')
-A(Any(object()))
-A(object()) # E: Type argument 1 of "A" has incompatible value "object"
-
-[case testGenericTypeWithTypevarValuesAndTypevarArgument]
-from typing import TypeVar, Generic
-class C: pass
-X = TypeVar('X', int, str)
-Y = TypeVar('Y', int, C)
-Z = TypeVar('Z')
-class D(Generic[X]):
- def __init__(self, x: X) -> None: pass
-def f(x: X) -> None:
- a = None # type: D[X]
-def g(x: Y) -> None:
- a = None # type: D[Y]
-def h(x: Z) -> None:
- a = None # type: D[Z]
-[out]
-main:11: error: Invalid type argument value for "D"
-main:13: error: Type variable "Z" not valid as type argument value for "D"
-
-[case testGenericTypeWithTypevarValuesAndSubtypePromotion]
-from typing import TypeVar, Generic
-X = TypeVar('X', int, str)
-class S(str): pass
-class C(Generic[X]):
- def __init__(self, x: X) -> None: pass
-x = None # type: C[str]
-y = C(S())
-x = y
-y = x
-c_int = C(1) # type: C[int]
-y = c_int # E: Incompatible types in assignment (expression has type C[int], variable has type C[str])
-
-[case testGenericTypeBodyWithTypevarValues]
-from typing import TypeVar, Generic
-class A:
- def f(self, x: int) -> None: pass
- def g(self, x: int) -> None: pass
- def h(self, x: str) -> None: pass
-class B:
- def f(self, x: int) -> None: pass
- def g(self, x: str) -> None: pass
- def h(self, x: int) -> None: pass
-X = TypeVar('X', A, B)
-class C(Generic[X]):
- def f(self, x: X) -> None:
- x.f(1)
- x.g(1) # E: Argument 1 to "g" of "B" has incompatible type "int"; expected "str"
- x.h(1) # E: Argument 1 to "h" of "A" has incompatible type "int"; expected "str"
-[out]
-
-[case testAttributeInGenericTypeWithTypevarValues1]
-from typing import TypeVar, Generic
-X = TypeVar('X', int, str)
-class C(Generic[X]):
- x = None # type: X
- def f(self, x: X) -> None:
- self.x = x
- self.x = 1 # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-[out]
-
-[case testAttributeInGenericTypeWithTypevarValues2]
-from typing import TypeVar, Generic
-X = TypeVar('X', int, str)
-class C(Generic[X]):
- x = None # type: X
-cn = C() # type: C[int]
-cn.x = 1
-cn.x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-cs = C() # type: C[str]
-cs.x = ''
-cs.x = 1 # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-
-[case testInferredAttributeInGenericClassBodyWithTypevarValues]
-from typing import TypeVar, Generic
-X = TypeVar('X', int, str)
-class C(Generic[X]):
- x = 1
-C.x = 1
-C.x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-
-[case testMultipleClassTypevarsWithValues1]
-from typing import TypeVar, Generic
-class A:
- def f(self, x: int) -> None: pass
-class B:
- def f(self, x: str) -> None: pass
-X = TypeVar('X', A, B)
-Y = TypeVar('Y', int, str)
-class C(Generic[X, Y]):
- def f(self, x: X, y: Y) -> None:
- x.f(y)
-[out]
-main:10: error: Argument 1 to "f" of "A" has incompatible type "str"; expected "int"
-main:10: error: Argument 1 to "f" of "B" has incompatible type "int"; expected "str"
-
-[case testMultipleClassTypevarsWithValues2]
-from typing import TypeVar, Generic
-class A: pass
-class B: pass
-X = TypeVar('X', A, B)
-Y = TypeVar('Y', int, str)
-class C(Generic[X, Y]): pass
-a = None # type: C[A, int]
-b = None # type: C[B, str]
-c = None # type: C[int, int] # E: Type argument 1 of "C" has incompatible value "int"
-d = None # type: C[A, A] # E: Type argument 2 of "C" has incompatible value "A"
-
-[case testCallGenericFunctionUsingMultipleTypevarsWithValues]
-from typing import TypeVar
-class A: pass
-class B: pass
-X = TypeVar('X', A, B)
-Y = TypeVar('Y', int, str)
-def f(x: X, y: Y) -> None: pass
-f(A(), '')
-f(B(), 1)
-f(A(), A()) # E: Type argument 2 of "f" has incompatible value "A"
-f(1, 1) # E: Type argument 1 of "f" has incompatible value "int"
-
-[case testGenericFunctionWithNormalAndRestrictedTypevar]
-from typing import TypeVar, Generic
-X = TypeVar('X')
-Y = TypeVar('Y', int, str)
-class C(Generic[Y]):
- def __init__(self, y: Y) -> None: pass
-def f(x: X, y: Y, z: int) -> None:
- C(y)
- C(x) # Error
- z = x # Error
- z = y # Error
- y.foo # Error
-[out]
-main:8: error: Type argument 1 of "C" has incompatible value "X"
-main:9: error: Incompatible types in assignment (expression has type "X", variable has type "int")
-main:10: error: Incompatible types in assignment (expression has type "str", variable has type "int")
-main:11: error: "int" has no attribute "foo"
-main:11: error: "str" has no attribute "foo"
-
-[case testTypeVarWithValueInferredFromObjectReturnTypeContext]
-from typing import TypeVar
-T = TypeVar('T', int, str)
-def c1(x: object) -> None: pass
-def c2(x: int) -> None: pass
-def c3(x: str) -> None: pass
-def g(x: T) -> T: pass
-c1(g(''))
-c2(g(1))
-c3(g(''))
-c2(g('')) # E: Argument 1 to "c2" has incompatible type "str"; expected "int"
-c3(g(1)) # E: Argument 1 to "c3" has incompatible type "int"; expected "str"
-
-[case testTypeVarWithValueInferredFromObjectReturnTypeContext2]
-from typing import TypeVar
-T = TypeVar('T', int, str)
-class ss(str): pass
-def c(x: ss) -> None: pass
-def g(x: T) -> T: pass
-c(g(''))
-c(g(1))
-[out]
-main:6: error: Argument 1 to "c" has incompatible type "str"; expected "ss"
-main:7: error: Argument 1 to "c" has incompatible type "int"; expected "ss"
-
-
--- Special cases
--- -------------
-
-
-[case testTypevarValuesSpecialCase1]
-from typing import TypeVar, Generic
-from abc import abstractmethod
-T = TypeVar('T', int, str)
-class A(Generic[T]):
- @abstractmethod
- def f(self) -> 'A[T]': pass
-class B(A[str]):
- @abstractmethod
- def f(self) -> 'B': pass
-class C(A[str]):
- @abstractmethod
- def f(self) -> int: # E: Return type of "f" incompatible with supertype "A"
- pass
-[out]
-
-[case testDefaultArgumentValueInGenericClassWithTypevarValues]
-from typing import TypeVar, Generic
-T = TypeVar('T', int, str)
-class C(Generic[T]):
- def f(self, x: int = None) -> None: pass
-
-[case testTypevarValuesWithOverloadedFunctionSpecialCase]
-from typing import TypeVar, overload, Callable
-
-T = TypeVar('T', int, str)
-def f(x: T) -> None:
- y = m(g, x)
- x = y
- y = object()
-
-A = TypeVar('A')
-R = TypeVar('R')
-def m(f: Callable[[A], R], it: A) -> A: pass
-
- at overload
-def g(x: int) -> int: return x
- at overload
-def g(x: str) -> str: return x
-[out]
-main:7: error: Incompatible types in assignment (expression has type "object", variable has type "int")
-main:7: error: Incompatible types in assignment (expression has type "object", variable has type "str")
-
-[case testGenericFunctionSubtypingWithTypevarValues]
-from typing import TypeVar
-class A: pass
-T = TypeVar('T', int, str)
-U = TypeVar('U', str, A, int)
-def f(x: T) -> T: pass
-def g(x: U) -> U: pass
-a = f
-a = f
-a = g
-b = g
-b = g
-b = f # E: Incompatible types in assignment (expression has type Callable[[T], T], variable has type Callable[[U], U])
-
-[case testInnerFunctionWithTypevarValues]
-from typing import TypeVar
-T = TypeVar('T', int, str)
-U = TypeVar('U', int, str)
-def outer(x: T) -> T:
- def inner(y: T) -> T:
- return x
- def inner2(y: U) -> U:
- return y
- inner(x)
- inner(3) # E: Argument 1 to "inner" has incompatible type "int"; expected "str"
- inner2(x)
- inner2(3)
- outer(3)
- return x
-[out]
-
-[case testInnerFunctionMutualRecursionWithTypevarValues]
-from typing import TypeVar
-T = TypeVar('T', int, str)
-def outer(x: T) -> T:
- def inner1(y: T) -> T:
- return inner2(y)
- def inner2(y: T) -> T:
- return inner1('a') # E: Argument 1 to "inner1" has incompatible type "str"; expected "int"
- return inner1(x)
-[out]
-
-[case testClassMemberTypeVarInFunctionBody]
-from typing import TypeVar
-class C:
- T = TypeVar('T', int)
- def f(self, x: T) -> T:
- A = C.T
- return x
-
-[case testParameterLessGenericAsRestriction]
-from typing import Sequence, Iterable, TypeVar
-S = TypeVar('S', Sequence, Iterable)
-def my_len(s: S) -> None: pass
-def crash() -> None: my_len((0,))
diff --git a/test-data/unit/check-underscores.test b/test-data/unit/check-underscores.test
deleted file mode 100644
index a1d88cb..0000000
--- a/test-data/unit/check-underscores.test
+++ /dev/null
@@ -1,16 +0,0 @@
-[case testUnderscoresRequire36]
-# flags: --fast-parser --python-version 3.5
-x = 1000_000 # E: Underscores in numeric literals are only supported in Python 3.6
-[out]
-
-[case testUnderscoresSyntaxError]
-# flags: --fast-parser --python-version 3.6
-x = 1000_000_ # E: invalid token
-[out]
-
-[case testUnderscoresBasics]
-# flags: --fast-parser --python-version 3.6
-x: int
-x = 1000_000
-x = 0x_FF_FF_FF_FF
-y: str = 1000_000.000_001 # E: Incompatible types in assignment (expression has type "float", variable has type "str")
diff --git a/test-data/unit/check-unions.test b/test-data/unit/check-unions.test
deleted file mode 100644
index 8c979d7..0000000
--- a/test-data/unit/check-unions.test
+++ /dev/null
@@ -1,140 +0,0 @@
--- Type checking of union types
-
-[case testUnion1]
-from typing import Union
-def f(x: Union[int, str]) -> None:
- if isinstance(x, int):
- y = 1
- y = x
- elif isinstance(x, str):
- z = 'a'
- z = x
-[builtins fixtures/isinstance.pyi]
-
-[case testUnion2]
-from typing import Union
-def f(x: Union[int, str]) -> None:
- if isinstance(x, int):
- y = 1
- y = x
- else:
- z = 'a'
- z = x
-[builtins fixtures/isinstance.pyi]
-
-[case testUnion3]
-from typing import Union
-def f(x: Union[int, str]) -> None:
- if isinstance(x, int):
- y = 1
- y = x
- else:
- z = 2
- z = x # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-[builtins fixtures/isinstance.pyi]
-[out]
-
-[case testUnionAnyIsInstance]
-from typing import Any, Union
-
-def func(v:Union[int, Any]) -> None:
- if isinstance(v, int):
- reveal_type(v) # E: Revealed type is 'builtins.int'
- else:
- reveal_type(v) # E: Revealed type is 'Any'
-[builtins fixtures/isinstance.pyi]
-[out]
-
-[case testUnionAttributeAccess]
-from typing import Union
-
-class A: y = 1
-class B: y = 2
-class C: pass
-
-w = None # type: Union[A, B]
-x = None # type: Union[A, C]
-y = None # type: int
-z = None # type: str
-
-y = w.y
-z = w.y # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-w.y = 'a' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-y = x.y # E: Some element of union has no attribute "y"
-z = x.y # E: Some element of union has no attribute "y"
-
-[builtins fixtures/isinstance.pyi]
-
-[case testUnionMethodCalls]
-from typing import Union
-
-class A:
- def foo(self) -> int: pass
-class B:
- def foo(self) -> int: pass
-class C:
- def foo(self) -> str: pass
-
-x = None # type: Union[A, B]
-y = None # type: Union[A, C]
-i = None # type: int
-
-x.foo()
-y.foo()
-i = x.foo()
-i = y.foo() # E: Incompatible types in assignment (expression has type "Union[int, str]", variable has type "int")
-
-[builtins fixtures/isinstance.pyi]
-
-[case testUnionIndexing]
-from typing import Union, List
-x = None # type: Union[List[int], str]
-x[2]
-x[2] + 1 # E: Unsupported operand types for + (likely involving Union)
-[builtins fixtures/isinstancelist.pyi]
-
-[case testUnionAsOverloadArg]
-from typing import Union, overload
- at overload
-def f(x: Union[int, str]) -> int: pass
- at overload
-def f(x: type) -> str: pass
-x = 0
-x = f(1)
-x = f('')
-s = ''
-s = f(int)
-s = f(1) # E: Incompatible types in assignment (expression has type "int", variable has type "str")
-x = f(int) # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-
-[case testUnionWithNoneItem]
-from typing import Union
-def f() -> Union[int, None]: pass
-x = 1
-x = f()
-
-[case testOptional]
-from typing import Optional
-def f(x: Optional[int]) -> None: pass
-f(1)
-f(None)
-f('') # E: Argument 1 to "f" has incompatible type "str"; expected "int"
-
-[case testUnionSimplificationGenericFunction]
-from typing import TypeVar, Union, List
-T = TypeVar('T')
-def f(x: List[T]) -> Union[T, int]: pass
-def g(y: str) -> None: pass
-a = f([1])
-g(a) # E: Argument 1 to "g" has incompatible type "int"; expected "str"
-[builtins fixtures/list.pyi]
-
-[case testUnionSimplificationGenericClass]
-from typing import TypeVar, Union, Generic
-T = TypeVar('T')
-U = TypeVar('U')
-class C(Generic[T, U]):
- def f(self, x: str) -> Union[T, U]: pass
-a = C() # type: C[int, int]
-b = a.f('a')
-a.f(b) # E: Argument 1 to "f" of "C" has incompatible type "int"; expected "str"
diff --git a/test-data/unit/check-unreachable-code.test b/test-data/unit/check-unreachable-code.test
deleted file mode 100644
index a18a42b..0000000
--- a/test-data/unit/check-unreachable-code.test
+++ /dev/null
@@ -1,459 +0,0 @@
--- Type checker test cases for conditional checks that result in some
--- blocks classified as unreachable (they are not type checked or semantically
--- analyzed).
---
--- For example, we skip blocks that will not be executed on the active
--- Python version.
-
-[case testConditionalTypeAliasPY3]
-import typing
-def f(): pass
-PY3 = f()
-if PY3:
- t = int
- x = object() + 'x' # E: Unsupported left operand type for + ("object")
-else:
- t = str
- y = 'x' / 1
-x
-z = 1 # type: t
-
-[case testConditionalTypeAliasPY3_python2]
-import typing
-def f(): pass
-PY3 = f()
-if PY3:
- t = int
- x = object() + 'x'
-else:
- t = str
- y = 'x' / 1 # E: "str" has no attribute "__div__"
-y
-z = '' # type: t
-
-[case testConditionalAssignmentPY2]
-import typing
-def f(): pass
-PY2 = f()
-if PY2:
- x = object() + 'x'
-else:
- y = 'x' / 1 # E: Unsupported left operand type for / ("str")
-y
-
-[case testConditionalAssignmentPY2_python2]
-import typing
-def f(): pass
-PY2 = f()
-if PY2:
- x = object() + 'x' # E: Unsupported left operand type for + ("object")
-else:
- y = 'x' / 1
-x
-
-[case testConditionalImport]
-import typing
-def f(): pass
-PY2 = f()
-if PY2:
- import fuzzybar
- from barbar import *
- from pawwaw import a, bc
-else:
- import m
-[file m.py]
-import typing
-x = 1
-x = 'a'
-[out]
-tmp/m.py:3: error: Incompatible types in assignment (expression has type "str", variable has type "int")
-
-[case testNegatedMypyConditional]
-import typing
-MYPY = 0
-if not MYPY:
- import xyz753
-else:
- import pow123 # E
-[builtins fixtures/bool.pyi]
-[out]
-main:6: error: Cannot find module named 'pow123'
-main:6: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-
-[case testMypyConditional]
-import typing
-MYPY = 0
-if MYPY:
- None + 1 # E: Unsupported left operand type for + (None)
-else:
- None + ''
-[builtins fixtures/bool.pyi]
-
-[case testTypeCheckingConditional]
-import typing
-if typing.TYPE_CHECKING:
- import pow123 # E
-else:
- import xyz753
-[out]
-main:3: error: Cannot find module named 'pow123'
-main:3: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-
-[case testTypeCheckingConditionalFromImport]
-from typing import TYPE_CHECKING
-if TYPE_CHECKING:
- import pow123 # E
-else:
- import xyz753
-[out]
-main:3: error: Cannot find module named 'pow123'
-main:3: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-
-[case testNegatedTypeCheckingConditional]
-import typing
-if not typing.TYPE_CHECKING:
- import pow123 # E
-else:
- import xyz753
-[builtins fixtures/bool.pyi]
-[out]
-main:5: error: Cannot find module named 'xyz753'
-main:5: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-
-[case testUndefinedTypeCheckingConditional]
-if not TYPE_CHECKING: # E
- import pow123
-else:
- import xyz753
-[builtins fixtures/bool.pyi]
-[out]
-main:1: error: Name 'TYPE_CHECKING' is not defined
-main:4: error: Cannot find module named 'xyz753'
-main:4: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-
-[case testConditionalClassDefPY3]
-def f(): pass
-PY3 = f()
-if PY3:
- pass
-else:
- class X(object):
- pass
-
-[case testUnreachabilityAndElifPY3]
-def f(): pass
-PY3 = f()
-if PY3:
- pass
-elif bool():
- import nonexistent
- 1 + ''
-else:
- import bad_name
- 1 + ''
-[builtins fixtures/bool.pyi]
-[out]
-
-[case testSysVersionInfo_python2]
-import sys
-if sys.version_info[0] >= 3:
- def foo():
- # type: () -> int
- return 0
-else:
- def foo():
- # type: () -> str
- return ''
-reveal_type(foo()) # E: Revealed type is 'builtins.str'
-[builtins_py2 fixtures/ops.pyi]
-[out]
-
-[case testSysVersionInfo]
-import sys
-if sys.version_info[0] >= 3:
- def foo() -> int: return 0
-else:
- def foo() -> str: return ''
-reveal_type(foo()) # E: Revealed type is 'builtins.int'
-[builtins fixtures/ops.pyi]
-[out]
-
-[case testSysVersionInfoNegated_python2]
-import sys
-if not (sys.version_info[0] < 3):
- def foo():
- # type: () -> int
- return 0
-else:
- def foo():
- # type: () -> str
- return ''
-reveal_type(foo()) # E: Revealed type is 'builtins.str'
-[builtins_py2 fixtures/ops.pyi]
-[out]
-
-[case testSysVersionInfoNegated]
-import sys
-if not (sys.version_info[0] < 3):
- def foo() -> int: return 0
-else:
- def foo() -> str: return ''
-reveal_type(foo()) # E: Revealed type is 'builtins.int'
-[builtins fixtures/ops.pyi]
-[out]
-
-[case testSysVersionInfoSliced1]
-import sys
-if sys.version_info[:1] >= (3,):
- def foo() -> int: return 0
-else:
- def foo() -> str: return ''
-foo() + 0
-[builtins fixtures/ops.pyi]
-[out]
-
-[case testSysVersionInfoSliced2]
-import sys
-if sys.version_info[:2] >= (3, 0):
- def foo() -> int: return 0
-else:
- def foo() -> str: return ''
-foo() + 0
-[builtins fixtures/ops.pyi]
-[out]
-
-[case testSysVersionInfoSliced3]
-import sys
-if sys.version_info[:] >= (3, 0):
- def foo() -> int: return 0
-else:
- def foo() -> str: return ''
-foo() + 0
-[builtins fixtures/ops.pyi]
-[out]
-
-[case testSysVersionInfoSliced4]
-import sys
-if sys.version_info[0:2] >= (3, 0):
- def foo() -> int: return 0
-else:
- def foo() -> str: return ''
-foo() + 0
-[builtins fixtures/ops.pyi]
-[out]
-
-[case testSysVersionInfoSliced5]
-import sys
-if sys.version_info[0:] >= (3,):
- def foo() -> int: return 0
-else:
- def foo() -> str: return ''
-foo() + 0
-[builtins fixtures/ops.pyi]
-[out]
-
-[case testSysVersionInfoSliced6]
-import sys
-if sys.version_info[1:] >= (5,):
- def foo() -> int: return 0
-else:
- def foo() -> str: return ''
-foo() + 0
-[builtins fixtures/ops.pyi]
-[out]
-
-[case testSysVersionInfoSliced7]
-import sys
-if sys.version_info >= (3, 5):
- def foo() -> int: return 0
-else:
- def foo() -> str: return ''
-foo() + 0
-[builtins fixtures/ops.pyi]
-[out]
-
-[case testSysVersionInfoSliced8]
-# Our pyversion only has (major, minor),
-# so testing for (major, minor, bugfix) is unsupported.
-import sys
-if sys.version_info >= (3, 5, 0):
- def foo() -> int: return 0
-else:
- def foo() -> str: return '' # E: All conditional function variants must have identical signatures
-[builtins fixtures/ops.pyi]
-[out]
-
-[case testSysVersionInfoSliced9]
-# Our pyversion only has (major, minor),
-# so testing for (minor, bugfix) is unsupported (also it's silly :-).
-import sys
-if sys.version_info[1:] >= (5, 0):
- def foo() -> int: return 0
-else:
- def foo() -> str: return '' # E: All conditional function variants must have identical signatures
-[builtins fixtures/ops.pyi]
-[out]
-
-[case testSysPlatform1]
-import sys
-if sys.platform == 'fictional':
- def foo() -> int: return 0
-else:
- def foo() -> str: return ''
-foo() + ''
-[builtins fixtures/ops.pyi]
-[out]
-
-[case testSysPlatform2]
-import sys
-if sys.platform != 'fictional':
- def foo() -> int: return 0
-else:
- def foo() -> str: return ''
-foo() + 0
-[builtins fixtures/ops.pyi]
-[out]
-
-[case testSysPlatformNegated]
-import sys
-if not (sys.platform == 'fictional'):
- def foo() -> int: return 0
-else:
- def foo() -> str: return ''
-foo() + 0
-[builtins fixtures/ops.pyi]
-[out]
-
-[case testSysVersionInfoClass]
-import sys
-if sys.version_info < (3, 5):
- class C:
- pass
-else:
- class C:
- def foo(self) -> int: return 0
-C().foo() + 0
-[builtins fixtures/ops.pyi]
-[out]
-
-[case testSysVersionInfoImport]
-import sys
-if sys.version_info >= (3, 5):
- import collections
-else:
- collections = None
-Pt = collections.namedtuple('Pt', 'x y z')
-[builtins fixtures/ops.pyi]
-[out]
-
-[case testSysVersionInfoVariable]
-import sys
-if sys.version_info >= (3, 5):
- x = ''
-else:
- x = 0
-x + ''
-[builtins fixtures/ops.pyi]
-[out]
-
-[case testSysVersionInfoInClass]
-import sys
-class C:
- if sys.version_info >= (3, 5):
- def foo(self) -> int: return 0
- else:
- def foo(self) -> str: return ''
-reveal_type(C().foo()) # E: Revealed type is 'builtins.int'
-[builtins fixtures/ops.pyi]
-[out]
-
-[case testSysVersionInfoInFunction]
-import sys
-def foo() -> None:
- if sys.version_info >= (3, 5):
- x = ''
- else:
- x = 0
- reveal_type(x) # E: Revealed type is 'builtins.str'
-[builtins fixtures/ops.pyi]
-[out]
-
-[case testSysPlatformInMethod]
-import sys
-class C:
- def foo(self) -> None:
- if sys.platform != 'fictional':
- x = ''
- else:
- x = 0
- reveal_type(x) # E: Revealed type is 'builtins.str'
-[builtins fixtures/ops.pyi]
-[out]
-
-[case testSysPlatformInFunctionImport]
-import sys
-def foo() -> None:
- if sys.platform != 'fictional':
- import a
- else:
- import b as a
- a.x
-[file a.py]
-x = 1
-[builtins fixtures/ops.pyi]
-[out]
-
-[case testCustomSysVersionInfo]
-# flags: --python-version 3.2
-import sys
-if sys.version_info == (3, 2):
- x = "foo"
-else:
- x = 3
-reveal_type(x) # E: Revealed type is 'builtins.str'
-[builtins fixtures/ops.pyi]
-[out]
-
-[case testCustomSysVersionInfo2]
-# flags: --python-version 3.1
-import sys
-if sys.version_info == (3, 2):
- x = "foo"
-else:
- x = 3
-reveal_type(x) # E: Revealed type is 'builtins.int'
-[builtins fixtures/ops.pyi]
-[out]
-
-[case testCustomSysPlatform]
-# flags: --platform linux
-import sys
-if sys.platform == 'linux':
- x = "foo"
-else:
- x = 3
-reveal_type(x) # E: Revealed type is 'builtins.str'
-[builtins fixtures/ops.pyi]
-[out]
-
-[case testCustomSysPlatform2]
-# flags: --platform win32
-import sys
-if sys.platform == 'linux':
- x = "foo"
-else:
- x = 3
-reveal_type(x) # E: Revealed type is 'builtins.int'
-[builtins fixtures/ops.pyi]
-[out]
-
-[case testCustomSysPlatformStartsWith]
-# flags: --platform win32
-import sys
-if sys.platform.startswith('win'):
- x = "foo"
-else:
- x = 3
-reveal_type(x) # E: Revealed type is 'builtins.str'
-[builtins fixtures/ops.pyi]
-[out]
diff --git a/test-data/unit/check-unsupported.test b/test-data/unit/check-unsupported.test
deleted file mode 100644
index 7f36e69..0000000
--- a/test-data/unit/check-unsupported.test
+++ /dev/null
@@ -1,15 +0,0 @@
--- Tests for unsupported features
-
-
-[case testDecorateOverloadedFunction]
-# The error messages are not the most informative ever.
-def d(x): pass
- at d
-def f(): pass
-def f(x): pass # E
-def g(): pass
- at d # E
-def g(x): pass
-[out]
-main:5: error: Name 'f' already defined
-main:7: error: Name 'g' already defined
diff --git a/test-data/unit/check-varargs.test b/test-data/unit/check-varargs.test
deleted file mode 100644
index 89120bf..0000000
--- a/test-data/unit/check-varargs.test
+++ /dev/null
@@ -1,590 +0,0 @@
--- Test cases for the type checker related to varargs.
-
-
--- Varargs within body
--- -------------------
-
-
-[case testVarArgsWithinFunction]
-from typing import Tuple
-def f( *b: 'B') -> None:
- ab = None # type: Tuple[B, ...]
- ac = None # type: Tuple[C, ...]
- b = ac # E: Incompatible types in assignment (expression has type Tuple[C, ...], variable has type Tuple[B, ...])
- ac = b # E: Incompatible types in assignment (expression has type Tuple[B, ...], variable has type Tuple[C, ...])
- b = ab
- ab = b
-
-class B: pass
-class C: pass
-[builtins fixtures/tuple.pyi]
-[out]
-
-
-[case testVarArgsAreTuple]
-from typing import Tuple, Sequence
-def want_tuple(types: Tuple[type, ...]): pass
-def want_sequence(types: Sequence[type]): pass
-def test(*t: type) -> None:
- want_tuple(t)
- want_sequence(t)
-[builtins fixtures/tuple.pyi]
-[out]
-
-
--- Calling varargs function
--- ------------------------
-
-
-[case testCallingVarArgsFunction]
-
-a = None # type: A
-b = None # type: B
-c = None # type: C
-
-f(c) # E: Argument 1 to "f" has incompatible type "C"; expected "A"
-f(a, b, c) # E: Argument 3 to "f" has incompatible type "C"; expected "A"
-f(g()) # E: "g" does not return a value
-f(a, g()) # E: "g" does not return a value
-f()
-f(a)
-f(b)
-f(a, b, a, b)
-
-def f( *a: 'A') -> None: pass
-
-def g() -> None: pass
-
-class A: pass
-class B(A): pass
-class C: pass
-[builtins fixtures/list.pyi]
-
-[case testCallingVarArgsFunctionWithAlsoNormalArgs]
-
-a = None # type: A
-b = None # type: B
-c = None # type: C
-
-f(a) # E: Argument 1 to "f" has incompatible type "A"; expected "C"
-f(c, c) # E: Argument 2 to "f" has incompatible type "C"; expected "A"
-f(c, a, b, c) # E: Argument 4 to "f" has incompatible type "C"; expected "A"
-f(c)
-f(c, a)
-f(c, b, b, a, b)
-
-def f(a: 'C', *b: 'A') -> None: pass
-
-class A: pass
-class B(A): pass
-class C: pass
-[builtins fixtures/list.pyi]
-
-[case testCallingVarArgsFunctionWithDefaultArgs]
-
-a = None # type: A
-b = None # type: B
-c = None # type: C
-
-f(a) # E: Argument 1 to "f" has incompatible type "A"; expected "C"
-f(c, c) # E: Argument 2 to "f" has incompatible type "C"; expected "A"
-f(c, a, b, c) # E: Argument 4 to "f" has incompatible type "C"; expected "A"
-f()
-f(c)
-f(c, a)
-f(c, b, b, a, b)
-
-def f(a: 'C' = None, *b: 'A') -> None:
- pass
-
-class A: pass
-class B(A): pass
-class C: pass
-[builtins fixtures/list.pyi]
-
-[case testCallVarargsFunctionWithIterable]
-from typing import Iterable
-it1 = None # type: Iterable[int]
-it2 = None # type: Iterable[str]
-def f(*x: int) -> None: pass
-f(*it1)
-f(*it2) # E: Argument 1 to "f" has incompatible type *Iterable[str]; expected "int"
-[builtins fixtures/for.pyi]
-
-[case testCallVarargsFunctionWithIterableAndPositional]
-# flags: --fast-parser
-from typing import Iterable
-it1 = None # type: Iterable[int]
-def f(*x: int) -> None: pass
-f(*it1, 1, 2)
-f(*it1, 1, *it1, 2)
-f(*it1, '') # E: Argument 2 to "f" has incompatible type "str"; expected "int"
-[builtins fixtures/for.pyi]
-
-[case testCallVarargsFunctionWithTupleAndPositional]
-# flags: --fast-parser
-def f(*x: int) -> None: pass
-it1 = (1, 2)
-f(*it1, 1, 2)
-f(*it1, 1, *it1, 2)
-f(*it1, '') # E: Argument 2 to "f" has incompatible type "str"; expected "int"
-[builtins fixtures/for.pyi]
-
-
--- Calling varargs function + type inference
--- -----------------------------------------
-
-
-[case testTypeInferenceWithCalleeVarArgs]
-from typing import TypeVar
-T = TypeVar('T')
-a = None # type: A
-b = None # type: B
-c = None # type: C
-o = None # type: object
-
-a = f(o) # E: Incompatible types in assignment (expression has type "object", variable has type "A")
-b = f(b, a) # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-b = f(a, b) # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-
-o = f()
-a = f(a)
-a = f(b)
-a = f(a, b, a)
-o = f(a, b, o)
-c = f(c)
-
-def f( *a: T) -> T:
- pass
-
-class A: pass
-class B(A): pass
-class C: pass
-[builtins fixtures/list.pyi]
-
-[case testTypeInferenceWithCalleeVarArgsAndDefaultArgs]
-from typing import TypeVar
-T = TypeVar('T')
-a = None # type: A
-o = None # type: object
-
-a = f(o) # E: Incompatible types in assignment (expression has type "object", variable has type "A")
-a = f(a, o) # E: Incompatible types in assignment (expression has type "object", variable has type "A")
-a = f(a, a, o) # E: Incompatible types in assignment (expression has type "object", variable has type "A")
-a = f(a, a, a, o) # E: Incompatible types in assignment (expression has type "object", variable has type "A")
-
-a = f(a)
-a = f(a, a)
-a = f(a, a, a)
-
-def f(a: T, b: T = None, *c: T) -> T:
- pass
-
-class A: pass
-[builtins fixtures/list.pyi]
-
-
--- Calling normal function with varargs
--- ------------------------------------
-
-
-[case testCallingWithListVarArgs]
-from typing import List, Any
-aa = None # type: List[A]
-ab = None # type: List[B]
-a = None # type: A
-b = None # type: B
-
-f(*aa) # Fail
-f(a, *ab) # Ok
-f(a, b)
-(Any(f))(*aa) # IDEA: Move to check-dynamic?
-(Any(f))(a, *ab) # IDEA: Move to check-dynamic?
-
-def f(a: 'A', b: 'B') -> None:
- pass
-
-class A: pass
-class B: pass
-[builtins fixtures/list.pyi]
-[out]
-main:7: error: Argument 1 to "f" has incompatible type *List[A]; expected "B"
-
-[case testCallingWithTupleVarArgs]
-
-a = None # type: A
-b = None # type: B
-c = None # type: C
-cc = None # type: CC
-
-f(*(a, b, b)) # E: Argument 1 to "f" has incompatible type *"Tuple[A, B, B]"; expected "C"
-f(*(b, b, c)) # E: Argument 1 to "f" has incompatible type *"Tuple[B, B, C]"; expected "A"
-f(a, *(b, b)) # E: Argument 2 to "f" has incompatible type *"Tuple[B, B]"; expected "C"
-f(b, *(b, c)) # E: Argument 1 to "f" has incompatible type "B"; expected "A"
-f(*(a, b)) # E: Too few arguments for "f"
-f(*(a, b, c, c)) # E: Too many arguments for "f"
-f(a, *(b, c, c)) # E: Too many arguments for "f"
-f(*(a, b, c))
-f(a, *(b, c))
-f(a, b, *(c,))
-f(a, *(b, cc))
-
-def f(a: 'A', b: 'B', c: 'C') -> None: pass
-
-class A: pass
-class B: pass
-class C: pass
-class CC(C): pass
-[builtins fixtures/tuple.pyi]
-
-[case testInvalidVarArg]
-
-a = None # type: A
-
-f(*None)
-f(*a) # E: List or tuple expected as variable arguments
-f(*(a,))
-
-def f(a: 'A') -> None:
- pass
-
-class A: pass
-[builtins fixtures/tuple.pyi]
-
-
--- Calling varargs function with varargs
--- -------------------------------------
-
-
-[case testCallingVarArgsFunctionWithListVarArgs]
-from typing import List
-aa, ab, a, b = None, None, None, None # type: (List[A], List[B], A, B)
-f(*aa) # Fail
-f(a, *aa) # Fail
-f(b, *ab) # Fail
-f(a, a, *ab) # Fail
-f(a, b, *aa) # Fail
-f(b, b, *ab) # Fail
-g(*ab) # Fail
-f(a, *ab)
-f(a, b, *ab)
-f(a, b, b, *ab)
-g(*aa)
-
-def f(a: 'A', *b: 'B') -> None: pass
-def g(a: 'A', *b: 'A') -> None: pass
-class A: pass
-class B: pass
-[builtins fixtures/list.pyi]
-[out]
-main:3: error: Argument 1 to "f" has incompatible type *List[A]; expected "B"
-main:4: error: Argument 2 to "f" has incompatible type *List[A]; expected "B"
-main:5: error: Argument 1 to "f" has incompatible type "B"; expected "A"
-main:6: error: Argument 2 to "f" has incompatible type "A"; expected "B"
-main:7: error: Argument 3 to "f" has incompatible type *List[A]; expected "B"
-main:8: error: Argument 1 to "f" has incompatible type "B"; expected "A"
-main:9: error: Argument 1 to "g" has incompatible type *List[B]; expected "A"
-
-[case testCallingVarArgsFunctionWithTupleVarArgs]
-
-a, b, c, cc = None, None, None, None # type: (A, B, C, CC)
-
-f(*(b, b, b)) # E: Argument 1 to "f" has incompatible type *"Tuple[B, B, B]"; expected "A"
-f(*(a, a, b)) # E: Argument 1 to "f" has incompatible type *"Tuple[A, A, B]"; expected "B"
-f(*(a, b, a)) # E: Argument 1 to "f" has incompatible type *"Tuple[A, B, A]"; expected "B"
-f(a, *(a, b)) # E: Argument 2 to "f" has incompatible type *"Tuple[A, B]"; expected "B"
-f(b, *(b, b)) # E: Argument 1 to "f" has incompatible type "B"; expected "A"
-f(b, b, *(b,)) # E: Argument 1 to "f" has incompatible type "B"; expected "A"
-f(a, a, *(b,)) # E: Argument 2 to "f" has incompatible type "A"; expected "B"
-f(a, b, *(a,)) # E: Argument 3 to "f" has incompatible type *"Tuple[A]"; expected "B"
-f(*()) # E: Too few arguments for "f"
-f(*(a, b, b))
-f(a, *(b, b))
-f(a, b, *(b,))
-
-def f(a: 'A', *b: 'B') -> None:
- pass
-
-class A: pass
-class B: pass
-class C: pass
-class CC(C): pass
-[builtins fixtures/list.pyi]
-
-
--- Varargs special cases
--- ---------------------
-
-
-[case testDynamicVarArg]
-from typing import Any
-d, a = None, None # type: (Any, A)
-f(a, a, *d) # Fail
-f(a, *d) # Fail
-f(*d) # Ok
-
-g(*d)
-g(a, *d)
-g(a, a, *d)
-
-def f(a: 'A') -> None: pass
-def g(a: 'A', *b: 'A') -> None: pass
-class A: pass
-[builtins fixtures/list.pyi]
-[out]
-main:3: error: Too many arguments for "f"
-main:4: error: Too many arguments for "f"
-
-[case testListVarArgsAndSubtyping]
-from typing import List
-aa = None # type: List[A]
-ab = None # type: List[B]
-
-g(*aa) # E: Argument 1 to "g" has incompatible type *List[A]; expected "B"
-f(*aa)
-f(*ab)
-g(*ab)
-
-def f( *a: 'A') -> None:
- pass
-
-def g( *a: 'B') -> None:
- pass
-
-class A: pass
-class B(A): pass
-[builtins fixtures/list.pyi]
-
-[case testCallerVarArgsAndDefaultArgs]
-
-a, b = None, None # type: (A, B)
-f(*()) # Fail
-f(a, *[a]) # Fail
-f(a, b, *[a]) # Fail
-f(*(a, a, b)) # Fail
-f(*(a,))
-f(*(a, b))
-f(*(a, b, b, b))
-f(a, *[])
-f(a, *[b])
-f(a, *[b, b])
-
-def f(a: 'A', b: 'B' = None, *c: 'B') -> None:
- pass
-
-class A: pass
-class B: pass
-[builtins fixtures/list.pyi]
-[out]
-main:3: error: Too few arguments for "f"
-main:4: error: Argument 2 to "f" has incompatible type *List[A]; expected "B"
-main:5: error: Argument 3 to "f" has incompatible type *List[A]; expected "B"
-main:6: error: Argument 1 to "f" has incompatible type *"Tuple[A, A, B]"; expected "B"
-
-[case testVarArgsAfterKeywordArgInCall1]
-def f(x: int, y: str) -> None: pass
-f(x=1, *[2])
-[builtins fixtures/list.pyi]
-[out]
-main:2: error: "f" gets multiple values for keyword argument "x"
-main:2: error: Argument 2 to "f" has incompatible type *List[int]; expected "str"
-
-[case testVarArgsAfterKeywordArgInCall2]
-def f(x: int, y: str) -> None: pass
-f(y='x', *[1])
-[builtins fixtures/list.pyi]
-[out]
-main:2: error: "f" gets multiple values for keyword argument "y"
-main:2: error: Argument 2 to "f" has incompatible type *List[int]; expected "str"
-
-[case testVarArgsAfterKeywordArgInCall3]
-def f(x: int, y: str) -> None: pass
-f(y='x', *(1,))
-[builtins fixtures/list.pyi]
-
-[case testVarArgsAfterKeywordArgInCall4]
-def f(x: int, *, y: str) -> None: pass
-f(y='x', *[1])
-[builtins fixtures/list.pyi]
-
-[case testVarArgsAfterKeywordArgInCall5]
-def f(x: int, *, y: str) -> None: pass
-f(y='x', *(1,))
-[builtins fixtures/list.pyi]
-
-
--- Overloads + varargs
--- -------------------
-
-
-[case testIntersectionTypesAndVarArgs]
-from typing import overload
-a, b = None, None # type: (A, B)
-
-b = f() # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-b = f(a) # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-b = f(a, b) # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-a = f(b) # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-a = f(b, b) # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-b = f(a, *[b]) # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-b = f(*()) # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-b = f(*(a,)) # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-b = f(*(a, b)) # E: Incompatible types in assignment (expression has type "A", variable has type "B")
-a = f(*(b,)) # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-a = f(*(b, b)) # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-a = f(*[b]) # E: Incompatible types in assignment (expression has type "B", variable has type "A")
-
-a = f()
-a = f(a)
-a = f(a, b)
-b = f(b)
-b = f(b, b)
-a = f(a, *[b])
-a = f(*())
-a = f(*(a,))
-a = f(*(a, b))
-b = f(*(b,))
-b = f(*(b, b))
-b = f(*[b])
-
-class A: pass
-class B: pass
-
- at overload
-def f(a: A = None, *b: B) -> A: pass
-
- at overload
-def f(a: B, *b: B) -> B: pass
-[builtins fixtures/list.pyi]
-
-
--- Caller varargs + type inference
--- -------------------------------
-
-
-[case testCallerVarArgsListWithTypeInference]
-from typing import List, TypeVar, Tuple
-S = TypeVar('S')
-T = TypeVar('T')
-a, b, aa = None, None, None # type: (A, B, List[A])
-
-a, b = f(*aa) # Fail
-b, b = f(*aa) # Fail
-a, a = f(b, *aa) # Fail
-b, b = f(b, *aa) # Fail
-b, b = f(b, b, *aa) # Fail
-a, b = f(a, *a) # Fail
-a, b = f(*a) # Fail
-
-a, a = f(*aa)
-b, a = f(b, *aa)
-b, a = f(b, a, *aa)
-
-def f(a: S, *b: T) -> Tuple[S, T]:
- pass
-
-class A: pass
-class B: pass
-[builtins fixtures/list.pyi]
-[out]
-main:6: error: Argument 1 to "f" has incompatible type *List[A]; expected "B"
-main:7: error: Argument 1 to "f" has incompatible type *List[A]; expected "B"
-main:8: error: Argument 1 to "f" has incompatible type "B"; expected "A"
-main:9: error: Argument 2 to "f" has incompatible type *List[A]; expected "B"
-main:10: error: Argument 3 to "f" has incompatible type *List[A]; expected "B"
-main:11: error: List or tuple expected as variable arguments
-main:12: error: List or tuple expected as variable arguments
-
-[case testCallerVarArgsTupleWithTypeInference]
-from typing import TypeVar, Tuple
-S = TypeVar('S')
-T = TypeVar('T')
-a, b = None, None # type: (A, B)
-
-a, a = f(*(a, b)) # E: Argument 1 to "f" has incompatible type *"Tuple[A, B]"; expected "A"
-b, b = f(a, *(b,)) # E: Argument 1 to "f" has incompatible type "A"; expected "B"
-a, a = f(*(a, b)) # E: Argument 1 to "f" has incompatible type *"Tuple[A, B]"; expected "A"
-b, b = f(a, *(b,)) # E: Argument 1 to "f" has incompatible type "A"; expected "B"
-a, b = f(*(a, b, b)) # E: Too many arguments for "f"
-
-a, b = f(*(a, b))
-a, b = f(a, *(b,))
-
-def f(a: S, b: T) -> Tuple[S, T]: pass
-
-class A: pass
-class B: pass
-[builtins fixtures/list.pyi]
-
-[case testCallerVarargsAndComplexTypeInference]
-from typing import List, TypeVar, Generic, Tuple
-T = TypeVar('T')
-S = TypeVar('S')
-a, b = None, None # type: (A, B)
-ao = None # type: List[object]
-aa = None # type: List[A]
-ab = None # type: List[B]
-
-a, aa = G().f(*[a]) # Fail
-aa, a = G().f(*[a]) # Fail
-ab, aa = G().f(*[a]) # Fail
-
-ao, ao = G().f(*[a]) # E: Incompatible types in assignment (expression has type List[None], variable has type List[object])
-aa, aa = G().f(*[a]) # E: Incompatible types in assignment (expression has type List[None], variable has type List[A])
-
-class G(Generic[T]):
- def f(self, *a: S) -> Tuple[List[S], List[T]]:
- pass
-
-class A: pass
-class B: pass
-[builtins fixtures/list.pyi]
-[out]
-main:9: error: Incompatible types in assignment (expression has type List[A], variable has type "A")
-main:9: error: Incompatible types in assignment (expression has type List[None], variable has type List[A])
-main:10: error: Incompatible types in assignment (expression has type List[None], variable has type "A")
-main:11: error: Incompatible types in assignment (expression has type List[None], variable has type List[A])
-main:11: error: Argument 1 to "f" of "G" has incompatible type *List[A]; expected "B"
-
-
--- Comment signatures
--- ------------------
-
-
-[case testVarArgsAndCommentSignature]
-import typing
-def f(*x): # type: (*int) -> None
- pass
-f(1)
-f(1, 2)
-f('') # E: Argument 1 to "f" has incompatible type "str"; expected "int"
-f(1, '') # E: Argument 2 to "f" has incompatible type "str"; expected "int"
-[builtins fixtures/list.pyi]
-
-
--- Subtyping
--- ---------
-
-
-[case testVarArgsFunctionSubtyping]
-from typing import Callable
-x = None # type: Callable[[int], None]
-def f(*x: int) -> None: pass
-def g(*x: str) -> None: pass
-x = f
-x = g # E: Incompatible types in assignment (expression has type Callable[[StarArg(str)], None], variable has type Callable[[int], None])
-[builtins fixtures/list.pyi]
-[out]
-
-
--- Decorated method where self is implied by *args
--- -----------------------------------------------
-
-[case testVarArgsCallableSelf]
-from typing import Callable
-def cm(func) -> Callable[..., None]: pass
-class C:
- @cm
- def foo(self) -> None: pass
-C().foo()
-C().foo(1) # The decorator's return type says this should be okay
diff --git a/test-data/unit/check-warnings.test b/test-data/unit/check-warnings.test
deleted file mode 100644
index ab5f66b..0000000
--- a/test-data/unit/check-warnings.test
+++ /dev/null
@@ -1,132 +0,0 @@
--- Test cases for warning generation.
-
--- Redundant casts
--- ---------------
-
-[case testRedundantCast]
-# flags: --warn-redundant-casts
-from typing import cast
-a = 1
-b = cast(str, a)
-c = cast(int, a)
-[out]
-main:5: note: Redundant cast to "int"
-
-[case testRedundantCastWithIsinstance]
-# flags: --warn-redundant-casts
-from typing import cast, Union
-x = 1 # type: Union[int, str]
-if isinstance(x, str):
- cast(str, x)
-[builtins fixtures/isinstance.pyi]
-[out]
-main:5: note: Redundant cast to "str"
-
-[case testCastToSuperclassNotRedundant]
-# flags: --warn-redundant-casts
-from typing import cast, TypeVar, List
-T = TypeVar('T')
-def add(xs: List[T], ys: List[T]) -> List[T]: pass
-class A: pass
-class B(A): pass
-a = A()
-b = B()
-# Without the cast, the following line would fail to type check.
-c = add([cast(A, b)], [a])
-[builtins fixtures/list.pyi]
-
-
--- Unused 'type: ignore' comments
--- ------------------------------
-
-[case testUnusedTypeIgnore]
-# flags: --warn-unused-ignores
-a = 1
-a = 'a' # type: ignore
-a = 2 # type: ignore # N: unused 'type: ignore' comment
-a = 'b' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
-
-[case testUnusedTypeIgnoreImport]
-# flags: --warn-unused-ignores
-import banana # type: ignore
-import m # type: ignore
-from m import * # type: ignore
-[file m.py]
-pass
-[out]
-main:3: note: unused 'type: ignore' comment
-main:4: note: unused 'type: ignore' comment
-
-
--- No return
--- ---------
-
-[case testNoReturn]
-# flags: --warn-no-return
-def f() -> int:
- pass
-
-def g() -> int:
- if bool():
- return 1
-[builtins fixtures/list.pyi]
-[out]
-main:5: note: Missing return statement
-
-[case testNoReturnWhile]
-# flags: --warn-no-return
-def h() -> int:
- while True:
- if bool():
- return 1
-
-def i() -> int:
- while 1:
- if bool():
- return 1
- if bool():
- break
-
-def j() -> int:
- while 1:
- if bool():
- return 1
- if bool():
- continue
-[builtins fixtures/list.pyi]
-[out]
-main:7: note: Missing return statement
-
-[case testNoReturnExcept]
-# flags: --warn-no-return
-def f() -> int:
- try:
- return 1
- except:
- pass
-def g() -> int:
- try:
- pass
- except:
- return 1
- else:
- return 1
-def h() -> int:
- try:
- pass
- except:
- pass
- else:
- pass
- finally:
- return 1
-[builtins fixtures/exception.pyi]
-[out]
-main:2: note: Missing return statement
-
-[case testNoReturnEmptyBodyWithDocstring]
-def f() -> int:
- """Return the number of peppers."""
- # This might be an @abstractmethod, for example
- pass
-[out]
diff --git a/test-data/unit/cmdline.test b/test-data/unit/cmdline.test
deleted file mode 100644
index 9a17285..0000000
--- a/test-data/unit/cmdline.test
+++ /dev/null
@@ -1,479 +0,0 @@
--- Tests for command line parsing
--- ------------------------------
---
--- The initial line specifies the command line, in the format
---
--- # cmd: mypy <options>
-
-
--- Directories/packages on the command line
--- ----------------------------------------
-
-[case testCmdlinePackage]
-# cmd: mypy pkg
-[file pkg/__init__.py]
-[file pkg/a.py]
-undef
-[file pkg/subpkg/__init__.py]
-[file pkg/subpkg/a.py]
-undef
-import pkg.subpkg.a
-[out]
-pkg/a.py:1: error: Name 'undef' is not defined
-pkg/subpkg/a.py:1: error: Name 'undef' is not defined
-
-[case testCmdlinePackageSlash]
-# cmd: mypy pkg/
-[file pkg/__init__.py]
-[file pkg/a.py]
-undef
-[file pkg/subpkg/__init__.py]
-[file pkg/subpkg/a.py]
-undef
-import pkg.subpkg.a
-[out]
-pkg/a.py:1: error: Name 'undef' is not defined
-pkg/subpkg/a.py:1: error: Name 'undef' is not defined
-
-[case testCmdlineNonPackage]
-# cmd: mypy dir
-[file dir/a.py]
-undef
-[file dir/subdir/a.py]
-undef
-[out]
-dir/a.py:1: error: Name 'undef' is not defined
-
-[case testCmdlineNonPackageSlash]
-# cmd: mypy dir/
-[file dir/a.py]
-undef
-[file dir/subdir/a.py]
-undef
-[out]
-dir/a.py:1: error: Name 'undef' is not defined
-
-[case testCmdlinePackageContainingSubdir]
-# cmd: mypy pkg
-[file pkg/__init__.py]
-[file pkg/a.py]
-undef
-[file pkg/subdir/a.py]
-undef
-[out]
-pkg/a.py:1: error: Name 'undef' is not defined
-
-[case testCmdlineNonPackageContainingPackage]
-# cmd: mypy dir
-[file dir/a.py]
-undef
-import subpkg.a
-[file dir/subpkg/__init__.py]
-[file dir/subpkg/a.py]
-undef
-[out]
-dir/subpkg/a.py:1: error: Name 'undef' is not defined
-dir/a.py:1: error: Name 'undef' is not defined
-
-[case testBadFileEncoding]
-# cmd: mypy a.py
-[file a.py]
-# coding: uft-8
-[out]
-mypy: can't decode file 'a.py': unknown encoding: uft-8
-
-[case testCannotIgnoreDuplicateModule]
-# cmd: mypy one/mod/__init__.py two/mod/__init__.py
-[file one/mod/__init__.py]
-# type: ignore
-[file two/mod/__init__.py]
-# type: ignore
-[out]
-two/mod/__init__.py: error: Duplicate module named 'mod'
-
-[case testFlagsFile]
-# cmd: mypy @flagsfile
-[file flagsfile]
--2
-main.py
-[file main.py]
-def f():
- try:
- 1/0
- except ZeroDivisionError, err:
- print err
-
-[case testConfigFile]
-# cmd: mypy main.py
-[file mypy.ini]
-[[mypy]
-python_version = 2.7
-[file main.py]
-def f():
- try:
- 1/0
- except ZeroDivisionError, err:
- print err
-
-[case testAltConfigFile]
-# cmd: mypy --config-file config.ini main.py
-[file config.ini]
-[[mypy]
-python_version = 2.7
-[file main.py]
-def f():
- try:
- 1/0
- except ZeroDivisionError, err:
- print err
-
-[case testPerFileConfigSection]
-# cmd: mypy x.py y.py z.py
-[file mypy.ini]
-[[mypy]
-hide_error_context = True
-disallow_untyped_defs = True
-[[mypy-y*]
-disallow_untyped_defs = False
-[[mypy-z*]
-disallow_untyped_calls = True
-[file x.py]
-def f(a):
- pass
-def g(a: int) -> int:
- return f(a)
-[file y.py]
-def f(a):
- pass
-def g(a: int) -> int:
- return f(a)
-[file z.py]
-def f(a):
- pass
-def g(a: int) -> int:
- return f(a)
-[out]
-z.py:1: error: Function is missing a type annotation
-z.py:4: error: Call to untyped function "f" in typed context
-x.py:1: error: Function is missing a type annotation
-
-[case testPerFileConfigSectionMultipleMatches]
-# cmd: mypy xx.py xy.py yx.py yy.py
-[file mypy.ini]
-[[mypy]
-hide_error_context = True
-[[mypy-*x*]
-disallow_untyped_defs = True
-[[mypy-*y*]
-disallow_untyped_calls = True
-[file xx.py]
-def f(a): pass
-def g(a: int) -> int: return f(a)
-[file xy.py]
-def f(a): pass
-def g(a: int) -> int: return f(a)
-[file yx.py]
-def f(a): pass
-def g(a: int) -> int: return f(a)
-[file yy.py]
-def f(a): pass
-def g(a: int) -> int: return f(a)
-[out]
-yy.py:2: error: Call to untyped function "f" in typed context
-yx.py:1: error: Function is missing a type annotation
-yx.py:2: error: Call to untyped function "f" in typed context
-xy.py:1: error: Function is missing a type annotation
-xy.py:2: error: Call to untyped function "f" in typed context
-xx.py:1: error: Function is missing a type annotation
-
-[case testMultipleGlobConfigSection]
-# cmd: mypy x.py y.py z.py
-[file mypy.ini]
-[[mypy]
-hide_error_context = True
-[[mypy-x*,z*]
-disallow_untyped_defs = True
-[file x.py]
-def f(a): pass
-[file y.py]
-def f(a): pass
-[file z.py]
-def f(a): pass
-[out]
-z.py:1: error: Function is missing a type annotation
-x.py:1: error: Function is missing a type annotation
-
-[case testConfigErrorNoSection]
-# cmd: mypy -c pass
-[file mypy.ini]
-[out]
-mypy.ini: No [mypy] section in config file
-
-[case testConfigErrorUnknownFlag]
-# cmd: mypy -c pass
-[file mypy.ini]
-[[mypy]
-bad = 0
-[out]
-mypy.ini: [mypy]: Unrecognized option: bad = 0
-
-[case testConfigErrorUnknownReport]
-# cmd: mypy -c pass
-[file mypy.ini]
-[[mypy]
-bad_report = .
-[out]
-mypy.ini: [mypy]: Unrecognized report type: bad_report
-
-[case testConfigErrorBadBoolean]
-# cmd: mypy -c pass
-[file mypy.ini]
-[[mypy]
-ignore_missing_imports = nah
-[out]
-mypy.ini: [mypy]: ignore_missing_imports: Not a boolean: nah
-
-[case testConfigErrorNotPerFile]
-# cmd: mypy -c pass
-[file mypy.ini]
-[[mypy]
-[[mypy-*]
-strict_optional = True
-[out]
-mypy.ini: [mypy-*]: Per-module sections should only specify per-module flags (strict_optional)
-
-[case testCoberturaParser]
-# cmd: mypy --cobertura-xml-report build pkg
-[file pkg/__init__.py]
-[file pkg/a.py]
-from typing import Dict
-
-def foo() -> Dict:
- z = {'hello': 'world'}
- return z
-[file pkg/subpkg/__init__.py]
-[file pkg/subpkg/a.py]
-def bar() -> str:
- return 'world'
-def untyped_function():
- return 42
-[outfile build/cobertura.xml]
-<coverage timestamp="$TIMESTAMP" version="$VERSION" line-rate="0.8000" branch-rate="0">
- <sources>
- <source>$PWD</source>
- </sources>
- <packages>
- <package complexity="1.0" name="pkg" branch-rate="0" line-rate="1.0000">
- <classes>
- <class complexity="1.0" filename="pkg/__init__.py" name="__init__.py" branch-rate="0" line-rate="1.0">
- <methods/>
- <lines/>
- </class>
- <class complexity="1.0" filename="pkg/a.py" name="a.py" branch-rate="0" line-rate="1.0000">
- <methods/>
- <lines>
- <line branch="true" hits="1" number="3" precision="imprecise" condition-coverage="50% (1/2)"/>
- <line branch="false" hits="1" number="4" precision="precise"/>
- <line branch="false" hits="1" number="5" precision="precise"/>
- </lines>
- </class>
- </classes>
- </package>
- <package complexity="1.0" name="pkg.subpkg" branch-rate="0" line-rate="0.5000">
- <classes>
- <class complexity="1.0" filename="pkg/subpkg/__init__.py" name="__init__.py" branch-rate="0" line-rate="1.0">
- <methods/>
- <lines/>
- </class>
- <class complexity="1.0" filename="pkg/subpkg/a.py" name="a.py" branch-rate="0" line-rate="0.5000">
- <methods/>
- <lines>
- <line branch="false" hits="1" number="1" precision="precise"/>
- <line branch="false" hits="0" number="3" precision="any"/>
- </lines>
- </class>
- </classes>
- </package>
- </packages>
-</coverage>
-
-[case testConfigMypyPath]
-# cmd: mypy file.py
-[file mypy.ini]
-[[mypy]
-mypy_path =
- foo:bar
- , baz
-[file foo/foo.pyi]
-def foo(x: int) -> str: ...
-[file bar/bar.pyi]
-def bar(x: str) -> list: ...
-[file baz/baz.pyi]
-def baz(x: list) -> dict: ...
-[file file.py]
-import no_stubs
-from foo import foo
-from bar import bar
-from baz import baz
-baz(bar(foo(42)))
-baz(bar(foo('oof')))
-[out]
-file.py:1: error: Cannot find module named 'no_stubs'
-file.py:1: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-file.py:6: error: Argument 1 to "foo" has incompatible type "str"; expected "int"
-
-[case testIgnoreErrorsConfig]
-# cmd: mypy x.py y.py
-[file mypy.ini]
-[[mypy]
-[[mypy-x]
-ignore_errors = True
-[file x.py]
-"" + 0
-[file y.py]
-"" + 0
-[out]
-y.py:1: error: Unsupported operand types for + ("str" and "int")
-
-[case testConfigFollowImportsNormal]
-# cmd: mypy main.py
-[file main.py]
-from a import x
-x + 0
-x + '' # E
-import a
-a.x + 0
-a.x + '' # E
-a.y # E
-a + 0 # E
-[file mypy.ini]
-[[mypy]
-follow_imports = normal
-[file a.py]
-x = 0
-x += '' # Error reported here
-[out]
-a.py:2: error: Unsupported operand types for + ("int" and "str")
-main.py:3: error: Unsupported operand types for + ("int" and "str")
-main.py:6: error: Unsupported operand types for + ("int" and "str")
-main.py:7: error: "module" has no attribute "y"
-main.py:8: error: Unsupported operand types for + ("module" and "int")
-
-[case testConfigFollowImportsSilent]
-# cmd: mypy main.py
-[file main.py]
-from a import x
-x + ''
-import a
-a.x + ''
-a.y
-a + 0
-[file mypy.ini]
-[[mypy]
-follow_imports = silent
-[file a.py]
-x = 0
-x += '' # No error reported
-[out]
-main.py:2: error: Unsupported operand types for + ("int" and "str")
-main.py:4: error: Unsupported operand types for + ("int" and "str")
-main.py:5: error: "module" has no attribute "y"
-main.py:6: error: Unsupported operand types for + ("module" and "int")
-
-[case testConfigFollowImportsSkip]
-# cmd: mypy main.py
-[file main.py]
-from a import x
-reveal_type(x) # Expect Any
-import a
-reveal_type(a.x) # Expect Any
-[file mypy.ini]
-[[mypy]
-follow_imports = skip
-[file a.py]
-/ # No error reported
-[out]
-main.py:2: error: Revealed type is 'Any'
-main.py:4: error: Revealed type is 'Any'
-
-[case testConfigFollowImportsError]
-# cmd: mypy main.py
-[file main.py]
-from a import x
-reveal_type(x) # Expect Any
-import a # Error reported here
-reveal_type(a.x) # Expect Any
-[file mypy.ini]
-[[mypy]
-follow_imports = error
-[file a.py]
-/ # No error reported
-[out]
-main.py:1: note: Import of 'a' ignored
-main.py:1: note: (Using --follow-imports=error, module not passed on command line)
-main.py:2: error: Revealed type is 'Any'
-main.py:4: error: Revealed type is 'Any'
-
-[case testConfigFollowImportsSelective]
-# cmd: mypy main.py
-[file mypy.ini]
-[[mypy]
-[[mypy-normal]
-follow_imports = normal
-[[mypy-silent]
-follow_imports = silent
-[[mypy-skip]
-follow_imports = skip
-[[mypy-error]
-follow_imports = error
-[file main.py]
-import normal
-import silent
-import skip
-import error
-reveal_type(normal.x)
-reveal_type(silent.x)
-reveal_type(skip)
-reveal_type(error)
-[file normal.py]
-x = 0
-x += ''
-[file silent.py]
-x = 0
-x += ''
-[file skip.py]
-bla bla
-[file error.py]
-bla bla
-[out]
-main.py:4: note: Import of 'error' ignored
-main.py:4: note: (Using --follow-imports=error, module not passed on command line)
-normal.py:2: error: Unsupported operand types for + ("int" and "str")
-main.py:5: error: Revealed type is 'builtins.int'
-main.py:6: error: Revealed type is 'builtins.int'
-main.py:7: error: Revealed type is 'Any'
-main.py:8: error: Revealed type is 'Any'
-
-[case testConfigSilentMissingImportsOff]
-# cmd: mypy main.py
-[file main.py]
-import missing # Expect error here
-reveal_type(missing.x) # Expect Any
-[file mypy.ini]
-[[mypy]
-ignore_missing_imports = False
-[out]
-main.py:1: error: Cannot find module named 'missing'
-main.py:1: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-main.py:2: error: Revealed type is 'Any'
-
-[case testConfigSilentMissingImportsOn]
-# cmd: mypy main.py
-[file main.py]
-import missing # No error here
-reveal_type(missing.x) # Expect Any
-[file mypy.ini]
-[[mypy]
-ignore_missing_imports = True
-[out]
-main.py:2: error: Revealed type is 'Any'
diff --git a/test-data/unit/fixtures/__new__.pyi b/test-data/unit/fixtures/__new__.pyi
deleted file mode 100644
index 4e2cc57..0000000
--- a/test-data/unit/fixtures/__new__.pyi
+++ /dev/null
@@ -1,14 +0,0 @@
-# builtins stub with object.__new__
-
-class object:
- def __init__(self) -> None: pass
-
- def __new__(cls): pass
-
-class type:
- def __init__(self, x) -> None: pass
-
-class int: pass
-class bool: pass
-class str: pass
-class function: pass
diff --git a/test-data/unit/fixtures/alias.pyi b/test-data/unit/fixtures/alias.pyi
deleted file mode 100644
index 5909cb6..0000000
--- a/test-data/unit/fixtures/alias.pyi
+++ /dev/null
@@ -1,12 +0,0 @@
-# Builtins test fixture with a type alias 'bytes'
-
-class object:
- def __init__(self) -> None: pass
-class type:
- def __init__(self, x) -> None: pass
-
-class int: pass
-class str: pass
-class function: pass
-
-bytes = str
diff --git a/test-data/unit/fixtures/args.pyi b/test-data/unit/fixtures/args.pyi
deleted file mode 100644
index e4a6ffe..0000000
--- a/test-data/unit/fixtures/args.pyi
+++ /dev/null
@@ -1,29 +0,0 @@
-# Builtins stub used to support *args, **kwargs.
-
-from typing import TypeVar, Generic, Iterable, Tuple, Dict, Any, overload
-
-Tco = TypeVar('Tco', covariant=True)
-T = TypeVar('T')
-S = TypeVar('S')
-
-class object:
- def __init__(self) -> None: pass
- def __eq__(self, o: object) -> bool: pass
- def __ne__(self, o: object) -> bool: pass
-
-class type:
- @overload
- def __init__(self, o: object) -> None: pass
- @overload
- def __init__(self, name: str, bases: Tuple[type, ...], dict: Dict[str, Any]) -> None: pass
- def __call__(self, *args: Any, **kwargs: Any) -> Any: pass
-
-class tuple(Iterable[Tco], Generic[Tco]): pass
-class dict(Generic[T, S]): pass
-
-class int:
- def __eq__(self, o: object) -> bool: pass
-class str: pass
-class bool: pass
-class function: pass
-class module: pass
diff --git a/test-data/unit/fixtures/async_await.pyi b/test-data/unit/fixtures/async_await.pyi
deleted file mode 100644
index 7a166a0..0000000
--- a/test-data/unit/fixtures/async_await.pyi
+++ /dev/null
@@ -1,9 +0,0 @@
-import typing
-class object:
- def __init__(self): pass
-class type: pass
-class function: pass
-class int: pass
-class str: pass
-class list: pass
-class tuple: pass
diff --git a/test-data/unit/fixtures/bool.pyi b/test-data/unit/fixtures/bool.pyi
deleted file mode 100644
index 8ec3fdd..0000000
--- a/test-data/unit/fixtures/bool.pyi
+++ /dev/null
@@ -1,14 +0,0 @@
-# builtins stub used in boolean-related test cases.
-
-from typing import builtinclass
-
- at builtinclass
-class object:
- def __init__(self) -> None: pass
-
-class type: pass
-class tuple: pass
-class function: pass
-class bool: pass
-class int: pass
-class str: pass
diff --git a/test-data/unit/fixtures/callable.pyi b/test-data/unit/fixtures/callable.pyi
deleted file mode 100644
index ae58648..0000000
--- a/test-data/unit/fixtures/callable.pyi
+++ /dev/null
@@ -1,26 +0,0 @@
-from typing import Generic, Tuple, TypeVar, Union
-
-T = TypeVar('T')
-
-class object:
- def __init__(self) -> None: pass
-
-class type:
- def __init__(self, x) -> None: pass
-
-class tuple(Generic[T]): pass
-
-class function: pass
-
-def isinstance(x: object, t: Union[type, Tuple[type, ...]]) -> bool: pass
-
-def callable(x: object) -> bool: pass
-
-class int:
- def __add__(self, other: 'int') -> 'int': pass
- def __eq__(self, other: 'int') -> 'bool': pass
-class float: pass
-class bool(int): pass
-class str:
- def __add__(self, other: 'str') -> 'str': pass
- def __eq__(self, other: 'str') -> bool: pass
diff --git a/test-data/unit/fixtures/classmethod.pyi b/test-data/unit/fixtures/classmethod.pyi
deleted file mode 100644
index 282839d..0000000
--- a/test-data/unit/fixtures/classmethod.pyi
+++ /dev/null
@@ -1,22 +0,0 @@
-import typing
-
-class object:
- def __init__(self) -> None: pass
-
-class type:
- def __init__(self, x) -> None: pass
- def mro(self) -> typing.Any: pass
-
-class function: pass
-
-# Dummy definitions.
-classmethod = object()
-staticmethod = object()
-
-class int:
- @classmethod
- def from_bytes(cls, bytes: bytes, byteorder: str) -> int: pass
-
-class str: pass
-class bytes: pass
-class bool: pass
diff --git a/test-data/unit/fixtures/complex.pyi b/test-data/unit/fixtures/complex.pyi
deleted file mode 100644
index d4135be..0000000
--- a/test-data/unit/fixtures/complex.pyi
+++ /dev/null
@@ -1,11 +0,0 @@
-# Builtins stub used for some float/complex test cases.
-
-class object:
- def __init__(self): pass
-
-class type: pass
-class function: pass
-class int: pass
-class float: pass
-class complex: pass
-class str: pass
diff --git a/test-data/unit/fixtures/dict.pyi b/test-data/unit/fixtures/dict.pyi
deleted file mode 100644
index 5a78864..0000000
--- a/test-data/unit/fixtures/dict.pyi
+++ /dev/null
@@ -1,34 +0,0 @@
-# Builtins stub used in dictionary-related test cases.
-
-from typing import TypeVar, Generic, Iterable, Iterator, Mapping, Tuple, overload
-
-T = TypeVar('T')
-KT = TypeVar('KT')
-VT = TypeVar('VT')
-
-class object:
- def __init__(self) -> None: pass
-
-class type: pass
-
-class dict(Iterable[KT], Mapping[KT, VT], Generic[KT, VT]):
- @overload
- def __init__(self, **kwargs: VT) -> None: pass
- @overload
- def __init__(self, arg: Iterable[Tuple[KT, VT]], **kwargs: VT) -> None: pass
- def __setitem__(self, k: KT, v: VT) -> None: pass
- def __iter__(self) -> Iterator[KT]: pass
- def update(self, a: Mapping[KT, VT]) -> None: pass
-
-class int: # for convenience
- def __add__(self, x: int) -> int: pass
-
-class str: pass # for keyword argument key type
-
-class list(Iterable[T], Generic[T]): # needed by some test cases
- def __iter__(self) -> Iterator[T]: pass
- def __mul__(self, x: int) -> list[T]: pass
-
-class tuple: pass
-class function: pass
-class float: pass
diff --git a/test-data/unit/fixtures/exception.pyi b/test-data/unit/fixtures/exception.pyi
deleted file mode 100644
index 05015ec..0000000
--- a/test-data/unit/fixtures/exception.pyi
+++ /dev/null
@@ -1,12 +0,0 @@
-
-class object:
- def __init__(self): pass
-
-class type: pass
-class tuple: pass
-class function: pass
-class int: pass
-class str: pass
-class bool: pass
-
-class BaseException: pass
diff --git a/test-data/unit/fixtures/for.pyi b/test-data/unit/fixtures/for.pyi
deleted file mode 100644
index 4762806..0000000
--- a/test-data/unit/fixtures/for.pyi
+++ /dev/null
@@ -1,19 +0,0 @@
-# builtins stub used in for statement test cases
-
-from typing import TypeVar, Generic, Iterable, Iterator, Generator
-from abc import abstractmethod, ABCMeta
-
-t = TypeVar('t')
-
-class object:
- def __init__(self) -> None: pass
-
-class type: pass
-class tuple: pass
-class function: pass
-class bool: pass
-class int: pass # for convenience
-class str: pass # for convenience
-
-class list(Iterable[t], Generic[t]):
- def __iter__(self) -> Iterator[t]: pass
diff --git a/test-data/unit/fixtures/function.pyi b/test-data/unit/fixtures/function.pyi
deleted file mode 100644
index 768ca90..0000000
--- a/test-data/unit/fixtures/function.pyi
+++ /dev/null
@@ -1,10 +0,0 @@
-from typing import builtinclass
-
- at builtinclass
-class object:
- def __init__(self): pass
-
-class type: pass
-class function: pass
-class int: pass
-class str: pass
diff --git a/test-data/unit/fixtures/isinstance.pyi b/test-data/unit/fixtures/isinstance.pyi
deleted file mode 100644
index c155a97..0000000
--- a/test-data/unit/fixtures/isinstance.pyi
+++ /dev/null
@@ -1,22 +0,0 @@
-from typing import builtinclass, Tuple, TypeVar, Generic, Union
-
-T = TypeVar('T')
-
-class object:
- def __init__(self) -> None: pass
-
-class type:
- def __init__(self, x) -> None: pass
-
-class tuple(Generic[T]): pass
-
-class function: pass
-
-def isinstance(x: object, t: Union[type, Tuple[type, ...]]) -> bool: pass
-
-class int:
- def __add__(self, other: 'int') -> 'int': pass
-class float: pass
-class bool(int): pass
-class str:
- def __add__(self, other: 'str') -> 'str': pass
diff --git a/test-data/unit/fixtures/isinstancelist.pyi b/test-data/unit/fixtures/isinstancelist.pyi
deleted file mode 100644
index 4b35698..0000000
--- a/test-data/unit/fixtures/isinstancelist.pyi
+++ /dev/null
@@ -1,44 +0,0 @@
-from typing import builtinclass, Iterable, Iterator, Generic, TypeVar, List, Mapping, overload, Tuple
-
- at builtinclass
-class object:
- def __init__(self) -> None: pass
-
- at builtinclass
-class type:
- def __init__(self, x) -> None: pass
-
-class tuple: pass
-class function: pass
-
-def isinstance(x: object, t: type) -> bool: pass
-
- at builtinclass
-class int:
- def __add__(self, x: int) -> int: pass
- at builtinclass
-class bool(int): pass
- at builtinclass
-class str:
- def __add__(self, x: str) -> str: pass
- def __getitem__(self, x: int) -> str: pass
-
-T = TypeVar('T')
-KT = TypeVar('KT')
-VT = TypeVar('VT')
-
-class list(Iterable[T], Generic[T]):
- def __iter__(self) -> Iterator[T]: pass
- def __mul__(self, x: int) -> list[T]: pass
- def __setitem__(self, x: int, v: T) -> None: pass
- def __getitem__(self, x: int) -> T: pass
- def __add__(self, x: List[T]) -> T: pass
-
-class dict(Iterable[KT], Mapping[KT, VT], Generic[KT, VT]):
- @overload
- def __init__(self, **kwargs: VT) -> None: pass
- @overload
- def __init__(self, arg: Iterable[Tuple[KT, VT]], **kwargs: VT) -> None: pass
- def __setitem__(self, k: KT, v: VT) -> None: pass
- def __iter__(self) -> Iterator[KT]: pass
- def update(self, a: Mapping[KT, VT]) -> None: pass
diff --git a/test-data/unit/fixtures/list.pyi b/test-data/unit/fixtures/list.pyi
deleted file mode 100644
index 9413cf7..0000000
--- a/test-data/unit/fixtures/list.pyi
+++ /dev/null
@@ -1,30 +0,0 @@
-# Builtins stub used in list-related test cases.
-
-from typing import TypeVar, Generic, builtinclass, Iterable, Iterator, overload
-
-T = TypeVar('T')
-
- at builtinclass
-class object:
- def __init__(self): pass
-
-class type: pass
-class ellipsis: pass
-
-class list(Iterable[T], Generic[T]):
- @overload
- def __init__(self) -> None: pass
- @overload
- def __init__(self, x: Iterable[T]) -> None: pass
- def __iter__(self) -> Iterator[T]: pass
- def __add__(self, x: list[T]) -> list[T]: pass
- def __mul__(self, x: int) -> list[T]: pass
- def __getitem__(self, x: int) -> T: pass
- def append(self, x: T) -> None: pass
- def extend(self, x: Iterable[T]) -> None: pass
-
-class tuple: pass
-class function: pass
-class int: pass
-class str: pass
-class bool: pass
diff --git a/test-data/unit/fixtures/module.pyi b/test-data/unit/fixtures/module.pyi
deleted file mode 100644
index fb2a4c2..0000000
--- a/test-data/unit/fixtures/module.pyi
+++ /dev/null
@@ -1,18 +0,0 @@
-from typing import Any, Dict, Generic, TypeVar
-
-T = TypeVar('T')
-S = TypeVar('S')
-
-class object:
- def __init__(self) -> None: pass
-class module:
- __name__ = ... # type: str
- __file__ = ... # type: str
- __dict__ = ... # type: Dict[str, Any]
-class type: pass
-class function: pass
-class int: pass
-class str: pass
-class bool: pass
-class tuple: pass
-class dict(Generic[T, S]): pass
diff --git a/test-data/unit/fixtures/module_all.pyi b/test-data/unit/fixtures/module_all.pyi
deleted file mode 100644
index cc1b552..0000000
--- a/test-data/unit/fixtures/module_all.pyi
+++ /dev/null
@@ -1,15 +0,0 @@
-from typing import Generic, Sequence, TypeVar
-_T = TypeVar('_T')
-
-class object:
- def __init__(self) -> None: pass
-class module: pass
-class type: pass
-class function: pass
-class int: pass
-class str: pass
-class list(Generic[_T], Sequence[_T]):
- def append(self, x: _T): pass
- def extend(self, x: Sequence[_T]): pass
- def __add__(self, rhs: Sequence[_T]) -> list[_T]: pass
-class tuple: pass
diff --git a/test-data/unit/fixtures/module_all_python2.pyi b/test-data/unit/fixtures/module_all_python2.pyi
deleted file mode 100644
index ed17d4d..0000000
--- a/test-data/unit/fixtures/module_all_python2.pyi
+++ /dev/null
@@ -1,16 +0,0 @@
-from typing import Generic, Sequence, TypeVar
-_T = TypeVar('_T')
-
-class object:
- def __init__(self) -> None: pass
-class module: pass
-class type: pass
-class function: pass
-class int: pass
-class str: pass
-class unicode: pass
-class list(Generic[_T], Sequence[_T]):
- def append(self, x: _T): pass
- def extend(self, x: Sequence[_T]): pass
- def __add__(self, rhs: Sequence[_T]) -> list[_T]: pass
-class tuple: pass
diff --git a/test-data/unit/fixtures/ops.pyi b/test-data/unit/fixtures/ops.pyi
deleted file mode 100644
index a647ff1..0000000
--- a/test-data/unit/fixtures/ops.pyi
+++ /dev/null
@@ -1,56 +0,0 @@
-from typing import builtinclass, overload, Any, Generic, Sequence, Tuple, TypeVar
-
-Tco = TypeVar('Tco', covariant=True)
-
-# This is an extension of transform builtins with additional operations.
-
- at builtinclass
-class object:
- def __init__(self) -> None: pass
- def __eq__(self, o: 'object') -> 'bool': pass
- def __ne__(self, o: 'object') -> 'bool': pass
-
-class type: pass
-
-class slice: pass
-
-class tuple(Sequence[Tco], Generic[Tco]):
- def __getitem__(self, x: int) -> Tco: pass
- def __eq__(self, x: object) -> bool: pass
- def __ne__(self, x: object) -> bool: pass
- def __lt__(self, x: 'tuple') -> bool: pass
- def __le__(self, x: 'tuple') -> bool: pass
- def __gt__(self, x: 'tuple') -> bool: pass
- def __ge__(self, x: 'tuple') -> bool: pass
-
-class function: pass
-
-class bool: pass
-
-class str:
- def __init__(self, x: 'int') -> None: pass
- def __add__(self, x: 'str') -> 'str': pass
- def startswith(self, x: 'str') -> bool: pass
-
-class int:
- def __add__(self, x: 'int') -> 'int': pass
- def __sub__(self, x: 'int') -> 'int': pass
- def __mul__(self, x: 'int') -> 'int': pass
- def __mod__(self, x: 'int') -> 'int': pass
- def __floordiv__(self, x: 'int') -> 'int': pass
- def __pos__(self) -> 'int': pass
- def __neg__(self) -> 'int': pass
- def __eq__(self, x: object) -> bool: pass
- def __ne__(self, x: object) -> bool: pass
- def __lt__(self, x: 'int') -> bool: pass
- def __le__(self, x: 'int') -> bool: pass
- def __gt__(self, x: 'int') -> bool: pass
- def __ge__(self, x: 'int') -> bool: pass
-
-class float: pass
-
-class BaseException: pass
-
-def __print(a1=None, a2=None, a3=None, a4=None): pass
-
-class module: pass
diff --git a/test-data/unit/fixtures/primitives.pyi b/test-data/unit/fixtures/primitives.pyi
deleted file mode 100644
index b6ec4d4..0000000
--- a/test-data/unit/fixtures/primitives.pyi
+++ /dev/null
@@ -1,17 +0,0 @@
-# builtins stub with non-generic primitive types
-
-class object:
- def __init__(self) -> None: pass
-
-class type:
- def __init__(self, x) -> None: pass
-
-class int: pass
-class float: pass
-class complex: pass
-class bool: pass
-class str: pass
-class bytes: pass
-class bytearray: pass
-class tuple: pass
-class function: pass
diff --git a/test-data/unit/fixtures/property.pyi b/test-data/unit/fixtures/property.pyi
deleted file mode 100644
index b2e747b..0000000
--- a/test-data/unit/fixtures/property.pyi
+++ /dev/null
@@ -1,17 +0,0 @@
-import typing
-
-class object:
- def __init__(self) -> None: pass
-
-class type:
- def __init__(self, x) -> None: pass
-
-class function: pass
-
-property = object() # Dummy definition.
-
-class int: pass
-class str: pass
-class bytes: pass
-class tuple: pass
-class bool: pass
diff --git a/test-data/unit/fixtures/python2.pyi b/test-data/unit/fixtures/python2.pyi
deleted file mode 100644
index 61e48be..0000000
--- a/test-data/unit/fixtures/python2.pyi
+++ /dev/null
@@ -1,18 +0,0 @@
-from typing import Generic, Iterable, TypeVar
-
-class object:
- def __init__(self) -> None: pass
-
-class type:
- def __init__(self, x) -> None: pass
-
-class function: pass
-
-class int: pass
-class str: pass
-class unicode: pass
-
-T = TypeVar('T')
-class list(Iterable[T], Generic[T]): pass
-
-# Definition of None is implicit
diff --git a/test-data/unit/fixtures/set.pyi b/test-data/unit/fixtures/set.pyi
deleted file mode 100644
index cb8bbcf..0000000
--- a/test-data/unit/fixtures/set.pyi
+++ /dev/null
@@ -1,21 +0,0 @@
-# Builtins stub used in set-related test cases.
-
-from typing import TypeVar, Generic, Iterator, Iterable, Set
-
-T = TypeVar('T')
-
-class object:
- def __init__(self) -> None: pass
-
-class type: pass
-class tuple: pass
-class function: pass
-
-class int: pass
-class str: pass
-
-class set(Iterable[T], Generic[T]):
- def __iter__(self) -> Iterator[T]: pass
- def add(self, x: T) -> None: pass
- def discard(self, x: T) -> None: pass
- def update(self, x: Set[T]) -> None: pass
diff --git a/test-data/unit/fixtures/slice.pyi b/test-data/unit/fixtures/slice.pyi
deleted file mode 100644
index c01ffbb..0000000
--- a/test-data/unit/fixtures/slice.pyi
+++ /dev/null
@@ -1,13 +0,0 @@
-# Builtins stub used in slicing test cases.
-
-class object:
- def __init__(self): pass
-
-class type: pass
-class tuple: pass
-class function: pass
-
-class int: pass
-class str: pass
-
-class slice: pass
diff --git a/test-data/unit/fixtures/staticmethod.pyi b/test-data/unit/fixtures/staticmethod.pyi
deleted file mode 100644
index 139acee..0000000
--- a/test-data/unit/fixtures/staticmethod.pyi
+++ /dev/null
@@ -1,18 +0,0 @@
-import typing
-
-class object:
- def __init__(self) -> None: pass
-
-class type:
- def __init__(self, x) -> None: pass
-
-class function: pass
-
-staticmethod = object() # Dummy definition.
-
-class int:
- @staticmethod
- def from_bytes(bytes: bytes, byteorder: str) -> int: pass
-
-class str: pass
-class bytes: pass
diff --git a/test-data/unit/fixtures/transform.pyi b/test-data/unit/fixtures/transform.pyi
deleted file mode 100644
index afdc2bf..0000000
--- a/test-data/unit/fixtures/transform.pyi
+++ /dev/null
@@ -1,30 +0,0 @@
-# Builtins stubs used implicitly in program transformation test cases.
-
-class object:
- def __init__(self) -> None: pass
-
-class type: pass
-
-# str is handy for debugging; allows outputting messages.
-class str: pass
-
-# Primitive types int/float have special coercion behaviour (they may have
-# a different representation from ordinary values).
-
-class int: pass
-
-class float: pass
-
-
-# The functions below are special functions used in test cases; their
-# implementations are actually in the __dynchk module, but they are defined
-# here so that the semantic analyzer and the type checker are happy without
-# having to analyze the entire __dynchk module all the time.
-#
-# The transformation implementation has special case handling for these
-# functions; it's a bit ugly but it works for now.
-
-def __print(a1=None, a2=None, a3=None, a4=None):
- # Do not use *args since this would require list and break many test
- # cases.
- pass
diff --git a/test-data/unit/fixtures/tuple-simple.pyi b/test-data/unit/fixtures/tuple-simple.pyi
deleted file mode 100644
index b195dfa..0000000
--- a/test-data/unit/fixtures/tuple-simple.pyi
+++ /dev/null
@@ -1,20 +0,0 @@
-# Builtins stub used in some tuple-related test cases.
-#
-# This is a simpler version of tuple.py which is useful
-# and makes some test cases easier to write/debug.
-
-from typing import Iterable, TypeVar, Generic
-
-T = TypeVar('T')
-
-class object:
- def __init__(self): pass
-
-class type: pass
-class tuple(Generic[T]):
- def __getitem__(self, x: int) -> T: pass
-class function: pass
-
-# We need int for indexing tuples.
-class int: pass
-class str: pass # For convenience
diff --git a/test-data/unit/fixtures/tuple.pyi b/test-data/unit/fixtures/tuple.pyi
deleted file mode 100644
index 6fe63b6..0000000
--- a/test-data/unit/fixtures/tuple.pyi
+++ /dev/null
@@ -1,28 +0,0 @@
-# Builtins stub used in tuple-related test cases.
-
-from typing import Iterable, Iterator, TypeVar, Generic, Sequence
-
-Tco = TypeVar('Tco', covariant=True)
-
-class object:
- def __init__(self): pass
-
-class type:
- def __init__(self, *a) -> None: pass
- def __call__(self, *a) -> object: pass
-class tuple(Sequence[Tco], Generic[Tco]):
- def __iter__(self) -> Iterator[Tco]: pass
- def __getitem__(self, x: int) -> Tco: pass
-class function: pass
-
-# We need int for indexing tuples.
-class int: pass
-class bool: pass
-class str: pass # For convenience
-
-T = TypeVar('T')
-
-class list(Sequence[T], Generic[T]): pass
-def isinstance(x: object, t: type) -> bool: pass
-
-def sum(iterable: Iterable[T], start: T = None) -> T: pass
diff --git a/test-data/unit/fixtures/union.pyi b/test-data/unit/fixtures/union.pyi
deleted file mode 100644
index 78a41f9..0000000
--- a/test-data/unit/fixtures/union.pyi
+++ /dev/null
@@ -1,18 +0,0 @@
-# Builtins stub used in tuple-related test cases.
-
-from isinstance import isinstance
-from typing import Iterable, TypeVar
-
-class object:
- def __init__(self): pass
-
-class type: pass
-class function: pass
-
-# Current tuple types get special treatment in the type checker, thus there
-# is no need for type arguments here.
-class tuple: pass
-
-# We need int for indexing tuples.
-class int: pass
-class str: pass # For convenience
diff --git a/test-data/unit/lib-stub/__builtin__.pyi b/test-data/unit/lib-stub/__builtin__.pyi
deleted file mode 100644
index eec6228..0000000
--- a/test-data/unit/lib-stub/__builtin__.pyi
+++ /dev/null
@@ -1,27 +0,0 @@
-class Any: pass
-
-class object:
- def __init__(self):
- # type: () -> None
- pass
-
-class type:
- def __init__(self, x):
- # type: (Any) -> None
- pass
-
-# These are provided here for convenience.
-class int: pass
-class float: pass
-
-class str: pass
-class unicode: pass
-
-class tuple: pass
-class function: pass
-
-class ellipsis: pass
-
-def print(*args, end=''): pass
-
-# Definition of None is implicit
diff --git a/test-data/unit/lib-stub/abc.pyi b/test-data/unit/lib-stub/abc.pyi
deleted file mode 100644
index 4afe734..0000000
--- a/test-data/unit/lib-stub/abc.pyi
+++ /dev/null
@@ -1,3 +0,0 @@
-class ABCMeta: pass
-abstractmethod = object()
-abstractproperty = object()
diff --git a/test-data/unit/lib-stub/builtins.pyi b/test-data/unit/lib-stub/builtins.pyi
deleted file mode 100644
index 9a636bf..0000000
--- a/test-data/unit/lib-stub/builtins.pyi
+++ /dev/null
@@ -1,23 +0,0 @@
-class Any: pass
-
-class object:
- def __init__(self) -> None: pass
-
-class type:
- def __init__(self, x: Any) -> None: pass
-
-# These are provided here for convenience.
-class int:
- def __add__(self, other: 'int') -> 'int': pass
-class float: pass
-
-class str:
- def __add__(self, other: 'str') -> 'str': pass
-class bytes: pass
-
-class tuple: pass
-class function: pass
-
-class ellipsis: pass
-
-# Definition of None is implicit
diff --git a/test-data/unit/lib-stub/collections.pyi b/test-data/unit/lib-stub/collections.pyi
deleted file mode 100644
index 00b7cea..0000000
--- a/test-data/unit/lib-stub/collections.pyi
+++ /dev/null
@@ -1,3 +0,0 @@
-import typing
-
-namedtuple = object()
diff --git a/test-data/unit/lib-stub/mypy_extensions.pyi b/test-data/unit/lib-stub/mypy_extensions.pyi
deleted file mode 100644
index 2bfc072..0000000
--- a/test-data/unit/lib-stub/mypy_extensions.pyi
+++ /dev/null
@@ -1,6 +0,0 @@
-from typing import Dict, Type, TypeVar
-
-T = TypeVar('T')
-
-
-def TypedDict(typename: str, fields: Dict[str, Type[T]]) -> Type[dict]: pass
diff --git a/test-data/unit/lib-stub/sys.pyi b/test-data/unit/lib-stub/sys.pyi
deleted file mode 100644
index 3959cb0..0000000
--- a/test-data/unit/lib-stub/sys.pyi
+++ /dev/null
@@ -1,2 +0,0 @@
-version_info = (0, 0, 0, '', 0)
-platform = ''
diff --git a/test-data/unit/lib-stub/types.pyi b/test-data/unit/lib-stub/types.pyi
deleted file mode 100644
index aa0a19f..0000000
--- a/test-data/unit/lib-stub/types.pyi
+++ /dev/null
@@ -1,4 +0,0 @@
-from typing import TypeVar
-T = TypeVar('T')
-def coroutine(func: T) -> T:
- return func
diff --git a/test-data/unit/lib-stub/typing.pyi b/test-data/unit/lib-stub/typing.pyi
deleted file mode 100644
index 77a7b34..0000000
--- a/test-data/unit/lib-stub/typing.pyi
+++ /dev/null
@@ -1,90 +0,0 @@
-# Stub for typing module. Many of the definitions have special handling in
-# the type checker, so they can just be initialized to anything.
-
-from abc import abstractmethod
-
-cast = 0
-overload = 0
-Any = 0
-Union = 0
-Optional = 0
-TypeVar = 0
-Generic = 0
-Tuple = 0
-Callable = 0
-builtinclass = 0
-_promote = 0
-NamedTuple = 0
-Type = 0
-no_type_check = 0
-
-# Type aliases.
-List = 0
-Dict = 0
-Set = 0
-
-T = TypeVar('T')
-U = TypeVar('U')
-V = TypeVar('V')
-S = TypeVar('S')
-
-class Container(Generic[T]):
- @abstractmethod
- # Use int because bool isn't in the default test builtins
- def __contains__(self, arg: T) -> int: pass
-
-class Sized:
- @abstractmethod
- def __len__(self) -> int: pass
-
-class Iterable(Generic[T]):
- @abstractmethod
- def __iter__(self) -> 'Iterator[T]': pass
-
-class Iterator(Iterable[T], Generic[T]):
- @abstractmethod
- def __next__(self) -> T: pass
-
-class Generator(Iterator[T], Generic[T, U, V]):
- @abstractmethod
- def send(self, value: U) -> T: pass
-
- @abstractmethod
- def throw(self, typ: Any, val: Any=None, tb=None) -> None: pass
-
- @abstractmethod
- def close(self) -> None: pass
-
- @abstractmethod
- def __iter__(self) -> 'Generator[T, U, V]': pass
-
-class Awaitable(Generic[T]):
- @abstractmethod
- def __await__(self) -> Generator[Any, Any, T]: pass
-
-class AwaitableGenerator(Generator[T, U, V], Awaitable[V], Generic[T, U, V, S]):
- pass
-
-class AsyncIterable(Generic[T]):
- @abstractmethod
- def __aiter__(self) -> 'AsyncIterator[T]': pass
-
-class AsyncIterator(AsyncIterable[T], Generic[T]):
- def __aiter__(self) -> 'AsyncIterator[T]': return self
- @abstractmethod
- def __anext__(self) -> Awaitable[T]: pass
-
-class Sequence(Iterable[T], Generic[T]):
- @abstractmethod
- def __getitem__(self, n: Any) -> T: pass
-
-class Mapping(Generic[T, U]): pass
-
-class MutableMapping(Generic[T, U]): pass
-
-def NewType(name: str, tp: Type[T]) -> Callable[[T], T]:
- def new_type(x):
- return x
- return new_type
-
-TYPE_CHECKING = 1
diff --git a/test-data/unit/parse-errors.test b/test-data/unit/parse-errors.test
deleted file mode 100644
index f2251a9..0000000
--- a/test-data/unit/parse-errors.test
+++ /dev/null
@@ -1,496 +0,0 @@
--- Test cases for parser errors. Each test case consists of two sections.
--- The first section contains [case NAME] followed by the input code, while
--- the second section contains [out] followed by the output from the parser.
---
--- The input file name in errors is "file".
---
--- Comments starting with "--" in this file will be ignored, except for lines
--- starting with "----" that are not ignored. The first two dashes of these
--- lines are interpreted as escapes and removed.
-
-[case testInvalidFunction]
-def f()
- pass
-[out]
-file:1: error: Parse error before end of line
-file:2: error: Inconsistent indentation
-
-[case testMissingIndent]
-if x:
-1
-[out]
-file:2: error: Expected an indented block
-
-[case testUnexpectedIndent]
-1
- 2
-[out]
-file:2: error: Inconsistent indentation
-
-[case testInconsistentIndent]
-if x:
- 1
- 1
-[out]
-file:3: error: Inconsistent indentation
-
-[case testInconsistentIndent]
-if x:
- 1
- 1
-[out]
-file:3: error: Inconsistent indentation
-
-[case testInvalidBinaryOp]
-1>
-a*
-a+1*
-[out]
-file:1: error: Parse error before end of line
-file:2: error: Parse error before end of line
-file:3: error: Parse error before end of line
-
-[case testDoubleStar]
-**a
-[out]
-file:1: error: Parse error before **
-
-[case testInvalidSuperClass]
-class A(C[):
- pass
-[out]
-file:1: error: Parse error before )
-file:2: error: Parse error before end of file
-
-[case testMissingSuperClass]
-class A(:
- pass
-[out]
-file:1: error: Parse error before :
-file:2: error: Parse error before end of file
-
-[case testUnexpectedEof]
-if 1:
-[out]
-file:1: error: Expected an indented block
-
-[case testInvalidKeywordArguments1]
-f(x=y, z)
-[out]
-file:1: error: Parse error before "z"
-
-[case testInvalidKeywordArguments2]
-f(**x, y=z)
-[out]
-file:1: error: Parse error before "y"
-
-[case testInvalidKeywordArguments3]
-f(**x, y)
-[out]
-file:1: error: Parse error before "y"
-
-[case testInvalidVarArgs]
-f(*x, y)
-[out]
-file:1: error: Parse error before "y"
-
-[case testInvalidBareAsteriskAndVarArgs2]
-def f(*x: A, *) -> None: pass
-[out]
-file:1: error: Parse error before )
-file:1: error: Parse error before end of line
-
-[case testInvalidBareAsteriskAndVarArgs3]
-def f(*, *x: A) -> None: pass
-[out]
-file:1: error: Parse error before *
-file:1: error: Parse error before end of line
-
-[case testInvalidBareAsteriskAndVarArgs4]
-def f(*, **x: A) -> None: pass
-[out]
-file:1: error: Parse error before **
-file:1: error: Parse error before end of line
-
-[case testInvalidBareAsterisk1]
-def f(*) -> None: pass
-[out]
-file:1: error: Parse error before )
-file:1: error: Parse error before end of line
-
-[case testInvalidBareAsterisk2]
-def f(x, *) -> None: pass
-[out]
-file:1: error: Parse error before )
-file:1: error: Parse error before end of line
-
-[case testInvalidFuncDefArgs1]
-def f(x = y, x): pass
-[out]
-file:1: error: Invalid argument list
-
-[case testInvalidFuncDefArgs3]
-def f(**x, y):
- pass
-[out]
-file:1: error: Invalid argument list
-
-[case testInvalidFuncDefArgs4]
-def f(**x, y=x):
- pass
-[out]
-file:1: error: Invalid argument list
-
-[case testInvalidStringLiteralType]
-def f(x:
- 'A['
- ) -> None: pass
-[out]
-file:2: error: Parse error before end of line
-file:3: error: Parse error before end of line
-
-[case testInvalidStringLiteralType2]
-def f(x:
- 'A B'
- ) -> None: pass
-[out]
-file:2: error: Parse error before "B"
-file:3: error: Parse error before end of line
-
-[case testInvalidTypeComment]
-0
-x = 0 # type: A A
-[out]
-file:2: error: Parse error before "A"
-
-[case testInvalidTypeComment2]
-0
-x = 0 # type: A[
-[out]
-file:2: error: Parse error before end of line
-
-[case testInvalidTypeComment3]
-0
-x = 0 # type:
-[out]
-file:2: error: Empty type annotation
-
-[case testInvalidTypeComment4]
-0
-x = 0 # type: *
-[out]
-file:2: error: Parse error before end of line
-
-[case testInvalidMultilineLiteralType]
-def f() -> "A\nB": pass
-[out]
-file:1: error: Parse error before end of line
-
-[case testInvalidMetaclass]
-class A(metaclass=1): pass
-[out]
-file:1: error: Parse error before numeric literal
-file:1: error: Parse error before end of file
-
-[case testInvalidSignatureInComment1]
-def f(): # type: x
- pass
-[out]
-file:1: error: Parse error before "x"
-
-[case testInvalidSignatureInComment2]
-def f(): # type:
- pass
-[out]
-file:1: error: Empty type annotation
-
-[case testInvalidSignatureInComment3]
-def f(): # type: (
- pass
-[out]
-file:1: error: Parse error before end of line
-
-[case testInvalidSignatureInComment4]
-def f(): # type: (.
- pass
-[out]
-file:1: error: Parse error before .
-
-[case testInvalidSignatureInComment5]
-def f(): # type: (x
- pass
-[out]
-file:1: error: Parse error before end of line
-
-[case testInvalidSignatureInComment6]
-def f(): # type: (x)
- pass
-[out]
-file:1: error: Parse error before end of line
-
-[case testInvalidSignatureInComment7]
-def f(): # type: (x) -
- pass
-[out]
-file:1: error: Parse error before -
-
-[case testInvalidSignatureInComment8]
-def f(): # type: (x) ->
- pass
-[out]
-file:1: error: Parse error before end of line
-
-[case testInvalidSignatureInComment9]
-def f(): # type: (x) -> .
- pass
-[out]
-file:1: error: Parse error before .
-
-[case testInvalidSignatureInComment10]
-def f(): # type: (x) -> x x
- pass
-[out]
-file:1: error: Parse error before "x"
-
-[case testDuplicateSignatures1]
-def f() -> None: # type: () -> None
- pass
-def f(): # type: () -> None
- pass
-[out]
-file:1: error: Function has duplicate type signatures
-
-[case testDuplicateSignatures2]
-def f(x, y: Z): # type: (x, y) -> z
- pass
-[out]
-file:1: error: Function has duplicate type signatures
-
-[case testTooManyTypes]
-def f(x, y): # type: (X, Y, Z) -> z
- pass
-[out]
-file:1: error: Type signature has too many arguments
-
-[case testTooFewTypes]
-def f(x, y): # type: (X) -> z
- pass
-[out]
-file:1: error: Type signature has too few arguments
-
-[case testCommentFunctionAnnotationVarArgMispatch]
-def f(x): # type: (*X) -> Y
- pass
-def g(*x): # type: (X) -> Y
- pass
-[out]
-file:1: error: Inconsistent use of '*' in function signature
-file:3: error: Inconsistent use of '*' in function signature
-
-[case testCommentFunctionAnnotationVarArgMispatch2]
-def f(*x, **y): # type: (**X, *Y) -> Z
- pass
-def g(*x, **y): # type: (*X, *Y) -> Z
- pass
-[out]
-file:1: error: Inconsistent use of '*' in function signature
-file:1: error: Inconsistent use of '**' in function signature
-file:3: error: Inconsistent use of '*' in function signature
-file:3: error: Inconsistent use of '**' in function signature
-
-[case testPrintStatementInPython3]
-print 1
-[out]
-file:1: error: Parse error before numeric literal
-
-[case testInvalidConditionInConditionalExpression]
-1 if 2, 3 else 4
-[out]
-file:1: error: Parse error before ,
-
-[case testInvalidConditionInConditionalExpression2]
-1 if x for y in z else 4
-[out]
-file:1: error: Parse error before "for"
-
-[case testInvalidConditionInConditionalExpression2]
-1 if x else for y in z
-[out]
-file:1: error: Parse error before "for"
-
-[case testYieldFromNotRightParameter]
-def f():
- yield from
-[out]
-file:2: error: Parse error before end of line
-
-[case testYieldFromAfterReturn]
-def f():
- return yield from h()
-[out]
-file:2: error: Parse error before "yield"
-
-[case testImportDotModule]
-import .x
-[out]
-file:1: error: Parse error before .
-
-[case testImportDot]
-import .
-[out]
-file:1: error: Parse error before .
-
-[case testInvalidFunctionName]
-def while(): pass
-[out]
-file:1: error: Parse error before "while"
-file:1: error: Parse error before end of line
-
-[case testInvalidEllipsis1]
-...0
-..._
-...a
-[out]
-file:1: error: Parse error before numeric literal
-file:2: error: Parse error before "_"
-file:3: error: Parse error before "a"
-
-[case testBlockStatementInSingleLineIf]
-if 1: if 2: pass
-[out]
-file:1: error: Parse error before "if"
-
-[case testBlockStatementInSingleLineIf2]
-if 1: while 2: pass
-[out]
-file:1: error: Parse error before "while"
-
-[case testBlockStatementInSingleLineIf3]
-if 1: for x in y: pass
-[out]
-file:1: error: Parse error before "for"
-
-[case testUnexpectedEllipsis]
-a = a...
-[out]
-file:1: error: Parse error before ...
-
-[case testFromFutureImportStar]
-from __future__ import *
-x = 1
-[out]
-file:1: error: Parse error before *
-
-[case testParseErrorBeforeUnicodeLiteral]
-x u'y'
-[out]
-file:1: error: Parse error before string literal
-
-[case testParseErrorInExtendedSlicing]
-x[:,
-[out]
-file:1: error: Parse error before end of line
-
-[case testParseErrorInExtendedSlicing2]
-x[:,::
-[out]
-file:1: error: Parse error before end of line
-
-[case testParseErrorInExtendedSlicing3]
-x[:,:
-[out]
-file:1: error: Parse error before end of line
-
-[case testPython2OctalIntLiteralInPython3]
-0377
-[out]
-file:1: error: Invalid numeric literal
-
-[case testInvalidEncoding]
-# foo
-# coding: uft-8
-[out]
-file:2: error: Unknown encoding 'uft-8'
-
-[case testInvalidEncoding2]
-# coding=Uft.8
-[out]
-file:1: error: Unknown encoding 'Uft.8'
-
-[case testInvalidEncoding3]
-#!/usr/bin python
-# vim: set fileencoding=uft8 :
-[out]
-file:2: error: Unknown encoding 'uft8'
-
-[case testDoubleEncoding]
-# coding: uft8
-# coding: utf8
-# The first coding cookie should be used and fail.
-[out]
-file:1: error: Unknown encoding 'uft8'
-
-[case testDoubleEncoding2]
-# Again the first cookie should be used and fail.
-# coding: uft8
-# coding: utf8
-[out]
-file:2: error: Unknown encoding 'uft8'
-
-[case testDoubleEncoding3]
-# If the third line were interpreted as a coding cookie, we'd get a
-# different error message.
-# coding: ascii
-á = 1
-[out]
-file:4: error: Unrecognized character
-
-[case testDoubleEncoding4]
-
-
-# coding: ascii
-á = 1
-[out]
-file:4: error: Unrecognized character
-
-[case testLongLiteralInPython3]
-2L
-0x2L
-[out]
-file:1: error: Invalid numeric literal
-file:2: error: Invalid numeric literal
-
-[case testPython2LegacyInequalityInPython3]
-1 <> 2
-[out]
-file:1: error: Parse error before >
-
-[case testLambdaInListComprehensionInPython3]
-([ 0 for x in 1, 2 if 3 ])
-[out]
-file:1: error: Parse error before ,
-
-[case testTupleArgListInPython3]
-def f(x, (y, z)): pass
-[out]
-file:1: error: Tuples in argument lists only supported in Python 2 mode
-
-[case testBackquoteInPython3]
-`1 + 2`
-[out]
-file:1: error: Unrecognized character `
-
-[case testSmartQuotes]
-foo = ‘bar’
-[out]
-file:1: error: Unrecognized character
-
-[case testExceptCommaInPython3]
-try:
- pass
-except KeyError, IndexError:
- pass
-[out]
-file:3: error: Parse error before ,
-file:3: error: Parse error before :
-file:4: error: Inconsistent indentation
diff --git a/test-data/unit/parse-python2.test b/test-data/unit/parse-python2.test
deleted file mode 100644
index 7d4931e..0000000
--- a/test-data/unit/parse-python2.test
+++ /dev/null
@@ -1,399 +0,0 @@
--- Test cases for parser -- Python 2 syntax.
---
--- See parse.test for a description of this file format.
-
-[case testEmptyFile]
-[out]
-MypyFile:1()
-
-[case testStringLiterals]
-'bar'
-u'foo'
-ur'foo'
-u'''bar'''
-b'foo'
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- StrExpr(bar))
- ExpressionStmt:2(
- UnicodeExpr(foo))
- ExpressionStmt:3(
- UnicodeExpr(foo))
- ExpressionStmt:4(
- UnicodeExpr(bar))
- ExpressionStmt:5(
- StrExpr(foo)))
-
-[case testSimplePrint]
-print 1
-print 2, 3
-print (4, 5)
-[out]
-MypyFile:1(
- PrintStmt:1(
- IntExpr(1)
- Newline)
- PrintStmt:2(
- IntExpr(2)
- IntExpr(3)
- Newline)
- PrintStmt:3(
- TupleExpr:3(
- IntExpr(4)
- IntExpr(5))
- Newline))
-
-[case testPrintWithNoArgs]
-print
-[out]
-MypyFile:1(
- PrintStmt:1(
- Newline))
-
-[case testPrintWithTarget]
-print >>foo
-[out]
-MypyFile:1(
- PrintStmt:1(
- Target(
- NameExpr(foo))
- Newline))
-
-[case testPrintWithTargetAndArgs]
-print >>foo, x
-[out]
-MypyFile:1(
- PrintStmt:1(
- NameExpr(x)
- Target(
- NameExpr(foo))
- Newline))
-
-[case testPrintWithTargetAndArgsAndTrailingComma]
-print >>foo, x, y,
-[out]
-MypyFile:1(
- PrintStmt:1(
- NameExpr(x)
- NameExpr(y)
- Target(
- NameExpr(foo))))
-
-[case testSimpleWithTrailingComma]
-print 1,
-print 2, 3,
-print (4, 5),
-[out]
-MypyFile:1(
- PrintStmt:1(
- IntExpr(1))
- PrintStmt:2(
- IntExpr(2)
- IntExpr(3))
- PrintStmt:3(
- TupleExpr:3(
- IntExpr(4)
- IntExpr(5))))
-
-[case testOctalIntLiteral]
-00
-01
-0377
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- IntExpr(0))
- ExpressionStmt:2(
- IntExpr(1))
- ExpressionStmt:3(
- IntExpr(255)))
-
-[case testLongLiteral]
-0L
-123L
-012L
-0x123l
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- IntExpr(0))
- ExpressionStmt:2(
- IntExpr(123))
- ExpressionStmt:3(
- IntExpr(10))
- ExpressionStmt:4(
- IntExpr(291)))
-
-[case testTryExceptWithComma]
-try:
- x
-except Exception, e:
- y
-[out]
-MypyFile:1(
- TryStmt:1(
- Block:1(
- ExpressionStmt:2(
- NameExpr(x)))
- NameExpr(Exception)
- NameExpr(e)
- Block:3(
- ExpressionStmt:4(
- NameExpr(y)))))
-
-[case testTryExceptWithNestedComma]
-try:
- x
-except (KeyError, IndexError):
- y
-[out]
-MypyFile:1(
- TryStmt:1(
- Block:1(
- ExpressionStmt:2(
- NameExpr(x)))
- TupleExpr:3(
- NameExpr(KeyError)
- NameExpr(IndexError))
- Block:3(
- ExpressionStmt:4(
- NameExpr(y)))))
-
-[case testExecStatement]
-exec a
-[out]
-MypyFile:1(
- ExecStmt:1(
- NameExpr(a)))
-
-[case testExecStatementWithIn]
-exec a in globals()
-[out]
-MypyFile:1(
- ExecStmt:1(
- NameExpr(a)
- CallExpr:1(
- NameExpr(globals)
- Args())))
-
-[case testExecStatementWithInAnd2Expressions]
-exec a in x, y
-[out]
-MypyFile:1(
- ExecStmt:1(
- NameExpr(a)
- NameExpr(x)
- NameExpr(y)))
-
-[case testEllipsisInExpression_python2]
-x = ... # E: Parse error before ...
-[out]
-
-[case testStrLiteralConcatenationWithMixedLiteralTypes]
-u'foo' 'bar'
-'bar' u'foo'
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- UnicodeExpr(foobar))
- ExpressionStmt:2(
- UnicodeExpr(barfoo)))
-
-[case testLegacyInequality]
-1 <> 2
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- ComparisonExpr:1(
- !=
- IntExpr(1)
- IntExpr(2))))
-
-[case testLambdaInListComprehensionInPython2]
-([ 0 for x in 1, 2 if 3 ])
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- ListComprehension:1(
- GeneratorExpr:1(
- IntExpr(0)
- NameExpr(x)
- TupleExpr:1(
- IntExpr(1)
- IntExpr(2))
- IntExpr(3)))))
-
-[case testTupleArgListInPython2]
-def f(x, (y, z)): pass
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Args(
- Var(x)
- Var(__tuple_arg_2))
- Block:1(
- AssignmentStmt:1(
- TupleExpr:1(
- NameExpr(y)
- NameExpr(z))
- NameExpr(__tuple_arg_2))
- PassStmt:1())))
-
-[case testTupleArgListWithTwoTupleArgsInPython2]
-def f((x, y), (z, zz)): pass
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Args(
- Var(__tuple_arg_1)
- Var(__tuple_arg_2))
- Block:1(
- AssignmentStmt:1(
- TupleExpr:1(
- NameExpr(x)
- NameExpr(y))
- NameExpr(__tuple_arg_1))
- AssignmentStmt:1(
- TupleExpr:1(
- NameExpr(z)
- NameExpr(zz))
- NameExpr(__tuple_arg_2))
- PassStmt:1())))
-
-[case testTupleArgListWithInitializerInPython2]
-def f((y, z) = (1, 2)): pass
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Args(
- Var(__tuple_arg_1))
- Init(
- AssignmentStmt:1(
- NameExpr(__tuple_arg_1)
- TupleExpr:1(
- IntExpr(1)
- IntExpr(2))))
- Block:1(
- AssignmentStmt:1(
- TupleExpr:1(
- NameExpr(y)
- NameExpr(z))
- NameExpr(__tuple_arg_1))
- PassStmt:1())))
-
-[case testLambdaTupleArgListInPython2]
-lambda (x, y): z
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- FuncExpr:1(
- Args(
- Var(__tuple_arg_1))
- Block:1(
- AssignmentStmt:1(
- TupleExpr:1(
- NameExpr(x)
- NameExpr(y))
- NameExpr(__tuple_arg_1))
- ReturnStmt:1(
- NameExpr(z))))))
-
-[case testLambdaSingletonTupleArgListInPython2]
-lambda (x,): z
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- FuncExpr:1(
- Args(
- Var(__tuple_arg_1))
- Block:1(
- AssignmentStmt:1(
- TupleExpr:1(
- NameExpr(x))
- NameExpr(__tuple_arg_1))
- ReturnStmt:1(
- NameExpr(z))))))
-
-[case testLambdaNoTupleArgListInPython2]
-lambda (x): z
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- FuncExpr:1(
- Args(
- Var(x))
- Block:1(
- ReturnStmt:1(
- NameExpr(z))))))
-
-[case testInvalidExprInTupleArgListInPython2_1]
-def f(x, ()): pass
-[out]
-main: error: Empty tuple not valid as an argument
-
-[case testInvalidExprInTupleArgListInPython2_2]
-def f(x, (y, x[1])): pass
-[out]
-main:1: error: Invalid item in tuple argument
-
-[case testListLiteralAsTupleArgInPython2]
-def f(x, [x]): pass
-[out]
-main:1: error: Parse error before [
-main:1: error: Parse error before end of line
-
-[case testTupleArgAfterStarArgInPython2]
-def f(*a, (b, c)): pass
-[out]
-main:1: error: Invalid argument list
-
-[case testTupleArgAfterStarStarArgInPython2]
-def f(*a, (b, c)): pass
-[out]
-main:1: error: Invalid argument list
-
-[case testParenthesizedArgumentInPython2]
-def f(x, (y)): pass
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Args(
- Var(x)
- Var(y))
- Block:1(
- PassStmt:1())))
-
-[case testDuplicateNameInTupleArgList_python2]
-def f(a, (a, b)):
- pass
-def g((x, (x, y))):
- pass
-[out]
-main:1: error: Duplicate argument name "a"
-main:3: error: Duplicate argument name "x"
-
-[case testBackquotesInPython2]
-`1 + 2`
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- BackquoteExpr:1(
- OpExpr:1(
- +
- IntExpr(1)
- IntExpr(2)))))
-
-[case testBackquoteSpecialCasesInPython2]
-`1, 2`
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- BackquoteExpr:1(
- TupleExpr:1(
- IntExpr(1)
- IntExpr(2)))))
diff --git a/test-data/unit/parse.test b/test-data/unit/parse.test
deleted file mode 100644
index 0dec0f3..0000000
--- a/test-data/unit/parse.test
+++ /dev/null
@@ -1,3401 +0,0 @@
--- Test cases for parser. Each test case consists of two sections.
--- The first section contains [case NAME] followed by the input code, while
--- the second section contains [out] followed by the output from the parser.
---
--- Lines starting with "--" in this file will be ignored, except for lines
--- starting with "----" that are not ignored. The first two dashes of these
--- lines are interpreted as escapes and removed.
-
-[case testEmptyFile]
-[out]
-MypyFile:1()
-
-[case testExpressionStatement]
-1
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- IntExpr(1)))
-
-[case testAssignment]
-x = 1
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(x)
- IntExpr(1)))
-
-[case testExpressionBasics]
-x = f(1, None)
-123 * (2 + x)
-"hello".lower()
--1.23
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(x)
- CallExpr:1(
- NameExpr(f)
- Args(
- IntExpr(1)
- NameExpr(None))))
- ExpressionStmt:2(
- OpExpr:2(
- *
- IntExpr(123)
- OpExpr:2(
- +
- IntExpr(2)
- NameExpr(x))))
- ExpressionStmt:3(
- CallExpr:3(
- MemberExpr:3(
- StrExpr(hello)
- lower)
- Args()))
- ExpressionStmt:4(
- UnaryExpr:4(
- -
- FloatExpr(1.23))))
-
-[case testSingleQuotedStr]
-''
-'foo'
-'foo\
-bar'
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- StrExpr())
- ExpressionStmt:2(
- StrExpr(foo))
- ExpressionStmt:3(
- StrExpr(foobar)))
-
-[case testDoubleQuotedStr]
-""
-"foo"
-"foo\
-bar"
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- StrExpr())
- ExpressionStmt:2(
- StrExpr(foo))
- ExpressionStmt:3(
- StrExpr(foobar)))
-
-[case testTripleQuotedStr]
-''''''
-'''foo'''
-'''foo\
-bar'''
-'''\nfoo
-bar'''
-'''fo''bar'''
-""""""
-"""foo"""
-"""foo\
-bar"""
-"""\nfoo
-bar"""
-"""fo""bar"""
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- StrExpr())
- ExpressionStmt:2(
- StrExpr(foo))
- ExpressionStmt:3(
- StrExpr(foobar))
- ExpressionStmt:4(
- StrExpr(\nfoo\u000abar))
- ExpressionStmt:6(
- StrExpr(fo''bar))
- ExpressionStmt:7(
- StrExpr())
- ExpressionStmt:8(
- StrExpr(foo))
- ExpressionStmt:9(
- StrExpr(foobar))
- ExpressionStmt:10(
- StrExpr(\nfoo\u000abar))
- ExpressionStmt:12(
- StrExpr(fo""bar)))
-
-[case testRawStr]
-r'x\n\''
-r"x\n\""
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- StrExpr(x\n'))
- ExpressionStmt:2(
- StrExpr(x\n")))
---" fix syntax highlight
-
-[case testBytes]
-b'foo'
-b"foo\
-bar"
-br'x\n\''
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- BytesExpr(foo))
- ExpressionStmt:2(
- BytesExpr(foobar))
- ExpressionStmt:3(
- BytesExpr(x\n')))
-
-[case testEscapesInStrings]
-'\r\n\t\x2f\u123f'
-b'\r\n\t\x2f\u123f'
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- StrExpr(\u000d\u000a\u0009/\u123f))
- ExpressionStmt:2(
- BytesExpr(\u000d\u000a\u0009/\\u123f)))
--- Note \\u in the b'...' case (\u sequence not translated)
-
-[case testEscapedQuote]
-'\''
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- StrExpr(')))
---'
-
-[case testOctalEscapes]
-'\0\1\177\1234'
-b'\1\476'
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- StrExpr(\u0000\u0001\u007fS4))
- ExpressionStmt:2(
- BytesExpr(\u0001\u013e)))
-
-[case testUnicodeLiteralInPython3]
-u'foo'
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- StrExpr(foo)))
-
-[case testArrays]
-a = []
-a = [1, 2]
-a[[1]] = a[2]
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(a)
- ListExpr:1())
- AssignmentStmt:2(
- NameExpr(a)
- ListExpr:2(
- IntExpr(1)
- IntExpr(2)))
- AssignmentStmt:3(
- IndexExpr:3(
- NameExpr(a)
- ListExpr:3(
- IntExpr(1)))
- IndexExpr:3(
- NameExpr(a)
- IntExpr(2))))
-
-[case testTuples]
-()
-(1,)
-(1, foo)
-a, b = 1, (2, 3)
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- TupleExpr:1())
- ExpressionStmt:2(
- TupleExpr:2(
- IntExpr(1)))
- ExpressionStmt:3(
- TupleExpr:3(
- IntExpr(1)
- NameExpr(foo)))
- AssignmentStmt:4(
- TupleExpr:4(
- NameExpr(a)
- NameExpr(b))
- TupleExpr:4(
- IntExpr(1)
- TupleExpr:4(
- IntExpr(2)
- IntExpr(3)))))
-
-[case testSimpleFunction]
-def main():
- 1
-[out]
-MypyFile:1(
- FuncDef:1(
- main
- Block:1(
- ExpressionStmt:2(
- IntExpr(1)))))
-
-[case testPass]
-def f():
- pass
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Block:1(
- PassStmt:2())))
-
-[case testIf]
-if 1:
- 2
-[out]
-MypyFile:1(
- IfStmt:1(
- If(
- IntExpr(1))
- Then(
- ExpressionStmt:2(
- IntExpr(2)))))
-
-[case testIfElse]
-if 1:
- 2
-else:
- 3
-[out]
-MypyFile:1(
- IfStmt:1(
- If(
- IntExpr(1))
- Then(
- ExpressionStmt:2(
- IntExpr(2)))
- Else(
- ExpressionStmt:4(
- IntExpr(3)))))
-
-[case testIfElif]
-if 1:
- 2
-elif 3:
- 4
-elif 5:
- 6
-else:
- 7
-[out]
-MypyFile:1(
- IfStmt:1(
- If(
- IntExpr(1))
- Then(
- ExpressionStmt:2(
- IntExpr(2)))
- If(
- IntExpr(3))
- Then(
- ExpressionStmt:4(
- IntExpr(4)))
- If(
- IntExpr(5))
- Then(
- ExpressionStmt:6(
- IntExpr(6)))
- Else(
- ExpressionStmt:8(
- IntExpr(7)))))
-
-[case testWhile]
-while 1:
- pass
-[out]
-MypyFile:1(
- WhileStmt:1(
- IntExpr(1)
- Block:1(
- PassStmt:2())))
-
-[case testReturn]
-def f():
- return 1
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Block:1(
- ReturnStmt:2(
- IntExpr(1)))))
-
-
-[case testReturnWithoutValue]
-def f():
- return
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Block:1(
- ReturnStmt:2())))
-
-[case testBreak]
-while 1:
- break
-[out]
-MypyFile:1(
- WhileStmt:1(
- IntExpr(1)
- Block:1(
- BreakStmt:2())))
-
-[case testLargeBlock]
-if 1:
- x = 1
- while 2:
- pass
- y = 2
-[out]
-MypyFile:1(
- IfStmt:1(
- If(
- IntExpr(1))
- Then(
- AssignmentStmt:2(
- NameExpr(x)
- IntExpr(1))
- WhileStmt:3(
- IntExpr(2)
- Block:3(
- PassStmt:4()))
- AssignmentStmt:5(
- NameExpr(y)
- IntExpr(2)))))
-
-[case testSimpleClass]
-class A:
- def f(self):
- pass
-[out]
-MypyFile:1(
- ClassDef:1(
- A
- FuncDef:2(
- f
- Args(
- Var(self))
- Block:2(
- PassStmt:3()))))
-
-[case testGlobalVarWithType]
-x = 0 # type: int
-y = False # type: bool
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(x)
- IntExpr(0)
- int?)
- AssignmentStmt:2(
- NameExpr(y)
- NameExpr(False)
- bool?))
-
-[case testLocalVarWithType]
-def f():
- x = 0 # type: int
- y = False # type: bool
- a = None # type: Any
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Block:1(
- AssignmentStmt:2(
- NameExpr(x)
- IntExpr(0)
- int?)
- AssignmentStmt:3(
- NameExpr(y)
- NameExpr(False)
- bool?)
- AssignmentStmt:4(
- NameExpr(a)
- NameExpr(None)
- Any?))))
-
-[case testLocalVarWithTypeOnNextLine]
-x = 0
- # type: int
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(x)
- IntExpr(0)
- int?))
-
-[case testFunctionDefWithType]
-def f(y: str) -> int:
- return
-class A:
- def f(self, a: int, b: Any) -> x:
- pass
- def g(self) -> Any:
- pass
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Args(
- Var(y))
- def (y: str?) -> int?
- Block:1(
- ReturnStmt:2()))
- ClassDef:3(
- A
- FuncDef:4(
- f
- Args(
- Var(self)
- Var(a)
- Var(b))
- def (self: Any, a: int?, b: Any?) -> x?
- Block:4(
- PassStmt:5()))
- FuncDef:6(
- g
- Args(
- Var(self))
- def (self: Any) -> Any?
- Block:6(
- PassStmt:7()))))
-
-[case testFuncWithNoneReturn]
-def f() -> None:
- pass
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- def () -> None?
- Block:1(
- PassStmt:2())))
-
-[case testVarDefWithGenericType]
-x = None # type: List[str]
-y = None # type: Dict[int, Any]
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(x)
- NameExpr(None)
- List?[str?])
- AssignmentStmt:2(
- NameExpr(y)
- NameExpr(None)
- Dict?[int?, Any?]))
-
-[case testSignatureWithGenericTypes]
-def f(y: t[Any, x]) -> a[b[c], d]:
- pass
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Args(
- Var(y))
- def (y: t?[Any?, x?]) -> a?[b?[c?], d?]
- Block:1(
- PassStmt:2())))
-
-[case testParsingExpressionsWithLessAndGreaterThan]
-# The operators < > can sometimes be confused with generic types.
-x = a < b > c
-f(x < b, y > c)
-a < b > 1
-x < b, y > 2
-(a < b > c)
-[out]
-MypyFile:1(
- AssignmentStmt:2(
- NameExpr(x)
- ComparisonExpr:2(
- <
- >
- NameExpr(a)
- NameExpr(b)
- NameExpr(c)))
- ExpressionStmt:3(
- CallExpr:3(
- NameExpr(f)
- Args(
- ComparisonExpr:3(
- <
- NameExpr(x)
- NameExpr(b))
- ComparisonExpr:3(
- >
- NameExpr(y)
- NameExpr(c)))))
- ExpressionStmt:4(
- ComparisonExpr:4(
- <
- >
- NameExpr(a)
- NameExpr(b)
- IntExpr(1)))
- ExpressionStmt:5(
- TupleExpr:5(
- ComparisonExpr:5(
- <
- NameExpr(x)
- NameExpr(b))
- ComparisonExpr:5(
- >
- NameExpr(y)
- IntExpr(2))))
- ExpressionStmt:6(
- ComparisonExpr:6(
- <
- >
- NameExpr(a)
- NameExpr(b)
- NameExpr(c))))
-
-[case testLineContinuation]
-if (1 +
- 2):
- pass
-[out]
-MypyFile:1(
- IfStmt:1(
- If(
- OpExpr:1(
- +
- IntExpr(1)
- IntExpr(2)))
- Then(
- PassStmt:3())))
-
-[case testMultipleVarDef]
-x, y = z # type: int, a[c]
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- TupleExpr:1(
- NameExpr(x)
- NameExpr(y))
- NameExpr(z)
- Tuple[int?, a?[c?]]))
-
-[case testMultipleVarDef2]
-(xx, z, i) = 1 # type: (a[c], Any, int)
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- TupleExpr:1(
- NameExpr(xx)
- NameExpr(z)
- NameExpr(i))
- IntExpr(1)
- Tuple[a?[c?], Any?, int?]))
-
-[case testMultipleVarDef3]
-(xx, (z, i)) = 1 # type: (a[c], (Any, int))
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- TupleExpr:1(
- NameExpr(xx)
- TupleExpr:1(
- NameExpr(z)
- NameExpr(i)))
- IntExpr(1)
- Tuple[a?[c?], Tuple[Any?, int?]]))
-
-[case testAnnotateAssignmentViaSelf]
-class A:
- def __init__(self):
- self.x = 1 # type: int
-[out]
-MypyFile:1(
- ClassDef:1(
- A
- FuncDef:2(
- __init__
- Args(
- Var(self))
- Block:2(
- AssignmentStmt:3(
- MemberExpr:3(
- NameExpr(self)
- x)
- IntExpr(1)
- int?)))))
-
-[case testCommentAfterTypeComment]
-x = 0 # type: int # bar!
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(x)
- IntExpr(0)
- int?))
-
-[case testMultilineAssignmentAndAnnotations]
-(x,
- y) = (1,
- 2) # type: foo, bar
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- TupleExpr:1(
- NameExpr(x)
- NameExpr(y))
- TupleExpr:2(
- IntExpr(1)
- IntExpr(2))
- Tuple[foo?, bar?]))
-
-[case testWhitespaceAndCommentAnnotation]
-x = 1#type:int
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(x)
- IntExpr(1)
- int?))
-
-[case testWhitespaceAndCommentAnnotation2]
-x = 1# type: int
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(x)
- IntExpr(1)
- int?))
-
-[case testWhitespaceAndCommentAnnotation3]
-x = 1# type : int # not recognized!
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(x)
- IntExpr(1)))
-
-[case testInvalidAnnotation]
-x=1 ##type: int
-y=1 #.type: int
-z=1 # Type: int
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(x)
- IntExpr(1))
- AssignmentStmt:2(
- NameExpr(y)
- IntExpr(1))
- AssignmentStmt:3(
- NameExpr(z)
- IntExpr(1)))
-
-[case testEmptyClass]
-class C:
- pass
-[out]
-MypyFile:1(
- ClassDef:1(
- C
- PassStmt:2()))
-
-[case testOperatorPrecedence]
-a | b ^ c
-a & b << c
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- OpExpr:1(
- |
- NameExpr(a)
- OpExpr:1(
- ^
- NameExpr(b)
- NameExpr(c))))
- ExpressionStmt:2(
- OpExpr:2(
- &
- NameExpr(a)
- OpExpr:2(
- <<
- NameExpr(b)
- NameExpr(c)))))
-
-[case testOperatorAssociativity]
-1 - 2 + 3
-1 << 2 << 3
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- OpExpr:1(
- +
- OpExpr:1(
- -
- IntExpr(1)
- IntExpr(2))
- IntExpr(3)))
- ExpressionStmt:2(
- OpExpr:2(
- <<
- OpExpr:2(
- <<
- IntExpr(1)
- IntExpr(2))
- IntExpr(3))))
-
-[case testUnaryOperators]
--2 * +3 * ~3 * 2
-~3**2
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- OpExpr:1(
- *
- OpExpr:1(
- *
- OpExpr:1(
- *
- UnaryExpr:1(
- -
- IntExpr(2))
- UnaryExpr:1(
- +
- IntExpr(3)))
- UnaryExpr:1(
- ~
- IntExpr(3)))
- IntExpr(2)))
- ExpressionStmt:2(
- UnaryExpr:2(
- ~
- OpExpr:2(
- **
- IntExpr(3)
- IntExpr(2)))))
-
-[case testSingleLineBodies]
-if 1: pass
-while 1: pass
-def f(): pass
-def g() -> int: return 1
-[out]
-MypyFile:1(
- IfStmt:1(
- If(
- IntExpr(1))
- Then(
- PassStmt:1()))
- WhileStmt:2(
- IntExpr(1)
- Block:2(
- PassStmt:2()))
- FuncDef:3(
- f
- Block:3(
- PassStmt:3()))
- FuncDef:4(
- g
- def () -> int?
- Block:4(
- ReturnStmt:4(
- IntExpr(1)))))
-
-[case testForStatement]
-for x in y:
- pass
-for x, (y, w) in z:
- 1
-for [x, (y, w)] in z:
- 1
-[out]
-MypyFile:1(
- ForStmt:1(
- NameExpr(x)
- NameExpr(y)
- Block:1(
- PassStmt:2()))
- ForStmt:3(
- TupleExpr:3(
- NameExpr(x)
- TupleExpr:3(
- NameExpr(y)
- NameExpr(w)))
- NameExpr(z)
- Block:3(
- ExpressionStmt:4(
- IntExpr(1))))
- ForStmt:5(
- ListExpr:5(
- NameExpr(x)
- TupleExpr:5(
- NameExpr(y)
- NameExpr(w)))
- NameExpr(z)
- Block:5(
- ExpressionStmt:6(
- IntExpr(1)))))
-
-[case testGlobalDecl]
-global x
-def f():
- global x, y
-[out]
-MypyFile:1(
- GlobalDecl:1(
- x)
- FuncDef:2(
- f
- Block:2(
- GlobalDecl:3(
- x
- y))))
-
-[case testNonlocalDecl]
-def f():
- def g():
- nonlocal x, y
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Block:1(
- FuncDef:2(
- g
- Block:2(
- NonlocalDecl:3(
- x
- y))))))
-
-[case testRaiseStatement]
-raise foo
-[out]
-MypyFile:1(
- RaiseStmt:1(
- NameExpr(foo)))
-
-[case testRaiseWithoutArg]
-try:
- pass
-except:
- raise
-[out]
-MypyFile:1(
- TryStmt:1(
- Block:1(
- PassStmt:2())
- Block:3(
- RaiseStmt:4())))
-
-[case testRaiseFrom]
-raise e from x
-[out]
-MypyFile:1(
- RaiseStmt:1(
- NameExpr(e)
- NameExpr(x)))
-
-[case testBaseclasses]
-class A(B):
- pass
-class A(B[T], C[Any, d[x]]):
- pass
-[out]
-MypyFile:1(
- ClassDef:1(
- A
- BaseTypeExpr(
- NameExpr(B))
- PassStmt:2())
- ClassDef:3(
- A
- BaseTypeExpr(
- IndexExpr:3(
- NameExpr(B)
- NameExpr(T))
- IndexExpr:3(
- NameExpr(C)
- TupleExpr:3(
- NameExpr(Any)
- IndexExpr:3(
- NameExpr(d)
- NameExpr(x)))))
- PassStmt:4()))
-
-[case testIsNot]
-x is not y
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- ComparisonExpr:1(
- is not
- NameExpr(x)
- NameExpr(y))))
-
-[case testNotAsRightOperand]
-x in not y
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- ComparisonExpr:1(
- in
- NameExpr(x)
- UnaryExpr:1(
- not
- NameExpr(y)))))
-
-[case testNotIn]
-x not in y
-not x not in y
-x not in y | z
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- ComparisonExpr:1(
- not in
- NameExpr(x)
- NameExpr(y)))
- ExpressionStmt:2(
- UnaryExpr:2(
- not
- ComparisonExpr:2(
- not in
- NameExpr(x)
- NameExpr(y))))
- ExpressionStmt:3(
- ComparisonExpr:3(
- not in
- NameExpr(x)
- OpExpr:3(
- |
- NameExpr(y)
- NameExpr(z)))))
-
-[case testNotAsBinaryOp]
-x not y # E: Parse error before "y"
-x not is y # E: Parse error before is
-[out]
-
-[case testBinaryNegAsBinaryOp]
-1 ~ 2 # E: Parse error before ~
-[out]
-
-[case testDictionaryExpression]
-{}
-{1:x}
-{1:x, 2 or 1:2 and 3}
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- DictExpr:1())
- ExpressionStmt:2(
- DictExpr:2(
- IntExpr(1)
- NameExpr(x)))
- ExpressionStmt:3(
- DictExpr:3(
- IntExpr(1)
- NameExpr(x)
- OpExpr:3(
- or
- IntExpr(2)
- IntExpr(1))
- OpExpr:3(
- and
- IntExpr(2)
- IntExpr(3)))))
-
-[case testImport]
-import x
-import y.z.foo, __foo__.bar
-[out]
-MypyFile:1(
- Import:1(x)
- Import:2(y.z.foo, __foo__.bar))
-
-[case testVariableTypeWithQualifiedName]
-x = None # type: x.y
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(x)
- NameExpr(None)
- x.y?))
-
-[case testTypeInSignatureWithQualifiedName]
-def f() -> x.y[a.b.c]: pass
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- def () -> x.y?[a.b.c?]
- Block:1(
- PassStmt:1())))
-
-[case testImportFrom]
-from m import x
-from m.n import x, y, z
-[out]
-MypyFile:1(
- ImportFrom:1(m, [x])
- ImportFrom:2(m.n, [x, y, z]))
-
-[case testImportFromAs]
-from m import x as y
-from x import y, z as a, c as c
-[out]
-MypyFile:1(
- ImportFrom:1(m, [x : y])
- ImportFrom:2(x, [y, z : a, c : c]))
-
-[case testImportStar]
-from x import *
-[out]
-MypyFile:1(
- ImportAll:1(x))
-
-[case testImportsInDifferentPlaces]
-1
-import x
-def f():
- from x import y
- from z import *
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- IntExpr(1))
- Import:2(x)
- FuncDef:3(
- f
- Block:3(
- ImportFrom:4(x, [y])
- ImportAll:5(z))))
-
-[case testImportWithExtraComma]
-from x import (y, z,)
-[out]
-MypyFile:1(
- ImportFrom:1(x, [y, z]))
-
-[case testDefaultArgs]
-def f(x=1):
- pass
-def g(x, y=1+2, z=(1, 2)):
- pass
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Args(
- Var(x))
- Init(
- AssignmentStmt:1(
- NameExpr(x)
- IntExpr(1)))
- Block:1(
- PassStmt:2()))
- FuncDef:3(
- g
- Args(
- Var(x)
- Var(y)
- Var(z))
- Init(
- AssignmentStmt:3(
- NameExpr(y)
- OpExpr:3(
- +
- IntExpr(1)
- IntExpr(2)))
- AssignmentStmt:3(
- NameExpr(z)
- TupleExpr:3(
- IntExpr(1)
- IntExpr(2))))
- Block:3(
- PassStmt:4())))
-
-[case testTryFinally]
-try:
- 1
-finally:
- 2
-[out]
-MypyFile:1(
- TryStmt:1(
- Block:1(
- ExpressionStmt:2(
- IntExpr(1)))
- Finally(
- ExpressionStmt:4(
- IntExpr(2)))))
-
-[case testTry]
-try:
- 1
-except x:
- 2
-[out]
-MypyFile:1(
- TryStmt:1(
- Block:1(
- ExpressionStmt:2(
- IntExpr(1)))
- NameExpr(x)
- Block:3(
- ExpressionStmt:4(
- IntExpr(2)))))
-
-[case testComplexTry]
-try:
- 1
-except x as y:
- 2
-except x.y:
- 3
-[out]
-MypyFile:1(
- TryStmt:1(
- Block:1(
- ExpressionStmt:2(
- IntExpr(1)))
- NameExpr(x)
- NameExpr(y)
- Block:3(
- ExpressionStmt:4(
- IntExpr(2)))
- MemberExpr:5(
- NameExpr(x)
- y)
- Block:5(
- ExpressionStmt:6(
- IntExpr(3)))))
-
-[case testGeneratorExpression]
-x for y in z
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- GeneratorExpr:1(
- NameExpr(x)
- NameExpr(y)
- NameExpr(z))))
-
-[case testGeneratorExpressionNested]
-x for y, (p, q) in z
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- GeneratorExpr:1(
- NameExpr(x)
- TupleExpr:1(
- NameExpr(y)
- TupleExpr:1(
- NameExpr(p)
- NameExpr(q)))
- NameExpr(z))))
-
-[case testListComprehension]
-x=[x for y in z]
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(x)
- ListComprehension:1(
- GeneratorExpr:1(
- NameExpr(x)
- NameExpr(y)
- NameExpr(z)))))
-
-[case testComplexListComprehension]
-x=[(x, y) for y, z in (1, 2)]
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(x)
- ListComprehension:1(
- GeneratorExpr:1(
- TupleExpr:1(
- NameExpr(x)
- NameExpr(y))
- TupleExpr:1(
- NameExpr(y)
- NameExpr(z))
- TupleExpr:1(
- IntExpr(1)
- IntExpr(2))))))
-
-[case testListComprehension2]
-([x + 1 for x in a])
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- ListComprehension:1(
- GeneratorExpr:1(
- OpExpr:1(
- +
- NameExpr(x)
- IntExpr(1))
- NameExpr(x)
- NameExpr(a)))))
-
-[case testSlices]
-x[1:2]
-x[:1]
-x[1:]
-x[:]
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- IndexExpr:1(
- NameExpr(x)
- SliceExpr:1(
- IntExpr(1)
- IntExpr(2))))
- ExpressionStmt:2(
- IndexExpr:2(
- NameExpr(x)
- SliceExpr:2(
- <empty>
- IntExpr(1))))
- ExpressionStmt:3(
- IndexExpr:3(
- NameExpr(x)
- SliceExpr:3(
- IntExpr(1)
- <empty>)))
- ExpressionStmt:4(
- IndexExpr:4(
- NameExpr(x)
- SliceExpr:4(
- <empty>
- <empty>))))
-
-[case testSliceWithStride]
-x[1:2:3]
-x[1::2]
-x[:1:2]
-x[::2]
-x[1:2:]
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- IndexExpr:1(
- NameExpr(x)
- SliceExpr:1(
- IntExpr(1)
- IntExpr(2)
- IntExpr(3))))
- ExpressionStmt:2(
- IndexExpr:2(
- NameExpr(x)
- SliceExpr:2(
- IntExpr(1)
- <empty>
- IntExpr(2))))
- ExpressionStmt:3(
- IndexExpr:3(
- NameExpr(x)
- SliceExpr:3(
- <empty>
- IntExpr(1)
- IntExpr(2))))
- ExpressionStmt:4(
- IndexExpr:4(
- NameExpr(x)
- SliceExpr:4(
- <empty>
- <empty>
- IntExpr(2))))
- ExpressionStmt:5(
- IndexExpr:5(
- NameExpr(x)
- SliceExpr:5(
- IntExpr(1)
- IntExpr(2)))))
-
-[case testYield]
-def f():
- yield x + 1
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Block:1(
- ExpressionStmt:2(
- YieldExpr:2(
- OpExpr:2(
- +
- NameExpr(x)
- IntExpr(1)))))))
-
-[case testYieldFrom]
-def f():
- yield from h()
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Block:1(
- ExpressionStmt:2(
- YieldFromExpr:2(
- CallExpr:2(
- NameExpr(h)
- Args()))))))
-
-[case testYieldFromAssignment]
-def f():
- a = yield from h()
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Block:1(
- AssignmentStmt:2(
- NameExpr(a)
- YieldFromExpr:2(
- CallExpr:2(
- NameExpr(h)
- Args()))))))
-
-[case testDel]
-del x
-del x[0], y[1]
-[out]
-MypyFile:1(
- DelStmt:1(
- NameExpr(x))
- DelStmt:2(
- TupleExpr:2(
- IndexExpr:2(
- NameExpr(x)
- IntExpr(0))
- IndexExpr:2(
- NameExpr(y)
- IntExpr(1)))))
-
-[case testExtraCommas]
-1, 2,
-+[1, 2,]
-f(1,)
-{1:2,}
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- TupleExpr:1(
- IntExpr(1)
- IntExpr(2)))
- ExpressionStmt:2(
- UnaryExpr:2(
- +
- ListExpr:2(
- IntExpr(1)
- IntExpr(2))))
- ExpressionStmt:3(
- CallExpr:3(
- NameExpr(f)
- Args(
- IntExpr(1))))
- ExpressionStmt:4(
- DictExpr:4(
- IntExpr(1)
- IntExpr(2))))
-
-[case testExtraCommaInFunc]
-def f(x,):
- pass
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Args(
- Var(x))
- Block:1(
- PassStmt:2())))
-
-[case testLambda]
-lambda: 1
-lambda x: y + 1
-lambda x, y: 1
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- FuncExpr:1(
- Block:1(
- ReturnStmt:1(
- IntExpr(1)))))
- ExpressionStmt:2(
- FuncExpr:2(
- Args(
- Var(x))
- Block:2(
- ReturnStmt:2(
- OpExpr:2(
- +
- NameExpr(y)
- IntExpr(1))))))
- ExpressionStmt:3(
- FuncExpr:3(
- Args(
- Var(x)
- Var(y))
- Block:3(
- ReturnStmt:3(
- IntExpr(1))))))
-
-[case testComplexLambda]
-lambda x=2: x
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- FuncExpr:1(
- Args(
- Var(x))
- Init(
- AssignmentStmt:1(
- NameExpr(x)
- IntExpr(2)))
- Block:1(
- ReturnStmt:1(
- NameExpr(x))))))
-
-[case testLambdaPrecedence]
-lambda x: 1, 2
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- TupleExpr:1(
- FuncExpr:1(
- Args(
- Var(x))
- Block:1(
- ReturnStmt:1(
- IntExpr(1))))
- IntExpr(2))))
-
-[case testForIndicesInParens]
-for (i, j) in x:
- pass
-[out]
-MypyFile:1(
- ForStmt:1(
- TupleExpr:1(
- NameExpr(i)
- NameExpr(j))
- NameExpr(x)
- Block:1(
- PassStmt:2())))
-
-[case testForAndTrailingCommaAfterIndexVar]
-for i, in x:
- pass
-[out]
-MypyFile:1(
- ForStmt:1(
- TupleExpr:1(
- NameExpr(i))
- NameExpr(x)
- Block:1(
- PassStmt:2())))
-
-[case testListComprehensionAndTrailingCommaAfterIndexVar]
-x = [a for b, in c]
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(x)
- ListComprehension:1(
- GeneratorExpr:1(
- NameExpr(a)
- TupleExpr:1(
- NameExpr(b))
- NameExpr(c)))))
-
-[case testForAndTrailingCommaAfterIndexVars]
-for i, j, in x:
- pass
-[out]
-MypyFile:1(
- ForStmt:1(
- TupleExpr:1(
- NameExpr(i)
- NameExpr(j))
- NameExpr(x)
- Block:1(
- PassStmt:2())))
-
-[case testGeneratorWithCondition]
-x for y in z if 0
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- GeneratorExpr:1(
- NameExpr(x)
- NameExpr(y)
- NameExpr(z)
- IntExpr(0))))
-
-[case testListComprehensionWithCondition]
-raise [x for y in z if 0]
-[out]
-MypyFile:1(
- RaiseStmt:1(
- ListComprehension:1(
- GeneratorExpr:1(
- NameExpr(x)
- NameExpr(y)
- NameExpr(z)
- IntExpr(0)))))
-
-[case testListComprehensionWithConditions]
-raise [x for y in z if 0 if 1]
-[out]
-MypyFile:1(
- RaiseStmt:1(
- ListComprehension:1(
- GeneratorExpr:1(
- NameExpr(x)
- NameExpr(y)
- NameExpr(z)
- IntExpr(0)
- IntExpr(1)))))
-
-[case testListComprehensionWithCrazyConditions]
-raise [x for y in z if (1 if 2 else 3) if 1]
-[out]
-MypyFile:1(
- RaiseStmt:1(
- ListComprehension:1(
- GeneratorExpr:1(
- NameExpr(x)
- NameExpr(y)
- NameExpr(z)
- ConditionalExpr:1(
- Condition(
- IntExpr(2))
- IntExpr(1)
- IntExpr(3))
- IntExpr(1)))))
-
-[case testDictionaryComprehension]
-a = {x: y for x, y in xys}
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(a)
- DictionaryComprehension:1(
- NameExpr(x)
- NameExpr(y)
- TupleExpr:1(
- NameExpr(x)
- NameExpr(y))
- NameExpr(xys))))
-
-[case testDictionaryComprehensionComplex]
-a = {x: y for x, y in xys for p, q in pqs if c}
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(a)
- DictionaryComprehension:1(
- NameExpr(x)
- NameExpr(y)
- TupleExpr:1(
- NameExpr(x)
- NameExpr(y))
- TupleExpr:1(
- NameExpr(p)
- NameExpr(q))
- NameExpr(xys)
- NameExpr(pqs)
- NameExpr(c))))
-
-[case testSetComprehension]
-a = {i for i in l}
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(a)
- SetComprehension:1(
- GeneratorExpr:1(
- NameExpr(i)
- NameExpr(i)
- NameExpr(l)))))
-
-[case testSetComprehensionComplex]
-a = {x + p for x in xys for p in pqs if c}
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(a)
- SetComprehension:1(
- GeneratorExpr:1(
- OpExpr:1(
- +
- NameExpr(x)
- NameExpr(p))
- NameExpr(x)
- NameExpr(p)
- NameExpr(xys)
- NameExpr(pqs)
- NameExpr(c)))))
-
-[case testWithStatement]
-with open('foo') as f:
- pass
-[out]
-MypyFile:1(
- WithStmt:1(
- Expr(
- CallExpr:1(
- NameExpr(open)
- Args(
- StrExpr(foo))))
- Target(
- NameExpr(f))
- Block:1(
- PassStmt:2())))
-
-[case testWithStatementWithoutTarget]
-with foo:
- pass
-[out]
-MypyFile:1(
- WithStmt:1(
- Expr(
- NameExpr(foo))
- Block:1(
- PassStmt:2())))
-
-[case testHexOctBinLiterals]
-0xa, 0Xaf, 0o7, 0O12, 0b1, 0B101
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- TupleExpr:1(
- IntExpr(10)
- IntExpr(175)
- IntExpr(7)
- IntExpr(10)
- IntExpr(1)
- IntExpr(5))))
-
-[case testImportFromWithParens]
-from x import (y)
-from x import (y,
- z)
-[out]
-MypyFile:1(
- ImportFrom:1(x, [y])
- ImportFrom:2(x, [y, z]))
-
-[case testContinueStmt]
-while 1:
- continue
-[out]
-MypyFile:1(
- WhileStmt:1(
- IntExpr(1)
- Block:1(
- ContinueStmt:2())))
-
-[case testStrLiteralConcatenate]
-'f' 'bar'
-('x'
- 'y'
- 'z')
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- StrExpr(fbar))
- ExpressionStmt:2(
- StrExpr(xyz)))
-
-[case testCatchAllExcept]
-try:
- 1
-except:
- pass
-try:
- 1
-except x:
- pass
-except:
- 2
-[out]
-MypyFile:1(
- TryStmt:1(
- Block:1(
- ExpressionStmt:2(
- IntExpr(1)))
- Block:3(
- PassStmt:4()))
- TryStmt:5(
- Block:5(
- ExpressionStmt:6(
- IntExpr(1)))
- NameExpr(x)
- Block:7(
- PassStmt:8())
- Block:9(
- ExpressionStmt:10(
- IntExpr(2)))))
-
-[case testTryElse]
-try:
- pass
-except x:
- 1
-else:
- 2
-[out]
-MypyFile:1(
- TryStmt:1(
- Block:1(
- PassStmt:2())
- NameExpr(x)
- Block:3(
- ExpressionStmt:4(
- IntExpr(1)))
- Else(
- ExpressionStmt:6(
- IntExpr(2)))))
-
-[case testExceptWithMultipleTypes]
-try:
- pass
-except (x, y):
- pass
-except (a, b, c) as e:
- pass
-[out]
-MypyFile:1(
- TryStmt:1(
- Block:1(
- PassStmt:2())
- TupleExpr:3(
- NameExpr(x)
- NameExpr(y))
- Block:3(
- PassStmt:4())
- TupleExpr:5(
- NameExpr(a)
- NameExpr(b)
- NameExpr(c))
- NameExpr(e)
- Block:5(
- PassStmt:6())))
-
-[case testNestedFunctions]
-def f():
- def g():
- pass
-def h() -> int:
- def g() -> int:
- pass
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Block:1(
- FuncDef:2(
- g
- Block:2(
- PassStmt:3()))))
- FuncDef:4(
- h
- def () -> int?
- Block:4(
- FuncDef:5(
- g
- def () -> int?
- Block:5(
- PassStmt:6())))))
-
-[case testStatementsAndDocStringsInClassBody]
-class A:
- "doc string"
- x = y
- def f(self):
- pass
-[out]
-MypyFile:1(
- ClassDef:1(
- A
- ExpressionStmt:2(
- StrExpr(doc string))
- AssignmentStmt:3(
- NameExpr(x)
- NameExpr(y))
- FuncDef:4(
- f
- Args(
- Var(self))
- Block:4(
- PassStmt:5()))))
-
-[case testSingleLineClass]
-class a: pass
-[out]
-MypyFile:1(
- ClassDef:1(
- a
- PassStmt:1()))
-
-[case testDecorator]
- at property
-def f():
- pass
-[out]
-MypyFile:1(
- Decorator:1(
- Var(f)
- NameExpr(property)
- FuncDef:2(
- f
- Block:2(
- PassStmt:3()))))
-
-[case testComplexDecorator]
- at foo(bar, 1)
- at zar
-def f() -> int:
- pass
-[out]
-MypyFile:1(
- Decorator:1(
- Var(f)
- CallExpr:1(
- NameExpr(foo)
- Args(
- NameExpr(bar)
- IntExpr(1)))
- NameExpr(zar)
- FuncDef:3(
- f
- def () -> int?
- Block:3(
- PassStmt:4()))))
-
-[case testKeywordArgInCall]
-f(x=1)
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- CallExpr:1(
- NameExpr(f)
- Args()
- KwArgs(
- x
- IntExpr(1)))))
-
-[case testComplexKeywordArgs]
-f(x, y=1 or 2, z=y)
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- CallExpr:1(
- NameExpr(f)
- Args(
- NameExpr(x))
- KwArgs(
- y
- OpExpr:1(
- or
- IntExpr(1)
- IntExpr(2)))
- KwArgs(
- z
- NameExpr(y)))))
-
-[case testChainedAssignment]
-x = z = 1
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- Lvalues(
- NameExpr(x)
- NameExpr(z))
- IntExpr(1)))
-
-[case testVarArgs]
-def f(x, *a): pass
-f(1, *2)
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Args(
- Var(x))
- VarArg(
- Var(a))
- Block:1(
- PassStmt:1()))
- ExpressionStmt:2(
- CallExpr:2(
- NameExpr(f)
- Args(
- IntExpr(1)
- IntExpr(2))
- VarArg)))
-
-[case testVarArgWithType]
-def f(x: str, *a: int): pass
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Args(
- Var(x))
- def (x: str?, *a: int?) -> Any
- VarArg(
- Var(a))
- Block:1(
- PassStmt:1())))
-
-[case testDictVarArgs]
-def f(x, **a): pass
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Args(
- Var(x))
- DictVarArg(
- Var(a))
- Block:1(
- PassStmt:1())))
-
-[case testBothVarArgs]
-def f(x, *a, **b): pass
-def g(*a, **b): pass
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Args(
- Var(x))
- VarArg(
- Var(a))
- DictVarArg(
- Var(b))
- Block:1(
- PassStmt:1()))
- FuncDef:2(
- g
- VarArg(
- Var(a))
- DictVarArg(
- Var(b))
- Block:2(
- PassStmt:2())))
-
-[case testDictVarArgsWithType]
-def f(x: X, **a: A) -> None: pass
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Args(
- Var(x))
- def (x: X?, **a: A?) -> None?
- DictVarArg(
- Var(a))
- Block:1(
- PassStmt:1())))
-
-[case testCallDictVarArgs]
-f(**x)
-f(x, **y)
-f(*x, **y)
-f(x, *y, **z)
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- CallExpr:1(
- NameExpr(f)
- Args()
- DictVarArg(
- NameExpr(x))))
- ExpressionStmt:2(
- CallExpr:2(
- NameExpr(f)
- Args(
- NameExpr(x))
- DictVarArg(
- NameExpr(y))))
- ExpressionStmt:3(
- CallExpr:3(
- NameExpr(f)
- Args(
- NameExpr(x))
- VarArg
- DictVarArg(
- NameExpr(y))))
- ExpressionStmt:4(
- CallExpr:4(
- NameExpr(f)
- Args(
- NameExpr(x)
- NameExpr(y))
- VarArg
- DictVarArg(
- NameExpr(z)))))
-
-[case testAssert]
-assert x == y
-[out]
-MypyFile:1(
- AssertStmt:1(
- ComparisonExpr:1(
- ==
- NameExpr(x)
- NameExpr(y))))
-
-[case testYieldWithoutExpressions]
-def f():
- yield
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Block:1(
- ExpressionStmt:2(
- YieldExpr:2()))))
-
-[case testConditionalExpression]
-x if y else z
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- ConditionalExpr:1(
- Condition(
- NameExpr(y))
- NameExpr(x)
- NameExpr(z))))
-
-[case testConditionalExpressionInListComprehension]
-a = [x if y else z for a in b]
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(a)
- ListComprehension:1(
- GeneratorExpr:1(
- ConditionalExpr:1(
- Condition(
- NameExpr(y))
- NameExpr(x)
- NameExpr(z))
- NameExpr(a)
- NameExpr(b)))))
-
-[case testConditionalExpressionInTuple]
-1 if 2 else 3, 4
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- TupleExpr:1(
- ConditionalExpr:1(
- Condition(
- IntExpr(2))
- IntExpr(1)
- IntExpr(3))
- IntExpr(4))))
-
-[case testSetLiteral]
-{x or y}
-{1, 2}
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- SetExpr:1(
- OpExpr:1(
- or
- NameExpr(x)
- NameExpr(y))))
- ExpressionStmt:2(
- SetExpr:2(
- IntExpr(1)
- IntExpr(2))))
-
-[case testSetLiteralWithExtraComma]
-{x,}
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- SetExpr:1(
- NameExpr(x))))
-
-[case testImportAs]
-import x as y
-import x, z as y, a.b as c, d as d
-[out]
-MypyFile:1(
- Import:1(x : y)
- Import:2(x, z : y, a.b : c, d : d))
-
-[case testForAndElse]
-for x in y:
- pass
-else:
- x
-[out]
-MypyFile:1(
- ForStmt:1(
- NameExpr(x)
- NameExpr(y)
- Block:1(
- PassStmt:2())
- Else(
- ExpressionStmt:4(
- NameExpr(x)))))
-
-[case testWhileAndElse]
-while x:
- pass
-else:
- y
-[out]
-MypyFile:1(
- WhileStmt:1(
- NameExpr(x)
- Block:1(
- PassStmt:2())
- Else(
- ExpressionStmt:4(
- NameExpr(y)))))
-
-[case testWithAndMultipleOperands]
-with x as y, a as b:
- pass
-with x(), y():
- pass
-[out]
-MypyFile:1(
- WithStmt:1(
- Expr(
- NameExpr(x))
- Target(
- NameExpr(y))
- Expr(
- NameExpr(a))
- Target(
- NameExpr(b))
- Block:1(
- PassStmt:2()))
- WithStmt:3(
- Expr(
- CallExpr:3(
- NameExpr(x)
- Args()))
- Expr(
- CallExpr:3(
- NameExpr(y)
- Args()))
- Block:3(
- PassStmt:4())))
-
-[case testOperatorAssignment]
-x += 1
-x -= 1
-x *= 1
-x /= 1
-x //= 1
-x %= 1
-x **= 1
-x |= 1
-x &= 1
-x ^= 1
-x >>= 1
-x <<= 1
-[out]
-MypyFile:1(
- OperatorAssignmentStmt:1(
- +
- NameExpr(x)
- IntExpr(1))
- OperatorAssignmentStmt:2(
- -
- NameExpr(x)
- IntExpr(1))
- OperatorAssignmentStmt:3(
- *
- NameExpr(x)
- IntExpr(1))
- OperatorAssignmentStmt:4(
- /
- NameExpr(x)
- IntExpr(1))
- OperatorAssignmentStmt:5(
- //
- NameExpr(x)
- IntExpr(1))
- OperatorAssignmentStmt:6(
- %
- NameExpr(x)
- IntExpr(1))
- OperatorAssignmentStmt:7(
- **
- NameExpr(x)
- IntExpr(1))
- OperatorAssignmentStmt:8(
- |
- NameExpr(x)
- IntExpr(1))
- OperatorAssignmentStmt:9(
- &
- NameExpr(x)
- IntExpr(1))
- OperatorAssignmentStmt:10(
- ^
- NameExpr(x)
- IntExpr(1))
- OperatorAssignmentStmt:11(
- >>
- NameExpr(x)
- IntExpr(1))
- OperatorAssignmentStmt:12(
- <<
- NameExpr(x)
- IntExpr(1)))
-
-[case testNestedClasses]
-class A:
- class B:
- pass
- class C:
- pass
-[out]
-MypyFile:1(
- ClassDef:1(
- A
- ClassDef:2(
- B
- PassStmt:3())
- ClassDef:4(
- C
- PassStmt:5())))
-
-[case testTryWithExceptAndFinally]
-try:
- pass
-except x:
- x
-finally:
- y
-[out]
-MypyFile:1(
- TryStmt:1(
- Block:1(
- PassStmt:2())
- NameExpr(x)
- Block:3(
- ExpressionStmt:4(
- NameExpr(x)))
- Finally(
- ExpressionStmt:6(
- NameExpr(y)))))
-
-[case testBareAsteriskInFuncDef]
-def f(x, *, y=1): pass
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- MaxPos(1)
- Args(
- Var(x)
- Var(y))
- Init(
- AssignmentStmt:1(
- NameExpr(y)
- IntExpr(1)))
- Block:1(
- PassStmt:1())))
-
-[case testBareAsteriskInFuncDefWithSignature]
-def f(x: A, *, y: B = 1) -> None: pass
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- MaxPos(1)
- Args(
- Var(x)
- Var(y))
- def (x: A?, *, y: B? =) -> None?
- Init(
- AssignmentStmt:1(
- NameExpr(y)
- IntExpr(1)))
- Block:1(
- PassStmt:1())))
-
-[case testBareAsteriskNamedDefault]
-def f(*, y: B = 1) -> None: pass
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- MaxPos(0)
- Args(
- Var(y))
- def (*, y: B? =) -> None?
- Init(
- AssignmentStmt:1(
- NameExpr(y)
- IntExpr(1)))
- Block:1(
- PassStmt:1())))
-
-[case testBareAsteriskNamedNoDefault]
-def f(*, y: B) -> None: pass
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- MaxPos(0)
- Args(
- Var(y))
- def (*, y: B?) -> None?
- Block:1(
- PassStmt:1())))
-
-[case testSuperExpr]
-super().x
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- SuperExpr:1(
- x)))
-
-[case testKeywordAndDictArgs]
-f(x = y, **kwargs)
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- CallExpr:1(
- NameExpr(f)
- Args()
- KwArgs(
- x
- NameExpr(y))
- DictVarArg(
- NameExpr(kwargs)))))
-
-[case testSimpleFunctionType]
-f = None # type: Callable[[], None]
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(f)
- NameExpr(None)
- Callable?[<TypeList >, None?]))
-
-[case testFunctionTypeWithArgument]
-f = None # type: Callable[[str], int]
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(f)
- NameExpr(None)
- Callable?[<TypeList str?>, int?]))
-
-[case testFunctionTypeWithTwoArguments]
-f = None # type: Callable[[a[b], x.y], List[int]]
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(f)
- NameExpr(None)
- Callable?[<TypeList a?[b?], x.y?>, List?[int?]]))
-
-[case testFunctionTypeWithExtraComma]
-def f(x: Callable[[str,], int]): pass
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Args(
- Var(x))
- def (x: Callable?[<TypeList str?>, int?]) -> Any
- Block:1(
- PassStmt:1())))
-
-[case testSimpleStringLiteralType]
-def f() -> 'A': pass
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- def () -> A?
- Block:1(
- PassStmt:1())))
-
-[case testGenericStringLiteralType]
-def f() -> 'A[B, C]': pass
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- def () -> A?[B?, C?]
- Block:1(
- PassStmt:1())))
-
-[case testPartialStringLiteralType]
-def f() -> A['B', C]: pass
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- def () -> A?[B?, C?]
- Block:1(
- PassStmt:1())))
-
-[case testWhitespaceInStringLiteralType]
-def f() -> ' A [ X ] ': pass
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- def () -> A?[X?]
- Block:1(
- PassStmt:1())))
-
-[case testEscapeInStringLiteralType]
-def f() -> '\x41': pass
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- def () -> A?
- Block:1(
- PassStmt:1())))
-
-[case testMetaclass]
-class Foo(metaclass=Bar): pass
-[out]
-MypyFile:1(
- ClassDef:1(
- Foo
- Metaclass(Bar)
- PassStmt:1()))
-
-[case testQualifiedMetaclass]
-class Foo(metaclass=foo.Bar): pass
-[out]
-MypyFile:1(
- ClassDef:1(
- Foo
- Metaclass(foo.Bar)
- PassStmt:1()))
-
-[case testBaseAndMetaclass]
-class Foo(foo.bar[x], metaclass=Bar): pass
-[out]
-MypyFile:1(
- ClassDef:1(
- Foo
- Metaclass(Bar)
- BaseTypeExpr(
- IndexExpr:1(
- MemberExpr:1(
- NameExpr(foo)
- bar)
- NameExpr(x)))
- PassStmt:1()))
-
-[case testClassKeywordArgs]
-class Foo(_root=None): pass
-[out]
-MypyFile:1(
- ClassDef:1(
- Foo
- PassStmt:1()))
-
-[case testClassKeywordArgsBeforeMeta]
-class Foo(_root=None, metaclass=Bar): pass
-[out]
-MypyFile:1(
- ClassDef:1(
- Foo
- Metaclass(Bar)
- PassStmt:1()))
-
-[case testClassKeywordArgsAfterMeta]
-class Foo(metaclass=Bar, _root=None): pass
-[out]
-MypyFile:1(
- ClassDef:1(
- Foo
- Metaclass(Bar)
- PassStmt:1()))
-
-[case testNamesThatAreNoLongerKeywords]
-any = interface
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(any)
- NameExpr(interface)))
-
-[case testFunctionOverload]
- at foo
-def f() -> x: pass
- at foo
-def f() -> y: pass
-[out]
-MypyFile:1(
- OverloadedFuncDef:1(
- Decorator:1(
- Var(f)
- NameExpr(foo)
- FuncDef:2(
- f
- def () -> x?
- Block:2(
- PassStmt:2())))
- Decorator:3(
- Var(f)
- NameExpr(foo)
- FuncDef:4(
- f
- def () -> y?
- Block:4(
- PassStmt:4())))))
-
-[case testFunctionOverloadAndOtherStatements]
-x
- at foo
-def f() -> x: pass
- at foo
-def f() -> y: pass
-x
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- NameExpr(x))
- OverloadedFuncDef:2(
- Decorator:2(
- Var(f)
- NameExpr(foo)
- FuncDef:3(
- f
- def () -> x?
- Block:3(
- PassStmt:3())))
- Decorator:4(
- Var(f)
- NameExpr(foo)
- FuncDef:5(
- f
- def () -> y?
- Block:5(
- PassStmt:5()))))
- ExpressionStmt:6(
- NameExpr(x)))
-
-[case testFunctionOverloadWithThreeVariants]
- at foo
-def f() -> x: pass
- at foo
-def f() -> y: pass
- at foo
-def f(y): pass
-[out]
-MypyFile:1(
- OverloadedFuncDef:1(
- Decorator:1(
- Var(f)
- NameExpr(foo)
- FuncDef:2(
- f
- def () -> x?
- Block:2(
- PassStmt:2())))
- Decorator:3(
- Var(f)
- NameExpr(foo)
- FuncDef:4(
- f
- def () -> y?
- Block:4(
- PassStmt:4())))
- Decorator:5(
- Var(f)
- NameExpr(foo)
- FuncDef:6(
- f
- Args(
- Var(y))
- Block:6(
- PassStmt:6())))))
-
-[case testDecoratorsThatAreNotOverloads]
- at foo
-def f() -> x: pass
- at foo
-def g() -> y: pass
-[out]
-MypyFile:1(
- Decorator:1(
- Var(f)
- NameExpr(foo)
- FuncDef:2(
- f
- def () -> x?
- Block:2(
- PassStmt:2())))
- Decorator:3(
- Var(g)
- NameExpr(foo)
- FuncDef:4(
- g
- def () -> y?
- Block:4(
- PassStmt:4()))))
-
-[case testFunctionOverloadWithinFunction]
-def f():
- @foo
- def g(): pass
- @foo
- def g() -> x: pass
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Block:1(
- OverloadedFuncDef:2(
- Decorator:2(
- Var(g)
- NameExpr(foo)
- FuncDef:3(
- g
- Block:3(
- PassStmt:3())))
- Decorator:4(
- Var(g)
- NameExpr(foo)
- FuncDef:5(
- g
- def () -> x?
- Block:5(
- PassStmt:5())))))))
-
-[case testCommentFunctionAnnotation]
-def f(): # type: () -> A
- pass
-def g(x): # type: (A) -> B
- pass
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- def () -> A?
- Block:1(
- PassStmt:2()))
- FuncDef:3(
- g
- Args(
- Var(x))
- def (x: A?) -> B?
- Block:3(
- PassStmt:4())))
-
-[case testCommentMethodAnnotation]
-class A:
- def f(self): # type: () -> A
- pass
- def g(xself, x): # type: (A) -> B
- pass
-[out]
-MypyFile:1(
- ClassDef:1(
- A
- FuncDef:2(
- f
- Args(
- Var(self))
- def (self: Any) -> A?
- Block:2(
- PassStmt:3()))
- FuncDef:4(
- g
- Args(
- Var(xself)
- Var(x))
- def (xself: Any, x: A?) -> B?
- Block:4(
- PassStmt:5()))))
-
-[case testCommentMethodAnnotationAndNestedFunction]
-class A:
- def f(self): # type: () -> A
- def g(x): # type: (A) -> B
- pass
-[out]
-MypyFile:1(
- ClassDef:1(
- A
- FuncDef:2(
- f
- Args(
- Var(self))
- def (self: Any) -> A?
- Block:2(
- FuncDef:3(
- g
- Args(
- Var(x))
- def (x: A?) -> B?
- Block:3(
- PassStmt:4()))))))
-
-[case testCommentFunctionAnnotationOnSeparateLine]
-def f(x):
- # type: (X) -> Y
- pass
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Args(
- Var(x))
- def (x: X?) -> Y?
- Block:1(
- PassStmt:3())))
-
-[case testCommentFunctionAnnotationOnSeparateLine2]
-def f(x):
-
- # type: (X) -> Y # bar
-
- pass
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Args(
- Var(x))
- def (x: X?) -> Y?
- Block:1(
- PassStmt:5())))
-
-[case testCommentFunctionAnnotationAndVarArg]
-def f(x, *y): # type: (X, *Y) -> Z
- pass
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Args(
- Var(x))
- def (x: X?, *y: Y?) -> Z?
- VarArg(
- Var(y))
- Block:1(
- PassStmt:2())))
-
-[case testCommentFunctionAnnotationAndAllVarArgs]
-def f(x, *y, **z): # type: (X, *Y, **Z) -> A
- pass
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Args(
- Var(x))
- def (x: X?, *y: Y?, **z: Z?) -> A?
- VarArg(
- Var(y))
- DictVarArg(
- Var(z))
- Block:1(
- PassStmt:2())))
-
-[case testClassDecorator]
- at foo
-class X: pass
- at foo(bar)
- at x.y
-class Z: pass
-[out]
-MypyFile:1(
- ClassDef:1(
- X
- Decorators(
- NameExpr(foo))
- PassStmt:2())
- ClassDef:3(
- Z
- Decorators(
- CallExpr:3(
- NameExpr(foo)
- Args(
- NameExpr(bar)))
- MemberExpr:4(
- NameExpr(x)
- y))
- PassStmt:5()))
-
-[case testTrailingSemicolon]
-def x():
- pass;
-
-def y():
- pass
-[out]
-MypyFile:1(
- FuncDef:1(
- x
- Block:1(
- PassStmt:2()))
- FuncDef:4(
- y
- Block:4(
- PassStmt:5())))
-
-[case testEmptySuperClass]
-class A():
- pass
-[out]
-MypyFile:1(
- ClassDef:1(
- A
- PassStmt:2()))
-
-[case testStarExpression]
-*a
-*a, b
-a, *b
-a, (*x, y)
-a, (x, *y)
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- StarExpr:1(
- NameExpr(a)))
- ExpressionStmt:2(
- TupleExpr:2(
- StarExpr:2(
- NameExpr(a))
- NameExpr(b)))
- ExpressionStmt:3(
- TupleExpr:3(
- NameExpr(a)
- StarExpr:3(
- NameExpr(b))))
- ExpressionStmt:4(
- TupleExpr:4(
- NameExpr(a)
- TupleExpr:4(
- StarExpr:4(
- NameExpr(x))
- NameExpr(y))))
- ExpressionStmt:5(
- TupleExpr:5(
- NameExpr(a)
- TupleExpr:5(
- NameExpr(x)
- StarExpr:5(
- NameExpr(y))))))
-
-[case testStarExpressionParenthesis]
-*(a)
-*(a,b)
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- StarExpr:1(
- NameExpr(a)))
- ExpressionStmt:2(
- StarExpr:2(
- TupleExpr:2(
- NameExpr(a)
- NameExpr(b)))))
-
-[case testStarExpressionInFor]
-for *a in b:
- pass
-
-for a, *b in c:
- pass
-
-for *a, b in c:
- pass
-[out]
-MypyFile:1(
- ForStmt:1(
- StarExpr:1(
- NameExpr(a))
- NameExpr(b)
- Block:1(
- PassStmt:2()))
- ForStmt:4(
- TupleExpr:4(
- NameExpr(a)
- StarExpr:4(
- NameExpr(b)))
- NameExpr(c)
- Block:4(
- PassStmt:5()))
- ForStmt:7(
- TupleExpr:7(
- StarExpr:7(
- NameExpr(a))
- NameExpr(b))
- NameExpr(c)
- Block:7(
- PassStmt:8())))
-
-[case testStarExprInGeneratorExpr]
-x for y, *p in z
-x for *p, y in z
-x for y, *p, q in z
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- GeneratorExpr:1(
- NameExpr(x)
- TupleExpr:1(
- NameExpr(y)
- StarExpr:1(
- NameExpr(p)))
- NameExpr(z)))
- ExpressionStmt:2(
- GeneratorExpr:2(
- NameExpr(x)
- TupleExpr:2(
- StarExpr:2(
- NameExpr(p))
- NameExpr(y))
- NameExpr(z)))
- ExpressionStmt:3(
- GeneratorExpr:3(
- NameExpr(x)
- TupleExpr:3(
- NameExpr(y)
- StarExpr:3(
- NameExpr(p))
- NameExpr(q))
- NameExpr(z))))
-
-[case testParseNamedtupleBaseclass]
-class A(namedtuple('x', ['y'])): pass
-[out]
-MypyFile:1(
- ClassDef:1(
- A
- BaseTypeExpr(
- CallExpr:1(
- NameExpr(namedtuple)
- Args(
- StrExpr(x)
- ListExpr:1(
- StrExpr(y)))))
- PassStmt:1()))
-
-[case testEllipsis]
-...
-a[1,...,2]
-....__class__
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- Ellipsis)
- ExpressionStmt:2(
- IndexExpr:2(
- NameExpr(a)
- TupleExpr:2(
- IntExpr(1)
- Ellipsis
- IntExpr(2))))
- ExpressionStmt:3(
- MemberExpr:3(
- Ellipsis
- __class__)))
-
-[case testFunctionWithManyKindsOfArgs]
-def f(x, *args, *, y=None, **kw): pass
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- MaxPos(1)
- Args(
- Var(x)
- Var(y))
- Init(
- AssignmentStmt:1(
- NameExpr(y)
- NameExpr(None)))
- VarArg(
- Var(args))
- DictVarArg(
- Var(kw))
- Block:1(
- PassStmt:1())))
-
-[case testIfWithSemicolons]
-if 1: a; b
-[out]
-MypyFile:1(
- IfStmt:1(
- If(
- IntExpr(1))
- Then(
- ExpressionStmt:1(
- NameExpr(a))
- ExpressionStmt:1(
- NameExpr(b)))))
-
-[case testIfWithSemicolonsNested]
-while 2:
- if 1: a; b
-[out]
-MypyFile:1(
- WhileStmt:1(
- IntExpr(2)
- Block:1(
- IfStmt:2(
- If(
- IntExpr(1))
- Then(
- ExpressionStmt:2(
- NameExpr(a))
- ExpressionStmt:2(
- NameExpr(b)))))))
-
-[case testIfElseWithSemicolons]
-if 1: global x; y = 1
-else: x = 1; return 3
-4
-[out]
-MypyFile:1(
- IfStmt:1(
- If(
- IntExpr(1))
- Then(
- GlobalDecl:1(
- x)
- AssignmentStmt:1(
- NameExpr(y)
- IntExpr(1)))
- Else(
- AssignmentStmt:2(
- NameExpr(x)
- IntExpr(1))
- ReturnStmt:2(
- IntExpr(3))))
- ExpressionStmt:3(
- IntExpr(4)))
-
-[case testIfElseWithSemicolonsNested]
-while 2:
- if 1: global x; y = 1
- else: x = 1; return 3
-4
-[out]
-MypyFile:1(
- WhileStmt:1(
- IntExpr(2)
- Block:1(
- IfStmt:2(
- If(
- IntExpr(1))
- Then(
- GlobalDecl:2(
- x)
- AssignmentStmt:2(
- NameExpr(y)
- IntExpr(1)))
- Else(
- AssignmentStmt:3(
- NameExpr(x)
- IntExpr(1))
- ReturnStmt:3(
- IntExpr(3))))))
- ExpressionStmt:4(
- IntExpr(4)))
-
-[case testKeywordArgumentAfterStarArgumentInCall]
-f(x=1, *y)
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- CallExpr:1(
- NameExpr(f)
- Args(
- NameExpr(y))
- KwArgs(
- x
- IntExpr(1))
- VarArg)))
-
-[case testConditionalExpressionInSetComprehension]
-{ 1 if x else 2 for x in y }
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- SetComprehension:1(
- GeneratorExpr:1(
- ConditionalExpr:1(
- Condition(
- NameExpr(x))
- IntExpr(1)
- IntExpr(2))
- NameExpr(x)
- NameExpr(y)))))
-
-[case testConditionalExpressionInListComprehension]
-a = [ 1 if x else 2 for x in y ]
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(a)
- ListComprehension:1(
- GeneratorExpr:1(
- ConditionalExpr:1(
- Condition(
- NameExpr(x))
- IntExpr(1)
- IntExpr(2))
- NameExpr(x)
- NameExpr(y)))))
-
-[case testComplexWithLvalue]
-with x as y.z: pass
-[out]
-MypyFile:1(
- WithStmt:1(
- Expr(
- NameExpr(x))
- Target(
- MemberExpr:1(
- NameExpr(y)
- z))
- Block:1(
- PassStmt:1())))
-
-[case testRelativeImportWithEllipsis]
-from ... import x
-[out]
-MypyFile:1(
- ImportFrom:1(..., [x]))
-
-[case testRelativeImportWithEllipsis2]
-from .... import x
-[out]
-MypyFile:1(
- ImportFrom:1(...., [x]))
-
-[case testParseExtendedSlicing]
-a[:, :]
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- IndexExpr:1(
- NameExpr(a)
- TupleExpr:1(
- SliceExpr:1(
- <empty>
- <empty>)
- SliceExpr:1(
- <empty>
- <empty>)))))
-
-[case testParseExtendedSlicing2]
-a[1:2:, :,]
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- IndexExpr:1(
- NameExpr(a)
- TupleExpr:1(
- SliceExpr:1(
- IntExpr(1)
- IntExpr(2))
- SliceExpr:1(
- <empty>
- <empty>)))))
-
-[case testParseExtendedSlicing3]
-a[1:2:3, ..., 1]
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- IndexExpr:1(
- NameExpr(a)
- TupleExpr:1(
- SliceExpr:1(
- IntExpr(1)
- IntExpr(2)
- IntExpr(3))
- Ellipsis
- IntExpr(1)))))
-
-[case testParseIfExprInDictExpr]
-test = { 'spam': 'eggs' if True else 'bacon' }
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(test)
- DictExpr:1(
- StrExpr(spam)
- ConditionalExpr:1(
- Condition(
- NameExpr(True))
- StrExpr(eggs)
- StrExpr(bacon)))))
-
-[case testIgnoreLine]
-import x # type: ignore
-[out]
-MypyFile:1(
- Import:1(x)
- IgnoredLines(1))
-
-[case testIgnore2Lines]
-x
-y # type: ignore
-z # type: ignore
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- NameExpr(x))
- ExpressionStmt:2(
- NameExpr(y))
- ExpressionStmt:3(
- NameExpr(z))
- IgnoredLines(2, 3))
-
-[case testCommentedOutIgnoreAnnotation]
-y ## type: ignore
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- NameExpr(y)))
-
-[case testInvalidIgnoreAnnotations]
-y # type: ignored
-y # type: IGNORE
-y # type : ignore
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- NameExpr(y))
- ExpressionStmt:2(
- NameExpr(y))
- ExpressionStmt:3(
- NameExpr(y)))
-
-[case testSpaceInIgnoreAnnotations]
-y # type: ignore # foo
-y #type:ignore
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- NameExpr(y))
- ExpressionStmt:2(
- NameExpr(y))
- IgnoredLines(1, 2))
-
-[case testIgnoreAnnotationAndMultilineStatement]
-x = {
- 1: 2 # type: ignore
-}
-y = { # type: ignore
- 1: 2
-} # type: ignore
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(x)
- DictExpr:1(
- IntExpr(1)
- IntExpr(2)))
- AssignmentStmt:4(
- NameExpr(y)
- DictExpr:4(
- IntExpr(1)
- IntExpr(2)))
- IgnoredLines(2, 4, 6))
-
-[case testIgnoreAnnotationAndMultilineStatement2]
-from m import ( # type: ignore
- x, y
-)
-[out]
-MypyFile:1(
- ImportFrom:1(m, [x, y])
- IgnoredLines(1))
-
-[case testYieldExpression]
-def f():
- x = yield f()
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Block:1(
- AssignmentStmt:2(
- NameExpr(x)
- YieldExpr:2(
- CallExpr:2(
- NameExpr(f)
- Args()))))))
-
-[case testForWithSingleItemTuple]
-for x in 1,: pass
-[out]
-MypyFile:1(
- ForStmt:1(
- NameExpr(x)
- TupleExpr:1(
- IntExpr(1))
- Block:1(
- PassStmt:1())))
-
-[case testIsoLatinUnixEncoding]
-# coding: iso-latin-1-unix
-[out]
-MypyFile:1()
-
-[case testLatinUnixEncoding]
-# coding: latin-1-unix
-[out]
-MypyFile:1()
-
-[case testLatinUnixEncoding]
-# coding: iso-latin-1
-[out]
-MypyFile:1()
-
-[case testYieldExpressionInParens]
-def f():
- (yield)
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Block:1(
- ExpressionStmt:2(
- YieldExpr:2()))))
diff --git a/test-data/unit/python2eval.test b/test-data/unit/python2eval.test
deleted file mode 100644
index 12fa5a6..0000000
--- a/test-data/unit/python2eval.test
+++ /dev/null
@@ -1,471 +0,0 @@
--- Test cases for type checking mypy programs using full stubs and running
--- using CPython (Python 2 mode).
---
--- These are mostly regression tests -- no attempt is made to make these
--- complete.
-
-
-[case testAbs2_python2]
-n = None # type: int
-f = None # type: float
-n = abs(1)
-abs(1) + 'x' # Error
-f = abs(1.1)
-abs(1.1) + 'x' # Error
-[out]
-_program.py:4: error: Unsupported operand types for + ("int" and "str")
-_program.py:6: error: Unsupported operand types for + ("float" and "str")
-
-[case testUnicode_python2]
-x = unicode('xyz', 'latin1')
-print x
-x = u'foo'
-print repr(x)
-[out]
-xyz
-u'foo'
-
-[case testXrangeAndRange_python2]
-for i in xrange(2):
- print i
-for i in range(3):
- print i
-[out]
-0
-1
-0
-1
-2
-
-[case testIterator_python2]
-import typing, sys
-x = iter('bar')
-print x.next(), x.next()
-[out]
-b a
-
-[case testEncodeAndDecode_python2]
-print 'a'.encode('latin1')
-print 'b'.decode('latin1')
-print u'c'.encode('latin1')
-print u'd'.decode('latin1')
-[out]
-a
-b
-c
-d
-
-[case testHasKey_python2]
-d = {1: 'x'}
-print d.has_key(1)
-print d.has_key(2)
-[out]
-True
-False
-
-[case testIntegerDivision_python2]
-x = 1 / 2
-x()
-[out]
-_program.py:2: error: "int" not callable
-
-[case testFloatDivision_python2]
-x = 1.0 / 2.0
-x = 1.0 / 2
-x = 1 / 2.0
-x = 1.5
-[out]
-
-[case testAnyStr_python2]
-from typing import AnyStr
-def f(x): # type: (AnyStr) -> AnyStr
- if isinstance(x, str):
- return 'foo'
- else:
- return u'zar'
-print f('')
-print f(u'')
-[out]
-foo
-zar
-
-[case testGenericPatterns_python2]
-from typing import Pattern
-import re
-p = None # type: Pattern[unicode]
-p = re.compile(u'foo*')
-b = None # type: Pattern[str]
-b = re.compile('foo*')
-print(p.match(u'fooo').group(0))
-[out]
-fooo
-
-[case testGenericMatch_python2]
-from typing import Match
-import re
-def f(m): # type: (Match[str]) -> None
- print(m.group(0))
-f(re.match('x*', 'xxy'))
-[out]
-xx
-
-[case testVariableLengthTuple_python2]
-from typing import Tuple, cast
-x = cast(Tuple[int, ...], ())
-print(x)
-[out]
-()
-
-[case testFromFuturePrintFunction_python2]
-from __future__ import print_function
-print('a', 'b')
-[out]
-a b
-
-[case testFromFutureImportUnicodeLiterals_python2]
-from __future__ import unicode_literals
-print '>', ['a', b'b', u'c']
-[out]
-> [u'a', 'b', u'c']
-
-[case testUnicodeLiteralsKwargs_python2]
-from __future__ import unicode_literals
-def f(**kwargs): # type: (...) -> None
- pass
-params = {'a': 'b'}
-f(**params)
-[out]
-
-[case testUnicodeStringKwargs_python2]
-def f(**kwargs): # type: (...) -> None
- pass
-params = {u'a': 'b'}
-f(**params)
-[out]
-
-[case testStrKwargs_python2]
-def f(**kwargs): # type: (...) -> None
- pass
-params = {'a': 'b'}
-f(**params)
-[out]
-
-[case testFromFutureImportUnicodeLiterals2_python2]
-from __future__ import unicode_literals
-def f(x: str) -> None: pass
-f(b'')
-f(u'')
-f('')
-[out]
-_program.py:4: error: Argument 1 to "f" has incompatible type "unicode"; expected "str"
-_program.py:5: error: Argument 1 to "f" has incompatible type "unicode"; expected "str"
-
-[case testStrUnicodeCompatibility_python2]
-import typing
-def f(s): # type: (unicode) -> None
- pass
-f(u'')
-f('')
-[out]
-
-[case testStrUnicodeCompatibilityInBuiltins_python2]
-import typing
-'x'.count('x')
-'x'.count(u'x')
-[out]
-
-[case testTupleAsSubtypeOfSequence_python2]
-from typing import TypeVar, Sequence
-T = TypeVar('T')
-def f(a): # type: (Sequence[T]) -> None
- print a
-f(tuple())
-[out]
-()
-
-[case testReadOnlyProperty_python2]
-import typing
-class A:
- @property
- def foo(self): # type: () -> int
- return 1
-print(A().foo + 2)
-[out]
-3
-
-[case testIOTypes_python2]
-from typing import IO, TextIO, BinaryIO, Any
-class X(IO[str]): pass
-class Y(TextIO): pass
-class Z(BinaryIO): pass
-[out]
-
-[case testOpenReturnType_python2]
-import typing
-f = open('/tmp/xyz', 'w')
-f.write(u'foo')
-f.write('bar')
-f.close()
-[out]
-_program.py:3: error: Argument 1 to "write" of "IO" has incompatible type "unicode"; expected "str"
-
-[case testPrintFunctionWithFileArg_python2]
-from __future__ import print_function
-import typing
-if 1 == 2: # Don't want to run the code below, since it would create a file.
- f = open('/tmp/xyz', 'w')
- print('foo', file=f)
- f.close()
-print('ok')
-[out]
-ok
-
-[case testStringIO_python2]
-import typing
-import io
-c = io.StringIO()
-c.write(u'\x89')
-print(repr(c.getvalue()))
-[out]
-u'\x89'
-
-[case testBytesIO_python2]
-import typing
-import io
-c = io.BytesIO()
-c.write('\x89')
-print(repr(c.getvalue()))
-[out]
-'\x89'
-
-[case testTextIOWrapper_python2]
-import typing
-import io
-b = io.BytesIO(u'\xab'.encode('utf8'))
-w = io.TextIOWrapper(b, encoding='utf8')
-print(repr(w.read()))
-[out]
-u'\xab'
-
-[case testIoOpen_python2]
-import typing
-import io
-if 1 == 2: # Only type check, do not execute
- f = io.open('/tmp/xyz', 'w', encoding='utf8')
- f.write(u'\xab')
- f.close()
-print 'ok'
-[out]
-ok
-
-[case testUnionType_python2]
-from typing import Union
-y = None # type: Union[int, str]
-def f(x): # type: (Union[int, str]) -> str
- if isinstance(x, int):
- x = str(x)
- return x
-print f(12)
-print f('ab')
-[out]
-12
-ab
-
-[case testStrAdd_python2]
-import typing
-s = ''
-u = u''
-n = 0
-n = s + '' # E
-s = s + u'' # E
-[out]
-_program.py:5: error: Incompatible types in assignment (expression has type "str", variable has type "int")
-_program.py:6: error: Incompatible types in assignment (expression has type "unicode", variable has type "str")
-
-[case testStrJoin_python2]
-import typing
-s = ''
-u = u''
-n = 0
-n = ''.join(['']) # Error
-s = ''.join([u'']) # Error
-[out]
-_program.py:5: error: Incompatible types in assignment (expression has type "str", variable has type "int")
-_program.py:6: error: Incompatible types in assignment (expression has type "unicode", variable has type "str")
-
-[case testNamedTuple_python2]
-import typing
-from collections import namedtuple
-X = namedtuple('X', ['a', 'b'])
-x = X(a=1, b='s')
-print x.a, x.b
-[out]
-1 s
-
-[case testNamedTupleError_python2]
-import typing
-from collections import namedtuple
-X = namedtuple('X', ['a', 'b'])
-x = X(a=1, b='s')
-x.c
-[out]
-_program.py:5: error: "X" has no attribute "c"
-
-[case testAssignToComplexReal_python2]
-import typing
-x = 4j
-y = x.real
-y = x # Error
-x.imag = 2.0 # Error
-[out]
-_program.py:4: error: Incompatible types in assignment (expression has type "complex", variable has type "float")
-_program.py:5: error: Property "imag" defined in "complex" is read-only
-
-[case testComplexArithmetic_python2]
-import typing
-print 5 + 8j
-print 3j * 2.0
-print 4j / 2.0
-[out]
-(5+8j)
-6j
-2j
-
-[case testNamedTupleWithTypes_python2]
-from typing import NamedTuple
-N = NamedTuple('N', [('a', int), ('b', str)])
-n = N(1, 'x')
-print n
-a, b = n
-print a, b
-print n[0]
-[out]
-N(a=1, b='x')
-1 x
-1
-
-[case testUnionTypeAlias_python2]
-from typing import Union
-U = Union[int, str]
-u = 1 # type: U
-u = 1.1
-[out]
-_program.py:4: error: Incompatible types in assignment (expression has type "float", variable has type "Union[int, str]")
-
-[case testSuperNew_python2]
-from typing import Dict, Any
-class MyType(type):
- def __new__(cls, name, bases, namespace):
- # type: (str, tuple, Dict[str, Any]) -> type
- return super(MyType, cls).__new__(cls, name + 'x', bases, namespace)
-class A(object):
- __metaclass__ = MyType
-print(type(A()).__name__)
-[out]
-Ax
-
-[case testSequenceIndexAndCount_python2]
-from typing import Sequence
-def f(x): # type: (Sequence[int]) -> None
- print(x.index(1))
- print(x.count(1))
-f([0, 0, 1, 1, 1])
-[out]
-2
-3
-
-[case testOptional_python2]
-from typing import Optional
-def f(): # type: () -> Optional[int]
- pass
-x = f()
-y = 1
-y = x
-
-[case testUnicodeAndOverloading_python2]
-from m import f
-f(1)
-f('')
-f(u'')
-f(b'')
-[file m.pyi]
-from typing import overload
- at overload
-def f(x: unicode) -> int: pass
- at overload
-def f(x: bytearray) -> int: pass
-[out]
-_program.py:2: error: No overload variant of "f" matches argument types [builtins.int]
-
-[case testByteArrayStrCompatibility_python2]
-def f(x): # type: (str) -> None
- pass
-f(bytearray('foo'))
-
-[case testAbstractProperty_python2]
-from abc import abstractproperty, ABCMeta
-class A:
- __metaclass__ = ABCMeta
- @abstractproperty
- def x(self): # type: () -> int
- pass
-class B(A):
- @property
- def x(self): # type: () -> int
- return 3
-b = B()
-print b.x + 1
-[out]
-4
-
-[case testReModuleBytesPython2]
-# Regression tests for various overloads in the re module -- bytes version
-import re
-if False:
- bre = b'a+'
- bpat = re.compile(bre)
- bpat = re.compile(bpat)
- re.search(bre, b'').groups()
- re.search(bre, u'')
- re.search(bpat, b'').groups()
- re.search(bpat, u'')
- # match(), split(), findall(), finditer() are much the same, so skip those.
- # sub(), subn() have more overloads and we are checking these:
- re.sub(bre, b'', b'') + b''
- re.sub(bpat, b'', b'') + b''
- re.sub(bre, lambda m: b'', b'') + b''
- re.sub(bpat, lambda m: b'', b'') + b''
- re.subn(bre, b'', b'')[0] + b''
- re.subn(bpat, b'', b'')[0] + b''
- re.subn(bre, lambda m: b'', b'')[0] + b''
- re.subn(bpat, lambda m: b'', b'')[0] + b''
-[out]
-
-[case testReModuleStringPython2]
-# Regression tests for various overloads in the re module -- string version
-import re
-ure = u'a+'
-upat = re.compile(ure)
-upat = re.compile(upat)
-re.search(ure, u'a').groups()
-re.search(ure, b'') # This ought to be an error, but isn't because of bytes->unicode equivalence
-re.search(upat, u'a').groups()
-re.search(upat, b'') # This ought to be an error, but isn't because of bytes->unicode equivalence
-# match(), split(), findall(), finditer() are much the same, so skip those.
-# sus(), susn() have more overloads and we are checking these:
-re.sub(ure, u'', u'') + u''
-re.sub(upat, u'', u'') + u''
-re.sub(ure, lambda m: u'', u'') + u''
-re.sub(upat, lambda m: u'', u'') + u''
-re.subn(ure, u'', u'')[0] + u''
-re.subn(upat, u'', u'')[0] + u''
-re.subn(ure, lambda m: u'', u'')[0] + u''
-re.subn(upat, lambda m: u'', u'')[0] + u''
-[out]
-
-[case testYieldRegressionTypingAwaitable_python2]
-# Make sure we don't reference typing.Awaitable in Python 2 mode.
-def g() -> int:
- yield
-[out]
-_program.py:2: error: The return type of a generator function should be "Generator" or one of its supertypes
diff --git a/test-data/unit/pythoneval-asyncio.test b/test-data/unit/pythoneval-asyncio.test
deleted file mode 100644
index 6d16903..0000000
--- a/test-data/unit/pythoneval-asyncio.test
+++ /dev/null
@@ -1,486 +0,0 @@
--- Test cases for type checking mypy programs using full stubs and running
--- using CPython.
---
--- These are mostly regression tests -- no attempt is made to make these
--- complete.
---
--- This test file check Asyncio and yield from interaction
-
-[case testImportAsyncio]
-import asyncio
-print('Imported')
-[out]
-Imported
-
-[case testSimpleCoroutineSleep]
-from typing import Any, Generator
-import asyncio
-from asyncio import Future
-
- at asyncio.coroutine
-def greet_every_two_seconds() -> 'Generator[Any, None, None]':
- n = 0
- while n < 5:
- print('Prev', n)
- yield from asyncio.sleep(0.1)
- print('After', n)
- n += 1
-
-loop = asyncio.get_event_loop()
-try:
- loop.run_until_complete(greet_every_two_seconds())
-finally:
- loop.close()
-[out]
-Prev 0
-After 0
-Prev 1
-After 1
-Prev 2
-After 2
-Prev 3
-After 3
-Prev 4
-After 4
-
-[case testCoroutineCallingOtherCoroutine]
-from typing import Generator, Any
-import asyncio
-from asyncio import Future
-
- at asyncio.coroutine
-def compute(x: int, y: int) -> 'Generator[Any, None, int]':
- print("Compute %s + %s ..." % (x, y))
- yield from asyncio.sleep(0.1)
- return x + y # Here the int is wrapped in Future[int]
-
- at asyncio.coroutine
-def print_sum(x: int, y: int) -> 'Generator[Any, None, None]':
- result = yield from compute(x, y) # The type of result will be int (is extracted from Future[int]
- print("%s + %s = %s" % (x, y, result))
-
-loop = asyncio.get_event_loop()
-loop.run_until_complete(print_sum(1, 2))
-loop.close()
-[out]
-Compute 1 + 2 ...
-1 + 2 = 3
-
-[case testCoroutineChangingFuture]
-from typing import Generator, Any
-import asyncio
-from asyncio import Future
-
- at asyncio.coroutine
-def slow_operation(future: 'Future[str]') -> 'Generator[Any, None, None]':
- yield from asyncio.sleep(0.1)
- future.set_result('Future is done!')
-
-loop = asyncio.get_event_loop()
-future = asyncio.Future() # type: Future[str]
-asyncio.Task(slow_operation(future))
-loop.run_until_complete(future)
-print(future.result())
-loop.close()
-[out]
-Future is done!
-
-[case testFunctionAssignedAsCallback]
-import typing
-from typing import Generator, Any
-import asyncio
-from asyncio import Future, AbstractEventLoop
-
- at asyncio.coroutine
-def slow_operation(future: 'Future[str]') -> 'Generator[Any, None, None]':
- yield from asyncio.sleep(1)
- future.set_result('Callback works!')
-
-def got_result(future: 'Future[str]') -> None:
- print(future.result())
- loop.stop()
-
-loop = asyncio.get_event_loop() # type: AbstractEventLoop
-future = asyncio.Future() # type: Future[str]
-asyncio.Task(slow_operation(future)) # Here create a task with the function. (The Task need a Future[T] as first argument)
-future.add_done_callback(got_result) # and assign the callback to the future
-try:
- loop.run_forever()
-finally:
- loop.close()
-[out]
-Callback works!
-
-[case testMultipleTasks]
-import typing
-from typing import Generator, Any
-import asyncio
-from asyncio import Task, Future
- at asyncio.coroutine
-def factorial(name, number) -> 'Generator[Any, None, None]':
- f = 1
- for i in range(2, number+1):
- print("Task %s: Compute factorial(%s)..." % (name, i))
- yield from asyncio.sleep(0.1)
- f *= i
- print("Task %s: factorial(%s) = %s" % (name, number, f))
-
-loop = asyncio.get_event_loop()
-tasks = [
- asyncio.Task(factorial("A", 2)),
- asyncio.Task(factorial("B", 3)),
- asyncio.Task(factorial("C", 4))]
-loop.run_until_complete(asyncio.wait(tasks))
-loop.close()
-[out]
-Task A: Compute factorial(2)...
-Task B: Compute factorial(2)...
-Task C: Compute factorial(2)...
-Task A: factorial(2) = 2
-Task B: Compute factorial(3)...
-Task C: Compute factorial(3)...
-Task B: factorial(3) = 6
-Task C: Compute factorial(4)...
-Task C: factorial(4) = 24
-
-
-[case testConcatenatedCoroutines]
-import typing
-from typing import Generator, Any
-import asyncio
-from asyncio import Future
-
- at asyncio.coroutine
-def h4() -> 'Generator[Any, None, int]':
- x = yield from future
- return x
-
- at asyncio.coroutine
-def h3() -> 'Generator[Any, None, int]':
- x = yield from h4()
- print("h3: %s" % x)
- return x
-
- at asyncio.coroutine
-def h2() -> 'Generator[Any, None, int]':
- x = yield from h3()
- print("h2: %s" % x)
- return x
-
- at asyncio.coroutine
-def h() -> 'Generator[Any, None, None]':
- x = yield from h2()
- print("h: %s" % x)
-
-loop = asyncio.get_event_loop()
-future = asyncio.Future() # type: Future[int]
-future.set_result(42)
-loop.run_until_complete(h())
-print("Outside %s" % future.result())
-loop.close()
-[out]
-h3: 42
-h2: 42
-h: 42
-Outside 42
-
-[case testConcatenatedCoroutinesReturningFutures]
-import typing
-from typing import Generator, Any
-import asyncio
-from asyncio import Future
-
- at asyncio.coroutine
-def h4() -> 'Generator[Any, None, Future[int]]':
- yield from asyncio.sleep(0.1)
- f = asyncio.Future() #type: Future[int]
- return f
-
- at asyncio.coroutine
-def h3() -> 'Generator[Any, None, Future[Future[int]]]':
- x = yield from h4()
- x.set_result(42)
- f = asyncio.Future() #type: Future[Future[int]]
- f.set_result(x)
- return f
-
- at asyncio.coroutine
-def h() -> 'Generator[Any, None, None]':
- print("Before")
- x = yield from h3()
- y = yield from x
- z = yield from y
- print(z)
- def normalize(future):
- # The str conversion seems inconsistent; not sure exactly why. Normalize
- # the result.
- return str(future).replace('<Future finished ', 'Future<')
- print(normalize(y))
- print(normalize(x))
-
-loop = asyncio.get_event_loop()
-loop.run_until_complete(h())
-loop.close()
-[out]
-Before
-42
-Future<result=42>
-Future<result=Future<result=42>>
-
-
-[case testCoroutineWithOwnClass]
-import typing
-from typing import Generator, Any
-import asyncio
-from asyncio import Future
-
-class A:
- def __init__(self, x: int) -> None:
- self.x = x
-
- at asyncio.coroutine
-def h() -> 'Generator[Any, None, None]':
- x = yield from future
- print("h: %s" % x.x)
-
-loop = asyncio.get_event_loop()
-future = asyncio.Future() # type: Future[A]
-future.set_result(A(42))
-loop.run_until_complete(h())
-print("Outside %s" % future.result().x)
-loop.close()
-[out]
-h: 42
-Outside 42
-
-
--- Errors
-
-[case testErrorAssigningCoroutineThatDontReturn]
-from typing import Generator, Any
-import asyncio
-from asyncio import Future
-
- at asyncio.coroutine
-def greet() -> 'Generator[Any, None, None]':
- yield from asyncio.sleep(0.2)
- print('Hello World')
-
- at asyncio.coroutine
-def test() -> 'Generator[Any, None, None]':
- yield from greet()
- x = yield from greet() # Error
-
-loop = asyncio.get_event_loop()
-try:
- loop.run_until_complete(test())
-finally:
- loop.close()
-[out]
-_program.py:13: error: Function does not return a value
-
-[case testErrorReturnIsNotTheSameType]
-from typing import Generator, Any
-import asyncio
-from asyncio import Future
-
- at asyncio.coroutine
-def compute(x: int, y: int) -> 'Generator[Any, None, int]':
- print("Compute %s + %s ..." % (x, y))
- yield from asyncio.sleep(0.1)
- return str(x + y) # Error
-
- at asyncio.coroutine
-def print_sum(x: int, y: int) -> 'Generator[Any, None, None]':
- result = yield from compute(x, y)
- print("%s + %s = %s" % (x, y, result))
-
-loop = asyncio.get_event_loop()
-loop.run_until_complete(print_sum(1, 2))
-loop.close()
-
-[out]
-_program.py:9: error: Incompatible return value type (got "str", expected "int")
-
-[case testErrorSetFutureDifferentInternalType]
-from typing import Generator, Any
-import asyncio
-from asyncio import Future
-
- at asyncio.coroutine
-def slow_operation(future: 'Future[str]') -> 'Generator[Any, None, None]':
- yield from asyncio.sleep(1)
- future.set_result(42) # Error
-
-loop = asyncio.get_event_loop()
-future = asyncio.Future() # type: Future[str]
-asyncio.Task(slow_operation(future))
-loop.run_until_complete(future)
-print(future.result())
-loop.close()
-[out]
-_program.py:8: error: Argument 1 to "set_result" of "Future" has incompatible type "int"; expected "str"
-
-
-[case testErrorUsingDifferentFutureType]
-from typing import Any, Generator
-import asyncio
-from asyncio import Future
-
- at asyncio.coroutine
-def slow_operation(future: 'Future[int]') -> 'Generator[Any, None, None]':
- yield from asyncio.sleep(1)
- future.set_result(42)
-
-loop = asyncio.get_event_loop()
-future = asyncio.Future() # type: Future[str]
-asyncio.Task(slow_operation(future)) # Error
-loop.run_until_complete(future)
-print(future.result())
-loop.close()
-[out]
-_program.py:12: error: Argument 1 to "slow_operation" has incompatible type Future[str]; expected Future[int]
-
-[case testErrorUsingDifferentFutureTypeAndSetFutureDifferentInternalType]
-from typing import Generator, Any
-import asyncio
-from asyncio import Future
-
-asyncio.coroutine
-def slow_operation(future: 'Future[int]') -> 'Generator[Any, None, None]':
- yield from asyncio.sleep(1)
- future.set_result('42') #Try to set an str as result to a Future[int]
-
-loop = asyncio.get_event_loop()
-future = asyncio.Future() # type: Future[str]
-asyncio.Task(slow_operation(future)) # Error
-loop.run_until_complete(future)
-print(future.result())
-loop.close()
-[out]
-_program.py:8: error: Argument 1 to "set_result" of "Future" has incompatible type "str"; expected "int"
-_program.py:12: error: Argument 1 to "slow_operation" has incompatible type Future[str]; expected Future[int]
-
-[case testErrorSettingCallbackWithDifferentFutureType]
-import typing
-from typing import Generator, Any
-import asyncio
-from asyncio import Future, AbstractEventLoop
-
- at asyncio.coroutine
-def slow_operation(future: 'Future[str]') -> 'Generator[Any, None, None]':
- yield from asyncio.sleep(1)
- future.set_result('Future is done!')
-
-def got_result(future: 'Future[int]') -> None:
- print(future.result())
- loop.stop()
-
-loop = asyncio.get_event_loop() # type: AbstractEventLoop
-future = asyncio.Future() # type: Future[str]
-asyncio.Task(slow_operation(future))
-future.add_done_callback(got_result) # Error
-
-try:
- loop.run_forever()
-finally:
- loop.close()
-[out]
-_program.py:18: error: Argument 1 to "add_done_callback" of "Future" has incompatible type Callable[[Future[int]], None]; expected Callable[[Future[str]], Any]
-
-[case testErrorOneMoreFutureInReturnType]
-import typing
-from typing import Any, Generator
-import asyncio
-from asyncio import Future
-
- at asyncio.coroutine
-def h4() -> 'Generator[Any, None, Future[int]]':
- yield from asyncio.sleep(1)
- f = asyncio.Future() #type: Future[int]
- return f
-
- at asyncio.coroutine
-def h3() -> 'Generator[Any, None, Future[Future[Future[int]]]]':
- x = yield from h4()
- x.set_result(42)
- f = asyncio.Future() #type: Future[Future[int]]
- f.set_result(x)
- return f
-
- at asyncio.coroutine
-def h() -> 'Generator[Any, None, None]':
- print("Before")
- x = yield from h3()
- y = yield from x
- z = yield from y
- print(z)
- print(y)
- print(x)
-
-loop = asyncio.get_event_loop()
-loop.run_until_complete(h())
-loop.close()
-[out]
-_program.py:18: error: Incompatible return value type (got Future[Future[int]], expected Future[Future[Future[int]]])
-
-[case testErrorOneLessFutureInReturnType]
-import typing
-from typing import Any, Generator
-import asyncio
-from asyncio import Future
-
- at asyncio.coroutine
-def h4() -> 'Generator[Any, None, Future[int]]':
- yield from asyncio.sleep(1)
- f = asyncio.Future() #type: Future[int]
- return f
-
- at asyncio.coroutine
-def h3() -> 'Generator[Any, None, Future[int]]':
- x = yield from h4()
- x.set_result(42)
- f = asyncio.Future() #type: Future[Future[int]]
- f.set_result(x)
- return f
-
- at asyncio.coroutine
-def h() -> 'Generator[Any, None, None]':
- print("Before")
- x = yield from h3()
- y = yield from x
- print(y)
- print(x)
-
-loop = asyncio.get_event_loop()
-loop.run_until_complete(h())
-loop.close()
-[out]
-_program.py:18: error: Incompatible return value type (got Future[Future[int]], expected Future[int])
-
-[case testErrorAssignmentDifferentType]
-import typing
-from typing import Generator, Any
-import asyncio
-from asyncio import Future
-
-class A:
- def __init__(self, x: int) -> None:
- self.x = x
-
-class B:
- def __init__(self, x: int) -> None:
- self.x = x
-
- at asyncio.coroutine
-def h() -> 'Generator[Any, None, None]':
- x = yield from future # type: B # Error
- print("h: %s" % x.x)
-
-loop = asyncio.get_event_loop()
-future = asyncio.Future() # type: Future[A]
-future.set_result(A(42))
-loop.run_until_complete(h())
-loop.close()
-[out]
-_program.py:16: error: Incompatible types in assignment (expression has type "A", variable has type "B")
diff --git a/test-data/unit/pythoneval-enum.test b/test-data/unit/pythoneval-enum.test
deleted file mode 100644
index 3ae2df5..0000000
--- a/test-data/unit/pythoneval-enum.test
+++ /dev/null
@@ -1,134 +0,0 @@
--- Test cases for type checking mypy programs using full stubs and running
--- using CPython.
---
--- These are mostly regression tests -- no attempt is made to make these
--- complete.
---
--- This test file checks Enum
-
-[case testEnumBasics]
-from enum import Enum
-class Medal(Enum):
- gold = 1
- silver = 2
- bronze = 3
-m = Medal.gold
-m = 1
-[out]
-_program.py:7: error: Incompatible types in assignment (expression has type "int", variable has type "Medal")
-
-[case testEnumNameAndValue]
-from enum import Enum
-class Truth(Enum):
- true = True
- false = False
-x = ''
-x = Truth.true.name
-print(Truth.true.name)
-print(Truth.false.value)
-[out]
-true
-False
-
-[case testEnumUnique]
-import enum
- at enum.unique
-class E(enum.Enum):
- x = 1
- y = 1 # NOTE: This duplicate value is not detected by mypy at the moment
-x = 1
-x = E.x
-[out]
-_program.py:7: error: Incompatible types in assignment (expression has type "E", variable has type "int")
-
-[case testIntEnum_assignToIntVariable]
-from enum import IntEnum
-class N(IntEnum):
- x = 1
- y = 1
-n = 1
-n = N.x # Subclass of int, so it's okay
-s = ''
-s = N.y
-[out]
-_program.py:8: error: Incompatible types in assignment (expression has type "N", variable has type "str")
-
-[case testIntEnum_functionTakingIntEnum]
-from enum import IntEnum
-class SomeIntEnum(IntEnum):
- x = 1
-def takes_some_int_enum(n: SomeIntEnum):
- pass
-takes_some_int_enum(SomeIntEnum.x)
-takes_some_int_enum(1) # Error
-takes_some_int_enum(SomeIntEnum(1)) # How to deal with the above
-[out]
-_program.py:7: error: Argument 1 to "takes_some_int_enum" has incompatible type "int"; expected "SomeIntEnum"
-
-[case testIntEnum_functionTakingInt]
-from enum import IntEnum
-class SomeIntEnum(IntEnum):
- x = 1
-def takes_int(i: int):
- pass
-takes_int(SomeIntEnum.x)
-takes_int(2)
-
-[case testIntEnum_functionReturningIntEnum]
-from enum import IntEnum
-class SomeIntEnum(IntEnum):
- x = 1
-def returns_some_int_enum() -> SomeIntEnum:
- return SomeIntEnum.x
-an_int = 1
-an_int = returns_some_int_enum()
-
-an_enum = SomeIntEnum.x
-an_enum = returns_some_int_enum()
-[out]
-
-[case testEnumMethods]
-from enum import Enum
-
-class Color(Enum):
- red = 1
- green = 2
-
- def m(self, x: int): pass
- @staticmethod
- def m2(x: int): pass
-
-Color.red.m('')
-Color.m2('')
-[out]
-_program.py:11: error: Argument 1 to "m" of "Color" has incompatible type "str"; expected "int"
-_program.py:12: error: Argument 1 to "m2" of "Color" has incompatible type "str"; expected "int"
-
-[case testIntEnum_ExtendedIntEnum_functionTakingExtendedIntEnum]
-from enum import IntEnum
-class ExtendedIntEnum(IntEnum):
- pass
-class SomeExtIntEnum(ExtendedIntEnum):
- x = 1
-
-def takes_int(i: int):
- pass
-takes_int(SomeExtIntEnum.x)
-
-def takes_some_ext_int_enum(s: SomeExtIntEnum):
- pass
-takes_some_ext_int_enum(SomeExtIntEnum.x)
-
-
-[case testNamedTupleEnum]
-from typing import NamedTuple
-from enum import Enum
-
-N = NamedTuple('N', [('bar', int)])
-
-class E(N, Enum):
- X = N(1)
-
-def f(x: E) -> None: pass
-
-f(E.X)
diff --git a/test-data/unit/pythoneval.test b/test-data/unit/pythoneval.test
deleted file mode 100644
index 7945fe5..0000000
--- a/test-data/unit/pythoneval.test
+++ /dev/null
@@ -1,1214 +0,0 @@
--- Test cases for type checking mypy programs using full stubs and running
--- using CPython.
---
--- These are mostly regression tests -- no attempt is made to make these
--- complete.
-
-
-[case testHello]
-import typing
-print('hello, world')
-[out]
-hello, world
-
--- Skipped because different typing package versions have different repr()s.
-[case testAbstractBaseClasses-skip]
-import re
-from typing import Sized, Sequence, Iterator, Iterable, Mapping, AbstractSet
-
-def check(o, t):
- rep = re.sub('0x[0-9a-fA-F]+', '0x...', repr(o))
- rep = rep.replace('sequenceiterator', 'str_iterator')
- trep = str(t).replace('_abcoll.Sized', 'collections.abc.Sized')
- print(rep, trep, isinstance(o, t))
-
-def f():
- check('x', Sized)
- check([1], Sequence)
- check({1:3}, Sequence)
- check(iter('x'), Iterator)
- check('x', Iterable)
- check({}, Mapping)
- check(set([1]), AbstractSet)
-
-f()
-[out]
-'x' <class 'collections.abc.Sized'> True
-[1] typing.Sequence True
-{1: 3} typing.Sequence False
-<str_iterator object at 0x...> typing.Iterator True
-'x' typing.Iterable True
-{} typing.Mapping True
-{1} typing.AbstractSet True
-
-[case testSized]
-from typing import Sized
-class A(Sized):
- def __len__(self): return 5
-print(len(A()))
-[out]
-5
-
-[case testReversed]
-from typing import Reversible
-class A(Reversible):
- def __iter__(self): return iter('oof')
- def __reversed__(self): return iter('foo')
-print(list(reversed(range(5))))
-print(list(reversed([1,2,3])))
-print(list(reversed('abc')))
-print(list(reversed(A())))
-[out]
--- Duplicate [ at line beginning.
-[[4, 3, 2, 1, 0]
-[[3, 2, 1]
-[['c', 'b', 'a']
-[['f', 'o', 'o']
-
-[case testIntAndFloatConversion]
-from typing import SupportsInt, SupportsFloat
-class A(SupportsInt):
- def __int__(self): return 5
-class B(SupportsFloat):
- def __float__(self): return 1.2
-print(int(1))
-print(int(6.2))
-print(int('3'))
-print(int(b'4'))
-print(int(A()))
-print(float(-9))
-print(float(B()))
-[out]
-1
-6
-3
-4
-5
--9.0
-1.2
-
-[case testAbs]
-from typing import SupportsAbs
-class A(SupportsAbs[float]):
- def __abs__(self) -> float: return 5.5
-
-print(abs(-1))
-print(abs(-1.2))
-print(abs(A()))
-[out]
-1
-1.2
-5.5
-
-[case testAbs2]
-
-n = None # type: int
-f = None # type: float
-n = abs(1)
-abs(1) + 'x' # Error
-f = abs(1.1)
-abs(1.1) + 'x' # Error
-[out]
-_program.py:5: error: Unsupported operand types for + ("int" and "str")
-_program.py:7: error: Unsupported operand types for + ("float" and "str")
-
-[case testRound]
-from typing import SupportsRound
-class A(SupportsRound):
- def __round__(self, ndigits=0): return 'x%d' % ndigits
-print(round(1.6))
-print(round(A()))
-print(round(A(), 2))
-[out]
-2
-x0
-x2
-
-[case testCallMethodViaTypeObject]
-import typing
-print(list.__add__([1, 2], [3, 4]))
-[out]
-[[1, 2, 3, 4]
-
-[case testClassDataAttribute]
-import typing
-class A:
- x = 0
-print(A.x)
-A.x += 1
-print(A.x)
-[out]
-0
-1
-
-[case testInheritedClassAttribute]
-import typing
-class A:
- x = 1
- def f(self) -> None: print('f')
-class B(A):
- pass
-B.f(None)
-print(B.x)
-[out]
-f
-1
-
-[case testFunctionDecorator]
-from typing import TypeVar, cast
-ftype = TypeVar('ftype')
-def logged(f: ftype) -> ftype:
- def g(*args, **kwargs):
- print('enter', f.__name__)
- r = f(*args, **kwargs)
- print('exit', f.__name__)
- return r
- return cast(ftype, g)
-
- at logged
-def foo(s: str) -> str:
- print('foo', s)
- return s + '!'
-
-print(foo('y'))
-print(foo('x'))
-[out]
-enter foo
-foo y
-exit foo
-y!
-enter foo
-foo x
-exit foo
-x!
-
-[case testModuleAttributes]
-import math
-import typing
-print(math.__name__)
-print(type(math.__dict__))
-print(type(math.__doc__ or ''))
-print(math.__class__)
-[out]
-math
-<class 'dict'>
-<class 'str'>
-<class 'module'>
-
-[case testSpecialAttributes]
-import typing
-class A: pass
-print(object().__doc__)
-print(A().__class__)
-[out]
-The most base type
-<class '__main__.A'>
-
-[case testFunctionAttributes]
-import typing
-ord.__class__
-print(type(ord.__doc__ + ''))
-print(ord.__name__)
-print(ord.__module__)
-[out]
-<class 'str'>
-ord
-builtins
-
-[case testTypeAttributes]
-import typing
-print(str.__class__)
-print(type(str.__doc__))
-print(str.__name__)
-print(str.__module__)
-print(str.__dict__ is not None)
-[out]
-<class 'type'>
-<class 'str'>
-str
-builtins
-True
-
-[case testBoolCompatibilityWithInt]
-import typing
-x = 0
-x = True
-print(bool('x'))
-print(bool(''))
-[out]
-True
-False
-
-[case testCallBuiltinTypeObjectsWithoutArguments]
-import typing
-print(int())
-print(repr(str()))
-print(repr(bytes()))
-print(float())
-print(bool())
-[out]
-0
-''
-b''
-0.0
-False
-
-[case testIntegerDivision]
-import typing
-x = 1 / 2
-x = 1.5
-[out]
-
-[case testStaticmethod]
-import typing
-class A:
- @staticmethod
- def f(x: str) -> int: return int(x)
-print(A.f('12'))
-print(A().f('34'))
-[out]
-12
-34
-
-[case testClassmethod]
-import typing
-class A:
- @classmethod
- def f(cls, x: str) -> int: return int(x)
-print(A.f('12'))
-print(A().f('34'))
-[out]
-12
-34
-
-[case testIntMethods]
-import typing
-print(int.from_bytes(b'ab', 'big'))
-n = 0
-print(n.from_bytes(b'ac', 'big'))
-print(n.from_bytes([2, 3], 'big'))
-print(n.to_bytes(2, 'big'))
-[out]
-24930
-24931
-515
-b'\x00\x00'
-
-[case testFloatMethods]
-import typing
-print(1.5.as_integer_ratio())
-print(1.5.hex())
-print(2.0.is_integer())
-print(float.fromhex('0x1.8'))
-[out]
-(3, 2)
-0x1.8000000000000p+0
-True
-1.5
-
-[case testArray]
-import typing
-import array
-array.array('b', [1, 2])
-[out]
-
-[case testDictFromkeys]
-import typing
-d = dict.fromkeys('foo')
-d['x'] = 2
-d2 = dict.fromkeys([1, 2], b'')
-d2[2] = b'foo'
-[out]
-
-[case testReadOnlyProperty]
-class A:
- x = 2
- @property
- def f(self) -> int:
- return self.x + 1
-print(A().f)
-[out]
-3
-
-[case testIsinstanceWithTuple]
-from typing import cast, Any
-x = cast(Any, (1, 'x'))
-if isinstance(x, tuple):
- print(x[0], x[1])
-[out]
-1 x
-
-[case testTypevarValues]
-from typing import TypeVar
-T = TypeVar('T', str, bytes)
-def f(x: T) -> T:
- if isinstance(x, str):
- return 'foo'
- else:
- return b'bar'
-print(f(''))
-print(f(b''))
-[out]
-foo
-b'bar'
-
-[case testAnyStr]
-from typing import AnyStr
-def f(x: AnyStr) -> AnyStr:
- if isinstance(x, str):
- return 'foo'
- else:
- return b'zar'
-print(f(''))
-print(f(b''))
-[out]
-foo
-b'zar'
-
-[case testNameNotImportedFromTyping]
-import typing
-cast(int, 2)
-[out]
-_program.py:2: error: Name 'cast' is not defined
-
-[case testBinaryIOType]
-from typing import BinaryIO
-def f(f: BinaryIO) -> None:
- f.write(b'foo')
- f.write(bytearray(b'foo'))
-[out]
-
-[case testIOTypes]
-from typing import IO
-import sys
-def txt(f: IO[str]) -> None:
- f.write('foo')
- f.write(b'foo')
-def bin(f: IO[bytes]) -> None:
- f.write(b'foo')
- f.write(bytearray(b'foo'))
-txt(sys.stdout)
-bin(sys.stdout)
-[out]
-_program.py:5: error: Argument 1 to "write" of "IO" has incompatible type "bytes"; expected "str"
-_program.py:10: error: Argument 1 to "bin" has incompatible type "TextIO"; expected IO[bytes]
-
-[case testBuiltinOpen]
-f = open('x')
-f.write('x')
-f.write(b'x')
-f.foobar()
-[out]
-_program.py:4: error: IO[Any] has no attribute "foobar"
-
-[case testGenericPatterns]
-from typing import Pattern
-import re
-p = None # type: Pattern[str]
-p = re.compile('foo*')
-b = None # type: Pattern[bytes]
-b = re.compile(b'foo*')
-print(p.match('fooo').group(0))
-[out]
-fooo
-
-[case testGenericMatch]
-from typing import Match
-import re
-def f(m: Match[bytes]) -> None:
- print(m.group(0))
-f(re.match(b'x*', b'xxy'))
-[out]
-b'xx'
-
-[case testMultipleTypevarsWithValues]
-from typing import TypeVar
-
-T = TypeVar('T', int, str)
-S = TypeVar('S', int, str)
-
-def f(t: T, s: S) -> None:
- t + s
-[out]
-_program.py:7: error: Unsupported operand types for + ("int" and "str")
-_program.py:7: error: Unsupported operand types for + ("str" and "int")
-
-[case testSystemExitCode]
-import typing
-print(SystemExit(5).code)
-[out]
-5
-
-[case testIntFloatDucktyping]
-
-x = None # type: float
-x = 2.2
-x = 2
-def f(x: float) -> None: pass
-f(1.1)
-f(1)
-[out]
-
-[case testsFloatOperations]
-import typing
-print(1.5 + 1.5)
-print(1.5 + 1)
-[out]
-3.0
-2.5
-
-[case testMathFunctionWithIntArgument]
-import typing
-import math
-math.sin(2)
-math.sin(2.2)
-
-[case testAbsReturnType]
-
-f = None # type: float
-n = None # type: int
-n = abs(2)
-f = abs(2.2)
-abs(2.2) + 'x'
-[out]
-_program.py:6: error: Unsupported operand types for + ("float" and "str")
-
-[case testROperatorMethods]
-
-b = None # type: bytes
-s = None # type: str
-s = b'foo' * 5 # Error
-b = 5 * b'foo'
-b = b'foo' * 5
-s = 5 * 'foo'
-s = 'foo' * 5
-[out]
-_program.py:4: error: Incompatible types in assignment (expression has type "bytes", variable has type "str")
-
-[case testROperatorMethods2]
-import typing
-print(2 / 0.5)
-print(' ', 2 * [3, 4])
-[out]
-4.0
- [3, 4, 3, 4]
-
-[case testNotImplemented]
-import typing
-class A:
- def __add__(self, x: int) -> int:
- if isinstance(x, int):
- return x + 1
- return NotImplemented
-class B:
- def __radd__(self, x: A) -> str:
- return 'x'
-print(A() + 1)
-print(A() + B())
-[out]
-2
-x
-
-[case testMappingMethods]
-# Regression test
-from typing import Mapping
-x = {'x': 'y'} # type: Mapping[str, str]
-print('x' in x)
-print('y' in x)
-[out]
-True
-False
-
-[case testOverlappingOperatorMethods]
-
-class X: pass
-class A:
- def __add__(self, x) -> int:
- if isinstance(x, X):
- return 1
- return NotImplemented
-class B:
- def __radd__(self, x: A) -> str: return 'x'
-class C(X, B): pass
-b = None # type: B
-b = C()
-print(A() + b)
-[out]
-_program.py:9: error: Signatures of "__radd__" of "B" and "__add__" of "A" are unsafely overlapping
-
-[case testBytesAndBytearrayComparisons]
-import typing
-print(b'ab' < bytearray(b'b'))
-print(bytearray(b'ab') < b'a')
-[out]
-True
-False
-
-[case testBytesAndBytearrayComparisons2]
-import typing
-'' < b''
-b'' < ''
-'' < bytearray()
-bytearray() < ''
-[out]
-_program.py:2: error: Unsupported operand types for > ("bytes" and "str")
-_program.py:3: error: Unsupported operand types for > ("str" and "bytes")
-_program.py:4: error: Unsupported operand types for > ("bytearray" and "str")
-_program.py:5: error: Unsupported operand types for > ("str" and "bytearray")
-
-[case testInplaceOperatorMethod]
-import typing
-a = [1]
-print('', a.__iadd__([2]))
-print('', a)
-[out]
- [1, 2]
- [1, 2]
-
-[case testListInplaceAdd]
-import typing
-a = [1]
-a += iter([2, 3])
-print(tuple(a))
-[out]
-(1, 2, 3)
-
-[case testListConcatenateWithIterable]
-import typing
-[1] + iter([2, 3])
-[out]
-_program.py:2: error: Unsupported operand types for + ("list" and Iterator[int])
-
-[case testInferHeterogeneousListOfIterables]
-from typing import Sequence
-s = ['x', 'y'] # type: Sequence[str]
-a = [['x', 'x'], 'fo', s, iter('foo'), {'aa'}]
-for i, x in enumerate(a):
- print(i, next(iter(x)))
-[out]
-0 x
-1 f
-2 x
-3 f
-4 aa
-
-[case testTextIOProperties]
-import typing
-import sys
-print(type(sys.stdin.encoding))
-print(type(sys.stdin.errors))
-sys.stdin.line_buffering
-sys.stdin.buffer
-sys.stdin.newlines
-[out]
-<class 'str'>
-<class 'str'>
-
-[case testIOProperties]
-import typing
-import sys
-print(sys.stdin.name)
-print(sys.stdin.buffer.mode)
-[out]
-<stdin>
-rb
-
-[case testSetUnion]
-import typing
-s = {'x', 'y'}
-print('>', sorted(s.union('foo')))
-[out]
-> ['f', 'o', 'x', 'y']
-
-[case testFromFuturePrintFunction]
-from __future__ import print_function
-print('a', 'b')
-[out]
-a b
-
-[case testLenOfTuple]
-import typing
-print(len((1, 'x')))
-[out]
-2
-
-[case testListMethods]
-import typing
-import sys
-l = [0, 1, 2, 3, 4]
-if sys.version >= '3.3':
- l.clear()
-else:
- l = []
-l.append(0)
-print('>', l)
-if sys.version >= '3.3':
- m = l.copy()
-else:
- m = l[:]
-m.extend([1, 2, 3, 4])
-print('>', m)
-print(l.index(0))
-print(l.index(0, 0))
-print(l.index(0, 0, 1))
-try:
- print(l.index(1))
- print('expected ValueError')
-except ValueError:
- pass
-l.insert(0, 1)
-print('>', l)
-print(l.pop(0))
-print(l.pop())
-m.remove(0)
-try:
- m.remove(0)
- print('expected ValueError')
-except ValueError:
- pass
-m.reverse()
-m.sort()
-m.sort(key=lambda x: -x)
-m.sort(reverse=False)
-m.sort(key=lambda x: -x, reverse=True)
-print('>', m)
-[out]
-> [0]
-> [0, 1, 2, 3, 4]
-0
-0
-0
-> [1, 0]
-1
-0
-> [1, 2, 3, 4]
-
-[case testListOperators]
-import typing
-l = [0, 1]
-print('+', l + [2])
-print('*', l * 2)
-print('*', 2 * l)
-print('in', 1 in l)
-print('==', l == [1, 2])
-print('!=', l != [1, 2])
-print('>', l > [1, 2, 3])
-print('>=', l >= [1, 2, 3])
-print('<', l < [1, 2, 3])
-print('<=', l <= [1, 2, 3])
-print('>[0]', l[0])
-l += [2]
-print('+=', l)
-l *= 2
-print('*=', l)
-print('iter', list(iter(l)))
-print('len', len(l))
-print('repr', repr(l))
-l[:3] = []
-print('setslice', l)
-print('reversed', list(reversed(l)))
-[out]
-+ [0, 1, 2]
-* [0, 1, 0, 1]
-* [0, 1, 0, 1]
-in True
-== False
-!= True
-> False
->= False
-< True
-<= True
->[0] 0
-+= [0, 1, 2]
-*= [0, 1, 2, 0, 1, 2]
-iter [0, 1, 2, 0, 1, 2]
-len 6
-repr [0, 1, 2, 0, 1, 2]
-setslice [0, 1, 2]
-reversed [2, 1, 0]
-
-[case testTupleAsSubtypeOfSequence]
-from typing import TypeVar, Sequence
-T = TypeVar('T')
-def f(a: Sequence[T]) -> None: print(a)
-f(tuple())
-[out]
-()
-
-[case testMapWithLambdaSpecialCase-skip]
-# TODO: Fix this; this was broken at some point but not sure why.
-from typing import List, Iterator
-a = [[1], [3]]
-b = map(lambda y: y[0], a)
-print('>', list(b))
-[out]
-> [1, 3]
-
-[case testInternalBuiltinDefinition]
-import typing
-def f(x: _T) -> None: pass
-[out]
-_program.py:2: error: Name '_T' is not defined
-
-[case testVarArgsFunctionSubtyping]
-import typing
-def f(*args: str) -> str: return args[0]
-map(f, ['x'])
-map(f, [1])
-[out]
-_program.py:4: error: Argument 1 to "map" has incompatible type Callable[[StarArg(str)], str]; expected Callable[[int], str]
-
-[case testMapStr]
-import typing
-x = range(3)
-a = list(map(str, x))
-a + 1
-[out]
-_program.py:4: error: Unsupported operand types for + (List[str] and "int")
-
-[case testNamedTuple]
-import typing
-from collections import namedtuple
-X = namedtuple('X', ['a', 'b'])
-x = X(a=1, b='s')
-print(x.a, x.b)
-[out]
-1 s
-
-[case testNamedTupleShortSyntax]
-import typing
-from collections import namedtuple
-X = namedtuple('X', ' a b ')
-x = X(a=1, b='s')
-print(x.a, x.b)
-[out]
-1 s
-
-[case testNamedTupleError]
-import typing
-from collections import namedtuple
-X = namedtuple('X', ['a', 'b'])
-x = X(a=1, b='s')
-x.c
-[out]
-_program.py:5: error: "X" has no attribute "c"
-
-[case testNamedTupleTupleOperations]
-from typing import Iterable
-from collections import namedtuple
-X = namedtuple('X', ['a', 'b'])
-def f(x: Iterable[int]) -> None: pass
-x = X(a=1, b='s')
-f(x)
-print(len(x))
-print(x.index(1))
-print(x.count(1))
-print(x + x)
-[out]
-2
-0
-1
-(1, 's', 1, 's')
-
-[case testNamedTupleWithTypes]
-from typing import NamedTuple
-N = NamedTuple('N', [('a', int), ('b', str)])
-n = N(1, 'x')
-print(n)
-a, b = n
-print(a, b)
-print(n[0])
-[out]
-N(a=1, b='x')
-1 x
-1
-
-[case testRelativeImport]
-import typing
-from m import x
-print(x)
-[file m/__init__.py]
-from .n import x
-[file m/n.py]
-x = 1
-[out]
-1
-
-[case testRelativeImport2]
-import typing
-from m.n import x
-print(x)
-[file m/__init__.py]
-[file m/n.py]
-from .nn import x
-[file m/nn.py]
-x = 2
-[out]
-2
-
-[case testPyiTakesPrecedenceOverPy]
-import m
-m.f(1)
-[file m.py]
-def f(x):
- print(x)
-[file m.pyi]
-import typing
-def f(x: str) -> None: pass
-[out]
-_program.py:2: error: Argument 1 to "f" has incompatible type "int"; expected "str"
-
-[case testAssignToComplexReal]
-import typing
-x = 4j
-y = x.real
-y = x # Error
-x.real = 2.0 # Error
-[out]
-_program.py:4: error: Incompatible types in assignment (expression has type "complex", variable has type "float")
-_program.py:5: error: Property "real" defined in "complex" is read-only
-
-[case testComplexArithmetic]
-import typing
-print(5 + 8j)
-print(3j * 2.0)
-print(4J / 2.0)
-[out]
-(5+8j)
-6j
-2j
-
-[case testComplexArithmetic2]
-import typing
-x = 5 + 8j
-x = ''
-y = 3j * 2.0
-y = ''
-[out]
-_program.py:3: error: Incompatible types in assignment (expression has type "str", variable has type "complex")
-_program.py:5: error: Incompatible types in assignment (expression has type "str", variable has type "complex")
-
-[case testUnionTypeAlias]
-from typing import Union
-U = Union[int, str]
-u = 1 # type: U
-u = 1.1
-[out]
-_program.py:4: error: Incompatible types in assignment (expression has type "float", variable has type "Union[int, str]")
-
-[case testTupleTypeAlias]
-from typing import Tuple
-A = Tuple[int, str]
-u = 1, 'x' # type: A
-u = 1
-[out]
-_program.py:4: error: Incompatible types in assignment (expression has type "int", variable has type "Tuple[int, str]")
-
-[case testCallableTypeAlias]
-from typing import Callable
-A = Callable[[int], None]
-def f(x: A) -> None:
- x(1)
- x('')
-[out]
-_program.py:5: error: Argument 1 has incompatible type "str"; expected "int"
-
-[case testSuperNew]
-from typing import Dict, Any
-class MyType(type):
- def __new__(cls, name: str, bases: tuple, namespace: Dict[str, Any]) -> type:
- return super().__new__(cls, name + 'x', bases, namespace)
-class A(metaclass=MyType): pass
-print(type(A()).__name__)
-[out]
-Ax
-
-[case testSequenceIndexAndCount]
-from typing import Sequence
-def f(x: Sequence[int]) -> None:
- print(x.index(1))
- print(x.count(1))
-f([0, 0, 1, 1, 1])
-[out]
-2
-3
-
-[case testEscapeInTripleQuotedStrLiteral]
-print('''\'''')
-print(r"""\"""$""")
-[out]
-'
-\"""$
-
-[case testSubclassBothGenericAndNonGenericABC]
-from typing import Generic, TypeVar
-from abc import ABCMeta
-T = TypeVar('T')
-class A(metaclass=ABCMeta): pass
-class B(Generic[T]): pass
-class C(A, B): pass
-class D(B, A): pass
-class E(A, B[T], Generic[T]): pass
-class F(B[T], A, Generic[T]): pass
-def f(e: E[int], f: F[int]) -> None: pass
-[out]
-
-[case testOptional]
-from typing import Optional
-def f() -> Optional[int]: pass
-x = f()
-y = 1
-y = x
-
-[case testAppendToStarArg]
-import typing
-def f(*x: int) -> None:
- x.append(1)
-f(1)
-[out]
-_program.py:3: error: Tuple[int, ...] has no attribute "append"
-
-[case testExit]
-print('a')
-exit(2)
-print('b')
-[out]
-a
-
-[case testTypeVariableTypeComparability]
-from typing import TypeVar
-T = TypeVar('T')
-def eq(x: T, y: T, z: T) -> T:
- if x == y:
- return y
- else:
- return z
-print(eq(1, 2, 3))
-print(eq('x', 'x', 'z'))
-[out]
-3
-x
-
-[case testIntDecimalCompatibility]
-import typing
-from decimal import Decimal
-print(Decimal(1) + 2)
-print(Decimal(1) - 2)
-print(1 + Decimal('2.34'))
-print(1 - Decimal('2.34'))
-print(2 * Decimal('2.34'))
-[out]
-3
--1
-3.34
--1.34
-4.68
-
-[case testInstantiateBuiltinTypes]
-from typing import Dict, Set, List
-d = dict() # type: Dict[int, str]
-s = set() # type: Set[int]
-l = list() # type: List[int]
-str()
-bytes()
-bytearray()
-int()
-float()
-complex()
-slice(1)
-bool()
-
-[case testVariableLengthTuple]
-from typing import Tuple
-def p(t: Tuple[int, ...]) -> None:
- for n in t:
- print(n)
-p((1, 3, 2))
-[out]
-1
-3
-2
-
-[case testVariableLengthTupleError]
-from typing import Tuple
-def p(t: Tuple[str, ...]) -> None:
- n = 5
- print(t[n])
- for s in t:
- s()
-''.startswith(('x', 'y'))
-''.startswith(('x', b'y'))
-[out]
-_program.py:6: error: "str" not callable
-_program.py:8: error: Argument 1 to "startswith" of "str" has incompatible type "Tuple[str, bytes]"; expected "Union[str, Tuple[str, ...]]"
-
-[case testMultiplyTupleByInteger]
-n = 4
-t = ('',) * n
-t + 1
-[out]
-_program.py:3: error: Unsupported operand types for + (Tuple[str, ...] and "int")
-
-[case testMultiplyTupleByIntegerReverse]
-n = 4
-t = n * ('',)
-t + 1
-[out]
-_program.py:3: error: Unsupported operand types for + (Tuple[str, ...] and "int")
-
-[case testDictWithKeywordArgs]
-from typing import Dict, Any, List
-d1 = dict(a=1, b=2) # type: Dict[str, int]
-d2 = dict(a=1, b='') # type: Dict[str, int] # E
-d3 = dict(a=1, b=1)
-d3.xyz # E
-d4 = dict(a=1, b='') # type: Dict[str, Any]
-result = dict(x=[], y=[]) # type: Dict[str, List[str]]
-[out]
-_program.py:3: error: List item 1 has incompatible type "Tuple[str, str]"
-_program.py:5: error: Dict[str, int] has no attribute "xyz"
-
-[case testDefaultDict]
-import typing as t
-from collections import defaultdict
-
-T = t.TypeVar('T')
-
-d1 = defaultdict(list) # type: t.DefaultDict[int, str]
-d2 = defaultdict() # type: t.DefaultDict[int, str]
-d2[0] = '0'
-d2['0'] = 0
-
-def tst(dct: t.DefaultDict[int, T]) -> T:
- return dct[0]
-
-collections = ['coins', 'stamps', 'comics'] # type: t.List[str]
-d3 = defaultdict(str) # type: t.DefaultDict[int, str]
-collections[2]
-
-tst(defaultdict(list, {0: []}))
-tst(defaultdict(list, {'0': []}))
-
-class MyDDict(t.DefaultDict[int,T], t.Generic[T]):
- pass
-MyDDict(dict)['0']
-MyDDict(dict)[0]
-[out]
-_program.py:6: error: Argument 1 to "defaultdict" has incompatible type List[_T]; expected Callable[[], str]
-_program.py:9: error: Invalid index type "str" for "dict"; expected type "int"
-_program.py:9: error: Incompatible types in assignment (expression has type "int", target has type "str")
-_program.py:19: error: List item 0 has incompatible type "Tuple[str, List[None]]"
-_program.py:23: error: Invalid index type "str" for "dict"; expected type "int"
-
-[case testDictUpdateInference]
-from typing import Dict, Optional
-d = {} # type: Dict[str, Optional[int]]
-d.update({str(i): None for i in range(4)})
-
-[case testSuperAndSetattr]
-class A:
- def __init__(self) -> None:
- super().__setattr__('a', 1)
- super().__setattr__(1, 'a')
-[out]
-_program.py:4: error: Argument 1 to "__setattr__" of "object" has incompatible type "int"; expected "str"
-
-[case testMetaclassAndSuper]
-class A(type):
- def __new__(cls, name, bases, namespace) -> 'type':
- return super().__new__(cls, '', (object,), {'x': 7})
-
-class B(metaclass=A):
- pass
-
-print(getattr(B(), 'x'))
-[out]
-7
-
-[case testSortedNoError]
-from typing import Iterable, Callable, TypeVar, List, Dict
-T = TypeVar('T')
-def sorted(x: Iterable[T], *, key: Callable[[T], object] = None) -> None: ...
-a = None # type: List[Dict[str, str]]
-sorted(a, key=lambda y: y[''])
-
-[case testAbstractProperty]
-from abc import abstractproperty, ABCMeta
-class A(metaclass=ABCMeta):
- @abstractproperty
- def x(self) -> int: pass
-class B(A):
- @property
- def x(self) -> int:
- return 3
-b = B()
-print(b.x + 1)
-[out]
-4
-
-[case testInferenceWithLambda]
-from typing import TypeVar, Iterable, Iterator
-import itertools
-
-_T = TypeVar('_T')
-
-def f(iterable): # type: (Iterable[_T]) -> Iterator[List[_T]]
- grouped = itertools.groupby(enumerate(iterable), lambda pair: pair[0] // 2)
- return ([elem for _, elem in group] for _, group in grouped)
-
-[case testReModuleBytes]
-# Regression tests for various overloads in the re module -- bytes version
-import re
-bre = b'a+'
-bpat = re.compile(bre)
-bpat = re.compile(bpat)
-re.search(bre, b'').groups()
-re.search(bre, u'') # Error
-re.search(bpat, b'').groups()
-re.search(bpat, u'') # Error
-# match(), split(), findall(), finditer() are much the same, so skip those.
-# sub(), subn() have more overloads and we are checking these:
-re.sub(bre, b'', b'') + b''
-re.sub(bpat, b'', b'') + b''
-re.sub(bre, lambda m: b'', b'') + b''
-re.sub(bpat, lambda m: b'', b'') + b''
-re.subn(bre, b'', b'')[0] + b''
-re.subn(bpat, b'', b'')[0] + b''
-re.subn(bre, lambda m: b'', b'')[0] + b''
-re.subn(bpat, lambda m: b'', b'')[0] + b''
-[out]
-_program.py:7: error: Type argument 1 of "search" has incompatible value "object"
-_program.py:9: error: Cannot infer type argument 1 of "search"
-
-[case testReModuleString]
-# Regression tests for various overloads in the re module -- string version
-import re
-sre = 'a+'
-spat = re.compile(sre)
-spat = re.compile(spat)
-re.search(sre, '').groups()
-re.search(sre, b'') # Error
-re.search(spat, '').groups()
-re.search(spat, b'') # Error
-# match(), split(), findall(), finditer() are much the same, so skip those.
-# sus(), susn() have more overloads and we are checking these:
-re.sub(sre, '', '') + ''
-re.sub(spat, '', '') + ''
-re.sub(sre, lambda m: '', '') + ''
-re.sub(spat, lambda m: '', '') + ''
-re.subn(sre, '', '')[0] + ''
-re.subn(spat, '', '')[0] + ''
-re.subn(sre, lambda m: '', '')[0] + ''
-re.subn(spat, lambda m: '', '')[0] + ''
-[out]
-_program.py:7: error: Type argument 1 of "search" has incompatible value "object"
-_program.py:9: error: Cannot infer type argument 1 of "search"
-
-[case testListSetitemTuple]
-from typing import List, Tuple
-a = [] # type: List[Tuple[str, int]]
-a[0] = 'x', 1
-a[1] = 2, 'y'
-a[:] = [('z', 3)]
-[out]
-_program.py:4: error: Incompatible types in assignment (expression has type "Tuple[int, str]", target has type "Tuple[str, int]")
diff --git a/test-data/unit/semanal-abstractclasses.test b/test-data/unit/semanal-abstractclasses.test
deleted file mode 100644
index b5147bd..0000000
--- a/test-data/unit/semanal-abstractclasses.test
+++ /dev/null
@@ -1,119 +0,0 @@
-[case testAbstractMethods]
-from abc import abstractmethod, ABCMeta
-import typing
-
-class A(metaclass=ABCMeta):
- @abstractmethod
- def g(self) -> 'A': pass
- @abstractmethod
- def f(self) -> 'A': return self
-[out]
-MypyFile:1(
- ImportFrom:1(abc, [abstractmethod, ABCMeta])
- Import:2(typing)
- ClassDef:4(
- A
- Metaclass(ABCMeta)
- Decorator:5(
- Var(g)
- FuncDef:6(
- g
- Args(
- Var(self))
- def (self: __main__.A) -> __main__.A
- Abstract
- Block:6(
- PassStmt:6())))
- Decorator:7(
- Var(f)
- FuncDef:8(
- f
- Args(
- Var(self))
- def (self: __main__.A) -> __main__.A
- Abstract
- Block:8(
- ReturnStmt:8(
- NameExpr(self [l])))))))
-
-[case testClassInheritingTwoAbstractClasses]
-from abc import abstractmethod, ABCMeta
-import typing
-
-class A(metaclass=ABCMeta): pass
-class B(metaclass=ABCMeta): pass
-class C(A, B): pass
-[out]
-MypyFile:1(
- ImportFrom:1(abc, [abstractmethod, ABCMeta])
- Import:2(typing)
- ClassDef:4(
- A
- Metaclass(ABCMeta)
- PassStmt:4())
- ClassDef:5(
- B
- Metaclass(ABCMeta)
- PassStmt:5())
- ClassDef:6(
- C
- BaseType(
- __main__.A
- __main__.B)
- PassStmt:6()))
-
-[case testAbstractGenericClass]
-from abc import abstractmethod
-from typing import Generic, TypeVar
-T = TypeVar('T')
-class A(Generic[T]):
- @abstractmethod
- def f(self) -> 'A[T]': pass
-[out]
-MypyFile:1(
- ImportFrom:1(abc, [abstractmethod])
- ImportFrom:2(typing, [Generic, TypeVar])
- AssignmentStmt:3(
- NameExpr(T* [__main__.T])
- TypeVarExpr:3())
- ClassDef:4(
- A
- TypeVars(
- T)
- Decorator:5(
- Var(f)
- FuncDef:6(
- f
- Args(
- Var(self))
- def (self: __main__.A[T`1]) -> __main__.A[T`1]
- Abstract
- Block:6(
- PassStmt:6())))))
-
-[case testFullyQualifiedAbstractMethodDecl]
-import abc
-from abc import ABCMeta
-import typing
-
-class A(metaclass=ABCMeta):
- @abc.abstractmethod
- def g(self) -> 'A': pass
-[out]
-MypyFile:1(
- Import:1(abc)
- ImportFrom:2(abc, [ABCMeta])
- Import:3(typing)
- ClassDef:5(
- A
- Metaclass(ABCMeta)
- Decorator:6(
- Var(g)
- FuncDef:7(
- g
- Args(
- Var(self))
- def (self: __main__.A) -> __main__.A
- Abstract
- Block:7(
- PassStmt:7())))))
diff --git a/test-data/unit/semanal-basic.test b/test-data/unit/semanal-basic.test
deleted file mode 100644
index 3c11da8..0000000
--- a/test-data/unit/semanal-basic.test
+++ /dev/null
@@ -1,459 +0,0 @@
-[case testEmptyFile]
-[out]
-MypyFile:1()
-
-[case testGlobalVariable]
-x = 1
-x
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(x* [__main__.x])
- IntExpr(1))
- ExpressionStmt:2(
- NameExpr(x [__main__.x])))
-
-[case testMultipleGlobals]
-x = y = 2
-z = 3
-(x, y, z)
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- Lvalues(
- NameExpr(x* [__main__.x])
- NameExpr(y* [__main__.y]))
- IntExpr(2))
- AssignmentStmt:2(
- NameExpr(z* [__main__.z])
- IntExpr(3))
- ExpressionStmt:3(
- TupleExpr:3(
- NameExpr(x [__main__.x])
- NameExpr(y [__main__.y])
- NameExpr(z [__main__.z]))))
-
-[case testEmptyFunction]
-def f(): pass
-f()
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Block:1(
- PassStmt:1()))
- ExpressionStmt:2(
- CallExpr:2(
- NameExpr(f [__main__.f])
- Args())))
-
-[case testAccessingGlobalNameBeforeDefinition]
-x
-f()
-x = 1
-def f(): pass
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- NameExpr(x [__main__.x]))
- ExpressionStmt:2(
- CallExpr:2(
- NameExpr(f [__main__.f])
- Args()))
- AssignmentStmt:3(
- NameExpr(x* [__main__.x])
- IntExpr(1))
- FuncDef:4(
- f
- Block:4(
- PassStmt:4())))
-
-[case testFunctionArgs]
-def f(x, y):
- (x, y)
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Args(
- Var(x)
- Var(y))
- Block:1(
- ExpressionStmt:2(
- TupleExpr:2(
- NameExpr(x [l])
- NameExpr(y [l]))))))
-
-[case testLocalVar]
-def f():
- x = 1
- x
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Block:1(
- AssignmentStmt:2(
- NameExpr(x* [l])
- IntExpr(1))
- ExpressionStmt:3(
- NameExpr(x [l])))))
-
-[case testAccessGlobalInFn]
-def f():
- x
- g()
-x = 1
-def g(): pass
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Block:1(
- ExpressionStmt:2(
- NameExpr(x [__main__.x]))
- ExpressionStmt:3(
- CallExpr:3(
- NameExpr(g [__main__.g])
- Args()))))
- AssignmentStmt:4(
- NameExpr(x* [__main__.x])
- IntExpr(1))
- FuncDef:5(
- g
- Block:5(
- PassStmt:5())))
-
-[case testAssignmentAfterInit]
-x = 1
-x = 2
-def f(y):
- y = 1
- z = 1
- z = 2
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(x* [__main__.x])
- IntExpr(1))
- AssignmentStmt:2(
- NameExpr(x [__main__.x])
- IntExpr(2))
- FuncDef:3(
- f
- Args(
- Var(y))
- Block:3(
- AssignmentStmt:4(
- NameExpr(y [l])
- IntExpr(1))
- AssignmentStmt:5(
- NameExpr(z* [l])
- IntExpr(1))
- AssignmentStmt:6(
- NameExpr(z [l])
- IntExpr(2)))))
-
-[case testLocalAndGlobalAliasing]
-x = 1
-def f():
- x = 2
- x
-x
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(x* [__main__.x])
- IntExpr(1))
- FuncDef:2(
- f
- Block:2(
- AssignmentStmt:3(
- NameExpr(x* [l])
- IntExpr(2))
- ExpressionStmt:4(
- NameExpr(x [l]))))
- ExpressionStmt:5(
- NameExpr(x [__main__.x])))
-
-[case testArgumentInitializers]
-def f(x = f, y = object):
- x, y
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Args(
- Var(x)
- Var(y))
- Init(
- AssignmentStmt:1(
- NameExpr(x [l])
- NameExpr(f [__main__.f]))
- AssignmentStmt:1(
- NameExpr(y [l])
- NameExpr(object [builtins.object])))
- Block:1(
- ExpressionStmt:2(
- TupleExpr:2(
- NameExpr(x [l])
- NameExpr(y [l]))))))
-
-[case testVarArgs]
-def f(x, *y):
- x, y
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Args(
- Var(x))
- VarArg(
- Var(y))
- Block:1(
- ExpressionStmt:2(
- TupleExpr:2(
- NameExpr(x [l])
- NameExpr(y [l]))))))
-
-[case testGlobalDecl]
-x = None
-def f():
- global x
- x = None
- x
-class A: pass
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(x* [__main__.x])
- NameExpr(None [builtins.None]))
- FuncDef:2(
- f
- Block:2(
- GlobalDecl:3(
- x)
- AssignmentStmt:4(
- NameExpr(x [__main__.x])
- NameExpr(None [builtins.None]))
- ExpressionStmt:5(
- NameExpr(x [__main__.x]))))
- ClassDef:6(
- A
- PassStmt:6()))
-
-[case testMultipleNamesInGlobalDecl]
-x, y = None, None
-def f():
- global x, y
- x = y
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- TupleExpr:1(
- NameExpr(x* [__main__.x])
- NameExpr(y* [__main__.y]))
- TupleExpr:1(
- NameExpr(None [builtins.None])
- NameExpr(None [builtins.None])))
- FuncDef:2(
- f
- Block:2(
- GlobalDecl:3(
- x
- y)
- AssignmentStmt:4(
- NameExpr(x [__main__.x])
- NameExpr(y [__main__.y])))))
-
-[case testGlobalDeclScope]
-x = None
-def f():
- global x
-def g():
- x = None
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(x* [__main__.x])
- NameExpr(None [builtins.None]))
- FuncDef:2(
- f
- Block:2(
- GlobalDecl:3(
- x)))
- FuncDef:4(
- g
- Block:4(
- AssignmentStmt:5(
- NameExpr(x* [l])
- NameExpr(None [builtins.None])))))
-
-[case testGlobalDeclScope]
-x = None
-def f():
- global x
-def g():
- x = None
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(x* [__main__.x])
- NameExpr(None [builtins.None]))
- FuncDef:2(
- f
- Block:2(
- GlobalDecl:3(
- x)))
- FuncDef:4(
- g
- Block:4(
- AssignmentStmt:5(
- NameExpr(x* [l])
- NameExpr(None [builtins.None])))))
-
-[case testGlobaWithinMethod]
-x = None
-class A:
- def f(self):
- global x
- x = self
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(x* [__main__.x])
- NameExpr(None [builtins.None]))
- ClassDef:2(
- A
- FuncDef:3(
- f
- Args(
- Var(self))
- Block:3(
- GlobalDecl:4(
- x)
- AssignmentStmt:5(
- NameExpr(x [__main__.x])
- NameExpr(self [l]))))))
-
-[case testGlobalDefinedInBlock]
-if object:
- x = object()
- x = x
-x
-[out]
-MypyFile:1(
- IfStmt:1(
- If(
- NameExpr(object [builtins.object]))
- Then(
- AssignmentStmt:2(
- NameExpr(x* [__main__.x])
- CallExpr:2(
- NameExpr(object [builtins.object])
- Args()))
- AssignmentStmt:3(
- NameExpr(x [__main__.x])
- NameExpr(x [__main__.x]))))
- ExpressionStmt:4(
- NameExpr(x [__main__.x])))
-
-[case testNonlocalDecl]
-def g():
- x = None
- def f():
- nonlocal x
- x = None
- x
-[out]
-MypyFile:1(
- FuncDef:1(
- g
- Block:1(
- AssignmentStmt:2(
- NameExpr(x* [l])
- NameExpr(None [builtins.None]))
- FuncDef:3(
- f
- Block:3(
- NonlocalDecl:4(
- x)
- AssignmentStmt:5(
- NameExpr(x [l])
- NameExpr(None [builtins.None]))
- ExpressionStmt:6(
- NameExpr(x [l])))))))
-
-[case testMultipleNamesInNonlocalDecl]
-def g():
- x, y = None, None
- def f(z):
- nonlocal x, y
- x = y
-[out]
-MypyFile:1(
- FuncDef:1(
- g
- Block:1(
- AssignmentStmt:2(
- TupleExpr:2(
- NameExpr(x* [l])
- NameExpr(y* [l]))
- TupleExpr:2(
- NameExpr(None [builtins.None])
- NameExpr(None [builtins.None])))
- FuncDef:3(
- f
- Args(
- Var(z))
- Block:3(
- NonlocalDecl:4(
- x
- y)
- AssignmentStmt:5(
- NameExpr(x [l])
- NameExpr(y [l])))))))
-
-[case testNestedFunctions]
-def f(x):
- def g(y):
- z = y + x
- return g
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Args(
- Var(x))
- Block:1(
- FuncDef:2(
- g
- Args(
- Var(y))
- Block:2(
- AssignmentStmt:3(
- NameExpr(z* [l])
- OpExpr:3(
- +
- NameExpr(y [l])
- NameExpr(x [l])))))
- ReturnStmt:4(
- NameExpr(g [l])))))
-
-[case testNestedFunctionWithOverlappingName]
-def f(x):
- def g():
- x = 1
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Args(
- Var(x))
- Block:1(
- FuncDef:2(
- g
- Block:2(
- AssignmentStmt:3(
- NameExpr(x* [l])
- IntExpr(1)))))))
diff --git a/test-data/unit/semanal-classes.test b/test-data/unit/semanal-classes.test
deleted file mode 100644
index 431261f..0000000
--- a/test-data/unit/semanal-classes.test
+++ /dev/null
@@ -1,623 +0,0 @@
--- Test cases related to classes for the semantic analyzer.
-
-[case testSimpleClass]
-class A: pass
-x = A
-[out]
-MypyFile:1(
- ClassDef:1(
- A
- PassStmt:1())
- AssignmentStmt:2(
- NameExpr(x* [__main__.x])
- NameExpr(A [__main__.A])))
-
-[case testMethods]
-class A:
- def __init__(self, x):
- y = x
- def f(self):
- y = self
-[out]
-MypyFile:1(
- ClassDef:1(
- A
- FuncDef:2(
- __init__
- Args(
- Var(self)
- Var(x))
- Block:2(
- AssignmentStmt:3(
- NameExpr(y* [l])
- NameExpr(x [l]))))
- FuncDef:4(
- f
- Args(
- Var(self))
- Block:4(
- AssignmentStmt:5(
- NameExpr(y* [l])
- NameExpr(self [l]))))))
-
-[case testMemberDefinitionInInit]
-class A:
- def __init__(self):
- self.x = 1
- self.y = 2
-[out]
-MypyFile:1(
- ClassDef:1(
- A
- FuncDef:2(
- __init__
- Args(
- Var(self))
- Block:2(
- AssignmentStmt:3(
- MemberExpr:3(
- NameExpr(self [l])
- x*)
- IntExpr(1))
- AssignmentStmt:4(
- MemberExpr:4(
- NameExpr(self [l])
- y*)
- IntExpr(2))))))
-
-[case testMemberAssignmentViaSelfOutsideInit]
-class A:
- def f(self):
- self.x = 1
-def __init__(self):
- self.y = 1
-[out]
-MypyFile:1(
- ClassDef:1(
- A
- FuncDef:2(
- f
- Args(
- Var(self))
- Block:2(
- AssignmentStmt:3(
- MemberExpr:3(
- NameExpr(self [l])
- x*)
- IntExpr(1)))))
- FuncDef:4(
- __init__
- Args(
- Var(self))
- Block:4(
- AssignmentStmt:5(
- MemberExpr:5(
- NameExpr(self [l])
- y)
- IntExpr(1)))))
-
-[case testMemberAssignmentNotViaSelf]
-class A:
- def __init__(x, self):
- self.y = 1 # not really self
-class B:
- def __init__(x):
- self = x
- self.z = 1
-[out]
-MypyFile:1(
- ClassDef:1(
- A
- FuncDef:2(
- __init__
- Args(
- Var(x)
- Var(self))
- Block:2(
- AssignmentStmt:3(
- MemberExpr:3(
- NameExpr(self [l])
- y)
- IntExpr(1)))))
- ClassDef:4(
- B
- FuncDef:5(
- __init__
- Args(
- Var(x))
- Block:5(
- AssignmentStmt:6(
- NameExpr(self* [l])
- NameExpr(x [l]))
- AssignmentStmt:7(
- MemberExpr:7(
- NameExpr(self [l])
- z)
- IntExpr(1))))))
-
-[case testNonStandardNameForSelfAndInit]
-class A:
- def __init__(x):
- x.y = 1
-[out]
-MypyFile:1(
- ClassDef:1(
- A
- FuncDef:2(
- __init__
- Args(
- Var(x))
- Block:2(
- AssignmentStmt:3(
- MemberExpr:3(
- NameExpr(x [l])
- y*)
- IntExpr(1))))))
-
-[case testAssignmentAfterAttributeInit]
-class A:
- def __init__(self):
- self.x = 1
- self.x = 2
-[out]
-MypyFile:1(
- ClassDef:1(
- A
- FuncDef:2(
- __init__
- Args(
- Var(self))
- Block:2(
- AssignmentStmt:3(
- MemberExpr:3(
- NameExpr(self [l])
- x*)
- IntExpr(1))
- AssignmentStmt:4(
- MemberExpr:4(
- NameExpr(self [l])
- x)
- IntExpr(2))))))
-
-[case testOverloadedMethod]
-from typing import overload
-class A:
- @overload
- def f(self) -> None: self
- @overload
- def f(self, x: 'A') -> None: self
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [overload])
- ClassDef:2(
- A
- OverloadedFuncDef:3(
- Overload(def (self: __main__.A), \
- def (self: __main__.A, x: __main__.A))
- Decorator:3(
- Var(f)
- NameExpr(overload [typing.overload])
- FuncDef:4(
- f
- Args(
- Var(self))
- def (self: __main__.A)
- Block:4(
- ExpressionStmt:4(
- NameExpr(self [l])))))
- Decorator:5(
- Var(f)
- NameExpr(overload [typing.overload])
- FuncDef:6(
- f
- Args(
- Var(self)
- Var(x))
- def (self: __main__.A, x: __main__.A)
- Block:6(
- ExpressionStmt:6(
- NameExpr(self [l]))))))))
-
-[case testAttributeWithoutType]
-class A:
- a = object
-[out]
-MypyFile:1(
- ClassDef:1(
- A
- AssignmentStmt:2(
- NameExpr(a* [m])
- NameExpr(object [builtins.object]))))
-
-[case testDataAttributeRefInClassBody]
-class A:
- x = 1
- y = x
-[out]
-MypyFile:1(
- ClassDef:1(
- A
- AssignmentStmt:2(
- NameExpr(x* [m])
- IntExpr(1))
- AssignmentStmt:3(
- NameExpr(y* [m])
- NameExpr(x [m]))))
-
-[case testMethodRefInClassBody]
-class A:
- def f(self): pass
- g = f
-[out]
-MypyFile:1(
- ClassDef:1(
- A
- FuncDef:2(
- f
- Args(
- Var(self))
- Block:2(
- PassStmt:2()))
- AssignmentStmt:3(
- NameExpr(g* [m])
- NameExpr(f [m]))))
-
-[case testIfStatementInClassBody]
-class A:
- if A:
- x = 1
- else:
- x = 2
-[out]
-MypyFile:1(
- ClassDef:1(
- A
- IfStmt:2(
- If(
- NameExpr(A [__main__.A]))
- Then(
- AssignmentStmt:3(
- NameExpr(x* [m])
- IntExpr(1)))
- Else(
- AssignmentStmt:5(
- NameExpr(x [m])
- IntExpr(2))))))
-
-[case testForStatementInClassBody]
-class A:
- for x in [1, 2]:
- y = x
-[out]
-MypyFile:1(
- ClassDef:1(
- A
- ForStmt:2(
- NameExpr(x* [m])
- ListExpr:2(
- IntExpr(1)
- IntExpr(2))
- Block:2(
- AssignmentStmt:3(
- NameExpr(y* [m])
- NameExpr(x [m]))))))
-
-[case testReferenceToClassWithinFunction]
-def f():
- class A: pass
- A
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Block:1(
- ClassDef:2(
- A
- PassStmt:2())
- ExpressionStmt:3(
- NameExpr(A [l])))))
-
-[case testReferenceToClassWithinClass]
-class A:
- class B: pass
- B
-[out]
-MypyFile:1(
- ClassDef:1(
- A
- ClassDef:2(
- B
- PassStmt:2())
- ExpressionStmt:3(
- NameExpr(B [__main__.A.B]))))
-
-[case testClassWithBaseClassWithinClass]
-class A:
- class B: pass
- class C(B): pass
-[out]
-MypyFile:1(
- ClassDef:1(
- A
- ClassDef:2(
- B
- PassStmt:2())
- ClassDef:3(
- C
- BaseType(
- __main__.A.B)
- PassStmt:3())))
-
-[case testDeclarationReferenceToNestedClass]
-def f() -> None:
- class A: pass
- x = None # type: A
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- def ()
- Block:1(
- ClassDef:2(
- A
- PassStmt:2())
- AssignmentStmt:3(
- NameExpr(x [l])
- NameExpr(None [builtins.None])
- A))))
-
-[case testAccessToLocalInOuterScopeWithinNestedClass]
-def f(x):
- class A:
- y = x
- def g(self):
- z = x
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Args(
- Var(x))
- Block:1(
- ClassDef:2(
- A
- AssignmentStmt:3(
- NameExpr(y* [m])
- NameExpr(x [l]))
- FuncDef:4(
- g
- Args(
- Var(self))
- Block:4(
- AssignmentStmt:5(
- NameExpr(z* [l])
- NameExpr(x [l]))))))))
-
-[case testQualifiedMetaclass]
-import abc
-class A(metaclass=abc.ABCMeta): pass
-[out]
-MypyFile:1(
- Import:1(abc)
- ClassDef:2(
- A
- Metaclass(abc.ABCMeta)
- PassStmt:2()))
-
-[case testStaticMethod]
-class A:
- @staticmethod
- def f(z: int) -> str: pass
-[builtins fixtures/staticmethod.pyi]
-[out]
-MypyFile:1(
- ClassDef:1(
- A
- Decorator:2(
- Var(f)
- FuncDef:3(
- f
- Args(
- Var(z))
- def (z: builtins.int) -> builtins.str
- Static
- Block:3(
- PassStmt:3())))))
-
-[case testStaticMethodWithNoArgs]
-class A:
- @staticmethod
- def f() -> str: pass
-[builtins fixtures/staticmethod.pyi]
-[out]
-MypyFile:1(
- ClassDef:1(
- A
- Decorator:2(
- Var(f)
- FuncDef:3(
- f
- def () -> builtins.str
- Static
- Block:3(
- PassStmt:3())))))
-
-[case testClassMethod]
-class A:
- @classmethod
- def f(cls, z: int) -> str: pass
-[builtins fixtures/classmethod.pyi]
-[out]
-MypyFile:1(
- ClassDef:1(
- A
- Decorator:2(
- Var(f)
- FuncDef:3(
- f
- Args(
- Var(cls)
- Var(z))
- def (cls: def () -> __main__.A, z: builtins.int) -> builtins.str
- Class
- Block:3(
- PassStmt:3())))))
-
-[case testClassMethodWithNoArgs]
-class A:
- @classmethod
- def f(cls) -> str: pass
-[builtins fixtures/classmethod.pyi]
-[out]
-MypyFile:1(
- ClassDef:1(
- A
- Decorator:2(
- Var(f)
- FuncDef:3(
- f
- Args(
- Var(cls))
- def (cls: def () -> __main__.A) -> builtins.str
- Class
- Block:3(
- PassStmt:3())))))
-
-[case testProperty]
-import typing
-class A:
- @property
- def f(self) -> str: pass
-[builtins fixtures/property.pyi]
-[out]
-MypyFile:1(
- Import:1(typing)
- ClassDef:2(
- A
- Decorator:3(
- Var(f)
- FuncDef:4(
- f
- Args(
- Var(self))
- def (self: __main__.A) -> builtins.str
- Property
- Block:4(
- PassStmt:4())))))
-
-[case testClassDecorator]
-import typing
- at object
-class A: pass
-[out]
-MypyFile:1(
- Import:1(typing)
- ClassDef:2(
- A
- Decorators(
- NameExpr(object [builtins.object]))
- PassStmt:3()))
-
-[case testClassAttributeAsMethodDefaultArgumentValue]
-import typing
-class A:
- X = 1
- def f(self, x : int = X) -> None: pass
-[out]
-MypyFile:1(
- Import:1(typing)
- ClassDef:2(
- A
- AssignmentStmt:3(
- NameExpr(X* [m])
- IntExpr(1))
- FuncDef:4(
- f
- Args(
- Var(self)
- Var(x))
- def (self: __main__.A, x: builtins.int =)
- Init(
- AssignmentStmt:4(
- NameExpr(x [l])
- NameExpr(X [m])))
- Block:4(
- PassStmt:4()))))
-
-[case testInvalidBaseClass]
-from typing import Any, Callable
-class A(None): pass
-class B(Any): pass
-class C(Callable[[], int]): pass
-[out]
-main:2: error: Invalid base class
-main:4: error: Invalid base class
-
-[case testTupleAsBaseClass]
-import m
-[file m.pyi]
-from typing import Tuple
-class A(Tuple[int, str]): pass
-[builtins fixtures/tuple.pyi]
-[out]
-MypyFile:1(
- Import:1(m))
-MypyFile:1(
- tmp/m.pyi
- ImportFrom:1(typing, [Tuple])
- ClassDef:2(
- A
- TupleType(
- Tuple[builtins.int, builtins.str])
- BaseType(
- builtins.tuple[Any])
- PassStmt:2()))
-
-[case testBaseClassFromIgnoredModule]
-import m # type: ignore
-class B(m.A):
- pass
-[out]
-MypyFile:1(
- Import:1(m)
- ClassDef:2(
- B
- FallbackToAny
- BaseType(
- builtins.object)
- PassStmt:3())
- IgnoredLines(1))
-
-[case testBaseClassFromIgnoredModuleUsingImportFrom]
-from m import A # type: ignore
-class B(A, int):
- pass
-[out]
-MypyFile:1(
- ImportFrom:1(m, [A])
- ClassDef:2(
- B
- FallbackToAny
- BaseType(
- builtins.int)
- PassStmt:3())
- IgnoredLines(1))
-
-[case testBaseClassWithExplicitAnyType]
-from typing import Any
-A = 1 # type: Any
-class B(A):
- pass
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [Any])
- AssignmentStmt:2(
- NameExpr(A [__main__.A])
- IntExpr(1)
- Any)
- ClassDef:3(
- B
- FallbackToAny
- BaseType(
- builtins.object)
- PassStmt:4()))
diff --git a/test-data/unit/semanal-errors.test b/test-data/unit/semanal-errors.test
deleted file mode 100644
index 06fd3d0..0000000
--- a/test-data/unit/semanal-errors.test
+++ /dev/null
@@ -1,1323 +0,0 @@
-[case testPropagatingParseErrors]
-in 1
-def f():
- 1 1
-[out]
-main:1: error: Parse error before in
-main:3: error: Parse error before numeric literal
-
-[case testUndefinedVariableInGlobalStatement]
-import typing
-x
-y
-[out]
-main:2: error: Name 'x' is not defined
-main:3: error: Name 'y' is not defined
-
-[case testUndefinedVariableWithinFunctionContext]
-import typing
-def f() -> None:
- x
-y
-[out]
-main:3: error: Name 'x' is not defined
-main:4: error: Name 'y' is not defined
-
-[case testMethodScope]
-import typing
-class A:
- def f(self): pass
-f
-[out]
-main:4: error: Name 'f' is not defined
-
-[case testMethodScope2]
-import typing
-class A:
- def f(self): pass
-class B:
- def g(self) -> None:
- f # error
- g # error
-[out]
-main:6: error: Name 'f' is not defined
-main:7: error: Name 'g' is not defined
-
-[case testInvalidType]
-import typing
-x = None # type: X
-[out]
-main:2: error: Name 'X' is not defined
-
-[case testInvalidGenericArg]
-from typing import TypeVar, Generic
-t = TypeVar('t')
-class A(Generic[t]): pass
-x = 0 # type: A[y]
-[out]
-main:4: error: Name 'y' is not defined
-
-[case testInvalidNumberOfGenericArgsInTypeDecl]
-from typing import TypeVar, Generic
-t = TypeVar('t')
-class A: pass
-class B(Generic[t]): pass
-x = 0 # type: B[A, A]
-y = 0 # type: A[A]
-[out]
-main:5: error: "B" expects 1 type argument, but 2 given
-main:6: error: "A" expects no type arguments, but 1 given
-
-[case testInvalidNumberOfGenericArgsInUndefinedArg]
-
-class A: pass
-x = None # type: A[int] # E: "A" expects no type arguments, but 1 given
-[out]
-
-[case testInvalidNumberOfGenericArgsInNestedBlock]
-
-class A: pass
-class B:
- def f(self) -> None:
- while 1:
- x = None # type: A[int] \
- # E: "A" expects no type arguments, but 1 given
-[out]
-
-[case testInvalidNumberOfGenericArgsInSignature]
-import typing
-class A: pass
-def f() -> A[int]: pass # E: "A" expects no type arguments, but 1 given
-[out]
-
-[case testInvalidNumberOfGenericArgsInOverloadedSignature]
-from typing import overload
-class A: pass
- at overload
-def f(): pass
- at overload
-def f(x: A[int]) -> None: pass # E: "A" expects no type arguments, but 1 given
-[out]
-
-[case testInvalidNumberOfGenericArgsInBaseType]
-import typing
-class A: pass
-class B(A[int]): pass # E: "A" expects no type arguments, but 1 given
-[out]
-
-[case testInvalidNumberOfGenericArgsInCast]
-from typing import cast
-class A: pass
-x = cast(A[int], 1) # E: "A" expects no type arguments, but 1 given
-[out]
-
-[case testInvalidNumberOfGenericArgsInTypeApplication]
-import typing
-class A: pass
-class B: pass
-x = A[B[int]]() # E: "B" expects no type arguments, but 1 given
-[out]
-
-[case testInvalidNumberOfGenericArgsInNestedGenericType]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-class A(Generic[T]): pass
-class B: pass
-def f() -> A[B[int]]: pass # E: "B" expects no type arguments, but 1 given
-[out]
-
-[case testInvalidNumberOfGenericArgsInTupleType]
-from typing import Tuple
-class A: pass
-x = None # type: Tuple[A[int]] # E: "A" expects no type arguments, but 1 given
-[out]
-
-[case testInvalidNumberOfGenericArgsInFunctionType]
-from typing import Callable
-class A: pass
-x = None # type: Callable[[A[int]], int] # E: "A" expects no type arguments, but 1 given
-y = None # type: Callable[[], A[int]] # E: "A" expects no type arguments, but 1 given
-[out]
-
-[case testVarOrFuncAsType]
-import typing
-def f(): pass
-x = 1
-y = 0 # type: f
-z = 0 # type: x
-[out]
-main:4: error: Invalid type "__main__.f"
-main:5: error: Invalid type "__main__.x"
-
-[case testTwoStarsInType]
-import typing
-x, x2 = 1 # type: *object, *object
-y, y2 = 1 # type: object, (*object, *object)
-z, z2 = 1 # type: *object, (object, *object)
-[out]
-main:2: error: At most one star type allowed in a tuple
-main:3: error: At most one star type allowed in a tuple
-main:4: error: Star type only allowed for starred expressions
-
-[case testGlobalVarRedefinition]
-import typing
-class A: pass
-x = 0 # type: A
-x = 0 # type: A
-[out]
-main:4: error: Name 'x' already defined
-
-[case testLocalVarRedefinition]
-import typing
-class A: pass
-def f() -> None:
- x = 0 # type: A
- x = 0 # type: A
-[out]
-main:5: error: Name 'x' already defined
-
-[case testClassVarRedefinition]
-import typing
-class A:
- x = 0 # type: object
- x = 0 # type: object
-[out]
-main:4: error: Name 'x' already defined
-
-[case testMultipleClassDefinitions]
-import typing
-class A: pass
-class A: pass
-[out]
-main:3: error: Name 'A' already defined
-
-[case testMultipleMixedDefinitions]
-import typing
-x = 1
-def x(): pass
-class x: pass
-[out]
-main:3: error: Name 'x' already defined
-main:4: error: Name 'x' already defined
-
-[case testNameNotImported]
-import typing
-from m import y
-x
-[file m.py]
-x = y = 1
-[out]
-main:3: error: Name 'x' is not defined
-
-[case testMissingNameInImportFrom]
-import typing
-from m import y
-[file m.py]
-x = 1
-[out]
-main:2: error: Module 'm' has no attribute 'y'
-
-[case testMissingModule]
-import typing
-import m
-[out]
-main:2: error: Cannot find module named 'm'
-main:2: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-
-[case testMissingModule2]
-import typing
-from m import x
-[out]
-main:2: error: Cannot find module named 'm'
-main:2: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-
-[case testMissingModule3]
-import typing
-from m import *
-[out]
-main:2: error: Cannot find module named 'm'
-main:2: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-
-[case testMissingModuleRelativeImport]
-import typing
-import m
-[file m/__init__.py]
-from .x import y
-[out]
-tmp/m/__init__.py:1: error: Cannot find module named 'm.x'
-tmp/m/__init__.py:1: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-
-[case testMissingModuleRelativeImport2]
-import typing
-import m.a
-[file m/__init__.py]
-[file m/a.py]
-from .x import y
-[out]
-tmp/m/a.py:1: error: Cannot find module named 'm.x'
-tmp/m/a.py:1: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-
-[case testModuleNotImported]
-import typing
-import _m
-_n.x
-[file _m.py]
-import _n
-[file _n.py]
-x = 1
-[out]
-main:3: error: Name '_n' is not defined
-
-[case testImportAsteriskPlusUnderscore]
-import typing
-from _m import *
-_x
-__x__
-[file _m.py]
-_x = __x__ = 1
-[out]
-main:3: error: Name '_x' is not defined
-main:4: error: Name '__x__' is not defined
-
-[case testRelativeImportAtTopLevelModule]
-from . import m
-[out]
-main:1: error: No parent module -- cannot perform relative import
-
-[case testRelativeImportAtTopLevelModule2]
-from .. import m
-[out]
-main:1: error: No parent module -- cannot perform relative import
-
-[case testUndefinedTypeWithQualifiedName]
-import typing
-import m
-def f() -> m.c: pass
-def g() -> n.c: pass
-[file m.py]
-[out]
-main:3: error: Name 'm.c' is not defined
-main:4: error: Name 'n' is not defined
-
-[case testMissingPackage]
-import typing
-import m.n
-[out]
-main:2: error: Cannot find module named 'm'
-main:2: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-main:2: error: Cannot find module named 'm.n'
-
-[case testMissingPackage]
-import typing
-from m.n import x
-from a.b import *
-[out]
-main:2: error: Cannot find module named 'm.n'
-main:2: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-main:3: error: Cannot find module named 'a.b'
-
-[case testErrorInImportedModule]
-import m
-[file m.py]
-import typing
-x = y
-[out]
-tmp/m.py:2: error: Name 'y' is not defined
-
-[case testErrorInImportedModule2]
-import m.n
-[file m/__init__.py]
-[file m/n.py]
-import k
-[file k.py]
-import typing
-x = y
-[out]
-tmp/k.py:2: error: Name 'y' is not defined
-
-[case testPackageWithoutInitFile]
-import typing
-import m.n
-m.n.x
-[file m/n.py]
-x = 1
-[out]
-main:2: error: Cannot find module named 'm'
-main:2: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)
-main:2: error: Cannot find module named 'm.n'
-
-[case testBreakOutsideLoop]
-break
-def f():
- break
-[out]
-main:1: error: 'break' outside loop
-main:3: error: 'break' outside loop
-
-[case testContinueOutsideLoop]
-continue
-def f():
- continue
-[out]
-main:1: error: 'continue' outside loop
-main:3: error: 'continue' outside loop
-
-[case testReturnOutsideFunction]
-def f(): pass
-return
-return 1
-[out]
-main:2: error: 'return' outside function
-main:3: error: 'return' outside function
-
-[case testYieldOutsideFunction]
-yield 1
-yield
-[out]
-main:1: error: 'yield' outside function
-main:2: error: 'yield' outside function
-
-[case testInvalidLvalues]
-1 = 1
-(1) = 1
-(1, 1) = 1
-[1, 1] = 1
-() = 1
-[out]
-main:1: error: Invalid assignment target
-main:2: error: Invalid assignment target
-main:3: error: Invalid assignment target
-main:4: error: Invalid assignment target
-main:5: error: Can't assign to ()
---' (hack to fix syntax highlighting)
-
-[case testInvalidLvalues2]
-x = y = z = 1
-x, (y, 1) = 1
-x, [y, 1] = 1
-x, [y, [z, 1]] = 1
-x, (y, (z, 1)) = 1
-x, (y) = 1 # ok
-x, (y, (z, z)) = 1 # ok
-[out]
-main:2: error: Invalid assignment target
-main:3: error: Invalid assignment target
-main:4: error: Invalid assignment target
-main:5: error: Invalid assignment target
-
-[case testInvalidLvalues3]
-x = 1
-x + x = 1
--x = 1
-1.1 = 1
-'x' = 1
-x() = 1
-[out]
-main:2: error: Invalid assignment target
-main:3: error: Invalid assignment target
-main:4: error: Invalid assignment target
-main:5: error: Invalid assignment target
-main:6: error: Invalid assignment target
-
-[case testInvalidStarType]
-a = 1 # type: *int
-[out]
-main:1: error: Star type only allowed for starred expressions
-
-[case testInvalidStarType]
-*a, b = 1 # type: int, int
-[out]
-main:1: error: Star type expected for starred expression
-
-[case testTwoStarExpressions]
-a, *b, *c = 1
-*a, (*b, c) = 1
-a, (*b, *c) = 1
-[*a, *b] = 1
-[out]
-main:1: error: Two starred expressions in assignment
-main:3: error: Two starred expressions in assignment
-main:4: error: Two starred expressions in assignment
-
-[case testTwoStarExpressionsInForStmt]
-z = 1
-for a, *b, *c in z:
- pass
-for *a, (*b, c) in z:
- pass
-for a, (*b, *c) in z:
- pass
-for [*a, *b] in z:
- pass
-[out]
-main:2: error: Two starred expressions in assignment
-main:6: error: Two starred expressions in assignment
-main:8: error: Two starred expressions in assignment
-
-[case testTwoStarExpressionsInGeneratorExpr]
-(a for a, *b, *c in [])
-(a for *a, (*b, c) in [])
-(a for a, (*b, *c) in [])
-[out]
-main:1: error: Name 'a' is not defined
-main:1: error: Two starred expressions in assignment
-main:3: error: Two starred expressions in assignment
-
-[case testStarExpressionRhs]
-b = 1
-c = 1
-d = 1
-a = *b
-[out]
-main:4: error: Can use starred expression only as assignment target
-
-[case testStarExpressionInExp]
-a = 1
-*a + 1
-[out]
-main:2: error: Can use starred expression only as assignment target
-
-[case testInvalidDel]
-import typing
-x = 1
-del x(1) # E: Invalid delete target
-del x + 1 # E: Invalid delete target
-del z # E: Name 'z' is not defined
-[out]
-
-[case testFunctionTvarScope]
-from typing import TypeVar
-t = TypeVar('t')
-def f(x: t) -> t: pass
-x = 0 # type: t
-[out]
-main:4: error: Invalid type "__main__.t"
-
-[case testClassTvarScope]
-from typing import Generic, TypeVar
-t = TypeVar('t')
-class c(Generic[t]): pass
-x = 0 # type: t
-[out]
-main:4: error: Invalid type "__main__.t"
-
-[case testExpressionRefersToTypeVariable]
-from typing import TypeVar, Generic
-t = TypeVar('t')
-class c(Generic[t]):
- def f(self) -> None: x = t
-def f(y: t): x = t
-[out]
-main:4: error: 't' is a type variable and only valid in type context
-main:5: error: 't' is a type variable and only valid in type context
-
-[case testMissingSelf]
-import typing
-class A:
- def f(): pass
-[out]
-main:3: error: Method must have at least one argument
-
-[case testInvalidBaseClass]
-import typing
-class A(B): pass
-[out]
-main:2: error: Name 'B' is not defined
-
-[case testSuperOutsideClass]
-class A: pass
-super().x
-def f() -> None: super().y
-[out]
-main:2: error: "super" used outside class
-main:3: error: "super" used outside class
-
-[case testMissingSelfInMethod]
-import typing
-class A:
- def f() -> None: pass
- def g(): pass
-[out]
-main:3: error: Method must have at least one argument
-main:4: error: Method must have at least one argument
-
-[case testMultipleMethodDefinition]
-import typing
-class A:
- def f(self) -> None: pass
- def g(self) -> None: pass
- def f(self, x: object) -> None: pass
-[out]
-main:5: error: Name 'f' already defined
-
-[case testInvalidGlobalDecl]
-import typing
-def f() -> None:
- global x
- x = None
-[out]
-main:4: error: Name 'x' is not defined
-
-[case testInvalidNonlocalDecl]
-import typing
-def f():
- def g() -> None:
- nonlocal x
- x = None
-[out]
-main:4: error: No binding for nonlocal 'x' found
-main:5: error: Name 'x' is not defined
-
-[case testNonlocalDeclNotMatchingGlobal]
-import typing
-x = None
-def f() -> None:
- nonlocal x
- x = None
-[out]
-main:4: error: No binding for nonlocal 'x' found
-main:5: error: Name 'x' is not defined
-
-[case testNonlocalDeclConflictingWithParameter]
-import typing
-def g():
- x = None
- def f(x) -> None:
- nonlocal x
- x = None
-[out]
-main:5: error: Name 'x' is already defined in local scope before nonlocal declaration
-
-[case testNonlocalDeclOutsideFunction]
-x = 2
-nonlocal x
-[out]
-main:2: error: nonlocal declaration not allowed at module level
-
-[case testGlobalAndNonlocalDecl]
-import typing
-x = 1
-def f():
- x = 1
- def g() -> None:
- global x
- nonlocal x
- x = None
-[out]
-main:7: error: Name 'x' is nonlocal and global
-
-[case testNonlocalAndGlobalDecl]
-import typing
-x = 1
-def f():
- x = 1
- def g() -> None:
- nonlocal x
- global x
- x = None
-[out]
-main:7: error: Name 'x' is nonlocal and global
-
-[case testNestedFunctionAndScoping]
-import typing
-def f(x) -> None:
- def g(y):
- z = x
- z
- y
- x
-[out]
-main:5: error: Name 'z' is not defined
-main:6: error: Name 'y' is not defined
-
-[case testMultipleNestedFunctionDef]
-import typing
-def f(x) -> None:
- def g(): pass
- x = 1
- def g(): pass
-[out]
-main:5: error: Name 'g' already defined
-
-[case testRedefinedOverloadedFunction]
-from typing import overload, Any
-def f() -> None:
- @overload
- def p(o: object) -> None: pass # no error
- @overload
- def p(o: Any) -> None: pass # no error
- x = 1
- def p(): pass # fail
-[out]
-main:8: error: Name 'p' already defined
-
-[case testNestedFunctionInMethod]
-import typing
-class A:
- def f(self) -> None:
- def g() -> None:
- x
- y
-[out]
-main:5: error: Name 'x' is not defined
-main:6: error: Name 'y' is not defined
-
-[case testImportScope]
-import typing
-def f() -> None:
- import x
-x.y # E: Name 'x' is not defined
-[file x.py]
-y = 1
-[out]
-
-[case testImportScope2]
-import typing
-def f() -> None:
- from x import y
- y
-y # E: Name 'y' is not defined
-[file x.py]
-y = 1
-[out]
-
-[case testImportScope3]
-import typing
-def f() -> None:
- from x import *
- y
-y # E: Name 'y' is not defined
-[file x.py]
-y = 1
-[out]
-
-[case testImportScope4]
-import typing
-class A:
- from x import *
- y
-y # E: Name 'y' is not defined
-[file x.py]
-y = 1
-[out]
-
-[case testScopeOfNestedClass]
-import typing
-def f():
- class A: pass
- A
-A # E: Name 'A' is not defined
-[out]
-
-[case testScopeOfNestedClass2]
-import typing
-class A:
- class B: pass
-B # E: Name 'B' is not defined
-[out]
-
-[case testScopeOfNestedClass3]
-import typing
-class A:
- def f(self):
- class B: pass
- B # E: Name 'B' is not defined
-B # E: Name 'B' is not defined
-[out]
-
-[case testInvalidNestedClassReferenceInDecl]
-import typing
-class A: pass
-foo = 0 # type: A.x # E: Name 'A.x' is not defined
-[out]
-
-[case testTvarScopingWithNestedClass]
-from typing import TypeVar, Generic
-t = TypeVar('t')
-s = TypeVar('s')
-class A(Generic[t]):
- class B(Generic[s]):
- x = 0 # type: A[s]
- y = 0 # type: A[t] # E: Invalid type "__main__.t"
- z = 0 # type: A[s] # E: Invalid type "__main__.s"
- a = 0 # type: A[t]
-[out]
-
-[case testTestExtendPrimitives]
-class C(bool): pass # E: 'bool' is not a valid base class
-class A(int): pass # ok
-class B(float): pass # ok
-class D(str): pass # ok
-[builtins fixtures/primitives.pyi]
-[out]
-
-[case testCyclicInheritance]
-class A(A): pass # E: Cycle in inheritance hierarchy
-[out]
-
-[case testAssignToTypeDef]
-import typing
-class A: pass
-A = None # E: Invalid assignment target
-[out]
-
-[case testInvalidCastTargetSyntax]
-from typing import cast, TypeVar, Generic
-t = TypeVar('t')
-class C(Generic[t]): pass
-cast(str + str, None) # E: Cast target is not a type
-cast(C[str][str], None) # E: Cast target is not a type
-cast(C[str + str], None) # E: Cast target is not a type
-cast([int, str], None) # E: Invalid type
-[out]
-
-[case testInvalidCastTargetType]
-from typing import cast
-x = 0
-cast(x, None) # E: Invalid type "__main__.x"
-cast(t, None) # E: Name 't' is not defined
-cast(__builtins__.x, None) # E: Name '__builtins__.x' is not defined
-[out]
-
-[case testInvalidCastTargetType2]
-from typing import cast
-x = 0
-cast(str[str], None) # E: "str" expects no type arguments, but 1 given
-[out]
-
-[case testInvalidNumberOfArgsToCast]
-from typing import cast
-cast(str) # E: 'cast' expects 2 arguments
-cast(str, None, None) # E: 'cast' expects 2 arguments
-[out]
-
-[case testInvalidKindsOfArgsToCast]
-from typing import cast
-cast(str, *None) # E: 'cast' must be called with 2 positional arguments
-cast(str, target=None) # E: 'cast' must be called with 2 positional arguments
-[out]
-
-[case testInvalidArgsToAny]
-from typing import Any
-Any(str, None) # E: 'Any' expects 1 argument
-Any(arg=str) # E: 'Any' must be called with 1 positional argument
-[out]
-
-[case testTypeListAsType]
-def f(x:[int, str]) -> None: # E: Invalid type
- pass
-[out]
-
-[case testInvalidFunctionType]
-from typing import Callable
-x = None # type: Callable[int, str]
-y = None # type: Callable[int]
-z = None # type: Callable[int, int, int]
-[out]
-main:2: error: The first argument to Callable must be a list of types or "..."
-main:3: error: Invalid function type
-main:4: error: Invalid function type
-
-[case testAbstractGlobalFunction]
-import typing
-from abc import abstractmethod
- at abstractmethod
-def foo(): pass
-[out]
-main:3: error: 'abstractmethod' used with a non-method
-
-[case testAbstractNestedFunction]
-import typing
-from abc import abstractmethod
-def g() -> None:
- @abstractmethod
- def foo(): pass
-[out]
-main:4: error: 'abstractmethod' used with a non-method
-
-[case testInvalidTypeDeclaration]
-import typing
-def f(): pass
-f() = 1 # type: int
-[out]
-main:3: error: Invalid assignment target
-
-[case testIndexedAssignmentWithTypeDeclaration]
-import typing
-None[1] = 1 # type: int
-[out]
-main:2: error: Unexpected type declaration
-
-[case testNonSelfMemberAssignmentWithTypeDeclaration]
-import typing
-None.x = 1 # type: int
-[out]
-main:2: error: Type cannot be declared in assignment to non-self attribute
-
-[case testNonSelfMemberAssignmentWithTypeDeclarationInMethod]
-import typing
-class A:
- def f(self, x) -> None:
- x.y = 1 # type: int
-[out]
-main:4: error: Type cannot be declared in assignment to non-self attribute
-
-[case testInvalidTypeInTypeApplication]
-from typing import TypeVar, Generic
-t = TypeVar('t')
-class A(Generic[t]): pass
-A[TypeVar] # E: Invalid type "typing.TypeVar"
-[out]
-
-[case testInvalidTypeInTypeApplication2]
-from typing import TypeVar, Generic
-t = TypeVar('t')
-class A(Generic[t]): pass
-A[1] # E: Type expected within [...]
-[out]
-
-[case testVariableDeclWithInvalidNumberOfTypes]
-x, y = 1, 2 # type: int, str, int # E: Incompatible number of tuple items
-[out]
-
-[case testVariableDeclWithInvalidNumberOfTypesNested]
-x, (y, z) = 1, (2, 3) # type: int, (str, int, int) # E: Incompatible number of tuple items
-[out]
-
-[case testVariableDeclWithInvalidNumberOfTypesNested2]
-x, (y, z) = 1, (2, 3) # type: int, (str, ) # E: Incompatible number of tuple items
-[out]
-
-[case testVariableDeclWithInvalidNumberOfTypesNested3]
-x, (y, z) = 1, (2, 3) # type: int, str # E: Tuple type expected for multiple variables
-[out]
-
-[case testVariableDeclWithInvalidNumberOfTypesNested4]
-x, (y, z) = 1, (2, 3) # type: int, str, int # E: Incompatible number of tuple items
-[out]
-
-[case testVariableDeclWithInvalidNumberOfTypesNested5]
-x, (y, ) = 1, (2, ) # type: int, str # E: Tuple type expected for multiple variables
-[out]
-
-[case testVariableDeclWithInvalidType]
-x, y = 1, 2 # type: int # E: Tuple type expected for multiple variables
-[out]
-
-[case testInvalidLvalueWithExplicitType]
-a = 1
-a[1] = None # type: int # E: Unexpected type declaration
-a.x = None # type: int \
- # E: Type cannot be declared in assignment to non-self attribute
-a() = None # type: int # E: Invalid assignment target
-[out]
-
-[case testInvalidLvalueWithExplicitType3]
-a = 1
-a.y, a.x = None, None # type: int, int \
- # E: Type cannot be declared in assignment to non-self attribute
-a[1], a[2] = None, None # type: int, int \
- # E: Unexpected type declaration
-[out]
-
-[case testMissingGenericImport]
-from typing import TypeVar
-T = TypeVar('T')
-class A(Generic[T]): pass
-[out]
-main:3: error: Name 'Generic' is not defined
-
-[case testInvalidTypeWithinGeneric]
-from typing import Generic
-class A(Generic[int]): pass # E: Free type variable expected in Generic[...]
-[out]
-
-[case testInvalidTypeWithinNestedGenericClass]
-from typing import Generic, TypeVar
-T = TypeVar('T')
-class A(Generic[T]):
- class B(Generic[T]): pass \
- # E: Free type variable expected in Generic[...]
-[out]
-
-[case testIncludingGenericTwiceInBaseClassList]
-from typing import Generic, TypeVar
-T = TypeVar('T')
-S = TypeVar('S')
-class A(Generic[T], Generic[S]): pass \
- # E: Duplicate Generic in bases
-[out]
-
-[case testInvalidMetaclass]
-class A(metaclass=x): pass # E: Name 'x' is not defined
-[out]
-
-[case testInvalidQualifiedMetaclass]
-import abc
-class A(metaclass=abc.Foo): pass # E: Name 'abc.Foo' is not defined
-[out]
-
-[case testNonClassMetaclass]
-def f(): pass
-class A(metaclass=f): pass # E: Invalid metaclass 'f'
-[out]
-
-[case testInvalidTypevarArguments]
-from typing import TypeVar
-a = TypeVar() # E: Too few arguments for TypeVar()
-b = TypeVar(x='b') # E: TypeVar() expects a string literal as first argument
-c = TypeVar(1) # E: TypeVar() expects a string literal as first argument
-d = TypeVar('D') # E: String argument 1 'D' to TypeVar(...) does not match variable name 'd'
-e = TypeVar('e', int, str, x=1) # E: Unexpected argument to TypeVar(): x
-f = TypeVar('f', (int, str)) # E: Type expected
-g = TypeVar('g', x=(int, str)) # E: Unexpected argument to TypeVar(): x
-h = TypeVar('h', bound=1) # E: TypeVar 'bound' must be a type
-[out]
-
-[case testMoreInvalidTypevarArguments]
-from typing import TypeVar
-T = TypeVar('T', int, str, bound=bool) # E: TypeVar cannot have both values and an upper bound
-S = TypeVar('S', covariant=True, contravariant=True) \
- # E: TypeVar cannot be both covariant and contravariant
-[builtins fixtures/bool.pyi]
-
-[case testInvalidTypevarValues]
-from typing import TypeVar
-b = TypeVar('b', *[int]) # E: Unexpected argument to TypeVar()
-c = TypeVar('c', int, 2) # E: Type expected
-[out]
-
-[case testObsoleteTypevarValuesSyntax]
-from typing import TypeVar
-a = TypeVar('a', values=(int, str))
-[out]
-main:2: error: TypeVar 'values' argument not supported
-main:2: error: Use TypeVar('T', t, ...) instead of TypeVar('T', values=(t, ...))
-
-[case testLocalTypevarScope]
-from typing import TypeVar
-def f() -> None:
- T = TypeVar('T')
-def g(x: T) -> None: pass # E: Name 'T' is not defined
-[out]
-
-[case testClassTypevarScope]
-from typing import TypeVar
-class A:
- T = TypeVar('T')
-def g(x: T) -> None: pass # E: Name 'T' is not defined
-[out]
-
-[case testRedefineVariableAsTypevar]
-from typing import TypeVar
-x = 0
-x = TypeVar('x') # E: Cannot redefine 'x' as a type variable
-[out]
-
-[case testTypevarWithType]
-from typing import TypeVar
-x = TypeVar('x') # type: int # E: Cannot declare the type of a type variable
-[out]
-
-[case testRedefineTypevar]
-from typing import TypeVar
-t = TypeVar('t')
-t = 1 # E: Invalid assignment target
-[out]
-
-[case testRedefineTypevar2]
-from typing import TypeVar
-t = TypeVar('t')
-def t(): pass # E: Name 't' already defined
-[out]
-
-[case testRedefineTypevar3]
-from typing import TypeVar
-t = TypeVar('t')
-class t: pass # E: Name 't' already defined
-[out]
-
-[case testRedefineTypevar4]
-from typing import TypeVar
-t = TypeVar('t')
-from typing import Generic as t # E: Name 't' already defined
-[out]
-
-[case testInvalidStrLiteralType]
-def f(x: 'foo'): pass # E: Name 'foo' is not defined
-[out]
-
-[case testInvalidStrLiteralType2]
-def f(x: 'int['): pass # E: Parse error before end of line
-[out]
-
-[case testInconsistentOverload]
-from typing import overload
-def dec(x): pass
- at overload
-def f(): pass
- at dec # E: 'overload' decorator expected
-def f(): pass
-[out]
-
-[case testInconsistentOverload2]
-from typing import overload
-def dec(x): pass
- at dec # E: 'overload' decorator expected
-def f(): pass
- at overload
-def f(): pass
-[out]
-
-[case testMissingOverloadDecorator]
-from typing import overload
-def dec(x): pass
- at dec # E: 'overload' decorator expected
-def f(): pass
- at dec # E: 'overload' decorator expected
-def f(): pass
-[out]
-
-[case testIncompatibleSignatureInComment]
-import typing
-def f(): # type: (int) -> int
- pass
-def g(x): # type: () -> int
- pass
-[out]
-main:2: error: Type signature has too many arguments
-main:4: error: Type signature has too few arguments
-
-[case testStaticmethodAndNonMethod]
-import typing
- at staticmethod
-def f(): pass
-class A:
- def g(self) -> None:
- @staticmethod
- def h(): pass
-[builtins fixtures/staticmethod.pyi]
-[out]
-main:2: error: 'staticmethod' used with a non-method
-main:6: error: 'staticmethod' used with a non-method
-
-[case testClassmethodAndNonMethod]
-import typing
- at classmethod
-def f(): pass
-class A:
- def g(self) -> None:
- @classmethod
- def h(): pass
-[builtins fixtures/classmethod.pyi]
-[out]
-main:2: error: 'classmethod' used with a non-method
-main:6: error: 'classmethod' used with a non-method
-
-[case testNonMethodProperty]
-import typing
- at property # E: 'property' used with a non-method
-def f() -> int: pass
-[builtins fixtures/property.pyi]
-[out]
-
-[case testInvalidArgCountForProperty]
-import typing
-class A:
- @property
- def f(self, x) -> int: pass # E: Too many arguments
- @property
- def g() -> int: pass # E: Method must have at least one argument
-[builtins fixtures/property.pyi]
-[out]
-
-[case testOverloadedProperty]
-from typing import overload
-class A:
- @overload # E: Decorated property not supported
- @property
- def f(self) -> int: pass
- @property # E: Decorated property not supported
- @overload
- def f(self) -> int: pass
-[builtins fixtures/property.pyi]
-[out]
-
-[case testOverloadedProperty2]
-from typing import overload
-class A:
- @overload
- def f(self) -> int: pass
- @property # E: Decorated property not supported
- @overload
- def f(self) -> int: pass
-[builtins fixtures/property.pyi]
-[out]
-
-[case testDecoratedProperty]
-import typing
-def dec(f): pass
-class A:
- @dec # E: Decorated property not supported
- @property
- def f(self) -> int: pass
- @property # E: Decorated property not supported
- @dec
- def g(self) -> int: pass
-[builtins fixtures/property.pyi]
-[out]
-
-[case testImportTwoModulesWithSameNameInFunction]
-import typing
-def f() -> None:
- import x
- import y as x # E: Name 'x' already defined
- x.y
-[file x.py]
-y = 1
-[file y.py]
-[out]
-
-[case testImportTwoModulesWithSameNameInGlobalContext]
-import typing
-import x
-import y as x # E: Name 'x' already defined
-x.y
-[file x.py]
-y = 1
-[file y.py]
-[out]
-
-[case testListTypeAliasWithoutImport]
-import typing
-def f() -> List[int]: pass
-[builtins fixtures/list.pyi]
-[out]
-main:2: error: Name 'List' is not defined
-
-[case testImportObsoleteTypingFunction]
-from typing import Function # E: Module 'typing' has no attribute 'Function' (it's now called 'typing.Callable')
-from _m import Function # E: Module '_m' has no attribute 'Function'
-[file _m.py]
-[out]
-
-[case testTypeRefresToObsoleteTypingFunction]
-import typing
-import _m
-def f(x: typing.Function[[], None]) -> None: pass
-def g(x: _m.Function[[], None]) -> None: pass
-[file _m.py]
-[out]
-main:3: error: Name 'typing.Function' is not defined (it's now called 'typing.Callable')
---'
-main:4: error: Name '_m.Function' is not defined
-
-[case testUnqualifiedNameRefersToObsoleteTypingFunction]
-x = None # type: Function[[], None]
-[out]
-main:1: error: Name 'Function' is not defined
-main:1: note: (Did you mean 'typing.Callable'?)
-
-[case testInvalidWithTarget]
-def f(): pass
-with f() as 1: pass # E: Invalid assignment target
-[out]
-
-[case testUseObsoleteNameForTypeVar]
-from typing import typevar
-t = typevar('t')
-[out]
-main:1: error: Module 'typing' has no attribute 'typevar' (it's now called 'typing.TypeVar')
---' (this fixes syntax highlighting)
-
-[case testUseObsoleteNameForTypeVar2]
-t = typevar('t')
-[out]
-main:1: error: Name 'typevar' is not defined
-main:1: note: (Did you mean 'typing.TypeVar'?)
-
-[case testUseObsoleteNameForTypeVar3]
-import typing
-t = typing.typevar('t')
-[out]
-main:2: error: Module 'typing' has no attribute 'typevar' (it's now called 'typing.TypeVar')
---' (work around syntax highlighting :-/)
-
-[case testInvalidTypeAnnotation]
-import typing
-def f() -> None:
- 1[2] = 1 # type: int
-[out]
-main:3: error: Unexpected type declaration
-
-[case testInvalidTypeAnnotation2]
-import typing
-def f() -> None:
- f() = 1 # type: int
-[out]
-main:3: error: Invalid assignment target
-
-[case testInvalidReferenceToAttributeOfOuterClass]
-class A:
- class X: pass
- class B:
- y = X # E: Name 'X' is not defined
-[out]
-
-[case testStubPackage]
-from m import x
-from m import y # E: Module 'm' has no attribute 'y'
-[file m/__init__.pyi]
-x = 1
-[out]
-
-[case testStubPackageSubModule]
-from m import x
-from m import y # E: Module 'm' has no attribute 'y'
-from m.m2 import y
-from m.m2 import z # E: Module 'm.m2' has no attribute 'z'
-[file m/__init__.pyi]
-x = 1
-[file m/m2.pyi]
-y = 1
-[out]
-
-[case testMissingStubForThirdPartyModule]
-import nosexcover
-[out]
-main:1: error: No library stub file for module 'nosexcover'
-main:1: note: (Stub files are from https://github.com/python/typeshed)
-
-[case testMissingStubForStdLibModule]
-import tabnanny
-[out]
-main:1: error: No library stub file for standard library module 'tabnanny'
-main:1: note: (Stub files are from https://github.com/python/typeshed)
-
-[case testMissingStubForTwoModules]
-import tabnanny
-import xdrlib
-[out]
-main:1: error: No library stub file for standard library module 'tabnanny'
-main:1: note: (Stub files are from https://github.com/python/typeshed)
-main:2: error: No library stub file for standard library module 'xdrlib'
-
-[case testListComprehensionSpecialScoping]
-class A:
- x = 1
- y = 1
- z = 1
- [x for i in z if y]
-[out]
-main:5: error: Name 'x' is not defined
-main:5: error: Name 'y' is not defined
-
-[case testTypeRedeclarationNoSpuriousWarnings]
-from typing import Tuple
-a = 1 # type: int
-a = 's' # type: str
-a = ('spam', 'spam', 'eggs', 'spam') # type: Tuple[str]
-
-[out]
-main:3: error: Name 'a' already defined
-main:4: error: Name 'a' already defined
diff --git a/test-data/unit/semanal-expressions.test b/test-data/unit/semanal-expressions.test
deleted file mode 100644
index 7c5728b..0000000
--- a/test-data/unit/semanal-expressions.test
+++ /dev/null
@@ -1,395 +0,0 @@
-[case testLiterals]
-(1, 'x', 1.1, 1.1j)
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- TupleExpr:1(
- IntExpr(1)
- StrExpr(x)
- FloatExpr(1.1)
- ComplexExpr(1.1j))))
-
-[case testMemberExpr]
-x = 1
-x.y
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(x* [__main__.x])
- IntExpr(1))
- ExpressionStmt:2(
- MemberExpr:2(
- NameExpr(x [__main__.x])
- y)))
-
-[case testIndexExpr]
-x = y = 1
-x[y]
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- Lvalues(
- NameExpr(x* [__main__.x])
- NameExpr(y* [__main__.y]))
- IntExpr(1))
- ExpressionStmt:2(
- IndexExpr:2(
- NameExpr(x [__main__.x])
- NameExpr(y [__main__.y]))))
-
-[case testBinaryOperations]
-x = y = 1
-x + y
-x | y
-x is not y
-x == y
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- Lvalues(
- NameExpr(x* [__main__.x])
- NameExpr(y* [__main__.y]))
- IntExpr(1))
- ExpressionStmt:2(
- OpExpr:2(
- +
- NameExpr(x [__main__.x])
- NameExpr(y [__main__.y])))
- ExpressionStmt:3(
- OpExpr:3(
- |
- NameExpr(x [__main__.x])
- NameExpr(y [__main__.y])))
- ExpressionStmt:4(
- ComparisonExpr:4(
- is not
- NameExpr(x [__main__.x])
- NameExpr(y [__main__.y])))
- ExpressionStmt:5(
- ComparisonExpr:5(
- ==
- NameExpr(x [__main__.x])
- NameExpr(y [__main__.y]))))
-
-[case testUnaryOperations]
-x = 1
--x
-~x
-+x
-not x
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(x* [__main__.x])
- IntExpr(1))
- ExpressionStmt:2(
- UnaryExpr:2(
- -
- NameExpr(x [__main__.x])))
- ExpressionStmt:3(
- UnaryExpr:3(
- ~
- NameExpr(x [__main__.x])))
- ExpressionStmt:4(
- UnaryExpr:4(
- +
- NameExpr(x [__main__.x])))
- ExpressionStmt:5(
- UnaryExpr:5(
- not
- NameExpr(x [__main__.x]))))
-
-[case testSlices]
-x = y = z = 1
-x[y:z:x]
-x[:]
-x[:y]
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- Lvalues(
- NameExpr(x* [__main__.x])
- NameExpr(y* [__main__.y])
- NameExpr(z* [__main__.z]))
- IntExpr(1))
- ExpressionStmt:2(
- IndexExpr:2(
- NameExpr(x [__main__.x])
- SliceExpr:2(
- NameExpr(y [__main__.y])
- NameExpr(z [__main__.z])
- NameExpr(x [__main__.x]))))
- ExpressionStmt:3(
- IndexExpr:3(
- NameExpr(x [__main__.x])
- SliceExpr:3(
- <empty>
- <empty>)))
- ExpressionStmt:4(
- IndexExpr:4(
- NameExpr(x [__main__.x])
- SliceExpr:4(
- <empty>
- NameExpr(y [__main__.y])))))
-
-[case testTupleLiteral]
-x = y = 1
-x, y
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- Lvalues(
- NameExpr(x* [__main__.x])
- NameExpr(y* [__main__.y]))
- IntExpr(1))
- ExpressionStmt:2(
- TupleExpr:2(
- NameExpr(x [__main__.x])
- NameExpr(y [__main__.y]))))
-
-[case testListLiteral]
-x = y = 1
-([], [x, y])
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- Lvalues(
- NameExpr(x* [__main__.x])
- NameExpr(y* [__main__.y]))
- IntExpr(1))
- ExpressionStmt:2(
- TupleExpr:2(
- ListExpr:2()
- ListExpr:2(
- NameExpr(x [__main__.x])
- NameExpr(y [__main__.y])))))
-
-[case testDictLiterals]
-x = y = 1
-{ x : y, y : x }
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- Lvalues(
- NameExpr(x* [__main__.x])
- NameExpr(y* [__main__.y]))
- IntExpr(1))
- ExpressionStmt:2(
- DictExpr:2(
- NameExpr(x [__main__.x])
- NameExpr(y [__main__.y])
- NameExpr(y [__main__.y])
- NameExpr(x [__main__.x]))))
-
-[case testListComprehension]
-a = 0
-([x + 1 for x in a])
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(a* [__main__.a])
- IntExpr(0))
- ExpressionStmt:2(
- ListComprehension:2(
- GeneratorExpr:2(
- OpExpr:2(
- +
- NameExpr(x [l])
- IntExpr(1))
- NameExpr(x* [l])
- NameExpr(a [__main__.a])))))
-
-[case testListComprehensionInFunction]
-def f(a) -> None:
- [x for x in a]
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Args(
- Var(a))
- def (a: Any)
- Block:1(
- ExpressionStmt:2(
- ListComprehension:2(
- GeneratorExpr:2(
- NameExpr(x [l])
- NameExpr(x* [l])
- NameExpr(a [l])))))))
-
-[case testListComprehensionWithCondition]
-a = 0
-a = [x for x in a if x]
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(a* [__main__.a])
- IntExpr(0))
- AssignmentStmt:2(
- NameExpr(a [__main__.a])
- ListComprehension:2(
- GeneratorExpr:2(
- NameExpr(x [l])
- NameExpr(x* [l])
- NameExpr(a [__main__.a])
- NameExpr(x [l])))))
-
-[case testSetComprehension]
-a = 0
-({x + 1 for x in a})
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(a* [__main__.a])
- IntExpr(0))
- ExpressionStmt:2(
- SetComprehension:2(
- GeneratorExpr:2(
- OpExpr:2(
- +
- NameExpr(x [l])
- IntExpr(1))
- NameExpr(x* [l])
- NameExpr(a [__main__.a])))))
-
-[case testSetComprehensionWithCondition]
-a = 0
-a = {x for x in a if x}
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(a* [__main__.a])
- IntExpr(0))
- AssignmentStmt:2(
- NameExpr(a [__main__.a])
- SetComprehension:2(
- GeneratorExpr:2(
- NameExpr(x [l])
- NameExpr(x* [l])
- NameExpr(a [__main__.a])
- NameExpr(x [l])))))
-
-[case testDictionaryComprehension]
-a = 0
-({x: x + 1 for x in a})
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(a* [__main__.a])
- IntExpr(0))
- ExpressionStmt:2(
- DictionaryComprehension:2(
- NameExpr(x [l])
- OpExpr:2(
- +
- NameExpr(x [l])
- IntExpr(1))
- NameExpr(x* [l])
- NameExpr(a [__main__.a]))))
-
-[case testDictionaryComprehensionWithCondition]
-a = 0
-a = {x: x + 1 for x in a if x}
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(a* [__main__.a])
- IntExpr(0))
- AssignmentStmt:2(
- NameExpr(a [__main__.a])
- DictionaryComprehension:2(
- NameExpr(x [l])
- OpExpr:2(
- +
- NameExpr(x [l])
- IntExpr(1))
- NameExpr(x* [l])
- NameExpr(a [__main__.a])
- NameExpr(x [l]))))
-
-[case testGeneratorExpression]
-a = 0
-x for x in a
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(a* [__main__.a])
- IntExpr(0))
- ExpressionStmt:2(
- GeneratorExpr:2(
- NameExpr(x [l])
- NameExpr(x* [l])
- NameExpr(a [__main__.a]))))
-
-[case testGeneratorExpressionNestedIndex]
-a = 0
-x for x, (y, z) in a
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(a* [__main__.a])
- IntExpr(0))
- ExpressionStmt:2(
- GeneratorExpr:2(
- NameExpr(x [l])
- TupleExpr:2(
- NameExpr(x* [l])
- TupleExpr:2(
- NameExpr(y* [l])
- NameExpr(z* [l])))
- NameExpr(a [__main__.a]))))
-
-[case testLambda]
-x = 0
-lambda: x
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(x* [__main__.x])
- IntExpr(0))
- ExpressionStmt:2(
- FuncExpr:2(
- Block:2(
- ReturnStmt:2(
- NameExpr(x [__main__.x]))))))
-
-[case testLambdaWithArguments]
-lambda x, y: x + y
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- FuncExpr:1(
- Args(
- Var(x)
- Var(y))
- Block:1(
- ReturnStmt:1(
- OpExpr:1(
- +
- NameExpr(x [l])
- NameExpr(y [l])))))))
-
-[case testConditionalExpression]
-int if None else str
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- ConditionalExpr:1(
- Condition(
- NameExpr(None [builtins.None]))
- NameExpr(int [builtins.int])
- NameExpr(str [builtins.str]))))
-
-[case testDictWithKeywordArgs]
-dict(a=1, b=str())
-[builtins fixtures/dict.pyi]
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- DictExpr:1(
- StrExpr(a)
- IntExpr(1)
- StrExpr(b)
- CallExpr:1(
- NameExpr(str [builtins.str])
- Args()))))
diff --git a/test-data/unit/semanal-modules.test b/test-data/unit/semanal-modules.test
deleted file mode 100644
index 7a00e66..0000000
--- a/test-data/unit/semanal-modules.test
+++ /dev/null
@@ -1,877 +0,0 @@
--- NOTE: If a module has a name starting or ending with _, it is skipped in
--- output.
-
-[case testImport]
-import x
-x.y
-[file x.py]
-y = 1
-[out]
-MypyFile:1(
- Import:1(x)
- ExpressionStmt:2(
- MemberExpr:2(
- NameExpr(x)
- y [x.y])))
-MypyFile:1(
- tmp/x.py
- AssignmentStmt:1(
- NameExpr(y* [x.y])
- IntExpr(1)))
-
-[case testImportedNameInType]
-import m
-x = None # type: m.c
-[file m.py]
-class c: pass
-[out]
-MypyFile:1(
- Import:1(m)
- AssignmentStmt:2(
- NameExpr(x [__main__.x])
- NameExpr(None [builtins.None])
- m.c))
-MypyFile:1(
- tmp/m.py
- ClassDef:1(
- c
- PassStmt:1()))
-
-[case testImportFrom]
-from m import y
-x = y
-[file m.py]
-y = 1
-[out]
-MypyFile:1(
- ImportFrom:1(m, [y])
- AssignmentStmt:2(
- NameExpr(x* [__main__.x])
- NameExpr(y [m.y])))
-MypyFile:1(
- tmp/m.py
- AssignmentStmt:1(
- NameExpr(y* [m.y])
- IntExpr(1)))
-
-[case testImportFromType]
-from m import c
-x = None # type: c
-[file m.py]
-class c: pass
-[out]
-MypyFile:1(
- ImportFrom:1(m, [c])
- AssignmentStmt:2(
- NameExpr(x [__main__.x])
- NameExpr(None [builtins.None])
- m.c))
-MypyFile:1(
- tmp/m.py
- ClassDef:1(
- c
- PassStmt:1()))
-
-[case testImportMultiple]
-import _m, _n
-_m.x, _n.y
-[file _m.py]
-x = 1
-[file _n.py]
-y = 2
-[out]
-MypyFile:1(
- Import:1(_m, _n)
- ExpressionStmt:2(
- TupleExpr:2(
- MemberExpr:2(
- NameExpr(_m)
- x [_m.x])
- MemberExpr:2(
- NameExpr(_n)
- y [_n.y]))))
-
-[case testImportAs]
-import _m as n
-n.x
-[file _m.py]
-x = 1
-[out]
-MypyFile:1(
- Import:1(_m : n)
- ExpressionStmt:2(
- MemberExpr:2(
- NameExpr(n [_m])
- x [_m.x])))
-
-[case testImportFromMultiple]
-from _m import x, y
-x, y
-[file _m.py]
-x = y = 1
-[out]
-MypyFile:1(
- ImportFrom:1(_m, [x, y])
- ExpressionStmt:2(
- TupleExpr:2(
- NameExpr(x [_m.x])
- NameExpr(y [_m.y]))))
-
-[case testImportFromAs]
-from _m import y as z
-z
-[file _m.py]
-y = 1
-[out]
-MypyFile:1(
- ImportFrom:1(_m, [y : z])
- ExpressionStmt:2(
- NameExpr(z [_m.y])))
-
-[case testAccessImportedName]
-from m import x
-y = x
-[file m.py]
-from _n import x
-[file _n.py]
-x = 1
-[out]
-MypyFile:1(
- ImportFrom:1(m, [x])
- AssignmentStmt:2(
- NameExpr(y* [__main__.y])
- NameExpr(x [_n.x])))
-MypyFile:1(
- tmp/m.py
- ImportFrom:1(_n, [x]))
-
-[case testAccessImportedName2]
-import _m
-y = _m.x
-[file _m.py]
-from _n import x
-[file _n.py]
-x = 1
-[out]
-MypyFile:1(
- Import:1(_m)
- AssignmentStmt:2(
- NameExpr(y* [__main__.y])
- MemberExpr:2(
- NameExpr(_m)
- x [_n.x])))
-
-[case testAccessingImportedNameInType]
-from _m import c
-x = None # type: c
-[file _m.py]
-from _n import c
-[file _n.py]
-class c: pass
-[out]
-MypyFile:1(
- ImportFrom:1(_m, [c])
- AssignmentStmt:2(
- NameExpr(x [__main__.x])
- NameExpr(None [builtins.None])
- _n.c))
-
-[case testAccessingImportedNameInType2]
-import _m
-x = None # type: _m.c
-[file _m.py]
-from _n import c
-[file _n.py]
-class c: pass
-[out]
-MypyFile:1(
- Import:1(_m)
- AssignmentStmt:2(
- NameExpr(x [__main__.x])
- NameExpr(None [builtins.None])
- _n.c))
-
-[case testAccessingImportedModule]
-from _m import _n
-_n.x
-[file _m.py]
-import _n
-[file _n.py]
-x = 1
-[out]
-MypyFile:1(
- ImportFrom:1(_m, [_n])
- ExpressionStmt:2(
- MemberExpr:2(
- NameExpr(_n)
- x [_n.x])))
-
-[case testAccessingImportedModule]
-import _m
-_m._n.x
-[file _m.py]
-import _n
-[file _n.py]
-x = 1
-[out]
-MypyFile:1(
- Import:1(_m)
- ExpressionStmt:2(
- MemberExpr:2(
- MemberExpr:2(
- NameExpr(_m)
- _n)
- x [_n.x])))
-
-[case testAccessTypeViaDoubleIndirection]
-from _m import c
-a = None # type: c
-[file _m.py]
-from _n import c
-[file _n.py]
-class c: pass
-[out]
-MypyFile:1(
- ImportFrom:1(_m, [c])
- AssignmentStmt:2(
- NameExpr(a [__main__.a])
- NameExpr(None [builtins.None])
- _n.c))
-
-[case testAccessTypeViaDoubleIndirection2]
-import _m
-a = None # type: _m.c
-[file _m.py]
-from _n import c
-[file _n.py]
-class c: pass
-[out]
-MypyFile:1(
- Import:1(_m)
- AssignmentStmt:2(
- NameExpr(a [__main__.a])
- NameExpr(None [builtins.None])
- _n.c))
-
-[case testImportAsterisk]
-from _m import *
-x, y
-[file _m.py]
-x = y = 1
-[out]
-MypyFile:1(
- ImportAll:1(_m)
- ExpressionStmt:2(
- TupleExpr:2(
- NameExpr(x [_m.x])
- NameExpr(y [_m.y]))))
-
-[case testImportAsteriskAndImportedNames]
-from _m import *
-n_.x, y
-[file _m.py]
-import n_
-from n_ import y
-[file n_.py]
-x = y = 1
-[out]
-MypyFile:1(
- ImportAll:1(_m)
- ExpressionStmt:2(
- TupleExpr:2(
- MemberExpr:2(
- NameExpr(n_)
- x [n_.x])
- NameExpr(y [n_.y]))))
-
-[case testImportAsteriskAndImportedNamesInTypes]
-from _m import *
-x = None # type: n_.c
-y = None # type: d
-[file _m.py]
-import n_
-from n_ import d
-[file n_.py]
-class c: pass
-class d: pass
-[out]
-MypyFile:1(
- ImportAll:1(_m)
- AssignmentStmt:2(
- NameExpr(x [__main__.x])
- NameExpr(None [builtins.None])
- n_.c)
- AssignmentStmt:3(
- NameExpr(y [__main__.y])
- NameExpr(None [builtins.None])
- n_.d))
-
-[case testModuleInSubdir]
-import _m
-_m.x
-[file _m/__init__.py]
-x = 1
-[out]
-MypyFile:1(
- Import:1(_m)
- ExpressionStmt:2(
- MemberExpr:2(
- NameExpr(_m)
- x [_m.x])))
-
-[case testNestedModules]
-import m.n
-m.n.x, m.y
-[file m/__init__.py]
-y = 1
-[file m/n.py]
-x = 1
-[out]
-MypyFile:1(
- Import:1(m.n)
- ExpressionStmt:2(
- TupleExpr:2(
- MemberExpr:2(
- MemberExpr:2(
- NameExpr(m)
- n [m.n])
- x [m.n.x])
- MemberExpr:2(
- NameExpr(m)
- y [m.y]))))
-MypyFile:1(
- tmp/m/n.py
- AssignmentStmt:1(
- NameExpr(x* [m.n.x])
- IntExpr(1)))
-
-[case testImportFromSubmodule]
-from m._n import x
-x
-[file m/__init__.py]
-[file m/_n.py]
-x = 1
-[out]
-MypyFile:1(
- ImportFrom:1(m._n, [x])
- ExpressionStmt:2(
- NameExpr(x [m._n.x])))
-
-[case testImportAllFromSubmodule]
-from m._n import *
-x, y
-[file m/__init__.py]
-[file m/_n.py]
-x = y = 1
-[out]
-MypyFile:1(
- ImportAll:1(m._n)
- ExpressionStmt:2(
- TupleExpr:2(
- NameExpr(x [m._n.x])
- NameExpr(y [m._n.y]))))
-
-[case testSubmodulesAndTypes]
-import m._n
-x = None # type: m._n.c
-[file m/__init__.py]
-[file m/_n.py]
-class c: pass
-[out]
-MypyFile:1(
- Import:1(m._n)
- AssignmentStmt:2(
- NameExpr(x [__main__.x])
- NameExpr(None [builtins.None])
- m._n.c))
-
-[case testSubmodulesAndTypes]
-from m._n import c
-x = None # type: c
-[file m/__init__.py]
-[file m/_n.py]
-class c: pass
-[out]
-MypyFile:1(
- ImportFrom:1(m._n, [c])
- AssignmentStmt:2(
- NameExpr(x [__main__.x])
- NameExpr(None [builtins.None])
- m._n.c))
-
-[case testFromPackageImportModule]
-from m import _n
-_n.x
-[file m/__init__.py]
-[file m/_n.py]
-x = 1
-[out]
-MypyFile:1(
- ImportFrom:1(m, [_n])
- ExpressionStmt:2(
- MemberExpr:2(
- NameExpr(_n [m._n])
- x [m._n.x])))
-
-[case testDeeplyNestedModule]
-import m.n.k
-m.n.k.x
-m.n.b
-m.a
-[file m/__init__.py]
-a = 1
-[file m/n/__init__.py]
-b = 1
-[file m/n/k.py]
-x = 1
-[out]
-MypyFile:1(
- Import:1(m.n.k)
- ExpressionStmt:2(
- MemberExpr:2(
- MemberExpr:2(
- MemberExpr:2(
- NameExpr(m)
- n [m.n])
- k [m.n.k])
- x [m.n.k.x]))
- ExpressionStmt:3(
- MemberExpr:3(
- MemberExpr:3(
- NameExpr(m)
- n [m.n])
- b [m.n.b]))
- ExpressionStmt:4(
- MemberExpr:4(
- NameExpr(m)
- a [m.a])))
-MypyFile:1(
- tmp/m/n/k.py
- AssignmentStmt:1(
- NameExpr(x* [m.n.k.x])
- IntExpr(1)))
-
-[case testImportInSubmodule]
-import m._n
-y = m._n.x
-[file m/__init__.py]
-[file m/_n.py]
-from m._k import x
-[file m/_k.py]
-x = 1
-[out]
-MypyFile:1(
- Import:1(m._n)
- AssignmentStmt:2(
- NameExpr(y* [__main__.y])
- MemberExpr:2(
- MemberExpr:2(
- NameExpr(m)
- _n [m._n])
- x [m._k.x])))
-
-[case testBuiltinsUsingModule]
-o = None # type: __builtins__.object
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(o [__main__.o])
- NameExpr(None [builtins.None])
- builtins.object))
-
-[case testImplicitAccessToBuiltins]
-object
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- NameExpr(object [builtins.object])))
-
-[case testAssignmentToModuleAttribute]
-import _m
-_m.x = (
- _m.x)
-[file _m.py]
-x = None
-[out]
-MypyFile:1(
- Import:1(_m)
- AssignmentStmt:2(
- MemberExpr:2(
- NameExpr(_m)
- x [_m.x])
- MemberExpr:3(
- NameExpr(_m)
- x [_m.x])))
-
-[case testAssignmentThatRefersToModule]
-import _m
-_m.x[None] = None
-[file _m.py]
-x = None
-[out]
-MypyFile:1(
- Import:1(_m)
- AssignmentStmt:2(
- IndexExpr:2(
- MemberExpr:2(
- NameExpr(_m)
- x [_m.x])
- NameExpr(None [builtins.None]))
- NameExpr(None [builtins.None])))
-
-[case testImportInBlock]
-if 1:
- import _x
- _x.y
-[file _x.py]
-y = 1
-[out]
-MypyFile:1(
- IfStmt:1(
- If(
- IntExpr(1))
- Then(
- Import:2(_x)
- ExpressionStmt:3(
- MemberExpr:3(
- NameExpr(_x)
- y [_x.y])))))
-
-[case testImportInFunction]
-def f() -> None:
- import _x
- _x.y
-[file _x.py]
-y = 1
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- def ()
- Block:1(
- Import:2(_x)
- ExpressionStmt:3(
- MemberExpr:3(
- NameExpr(_x)
- y [_x.y])))))
-
-[case testImportInClassBody]
-class A:
- from _x import y
- z = y
-[file _x.py]
-y = 1
-[out]
-MypyFile:1(
- ClassDef:1(
- A
- ImportFrom:2(_x, [y])
- AssignmentStmt:3(
- NameExpr(z* [m])
- NameExpr(y [_x.y]))))
-
-[case testImportInClassBody2]
-class A:
- import _x
- z = _x.y
-[file _x.py]
-y = 1
-[out]
-MypyFile:1(
- ClassDef:1(
- A
- Import:2(_x)
- AssignmentStmt:3(
- NameExpr(z* [m])
- MemberExpr:3(
- NameExpr(_x)
- y [_x.y]))))
-
-[case testImportModuleTwice]
-def f() -> None:
- import x
- import x
- x.y
-[file x.py]
-y = 1
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- def ()
- Block:1(
- Import:2(x)
- Import:3(x)
- ExpressionStmt:4(
- MemberExpr:4(
- NameExpr(x)
- y [x.y])))))
-MypyFile:1(
- tmp/x.py
- AssignmentStmt:1(
- NameExpr(y* [x.y])
- IntExpr(1)))
-
-[case testRelativeImport0]
-import m.x
-m.x.z.y
-[file m/__init__.py]
-[file m/x.py]
-from . import z
-[file m/z.py]
-y = 1
-[out]
-MypyFile:1(
- Import:1(m.x)
- ExpressionStmt:2(
- MemberExpr:2(
- MemberExpr:2(
- MemberExpr:2(
- NameExpr(m)
- x [m.x])
- z [m.z])
- y [m.z.y])))
-MypyFile:1(
- tmp/m/x.py
- ImportFrom:1(., [z]))
-MypyFile:1(
- tmp/m/z.py
- AssignmentStmt:1(
- NameExpr(y* [m.z.y])
- IntExpr(1)))
-
-[case testRelativeImport1]
-import m.t.b as b
-b.x.y
-b.z.y
-[file m/__init__.py]
-[file m/x.py]
-y = 1
-[file m/z.py]
-y = 3
-[file m/t/__init__.py]
-[file m/t/b.py]
-from .. import x, z
-[out]
-MypyFile:1(
- Import:1(m.t.b : b)
- ExpressionStmt:2(
- MemberExpr:2(
- MemberExpr:2(
- NameExpr(b [m.t.b])
- x [m.x])
- y [m.x.y]))
- ExpressionStmt:3(
- MemberExpr:3(
- MemberExpr:3(
- NameExpr(b [m.t.b])
- z [m.z])
- y [m.z.y])))
-MypyFile:1(
- tmp/m/t/b.py
- ImportFrom:1(.., [x, z]))
-MypyFile:1(
- tmp/m/x.py
- AssignmentStmt:1(
- NameExpr(y* [m.x.y])
- IntExpr(1)))
-MypyFile:1(
- tmp/m/z.py
- AssignmentStmt:1(
- NameExpr(y* [m.z.y])
- IntExpr(3)))
-
-[case testRelativeImport2]
-import m.t.b as b
-b.xy
-b.zy
-[file m/__init__.py]
-[file m/x.py]
-y = 1
-[file m/z.py]
-y = 3
-[file m/t/__init__.py]
-[file m/t/b.py]
-from ..x import y as xy
-from ..z import y as zy
-[out]
-MypyFile:1(
- Import:1(m.t.b : b)
- ExpressionStmt:2(
- MemberExpr:2(
- NameExpr(b [m.t.b])
- xy [m.x.y]))
- ExpressionStmt:3(
- MemberExpr:3(
- NameExpr(b [m.t.b])
- zy [m.z.y])))
-MypyFile:1(
- tmp/m/t/b.py
- ImportFrom:1(..x, [y : xy])
- ImportFrom:2(..z, [y : zy]))
-MypyFile:1(
- tmp/m/x.py
- AssignmentStmt:1(
- NameExpr(y* [m.x.y])
- IntExpr(1)))
-MypyFile:1(
- tmp/m/z.py
- AssignmentStmt:1(
- NameExpr(y* [m.z.y])
- IntExpr(3)))
-
-[case testRelativeImport3]
-import m.t
-m.zy
-m.xy
-m.t.y
-[file m/__init__.py]
-from .x import *
-from .z import *
-[file m/x.py]
-from .z import zy as xy
-[file m/z.py]
-zy = 3
-[file m/t/__init__.py]
-from .b import *
-[file m/t/b.py]
-from .. import xy as y
-[out]
-MypyFile:1(
- Import:1(m.t)
- ExpressionStmt:2(
- MemberExpr:2(
- NameExpr(m)
- zy [m.z.zy]))
- ExpressionStmt:3(
- MemberExpr:3(
- NameExpr(m)
- xy [m.z.zy]))
- ExpressionStmt:4(
- MemberExpr:4(
- MemberExpr:4(
- NameExpr(m)
- t [m.t])
- y [m.z.zy])))
-MypyFile:1(
- tmp/m/t/b.py
- ImportFrom:1(.., [xy : y]))
-MypyFile:1(
- tmp/m/x.py
- ImportFrom:1(.z, [zy : xy]))
-MypyFile:1(
- tmp/m/z.py
- AssignmentStmt:1(
- NameExpr(zy* [m.z.zy])
- IntExpr(3)))
-
-[case testRelativeImportFromSameModule]
-import m.x
-[file m/__init__.py]
-[file m/x.py]
-from .x import nonexistent
-[out]
-tmp/m/x.py:1: error: Module 'm.x' has no attribute 'nonexistent'
-
-[case testImportFromSameModule]
-import m.x
-[file m/__init__.py]
-[file m/x.py]
-from m.x import nonexistent
-[out]
-tmp/m/x.py:1: error: Module 'm.x' has no attribute 'nonexistent'
-
-[case testFromImportAsInStub]
-from m import *
-x
-y # E: Name 'y' is not defined
-[file m.pyi]
-from m2 import x as x
-from m2 import y
-[file m2.py]
-x = 1
-y = 2
-[out]
-
-[case testFromImportAsInNonStub]
-from m_ import *
-x
-y
-[file m_.py]
-from m2_ import x as x
-from m2_ import y
-[file m2_.py]
-x = 1
-y = 2
-[out]
-MypyFile:1(
- ImportAll:1(m_)
- ExpressionStmt:2(
- NameExpr(x [m2_.x]))
- ExpressionStmt:3(
- NameExpr(y [m2_.y])))
-
-[case testImportAsInStub]
-from m import *
-m2
-m3 # E: Name 'm3' is not defined
-[file m.pyi]
-import m2 as m2
-import m3
-[file m2.py]
-[file m3.py]
-[out]
-
-[case testImportAsInNonStub]
-from m_ import *
-m2_
-m3_
-[file m_.py]
-import m2_ as m2_
-import m3_
-[file m2_.py]
-[file m3_.py]
-[out]
-MypyFile:1(
- ImportAll:1(m_)
- ExpressionStmt:2(
- NameExpr(m2_))
- ExpressionStmt:3(
- NameExpr(m3_)))
-
-[case testErrorsInMultipleModules]
-import m
-x
-[file m.py]
-y
-[out]
-tmp/m.py:1: error: Name 'y' is not defined
-main:2: error: Name 'x' is not defined
-
-[case testImportTwice]
-import typing
-from x import a, a # ok (we could give a warning, but this is valid)
-def f() -> None:
- from x import a
- from x import a # ok
-import x
-import x # ok, since we may import multiple submodules of a package
-[file x.py]
-a = 1
-[out]
-MypyFile:1(
- Import:1(typing)
- ImportFrom:2(x, [a, a])
- FuncDef:3(
- f
- def ()
- Block:3(
- ImportFrom:4(x, [a])
- ImportFrom:5(x, [a])))
- Import:6(x)
- Import:7(x))
-MypyFile:1(
- tmp/x.py
- AssignmentStmt:1(
- NameExpr(a* [x.a])
- IntExpr(1)))
diff --git a/test-data/unit/semanal-namedtuple.test b/test-data/unit/semanal-namedtuple.test
deleted file mode 100644
index a820a07..0000000
--- a/test-data/unit/semanal-namedtuple.test
+++ /dev/null
@@ -1,177 +0,0 @@
--- Semantic analysis of named tuples
-
-[case testSimpleNamedtuple]
-from collections import namedtuple
-N = namedtuple('N', ['a'])
-def f() -> N: pass
-[out]
-MypyFile:1(
- ImportFrom:1(collections, [namedtuple])
- AssignmentStmt:2(
- NameExpr(N* [__main__.N])
- NamedTupleExpr:2(N, Tuple[Any]))
- FuncDef:3(
- f
- def () -> Tuple[Any, fallback=__main__.N]
- Block:3(
- PassStmt:3())))
-
-[case testTwoItemNamedtuple]
-from collections import namedtuple
-N = namedtuple('N', ['a', 'xyz'])
-def f() -> N: pass
-[out]
-MypyFile:1(
- ImportFrom:1(collections, [namedtuple])
- AssignmentStmt:2(
- NameExpr(N* [__main__.N])
- NamedTupleExpr:2(N, Tuple[Any, Any]))
- FuncDef:3(
- f
- def () -> Tuple[Any, Any, fallback=__main__.N]
- Block:3(
- PassStmt:3())))
-
-[case testTwoItemNamedtupleWithTupleFieldNames]
-from collections import namedtuple
-N = namedtuple('N', ('a', 'xyz'))
-def f() -> N: pass
-[out]
-MypyFile:1(
- ImportFrom:1(collections, [namedtuple])
- AssignmentStmt:2(
- NameExpr(N* [__main__.N])
- NamedTupleExpr:2(N, Tuple[Any, Any]))
- FuncDef:3(
- f
- def () -> Tuple[Any, Any, fallback=__main__.N]
- Block:3(
- PassStmt:3())))
-
-[case testTwoItemNamedtupleWithShorthandSyntax]
-from collections import namedtuple
-N = namedtuple('N', ' a xyz ')
-def f() -> N: pass
-[out]
-MypyFile:1(
- ImportFrom:1(collections, [namedtuple])
- AssignmentStmt:2(
- NameExpr(N* [__main__.N])
- NamedTupleExpr:2(N, Tuple[Any, Any]))
- FuncDef:3(
- f
- def () -> Tuple[Any, Any, fallback=__main__.N]
- Block:3(
- PassStmt:3())))
-
-[case testNamedTupleWithItemTypes]
-from typing import NamedTuple
-N = NamedTuple('N', [('a', int),
- ('b', str)])
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [NamedTuple])
- AssignmentStmt:2(
- NameExpr(N* [__main__.N])
- NamedTupleExpr:2(N, Tuple[builtins.int, builtins.str])))
-
-[case testNamedTupleWithTupleFieldNamesWithItemTypes]
-from typing import NamedTuple
-N = NamedTuple('N', (('a', int),
- ('b', str)))
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [NamedTuple])
- AssignmentStmt:2(
- NameExpr(N* [__main__.N])
- NamedTupleExpr:2(N, Tuple[builtins.int, builtins.str])))
-
-[case testNamedTupleBaseClass]
-from collections import namedtuple
-N = namedtuple('N', ['x'])
-class A(N): pass
-[out]
-MypyFile:1(
- ImportFrom:1(collections, [namedtuple])
- AssignmentStmt:2(
- NameExpr(N* [__main__.N])
- NamedTupleExpr:2(N, Tuple[Any]))
- ClassDef:3(
- A
- TupleType(
- Tuple[Any, fallback=__main__.N])
- BaseType(
- __main__.N)
- PassStmt:3()))
-
-[case testNamedTupleBaseClass2]
-from collections import namedtuple
-class A(namedtuple('N', ['x'])): pass
-[out]
-MypyFile:1(
- ImportFrom:1(collections, [namedtuple])
- ClassDef:2(
- A
- TupleType(
- Tuple[Any, fallback=__main__.N at 2])
- BaseType(
- __main__.N at 2)
- PassStmt:2()))
-
-[case testNamedTupleBaseClassWithItemTypes]
-from typing import NamedTuple
-class A(NamedTuple('N', [('x', int)])): pass
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [NamedTuple])
- ClassDef:2(
- A
- TupleType(
- Tuple[builtins.int, fallback=__main__.N at 2])
- BaseType(
- __main__.N at 2)
- PassStmt:2()))
-
--- Errors
-
-[case testNamedTupleWithTooFewArguments]
-from collections import namedtuple
-N = namedtuple('N') # E: Too few arguments for namedtuple()
-
-[case testNamedTupleWithTooManyArguments]
-from collections import namedtuple
-N = namedtuple('N', ['x'], 'y') # E: Too many arguments for namedtuple()
-
-[case testNamedTupleWithInvalidName]
-from collections import namedtuple
-N = namedtuple(1, ['x']) # E: namedtuple() expects a string literal as the first argument
-
-[case testNamedTupleWithInvalidItems]
-from collections import namedtuple
-N = namedtuple('N', 1) # E: List or tuple literal expected as the second argument to namedtuple()
-
-[case testNamedTupleWithInvalidItems2]
-from collections import namedtuple
-N = namedtuple('N', ['x', 1]) # E: String literal expected as namedtuple() item
-
-[case testNamedTupleWithUnderscoreItemName]
-from collections import namedtuple
-N = namedtuple('N', ['_fallback']) # E: namedtuple() field names cannot start with an underscore: _fallback
-
--- NOTE: The following code works at runtime but is not yet supported by mypy.
--- Keyword arguments may potentially be supported in the future.
-[case testNamedTupleWithNonpositionalArgs]
-from collections import namedtuple
-N = namedtuple(typename='N', field_names=['x']) # E: Unexpected arguments to namedtuple()
-
-[case testInvalidNamedTupleBaseClass]
-from typing import NamedTuple
-class A(NamedTuple('N', [1])): pass # E: Tuple expected as NamedTuple() field
-class B(A): pass
-
-[case testInvalidNamedTupleBaseClass2]
-class A(NamedTuple('N', [1])): pass
-class B(A): pass
-[out]
-main:1: error: Name 'NamedTuple' is not defined
-main:1: error: Invalid base class
diff --git a/test-data/unit/semanal-python2.test b/test-data/unit/semanal-python2.test
deleted file mode 100644
index 97264a5..0000000
--- a/test-data/unit/semanal-python2.test
+++ /dev/null
@@ -1,76 +0,0 @@
--- Python 2 semantic analysis test cases.
-
-[case testPrintStatement_python2]
-print int, None
-[out]
-MypyFile:1(
- PrintStmt:1(
- NameExpr(int [builtins.int])
- NameExpr(None [builtins.None])
- Newline))
-
-[case testPrintStatementWithTarget]
-print >>int, None
-[out]
-MypyFile:1(
- PrintStmt:1(
- NameExpr(None [builtins.None])
- Target(
- NameExpr(int [builtins.int]))
- Newline))
-
-[case testExecStatement]
-exec None
-exec None in int
-exec None in int, str
-[out]
-MypyFile:1(
- ExecStmt:1(
- NameExpr(None [builtins.None]))
- ExecStmt:2(
- NameExpr(None [builtins.None])
- NameExpr(int [builtins.int]))
- ExecStmt:3(
- NameExpr(None [builtins.None])
- NameExpr(int [builtins.int])
- NameExpr(str [builtins.str])))
-
-[case testVariableLengthTuple_python2]
-from typing import Tuple, cast
-cast(Tuple[int, ...], ())
-[builtins_py2 fixtures/tuple.pyi]
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [Tuple, cast])
- ExpressionStmt:2(
- CastExpr:2(
- TupleExpr:2()
- builtins.tuple[builtins.int])))
-
-[case testTupleArgList_python2]
-def f(x, (y, z)):
- x = y
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Args(
- Var(x)
- Var(__tuple_arg_2))
- Block:1(
- AssignmentStmt:1(
- TupleExpr:1(
- NameExpr(y* [l])
- NameExpr(z* [l]))
- NameExpr(__tuple_arg_2 [l]))
- AssignmentStmt:2(
- NameExpr(x [l])
- NameExpr(y [l])))))
-
-[case testBackquoteExpr_python2]
-`object`
-[out]
-MypyFile:1(
- ExpressionStmt:1(
- BackquoteExpr:1(
- NameExpr(object [builtins.object]))))
diff --git a/test-data/unit/semanal-statements.test b/test-data/unit/semanal-statements.test
deleted file mode 100644
index 8825c8e..0000000
--- a/test-data/unit/semanal-statements.test
+++ /dev/null
@@ -1,925 +0,0 @@
-[case testReturn]
-def f(x): return x
-def g(): return
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Args(
- Var(x))
- Block:1(
- ReturnStmt:1(
- NameExpr(x [l]))))
- FuncDef:2(
- g
- Block:2(
- ReturnStmt:2())))
-
-[case testRaise]
-raise object()
-[out]
-MypyFile:1(
- RaiseStmt:1(
- CallExpr:1(
- NameExpr(object [builtins.object])
- Args())))
-
-[case testYield]
-def f(): yield f
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Generator
- Block:1(
- ExpressionStmt:1(
- YieldExpr:1(
- NameExpr(f [__main__.f]))))))
-
-[case testAssert]
-assert object
-[out]
-MypyFile:1(
- AssertStmt:1(
- NameExpr(object [builtins.object])))
-
-[case testOperatorAssignment]
-x = y = 1
-x += y
-y |= x
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- Lvalues(
- NameExpr(x* [__main__.x])
- NameExpr(y* [__main__.y]))
- IntExpr(1))
- OperatorAssignmentStmt:2(
- +
- NameExpr(x [__main__.x])
- NameExpr(y [__main__.y]))
- OperatorAssignmentStmt:3(
- |
- NameExpr(y [__main__.y])
- NameExpr(x [__main__.x])))
-
-[case testWhile]
-x = y = 1
-while x:
- y
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- Lvalues(
- NameExpr(x* [__main__.x])
- NameExpr(y* [__main__.y]))
- IntExpr(1))
- WhileStmt:2(
- NameExpr(x [__main__.x])
- Block:2(
- ExpressionStmt:3(
- NameExpr(y [__main__.y])))))
-
-[case testFor]
-for x in object:
- x
-[out]
-MypyFile:1(
- ForStmt:1(
- NameExpr(x* [__main__.x])
- NameExpr(object [builtins.object])
- Block:1(
- ExpressionStmt:2(
- NameExpr(x [__main__.x])))))
-
-[case testForInFunction]
-def f():
- for x in f:
- x
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Block:1(
- ForStmt:2(
- NameExpr(x* [l])
- NameExpr(f [__main__.f])
- Block:2(
- ExpressionStmt:3(
- NameExpr(x [l])))))))
-
-[case testMultipleForIndexVars]
-for x, y in []:
- x, y
-[out]
-MypyFile:1(
- ForStmt:1(
- TupleExpr:1(
- NameExpr(x* [__main__.x])
- NameExpr(y* [__main__.y]))
- ListExpr:1()
- Block:1(
- ExpressionStmt:2(
- TupleExpr:2(
- NameExpr(x [__main__.x])
- NameExpr(y [__main__.y]))))))
-
-[case testForIndexVarScope]
-for x in []:
- pass
-x
-[out]
-MypyFile:1(
- ForStmt:1(
- NameExpr(x* [__main__.x])
- ListExpr:1()
- Block:1(
- PassStmt:2()))
- ExpressionStmt:3(
- NameExpr(x [__main__.x])))
-
-[case testForIndexVarScope2]
-def f():
- for x in []:
- pass
- x
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Block:1(
- ForStmt:2(
- NameExpr(x* [l])
- ListExpr:2()
- Block:2(
- PassStmt:3()))
- ExpressionStmt:4(
- NameExpr(x [l])))))
-
-[case testReusingForLoopIndexVariable]
-for x in None:
- pass
-for x in None:
- pass
-[out]
-MypyFile:1(
- ForStmt:1(
- NameExpr(x* [__main__.x])
- NameExpr(None [builtins.None])
- Block:1(
- PassStmt:2()))
- ForStmt:3(
- NameExpr(x [__main__.x])
- NameExpr(None [builtins.None])
- Block:3(
- PassStmt:4())))
-
-[case testReusingForLoopIndexVariable2]
-def f():
- for x in None:
- pass
- for x in None:
- pass
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Block:1(
- ForStmt:2(
- NameExpr(x* [l])
- NameExpr(None [builtins.None])
- Block:2(
- PassStmt:3()))
- ForStmt:4(
- NameExpr(x [l])
- NameExpr(None [builtins.None])
- Block:4(
- PassStmt:5())))))
-
-[case testLoopWithElse]
-for x in []:
- pass
-else:
- x
-while 1:
- pass
-else:
- x
-[out]
-MypyFile:1(
- ForStmt:1(
- NameExpr(x* [__main__.x])
- ListExpr:1()
- Block:1(
- PassStmt:2())
- Else(
- ExpressionStmt:4(
- NameExpr(x [__main__.x]))))
- WhileStmt:5(
- IntExpr(1)
- Block:5(
- PassStmt:6())
- Else(
- ExpressionStmt:8(
- NameExpr(x [__main__.x])))))
-
-[case testBreak]
-while 1:
- break
-for x in []:
- break
-[out]
-MypyFile:1(
- WhileStmt:1(
- IntExpr(1)
- Block:1(
- BreakStmt:2()))
- ForStmt:3(
- NameExpr(x* [__main__.x])
- ListExpr:3()
- Block:3(
- BreakStmt:4())))
-
-[case testContinue]
-while 1:
- continue
-for x in []:
- continue
-[out]
-MypyFile:1(
- WhileStmt:1(
- IntExpr(1)
- Block:1(
- ContinueStmt:2()))
- ForStmt:3(
- NameExpr(x* [__main__.x])
- ListExpr:3()
- Block:3(
- ContinueStmt:4())))
-
-[case testIf]
-x = 1
-if x:
- x
-elif x:
- x
-elif x:
- x
-else:
- x
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(x* [__main__.x])
- IntExpr(1))
- IfStmt:2(
- If(
- NameExpr(x [__main__.x]))
- Then(
- ExpressionStmt:3(
- NameExpr(x [__main__.x])))
- If(
- NameExpr(x [__main__.x]))
- Then(
- ExpressionStmt:5(
- NameExpr(x [__main__.x])))
- If(
- NameExpr(x [__main__.x]))
- Then(
- ExpressionStmt:7(
- NameExpr(x [__main__.x])))
- Else(
- ExpressionStmt:9(
- NameExpr(x [__main__.x])))))
-
-[case testSimpleIf]
-if object:
- object
-[out]
-MypyFile:1(
- IfStmt:1(
- If(
- NameExpr(object [builtins.object]))
- Then(
- ExpressionStmt:2(
- NameExpr(object [builtins.object])))))
-
-[case testLvalues]
-x = y = 1
-x = 1
-x.m = 1
-x[y] = 1
-x, y = 1
-[x, y] = 1
-(x, y) = 1
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- Lvalues(
- NameExpr(x* [__main__.x])
- NameExpr(y* [__main__.y]))
- IntExpr(1))
- AssignmentStmt:2(
- NameExpr(x [__main__.x])
- IntExpr(1))
- AssignmentStmt:3(
- MemberExpr:3(
- NameExpr(x [__main__.x])
- m)
- IntExpr(1))
- AssignmentStmt:4(
- IndexExpr:4(
- NameExpr(x [__main__.x])
- NameExpr(y [__main__.y]))
- IntExpr(1))
- AssignmentStmt:5(
- TupleExpr:5(
- NameExpr(x [__main__.x])
- NameExpr(y [__main__.y]))
- IntExpr(1))
- AssignmentStmt:6(
- ListExpr:6(
- NameExpr(x [__main__.x])
- NameExpr(y [__main__.y]))
- IntExpr(1))
- AssignmentStmt:7(
- TupleExpr:7(
- NameExpr(x [__main__.x])
- NameExpr(y [__main__.y]))
- IntExpr(1)))
-
-[case testStarLvalues]
-*x, y = 1
-*x, (y, *z) = 1
-*(x, q), r = 1
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- TupleExpr:1(
- StarExpr:1(
- NameExpr(x* [__main__.x]))
- NameExpr(y* [__main__.y]))
- IntExpr(1))
- AssignmentStmt:2(
- TupleExpr:2(
- StarExpr:2(
- NameExpr(x [__main__.x]))
- TupleExpr:2(
- NameExpr(y [__main__.y])
- StarExpr:2(
- NameExpr(z* [__main__.z]))))
- IntExpr(1))
- AssignmentStmt:3(
- TupleExpr:3(
- StarExpr:3(
- TupleExpr:3(
- NameExpr(x [__main__.x])
- NameExpr(q* [__main__.q])))
- NameExpr(r* [__main__.r]))
- IntExpr(1)))
-
-[case testMultipleDefinition]
-x, y = 1
-x, y = 2
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- TupleExpr:1(
- NameExpr(x* [__main__.x])
- NameExpr(y* [__main__.y]))
- IntExpr(1))
- AssignmentStmt:2(
- TupleExpr:2(
- NameExpr(x [__main__.x])
- NameExpr(y [__main__.y]))
- IntExpr(2)))
-
-[case testComplexDefinitions]
-(x) = 1
-([y]) = 2
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(x* [__main__.x])
- IntExpr(1))
- AssignmentStmt:2(
- ListExpr:2(
- NameExpr(y* [__main__.y]))
- IntExpr(2)))
-
-[case testLocalComplexDefinition]
-def f():
- (x) = 1
- x
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Block:1(
- AssignmentStmt:2(
- NameExpr(x* [l])
- IntExpr(1))
- ExpressionStmt:3(
- NameExpr(x [l])))))
-
-[case testMultipleDefOnlySomeNew]
-x = 1
-y, x = 1
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(x* [__main__.x])
- IntExpr(1))
- AssignmentStmt:2(
- TupleExpr:2(
- NameExpr(y* [__main__.y])
- NameExpr(x [__main__.x]))
- IntExpr(1)))
-
-[case testMultipleDefOnlySomeNewNestedTuples]
-x = 1
-y, (x, z) = 1
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(x* [__main__.x])
- IntExpr(1))
- AssignmentStmt:2(
- TupleExpr:2(
- NameExpr(y* [__main__.y])
- TupleExpr:2(
- NameExpr(x [__main__.x])
- NameExpr(z* [__main__.z])))
- IntExpr(1)))
-
-[case testMultipleDefOnlySomeNewNestedLists]
-x = 1
-y, [x, z] = 1
-[p, [x, r]] = 1
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(x* [__main__.x])
- IntExpr(1))
- AssignmentStmt:2(
- TupleExpr:2(
- NameExpr(y* [__main__.y])
- ListExpr:2(
- NameExpr(x [__main__.x])
- NameExpr(z* [__main__.z])))
- IntExpr(1))
- AssignmentStmt:3(
- ListExpr:3(
- NameExpr(p* [__main__.p])
- ListExpr:3(
- NameExpr(x [__main__.x])
- NameExpr(r* [__main__.r])))
- IntExpr(1)))
-
-[case testIndexedDel]
-x = y = 1
-del x[y]
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- Lvalues(
- NameExpr(x* [__main__.x])
- NameExpr(y* [__main__.y]))
- IntExpr(1))
- DelStmt:2(
- IndexExpr:2(
- NameExpr(x [__main__.x])
- NameExpr(y [__main__.y]))))
-
-[case testDelGlobalName]
-x = 1
-del x
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(x* [__main__.x])
- IntExpr(1))
- DelStmt:2(
- NameExpr(x [__main__.x])))
-
-[case testDelLocalName]
-def f(x):
- del x
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Args(
- Var(x))
- Block:1(
- DelStmt:2(
- NameExpr(x [l])))))
-
-[case testDelMultipleThings]
-def f(x, y):
- del x, y[0]
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Args(
- Var(x)
- Var(y))
- Block:1(
- DelStmt:2(
- TupleExpr:2(
- NameExpr(x [l])
- IndexExpr:2(
- NameExpr(y [l])
- IntExpr(0)))))))
-
-[case testDelMultipleThingsInvalid]
-def f(x, y) -> None:
- del x, y + 1
-[out]
-main:2: error: Invalid delete target
-
-[case testTry]
-class c: pass
-try:
- c
-except object:
- c
-except c as e:
- e
-except:
- c
-finally:
- c
-[out]
-MypyFile:1(
- ClassDef:1(
- c
- PassStmt:1())
- TryStmt:2(
- Block:2(
- ExpressionStmt:3(
- NameExpr(c [__main__.c])))
- NameExpr(object [builtins.object])
- Block:4(
- ExpressionStmt:5(
- NameExpr(c [__main__.c])))
- NameExpr(c [__main__.c])
- NameExpr(e* [__main__.e])
- Block:6(
- ExpressionStmt:7(
- NameExpr(e [__main__.e])))
- Block:8(
- ExpressionStmt:9(
- NameExpr(c [__main__.c])))
- Finally(
- ExpressionStmt:11(
- NameExpr(c [__main__.c])))))
-
-[case testTryElse]
-try:
- pass
-except:
- pass
-else:
- object
-[out]
-MypyFile:1(
- TryStmt:1(
- Block:1(
- PassStmt:2())
- Block:3(
- PassStmt:4())
- Else(
- ExpressionStmt:6(
- NameExpr(object [builtins.object])))))
-
-[case testTryWithOnlyFinally]
-try:
- pass
-finally:
- pass
-[out]
-MypyFile:1(
- TryStmt:1(
- Block:1(
- PassStmt:2())
- Finally(
- PassStmt:4())))
-
-[case testExceptWithMultipleTypes]
-class c: pass
-try:
- pass
-except (c, object) as e:
- e
-[out]
-MypyFile:1(
- ClassDef:1(
- c
- PassStmt:1())
- TryStmt:2(
- Block:2(
- PassStmt:3())
- TupleExpr:4(
- NameExpr(c [__main__.c])
- NameExpr(object [builtins.object]))
- NameExpr(e* [__main__.e])
- Block:4(
- ExpressionStmt:5(
- NameExpr(e [__main__.e])))))
-
-[case testRaiseWithoutExpr]
-raise
-[out]
-MypyFile:1(
- RaiseStmt:1())
-
-[case testWith]
-with object:
- object
-[out]
-MypyFile:1(
- WithStmt:1(
- Expr(
- NameExpr(object [builtins.object]))
- Block:1(
- ExpressionStmt:2(
- NameExpr(object [builtins.object])))))
-
-[case testWithAndVariable]
-with object as x:
- x
-[out]
-MypyFile:1(
- WithStmt:1(
- Expr(
- NameExpr(object [builtins.object]))
- Target(
- NameExpr(x* [__main__.x]))
- Block:1(
- ExpressionStmt:2(
- NameExpr(x [__main__.x])))))
-
-[case testWithInFunction]
-def f():
- with f as x:
- x
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Block:1(
- WithStmt:2(
- Expr(
- NameExpr(f [__main__.f]))
- Target(
- NameExpr(x* [l]))
- Block:2(
- ExpressionStmt:3(
- NameExpr(x [l])))))))
-
-[case testComplexWith]
-with object, object:
- pass
-with object as a, object as b:
- pass
-[out]
-MypyFile:1(
- WithStmt:1(
- Expr(
- NameExpr(object [builtins.object]))
- Expr(
- NameExpr(object [builtins.object]))
- Block:1(
- PassStmt:2()))
- WithStmt:3(
- Expr(
- NameExpr(object [builtins.object]))
- Target(
- NameExpr(a* [__main__.a]))
- Expr(
- NameExpr(object [builtins.object]))
- Target(
- NameExpr(b* [__main__.b]))
- Block:3(
- PassStmt:4())))
-
-[case testVariableInBlock]
-while object:
- x = None
- x = x
-[out]
-MypyFile:1(
- WhileStmt:1(
- NameExpr(object [builtins.object])
- Block:1(
- AssignmentStmt:2(
- NameExpr(x* [__main__.x])
- NameExpr(None [builtins.None]))
- AssignmentStmt:3(
- NameExpr(x [__main__.x])
- NameExpr(x [__main__.x])))))
-
-[case testVariableInExceptHandler]
-try:
- pass
-except object as o:
- x = None
- o = x
-[out]
-MypyFile:1(
- TryStmt:1(
- Block:1(
- PassStmt:2())
- NameExpr(object [builtins.object])
- NameExpr(o* [__main__.o])
- Block:3(
- AssignmentStmt:4(
- NameExpr(x* [__main__.x])
- NameExpr(None [builtins.None]))
- AssignmentStmt:5(
- NameExpr(o [__main__.o])
- NameExpr(x [__main__.x])))))
-
-[case testCallInExceptHandler]
-try:
- pass
-except object as o:
- o = object()
-[out]
-MypyFile:1(
- TryStmt:1(
- Block:1(
- PassStmt:2())
- NameExpr(object [builtins.object])
- NameExpr(o* [__main__.o])
- Block:3(
- AssignmentStmt:4(
- NameExpr(o [__main__.o])
- CallExpr:4(
- NameExpr(object [builtins.object])
- Args())))))
-
-[case testTryExceptWithMultipleHandlers]
-try:
- pass
-except BaseException as e:
- pass
-except Err as f:
- f = BaseException() # Fail
- f = Err()
-class Err(BaseException): pass
-[builtins fixtures/exception.pyi]
-[out]
-MypyFile:1(
- TryStmt:1(
- Block:1(
- PassStmt:2())
- NameExpr(BaseException [builtins.BaseException])
- NameExpr(e* [__main__.e])
- Block:3(
- PassStmt:4())
- NameExpr(Err [__main__.Err])
- NameExpr(f* [__main__.f])
- Block:5(
- AssignmentStmt:6(
- NameExpr(f [__main__.f])
- CallExpr:6(
- NameExpr(BaseException [builtins.BaseException])
- Args()))
- AssignmentStmt:7(
- NameExpr(f [__main__.f])
- CallExpr:7(
- NameExpr(Err [__main__.Err])
- Args()))))
- ClassDef:8(
- Err
- BaseType(
- builtins.BaseException)
- PassStmt:8()))
-
-[case testMultipleAssignmentWithPartialNewDef]
-o = None
-x, o = o, o
-[out]
-MypyFile:1(
- AssignmentStmt:1(
- NameExpr(o* [__main__.o])
- NameExpr(None [builtins.None]))
- AssignmentStmt:2(
- TupleExpr:2(
- NameExpr(x* [__main__.x])
- NameExpr(o [__main__.o]))
- TupleExpr:2(
- NameExpr(o [__main__.o])
- NameExpr(o [__main__.o]))))
-
-[case testFunctionDecorator]
-def decorate(f): pass
- at decorate
-def g():
- g()
-[out]
-MypyFile:1(
- FuncDef:1(
- decorate
- Args(
- Var(f))
- Block:1(
- PassStmt:1()))
- Decorator:2(
- Var(g)
- NameExpr(decorate [__main__.decorate])
- FuncDef:3(
- g
- Block:3(
- ExpressionStmt:4(
- CallExpr:4(
- NameExpr(g [__main__.g])
- Args()))))))
-
-[case testTryWithinFunction]
-def f() -> None:
- try:
- pass
- except object as o:
- pass
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- def ()
- Block:1(
- TryStmt:2(
- Block:2(
- PassStmt:3())
- NameExpr(object [builtins.object])
- NameExpr(o* [l])
- Block:4(
- PassStmt:5())))))
-
-[case testReuseExceptionVariable]
-def f() -> None:
- try:
- pass
- except object as o:
- pass
- except object as o:
- pass
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- def ()
- Block:1(
- TryStmt:2(
- Block:2(
- PassStmt:3())
- NameExpr(object [builtins.object])
- NameExpr(o* [l])
- Block:4(
- PassStmt:5())
- NameExpr(object [builtins.object])
- NameExpr(o [l])
- Block:6(
- PassStmt:7())))))
-
-[case testWithMultiple]
-def f(a):
- pass
-def main():
- with f(0) as a, f(a) as b:
- x = a, b
-[out]
-MypyFile:1(
- FuncDef:1(
- f
- Args(
- Var(a))
- Block:1(
- PassStmt:2()))
- FuncDef:3(
- main
- Block:3(
- WithStmt:4(
- Expr(
- CallExpr:4(
- NameExpr(f [__main__.f])
- Args(
- IntExpr(0))))
- Target(
- NameExpr(a* [l]))
- Expr(
- CallExpr:4(
- NameExpr(f [__main__.f])
- Args(
- NameExpr(a [l]))))
- Target(
- NameExpr(b* [l]))
- Block:4(
- AssignmentStmt:5(
- NameExpr(x* [l])
- TupleExpr:5(
- NameExpr(a [l])
- NameExpr(b [l]))))))))
diff --git a/test-data/unit/semanal-symtable.test b/test-data/unit/semanal-symtable.test
deleted file mode 100644
index 4821635..0000000
--- a/test-data/unit/semanal-symtable.test
+++ /dev/null
@@ -1,52 +0,0 @@
-[case testEmptyFile]
-[out]
--- Note that builtins are ignored to simplify output.
-__main__:
- SymbolTable()
-
-[case testVarDef]
-x = 1
-[out]
-__main__:
- SymbolTable(
- x : Gdef/Var (__main__))
-
-[case testFuncDef]
-def f(): pass
-[out]
-__main__:
- SymbolTable(
- f : Gdef/FuncDef (__main__))
-
-[case testEmptyClassDef]
-class c: pass
-[out]
-__main__:
- SymbolTable(
- c : Gdef/TypeInfo (__main__))
-
-[case testImport]
-import m
-[file m.py]
-x = 1
-[out]
-__main__:
- SymbolTable(
- m : ModuleRef/MypyFile (__main__))
-m:
- SymbolTable(
- x : Gdef/Var (m))
-
-[case testImportFromModule]
-from m import x
-[file m.py]
-class x: pass
-y = 1
-[out]
-__main__:
- SymbolTable(
- x : Gdef/TypeInfo (__main__))
-m:
- SymbolTable(
- x : Gdef/TypeInfo (m)
- y : Gdef/Var (m))
diff --git a/test-data/unit/semanal-typealiases.test b/test-data/unit/semanal-typealiases.test
deleted file mode 100644
index 5178a71..0000000
--- a/test-data/unit/semanal-typealiases.test
+++ /dev/null
@@ -1,440 +0,0 @@
-[case testListTypeAlias]
-from typing import List
-def f() -> List[int]: pass
-[builtins fixtures/list.pyi]
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [List])
- FuncDef:2(
- f
- def () -> builtins.list[builtins.int]
- Block:2(
- PassStmt:2())))
-
-[case testDictTypeAlias]
-from typing import Dict
-def f() -> Dict[int, str]: pass
-[builtins fixtures/dict.pyi]
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [Dict])
- FuncDef:2(
- f
- def () -> builtins.dict[builtins.int, builtins.str]
- Block:2(
- PassStmt:2())))
-
-[case testQualifiedTypeAlias]
-import typing
-def f() -> typing.List[int]: pass
-[builtins fixtures/list.pyi]
-[out]
-MypyFile:1(
- Import:1(typing)
- FuncDef:2(
- f
- def () -> builtins.list[builtins.int]
- Block:2(
- PassStmt:2())))
-
-[case testTypeApplicationWithTypeAlias]
-from typing import List
-List[List[int]]
-[builtins fixtures/list.pyi]
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [List])
- ExpressionStmt:2(
- TypeApplication:2(
- NameExpr(List [builtins.list])
- Types(
- builtins.list[builtins.int]))))
-
-[case testTypeApplicationWithQualifiedTypeAlias]
-import typing
-typing.List[typing.List[int]]
-[builtins fixtures/list.pyi]
-[out]
-MypyFile:1(
- Import:1(typing)
- ExpressionStmt:2(
- TypeApplication:2(
- MemberExpr:2(
- NameExpr(typing)
- List [builtins.list])
- Types(
- builtins.list[builtins.int]))))
-
-[case testSimpleTypeAlias]
-import typing
-class A: pass
-A2 = A
-def f(x: A2) -> A: pass
-[out]
-MypyFile:1(
- Import:1(typing)
- ClassDef:2(
- A
- PassStmt:2())
- AssignmentStmt:3(
- NameExpr(A2* [__main__.A2])
- NameExpr(A [__main__.A]))
- FuncDef:4(
- f
- Args(
- Var(x))
- def (x: __main__.A) -> __main__.A
- Block:4(
- PassStmt:4())))
-
-[case testQualifiedSimpleTypeAlias]
-import typing
-import _m
-A2 = _m.A
-x = 1 # type: A2
-[file _m.py]
-import typing
-class A: pass
-[out]
-MypyFile:1(
- Import:1(typing)
- Import:2(_m)
- AssignmentStmt:3(
- NameExpr(A2* [__main__.A2])
- MemberExpr:3(
- NameExpr(_m)
- A [_m.A]))
- AssignmentStmt:4(
- NameExpr(x [__main__.x])
- IntExpr(1)
- _m.A))
-
-[case testUnionTypeAlias]
-from typing import Union
-U = Union[int, str]
-def f(x: U) -> None: pass
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [Union])
- AssignmentStmt:2(
- NameExpr(U* [__main__.U])
- TypeAliasExpr(Union[builtins.int, builtins.str]))
- FuncDef:3(
- f
- Args(
- Var(x))
- def (x: Union[builtins.int, builtins.str])
- Block:3(
- PassStmt:3())))
-
-[case testUnionTypeAlias2]
-from typing import Union
-class A: pass
-U = Union[int, A]
-def f(x: U) -> None: pass
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [Union])
- ClassDef:2(
- A
- PassStmt:2())
- AssignmentStmt:3(
- NameExpr(U* [__main__.U])
- TypeAliasExpr(Union[builtins.int, __main__.A]))
- FuncDef:4(
- f
- Args(
- Var(x))
- def (x: Union[builtins.int, __main__.A])
- Block:4(
- PassStmt:4())))
-
-[case testUnionTypeAliasWithQualifiedUnion]
-import typing
-U = typing.Union[int, str]
-def f(x: U) -> None: pass
-[out]
-MypyFile:1(
- Import:1(typing)
- AssignmentStmt:2(
- NameExpr(U* [__main__.U])
- TypeAliasExpr(Union[builtins.int, builtins.str]))
- FuncDef:3(
- f
- Args(
- Var(x))
- def (x: Union[builtins.int, builtins.str])
- Block:3(
- PassStmt:3())))
-
-[case testTupleTypeAlias]
-from typing import Tuple
-T = Tuple[int, str]
-def f(x: T) -> None: pass
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [Tuple])
- AssignmentStmt:2(
- NameExpr(T* [__main__.T])
- TypeAliasExpr(Tuple[builtins.int, builtins.str]))
- FuncDef:3(
- f
- Args(
- Var(x))
- def (x: Tuple[builtins.int, builtins.str])
- Block:3(
- PassStmt:3())))
-
-[case testCallableTypeAlias]
-from typing import Callable
-C = Callable[[int], None]
-def f(x: C) -> None: pass
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [Callable])
- AssignmentStmt:2(
- NameExpr(C* [__main__.C])
- TypeAliasExpr(def (builtins.int)))
- FuncDef:3(
- f
- Args(
- Var(x))
- def (x: def (builtins.int))
- Block:3(
- PassStmt:3())))
-
-[case testGenericTypeAlias]
-from typing import Generic, TypeVar
-T = TypeVar('T')
-class G(Generic[T]): pass
-A = G[int]
-def f(x: A) -> None: pass
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [Generic, TypeVar])
- AssignmentStmt:2(
- NameExpr(T* [__main__.T])
- TypeVarExpr:2())
- ClassDef:3(
- G
- TypeVars(
- T)
- PassStmt:3())
- AssignmentStmt:4(
- NameExpr(A* [__main__.A])
- TypeAliasExpr(__main__.G[builtins.int]))
- FuncDef:5(
- f
- Args(
- Var(x))
- def (x: __main__.G[builtins.int])
- Block:5(
- PassStmt:5())))
-
-[case testGenericTypeAlias2]
-from typing import List
-A = List[int]
-def f(x: A) -> None: pass
-[builtins fixtures/list.pyi]
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [List])
- AssignmentStmt:2(
- NameExpr(A* [__main__.A])
- TypeAliasExpr(builtins.list[builtins.int]))
- FuncDef:3(
- f
- Args(
- Var(x))
- def (x: builtins.list[builtins.int])
- Block:3(
- PassStmt:3())))
-
-[case testImportUnionTypeAlias]
-import typing
-from _m import U
-def f(x: U) -> None: pass
-[file _m.py]
-from typing import Union
-class A: pass
-U = Union[int, A]
-[out]
-MypyFile:1(
- Import:1(typing)
- ImportFrom:2(_m, [U])
- FuncDef:3(
- f
- Args(
- Var(x))
- def (x: Union[builtins.int, _m.A])
- Block:3(
- PassStmt:3())))
-
-[case testImportUnionTypeAlias2]
-import typing
-import _m
-def f(x: _m.U) -> None: pass
-[file _m.py]
-from typing import Union
-class A: pass
-U = Union[int, A]
-[out]
-MypyFile:1(
- Import:1(typing)
- Import:2(_m)
- FuncDef:3(
- f
- Args(
- Var(x))
- def (x: Union[builtins.int, _m.A])
- Block:3(
- PassStmt:3())))
-
-[case testImportSimpleTypeAlias]
-import typing
-from _m import A
-def f(x: A) -> None: pass
-[file _m.py]
-import typing
-A = int
-[out]
-MypyFile:1(
- Import:1(typing)
- ImportFrom:2(_m, [A])
- FuncDef:3(
- f
- Args(
- Var(x))
- def (x: builtins.int)
- Block:3(
- PassStmt:3())))
-
-[case testImportSimpleTypeAlias2]
-import typing
-import _m
-def f(x: _m.A) -> None: pass
-[file _m.py]
-import typing
-A = int
-[out]
-MypyFile:1(
- Import:1(typing)
- Import:2(_m)
- FuncDef:3(
- f
- Args(
- Var(x))
- def (x: builtins.int)
- Block:3(
- PassStmt:3())))
-
-[case testAnyTypeAlias]
-from typing import Any
-A = Any
-a = 1 # type: A
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [Any])
- AssignmentStmt:2(
- NameExpr(A* [__main__.A])
- NameExpr(Any [typing.Any]))
- AssignmentStmt:3(
- NameExpr(a [__main__.a])
- IntExpr(1)
- Any))
-
-[case testAnyTypeAlias2]
-import typing
-A = typing.Any
-a = 1 # type: A
-[out]
-MypyFile:1(
- Import:1(typing)
- AssignmentStmt:2(
- NameExpr(A* [__main__.A])
- MemberExpr:2(
- NameExpr(typing)
- Any [typing.Any]))
- AssignmentStmt:3(
- NameExpr(a [__main__.a])
- IntExpr(1)
- Any))
-
-[case testTypeAliasAlias]
-from typing import Union
-U = Union[int, str]
-U2 = U
-x = 1 # type: U2
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [Union])
- AssignmentStmt:2(
- NameExpr(U* [__main__.U])
- TypeAliasExpr(Union[builtins.int, builtins.str]))
- AssignmentStmt:3(
- NameExpr(U2* [__main__.U2])
- NameExpr(U [__main__.U]))
- AssignmentStmt:4(
- NameExpr(x [__main__.x])
- IntExpr(1)
- Union[builtins.int, builtins.str]))
-
-[case testTypeAliasOfImportedAlias]
-from typing import Union
-from _m import U
-U2 = U
-x = 1 # type: U2
-[file _m.py]
-from typing import Union
-U = Union[int, str]
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [Union])
- ImportFrom:2(_m, [U])
- AssignmentStmt:3(
- NameExpr(U2* [__main__.U2])
- NameExpr(U [_m.U]))
- AssignmentStmt:4(
- NameExpr(x [__main__.x])
- IntExpr(1)
- Union[builtins.int, builtins.str]))
-
-[case testListTypeDoesNotGenerateAlias]
-import typing
-A = [int, str]
-a = 1 # type: A # E: Invalid type "__main__.A"
-
-[case testCantUseStringLiteralAsTypeAlias]
-from typing import Union
-A = 'Union[int, str]'
-a = 1 # type: A # E: Invalid type "__main__.A"
-
-[case testStringLiteralTypeAsAliasComponent]
-from typing import Union
-A = Union['int', str]
-a = 1 # type: A
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [Union])
- AssignmentStmt:2(
- NameExpr(A* [__main__.A])
- TypeAliasExpr(Union[builtins.int, builtins.str]))
- AssignmentStmt:3(
- NameExpr(a [__main__.a])
- IntExpr(1)
- Union[builtins.int, builtins.str]))
-
-[case testComplexTypeAlias]
-from typing import Union, Tuple, Any
-A = Union['int', Tuple[int, Any]]
-a = 1 # type: A
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [Union, Tuple, Any])
- AssignmentStmt:2(
- NameExpr(A* [__main__.A])
- TypeAliasExpr(Union[builtins.int, Tuple[builtins.int, Any]]))
- AssignmentStmt:3(
- NameExpr(a [__main__.a])
- IntExpr(1)
- Union[builtins.int, Tuple[builtins.int, Any]]))
diff --git a/test-data/unit/semanal-typeddict.test b/test-data/unit/semanal-typeddict.test
deleted file mode 100644
index a0229d8..0000000
--- a/test-data/unit/semanal-typeddict.test
+++ /dev/null
@@ -1,81 +0,0 @@
--- Create Type
-
--- TODO: Implement support for this syntax.
---[case testCanCreateTypedDictTypeWithKeywordArguments]
---from mypy_extensions import TypedDict
---Point = TypedDict('Point', x=int, y=int)
---[builtins fixtures/dict.pyi]
---[out]
---MypyFile:1(
--- ImportFrom:1(mypy_extensions, [TypedDict])
--- AssignmentStmt:2(
--- NameExpr(Point* [__main__.Point])
--- TypedDictExpr:2(Point)))
-
--- TODO: Implement support for this syntax.
---[case testCanCreateTypedDictTypeWithDictCall]
---from mypy_extensions import TypedDict
---Point = TypedDict('Point', dict(x=int, y=int))
---[builtins fixtures/dict.pyi]
---[out]
---MypyFile:1(
--- ImportFrom:1(mypy_extensions, [TypedDict])
--- AssignmentStmt:2(
--- NameExpr(Point* [__main__.Point])
--- TypedDictExpr:2(Point)))
-
-[case testCanCreateTypedDictTypeWithDictLiteral]
-from mypy_extensions import TypedDict
-Point = TypedDict('Point', {'x': int, 'y': int})
-[builtins fixtures/dict.pyi]
-[out]
-MypyFile:1(
- ImportFrom:1(mypy_extensions, [TypedDict])
- AssignmentStmt:2(
- NameExpr(Point* [__main__.Point])
- TypedDictExpr:2(Point)))
-
-
--- Create Type (Errors)
-
-[case testCannotCreateTypedDictTypeWithTooFewArguments]
-from mypy_extensions import TypedDict
-Point = TypedDict('Point') # E: Too few arguments for TypedDict()
-[builtins fixtures/dict.pyi]
-
-[case testCannotCreateTypedDictTypeWithTooManyArguments]
-from mypy_extensions import TypedDict
-Point = TypedDict('Point', {'x': int, 'y': int}, dict) # E: Too many arguments for TypedDict()
-[builtins fixtures/dict.pyi]
-
-[case testCannotCreateTypedDictTypeWithInvalidName]
-from mypy_extensions import TypedDict
-Point = TypedDict(dict, {'x': int, 'y': int}) # E: TypedDict() expects a string literal as the first argument
-[builtins fixtures/dict.pyi]
-
-[case testCannotCreateTypedDictTypeWithInvalidItems]
-from mypy_extensions import TypedDict
-Point = TypedDict('Point', {'x'}) # E: TypedDict() expects a dictionary literal as the second argument
-[builtins fixtures/dict.pyi]
-
-[case testCannotCreateTypedDictTypeWithUnderscoreItemName]
-from mypy_extensions import TypedDict
-Point = TypedDict('Point', {'x': int, 'y': int, '_fallback': object}) # E: TypedDict() item names cannot start with an underscore: _fallback
-[builtins fixtures/dict.pyi]
-
--- NOTE: The following code works at runtime but is not yet supported by mypy.
--- Keyword arguments may potentially be supported in the future.
-[case testCannotCreateTypedDictTypeWithNonpositionalArgs]
-from mypy_extensions import TypedDict
-Point = TypedDict(typename='Point', fields={'x': int, 'y': int}) # E: Unexpected arguments to TypedDict()
-[builtins fixtures/dict.pyi]
-
-[case testCannotCreateTypedDictTypeWithInvalidItemName]
-from mypy_extensions import TypedDict
-Point = TypedDict('Point', {int: int, int: int}) # E: Invalid TypedDict() field name
-[builtins fixtures/dict.pyi]
-
-[case testCannotCreateTypedDictTypeWithInvalidItemType]
-from mypy_extensions import TypedDict
-Point = TypedDict('Point', {'x': 1, 'y': 1}) # E: Invalid field type
-[builtins fixtures/dict.pyi]
diff --git a/test-data/unit/semanal-typeinfo.test b/test-data/unit/semanal-typeinfo.test
deleted file mode 100644
index 6bb62e1..0000000
--- a/test-data/unit/semanal-typeinfo.test
+++ /dev/null
@@ -1,80 +0,0 @@
-[case testEmptyFile]
-[out]
-TypeInfoMap()
-
-[case testEmptyClass]
-class c: pass
-[out]
-TypeInfoMap(
- __main__.c : TypeInfo(
- Name(__main__.c)
- Bases(builtins.object)
- Names()))
-
-[case testClassWithMethod]
-class c:
- def f(self): pass
-[out]
-TypeInfoMap(
- __main__.c : TypeInfo(
- Name(__main__.c)
- Bases(builtins.object)
- Names(
- f)))
-
-[case testClassWithAttributes]
-class c:
- def __init__(self, x):
- self.y = x
- self.z = 1
-[out]
-TypeInfoMap(
- __main__.c : TypeInfo(
- Name(__main__.c)
- Bases(builtins.object)
- Names(
- __init__
- y
- z)))
-
-[case testBaseClass]
-class base: pass
-class c(base): pass
-[out]
-TypeInfoMap(
- __main__.base : TypeInfo(
- Name(__main__.base)
- Bases(builtins.object)
- Names())
- __main__.c : TypeInfo(
- Name(__main__.c)
- Bases(__main__.base)
- Names()))
-
-[case testClassAndAbstractClass]
-from abc import abstractmethod, ABCMeta
-import typing
-
-class i(metaclass=ABCMeta): pass
-class c(i): pass
-[out]
-TypeInfoMap(
- __main__.c : TypeInfo(
- Name(__main__.c)
- Bases(__main__.i)
- Names())
- __main__.i : TypeInfo(
- Name(__main__.i)
- Bases(builtins.object)
- Names()))
-
-[case testAttributeWithoutType]
-class A:
- a = A
-[out]
-TypeInfoMap(
- __main__.A : TypeInfo(
- Name(__main__.A)
- Bases(builtins.object)
- Names(
- a)))
diff --git a/test-data/unit/semanal-types.test b/test-data/unit/semanal-types.test
deleted file mode 100644
index 927ab85..0000000
--- a/test-data/unit/semanal-types.test
+++ /dev/null
@@ -1,1476 +0,0 @@
-[case testVarWithType]
-import typing
-class A: pass
-x = A() # type: A
-y = x
-[out]
-MypyFile:1(
- Import:1(typing)
- ClassDef:2(
- A
- PassStmt:2())
- AssignmentStmt:3(
- NameExpr(x [__main__.x])
- CallExpr:3(
- NameExpr(A [__main__.A])
- Args())
- __main__.A)
- AssignmentStmt:4(
- NameExpr(y* [__main__.y])
- NameExpr(x [__main__.x])))
-
-[case testLocalVarWithType]
-class A: pass
-def f():
- x = None # type: A
- y = x
-[out]
-MypyFile:1(
- ClassDef:1(
- A
- PassStmt:1())
- FuncDef:2(
- f
- Block:2(
- AssignmentStmt:3(
- NameExpr(x [l])
- NameExpr(None [builtins.None])
- __main__.A)
- AssignmentStmt:4(
- NameExpr(y* [l])
- NameExpr(x [l])))))
-
-[case testAnyType]
-from typing import Any
-x = None # type: Any
-y = x
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [Any])
- AssignmentStmt:2(
- NameExpr(x [__main__.x])
- NameExpr(None [builtins.None])
- Any)
- AssignmentStmt:3(
- NameExpr(y* [__main__.y])
- NameExpr(x [__main__.x])))
-
-[case testMemberVarWithType]
-import typing
-class A:
- def __init__(self):
- self.x = None # type: int
-[out]
-MypyFile:1(
- Import:1(typing)
- ClassDef:2(
- A
- FuncDef:3(
- __init__
- Args(
- Var(self))
- Block:3(
- AssignmentStmt:4(
- MemberExpr:4(
- NameExpr(self [l])
- x)
- NameExpr(None [builtins.None])
- builtins.int)))))
-
-[case testClassVarWithType]
-import typing
-class A:
- x = None # type: int
- x = 1
-[out]
-MypyFile:1(
- Import:1(typing)
- ClassDef:2(
- A
- AssignmentStmt:3(
- NameExpr(x [m])
- NameExpr(None [builtins.None])
- builtins.int)
- AssignmentStmt:4(
- NameExpr(x [m])
- IntExpr(1))))
-
-[case testFunctionSig]
-from typing import Any
-class A: pass
-def f(x: A) -> A: pass
-def g(x: Any, y: A) -> None:
- z = x, y
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [Any])
- ClassDef:2(
- A
- PassStmt:2())
- FuncDef:3(
- f
- Args(
- Var(x))
- def (x: __main__.A) -> __main__.A
- Block:3(
- PassStmt:3()))
- FuncDef:4(
- g
- Args(
- Var(x)
- Var(y))
- def (x: Any, y: __main__.A)
- Block:4(
- AssignmentStmt:5(
- NameExpr(z* [l])
- TupleExpr:5(
- NameExpr(x [l])
- NameExpr(y [l]))))))
-
-[case testBaseclass]
-class A: pass
-class B(A): pass
-[out]
-MypyFile:1(
- ClassDef:1(
- A
- PassStmt:1())
- ClassDef:2(
- B
- BaseType(
- __main__.A)
- PassStmt:2()))
-
-[case testMultipleVarDef]
-
-class A: pass
-class B: pass
-a, b = None, None # type: (A, B)
-x = a, b
-[out]
-MypyFile:1(
- ClassDef:2(
- A
- PassStmt:2())
- ClassDef:3(
- B
- PassStmt:3())
- AssignmentStmt:4(
- TupleExpr:4(
- NameExpr(a [__main__.a])
- NameExpr(b [__main__.b]))
- TupleExpr:4(
- NameExpr(None [builtins.None])
- NameExpr(None [builtins.None]))
- Tuple[__main__.A, __main__.B])
- AssignmentStmt:5(
- NameExpr(x* [__main__.x])
- TupleExpr:5(
- NameExpr(a [__main__.a])
- NameExpr(b [__main__.b]))))
-
-[case testGenericType]
-from typing import TypeVar, Generic, Any
-
-t = TypeVar('t')
-
-class A(Generic[t]): pass
-class B: pass
-x = None # type: A[B]
-y = None # type: A[Any]
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [TypeVar, Generic, Any])
- AssignmentStmt:3(
- NameExpr(t* [__main__.t])
- TypeVarExpr:3())
- ClassDef:5(
- A
- TypeVars(
- t)
- PassStmt:5())
- ClassDef:6(
- B
- PassStmt:6())
- AssignmentStmt:7(
- NameExpr(x [__main__.x])
- NameExpr(None [builtins.None])
- __main__.A[__main__.B])
- AssignmentStmt:8(
- NameExpr(y [__main__.y])
- NameExpr(None [builtins.None])
- __main__.A[Any]))
-
-[case testGenericType2]
-from typing import TypeVar, Generic, Any
-t = TypeVar('t')
-s = TypeVar('s')
-class A(Generic[t, s]): pass
-class B: pass
-x = None # type: A[B, Any]
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [TypeVar, Generic, Any])
- AssignmentStmt:2(
- NameExpr(t* [__main__.t])
- TypeVarExpr:2())
- AssignmentStmt:3(
- NameExpr(s* [__main__.s])
- TypeVarExpr:3())
- ClassDef:4(
- A
- TypeVars(
- t
- s)
- PassStmt:4())
- ClassDef:5(
- B
- PassStmt:5())
- AssignmentStmt:6(
- NameExpr(x [__main__.x])
- NameExpr(None [builtins.None])
- __main__.A[__main__.B, Any]))
-
-[case testAssignmentAfterDef]
-
-
-class A: pass
-a = None # type: A
-a = 1
-def f():
- b = None # type: A
- b = 1
-[out]
-MypyFile:1(
- ClassDef:3(
- A
- PassStmt:3())
- AssignmentStmt:4(
- NameExpr(a [__main__.a])
- NameExpr(None [builtins.None])
- __main__.A)
- AssignmentStmt:5(
- NameExpr(a [__main__.a])
- IntExpr(1))
- FuncDef:6(
- f
- Block:6(
- AssignmentStmt:7(
- NameExpr(b [l])
- NameExpr(None [builtins.None])
- __main__.A)
- AssignmentStmt:8(
- NameExpr(b [l])
- IntExpr(1)))))
-
-[case testCast]
-from typing import TypeVar, Generic, Any, cast
-t = TypeVar('t')
-class c: pass
-class d(Generic[t]): pass
-cast(Any, 1)
-cast(c, 1)
-cast(d[c], c)
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [TypeVar, Generic, Any, cast])
- AssignmentStmt:2(
- NameExpr(t* [__main__.t])
- TypeVarExpr:2())
- ClassDef:3(
- c
- PassStmt:3())
- ClassDef:4(
- d
- TypeVars(
- t)
- PassStmt:4())
- ExpressionStmt:5(
- CastExpr:5(
- IntExpr(1)
- Any))
- ExpressionStmt:6(
- CastExpr:6(
- IntExpr(1)
- __main__.c))
- ExpressionStmt:7(
- CastExpr:7(
- NameExpr(c [__main__.c])
- __main__.d[__main__.c])))
-
-[case testCastToQualifiedTypeAndCast]
-import typing
-import _m
-typing.cast(_m.C, object)
-[file _m.py]
-class C: pass
-[out]
-MypyFile:1(
- Import:1(typing)
- Import:2(_m)
- ExpressionStmt:3(
- CastExpr:3(
- NameExpr(object [builtins.object])
- _m.C)))
-
-[case testLongQualifiedCast]
-import typing
-import _m._n
-typing.cast(_m._n.C, object)
-[file _m/__init__.py]
-[file _m/_n.py]
-class C: pass
-[out]
-MypyFile:1(
- Import:1(typing)
- Import:2(_m._n)
- ExpressionStmt:3(
- CastExpr:3(
- NameExpr(object [builtins.object])
- _m._n.C)))
-
-[case testCastTargetWithTwoTypeArgs]
-from typing import TypeVar, Generic, cast
-t = TypeVar('t')
-s = TypeVar('s')
-class C(Generic[t, s]): pass
-cast(C[str, int], C)
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [TypeVar, Generic, cast])
- AssignmentStmt:2(
- NameExpr(t* [__main__.t])
- TypeVarExpr:2())
- AssignmentStmt:3(
- NameExpr(s* [__main__.s])
- TypeVarExpr:3())
- ClassDef:4(
- C
- TypeVars(
- t
- s)
- PassStmt:4())
- ExpressionStmt:5(
- CastExpr:5(
- NameExpr(C [__main__.C])
- __main__.C[builtins.str, builtins.int])))
-
-[case testCastToAny]
-from typing import Any
-Any(None)
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [Any])
- ExpressionStmt:2(
- CastExpr:2(
- NameExpr(None [builtins.None])
- Any)))
-
-[case testCastToTupleType]
-from typing import Tuple, cast
-cast(Tuple[int, str], None)
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [Tuple, cast])
- ExpressionStmt:2(
- CastExpr:2(
- NameExpr(None [builtins.None])
- Tuple[builtins.int, builtins.str])))
-
-[case testCastToFunctionType]
-from typing import Callable, cast
-cast(Callable[[int], str], None)
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [Callable, cast])
- ExpressionStmt:2(
- CastExpr:2(
- NameExpr(None [builtins.None])
- def (builtins.int) -> builtins.str)))
-
-[case testCastToStringLiteralType]
-from typing import cast
-cast('int', 1)
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [cast])
- ExpressionStmt:2(
- CastExpr:2(
- IntExpr(1)
- builtins.int)))
-
-[case testFunctionTypeVariable]
-from typing import TypeVar
-t = TypeVar('t')
-def f(x: t) -> None:
- y = None # type: t
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [TypeVar])
- AssignmentStmt:2(
- NameExpr(t* [__main__.t])
- TypeVarExpr:2())
- FuncDef:3(
- f
- Args(
- Var(x))
- def [t] (x: t`-1)
- Block:3(
- AssignmentStmt:4(
- NameExpr(y [l])
- NameExpr(None [builtins.None])
- t`-1))))
-
-[case testTwoFunctionTypeVariables]
-from typing import TypeVar
-t = TypeVar('t')
-u = TypeVar('u')
-def f(x: t, y: u, z: t) -> None: pass
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [TypeVar])
- AssignmentStmt:2(
- NameExpr(t* [__main__.t])
- TypeVarExpr:2())
- AssignmentStmt:3(
- NameExpr(u* [__main__.u])
- TypeVarExpr:3())
- FuncDef:4(
- f
- Args(
- Var(x)
- Var(y)
- Var(z))
- def [t, u] (x: t`-1, y: u`-2, z: t`-1)
- Block:4(
- PassStmt:4())))
-
-[case testNestedGenericFunctionTypeVariable]
-from typing import TypeVar, Generic
-t = TypeVar('t')
-class A(Generic[t]): pass
-def f(x: A[t], y) -> None: pass
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [TypeVar, Generic])
- AssignmentStmt:2(
- NameExpr(t* [__main__.t])
- TypeVarExpr:2())
- ClassDef:3(
- A
- TypeVars(
- t)
- PassStmt:3())
- FuncDef:4(
- f
- Args(
- Var(x)
- Var(y))
- def [t] (x: __main__.A[t`-1], y: Any)
- Block:4(
- PassStmt:4())))
-
-[case testNestedGenericFunctionTypeVariable2]
-from typing import TypeVar, Tuple, Generic
-t = TypeVar('t')
-class A(Generic[t]): pass
-def f(x: Tuple[int, t]) -> None: pass
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [TypeVar, Tuple, Generic])
- AssignmentStmt:2(
- NameExpr(t* [__main__.t])
- TypeVarExpr:2())
- ClassDef:3(
- A
- TypeVars(
- t)
- PassStmt:3())
- FuncDef:4(
- f
- Args(
- Var(x))
- def [t] (x: Tuple[builtins.int, t`-1])
- Block:4(
- PassStmt:4())))
-
-[case testNestedGenericFunctionTypeVariable3]
-from typing import TypeVar, Callable, Generic
-t = TypeVar('t')
-class A(Generic[t]): pass
-def f(x: Callable[[int, t], int]) -> None: pass
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [TypeVar, Callable, Generic])
- AssignmentStmt:2(
- NameExpr(t* [__main__.t])
- TypeVarExpr:2())
- ClassDef:3(
- A
- TypeVars(
- t)
- PassStmt:3())
- FuncDef:4(
- f
- Args(
- Var(x))
- def [t] (x: def (builtins.int, t`-1) -> builtins.int)
- Block:4(
- PassStmt:4())))
-
-[case testNestedGenericFunctionTypeVariable4]
-from typing import TypeVar, Callable, Generic
-t = TypeVar('t')
-class A(Generic[t]): pass
-def f(x: Callable[[], t]) -> None: pass
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [TypeVar, Callable, Generic])
- AssignmentStmt:2(
- NameExpr(t* [__main__.t])
- TypeVarExpr:2())
- ClassDef:3(
- A
- TypeVars(
- t)
- PassStmt:3())
- FuncDef:4(
- f
- Args(
- Var(x))
- def [t] (x: def () -> t`-1)
- Block:4(
- PassStmt:4())))
-
-[case testGenericFunctionTypeVariableInReturnType]
-from typing import TypeVar
-t = TypeVar('t')
-def f() -> t: pass
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [TypeVar])
- AssignmentStmt:2(
- NameExpr(t* [__main__.t])
- TypeVarExpr:2())
- FuncDef:3(
- f
- def [t] () -> t`-1
- Block:3(
- PassStmt:3())))
-
-[case testSelfType]
-class A:
- def f(self, o: object) -> None: pass
-[out]
-MypyFile:1(
- ClassDef:1(
- A
- FuncDef:2(
- f
- Args(
- Var(self)
- Var(o))
- def (self: __main__.A, o: builtins.object)
- Block:2(
- PassStmt:2()))))
-
-[case testNestedGenericFunction]
-from typing import TypeVar
-t = TypeVar('t')
-def f() -> None:
- def g() -> t: pass
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [TypeVar])
- AssignmentStmt:2(
- NameExpr(t* [__main__.t])
- TypeVarExpr:2())
- FuncDef:3(
- f
- def ()
- Block:3(
- FuncDef:4(
- g
- def [t] () -> t`-1
- Block:4(
- PassStmt:4())))))
-
-[case testClassTvar]
-from typing import TypeVar, Generic
-
-t = TypeVar('t')
-
-class c(Generic[t]):
- def f(self) -> t: pass
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [TypeVar, Generic])
- AssignmentStmt:3(
- NameExpr(t* [__main__.t])
- TypeVarExpr:3())
- ClassDef:5(
- c
- TypeVars(
- t)
- FuncDef:6(
- f
- Args(
- Var(self))
- def (self: __main__.c[t`1]) -> t`1
- Block:6(
- PassStmt:6()))))
-
-[case testClassTvar2]
-from typing import TypeVar, Generic
-
-t = TypeVar('t')
-s = TypeVar('s')
-
-class c(Generic[t, s]):
- def f(self, x: s) -> t: pass
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [TypeVar, Generic])
- AssignmentStmt:3(
- NameExpr(t* [__main__.t])
- TypeVarExpr:3())
- AssignmentStmt:4(
- NameExpr(s* [__main__.s])
- TypeVarExpr:4())
- ClassDef:6(
- c
- TypeVars(
- t
- s)
- FuncDef:7(
- f
- Args(
- Var(self)
- Var(x))
- def (self: __main__.c[t`1, s`2], x: s`2) -> t`1
- Block:7(
- PassStmt:7()))))
-
-[case testGenericBaseClass]
-from typing import TypeVar, Generic
-t = TypeVar('t')
-class d(Generic[t]): pass
-class c(d[t], Generic[t]): pass
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [TypeVar, Generic])
- AssignmentStmt:2(
- NameExpr(t* [__main__.t])
- TypeVarExpr:2())
- ClassDef:3(
- d
- TypeVars(
- t)
- PassStmt:3())
- ClassDef:4(
- c
- TypeVars(
- t)
- BaseType(
- __main__.d[t`1])
- PassStmt:4()))
-
-[case testTupleType]
-from typing import Tuple
-t = None # type: tuple
-t1 = None # type: Tuple[object]
-t2 = None # type: Tuple[int, object]
-[builtins fixtures/tuple.pyi]
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [Tuple])
- AssignmentStmt:2(
- NameExpr(t [__main__.t])
- NameExpr(None [builtins.None])
- builtins.tuple[Any])
- AssignmentStmt:3(
- NameExpr(t1 [__main__.t1])
- NameExpr(None [builtins.None])
- Tuple[builtins.object])
- AssignmentStmt:4(
- NameExpr(t2 [__main__.t2])
- NameExpr(None [builtins.None])
- Tuple[builtins.int, builtins.object]))
-
-[case testVariableLengthTuple]
-from typing import Tuple
-t = None # type: Tuple[int, ...]
-[builtins fixtures/tuple.pyi]
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [Tuple])
- AssignmentStmt:2(
- NameExpr(t [__main__.t])
- NameExpr(None [builtins.None])
- builtins.tuple[builtins.int]))
-
-[case testInvalidTupleType]
-from typing import Tuple
-t = None # type: Tuple[int, str, ...] # E: Unexpected '...'
-[out]
-
-[case testFunctionTypes]
-from typing import Callable
-f = None # type: Callable[[object, int], str]
-g = None # type: Callable[[], None]
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [Callable])
- AssignmentStmt:2(
- NameExpr(f [__main__.f])
- NameExpr(None [builtins.None])
- def (builtins.object, builtins.int) -> builtins.str)
- AssignmentStmt:3(
- NameExpr(g [__main__.g])
- NameExpr(None [builtins.None])
- def ()))
-
-[case testOverloadedFunction]
-from typing import overload
- at overload
-def f(o: object) -> int: o
- at overload
-def f(a: str) -> object: a
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [overload])
- OverloadedFuncDef:2(
- Overload(def (o: builtins.object) -> builtins.int, \
- def (a: builtins.str) -> builtins.object)
- Decorator:2(
- Var(f)
- NameExpr(overload [typing.overload])
- FuncDef:3(
- f
- Args(
- Var(o))
- def (o: builtins.object) -> builtins.int
- Block:3(
- ExpressionStmt:3(
- NameExpr(o [l])))))
- Decorator:4(
- Var(f)
- NameExpr(overload [typing.overload])
- FuncDef:5(
- f
- Args(
- Var(a))
- def (a: builtins.str) -> builtins.object
- Block:5(
- ExpressionStmt:5(
- NameExpr(a [l])))))))
-
-[case testReferenceToOverloadedFunction]
-from typing import overload
- at overload
-def f() -> None: pass
- at overload
-def f(x: int) -> None: pass
-x = f
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [overload])
- OverloadedFuncDef:2(
- Overload(def (), def (x: builtins.int))
- Decorator:2(
- Var(f)
- NameExpr(overload [typing.overload])
- FuncDef:3(
- f
- def ()
- Block:3(
- PassStmt:3())))
- Decorator:4(
- Var(f)
- NameExpr(overload [typing.overload])
- FuncDef:5(
- f
- Args(
- Var(x))
- def (x: builtins.int)
- Block:5(
- PassStmt:5()))))
- AssignmentStmt:6(
- NameExpr(x* [__main__.x])
- NameExpr(f [__main__.f])))
-
-[case testNestedOverloadedFunction]
-from typing import overload
-def f():
- @overload
- def g(): pass
- @overload
- def g(x): pass
- y = g
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [overload])
- FuncDef:2(
- f
- Block:2(
- OverloadedFuncDef:3(
- Overload(def () -> Any, def (x: Any) -> Any)
- Decorator:3(
- Var(g)
- NameExpr(overload [typing.overload])
- FuncDef:4(
- g
- Block:4(
- PassStmt:4())))
- Decorator:5(
- Var(g)
- NameExpr(overload [typing.overload])
- FuncDef:6(
- g
- Args(
- Var(x))
- Block:6(
- PassStmt:6()))))
- AssignmentStmt:7(
- NameExpr(y* [l])
- NameExpr(g [l])))))
-
-[case testImplicitGenericTypeArgs]
-from typing import TypeVar, Generic
-t = TypeVar('t')
-s = TypeVar('s')
-class A(Generic[t, s]): pass
-x = None # type: A
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [TypeVar, Generic])
- AssignmentStmt:2(
- NameExpr(t* [__main__.t])
- TypeVarExpr:2())
- AssignmentStmt:3(
- NameExpr(s* [__main__.s])
- TypeVarExpr:3())
- ClassDef:4(
- A
- TypeVars(
- t
- s)
- PassStmt:4())
- AssignmentStmt:5(
- NameExpr(x [__main__.x])
- NameExpr(None [builtins.None])
- __main__.A[Any, Any]))
-
-[case testImplicitTypeArgsAndGenericBaseClass]
-from typing import TypeVar, Generic
-t = TypeVar('t')
-s = TypeVar('s')
-class B(Generic[s]): pass
-class A(B, Generic[t]): pass
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [TypeVar, Generic])
- AssignmentStmt:2(
- NameExpr(t* [__main__.t])
- TypeVarExpr:2())
- AssignmentStmt:3(
- NameExpr(s* [__main__.s])
- TypeVarExpr:3())
- ClassDef:4(
- B
- TypeVars(
- s)
- PassStmt:4())
- ClassDef:5(
- A
- TypeVars(
- t)
- BaseType(
- __main__.B[Any])
- PassStmt:5()))
-
-[case testTypeApplication]
-from typing import TypeVar, Generic
-t = TypeVar('t')
-class A(Generic[t]): pass
-x = A[int]()
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [TypeVar, Generic])
- AssignmentStmt:2(
- NameExpr(t* [__main__.t])
- TypeVarExpr:2())
- ClassDef:3(
- A
- TypeVars(
- t)
- PassStmt:3())
- AssignmentStmt:4(
- NameExpr(x* [__main__.x])
- CallExpr:4(
- TypeApplication:4(
- NameExpr(A [__main__.A])
- Types(
- builtins.int))
- Args())))
-
-[case testTypeApplicationWithTwoTypeArgs]
-from typing import TypeVar, Generic, Any
-t = TypeVar('t')
-s = TypeVar('s')
-class A(Generic[t, s]): pass
-x = A[int, Any]()
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [TypeVar, Generic, Any])
- AssignmentStmt:2(
- NameExpr(t* [__main__.t])
- TypeVarExpr:2())
- AssignmentStmt:3(
- NameExpr(s* [__main__.s])
- TypeVarExpr:3())
- ClassDef:4(
- A
- TypeVars(
- t
- s)
- PassStmt:4())
- AssignmentStmt:5(
- NameExpr(x* [__main__.x])
- CallExpr:5(
- TypeApplication:5(
- NameExpr(A [__main__.A])
- Types(
- builtins.int
- Any))
- Args())))
-
-[case testFunctionTypeApplication]
-from typing import TypeVar
-t = TypeVar('t')
-def f(x: t) -> None: pass
-f[int](1)
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [TypeVar])
- AssignmentStmt:2(
- NameExpr(t* [__main__.t])
- TypeVarExpr:2())
- FuncDef:3(
- f
- Args(
- Var(x))
- def [t] (x: t`-1)
- Block:3(
- PassStmt:3()))
- ExpressionStmt:4(
- CallExpr:4(
- TypeApplication:4(
- NameExpr(f [__main__.f])
- Types(
- builtins.int))
- Args(
- IntExpr(1)))))
-
-[case testTypeApplicationWithStringLiteralType]
-from typing import TypeVar, Generic
-t = TypeVar('t')
-class A(Generic[t]): pass
-A['int']()
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [TypeVar, Generic])
- AssignmentStmt:2(
- NameExpr(t* [__main__.t])
- TypeVarExpr:2())
- ClassDef:3(
- A
- TypeVars(
- t)
- PassStmt:3())
- ExpressionStmt:4(
- CallExpr:4(
- TypeApplication:4(
- NameExpr(A [__main__.A])
- Types(
- builtins.int))
- Args())))
-
-[case testVarArgsAndKeywordArgs]
-def g(*x: int, y: str = ''): pass
-[out]
-MypyFile:1(
- FuncDef:1(
- g
- MaxPos(0)
- Args(
- Var(y))
- def (*x: builtins.int, *, y: builtins.str =) -> Any
- Init(
- AssignmentStmt:1(
- NameExpr(y [l])
- StrExpr()))
- VarArg(
- Var(x))
- Block:1(
- PassStmt:1())))
-
-[case testQualifiedGeneric]
-from typing import TypeVar
-import typing
-T = TypeVar('T')
-class A(typing.Generic[T]): pass
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [TypeVar])
- Import:2(typing)
- AssignmentStmt:3(
- NameExpr(T* [__main__.T])
- TypeVarExpr:3())
- ClassDef:4(
- A
- TypeVars(
- T)
- PassStmt:4()))
-
-[case testQualifiedTypevar]
-import typing
-T = typing.TypeVar('T')
-def f(x: T) -> T: pass
-[out]
-MypyFile:1(
- Import:1(typing)
- AssignmentStmt:2(
- NameExpr(T* [__main__.T])
- TypeVarExpr:2())
- FuncDef:3(
- f
- Args(
- Var(x))
- def [T] (x: T`-1) -> T`-1
- Block:3(
- PassStmt:3())))
-
-[case testAliasedTypevar]
-from typing import TypeVar as tv
-T = tv('T')
-def f(x: T) -> T: pass
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [TypeVar : tv])
- AssignmentStmt:2(
- NameExpr(T* [__main__.T])
- TypeVarExpr:2())
- FuncDef:3(
- f
- Args(
- Var(x))
- def [T] (x: T`-1) -> T`-1
- Block:3(
- PassStmt:3())))
-
-[case testLocalTypevar]
-from typing import TypeVar
-def f():
- T = TypeVar('T')
- def g(x: T) -> T: pass
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [TypeVar])
- FuncDef:2(
- f
- Block:2(
- AssignmentStmt:3(
- NameExpr(T* [l])
- TypeVarExpr:3())
- FuncDef:4(
- g
- Args(
- Var(x))
- def [T] (x: T`-1) -> T`-1
- Block:4(
- PassStmt:4())))))
-
-[case testClassLevelTypevar]
-from typing import TypeVar
-class A:
- T = TypeVar('T')
- def g(self, x: T) -> T: pass
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [TypeVar])
- ClassDef:2(
- A
- AssignmentStmt:3(
- NameExpr(T* [m])
- TypeVarExpr:3())
- FuncDef:4(
- g
- Args(
- Var(self)
- Var(x))
- def [T] (self: __main__.A, x: T`-1) -> T`-1
- Block:4(
- PassStmt:4()))))
-
-[case testImportTypevar]
-from typing import Generic
-from _m import T
-class A(Generic[T]):
- y = None # type: T
-[file _m.py]
-from typing import TypeVar
-T = TypeVar('T')
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [Generic])
- ImportFrom:2(_m, [T])
- ClassDef:3(
- A
- TypeVars(
- T)
- AssignmentStmt:4(
- NameExpr(y [m])
- NameExpr(None [builtins.None])
- T`1)))
-
-[case testQualifiedReferenceToTypevarInClass]
-from typing import Generic
-import _m
-class A(Generic[_m.T]):
- a = None # type: _m.T
- def f(self, x: _m.T):
- b = None # type: _m.T
-[file _m.py]
-from typing import TypeVar
-T = TypeVar('T')
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [Generic])
- Import:2(_m)
- ClassDef:3(
- A
- TypeVars(
- _m.T)
- AssignmentStmt:4(
- NameExpr(a [m])
- NameExpr(None [builtins.None])
- _m.T`1)
- FuncDef:5(
- f
- Args(
- Var(self)
- Var(x))
- def (self: __main__.A[_m.T`1], x: _m.T`1) -> Any
- Block:5(
- AssignmentStmt:6(
- NameExpr(b [l])
- NameExpr(None [builtins.None])
- _m.T`1)))))
-
-[case testQualifiedReferenceToTypevarInFunctionSignature]
-import _m
-def f(x: _m.T) -> None:
- a = None # type: _m.T
-[file _m.py]
-from typing import TypeVar
-T = TypeVar('T')
-[out]
-MypyFile:1(
- Import:1(_m)
- FuncDef:2(
- f
- Args(
- Var(x))
- def [_m.T] (x: _m.T`-1)
- Block:2(
- AssignmentStmt:3(
- NameExpr(a [l])
- NameExpr(None [builtins.None])
- _m.T`-1))))
-
-[case testFunctionCommentAnnotation]
-from typing import Any
-def f(x): # type: (int) -> Any
- x = 1
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [Any])
- FuncDef:2(
- f
- Args(
- Var(x))
- def (x: builtins.int) -> Any
- Block:2(
- AssignmentStmt:3(
- NameExpr(x [l])
- IntExpr(1)))))
-
-[case testMethodCommentAnnotation]
-import typing
-class A:
- def f(self, x): # type: (int) -> str
- x = 1
-[out]
-MypyFile:1(
- Import:1(typing)
- ClassDef:2(
- A
- FuncDef:3(
- f
- Args(
- Var(self)
- Var(x))
- def (self: __main__.A, x: builtins.int) -> builtins.str
- Block:3(
- AssignmentStmt:4(
- NameExpr(x [l])
- IntExpr(1))))))
-
-[case testTypevarWithValues]
-from typing import TypeVar, Any
-T = TypeVar('T', int, str)
-S = TypeVar('S', Any, int, str)
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [TypeVar, Any])
- AssignmentStmt:2(
- NameExpr(T* [__main__.T])
- TypeVarExpr:2(
- Values(
- builtins.int
- builtins.str)))
- AssignmentStmt:3(
- NameExpr(S* [__main__.S])
- TypeVarExpr:3(
- Values(
- Any
- builtins.int
- builtins.str))))
-
-[case testTypevarWithValuesAndVariance]
-from typing import TypeVar
-T = TypeVar('T', int, str, covariant=True)
-[builtins fixtures/bool.pyi]
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [TypeVar])
- AssignmentStmt:2(
- NameExpr(T* [__main__.T])
- TypeVarExpr:2(
- Variance(COVARIANT)
- Values(
- builtins.int
- builtins.str))))
-
-[case testTypevarWithBound]
-from typing import TypeVar
-T = TypeVar('T', bound=int)
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [TypeVar])
- AssignmentStmt:2(
- NameExpr(T* [__main__.T])
- TypeVarExpr:2(
- UpperBound(builtins.int))))
-
-[case testGenericFunctionWithValueSet]
-from typing import TypeVar
-T = TypeVar('T', int, str)
-def f(x: T) -> T: pass
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [TypeVar])
- AssignmentStmt:2(
- NameExpr(T* [__main__.T])
- TypeVarExpr:2(
- Values(
- builtins.int
- builtins.str)))
- FuncDef:3(
- f
- Args(
- Var(x))
- def [T in (builtins.int, builtins.str)] (x: T`-1) -> T`-1
- Block:3(
- PassStmt:3())))
-
-[case testGenericClassWithValueSet]
-from typing import TypeVar, Generic
-T = TypeVar('T', int, str)
-class C(Generic[T]): pass
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [TypeVar, Generic])
- AssignmentStmt:2(
- NameExpr(T* [__main__.T])
- TypeVarExpr:2(
- Values(
- builtins.int
- builtins.str)))
- ClassDef:3(
- C
- TypeVars(
- T in (builtins.int, builtins.str))
- PassStmt:3()))
-
-[case testGenericFunctionWithBound]
-from typing import TypeVar
-T = TypeVar('T', bound=int)
-def f(x: T) -> T: pass
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [TypeVar])
- AssignmentStmt:2(
- NameExpr(T* [__main__.T])
- TypeVarExpr:2(
- UpperBound(builtins.int)))
- FuncDef:3(
- f
- Args(
- Var(x))
- def [T <: builtins.int] (x: T`-1) -> T`-1
- Block:3(
- PassStmt:3())))
-
-[case testGenericClassWithBound]
-from typing import TypeVar, Generic
-T = TypeVar('T', bound=int)
-class C(Generic[T]): pass
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [TypeVar, Generic])
- AssignmentStmt:2(
- NameExpr(T* [__main__.T])
- TypeVarExpr:2(
- UpperBound(builtins.int)))
- ClassDef:3(
- C
- TypeVars(
- T <: builtins.int)
- PassStmt:3()))
-
-[case testSimpleDucktypeDecorator]
-from typing import _promote
- at _promote(str)
-class S: pass
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [_promote])
- ClassDef:2(
- S
- Promote(builtins.str)
- Decorators(
- PromoteExpr:2(builtins.str))
- PassStmt:3()))
-
-[case testUnionType]
-from typing import Union
-def f(x: Union[int, str]) -> None: pass
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [Union])
- FuncDef:2(
- f
- Args(
- Var(x))
- def (x: Union[builtins.int, builtins.str])
- Block:2(
- PassStmt:2())))
-
-[case testUnionTypeWithNoneItem]
-from typing import Union
-def f(x: Union[int, None]) -> None: pass
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [Union])
- FuncDef:2(
- f
- Args(
- Var(x))
- def (x: builtins.int)
- Block:2(
- PassStmt:2())))
-
-[case testUnionTypeWithNoneItemAndTwoItems]
-from typing import Union
-def f(x: Union[int, None, str]) -> None: pass
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [Union])
- FuncDef:2(
- f
- Args(
- Var(x))
- def (x: Union[builtins.int, builtins.str])
- Block:2(
- PassStmt:2())))
-
-[case testUnionTypeWithSingleItem]
-from typing import Union
-def f(x: Union[int]) -> None: pass
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [Union])
- FuncDef:2(
- f
- Args(
- Var(x))
- def (x: builtins.int)
- Block:2(
- PassStmt:2())))
-
-[case testOptionalTypes]
-from typing import Optional
-x = 1 # type: Optional[int]
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [Optional])
- AssignmentStmt:2(
- NameExpr(x [__main__.x])
- IntExpr(1)
- builtins.int))
-
-[case testInvalidOptionalType]
-from typing import Optional
-x = 1 # type: Optional[int, str] # E: Optional[...] must have exactly one type argument
-y = 1 # type: Optional # E: Optional[...] must have exactly one type argument
-[out]
-
-[case testCoAndContravariantTypeVar]
-from typing import TypeVar
-T = TypeVar('T', covariant=True)
-S = TypeVar('S', contravariant=True)
-[builtins fixtures/bool.pyi]
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [TypeVar])
- AssignmentStmt:2(
- NameExpr(T* [__main__.T])
- TypeVarExpr:2(
- Variance(COVARIANT)))
- AssignmentStmt:3(
- NameExpr(S* [__main__.S])
- TypeVarExpr:3(
- Variance(CONTRAVARIANT))))
-
-[case testTupleExpressionAsType]
-def f(x: (int, int)) -> None: pass
-[out]
-main:1: error: Invalid tuple literal type
-
-[case tesQualifiedTypeNameBasedOnAny]
-from typing import Any
-x = 0 # type: Any
-z = 0 # type: x.y
-[out]
-MypyFile:1(
- ImportFrom:1(typing, [Any])
- AssignmentStmt:2(
- NameExpr(x [__main__.x])
- IntExpr(0)
- Any)
- AssignmentStmt:3(
- NameExpr(z [__main__.z])
- IntExpr(0)
- Any))
diff --git a/test-data/unit/stubgen.test b/test-data/unit/stubgen.test
deleted file mode 100644
index baa5be5..0000000
--- a/test-data/unit/stubgen.test
+++ /dev/null
@@ -1,565 +0,0 @@
-[case testEmptyFile]
-[out]
-
-[case testSingleFunction]
-def f():
- x = 1
-[out]
-def f(): ...
-
-[case testTwoFunctions]
-def f(a, b):
- x = 1
-def g(arg):
- pass
-[out]
-def f(a, b): ...
-def g(arg): ...
-
-[case testDefaultArgInt]
-def f(a, b=2): ...
-def g(b=-1, c=0): ...
-[out]
-def f(a, b: int = ...): ...
-def g(b: int = ..., c: int = ...): ...
-
-[case testDefaultArgNone]
-def f(x=None): ...
-[out]
-from typing import Any, Optional
-
-def f(x: Optional[Any] = ...): ...
-
-[case testDefaultArgBool]
-def f(x=True, y=False): ...
-[out]
-def f(x: bool = ..., y: bool = ...): ...
-
-[case testDefaultArgStr]
-def f(x='foo'): ...
-[out]
-def f(x: str = ...): ...
-
-[case testDefaultArgBytes]
-def f(x=b'foo'): ...
-[out]
-def f(x: bytes = ...): ...
-
-[case testDefaultArgFloat]
-def f(x=1.2): ...
-[out]
-def f(x: float = ...): ...
-
-[case testDefaultArgOther]
-def f(x=ord): ...
-[out]
-from typing import Any
-
-def f(x: Any = ...): ...
-
-[case testVarArgs]
-def f(x, *y): ...
-[out]
-def f(x, *y): ...
-
-[case testKwVarArgs]
-def f(x, **y): ...
-[out]
-def f(x, **y): ...
-
-[case testClass]
-class A:
- def f(self, x):
- x = 1
-def g(): ...
-[out]
-class A:
- def f(self, x): ...
-
-def g(): ...
-
-[case testVariable]
-x = 1
-[out]
-x = ... # type: int
-
-[case testMultipleVariable]
-x = y = 1
-[out]
-x = ... # type: int
-y = ... # type: int
-
-[case testClassVariable]
-class C:
- x = 1
-[out]
-class C:
- x = ... # type: int
-
-[case testSelfAssignment]
-class C:
- def __init__(self):
- self.x = 1
- x.y = 2
-[out]
-class C:
- x = ... # type: int
- def __init__(self) -> None: ...
-
-[case testSelfAndClassBodyAssignment]
-x = 1
-class C:
- x = 1
- def __init__(self):
- self.x = 1
- self.x = 1
-[out]
-x = ... # type: int
-
-class C:
- x = ... # type: int
- def __init__(self) -> None: ...
-
-[case testEmptyClass]
-class A: ...
-[out]
-class A: ...
-
-[case testPrivateFunction]
-def _f(): ...
-def g(): ...
-[out]
-def g(): ...
-
-[case testPrivateMethod]
-class A:
- def _f(self): ...
-[out]
-class A: ...
-
-[case testPrivateVar]
-_x = 1
-class A:
- _y = 1
-[out]
-class A: ...
-
-[case testSpecialInternalVar]
-__all__ = []
-__author__ = ''
-__version__ = ''
-[out]
-
-[case testBaseClass]
-class A: ...
-class B(A): ...
-[out]
-class A: ...
-class B(A): ...
-
-[case testDecoratedFunction]
- at decorator
-def foo(x): ...
-[out]
-def foo(x): ...
-
-[case testMultipleAssignment]
-x, y = 1, 2
-[out]
-from typing import Any
-
-x = ... # type: Any
-y = ... # type: Any
-
-[case testMultipleAssignment2]
-[x, y] = 1, 2
-[out]
-from typing import Any
-
-x = ... # type: Any
-y = ... # type: Any
-
-[case testKeywordOnlyArg]
-def f(x, *, y=1): ...
-def g(x, *, y=1, z=2): ...
-[out]
-def f(x, *, y: int = ...): ...
-def g(x, *, y: int = ..., z: int = ...): ...
-
-[case testProperty]
-class A:
- @property
- def f(self):
- return 1
- @f.setter
- def f(self, x): ...
-[out]
-class A:
- @property
- def f(self): ...
- @f.setter
- def f(self, x): ...
-
-[case testStaticMethod]
-class A:
- @staticmethod
- def f(x): ...
-[out]
-class A:
- @staticmethod
- def f(x): ...
-
-[case testClassMethod]
-class A:
- @classmethod
- def f(cls): ...
-[out]
-class A:
- @classmethod
- def f(cls): ...
-
-[case testIfMainCheck]
-def a(): ...
-if __name__ == '__main__':
- x = 1
- def f(): ...
-def b(): ...
-[out]
-def a(): ...
-def b(): ...
-
-[case testImportStar]
-from x import *
-from a.b import *
-def f(): ...
-[out]
-from x import *
-from a.b import *
-
-def f(): ...
-
-[case testNoSpacesBetweenEmptyClasses]
-class X:
- def g(self): ...
-class A: ...
-class B: ...
-class C:
- def f(self): ...
-[out]
-class X:
- def g(self): ...
-
-class A: ...
-class B: ...
-
-class C:
- def f(self): ...
-
-[case testExceptionBaseClasses]
-class A(Exception): ...
-class B(ValueError): ...
-[out]
-class A(Exception): ...
-class B(ValueError): ...
-
-[case testOmitSomeSpecialMethods]
-class A:
- def __str__(self): ...
- def __repr__(self): ...
- def __eq__(self): ...
- def __getstate__(self): ...
- def __setstate__(self, state): ...
-[out]
-class A:
- def __eq__(self): ...
-
-[case testOmitDefsNotInAll_import]
-__all__ = [] + ['f']
-def f(): ...
-def g(): ...
-[out]
-def f(): ...
-
-[case testVarDefsNotInAll_import]
-__all__ = [] + ['f', 'g']
-def f(): ...
-x = 1
-y = 1
-def g(): ...
-[out]
-def f(): ...
-def g(): ...
-
-[case testIncludeClassNotInAll_import]
-__all__ = [] + ['f']
-def f(): ...
-class A: ...
-[out]
-def f(): ...
-
-class A: ...
-
-[case testAllAndClass_import]
-__all__ = ['A']
-class A:
- x = 1
- def f(self): ...
-[out]
-class A:
- x = ... # type: int
- def f(self): ...
-
-[case testMultiplePrivateDefs]
-class A: ...
-_x = 1
-_y = 1
-_z = 1
-class C: ...
-[out]
-class A: ...
-class C: ...
-
-[case testIncludeFromImportIfInAll_import]
-from re import match, search, sub
-__all__ = ['match', 'sub', 'x']
-x = 1
-[out]
-from re import match as match, sub as sub
-
-x = ... # type: int
-
-[case testExportModule_import]
-import re
-__all__ = ['re', 'x']
-x = 1
-y = 2
-[out]
-import re as re
-
-x = ... # type: int
-
-[case testExportModuleAs_import]
-import re as rex
-__all__ = ['rex', 'x']
-x = 1
-y = 2
-[out]
-import re as rex
-
-x = ... # type: int
-
-[case testExportModuleInPackage_import]
-import urllib.parse as p
-__all__ = ['p']
-[out]
-import urllib.parse as p
-
-[case testExportModuleInPackageUnsupported_import]
-import urllib.parse
-__all__ = ['urllib']
-[out]
-# Names in __all__ with no definition:
-# urllib
-
-[case testRelativeImportAll]
-from .x import *
-[out]
-from .x import *
-
-[case testCommentForUndefinedName_import]
-__all__ = ['f', 'x', 'C', 'g']
-def f(): ...
-x = 1
-class C:
- def g(self): ...
-[out]
-def f(): ...
-
-x = ... # type: int
-
-class C:
- def g(self): ...
-
-# Names in __all__ with no definition:
-# g
-
-[case testIgnoreSlots]
-class A:
- __slots__ = ()
-[out]
-class A: ...
-
-[case testSkipPrivateProperty]
-class A:
- @property
- def _foo(self): ...
-[out]
-class A: ...
-
-[case testSkipPrivateStaticAndClassMethod]
-class A:
- @staticmethod
- def _foo(): ...
- @classmethod
- def _bar(cls): ...
-[out]
-class A: ...
-
-[case testNamedtuple]
-import collections, x
-X = collections.namedtuple('X', ['a', 'b'])
-[out]
-from collections import namedtuple
-
-X = namedtuple('X', ['a', 'b'])
-
-[case testNamedtupleAltSyntax]
-from collections import namedtuple, x
-X = namedtuple('X', 'a b')
-[out]
-from collections import namedtuple
-
-X = namedtuple('X', 'a b')
-
-[case testNamedtupleWithUnderscore]
-from collections import namedtuple as _namedtuple
-def f(): ...
-X = _namedtuple('X', 'a b')
-def g(): ...
-[out]
-from collections import namedtuple as _namedtuple
-from collections import namedtuple
-
-def f(): ...
-
-X = namedtuple('X', 'a b')
-
-def g(): ...
-
-[case testNamedtupleBaseClass]
-import collections, x
-_X = collections.namedtuple('_X', ['a', 'b'])
-class Y(_X): ...
-[out]
-from collections import namedtuple
-
-_X = namedtuple('_X', ['a', 'b'])
-
-class Y(_X): ...
-
-[case testArbitraryBaseClass]
-import x
-class D(x.C): ...
-[out]
-import x
-
-class D(x.C): ...
-
-[case testArbitraryBaseClass]
-import x.y
-class D(x.y.C): ...
-[out]
-import x.y
-
-class D(x.y.C): ...
-
-[case testUnqualifiedArbitraryBaseClassWithNoDef]
-class A(int): ...
-[out]
-class A(int): ...
-
-[case testUnqualifiedArbitraryBaseClass]
-from x import X
-class A(X): ...
-[out]
-from x import X
-
-class A(X): ...
-
-[case testUnqualifiedArbitraryBaseClassWithImportAs]
-from x import X as _X
-class A(_X): ...
-[out]
-from x import X as _X
-
-class A(_X): ...
-
-[case testObjectBaseClass]
-class A(object): ...
-[out]
-class A: ...
-
-[case testEmptyLines]
-def x(): ...
-def f():
- class A:
- def f(self):
- self.x = 1
-def g(): ...
-[out]
-def x(): ...
-def f(): ...
-def g(): ...
-
-[case testNestedClass]
-class A:
- class B:
- x = 1
- def f(self): ...
- def g(self): ...
-[out]
-class A:
- class B:
- x = ... # type: int
- def f(self): ...
- def g(self): ...
-
-[case testExportViaRelativeImport]
-from .api import get
-[out]
-from .api import get as get
-
-[case testExportViaRelativePackageImport]
-from .packages.urllib3.contrib import parse
-[out]
-from .packages.urllib3.contrib import parse as parse
-
-[case testNoExportViaRelativeImport]
-from . import get
-[out]
-
-[case testRelativeImportAndBase]
-from .x import X
-class A(X):
- pass
-[out]
-from .x import X as X
-
-class A(X): ...
-
-[case testDuplicateDef]
-def syslog(a): pass
-def syslog(a): pass
-[out]
-def syslog(a): ...
-
-[case testAsyncAwait_fast_parser]
-async def f(a):
- x = await y
-[out]
-def f(a): ...
-
-[case testInferOptionalOnlyFunc]
-class A:
- x = None
- def __init__(self, a=None) -> None:
- self.x = []
-[out]
-from typing import Any, Optional
-
-class A:
- x = ... # type: Any
- def __init__(self, a: Optional[Any] = ...) -> None: ...
-
--- More features/fixes:
--- do not export deleted names
diff --git a/test-data/unit/typexport-basic.test b/test-data/unit/typexport-basic.test
deleted file mode 100644
index e7915cc..0000000
--- a/test-data/unit/typexport-basic.test
+++ /dev/null
@@ -1,1159 +0,0 @@
--- Test cases for exporting node types from the type checker.
---
--- Each test case consists of at least two sections.
--- The first section contains [case NAME-skip] followed by the input code,
--- while the second section contains [out] followed by the output from the type
--- checker.
---
--- The first line of input code should be a regexp in comment that describes
--- the information to dump (prefix with ##). The regexp is matched against
--- the following items:
---
--- * each name of an expression node
--- * each type string of a node (e.g. OpExpr)
---
--- Lines starting with "--" in this file will be ignored.
-
-
--- Expressions
--- -----------
-
-
-[case testConstructorCall]
-import typing
-A()
-B()
-class A: pass
-class B: pass
-[out]
-CallExpr(2) : A
-NameExpr(2) : def () -> A
-CallExpr(3) : B
-NameExpr(3) : def () -> B
-
-[case testLiterals]
-import typing
-5
-2.3
-'foo'
-[builtins fixtures/primitives.pyi]
-[out]
-IntExpr(2) : builtins.int
-FloatExpr(3) : builtins.float
-StrExpr(4) : builtins.str
-
-[case testNameExpression]
-
-a = None # type: A
-a # node
-def f(aa: 'A') -> None:
- b = None # type: B
- aa # node
- b # node
-class A:
- def g(self) -> None:
- self # node
-class B: pass
-[out]
-NameExpr(3) : A
-NameExpr(6) : A
-NameExpr(7) : B
-NameExpr(10) : A
-
-[case testEllipsis]
-import typing
-...
-[out]
-EllipsisExpr(2) : builtins.ellipsis
-
-[case testMemberAccess]
-## MemberExpr|CallExpr
-
-a = None # type: A
-a.m
-a.f
-a.f()
-class A:
- m = None # type: A
- def f(self) -> 'B': pass
-class B: pass
-[out]
-MemberExpr(4) : A
-MemberExpr(5) : def () -> B
-CallExpr(6) : B
-MemberExpr(6) : def () -> B
-
-[case testCastExpression]
-## CastExpr|[a-z]
-from typing import Any, cast
-d = None # type: Any
-b = None # type: B
-class A: pass
-class B(A): pass
-cast(A, d)
-cast(A, b)
-cast(B, b)
-[out]
-CastExpr(7) : A
-NameExpr(7) : Any
-CastExpr(8) : A
-NameExpr(8) : B
-CastExpr(9) : B
-NameExpr(9) : B
-
-[case testArithmeticOps]
-## OpExpr
-import typing
-a = 1 + 2
-1.2 * 3
-2.2 - 3
-1 / 2
-[file builtins.py]
-class object:
- def __init__(self) -> None: pass
-class function: pass
-class int:
- def __add__(self, x: int) -> int: pass
- def __truediv__(self, x: int) -> float: pass
-class float:
- def __mul__(self, x: int) -> float: pass
- def __sub__(self, x: int) -> float: pass
-class type: pass
-class str: pass
-[out]
-OpExpr(3) : builtins.int
-OpExpr(4) : builtins.float
-OpExpr(5) : builtins.float
-OpExpr(6) : builtins.float
-
-[case testComparisonOps]
-## ComparisonExpr
-import typing
-1 == object()
-1 == 2
-2 < 3
-1 < 2 < 3
-8 > 3
-4 < 6 > 2
-[file builtins.py]
-class object:
- def __init__(self) -> None: pass
-class int:
- def __eq__(self, x: object) -> bool: pass
- def __lt__(self, x: int) -> bool: pass
- def __gt__(self, x: int) -> int: pass
-class bool: pass
-class type: pass
-class function: pass
-class str: pass
-[out]
-ComparisonExpr(3) : builtins.bool
-ComparisonExpr(4) : builtins.bool
-ComparisonExpr(5) : builtins.bool
-ComparisonExpr(6) : builtins.bool
-ComparisonExpr(7) : builtins.int
-ComparisonExpr(8) : builtins.object
-
-[case testBooleanOps]
-## OpExpr|UnaryExpr
-import typing
-a = 1
-a and a
-a or a
-not a
-[builtins fixtures/bool.pyi]
-[out]
-OpExpr(4) : builtins.int
-OpExpr(5) : builtins.int
-UnaryExpr(6) : builtins.bool
-
-[case testBooleanOpsOnBools]
-## OpExpr|UnaryExpr
-import typing
-a = bool()
-a and a
-a or a
-not a
-[builtins fixtures/bool.pyi]
-[out]
-OpExpr(4) : builtins.bool
-OpExpr(5) : builtins.bool
-UnaryExpr(6) : builtins.bool
-
-[case testFunctionCall]
-## CallExpr
-from typing import Tuple
-f(
- A(),
- B())
-class A: pass
-class B: pass
-def f(a: A, b: B) -> Tuple[A, B]: pass
-[builtins fixtures/tuple-simple.pyi]
-[out]
-CallExpr(3) : Tuple[A, B]
-CallExpr(4) : A
-CallExpr(5) : B
-
-
--- Statements
--- ----------
-
-
-[case testSimpleAssignment]
-from typing import Any
-a = None # type: A
-b = a # type: Any
-b = a
-a = b
-
-class A: pass
-[out]
-NameExpr(3) : A
-NameExpr(4) : A
-NameExpr(4) : Any
-NameExpr(5) : A
-NameExpr(5) : Any
-
-[case testMemberAssignment]
-from typing import Any
-class A:
- a = None # type: A
- b = None # type: Any
- def f(self) -> None:
- self.b = self.a
- self.a.a = self.b
-[out]
-MemberExpr(6) : A
-MemberExpr(6) : Any
-NameExpr(6) : A
-NameExpr(6) : A
-MemberExpr(7) : A
-MemberExpr(7) : A
-MemberExpr(7) : A
-NameExpr(7) : A
-NameExpr(7) : A
-
-[case testIf]
-
-a = None # type: bool
-if a:
- 1
-elif not a:
- 1
-[builtins fixtures/bool.pyi]
-[out]
-NameExpr(3) : builtins.bool
-IntExpr(4) : builtins.int
-NameExpr(5) : builtins.bool
-UnaryExpr(5) : builtins.bool
-IntExpr(6) : builtins.int
-
-[case testWhile]
-
-a = None # type: bool
-while a:
- a
-[builtins fixtures/bool.pyi]
-[out]
-NameExpr(3) : builtins.bool
-NameExpr(4) : builtins.bool
-
-
--- Simple type inference
--- ---------------------
-
-
-[case testInferSingleType]
-import typing
-x = ()
-[builtins fixtures/primitives.pyi]
-[out]
-NameExpr(2) : Tuple[]
-TupleExpr(2) : Tuple[]
-
-[case testInferTwoTypes]
-## NameExpr
-import typing
-(s,
-i) = 'x', 1
-[builtins fixtures/primitives.pyi]
-[out]
-NameExpr(3) : builtins.str
-NameExpr(4) : builtins.int
-
-[case testInferSingleLocalVarType]
-import typing
-def f() -> None:
- x = ()
-[builtins fixtures/primitives.pyi]
-[out]
-NameExpr(3) : Tuple[]
-TupleExpr(3) : Tuple[]
-
-
--- Basic generics
--- --------------
-
-
-[case testImplicitBoundTypeVarsForMethod]
-## MemberExpr
-from typing import TypeVar, Generic
-T = TypeVar('T')
-class A(Generic[T]):
- def f(self) -> T: pass
-class B: pass
-def g() -> None:
- a = None # type: A[B]
- f = a.f
-[out]
-MemberExpr(9) : def () -> B
-
-[case testImplicitBoundTypeVarsForSelfMethodReference]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-class A(Generic[T]):
- def f(self) -> T:
- self.f()
-[out]
-CallExpr(5) : T`1
-MemberExpr(5) : def () -> T`1
-NameExpr(5) : A[T`1]
-
-[case testGenericFunctionCallWithTypeApp-skip]
-## CallExpr|TypeApplication|NameExpr
-from typing import Any, TypeVar, Tuple
-T = TypeVar('T')
-class A: pass
-f[A](A())
-f[Any](A())
-def f(a: T) -> Tuple[T, T]: pass
-[builtins fixtures/tuple.pyi]
-[out]
-CallExpr(5) : A
-CallExpr(5) : Tuple[A, A]
-NameExpr(5) : def () -> A
-NameExpr(5) : def (a: A) -> Tuple[A, A]
-TypeApplication(5) : def (a: A) -> Tuple[A, A]
-CallExpr(6) : A
-CallExpr(6) : Tuple[Any, Any]
-NameExpr(6) : def () -> A
-NameExpr(6) : def (a: Any) -> Tuple[Any, Any]
-TypeApplication(6) : def (a: Any) -> Tuple[Any, Any]
-
--- NOTE: Type applications are not supported for generic methods, so the
--- following test cases are commented out.
-
---[case testGenericMethodCallWithTypeApp]
---## CallExpr|MemberExpr|TypeApplication
---from typing import Any, TypeVar, Tuple
---T = TypeVar('T')
---class A:
--- def f(self, a: T) -> Tuple[T, T]: pass
---a.f[A](a)
---a.f[Any](a)
---a = None # type: A
---[builtins fixtures/tuple.py]
---[out]
---CallExpr(2) : Tuple[A, A]
---MemberExpr(2) : def (A a) -> Tuple[A, A]
---TypeApplication(2) : def (A a) -> Tuple[A, A]
---CallExpr(3) : Tuple[Any, Any]
---MemberExpr(3) : def (any a) -> Tuple[Any, Any]
---TypeApplication(3) : def (any a) -> Tuple[Any, Any]
-
---[case testGenericMethodCallInGenericTypeWithTypeApp]
---## CallExpr|MemberExpr|TypeApplication
---from typing import Any, TypeVar, Generic, Tuple
---T = TypeVar('T')
---S = TypeVar('S')
---class B: pass
---class C: pass
---a.f[B](b)
---a.f[Any](b)
---class A(Generic[T]):
--- def f(self, a: S) -> Tuple[T, S]: pass
---a = None # type: A[C]
---b = None # type: B
---[builtins fixtures/tuple.py]
---[out]
---CallExpr(6) : Tuple[C, B]
---MemberExpr(6) : def (B a) -> Tuple[C, B]
---TypeApplication(6) : def (B a) -> Tuple[C, B]
---CallExpr(7) : Tuple[C, Any]
---MemberExpr(7) : def (any a) -> Tuple[C, Any]
---TypeApplication(7) : def (any a) -> Tuple[C, Any]
-
-[case testGenericTypeVariableInference]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-class A(Generic[T]):
- def __init__(self, a: T) -> None: pass
-class B: pass
-A(A(B()))
-[out]
-CallExpr(6) : A[A[B]]
-CallExpr(6) : A[B]
-CallExpr(6) : B
-NameExpr(6) : def (a: A[B]) -> A[A[B]]
-NameExpr(6) : def (a: B) -> A[B]
-NameExpr(6) : def () -> B
-
-
--- Generic inheritance
--- -------------------
-
-
-[case testInheritedMethodReferenceWithGenericInheritance]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-class C: pass
-class A(Generic[T]):
- def f(self, a: T) -> None: pass
-class B(A[C]):
- def g(self, c: C) -> None:
- self.f(c)
-[out]
-CallExpr(8) : void
-MemberExpr(8) : def (a: C)
-NameExpr(8) : C
-NameExpr(8) : B
-
-[case testInheritedMethodReferenceWithGenericSubclass]
-from typing import TypeVar, Generic
-S = TypeVar('S')
-T = TypeVar('T')
-class C: pass
-class A(Generic[S, T]):
- def f(self, a: C) -> None: pass
-class B(A[C, T], Generic[T]):
- def g(self, c: C) -> None:
- self.f(c)
-[out]
-CallExpr(9) : void
-MemberExpr(9) : def (a: C)
-NameExpr(9) : C
-NameExpr(9) : B[T`1]
-
-[case testExternalReferenceWithGenericInheritance]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-class C: pass
-class A(Generic[T]):
- def f(self, a: T) -> None: pass
-class B(A[C]): pass
-b = None # type: B
-c = None # type: C
-b.f(c)
-[out]
-CallExpr(9) : void
-MemberExpr(9) : def (a: C)
-NameExpr(9) : B
-NameExpr(9) : C
-
-
--- Implicit Any types
--- ------------------
-
-
-[case testDynamicallyTypedFunction]
-
-def f(x):
- y = x + o
- z = o
- z
-o = None # type: object
-[out]
-NameExpr(3) : builtins.object
-NameExpr(3) : Any
-NameExpr(3) : Any
-OpExpr(3) : Any
-NameExpr(4) : builtins.object
-NameExpr(4) : Any
-NameExpr(5) : Any
-
-[case testDynamicallyTypedMethod]
-
-class A:
- def f(self, x):
- y = (
- o) # Place y and o on separate lines
- x
- y
-o = None # type: object
-[out]
-NameExpr(4) : Any
-NameExpr(5) : builtins.object
-NameExpr(6) : Any
-NameExpr(7) : Any
-
-[case testDynamicallyTypedConstructor]
-
-class A:
- def __init__(self, x):
- y = o
- x
- y
-o = None # type: object
-[out]
-NameExpr(4) : builtins.object
-NameExpr(4) : Any
-NameExpr(5) : Any
-NameExpr(6) : Any
-
-[case testCallInDynamicallyTypedFunction]
-
-def f():
- g(o)
-def g(a: object) -> object: pass
-o = None # type: object
-[out]
-CallExpr(3) : Any
-NameExpr(3) : def (a: builtins.object) -> builtins.object
-NameExpr(3) : builtins.object
-
-[case testExpressionInDynamicallyTypedFn]
-import typing
-def f():
- x = None
- x.f()
-[out]
-CallExpr(4) : Any
-MemberExpr(4) : Any
-NameExpr(4) : Any
-
-[case testGenericCall]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-def f() -> None:
- a1 = A(b) # type: A[B]
- a2 = A(b) # type: A[object]
-class A(Generic[T]):
- def __init__(self, a: T) -> None: pass
-class B: pass
-b = None # type: B
-[out]
-CallExpr(4) : A[B]
-NameExpr(4) : def (a: B) -> A[B]
-NameExpr(4) : B
-CallExpr(5) : A[builtins.object]
-NameExpr(5) : def (a: builtins.object) -> A[builtins.object]
-NameExpr(5) : B
-
-[case testGenericCallInDynamicallyTypedFunction]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-def f():
- A()
-class A(Generic[T]): pass
-[out]
-CallExpr(4) : Any
-NameExpr(4) : def [T] () -> A[T`1]
-
-[case testGenericCallInDynamicallyTypedFunction2]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-def f():
- A(f)
-class A(Generic[T]):
- def __init__(self, x: T) -> None: pass
-[out]
-CallExpr(4) : Any
-NameExpr(4) : def [T] (x: T`1) -> A[T`1]
-NameExpr(4) : def () -> Any
-
-[case testGenericCallInDynamicallyTypedFunction3]
-from typing import TypeVar
-t = TypeVar('t')
-def f():
- g(None)
-def g(x: t) -> t: pass
-[out]
-CallExpr(4) : Any
-NameExpr(4) : def [t] (x: t`-1) -> t`-1
-
-
--- Generic types and type inference
--- --------------------------------
-
-
-[case testInferenceInArgumentContext]
-## CallExpr
-from typing import TypeVar, Generic
-T = TypeVar('T')
-f(g())
-f(h(b))
-f(h(c))
-
-b = None # type: B
-c = None # type: C
-
-def f(a: 'A[B]') -> None: pass
-
-def g() -> 'A[T]': pass
-def h(a: T) -> 'A[T]': pass
-
-class A(Generic[T]): pass
-class B: pass
-class C(B): pass
-[out]
-CallExpr(4) : void
-CallExpr(4) : A[B]
-CallExpr(5) : void
-CallExpr(5) : A[B]
-CallExpr(6) : void
-CallExpr(6) : A[B]
-
-[case testInferGenericTypeForLocalVariable]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-def f() -> None:
- a = A(b)
- a
- a2, a3 = A(b), A(c)
- a2
- a3
-b = None # type: B
-c = None # type: C
-class A(Generic[T]):
- def __init__(self, x: T) -> None: pass
-class B: pass
-class C: pass
-[out]
-CallExpr(4) : A[B]
-NameExpr(4) : def (x: B) -> A[B]
-NameExpr(4) : A[B]
-NameExpr(4) : B
-NameExpr(5) : A[B]
-CallExpr(6) : A[B]
-CallExpr(6) : A[C]
-NameExpr(6) : def (x: B) -> A[B]
-NameExpr(6) : def (x: C) -> A[C]
-NameExpr(6) : A[B]
-NameExpr(6) : A[C]
-NameExpr(6) : B
-NameExpr(6) : C
-NameExpr(7) : A[B]
-NameExpr(8) : A[C]
-
-[case testNestedGenericCalls]
-from typing import TypeVar, Generic
-T = TypeVar('T')
-S = TypeVar('S')
-def h() -> None:
- g(f(c))
-
-c = None # type: C
-
-class A(Generic[T]): pass
-class B(Generic[T]): pass
-class C: pass
-def f(a: T) -> A[T]: pass
-def g(a: S) -> B[S]: pass
-[out]
-CallExpr(5) : A[C]
-CallExpr(5) : B[A[C]]
-NameExpr(5) : C
-NameExpr(5) : def (a: C) -> A[C]
-NameExpr(5) : def (a: A[C]) -> B[A[C]]
-
-[case testInferListLiterals]
-from typing import List
-a = [] # type: List[A]
-class A: pass
-[builtins fixtures/list.pyi]
-[out]
-ListExpr(2) : builtins.list[A]
-
-[case testInferGenericTypeInTypeAnyContext]
-from typing import Any
-a = [] # type: Any
-[builtins fixtures/list.pyi]
-[out]
-ListExpr(2) : builtins.list[Any]
-
-[case testHigherOrderFunction]
-from typing import TypeVar, Callable, List
-t = TypeVar('t')
-s = TypeVar('s')
-map(
- f,
- [A()])
-def map(f: Callable[[t], s], a: List[t]) -> List[s]: pass
-class A: pass
-class B: pass
-def f(a: A) -> B: pass
-[builtins fixtures/list.pyi]
-[out]
-CallExpr(4) : builtins.list[B]
-NameExpr(4) : def (f: def (A) -> B, a: builtins.list[A]) -> builtins.list[B]
-NameExpr(5) : def (a: A) -> B
-CallExpr(6) : A
-ListExpr(6) : builtins.list[A]
-NameExpr(6) : def () -> A
-
-
--- Lambdas
--- -------
-
-
-[case testLambdaWithTypeInferredFromContext]
-from typing import Callable
-f = lambda x: x.a # type: Callable[[B], A]
-class A: pass
-class B:
- a = None # type: A
-[out]
-FuncExpr(2) : def (B) -> A
-MemberExpr(2) : A
-NameExpr(2) : B
-
-[case testLambdaWithInferredType]
-## FuncExpr|NameExpr
-import typing
-f = lambda: 1
-[out]
-FuncExpr(3) : def () -> builtins.int
-NameExpr(3) : def () -> builtins.int
-
-[case testLambdaWithInferredType2]
-## FuncExpr|NameExpr
-import typing
-f = lambda: [1]
-[builtins fixtures/list.pyi]
-[out]
-FuncExpr(3) : def () -> builtins.list[builtins.int]
-NameExpr(3) : def () -> builtins.list[builtins.int]
-
-[case testLambdaWithInferredType2]
-from typing import List, Callable
-f = lambda x: [] # type: Callable[[B], List[A]]
-class A: pass
-class B:
- a = None # type: A
-[builtins fixtures/list.pyi]
-[out]
-FuncExpr(2) : def (B) -> builtins.list[A]
-ListExpr(2) : builtins.list[A]
-
-[case testLambdaAndHigherOrderFunction]
-from typing import TypeVar, Callable, List
-t = TypeVar('t')
-s = TypeVar('s')
-l = None # type: List[A]
-map(
- lambda x: f(x), l)
-def map(f: Callable[[t], s], a: List[t]) -> List[s]: pass
-class A: pass
-class B: pass
-def f(a: A) -> B: pass
-[builtins fixtures/list.pyi]
-[out]
-CallExpr(5) : builtins.list[B]
-NameExpr(5) : def (f: def (A) -> B, a: builtins.list[A]) -> builtins.list[B]
-CallExpr(6) : B
-FuncExpr(6) : def (A) -> B
-NameExpr(6) : def (a: A) -> B
-NameExpr(6) : builtins.list[A]
-NameExpr(6) : A
-
-[case testLambdaAndHigherOrderFunction2]
-## FuncExpr|NameExpr|ListExpr
-from typing import TypeVar, List, Callable
-t = TypeVar('t')
-s = TypeVar('s')
-l = None # type: List[A]
-map(
- lambda x: [f(x)], l)
-def map(f: Callable[[t], List[s]], a: List[t]) -> List[s]: pass
-class A: pass
-class B: pass
-def f(a: A) -> B: pass
-[builtins fixtures/list.pyi]
-[out]
-NameExpr(6) : def (f: def (A) -> builtins.list[B], a: builtins.list[A]) -> builtins.list[B]
-FuncExpr(7) : def (A) -> builtins.list[B]
-ListExpr(7) : builtins.list[B]
-NameExpr(7) : def (a: A) -> B
-NameExpr(7) : builtins.list[A]
-NameExpr(7) : A
-
-[case testLambdaInListAndHigherOrderFunction]
-from typing import TypeVar, Callable, List
-t = TypeVar('t')
-s = TypeVar('s')
-l = None # type: List[A]
-map(
- [lambda x: x],
- l)
-def map(f: List[Callable[[t], s]], a: List[t]) -> List[s]: pass
-class A: pass
-[builtins fixtures/list.pyi]
-[out]
--- TODO We probably should not silently infer 'Any' types in statically typed
--- context. Perhaps just fail instead?
-CallExpr(5) : builtins.list[Any]
-NameExpr(5) : def (f: builtins.list[def (A) -> Any], a: builtins.list[A]) -> builtins.list[Any]
-FuncExpr(6) : def (A) -> A
-ListExpr(6) : builtins.list[def (A) -> Any]
-NameExpr(6) : A
-NameExpr(7) : builtins.list[A]
-
-[case testLambdaAndHigherOrderFunction3]
-from typing import TypeVar, Callable, List
-t = TypeVar('t')
-s = TypeVar('s')
-l = None # type: List[A]
-map(
- lambda x: x.b,
- l)
-def map(f: Callable[[t], s], a: List[t]) -> List[s]: pass
-class A:
- b = None # type: B
-class B: pass
-[builtins fixtures/list.pyi]
-[out]
-CallExpr(5) : builtins.list[B]
-NameExpr(5) : def (f: def (A) -> B, a: builtins.list[A]) -> builtins.list[B]
-FuncExpr(6) : def (A) -> B
-MemberExpr(6) : B
-NameExpr(6) : A
-NameExpr(7) : builtins.list[A]
-
-[case testLambdaAndHigherOrderFunctionAndKeywordArgs]
-from typing import TypeVar, Callable, List
-t = TypeVar('t')
-s = TypeVar('s')
-l = None # type: List[A]
-map(
- a=l,
- f=lambda x: x.b)
-def map(f: Callable[[t], s], a: List[t]) -> List[s]: pass
-class A:
- b = None # type: B
-class B: pass
-[builtins fixtures/list.pyi]
-[out]
-CallExpr(5) : builtins.list[B]
-NameExpr(5) : def (f: def (A) -> B, a: builtins.list[A]) -> builtins.list[B]
-NameExpr(6) : builtins.list[A]
-FuncExpr(7) : def (A) -> B
-MemberExpr(7) : B
-NameExpr(7) : A
-
-
--- Boolean operations
--- ------------------
-
-
-[case testBooleanOr]
-from typing import List
-a = None # type: List[A]
-a or []
-a = a or []
-a = [] or a
-class A: pass
-[builtins fixtures/list.pyi]
-[out]
-ListExpr(3) : builtins.list[A]
-NameExpr(3) : builtins.list[A]
-OpExpr(3) : builtins.list[A]
-ListExpr(4) : builtins.list[A]
-NameExpr(4) : builtins.list[A]
-NameExpr(4) : builtins.list[A]
-OpExpr(4) : builtins.list[A]
-ListExpr(5) : builtins.list[A]
-NameExpr(5) : builtins.list[A]
-NameExpr(5) : builtins.list[A]
-OpExpr(5) : builtins.list[A]
-
-
--- Class attributes
--- ----------------
-
-
-[case testUnboundMethod]
-## MemberExpr
-import typing
-class A:
- def f(self) -> None: pass
-A.f
-[out]
-MemberExpr(5) : def (self: A)
-
-[case testUnboundMethodWithImplicitSig]
-## MemberExpr
-import typing
-class A:
- def f(self): pass
-A.f
-[out]
-MemberExpr(5) : def (self: Any) -> Any
-
-[case testOverloadedUnboundMethod]
-## MemberExpr
-from typing import overload
-class A:
- @overload
- def f(self) -> None: pass
- @overload
- def f(self, x: object) -> None: pass
-A.f
-[out]
-MemberExpr(8) : Overload(def (self: A), def (self: A, x: builtins.object))
-
-[case testOverloadedUnboundMethodWithImplicitSig]
-## MemberExpr
-from typing import overload
-class A:
- @overload
- def f(self): pass
- @overload
- def f(self, x): pass
-A.f
-[out]
-MemberExpr(8) : Overload(def (self: Any) -> Any, def (self: Any, x: Any) -> Any)
-
-[case testUnboundMethodWithInheritance]
-## MemberExpr
-import typing
-class A:
- def __init__(self) -> None: pass
- def f(self) -> None: pass
-class B(A):
- pass
-B.f
-[out]
-MemberExpr(8) : def (self: A)
-
-[case testUnboundGenericMethod]
-## MemberExpr
-from typing import TypeVar
-t = TypeVar('t')
-class B: pass
-class A:
- def f(self, x: t) -> None: pass
-A.f(A(), B())
-[out]
-MemberExpr(7) : def (self: A, x: B)
-
-[case testUnboundMethodOfGenericClass]
-## MemberExpr
-from typing import TypeVar, Generic
-t = TypeVar('t')
-class B: pass
-class A(Generic[t]):
- def f(self, x: t) -> None: pass
-A.f
-a_b = A() # type: A[B]
-A.f(a_b, B())
-[out]
-MemberExpr(7) : def [t] (self: A[t`1], x: t`1)
-MemberExpr(9) : def (self: A[B], x: B)
-
-[case testUnboundOverloadedMethodOfGenericClass]
-## CallExpr
-from typing import TypeVar, Generic, overload
-t = TypeVar('t')
-class B: pass
-class A(Generic[t]):
- @overload
- def f(self, x: t) -> t: pass
- @overload
- def f(self) -> object: pass
-ab, b = None, None # type: (A[B], B)
-A.f(ab, b)
-[out]
-CallExpr(11) : B
-
-[case testUnboundMethodOfGenericClassWithImplicitSig]
-## MemberExpr
-from typing import TypeVar, Generic
-t = TypeVar('t')
-class B: pass
-class A(Generic[t]):
- def f(self, x): pass
-A.f(None, None)
-[out]
-MemberExpr(7) : def (self: Any, x: Any) -> Any
-
-[case testGenericMethodOfGenericClass]
-## MemberExpr
-from typing import TypeVar, Generic
-t = TypeVar('t')
-s = TypeVar('s')
-class B: pass
-class A(Generic[t]):
- def f(self, y: s) -> None: pass
-ab = None # type: A[B]
-o = None # type: object
-A.f(ab, o)
-[out]
-MemberExpr(10) : def (self: A[B], y: builtins.object)
-
-
--- Type variables with value restriction
--- -------------------------------------
-
-
-[case testTypeVariableWithValueRestriction]
-## NameExpr
-from typing import TypeVar
-T = TypeVar('T', int, str)
-def f(x: T) -> None: pass
-f(1)
-f('x')
-[out]
-NameExpr(5) : def (x: builtins.int)
-NameExpr(6) : def (x: builtins.str)
-
-[case testTypeVariableWithValueRestrictionAndSubtype]
-## NameExpr|CallExpr
-from typing import TypeVar
-T = TypeVar('T', int, str)
-def f(x: T) -> T: pass
-class S(str): pass
-s = None # type: S
-f(s)
-[out]
-CallExpr(7) : builtins.str
-NameExpr(7) : def (x: builtins.str) -> builtins.str
-NameExpr(7) : S
-
-
--- Binary operations
--- -----------------
-
-
-[case testBinaryOperatorWithAnyLeftOperand]
-## OpExpr
-from typing import Any
-class B:
- def __add__(self, x: int) -> str: pass
-class A:
- def __radd__(self, x: B) -> int: pass
-Any(1) + A()
-B() + A()
-[out]
-OpExpr(7) : Any
-OpExpr(8) : builtins.int
-
-[case testBinaryOperatorWithAnyRightOperand]
-## OpExpr
-from typing import Any
-class A:
- def __add__(self, x: str) -> int: pass
-A() + Any(1)
-[out]
-OpExpr(5) : Any
-
-
--- Callable overloading
--- --------------------
-
-
-[case testOverloadedFunctionType]
-## CallExpr
-from typing import overload
- at overload
-def f(x: int) -> str: pass
- at overload
-def f(x: str) -> int: pass
-f(1)
-f('')
-[out]
-CallExpr(7) : builtins.str
-CallExpr(8) : builtins.int
-
-[case testOverlappingOverloadedFunctionType]
-## CallExpr
-from typing import overload
-class A: pass
-class B(A): pass
- at overload
-def f(x: B) -> B: pass
- at overload
-def f(x: A) -> A: pass
-a = None # type: A
-b = None # type: B
-f(a)
-f(b)
-[out]
-CallExpr(11) : A
-CallExpr(12) : B
-
-
-
-[case testOverloadedErasedType]
-from typing import Callable
-from typing import List
-from typing import overload
-from typing import TypeVar
-
-T = TypeVar("T")
-V = TypeVar("V")
-
-def fun(s: int) -> int: pass
-
-def m(fun: Callable[[T], V], iter: List[T]) -> None: pass
-
-nums = [1] # type: List[int]
-m(fun,
- nums)
-[builtins fixtures/list.pyi]
-[out]
-IntExpr(13) : builtins.int
-ListExpr(13) : builtins.list[builtins.int]
-CallExpr(14) : void
-NameExpr(14) : def (s: builtins.int) -> builtins.int
-NameExpr(14) : def (fun: def (builtins.int) -> builtins.int, iter: builtins.list[builtins.int])
-NameExpr(15) : builtins.list[builtins.int]
-
-
--- Special cases
--- -------------
-
-
-[case testImplicitDataAttributeInit]
-## NameExpr
-import typing
-class A:
- def __init__(self) -> None:
- self.x = (
- A())
-[out]
-NameExpr(5) : A
-NameExpr(6) : def () -> A
-
-[case testListMultiplicationInContext]
-## ListExpr|OpExpr|IntExpr
-from typing import List
-a = [None] * 3 # type: List[str]
-[builtins fixtures/list.pyi]
-[out]
-IntExpr(3) : builtins.int
-ListExpr(3) : builtins.list[builtins.str]
-OpExpr(3) : builtins.list[builtins.str]
-
-
--- TODO
---
--- test expressions
--- list literal
--- tuple literal
--- unary minus
--- indexing
--- super expression
--- more complex lambda (multiple arguments etc.)
--- list comprehension
--- generator expression
--- overloads
--- other things
--- type inference
--- default argument value
--- for loop variable
--- exception variable
--- varargs
--- generics
--- explicit types
--- type of 'None' (currently stripped, but sometimes we may want to dump it)
diff --git a/test-requirements.txt b/test-requirements.txt
deleted file mode 100644
index 5ce8f80..0000000
--- a/test-requirements.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-flake8
-flake8-bugbear; python_version >= '3.5'
-flake8-pyi; python_version >= '3.5'
-lxml; sys_platform != 'win32'
-typed-ast>=0.6.3; sys_platform != 'win32' or python_version >= '3.5'
-pytest>=2.8
-pytest-xdist>=1.13
-pytest-cov>=2.4.0
-typing>=3.5.2; python_version < '3.5'
diff --git a/tmp-test-dirs/.gitignore b/tmp-test-dirs/.gitignore
deleted file mode 100644
index e6579d8..0000000
--- a/tmp-test-dirs/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-# This directory is used to store temporary directories for the testsuite.
-# If anything manages to exist here, it means python crashed instead of
-# calling tempfile.TemporaryDirectory's cleanup while unwinding.
-# Therefore, don't actually provide any ignore patterns.
diff --git a/typeshed/stdlib/2/BaseHTTPServer.pyi b/typeshed/stdlib/2/BaseHTTPServer.pyi
new file mode 100644
index 0000000..8bb34b8
--- /dev/null
+++ b/typeshed/stdlib/2/BaseHTTPServer.pyi
@@ -0,0 +1,47 @@
+# Stubs for BaseHTTPServer (Python 2.7)
+
+from typing import Any, BinaryIO, Mapping, Optional, Tuple, Union
+import SocketServer
+import mimetools
+
+class HTTPServer(SocketServer.TCPServer):
+ server_name = ... # type: str
+ server_port = ... # type: int
+ def __init__(self, server_address: Tuple[str, int],
+ RequestHandlerClass: type) -> None: ...
+
+class BaseHTTPRequestHandler:
+ client_address = ... # type: Tuple[str, int]
+ server = ... # type: SocketServer.BaseServer
+ close_connection = ... # type: bool
+ command = ... # type: str
+ path = ... # type: str
+ request_version = ... # type: str
+ headers = ... # type: mimetools.Message
+ rfile = ... # type: BinaryIO
+ wfile = ... # type: BinaryIO
+ server_version = ... # type: str
+ sys_version = ... # type: str
+ error_message_format = ... # type: str
+ error_content_type = ... # type: str
+ protocol_version = ... # type: str
+ MessageClass = ... # type: type
+ responses = ... # type: Mapping[int, Tuple[str, str]]
+ def __init__(self, request: bytes, client_address: Tuple[str, int],
+ server: SocketServer.BaseServer) -> None: ...
+ def handle(self) -> None: ...
+ def handle_one_request(self) -> None: ...
+ def send_error(self, code: int, message: Optional[str] = ...) -> None: ...
+ def send_response(self, code: int,
+ message: Optional[str] = ...) -> None: ...
+ def send_header(self, keyword: str, value: str) -> None: ...
+ def end_headers(self) -> None: ...
+ def flush_headers(self) -> None: ...
+ def log_request(self, code: Union[int, str] = ...,
+ size: Union[int, str] = ...) -> None: ...
+ def log_error(self, format: str, *args: Any) -> None: ...
+ def log_message(self, format: str, *args: Any) -> None: ...
+ def version_string(self) -> str: ...
+ def date_time_string(self, timestamp: Optional[int] = ...) -> str: ...
+ def log_date_time_string(self) -> str: ...
+ def address_string(self) -> str: ...
diff --git a/typeshed/stdlib/2/ConfigParser.pyi b/typeshed/stdlib/2/ConfigParser.pyi
new file mode 100644
index 0000000..67b0340
--- /dev/null
+++ b/typeshed/stdlib/2/ConfigParser.pyi
@@ -0,0 +1,96 @@
+from typing import Any, IO, Sequence, Tuple, Union
+
+__all__ = ... # type: list[str]
+DEFAULTSECT = ... # type: str
+MAX_INTERPOLATION_DEPTH = ... # type: int
+
+class Error(Exception):
+ message = ... # type: Any
+ def __init__(self, msg: str = ...) -> None: ...
+ def _get_message(self) -> None: ...
+ def _set_message(self, value: str) -> None: ...
+ def __repr__(self) -> str: ...
+ def __str__(self) -> str: ...
+
+class NoSectionError(Error):
+ section = ... # type: str
+ def __init__(self, section: str) -> None: ...
+
+class DuplicateSectionError(Error):
+ section = ... # type: str
+ def __init__(self, section: str) -> None: ...
+
+class NoOptionError(Error):
+ section = ... # type: str
+ option = ... # type: str
+ def __init__(self, option: str, section: str) -> None: ...
+
+class InterpolationError(Error):
+ section = ... # type: str
+ option = ... # type: str
+ msg = ... # type: str
+ def __init__(self, option: str, section: str, msg: str) -> None: ...
+
+class InterpolationMissingOptionError(InterpolationError):
+ reference = ... # type: str
+ def __init__(self, option: str, section: str, rawval: str, reference: str) -> None: ...
+
+class InterpolationSyntaxError(InterpolationError): ...
+
+class InterpolationDepthError(InterpolationError):
+ def __init__(self, option: str, section: str, rawval: str) -> None: ...
+
+class ParsingError(Error):
+ filename = ... # type: str
+ errors = ... # type: list[Tuple[Any, Any]]
+ def __init__(self, filename: str) -> None: ...
+ def append(self, lineno: Any, line: Any) -> None: ...
+
+class MissingSectionHeaderError(ParsingError):
+ lineno = ... # type: Any
+ line = ... # type: Any
+ def __init__(self, filename: str, lineno: Any, line: Any) -> None: ...
+
+
+class RawConfigParser:
+ _dict = ... # type: Any
+ _sections = ... # type: dict
+ _defaults = ... # type: dict
+ _optcre = ... # type: Any
+ SECTCRE = ... # type: Any
+ OPTCRE = ... # type: Any
+ OPTCRE_NV = ... # type: Any
+ def __init__(self, defaults: dict[Any, Any] = ..., dict_type: Any = ..., allow_no_value: bool = ...) -> None: ...
+ def defaults(self) -> dict[Any, Any]: ...
+ def sections(self) -> list[str]: ...
+ def add_section(self, section: str) -> None: ...
+ def has_section(self, section: str) -> bool: ...
+ def options(self, section: str) -> list[str]: ...
+ def read(self, filenames: Union[str, Sequence[str]]) -> list[str]: ...
+ def readfp(self, fp: IO[str], filename: str = ...) -> None: ...
+ def get(self, section: str, option: str) -> str: ...
+ def items(self, section: str) -> list[Tuple[Any, Any]]: ...
+ def _get(self, section: str, conv: type, option: str) -> Any: ...
+ def getint(self, section: str, option: str) -> int: ...
+ def getfloat(self, section: str, option: str) -> float: ...
+ _boolean_states = ... # type: dict[str, bool]
+ def getboolean(self, section: str, option: str) -> bool: ...
+ def optionxform(self, optionstr: str) -> str: ...
+ def has_option(self, section: str, option: str) -> bool: ...
+ def set(self, section: str, option: str, value: Any = ...) -> None: ...
+ def write(self, fp: file) -> None: ...
+ def remove_option(self, section: str, option: Any) -> bool: ...
+ def remove_section(self, section: str) -> bool: ...
+ def _read(self, fp: file, fpname: str) -> None: ...
+
+class ConfigParser(RawConfigParser):
+ _KEYCRE = ... # type: Any
+ def get(self, section: str, option: str, raw: bool = ..., vars: dict = ...) -> Any: ...
+ def items(self, section: str, raw: bool = ..., vars: dict = ...) -> list[Tuple[str, Any]]: ...
+ def _interpolate(self, section: str, option: str, rawval: Any, vars: Any) -> str: ...
+ def _interpolation_replace(self, match: Any) -> str: ...
+
+class SafeConfigParser(ConfigParser):
+ _interpvar_re = ... # type: Any
+ def _interpolate(self, section: str, option: str, rawval: Any, vars: Any) -> str: ...
+ def _interpolate_some(self, option: str, accum: list, rest: str, section: str, map: dict, depth: int) -> None: ...
diff --git a/typeshed/stdlib/2/Cookie.pyi b/typeshed/stdlib/2/Cookie.pyi
new file mode 100644
index 0000000..2df4eb0
--- /dev/null
+++ b/typeshed/stdlib/2/Cookie.pyi
@@ -0,0 +1,44 @@
+# Stubs for Cookie (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class CookieError(Exception): ...
+
+class Morsel(dict):
+ key = ... # type: Any
+ def __init__(self): ...
+ def __setitem__(self, K, V): ...
+ def isReservedKey(self, K): ...
+ value = ... # type: Any
+ coded_value = ... # type: Any
+ def set(self, key, val, coded_val, LegalChars=..., idmap=..., translate=...): ...
+ def output(self, attrs=None, header=...): ...
+ def js_output(self, attrs=None): ...
+ def OutputString(self, attrs=None): ...
+
+class BaseCookie(dict):
+ def value_decode(self, val): ...
+ def value_encode(self, val): ...
+ def __init__(self, input=None): ...
+ def __setitem__(self, key, value): ...
+ def output(self, attrs=None, header=..., sep=...): ...
+ def js_output(self, attrs=None): ...
+ def load(self, rawdata): ...
+
+class SimpleCookie(BaseCookie):
+ def value_decode(self, val): ...
+ def value_encode(self, val): ...
+
+class SerialCookie(BaseCookie):
+ def __init__(self, input=None): ...
+ def value_decode(self, val): ...
+ def value_encode(self, val): ...
+
+class SmartCookie(BaseCookie):
+ def __init__(self, input=None): ...
+ def value_decode(self, val): ...
+ def value_encode(self, val): ...
+
+Cookie = ... # type: Any
diff --git a/typeshed/stdlib/2/HTMLParser.pyi b/typeshed/stdlib/2/HTMLParser.pyi
new file mode 100644
index 0000000..989e14c
--- /dev/null
+++ b/typeshed/stdlib/2/HTMLParser.pyi
@@ -0,0 +1,31 @@
+from typing import List, Tuple, AnyStr
+from markupbase import ParserBase
+
+class HTMLParser(ParserBase):
+ def __init__(self) -> None: ...
+ def feed(self, feed: AnyStr) -> None: ...
+ def close(self) -> None: ...
+ def reset(self) -> None: ...
+
+ def get_starttag_text(self) -> AnyStr: ...
+ def set_cdata_mode(self, AnyStr) -> None: ...
+ def clear_cdata_mode(self) -> None: ...
+
+ def handle_startendtag(self, tag: AnyStr, attrs: List[Tuple[AnyStr, AnyStr]]): ...
+ def handle_starttag(self, tag: AnyStr, attrs: List[Tuple[AnyStr, AnyStr]]): ...
+ def handle_endtag(self, tag: AnyStr): ...
+ def handle_charref(self, name: AnyStr): ...
+ def handle_entityref(self, name: AnyStr): ...
+ def handle_data(self, data: AnyStr): ...
+ def handle_comment(self, data: AnyStr): ...
+ def handle_decl(self, decl: AnyStr): ...
+ def handle_pi(self, data: AnyStr): ...
+
+ def unknown_decl(self, data: AnyStr): ...
+
+ def unescape(self, s: AnyStr) -> AnyStr: ...
+
+class HTMLParseError(Exception):
+ msg = ... # type: str
+ lineno = ... # type: int
+ offset = ... # type: int
diff --git a/typeshed/stdlib/2/Queue.pyi b/typeshed/stdlib/2/Queue.pyi
new file mode 100644
index 0000000..831b96c
--- /dev/null
+++ b/typeshed/stdlib/2/Queue.pyi
@@ -0,0 +1,29 @@
+# Stubs for Queue (Python 2)
+
+from typing import Any, TypeVar, Generic, Optional
+
+_T = TypeVar('_T')
+
+class Empty(Exception): ...
+class Full(Exception): ...
+
+class Queue(Generic[_T]):
+ maxsize = ... # type: Any
+ mutex = ... # type: Any
+ not_empty = ... # type: Any
+ not_full = ... # type: Any
+ all_tasks_done = ... # type: Any
+ unfinished_tasks = ... # type: Any
+ def __init__(self, maxsize: int = ...) -> None: ...
+ def task_done(self) -> None: ...
+ def join(self) -> None: ...
+ def qsize(self) -> int: ...
+ def empty(self) -> bool: ...
+ def full(self) -> bool: ...
+ def put(self, item: _T, block: bool = ..., timeout: Optional[float] = ...) -> None: ...
+ def put_nowait(self, item: _T) -> None: ...
+ def get(self, block: bool = ..., timeout: Optional[float] = ...) -> _T: ...
+ def get_nowait(self) -> _T: ...
+
+class PriorityQueue(Queue): ...
+class LifoQueue(Queue): ...
diff --git a/typeshed/stdlib/2/SocketServer.pyi b/typeshed/stdlib/2/SocketServer.pyi
new file mode 100644
index 0000000..14a739b
--- /dev/null
+++ b/typeshed/stdlib/2/SocketServer.pyi
@@ -0,0 +1,93 @@
+# Stubs for socketserver
+
+from typing import Any, BinaryIO, Optional, Tuple
+from socket import SocketType
+import sys
+import types
+
+class BaseServer:
+ address_family = ... # type: int
+ RequestHandlerClass = ... # type: type
+ server_address = ... # type: Tuple[str, int]
+ socket = ... # type: SocketType
+ allow_reuse_address = ... # type: bool
+ request_queue_size = ... # type: int
+ socket_type = ... # type: int
+ timeout = ... # type: Optional[float]
+ def __init__(self, server_address: Tuple[str, int],
+ RequestHandlerClass: type) -> None: ...
+ def fileno(self) -> int: ...
+ def handle_request(self) -> None: ...
+ def serve_forever(self, poll_interval: float = ...) -> None: ...
+ def shutdown(self) -> None: ...
+ def server_close(self) -> None: ...
+ def finish_request(self) -> None: ...
+ def get_request(self) -> None: ...
+ def handle_error(self, request: bytes,
+ client_address: Tuple[str, int]) -> None: ...
+ def handle_timeout(self) -> None: ...
+ def process_request(self, request: bytes,
+ client_address: Tuple[str, int]) -> None: ...
+ def server_activate(self) -> None: ...
+ def server_bind(self) -> None: ...
+ def verify_request(self, request: bytes,
+ client_address: Tuple[str, int]) -> bool: ...
+ if sys.version_info >= (3, 6):
+ def __enter__(self) -> 'BaseServer': ...
+ def __exit__(self, exc_type: Optional[type],
+ exc_val: Optional[Exception],
+ exc_tb: Optional[types.TracebackType]) -> bool: ...
+ if sys.version_info >= (3, 3):
+ def service_actions(self) -> None: ...
+
+class TCPServer(BaseServer):
+ def __init__(self, server_address: Tuple[str, int],
+ RequestHandlerClass: type,
+ bind_and_activate: bool = ...) -> None: ...
+
+class UDPServer(BaseServer):
+ def __init__(self, server_address: Tuple[str, int],
+ RequestHandlerClass: type,
+ bind_and_activate: bool = ...) -> None: ...
+
+class UnixStreamServer(BaseServer):
+ def __init__(self, server_address: Tuple[str, int],
+ RequestHandlerClass: type,
+ bind_and_activate: bool = ...) -> None: ...
+
+class UnixDatagramServer(BaseServer):
+ def __init__(self, server_address: Tuple[str, int],
+ RequestHandlerClass: type,
+ bind_and_activate: bool = ...) -> None: ...
+
+class ForkingMixIn: ...
+class ThreadingMixIn: ...
+
+class ForkingTCPServer(ForkingMixIn, TCPServer): ...
+class ForkingUDPServer(ForkingMixIn, UDPServer): ...
+class ThreadingTCPServer(ThreadingMixIn, TCPServer): ...
+class ThreadingUDPServer(ThreadingMixIn, UDPServer): ...
+
+
+class BaseRequestHandler:
+ # Those are technically of types, respectively:
+ # * Union[SocketType, Tuple[bytes, SocketType]]
+ # * Union[Tuple[str, int], str]
+ # But there are some concerns that having unions here would cause
+ # too much inconvenience to people using it (see
+ # https://github.com/python/typeshed/pull/384#issuecomment-234649696)
+ request = ... # type: Any
+ client_address = ... # type: Any
+
+ server = ... # type: BaseServer
+ def setup(self) -> None: ...
+ def handle(self) -> None: ...
+ def finish(self) -> None: ...
+
+class StreamRequestHandler(BaseRequestHandler):
+ rfile = ... # type: BinaryIO
+ wfile = ... # type: BinaryIO
+
+class DatagramRequestHandler(BaseRequestHandler):
+ rfile = ... # type: BinaryIO
+ wfile = ... # type: BinaryIO
diff --git a/typeshed/stdlib/2/StringIO.pyi b/typeshed/stdlib/2/StringIO.pyi
new file mode 100644
index 0000000..bf77516
--- /dev/null
+++ b/typeshed/stdlib/2/StringIO.pyi
@@ -0,0 +1,30 @@
+# Stubs for StringIO (Python 2)
+
+from typing import Any, IO, AnyStr, Iterator, Iterable, Generic, List
+
+class StringIO(IO[AnyStr], Generic[AnyStr]):
+ closed = ... # type: bool
+ softspace = ... # type: int
+ len = ... # type: int
+ name = ... # type: str
+ def __init__(self, buf: AnyStr = ...) -> None: ...
+ def __iter__(self) -> Iterator[AnyStr]: ...
+ def next(self) -> AnyStr: ...
+ def close(self) -> None: ...
+ def isatty(self) -> bool: ...
+ def seek(self, pos: int, mode: int = ...) -> None: ...
+ def tell(self) -> int: ...
+ def read(self, n: int = ...) -> AnyStr: ...
+ def readline(self, length: int = ...) -> AnyStr: ...
+ def readlines(self, sizehint: int = ...) -> List[AnyStr]: ...
+ def truncate(self, size: int = ...) -> int: ...
+ def write(self, s: AnyStr) -> None: ...
+ def writelines(self, iterable: Iterable[AnyStr]) -> None: ...
+ def flush(self) -> None: ...
+ def getvalue(self) -> AnyStr: ...
+ def __enter__(self) -> Any: ...
+ def __exit__(self, type: Any, value: Any, traceback: Any) -> Any: ...
+ def fileno(self) -> int: ...
+ def readable(self) -> bool: ...
+ def seekable(self) -> bool: ...
+ def writable(self) -> bool: ...
diff --git a/typeshed/stdlib/2/UserDict.pyi b/typeshed/stdlib/2/UserDict.pyi
new file mode 100644
index 0000000..a30c2e9
--- /dev/null
+++ b/typeshed/stdlib/2/UserDict.pyi
@@ -0,0 +1,38 @@
+from typing import (Any, Container, Dict, Generic, Iterable, Iterator, List,
+ Mapping, Sized, Tuple, TypeVar, overload)
+
+_KT = TypeVar('_KT')
+_VT = TypeVar('_VT')
+
+class UserDict(Dict[_KT, _VT], Generic[_KT, _VT]):
+ data = ... # type: Mapping[_KT, _VT]
+
+ def __init__(self, initialdata: Mapping[_KT, _VT] = ...) -> None: ...
+
+ # TODO: __iter__ is not available for UserDict
+
+class IterableUserDict(UserDict[_KT, _VT], Generic[_KT, _VT]):
+ ...
+
+class DictMixin(Sized, Iterable[_KT], Container[_KT], Generic[_KT, _VT]):
+ def has_key(self, key: _KT) -> bool: ...
+
+ # From typing.Mapping[_KT, _VT]
+ # (can't inherit because of keys())
+ def get(self, k: _KT, default: _VT = ...) -> _VT: ...
+ def values(self) -> List[_VT]: ...
+ def items(self) -> List[Tuple[_KT, _VT]]: ...
+ def iterkeys(self) -> Iterator[_KT]: ...
+ def itervalues(self) -> Iterator[_VT]: ...
+ def iteritems(self) -> Iterator[Tuple[_KT, _VT]]: ...
+ def __contains__(self, o: Any) -> bool: ...
+
+ # From typing.MutableMapping[_KT, _VT]
+ def clear(self) -> None: ...
+ def pop(self, k: _KT, default: _VT = ...) -> _VT: ...
+ def popitem(self) -> Tuple[_KT, _VT]: ...
+ def setdefault(self, k: _KT, default: _VT = ...) -> _VT: ...
+ @overload
+ def update(self, m: Mapping[_KT, _VT], **kwargs: _VT) -> None: ...
+ @overload
+ def update(self, m: Iterable[Tuple[_KT, _VT]], **kwargs: _VT) -> None: ...
diff --git a/typeshed/stdlib/2/UserList.pyi b/typeshed/stdlib/2/UserList.pyi
new file mode 100644
index 0000000..4f31b93
--- /dev/null
+++ b/typeshed/stdlib/2/UserList.pyi
@@ -0,0 +1,3 @@
+import collections
+
+class UserList(collections.MutableSequence): ...
diff --git a/typeshed/stdlib/2/UserString.pyi b/typeshed/stdlib/2/UserString.pyi
new file mode 100644
index 0000000..3a26a7c
--- /dev/null
+++ b/typeshed/stdlib/2/UserString.pyi
@@ -0,0 +1,4 @@
+import collections
+
+class UserString(collections.Sequence): ...
+class MutableString(UserString, collections.MutableSequence): ...
diff --git a/typeshed/stdlib/2/__builtin__.pyi b/typeshed/stdlib/2/__builtin__.pyi
new file mode 100644
index 0000000..e8d4ae0
--- /dev/null
+++ b/typeshed/stdlib/2/__builtin__.pyi
@@ -0,0 +1,947 @@
+# Stubs for builtins (Python 2.7)
+
+# True and False are deliberately omitted because they are keywords in
+# Python 3, and stub files conform to Python 3 syntax.
+
+from typing import (
+ TypeVar, Iterator, Iterable, overload,
+ Sequence, Mapping, Tuple, List, Any, Dict, Callable, Generic, Set,
+ AbstractSet, FrozenSet, Sized, Reversible, SupportsInt, SupportsFloat, SupportsAbs,
+ SupportsRound, IO, BinaryIO, Union, AnyStr, MutableSequence, MutableMapping,
+ MutableSet, ItemsView, KeysView, ValuesView, Optional, Container,
+)
+from abc import abstractmethod, ABCMeta
+from mypy_extensions import NoReturn
+
+_T = TypeVar('_T')
+_T_co = TypeVar('_T_co', covariant=True)
+_KT = TypeVar('_KT')
+_VT = TypeVar('_VT')
+_S = TypeVar('_S')
+_T1 = TypeVar('_T1')
+_T2 = TypeVar('_T2')
+_T3 = TypeVar('_T3')
+_T4 = TypeVar('_T4')
+_TT = TypeVar('_TT', bound='type')
+
+class staticmethod: pass # Special, only valid as a decorator.
+class classmethod: pass # Special, only valid as a decorator.
+
+class object:
+ __doc__ = ... # type: Optional[str]
+ __class__ = ... # type: type
+ __slots__ = ... # type: Optional[Union[str, unicode, Iterable[Union[str, unicode]]]]
+
+ def __init__(self) -> None: ...
+ def __new__(cls) -> Any: ...
+ def __setattr__(self, name: str, value: Any) -> None: ...
+ def __eq__(self, o: object) -> bool: ...
+ def __ne__(self, o: object) -> bool: ...
+ def __str__(self) -> str: ...
+ def __repr__(self) -> str: ...
+ def __hash__(self) -> int: ...
+ def __format__(self, format_spec: str) -> str: ...
+ def __getattribute__(self, name: str) -> Any: ...
+ def __delattr__(self, name: str) -> None: ...
+
+class type:
+ __bases__ = ... # type: Tuple[type, ...]
+ __name__ = ... # type: str
+ __module__ = ... # type: str
+ __dict__ = ... # type: Dict[unicode, Any]
+
+ @overload
+ def __init__(self, o: object) -> None: ...
+ @overload
+ def __init__(self, name: str, bases: Tuple[type, ...], dict: Dict[str, Any]) -> None: ...
+ # TODO: __new__ may have to be special and not a static method.
+ @overload
+ def __new__(cls, o: object) -> type: ...
+ @overload
+ def __new__(cls, name: str, bases: Tuple[type, ...], namespace: Dict[str, Any]) -> type: ...
+ def __call__(self, *args: Any, **kwds: Any) -> Any: ...
+
+ # Only new-style classes
+ __mro__ = ... # type: Tuple[type, ...]
+ # Note: the documentation doesnt specify what the return type is, the standard
+ # implementation seems to be returning a list.
+ def mro(self) -> List[type]: ...
+ def __subclasses__(self: _TT) -> List[_TT]: ...
+
+class int(SupportsInt, SupportsFloat, SupportsAbs[int]):
+ @overload
+ def __init__(self) -> None: ...
+ @overload
+ def __init__(self, x: SupportsInt) -> None: ...
+ @overload
+ def __init__(self, x: Union[str, unicode, bytearray], base: int = 10) -> None: ...
+ def bit_length(self) -> int: ...
+
+ def __add__(self, x: int) -> int: ...
+ def __sub__(self, x: int) -> int: ...
+ def __mul__(self, x: int) -> int: ...
+ def __floordiv__(self, x: int) -> int: ...
+ def __div__(self, x: int) -> int: ...
+ def __truediv__(self, x: int) -> float: ...
+ def __mod__(self, x: int) -> int: ...
+ def __radd__(self, x: int) -> int: ...
+ def __rsub__(self, x: int) -> int: ...
+ def __rmul__(self, x: int) -> int: ...
+ def __rfloordiv__(self, x: int) -> int: ...
+ def __rdiv__(self, x: int) -> int: ...
+ def __rtruediv__(self, x: int) -> float: ...
+ def __rmod__(self, x: int) -> int: ...
+ def __pow__(self, x: int) -> Any: ... # Return type can be int or float, depending on x.
+ def __rpow__(self, x: int) -> Any: ...
+ def __and__(self, n: int) -> int: ...
+ def __or__(self, n: int) -> int: ...
+ def __xor__(self, n: int) -> int: ...
+ def __lshift__(self, n: int) -> int: ...
+ def __rshift__(self, n: int) -> int: ...
+ def __rand__(self, n: int) -> int: ...
+ def __ror__(self, n: int) -> int: ...
+ def __rxor__(self, n: int) -> int: ...
+ def __rlshift__(self, n: int) -> int: ...
+ def __rrshift__(self, n: int) -> int: ...
+ def __neg__(self) -> int: ...
+ def __pos__(self) -> int: ...
+ def __invert__(self) -> int: ...
+
+ def __eq__(self, x: object) -> bool: ...
+ def __ne__(self, x: object) -> bool: ...
+ def __lt__(self, x: int) -> bool: ...
+ def __le__(self, x: int) -> bool: ...
+ def __gt__(self, x: int) -> bool: ...
+ def __ge__(self, x: int) -> bool: ...
+
+ def __str__(self) -> str: ...
+ def __float__(self) -> float: ...
+ def __int__(self) -> int: ...
+ def __abs__(self) -> int: ...
+ def __hash__(self) -> int: ...
+
+class float(SupportsFloat, SupportsInt, SupportsAbs[float]):
+ @overload
+ def __init__(self) -> None: ...
+ @overload
+ def __init__(self, x: SupportsFloat) -> None: ...
+ @overload
+ def __init__(self, x: unicode) -> None: ...
+ @overload
+ def __init__(self, x: bytearray) -> None: ...
+ def as_integer_ratio(self) -> Tuple[int, int]: ...
+ def hex(self) -> str: ...
+ def is_integer(self) -> bool: ...
+ @classmethod
+ def fromhex(cls, s: str) -> float: ...
+
+ def __add__(self, x: float) -> float: ...
+ def __sub__(self, x: float) -> float: ...
+ def __mul__(self, x: float) -> float: ...
+ def __floordiv__(self, x: float) -> float: ...
+ def __div__(self, x: float) -> float: ...
+ def __truediv__(self, x: float) -> float: ...
+ def __mod__(self, x: float) -> float: ...
+ def __pow__(self, x: float) -> float: ...
+ def __radd__(self, x: float) -> float: ...
+ def __rsub__(self, x: float) -> float: ...
+ def __rmul__(self, x: float) -> float: ...
+ def __rfloordiv__(self, x: float) -> float: ...
+ def __rdiv__(self, x: float) -> float: ...
+ def __rtruediv__(self, x: float) -> float: ...
+ def __rmod__(self, x: float) -> float: ...
+ def __rpow__(self, x: float) -> float: ...
+
+ def __eq__(self, x: object) -> bool: ...
+ def __ne__(self, x: object) -> bool: ...
+ def __lt__(self, x: float) -> bool: ...
+ def __le__(self, x: float) -> bool: ...
+ def __gt__(self, x: float) -> bool: ...
+ def __ge__(self, x: float) -> bool: ...
+ def __neg__(self) -> float: ...
+ def __pos__(self) -> float: ...
+
+ def __str__(self) -> str: ...
+ def __int__(self) -> int: ...
+ def __float__(self) -> float: ...
+ def __abs__(self) -> float: ...
+ def __hash__(self) -> int: ...
+
+class complex(SupportsAbs[float]):
+ @overload
+ def __init__(self, re: float = 0.0, im: float = 0.0) -> None: ...
+ @overload
+ def __init__(self, s: str) -> None: ...
+
+ @property
+ def real(self) -> float: ...
+ @property
+ def imag(self) -> float: ...
+
+ def conjugate(self) -> complex: ...
+
+ def __add__(self, x: complex) -> complex: ...
+ def __sub__(self, x: complex) -> complex: ...
+ def __mul__(self, x: complex) -> complex: ...
+ def __pow__(self, x: complex) -> complex: ...
+ def __div__(self, x: complex) -> complex: ...
+ def __truediv__(self, x: complex) -> complex: ...
+ def __radd__(self, x: complex) -> complex: ...
+ def __rsub__(self, x: complex) -> complex: ...
+ def __rmul__(self, x: complex) -> complex: ...
+ def __rpow__(self, x: complex) -> complex: ...
+ def __rdiv__(self, x: complex) -> complex: ...
+ def __rtruediv__(self, x: complex) -> complex: ...
+
+ def __eq__(self, x: object) -> bool: ...
+ def __ne__(self, x: object) -> bool: ...
+ def __neg__(self) -> complex: ...
+ def __pos__(self) -> complex: ...
+
+ def __str__(self) -> str: ...
+ def __abs__(self) -> float: ...
+ def __hash__(self) -> int: ...
+
+class basestring(metaclass=ABCMeta): ...
+
+class unicode(basestring, Sequence[unicode]):
+ @overload
+ def __init__(self) -> None: ...
+ @overload
+ def __init__(self, o: object) -> None: ...
+ @overload
+ def __init__(self, o: str, encoding: unicode = ..., errors: unicode = ...) -> None: ...
+ def capitalize(self) -> unicode: ...
+ def center(self, width: int, fillchar: unicode = u' ') -> unicode: ...
+ def count(self, x: unicode) -> int: ...
+ def decode(self, encoding: unicode = ..., errors: unicode = ...) -> unicode: ...
+ def encode(self, encoding: unicode = ..., errors: unicode = ...) -> str: ...
+ def endswith(self, suffix: Union[unicode, Tuple[unicode, ...]], start: int = 0,
+ end: int = ...) -> bool: ...
+ def expandtabs(self, tabsize: int = 8) -> unicode: ...
+ def find(self, sub: unicode, start: int = 0, end: int = 0) -> int: ...
+ def format(self, *args: Any, **kwargs: Any) -> unicode: ...
+ def format_map(self, map: Mapping[unicode, Any]) -> unicode: ...
+ def index(self, sub: unicode, start: int = 0, end: int = 0) -> int: ...
+ def isalnum(self) -> bool: ...
+ def isalpha(self) -> bool: ...
+ def isdecimal(self) -> bool: ...
+ def isdigit(self) -> bool: ...
+ def isidentifier(self) -> bool: ...
+ def islower(self) -> bool: ...
+ def isnumeric(self) -> bool: ...
+ def isprintable(self) -> bool: ...
+ def isspace(self) -> bool: ...
+ def istitle(self) -> bool: ...
+ def isupper(self) -> bool: ...
+ def join(self, iterable: Iterable[unicode]) -> unicode: ...
+ def ljust(self, width: int, fillchar: unicode = u' ') -> unicode: ...
+ def lower(self) -> unicode: ...
+ def lstrip(self, chars: unicode = ...) -> unicode: ...
+ def partition(self, sep: unicode) -> Tuple[unicode, unicode, unicode]: ...
+ def replace(self, old: unicode, new: unicode, count: int = ...) -> unicode: ...
+ def rfind(self, sub: unicode, start: int = 0, end: int = 0) -> int: ...
+ def rindex(self, sub: unicode, start: int = 0, end: int = 0) -> int: ...
+ def rjust(self, width: int, fillchar: unicode = u' ') -> unicode: ...
+ def rpartition(self, sep: unicode) -> Tuple[unicode, unicode, unicode]: ...
+ def rsplit(self, sep: Optional[unicode] = ..., maxsplit: int = ...) -> List[unicode]: ...
+ def rstrip(self, chars: unicode = ...) -> unicode: ...
+ def split(self, sep: Optional[unicode] = ..., maxsplit: int = ...) -> List[unicode]: ...
+ def splitlines(self, keepends: bool = ...) -> List[unicode]: ...
+ def startswith(self, prefix: Union[unicode, Tuple[unicode, ...]], start: int = 0,
+ end: int = ...) -> bool: ...
+ def strip(self, chars: unicode = ...) -> unicode: ...
+ def swapcase(self) -> unicode: ...
+ def title(self) -> unicode: ...
+ def translate(self, table: Union[Dict[int, Any], unicode]) -> unicode: ...
+ def upper(self) -> unicode: ...
+ def zfill(self, width: int) -> unicode: ...
+
+ @overload
+ def __getitem__(self, i: int) -> unicode: ...
+ @overload
+ def __getitem__(self, s: slice) -> unicode: ...
+ def __getslice__(self, start: int, stop: int) -> unicode: ...
+ def __add__(self, s: unicode) -> unicode: ...
+ def __mul__(self, n: int) -> unicode: ...
+ def __mod__(self, x: Any) -> unicode: ...
+ def __eq__(self, x: object) -> bool: ...
+ def __ne__(self, x: object) -> bool: ...
+ def __lt__(self, x: unicode) -> bool: ...
+ def __le__(self, x: unicode) -> bool: ...
+ def __gt__(self, x: unicode) -> bool: ...
+ def __ge__(self, x: unicode) -> bool: ...
+
+ def __len__(self) -> int: ...
+ def __contains__(self, s: object) -> bool: ...
+ def __iter__(self) -> Iterator[unicode]: ...
+ def __str__(self) -> str: ...
+ def __repr__(self) -> str: ...
+ def __int__(self) -> int: ...
+ def __float__(self) -> float: ...
+ def __hash__(self) -> int: ...
+
+class str(basestring, Sequence[str]):
+ def __init__(self, object: object) -> None: ...
+ def capitalize(self) -> str: ...
+ def center(self, width: int, fillchar: str = ...) -> str: ...
+ def count(self, x: unicode) -> int: ...
+ def decode(self, encoding: unicode = ..., errors: unicode = ...) -> unicode: ...
+ def encode(self, encoding: unicode = ..., errors: unicode = ...) -> str: ...
+ def endswith(self, suffix: Union[unicode, Tuple[unicode, ...]]) -> bool: ...
+ def expandtabs(self, tabsize: int = 8) -> str: ...
+ def find(self, sub: unicode, start: int = 0, end: int = 0) -> int: ...
+ def format(self, *args: Any, **kwargs: Any) -> str: ...
+ def index(self, sub: unicode, start: int = 0, end: int = 0) -> int: ...
+ def isalnum(self) -> bool: ...
+ def isalpha(self) -> bool: ...
+ def isdigit(self) -> bool: ...
+ def islower(self) -> bool: ...
+ def isspace(self) -> bool: ...
+ def istitle(self) -> bool: ...
+ def isupper(self) -> bool: ...
+ def join(self, iterable: Iterable[AnyStr]) -> AnyStr: ...
+ def ljust(self, width: int, fillchar: str = ...) -> str: ...
+ def lower(self) -> str: ...
+ @overload
+ def lstrip(self, chars: str = ...) -> str: ...
+ @overload
+ def lstrip(self, chars: unicode) -> unicode: ...
+ @overload
+ def partition(self, sep: bytearray) -> Tuple[str, bytearray, str]: ...
+ @overload
+ def partition(self, sep: str) -> Tuple[str, str, str]: ...
+ @overload
+ def partition(self, sep: unicode) -> Tuple[unicode, unicode, unicode]: ...
+ def replace(self, old: AnyStr, new: AnyStr, count: int = ...) -> AnyStr: ...
+ def rfind(self, sub: unicode, start: int = 0, end: int = 0) -> int: ...
+ def rindex(self, sub: unicode, start: int = 0, end: int = 0) -> int: ...
+ def rjust(self, width: int, fillchar: str = ...) -> str: ...
+ @overload
+ def rpartition(self, sep: bytearray) -> Tuple[str, bytearray, str]: ...
+ @overload
+ def rpartition(self, sep: str) -> Tuple[str, str, str]: ...
+ @overload
+ def rpartition(self, sep: unicode) -> Tuple[unicode, unicode, unicode]: ...
+ @overload
+ def rsplit(self, sep: Optional[str] = ..., maxsplit: int = ...) -> List[str]: ...
+ @overload
+ def rsplit(self, sep: unicode, maxsplit: int = ...) -> List[unicode]: ...
+ @overload
+ def rstrip(self, chars: str = ...) -> str: ...
+ @overload
+ def rstrip(self, chars: unicode) -> unicode: ...
+ @overload
+ def split(self, sep: Optional[str] = ..., maxsplit: int = ...) -> List[str]: ...
+ @overload
+ def split(self, sep: unicode, maxsplit: int = ...) -> List[unicode]: ...
+ def splitlines(self, keepends: bool = ...) -> List[str]: ...
+ def startswith(self, prefix: Union[unicode, Tuple[unicode, ...]]) -> bool: ...
+ @overload
+ def strip(self, chars: str = ...) -> str: ...
+ @overload
+ def strip(self, chars: unicode) -> unicode: ...
+ def swapcase(self) -> str: ...
+ def title(self) -> str: ...
+ def translate(self, table: Optional[AnyStr], deletechars: AnyStr = ...) -> AnyStr: ...
+ def upper(self) -> str: ...
+ def zfill(self, width: int) -> str: ...
+
+ def __len__(self) -> int: ...
+ def __iter__(self) -> Iterator[str]: ...
+ def __str__(self) -> str: ...
+ def __repr__(self) -> str: ...
+ def __int__(self) -> int: ...
+ def __float__(self) -> float: ...
+ def __hash__(self) -> int: ...
+ @overload
+ def __getitem__(self, i: int) -> str: ...
+ @overload
+ def __getitem__(self, s: slice) -> str: ...
+ def __getslice__(self, start: int, stop: int) -> str: ...
+ def __add__(self, s: AnyStr) -> AnyStr: ...
+ def __mul__(self, n: int) -> str: ...
+ def __rmul__(self, n: int) -> str: ...
+ def __contains__(self, o: object) -> bool: ...
+ def __eq__(self, x: object) -> bool: ...
+ def __ne__(self, x: object) -> bool: ...
+ def __lt__(self, x: unicode) -> bool: ...
+ def __le__(self, x: unicode) -> bool: ...
+ def __gt__(self, x: unicode) -> bool: ...
+ def __ge__(self, x: unicode) -> bool: ...
+ def __mod__(self, x: Any) -> str: ...
+
+class bytearray(MutableSequence[int]):
+ @overload
+ def __init__(self) -> None: ...
+ @overload
+ def __init__(self, x: Union[Iterable[int], str]) -> None: ...
+ @overload
+ def __init__(self, x: unicode, encoding: unicode,
+ errors: unicode = ...) -> None: ...
+ @overload
+ def __init__(self, length: int) -> None: ...
+ def capitalize(self) -> bytearray: ...
+ def center(self, width: int, fillchar: str = ...) -> bytearray: ...
+ def count(self, x: str) -> int: ...
+ def decode(self, encoding: unicode = ..., errors: unicode = ...) -> str: ...
+ def endswith(self, suffix: Union[str, Tuple[str, ...]]) -> bool: ...
+ def expandtabs(self, tabsize: int = 8) -> bytearray: ...
+ def find(self, sub: str, start: int = 0, end: int = ...) -> int: ...
+ def index(self, sub: str, start: int = 0, end: int = ...) -> int: ...
+ def insert(self, index: int, object: int) -> None: ...
+ def isalnum(self) -> bool: ...
+ def isalpha(self) -> bool: ...
+ def isdigit(self) -> bool: ...
+ def islower(self) -> bool: ...
+ def isspace(self) -> bool: ...
+ def istitle(self) -> bool: ...
+ def isupper(self) -> bool: ...
+ def join(self, iterable: Iterable[str]) -> bytearray: ...
+ def ljust(self, width: int, fillchar: str = ...) -> bytearray: ...
+ def lower(self) -> bytearray: ...
+ def lstrip(self, chars: str = ...) -> bytearray: ...
+ def partition(self, sep: str) -> Tuple[bytearray, bytearray, bytearray]: ...
+ def replace(self, old: str, new: str, count: int = ...) -> bytearray: ...
+ def rfind(self, sub: str, start: int = 0, end: int = ...) -> int: ...
+ def rindex(self, sub: str, start: int = 0, end: int = ...) -> int: ...
+ def rjust(self, width: int, fillchar: str = ...) -> bytearray: ...
+ def rpartition(self, sep: str) -> Tuple[bytearray, bytearray, bytearray]: ...
+ def rsplit(self, sep: Optional[str] = ..., maxsplit: int = ...) -> List[bytearray]: ...
+ def rstrip(self, chars: str = ...) -> bytearray: ...
+ def split(self, sep: Optional[str] = ..., maxsplit: int = ...) -> List[bytearray]: ...
+ def splitlines(self, keepends: bool = ...) -> List[bytearray]: ...
+ def startswith(self, prefix: Union[str, Tuple[str, ...]]) -> bool: ...
+ def strip(self, chars: str = ...) -> bytearray: ...
+ def swapcase(self) -> bytearray: ...
+ def title(self) -> bytearray: ...
+ def translate(self, table: str) -> bytearray: ...
+ def upper(self) -> bytearray: ...
+ def zfill(self, width: int) -> bytearray: ...
+ @staticmethod
+ def fromhex(x: str) -> bytearray: ...
+
+ def __len__(self) -> int: ...
+ def __iter__(self) -> Iterator[int]: ...
+ def __str__(self) -> str: ...
+ def __repr__(self) -> str: ...
+ def __int__(self) -> int: ...
+ def __float__(self) -> float: ...
+ def __hash__(self) -> int: ...
+ @overload
+ def __getitem__(self, i: int) -> int: ...
+ @overload
+ def __getitem__(self, s: slice) -> bytearray: ...
+ def __getslice__(self, start: int, stop: int) -> bytearray: ...
+ @overload
+ def __setitem__(self, i: int, x: int) -> None: ...
+ @overload
+ def __setitem__(self, s: slice, x: Union[Iterable[int], str]) -> None: ...
+ def __setslice__(self, start: int, stop: int, x: Union[Sequence[int], str]) -> None: ...
+ def __delitem__(self, i: Union[int, slice]) -> None: ...
+ def __delslice__(self, start: int, stop: int) -> None: ...
+ def __add__(self, s: str) -> bytearray: ...
+ def __mul__(self, n: int) -> bytearray: ...
+ def __contains__(self, o: object) -> bool: ...
+ def __eq__(self, x: object) -> bool: ...
+ def __ne__(self, x: object) -> bool: ...
+ def __lt__(self, x: str) -> bool: ...
+ def __le__(self, x: str) -> bool: ...
+ def __gt__(self, x: str) -> bool: ...
+ def __ge__(self, x: str) -> bool: ...
+
+class bool(int, SupportsInt, SupportsFloat):
+ def __init__(self, o: object = ...) -> None: ...
+
+class slice:
+ start = 0
+ step = 0
+ stop = 0
+ def __init__(self, start: int, stop: int = 0, step: int = 0) -> None: ...
+
+class tuple(Sequence[_T_co], Generic[_T_co]):
+ def __init__(self, iterable: Iterable[_T_co] = ...) -> None: ...
+ def __len__(self) -> int: ...
+ def __contains__(self, x: object) -> bool: ...
+ @overload
+ def __getitem__(self, x: int) -> _T_co: ...
+ @overload
+ def __getitem__(self, x: slice) -> Tuple[_T_co, ...]: ...
+ def __iter__(self) -> Iterator[_T_co]: ...
+ def __lt__(self, x: Tuple[_T_co, ...]) -> bool: ...
+ def __le__(self, x: Tuple[_T_co, ...]) -> bool: ...
+ def __gt__(self, x: Tuple[_T_co, ...]) -> bool: ...
+ def __ge__(self, x: Tuple[_T_co, ...]) -> bool: ...
+ def __add__(self, x: Tuple[_T_co, ...]) -> Tuple[_T_co, ...]: ...
+ def __mul__(self, n: int) -> Tuple[_T_co, ...]: ...
+ def __rmul__(self, n: int) -> Tuple[_T_co, ...]: ...
+ def count(self, x: Any) -> int: ...
+ def index(self, x: Any) -> int: ...
+
+class function:
+ # TODO name of the class (corresponds to Python 'function' class)
+ __name__ = ... # type: str
+ __module__ = ... # type: str
+
+class list(MutableSequence[_T], Generic[_T]):
+ @overload
+ def __init__(self) -> None: ...
+ @overload
+ def __init__(self, iterable: Iterable[_T]) -> None: ...
+ def append(self, object: _T) -> None: ...
+ def extend(self, iterable: Iterable[_T]) -> None: ...
+ def pop(self, index: int = -1) -> _T: ...
+ def index(self, object: _T, start: int = 0, stop: int = ...) -> int: ...
+ def count(self, object: _T) -> int: ...
+ def insert(self, index: int, object: _T) -> None: ...
+ def remove(self, object: _T) -> None: ...
+ def reverse(self) -> None: ...
+ def sort(self, cmp: Callable[[_T, _T], Any] = ..., key: Callable[[_T], Any] = ..., reverse: bool = ...) -> None: ...
+
+ def __len__(self) -> int: ...
+ def __iter__(self) -> Iterator[_T]: ...
+ def __str__(self) -> str: ...
+ def __hash__(self) -> int: ...
+ @overload
+ def __getitem__(self, i: int) -> _T: ...
+ @overload
+ def __getitem__(self, s: slice) -> List[_T]: ...
+ def __getslice__(self, start: int, stop: int) -> List[_T]: ...
+ @overload
+ def __setitem__(self, i: int, o: _T) -> None: ...
+ @overload
+ def __setitem__(self, s: slice, o: Iterable[_T]) -> None: ...
+ def __setslice__(self, start: int, stop: int, o: Sequence[_T]) -> None: ...
+ def __delitem__(self, i: Union[int, slice]) -> None: ...
+ def __delslice__(self, start: int, stop: int) -> None: ...
+ def __add__(self, x: List[_T]) -> List[_T]: ...
+ def __iadd__(self, x: Iterable[_T]) -> List[_T]: ...
+ def __mul__(self, n: int) -> List[_T]: ...
+ def __rmul__(self, n: int) -> List[_T]: ...
+ def __contains__(self, o: object) -> bool: ...
+ def __reversed__(self) -> Iterator[_T]: ...
+ def __gt__(self, x: List[_T]) -> bool: ...
+ def __ge__(self, x: List[_T]) -> bool: ...
+ def __lt__(self, x: List[_T]) -> bool: ...
+ def __le__(self, x: List[_T]) -> bool: ...
+
+class dict(MutableMapping[_KT, _VT], Generic[_KT, _VT]):
+ # NOTE: Keyword arguments are special. If they are used, _KT must include
+ # str, but we have no way of enforcing it here.
+ @overload
+ def __init__(self, **kwargs: _VT) -> None: ...
+ @overload
+ def __init__(self, map: Mapping[_KT, _VT], **kwargs: _VT) -> None: ...
+ @overload
+ def __init__(self, iterable: Iterable[Tuple[_KT, _VT]], **kwargs: _VT) -> None: ...
+
+ def has_key(self, k: _KT) -> bool: ...
+ def clear(self) -> None: ...
+ def copy(self) -> Dict[_KT, _VT]: ...
+ def get(self, k: _KT, default: _VT = None) -> _VT: ...
+ def pop(self, k: _KT, default: _VT = ...) -> _VT: ...
+ def popitem(self) -> Tuple[_KT, _VT]: ...
+ def setdefault(self, k: _KT, default: _VT = ...) -> _VT: ...
+ @overload
+ def update(self, m: Mapping[_KT, _VT], **kwargs: _VT) -> None: ...
+ @overload
+ def update(self, m: Iterable[Tuple[_KT, _VT]], **kwargs: _VT) -> None: ...
+ def keys(self) -> List[_KT]: ...
+ def values(self) -> List[_VT]: ...
+ def items(self) -> List[Tuple[_KT, _VT]]: ...
+ def iterkeys(self) -> Iterator[_KT]: ...
+ def itervalues(self) -> Iterator[_VT]: ...
+ def iteritems(self) -> Iterator[Tuple[_KT, _VT]]: ...
+ def viewkeys(self) -> KeysView[_KT]: ...
+ def viewvalues(self) -> ValuesView[_VT]: ...
+ def viewitems(self) -> ItemsView[_KT, _VT]: ...
+ @staticmethod
+ @overload
+ def fromkeys(seq: Sequence[_T]) -> Dict[_T, Any]: ... # TODO: Actually a class method (mypy/issues#328)
+ @staticmethod
+ @overload
+ def fromkeys(seq: Sequence[_T], value: _S) -> Dict[_T, _S]: ...
+ def __len__(self) -> int: ...
+ def __getitem__(self, k: _KT) -> _VT: ...
+ def __setitem__(self, k: _KT, v: _VT) -> None: ...
+ def __delitem__(self, v: _KT) -> None: ...
+ def __contains__(self, o: object) -> bool: ...
+ def __iter__(self) -> Iterator[_KT]: ...
+ def __str__(self) -> str: ...
+
+class set(MutableSet[_T], Generic[_T]):
+ def __init__(self, iterable: Iterable[_T] = ...) -> None: ...
+ def add(self, element: _T) -> None: ...
+ def clear(self) -> None: ...
+ def copy(self) -> set[_T]: ...
+ def difference(self, *s: Iterable[Any]) -> set[_T]: ...
+ def difference_update(self, *s: Iterable[Any]) -> None: ...
+ def discard(self, element: _T) -> None: ...
+ def intersection(self, *s: Iterable[Any]) -> set[_T]: ...
+ def intersection_update(self, *s: Iterable[Any]) -> None: ...
+ def isdisjoint(self, s: Iterable[Any]) -> bool: ...
+ def issubset(self, s: Iterable[Any]) -> bool: ...
+ def issuperset(self, s: Iterable[Any]) -> bool: ...
+ def pop(self) -> _T: ...
+ def remove(self, element: _T) -> None: ...
+ def symmetric_difference(self, s: Iterable[_T]) -> set[_T]: ...
+ def symmetric_difference_update(self, s: Iterable[_T]) -> None: ...
+ def union(self, *s: Iterable[_T]) -> set[_T]: ...
+ def update(self, *s: Iterable[_T]) -> None: ...
+ def __len__(self) -> int: ...
+ def __contains__(self, o: object) -> bool: ...
+ def __iter__(self) -> Iterator[_T]: ...
+ def __str__(self) -> str: ...
+ def __and__(self, s: AbstractSet[Any]) -> set[_T]: ...
+ def __iand__(self, s: AbstractSet[Any]) -> set[_T]: ...
+ def __or__(self, s: AbstractSet[_S]) -> set[Union[_T, _S]]: ...
+ def __ior__(self, s: AbstractSet[_S]) -> set[Union[_T, _S]]: ...
+ def __sub__(self, s: AbstractSet[Any]) -> set[_T]: ...
+ def __isub__(self, s: AbstractSet[Any]) -> set[_T]: ...
+ def __xor__(self, s: AbstractSet[_S]) -> set[Union[_T, _S]]: ...
+ def __ixor__(self, s: AbstractSet[_S]) -> set[Union[_T, _S]]: ...
+ def __le__(self, s: AbstractSet[Any]) -> bool: ...
+ def __lt__(self, s: AbstractSet[Any]) -> bool: ...
+ def __ge__(self, s: AbstractSet[Any]) -> bool: ...
+ def __gt__(self, s: AbstractSet[Any]) -> bool: ...
+ # TODO more set operations
+
+class frozenset(FrozenSet[_T], Generic[_T]):
+ @overload
+ def __init__(self) -> None: ...
+ @overload
+ def __init__(self, iterable: Iterable[_T]) -> None: ...
+ def copy(self) -> frozenset[_T]: ...
+ def difference(self, *s: Iterable[Any]) -> frozenset[_T]: ...
+ def intersection(self, *s: Iterable[Any]) -> frozenset[_T]: ...
+ def isdisjoint(self, s: Iterable[_T]) -> bool: ...
+ def issubset(self, s: Iterable[Any]) -> bool: ...
+ def issuperset(self, s: Iterable[Any]) -> bool: ...
+ def symmetric_difference(self, s: Iterable[_T]) -> frozenset[_T]: ...
+ def union(self, *s: Iterable[_T]) -> frozenset[_T]: ...
+ def __len__(self) -> int: ...
+ def __contains__(self, o: object) -> bool: ...
+ def __iter__(self) -> Iterator[_T]: ...
+ def __str__(self) -> str: ...
+ def __and__(self, s: AbstractSet[_T]) -> frozenset[_T]: ...
+ def __or__(self, s: AbstractSet[_S]) -> frozenset[Union[_T, _S]]: ...
+ def __sub__(self, s: AbstractSet[_T]) -> frozenset[_T]: ...
+ def __xor__(self, s: AbstractSet[_S]) -> frozenset[Union[_T, _S]]: ...
+ def __le__(self, s: AbstractSet[Any]) -> bool: ...
+ def __lt__(self, s: AbstractSet[Any]) -> bool: ...
+ def __ge__(self, s: AbstractSet[Any]) -> bool: ...
+ def __gt__(self, s: AbstractSet[Any]) -> bool: ...
+
+class enumerate(Iterator[Tuple[int, _T]], Generic[_T]):
+ def __init__(self, iterable: Iterable[_T], start: int = 0) -> None: ...
+ def __iter__(self) -> Iterator[Tuple[int, _T]]: ...
+ def next(self) -> Tuple[int, _T]: ...
+ # TODO __getattribute__
+
+class xrange(Sized, Iterable[int], Reversible[int]):
+ @overload
+ def __init__(self, stop: int) -> None: ...
+ @overload
+ def __init__(self, start: int, stop: int, step: int = 1) -> None: ...
+ def __len__(self) -> int: ...
+ def __iter__(self) -> Iterator[int]: ...
+ def __getitem__(self, i: int) -> int: ...
+ def __reversed__(self) -> Iterator[int]: ...
+
+class module:
+ __name__ = ... # type: str
+ __file__ = ... # type: str
+ __dict__ = ... # type: Dict[unicode, Any]
+
+class property:
+ def __init__(self, fget: Callable[[Any], Any] = None,
+ fset: Callable[[Any, Any], None] = None,
+ fdel: Callable[[Any], None] = None, doc: str = None) -> None: ...
+ def getter(self, fget: Callable[[Any], Any]) -> property: ...
+ def setter(self, fset: Callable[[Any, Any], None]) -> property: ...
+ def deleter(self, fdel: Callable[[Any], None]) -> property: ...
+ def __get__(self, obj: Any, type: type=None) -> Any: ...
+ def __set__(self, obj: Any, value: Any) -> None: ...
+ def __delete__(self, obj: Any) -> None: ...
+
+long = int
+bytes = str
+
+NotImplemented = ... # type: Any
+
+def abs(n: SupportsAbs[_T]) -> _T: ...
+def all(i: Iterable) -> bool: ...
+def any(i: Iterable) -> bool: ...
+def bin(number: int) -> str: ...
+def callable(o: object) -> bool: ...
+def chr(code: int) -> str: ...
+def compile(source: Any, filename: unicode, mode: str, flags: int = 0,
+ dont_inherit: int = 0) -> Any: ...
+def delattr(o: Any, name: unicode) -> None: ...
+def dir(o: object = ...) -> List[str]: ...
+ at overload
+def divmod(a: int, b: int) -> Tuple[int, int]: ...
+ at overload
+def divmod(a: float, b: float) -> Tuple[float, float]: ...
+def exit(code: int = ...) -> NoReturn: ...
+ at overload
+def filter(function: Callable[[_T], Any],
+ iterable: Iterable[_T]) -> List[_T]: ...
+ at overload
+def filter(function: None,
+ iterable: Iterable[Optional[_T]]) -> List[_T]: ...
+def format(o: object, format_spec: str = '') -> str: ... # TODO unicode
+def getattr(o: Any, name: unicode, default: Any = None) -> Any: ...
+def hasattr(o: Any, name: unicode) -> bool: ...
+def hash(o: object) -> int: ...
+def hex(i: int) -> str: ... # TODO __index__
+def id(o: object) -> int: ...
+def input(prompt: unicode = ...) -> Any: ...
+def intern(string: str) -> str: ...
+ at overload
+def iter(iterable: Iterable[_T]) -> Iterator[_T]: ...
+ at overload
+def iter(function: Callable[[], _T], sentinel: _T) -> Iterator[_T]: ...
+def isinstance(o: object, t: Union[type, Tuple[type, ...]]) -> bool: ...
+def issubclass(cls: type, classinfo: Union[type, Tuple[type, ...]]) -> bool: ...
+def len(o: Sized) -> int: ...
+ at overload
+def map(func: Callable[[_T1], _S], iter1: Iterable[_T1]) -> List[_S]: ...
+ at overload
+def map(func: Callable[[_T1, _T2], _S],
+ iter1: Iterable[_T1],
+ iter2: Iterable[_T2]) -> List[_S]: ... # TODO more than two iterables
+ at overload
+def max(arg1: _T, arg2: _T, *args: _T, key: Callable[[_T], Any] = ...) -> _T: ...
+ at overload
+def max(iterable: Iterable[_T], key: Callable[[_T], Any] = ...) -> _T: ...
+ at overload
+def min(arg1: _T, arg2: _T, *args: _T, key: Callable[[_T], Any] = ...) -> _T: ...
+ at overload
+def min(iterable: Iterable[_T], key: Callable[[_T], Any] = ...) -> _T: ...
+ at overload
+def next(i: Iterator[_T]) -> _T: ...
+ at overload
+def next(i: Iterator[_T], default: _T) -> _T: ...
+def oct(i: int) -> str: ... # TODO __index__
+ at overload
+def open(file: str, mode: str = 'r', buffering: int = ...) -> BinaryIO: ...
+ at overload
+def open(file: unicode, mode: str = 'r', buffering: int = ...) -> BinaryIO: ...
+ at overload
+def open(file: int, mode: str = 'r', buffering: int = ...) -> BinaryIO: ...
+def ord(c: unicode) -> int: ...
+# This is only available after from __future__ import print_function.
+def print(*values: Any, sep: unicode = u' ', end: unicode = u'\n',
+ file: IO[Any] = ...) -> None: ...
+ at overload
+def pow(x: int, y: int) -> Any: ... # The return type can be int or float, depending on y.
+ at overload
+def pow(x: int, y: int, z: int) -> Any: ...
+ at overload
+def pow(x: float, y: float) -> float: ...
+ at overload
+def pow(x: float, y: float, z: float) -> float: ...
+def quit(code: int = ...) -> None: ...
+def range(x: int, y: int = 0, step: int = 1) -> List[int]: ...
+def raw_input(prompt: unicode = ...) -> str: ...
+
+ at overload
+def reduce(function: Callable[[_T, _S], _T], iterable: Iterable[_S], initializer: _T) -> _T: ...
+ at overload
+def reduce(function: Callable[[_T, _T], _T], iterable: Iterable[_T]) -> _T: ...
+
+def reload(module: Any) -> Any: ...
+ at overload
+def reversed(object: Reversible[_T]) -> Iterator[_T]: ...
+ at overload
+def reversed(object: Sequence[_T]) -> Iterator[_T]: ...
+def repr(o: object) -> str: ...
+ at overload
+def round(number: float) -> float: ...
+ at overload
+def round(number: float, ndigits: int) -> float: ... # Always return a float if given ndigits.
+ at overload
+def round(number: SupportsRound[_T]) -> _T: ...
+ at overload
+def round(number: SupportsRound[_T], ndigits: int) -> _T: ...
+def setattr(object: Any, name: unicode, value: Any) -> None: ...
+def sorted(iterable: Iterable[_T], *,
+ cmp: Callable[[_T, _T], int] = ...,
+ key: Callable[[_T], Any] = ...,
+ reverse: bool = ...) -> List[_T]: ...
+def sum(iterable: Iterable[_T], start: _T = ...) -> _T: ...
+def unichr(i: int) -> unicode: ...
+def vars(object: Any = ...) -> Dict[str, Any]: ...
+ at overload
+def zip(iter1: Iterable[_T1]) -> List[Tuple[_T1]]: ...
+ at overload
+def zip(iter1: Iterable[_T1],
+ iter2: Iterable[_T2]) -> List[Tuple[_T1, _T2]]: ...
+ at overload
+def zip(iter1: Iterable[_T1], iter2: Iterable[_T2],
+ iter3: Iterable[_T3]) -> List[Tuple[_T1, _T2, _T3]]: ...
+ at overload
+def zip(iter1: Iterable[_T1], iter2: Iterable[_T2], iter3: Iterable[_T3],
+ iter4: Iterable[_T4]) -> List[Tuple[_T1, _T2,
+ _T3, _T4]]: ... # TODO more than four iterables
+def __import__(name: unicode,
+ globals: Dict[str, Any] = ...,
+ locals: Dict[str, Any] = ...,
+ fromlist: List[str] = ..., level: int = ...) -> Any: ...
+
+def globals() -> Dict[str, Any]: ...
+def locals() -> Dict[str, Any]: ...
+
+# Actually the type of Ellipsis is <type 'ellipsis'>, but since it's
+# not exposed anywhere under that name, we make it private here.
+class ellipsis: ...
+Ellipsis = ... # type: ellipsis
+
+# TODO: buffer support is incomplete; e.g. some_string.startswith(some_buffer) doesn't type check.
+AnyBuffer = TypeVar('AnyBuffer', str, unicode, bytearray, buffer)
+
+class buffer(Sized):
+ def __init__(self, object: AnyBuffer, offset: int = ..., size: int = ...) -> None: ...
+ def __add__(self, other: AnyBuffer) -> str: ...
+ def __cmp__(self, other: AnyBuffer) -> bool: ...
+ def __getitem__(self, key: Union[int, slice]) -> str: ...
+ def __getslice__(self, i: int, j: int) -> str: ...
+ def __len__(self) -> int: ...
+ def __mul__(self, x: int) -> str: ...
+
+class memoryview(Sized, Container[bytes]):
+ format = ... # type: str
+ itemsize = ... # type: int
+ shape = ... # type: Optional[Tuple[int, ...]]
+ strides = ... # type: Optional[Tuple[int, ...]]
+ suboffsets = ... # type: Optional[Tuple[int, ...]]
+ readonly = ... # type: bool
+ ndim = ... # type: int
+
+ def __init__(self, obj: Union[str, bytearray, buffer, memoryview]) -> None: ...
+
+ @overload
+ def __getitem__(self, i: int) -> bytes: ...
+ @overload
+ def __getitem__(self, s: slice) -> memoryview: ...
+
+ def __contains__(self, x: object) -> bool: ...
+ def __iter__(self) -> Iterator[bytes]: ...
+ def __len__(self) -> int: ...
+
+ @overload
+ def __setitem__(self, i: int, o: bytes) -> None: ...
+ @overload
+ def __setitem__(self, s: slice, o: Sequence[bytes]) -> None: ...
+ @overload
+ def __setitem__(self, s: slice, o: memoryview) -> None: ...
+
+ def tobytes(self) -> bytes: ...
+ def tolist(self) -> List[int]: ...
+
+class BaseException:
+ args = ... # type: Tuple[Any, ...]
+ message = ... # type: str
+ def __init__(self, *args: Any) -> None: ...
+class GeneratorExit(BaseException): ...
+class KeyboardInterrupt(BaseException): ...
+class SystemExit(BaseException):
+ code = 0
+class Exception(BaseException): ...
+class StopIteration(Exception): ...
+class StandardError(Exception): ...
+class ArithmeticError(StandardError): ...
+class BufferError(StandardError): ...
+class EnvironmentError(StandardError):
+ errno = 0
+ strerror = ... # type: str
+ # TODO can this be unicode?
+ filename = ... # type: str
+class LookupError(StandardError): ...
+class RuntimeError(StandardError): ...
+class ValueError(StandardError): ...
+class AssertionError(StandardError): ...
+class AttributeError(StandardError): ...
+class EOFError(StandardError): ...
+class FloatingPointError(ArithmeticError): ...
+class IOError(EnvironmentError): ...
+class ImportError(StandardError): ...
+class IndexError(LookupError): ...
+class KeyError(LookupError): ...
+class MemoryError(StandardError): ...
+class NameError(StandardError): ...
+class NotImplementedError(RuntimeError): ...
+class OSError(EnvironmentError): ...
+class WindowsError(OSError):
+ winerror = ... # type: int
+class OverflowError(ArithmeticError): ...
+class ReferenceError(StandardError): ...
+class SyntaxError(StandardError):
+ msg = ... # type: str
+ lineno = ... # type: int
+ offset = ... # type: int
+ text = ... # type: str
+class IndentationError(SyntaxError): ...
+class TabError(IndentationError): ...
+class SystemError(StandardError): ...
+class TypeError(StandardError): ...
+class UnboundLocalError(NameError): ...
+class UnicodeError(ValueError): ...
+class UnicodeDecodeError(UnicodeError): ...
+class UnicodeEncodeError(UnicodeError): ...
+class UnicodeTranslateError(UnicodeError): ...
+class ZeroDivisionError(ArithmeticError): ...
+
+class Warning(Exception): ...
+class UserWarning(Warning): ...
+class DeprecationWarning(Warning): ...
+class SyntaxWarning(Warning): ...
+class RuntimeWarning(Warning): ...
+class FutureWarning(Warning): ...
+class PendingDeprecationWarning(Warning): ...
+class ImportWarning(Warning): ...
+class UnicodeWarning(Warning): ...
+class BytesWarning(Warning): ...
+class ResourceWarning(Warning): ...
+
+def eval(s: str, globals: Dict[str, Any] = ..., locals: Dict[str, Any] = ...) -> Any: ...
+def exec(object: str,
+ globals: Dict[str, Any] = None,
+ locals: Dict[str, Any] = None) -> Any: ... # TODO code object as source
+
+def cmp(x: Any, y: Any) -> int: ...
+
+def execfile(filename: str, globals: Dict[str, Any] = None, locals: Dict[str, Any] = None) -> None: ...
+
+class file(BinaryIO):
+ @overload
+ def __init__(self, file: str, mode: str = 'r', buffering: int = ...) -> None: ...
+ @overload
+ def __init__(self, file: unicode, mode: str = 'r', buffering: int = ...) -> None: ...
+ @overload
+ def __init__(self, file: int, mode: str = 'r', buffering: int = ...) -> None: ...
+ def __iter__(self) -> Iterator[str]: ...
+ def read(self, n: int = ...) -> str: ...
+ def __enter__(self) -> BinaryIO: ...
+ def __exit__(self, t: type = None, exc: BaseException = None, tb: Any = None) -> bool: ...
+ def flush(self) -> None: ...
+ def fileno(self) -> int: ...
+ def isatty(self) -> bool: ...
+ def close(self) -> None: ...
+
+ def readable(self) -> bool: ...
+ def writable(self) -> bool: ...
+ def seekable(self) -> bool: ...
+ def seek(self, offset: int, whence: int = ...) -> None: ...
+ def tell(self) -> int: ...
+ def readline(self, limit: int = ...) -> str: ...
+ def readlines(self, hint: int = ...) -> List[str]: ...
+ def write(self, data: str) -> None: ...
+ def writelines(self, data: Iterable[str]) -> None: ...
+ def truncate(self, pos: int = ...) -> int: ...
+
+# Very old builtins
+def apply(func: Callable[..., _T], args: Sequence[Any] = None, kwds: Mapping[str, Any] = None) -> _T: ...
+_N = TypeVar('_N', bool, int, float, complex)
+def coerce(x: _N, y: _N) -> Tuple[_N, _N]: ...
diff --git a/typeshed/stdlib/2/__future__.pyi b/typeshed/stdlib/2/__future__.pyi
new file mode 100644
index 0000000..2414069
--- /dev/null
+++ b/typeshed/stdlib/2/__future__.pyi
@@ -0,0 +1,13 @@
+from sys import _version_info
+
+class _Feature:
+ def getOptionalRelease(self) -> _version_info: ...
+ def getMandatoryRelease(self) -> _version_info: ...
+
+absolute_import = ... # type: _Feature
+division = ... # type: _Feature
+generators = ... # type: _Feature
+nested_scopes = ... # type: _Feature
+print_function = ... # type: _Feature
+unicode_literals = ... # type: _Feature
+with_statement = ... # type: _Feature
diff --git a/typeshed/stdlib/2/_ast.pyi b/typeshed/stdlib/2/_ast.pyi
new file mode 100644
index 0000000..02236a8
--- /dev/null
+++ b/typeshed/stdlib/2/_ast.pyi
@@ -0,0 +1,328 @@
+import typing
+from typing import Optional, Union
+
+__version__ = ... # type: str
+
+PyCF_ONLY_AST = ... # type: int
+
+identifier = str
+
+class AST:
+ _attributes = ... # type: typing.Tuple[str, ...]
+ _fields = ... # type: typing.Tuple[str, ...]
+ def __init__(self, *args, **kwargs) -> None: ...
+
+class mod(AST):
+ ...
+
+class Module(mod):
+ body = ... # type: typing.List[stmt]
+
+class Interactive(mod):
+ body = ... # type: typing.List[stmt]
+
+class Expression(mod):
+ body = ... # type: expr
+
+class Suite(mod):
+ body = ... # type: typing.List[stmt]
+
+
+class stmt(AST):
+ lineno = ... # type: int
+ col_offset = ... # type: int
+
+class FunctionDef(stmt):
+ name = ... # type: identifier
+ args = ... # type: arguments
+ body = ... # type: typing.List[stmt]
+ decorator_list = ... # type: typing.List[expr]
+
+class ClassDef(stmt):
+ name = ... # type: identifier
+ bases = ... # type: typing.List[expr]
+ body = ... # type: typing.List[stmt]
+ decorator_list = ... # type: typing.List[expr]
+
+class Return(stmt):
+ value = ... # type: Optional[expr]
+
+class Delete(stmt):
+ targets = ... # type: typing.List[expr]
+
+class Assign(stmt):
+ targets = ... # type: typing.List[expr]
+ value = ... # type: expr
+
+class AugAssign(stmt):
+ target = ... # type: expr
+ op = ... # type: operator
+ value = ... # type: expr
+
+class Print(stmt):
+ dest = ... # type: Optional[expr]
+ values = ... # type: typing.List[expr]
+ nl = ... # type: bool
+
+class For(stmt):
+ target = ... # type: expr
+ iter = ... # type: expr
+ body = ... # type: typing.List[stmt]
+ orelse = ... # type: typing.List[stmt]
+
+class While(stmt):
+ test = ... # type: expr
+ body = ... # type: typing.List[stmt]
+ orelse = ... # type: typing.List[stmt]
+
+class If(stmt):
+ test = ... # type: expr
+ body = ... # type: typing.List[stmt]
+ orelse = ... # type: typing.List[stmt]
+
+class With(stmt):
+ context_expr = ... # type: expr
+ optional_vars = ... # type: Optional[expr]
+ body = ... # type: typing.List[stmt]
+
+class Raise(stmt):
+ type = ... # type: Optional[expr]
+ inst = ... # type: Optional[expr]
+ tback = ... # type: Optional[expr]
+
+class TryExcept(stmt):
+ body = ... # type: typing.List[stmt]
+ handlers = ... # type: typing.List[ExceptHandler]
+ orelse = ... # type: typing.List[stmt]
+
+class TryFinally(stmt):
+ body = ... # type: typing.List[stmt]
+ finalbody = ... # type: typing.List[stmt]
+
+class Assert(stmt):
+ test = ... # type: expr
+ msg = ... # type: Optional[expr]
+
+class Import(stmt):
+ names = ... # type: typing.List[alias]
+
+class ImportFrom(stmt):
+ module = ... # type: Optional[identifier]
+ names = ... # type: typing.List[alias]
+ level = ... # type: Optional[int]
+
+class Exec(stmt):
+ body = ... # type: expr
+ globals = ... # type: Optional[expr]
+ locals = ... # type: Optional[expr]
+
+class Global(stmt):
+ names = ... # type: typing.List[identifier]
+
+class Expr(stmt):
+ value = ... # type: expr
+
+class Pass(stmt): ...
+class Break(stmt): ...
+class Continue(stmt): ...
+
+
+class slice(AST):
+ ...
+
+_slice = slice # this lets us type the variable named 'slice' below
+
+class Slice(slice):
+ lower = ... # type: Optional[expr]
+ upper = ... # type: Optional[expr]
+ step = ... # type: Optional[expr]
+
+class ExtSlice(slice):
+ dims = ... # type: typing.List[slice]
+
+class Index(slice):
+ value = ... # type: expr
+
+class Ellipsis(slice): ...
+
+
+class expr(AST):
+ lineno = ... # type: int
+ col_offset = ... # type: int
+
+class BoolOp(expr):
+ op = ... # type: boolop
+ values = ... # type: typing.List[expr]
+
+class BinOp(expr):
+ left = ... # type: expr
+ op = ... # type: operator
+ right = ... # type: expr
+
+class UnaryOp(expr):
+ op = ... # type: unaryop
+ operand = ... # type: expr
+
+class Lambda(expr):
+ args = ... # type: arguments
+ body = ... # type: expr
+
+class IfExp(expr):
+ test = ... # type: expr
+ body = ... # type: expr
+ orelse = ... # type: expr
+
+class Dict(expr):
+ keys = ... # type: typing.List[expr]
+ values = ... # type: typing.List[expr]
+
+class Set(expr):
+ elts = ... # type: typing.List[expr]
+
+class ListComp(expr):
+ elt = ... # type: expr
+ generators = ... # type: typing.List[comprehension]
+
+class SetComp(expr):
+ elt = ... # type: expr
+ generators = ... # type: typing.List[comprehension]
+
+class DictComp(expr):
+ key = ... # type: expr
+ value = ... # type: expr
+ generators = ... # type: typing.List[comprehension]
+
+class GeneratorExp(expr):
+ elt = ... # type: expr
+ generators = ... # type: typing.List[comprehension]
+
+class Yield(expr):
+ value = ... # type: Optional[expr]
+
+class Compare(expr):
+ left = ... # type: expr
+ ops = ... # type: typing.List[cmpop]
+ comparators = ... # type: typing.List[expr]
+
+class Call(expr):
+ func = ... # type: expr
+ args = ... # type: typing.List[expr]
+ keywords = ... # type: typing.List[keyword]
+ starargs = ... # type: Optional[expr]
+ kwargs = ... # type: Optional[expr]
+
+class Repr(expr):
+ value = ... # type: expr
+
+class Num(expr):
+ n = ... # type: Union[int, float]
+
+class Str(expr):
+ s = ... # type: str
+
+class Attribute(expr):
+ value = ... # type: expr
+ attr = ... # type: identifier
+ ctx = ... # type: expr_context
+
+class Subscript(expr):
+ value = ... # type: expr
+ slice = ... # type: _slice
+ ctx = ... # type: expr_context
+
+class Name(expr):
+ id = ... # type: identifier
+ ctx = ... # type: expr_context
+
+class List(expr):
+ elts = ... # type: typing.List[expr]
+ ctx = ... # type: expr_context
+
+class Tuple(expr):
+ elts = ... # type: typing.List[expr]
+ ctx = ... # type: expr_context
+
+
+class expr_context(AST):
+ ...
+
+class AugLoad(expr_context): ...
+class AugStore(expr_context): ...
+class Del(expr_context): ...
+class Load(expr_context): ...
+class Param(expr_context): ...
+class Store(expr_context): ...
+
+
+class boolop(AST):
+ ...
+
+class And(boolop): ...
+class Or(boolop): ...
+
+class operator(AST):
+ ...
+
+class Add(operator): ...
+class BitAnd(operator): ...
+class BitOr(operator): ...
+class BitXor(operator): ...
+class Div(operator): ...
+class FloorDiv(operator): ...
+class LShift(operator): ...
+class Mod(operator): ...
+class Mult(operator): ...
+class Pow(operator): ...
+class RShift(operator): ...
+class Sub(operator): ...
+
+class unaryop(AST):
+ ...
+
+class Invert(unaryop): ...
+class Not(unaryop): ...
+class UAdd(unaryop): ...
+class USub(unaryop): ...
+
+class cmpop(AST):
+ ...
+
+class Eq(cmpop): ...
+class Gt(cmpop): ...
+class GtE(cmpop): ...
+class In(cmpop): ...
+class Is(cmpop): ...
+class IsNot(cmpop): ...
+class Lt(cmpop): ...
+class LtE(cmpop): ...
+class NotEq(cmpop): ...
+class NotIn(cmpop): ...
+
+
+class comprehension(AST):
+ target = ... # type: expr
+ iter = ... # type: expr
+ ifs = ... # type: typing.List[expr]
+
+
+class ExceptHandler(AST):
+ type = ... # type: Optional[expr]
+ name = ... # type: Optional[expr]
+ body = ... # type: typing.List[stmt]
+ lineno = ... # type: int
+ col_offset = ... # type: int
+
+
+class arguments(AST):
+ args = ... # type: typing.List[expr]
+ vararg = ... # type: Optional[identifier]
+ kwarg = ... # type: Optional[identifier]
+ defaults = ... # type: typing.List[expr]
+
+class keyword(AST):
+ arg = ... # type: identifier
+ value = ... # type: expr
+
+class alias(AST):
+ name = ... # type: identifier
+ asname = ... # type: Optional[identifier]
diff --git a/typeshed/stdlib/2/_codecs.pyi b/typeshed/stdlib/2/_codecs.pyi
new file mode 100644
index 0000000..2a00a4d
--- /dev/null
+++ b/typeshed/stdlib/2/_codecs.pyi
@@ -0,0 +1,55 @@
+"""Stub file for the '_codecs' module."""
+
+from typing import Any, AnyStr, Callable, Tuple, Optional
+
+import codecs
+
+# For convenience:
+_Handler = Callable[[Exception], Tuple[unicode, int]]
+
+# Not exposed. In Python 2, this is defined in unicode.c:
+class _EncodingMap(object):
+ def size(self) -> int: ...
+
+def register(search_function: Callable[[str], Any]) -> None: ...
+def register_error(errors: str, handler: _Handler) -> None: ...
+def lookup(a: str) -> codecs.CodecInfo: ...
+def lookup_error(a: str) -> _Handler: ...
+def decode(obj: Any, encoding: str = ..., errors: str = ...) -> Any: ...
+def encode(obj: Any, encoding: str = ..., errors: str = ...) -> Any: ...
+def charmap_build(a: unicode) -> _EncodingMap: ...
+
+def ascii_decode(data: AnyStr, errors: str = ...) -> Tuple[unicode, int]: ...
+def ascii_encode(data: AnyStr, errors: str = ...) -> Tuple[str, int]: ...
+def charbuffer_encode(data: AnyStr, errors: str = ...) -> Tuple[str, int]: ...
+def charmap_decode(data: AnyStr, errors: str = ..., mapping: Optional[_EncodingMap] = ...) -> Tuple[unicode, int]: ...
+def charmap_encode(data: AnyStr, errors: str, mapping: Optional[_EncodingMap] = ...) -> Tuple[str, int]: ...
+def escape_decode(data: AnyStr, errors: str = ...) -> Tuple[unicode, int]: ...
+def escape_encode(data: AnyStr, errors: str = ...) -> Tuple[str, int]: ...
+def latin_1_decode(data: AnyStr, errors: str = ...) -> Tuple[unicode, int]: ...
+def latin_1_encode(data: AnyStr, errors: str = ...) -> Tuple[str, int]: ...
+def raw_unicode_escape_decode(data: AnyStr, errors: str = ...) -> Tuple[unicode, int]: ...
+def raw_unicode_escape_encode(data: AnyStr, errors: str = ...) -> Tuple[str, int]: ...
+def readbuffer_encode(data: AnyStr, errors: str = ...) -> Tuple[str, int]: ...
+def unicode_escape_decode(data: AnyStr, errors: str = ...) -> Tuple[unicode, int]: ...
+def unicode_escape_encode(data: AnyStr, errors: str = ...) -> Tuple[str, int]: ...
+def unicode_internal_decode(data: AnyStr, errors: str = ...) -> Tuple[unicode, int]: ...
+def unicode_internal_encode(data: AnyStr, errors: str = ...) -> Tuple[str, int]: ...
+def utf_16_be_decode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[unicode, int]: ...
+def utf_16_be_encode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[str, int]: ...
+def utf_16_decode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[unicode, int]: ...
+def utf_16_encode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[str, int]: ...
+def utf_16_ex_decode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[unicode, int]: ...
+def utf_16_le_decode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[unicode, int]: ...
+def utf_16_le_encode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[str, int]: ...
+def utf_32_be_decode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[unicode, int]: ...
+def utf_32_be_encode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[str, int]: ...
+def utf_32_decode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[unicode, int]: ...
+def utf_32_encode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[str, int]: ...
+def utf_32_ex_decode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[unicode, int]: ...
+def utf_32_le_decode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[unicode, int]: ...
+def utf_32_le_encode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[str, int]: ...
+def utf_7_decode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[unicode, int]: ...
+def utf_7_encode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[str, int]: ...
+def utf_8_decode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[unicode, int]: ...
+def utf_8_encode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[str, int]: ...
diff --git a/typeshed/stdlib/2/_collections.pyi b/typeshed/stdlib/2/_collections.pyi
new file mode 100644
index 0000000..156cda0
--- /dev/null
+++ b/typeshed/stdlib/2/_collections.pyi
@@ -0,0 +1,41 @@
+"""Stub file for the '_collections' module."""
+
+from typing import Any, Generic, Iterator, TypeVar, Optional, Union
+
+class defaultdict(dict):
+ default_factory = ... # type: None
+ def __init__(self, default: Any = ..., init: Any = ...) -> None: ...
+ def __missing__(self, key) -> Any:
+ raise KeyError()
+ def __copy__(self) -> "defaultdict": ...
+ def copy(self) -> "defaultdict": ...
+
+_T = TypeVar('_T')
+_T2 = TypeVar('_T2')
+
+class deque(Generic[_T]):
+ maxlen = ... # type: Optional[int]
+ def __init__(self, iterable: Iterator[_T] = ..., maxlen: int = ...) -> None: ...
+ def append(self, x: _T) -> None: ...
+ def appendleft(self, x: _T) -> None: ...
+ def clear(self) -> None: ...
+ def count(self, x: Any) -> int: ...
+ def extend(self, iterable: Iterator[_T]) -> None: ...
+ def extendleft(self, iterable: Iterator[_T]) -> None: ...
+ def pop(self) -> _T:
+ raise IndexError()
+ def popleft(self) -> _T:
+ raise IndexError()
+ def remove(self, value: _T) -> None:
+ raise IndexError()
+ def reverse(self) -> None: ...
+ def rotate(self, n: int = ...) -> None: ...
+ def __contains__(self, o: Any) -> bool: ...
+ def __copy__(self) -> "deque[_T]": ...
+ def __getitem__(self, i: int) -> _T:
+ raise IndexError()
+ def __iadd__(self, other: "deque[_T2]") -> "deque[Union[_T, _T2]]": ...
+ def __iter__(self) -> Iterator[_T]: ...
+ def __len__(self) -> int: ...
+ def __reversed__(self) -> Iterator[_T]: ...
+ def __setitem__(self, i: int, x: _T) -> None: ...
diff --git a/typeshed/stdlib/2/_functools.pyi b/typeshed/stdlib/2/_functools.pyi
new file mode 100644
index 0000000..555d3e1
--- /dev/null
+++ b/typeshed/stdlib/2/_functools.pyi
@@ -0,0 +1,20 @@
+"""Stub file for the '_functools' module."""
+
+from typing import Any, Callable, Dict, Iterable, Optional, TypeVar, Tuple, overload
+
+_T = TypeVar("_T")
+_S = TypeVar("_S")
+
+ at overload
+def reduce(function: Callable[[_T, _T], _T],
+ sequence: Iterable[_T]) -> _T: ...
+ at overload
+def reduce(function: Callable[[_T, _S], _T],
+ sequence: Iterable[_S], initial: _T) -> _T: ...
+
+class partial(object):
+ func = ... # type: Callable[..., Any]
+ args = ... # type: Tuple[Any, ...]
+ keywords = ... # type: Dict[str, Any]
+ def __init__(self, func: Callable[..., Any], *args: Any, **kwargs: Any) -> None: ...
+ def __call__(self, *args: Any, **kwargs: Any) -> Any: ...
diff --git a/typeshed/stdlib/2/_hotshot.pyi b/typeshed/stdlib/2/_hotshot.pyi
new file mode 100644
index 0000000..8a9c8d7
--- /dev/null
+++ b/typeshed/stdlib/2/_hotshot.pyi
@@ -0,0 +1,34 @@
+"""Stub file for the '_hotshot' module."""
+# This is an autogenerated file. It serves as a starting point
+# for a more precise manual annotation of this module.
+# Feel free to edit the source below, but remove this header when you do.
+
+from typing import Any, List, Tuple, Dict, Generic
+
+def coverage(a: str) -> Any: ...
+
+def logreader(a: str) -> LogReaderType:
+ raise IOError()
+ raise RuntimeError()
+
+def profiler(a: str, *args, **kwargs) -> Any:
+ raise IOError()
+
+def resolution() -> tuple: ...
+
+
+class LogReaderType(object):
+ def close(self) -> None: ...
+ def fileno(self) -> int:
+ raise ValueError()
+
+class ProfilerType(object):
+ def addinfo(self, a: str, b: str) -> None: ...
+ def close(self) -> None: ...
+ def fileno(self) -> int:
+ raise ValueError()
+ def runcall(self, *args, **kwargs) -> Any: ...
+ def runcode(self, a, b, *args, **kwargs) -> Any:
+ raise TypeError()
+ def start(self) -> None: ...
+ def stop(self) -> None: ...
diff --git a/typeshed/stdlib/2/_io.pyi b/typeshed/stdlib/2/_io.pyi
new file mode 100644
index 0000000..e85da33
--- /dev/null
+++ b/typeshed/stdlib/2/_io.pyi
@@ -0,0 +1,107 @@
+from typing import Any, Optional, Iterable, Tuple, List, Union
+
+DEFAULT_BUFFER_SIZE = ... # type: int
+
+
+class BlockingIOError(IOError):
+ characters_written = ... # type: int
+
+class UnsupportedOperation(ValueError, IOError): ...
+
+
+class _IOBase(object):
+ closed = ... # type: bool
+ def __enter__(self) -> "_IOBase": ...
+ def __exit__(self, type, value, traceback) -> bool: ...
+ def __iter__(self) -> "_IOBase": ...
+ def _checkClosed(self) -> None: ...
+ def _checkReadable(self) -> None: ...
+ def _checkSeekable(self) -> None: ...
+ def _checkWritable(self) -> None: ...
+ def close(self) -> None: ...
+ def fileno(self) -> int: ...
+ def flush(self) -> None: ...
+ def isatty(self) -> bool: ...
+ def next(self) -> str: ...
+ def readable(self) -> bool: ...
+ def readline(self, limit: int = ...) -> str: ...
+ def readlines(self, hint: int = ...) -> List[str]: ...
+ def seek(self, offset: int, whence: int = ...) -> None: ...
+ def seekable(self) -> bool: ...
+ def tell(self) -> int: ...
+ def truncate(self, size: int = ...) -> int: ...
+ def writable(self) -> bool: ...
+ def writelines(self, lines: Iterable[str]) -> None: ...
+
+class _BufferedIOBase(_IOBase):
+ def read1(self, n: int) -> str: ...
+ def read(self, n: int = ...) -> str: ...
+ def readinto(self, buffer: bytearray) -> int: ...
+ def write(self, s: str) -> int: ...
+ def detach(self) -> "_BufferedIOBase": ...
+
+class BufferedRWPair(_BufferedIOBase):
+ def peek(self, n: int = ...) -> str: ...
+
+class BufferedRandom(_BufferedIOBase):
+ name = ... # type: str
+ raw = ... # type: _IOBase
+ mode = ... # type: str
+ def peek(self, n: int = ...) -> str: ...
+
+class BufferedReader(_BufferedIOBase):
+ name = ... # type: str
+ raw = ... # type: _IOBase
+ mode = ... # type: str
+ def peek(self, n: int = ...) -> str: ...
+
+class BufferedWriter(_BufferedIOBase):
+ name = ... # type: str
+ raw = ... # type: _IOBase
+ mode = ... # type: str
+
+class BytesIO(_BufferedIOBase):
+ def __setstate__(self, tuple) -> None: ...
+ def __getstate__(self) -> tuple: ...
+ def getvalue(self) -> str: ...
+
+class _RawIOBase(_IOBase):
+ def readall(self) -> str: ...
+ def read(self, n: int = ...) -> str: ...
+
+class FileIO(_RawIOBase):
+ mode = ... # type: str
+ closefd = ... # type: bool
+ def readinto(self, buffer: bytearray)-> int: ...
+ def write(self, pbuf: str) -> int: ...
+
+class IncrementalNewlineDecoder(object):
+ newlines = ... # type: Union[str, unicode]
+ def decode(self, input, final) -> Any: ...
+ def getstate(self) -> Tuple[Any, int]: ...
+ def setstate(self, state: Tuple[Any, int]) -> None: ...
+ def reset(self) -> None: ...
+
+class _TextIOBase(_IOBase):
+ errors = ... # type: Optional[str]
+ newlines = ... # type: Union[str, unicode]
+ encoding = ... # type: Optional[str]
+ def read(self, n: int = ...) -> str: ...
+ def write(self) -> None:
+ raise UnsupportedOperation
+ def detach(self) -> None:
+ raise UnsupportedOperation
+
+class StringIO(_TextIOBase):
+ line_buffering = ... # type: bool
+ def getvalue(self) -> str: ...
+ def __setstate__(self, state: tuple) -> None: ...
+ def __getstate__(self) -> tuple: ...
+
+class TextIOWrapper(_TextIOBase):
+ name = ... # type: str
+ line_buffering = ... # type: bool
+ buffer = ... # type: str
+ _CHUNK_SIZE = ... # type: int
+
+def open(file: Union[int, str], mode: str = ...) -> _IOBase: ...
diff --git a/typeshed/stdlib/2/_json.pyi b/typeshed/stdlib/2/_json.pyi
new file mode 100644
index 0000000..dbf621d
--- /dev/null
+++ b/typeshed/stdlib/2/_json.pyi
@@ -0,0 +1,19 @@
+"""Stub file for the '_json' module."""
+# This is an autogenerated file. It serves as a starting point
+# for a more precise manual annotation of this module.
+# Feel free to edit the source below, but remove this header when you do.
+
+from typing import Any, List, Tuple, Dict, Generic
+
+def encode_basestring_ascii(*args, **kwargs) -> str:
+ raise TypeError()
+
+def scanstring(a, b, *args, **kwargs) -> tuple:
+ raise TypeError()
+
+
+class Encoder(object):
+ pass
+
+class Scanner(object):
+ pass
diff --git a/typeshed/stdlib/2/_md5.pyi b/typeshed/stdlib/2/_md5.pyi
new file mode 100644
index 0000000..862b68f
--- /dev/null
+++ b/typeshed/stdlib/2/_md5.pyi
@@ -0,0 +1,13 @@
+blocksize = ... # type: int
+digest_size = ... # type: int
+
+class MD5Type(object):
+ name = ... # type: str
+ block_size = ... # type: int
+ digest_size = ... # type: int
+ def copy(self) -> "MD5Type": ...
+ def digest(self) -> str: ...
+ def hexdigest(self) -> str: ...
+ def update(self, arg: str) -> None: ...
+
+def new(arg: str = ...) -> MD5Type: ...
diff --git a/typeshed/stdlib/2/_random.pyi b/typeshed/stdlib/2/_random.pyi
new file mode 100644
index 0000000..060dcd2
--- /dev/null
+++ b/typeshed/stdlib/2/_random.pyi
@@ -0,0 +1,13 @@
+from typing import Tuple
+
+# Actually Tuple[(int,) * 625]
+_State = Tuple[int, ...]
+
+class Random(object):
+ def __init__(self, seed: object = ...) -> None: ...
+ def seed(self, x: object = ...) -> None: ...
+ def getstate(self) -> _State: ...
+ def setstate(self, state: _State) -> None: ...
+ def random(self) -> float: ...
+ def getrandbits(self, k: int) -> int: ...
+ def jumpahead(self, i: int) -> None: ...
diff --git a/typeshed/stdlib/2/_sha.pyi b/typeshed/stdlib/2/_sha.pyi
new file mode 100644
index 0000000..eb750e0
--- /dev/null
+++ b/typeshed/stdlib/2/_sha.pyi
@@ -0,0 +1,15 @@
+blocksize = ... # type: int
+block_size = ... # type: int
+digest_size = ... # type: int
+
+class sha(object): # not actually exposed
+ name = ... # type: str
+ block_size = ... # type: int
+ digest_size = ... # type: int
+ digestsize = ... # type: int
+ def copy(self) -> "sha": ...
+ def digest(self) -> str: ...
+ def hexdigest(self) -> str: ...
+ def update(self, arg: str) -> None: ...
+
+def new(arg: str = ...) -> sha: ...
diff --git a/typeshed/stdlib/2/_sha256.pyi b/typeshed/stdlib/2/_sha256.pyi
new file mode 100644
index 0000000..4cf40c1
--- /dev/null
+++ b/typeshed/stdlib/2/_sha256.pyi
@@ -0,0 +1,23 @@
+from typing import Optional
+
+class sha224(object):
+ name = ... # type: str
+ block_size = ... # type: int
+ digest_size = ... # type: int
+ digestsize = ... # type: int
+ def __init__(self, init: Optional[str]) -> None: ...
+ def copy(self) -> "sha224": ...
+ def digest(self) -> str: ...
+ def hexdigest(self) -> str: ...
+ def update(self, arg: str) -> None: ...
+
+class sha256(object):
+ name = ... # type: str
+ block_size = ... # type: int
+ digest_size = ... # type: int
+ digestsize = ... # type: int
+ def __init__(self, init: Optional[str]) -> None: ...
+ def copy(self) -> "sha256": ...
+ def digest(self) -> str: ...
+ def hexdigest(self) -> str: ...
+ def update(self, arg: str) -> None: ...
diff --git a/typeshed/stdlib/2/_sha512.pyi b/typeshed/stdlib/2/_sha512.pyi
new file mode 100644
index 0000000..f9e4928
--- /dev/null
+++ b/typeshed/stdlib/2/_sha512.pyi
@@ -0,0 +1,23 @@
+from typing import Optional
+
+class sha384(object):
+ name = ... # type: str
+ block_size = ... # type: int
+ digest_size = ... # type: int
+ digestsize = ... # type: int
+ def __init__(self, init: Optional[str]) -> None: ...
+ def copy(self) -> "sha384": ...
+ def digest(self) -> str: ...
+ def hexdigest(self) -> str: ...
+ def update(self, arg: str) -> None: ...
+
+class sha512(object):
+ name = ... # type: str
+ block_size = ... # type: int
+ digest_size = ... # type: int
+ digestsize = ... # type: int
+ def __init__(self, init: Optional[str]) -> None: ...
+ def copy(self) -> "sha512": ...
+ def digest(self) -> str: ...
+ def hexdigest(self) -> str: ...
+ def update(self, arg: str) -> None: ...
diff --git a/typeshed/stdlib/2/_socket.pyi b/typeshed/stdlib/2/_socket.pyi
new file mode 100644
index 0000000..cfd615e
--- /dev/null
+++ b/typeshed/stdlib/2/_socket.pyi
@@ -0,0 +1,287 @@
+from typing import Tuple, Union, IO, Any, Optional, overload
+
+AF_APPLETALK = ... # type: int
+AF_ASH = ... # type: int
+AF_ATMPVC = ... # type: int
+AF_ATMSVC = ... # type: int
+AF_AX25 = ... # type: int
+AF_BLUETOOTH = ... # type: int
+AF_BRIDGE = ... # type: int
+AF_DECnet = ... # type: int
+AF_ECONET = ... # type: int
+AF_INET = ... # type: int
+AF_INET6 = ... # type: int
+AF_IPX = ... # type: int
+AF_IRDA = ... # type: int
+AF_KEY = ... # type: int
+AF_LLC = ... # type: int
+AF_NETBEUI = ... # type: int
+AF_NETLINK = ... # type: int
+AF_NETROM = ... # type: int
+AF_PACKET = ... # type: int
+AF_PPPOX = ... # type: int
+AF_ROSE = ... # type: int
+AF_ROUTE = ... # type: int
+AF_SECURITY = ... # type: int
+AF_SNA = ... # type: int
+AF_TIPC = ... # type: int
+AF_UNIX = ... # type: int
+AF_UNSPEC = ... # type: int
+AF_WANPIPE = ... # type: int
+AF_X25 = ... # type: int
+AI_ADDRCONFIG = ... # type: int
+AI_ALL = ... # type: int
+AI_CANONNAME = ... # type: int
+AI_NUMERICHOST = ... # type: int
+AI_NUMERICSERV = ... # type: int
+AI_PASSIVE = ... # type: int
+AI_V4MAPPED = ... # type: int
+BDADDR_ANY = ... # type: str
+BDADDR_LOCAL = ... # type: str
+BTPROTO_HCI = ... # type: int
+BTPROTO_L2CAP = ... # type: int
+BTPROTO_RFCOMM = ... # type: int
+BTPROTO_SCO = ... # type: int
+EAI_ADDRFAMILY = ... # type: int
+EAI_AGAIN = ... # type: int
+EAI_BADFLAGS = ... # type: int
+EAI_FAIL = ... # type: int
+EAI_FAMILY = ... # type: int
+EAI_MEMORY = ... # type: int
+EAI_NODATA = ... # type: int
+EAI_NONAME = ... # type: int
+EAI_OVERFLOW = ... # type: int
+EAI_SERVICE = ... # type: int
+EAI_SOCKTYPE = ... # type: int
+EAI_SYSTEM = ... # type: int
+EBADF = ... # type: int
+EINTR = ... # type: int
+HCI_DATA_DIR = ... # type: int
+HCI_FILTER = ... # type: int
+HCI_TIME_STAMP = ... # type: int
+INADDR_ALLHOSTS_GROUP = ... # type: int
+INADDR_ANY = ... # type: int
+INADDR_BROADCAST = ... # type: int
+INADDR_LOOPBACK = ... # type: int
+INADDR_MAX_LOCAL_GROUP = ... # type: int
+INADDR_NONE = ... # type: int
+INADDR_UNSPEC_GROUP = ... # type: int
+IPPORT_RESERVED = ... # type: int
+IPPORT_USERRESERVED = ... # type: int
+IPPROTO_AH = ... # type: int
+IPPROTO_DSTOPTS = ... # type: int
+IPPROTO_EGP = ... # type: int
+IPPROTO_ESP = ... # type: int
+IPPROTO_FRAGMENT = ... # type: int
+IPPROTO_GRE = ... # type: int
+IPPROTO_HOPOPTS = ... # type: int
+IPPROTO_ICMP = ... # type: int
+IPPROTO_ICMPV6 = ... # type: int
+IPPROTO_IDP = ... # type: int
+IPPROTO_IGMP = ... # type: int
+IPPROTO_IP = ... # type: int
+IPPROTO_IPIP = ... # type: int
+IPPROTO_IPV6 = ... # type: int
+IPPROTO_NONE = ... # type: int
+IPPROTO_PIM = ... # type: int
+IPPROTO_PUP = ... # type: int
+IPPROTO_RAW = ... # type: int
+IPPROTO_ROUTING = ... # type: int
+IPPROTO_RSVP = ... # type: int
+IPPROTO_TCP = ... # type: int
+IPPROTO_TP = ... # type: int
+IPPROTO_UDP = ... # type: int
+IPV6_CHECKSUM = ... # type: int
+IPV6_DSTOPTS = ... # type: int
+IPV6_HOPLIMIT = ... # type: int
+IPV6_HOPOPTS = ... # type: int
+IPV6_JOIN_GROUP = ... # type: int
+IPV6_LEAVE_GROUP = ... # type: int
+IPV6_MULTICAST_HOPS = ... # type: int
+IPV6_MULTICAST_IF = ... # type: int
+IPV6_MULTICAST_LOOP = ... # type: int
+IPV6_NEXTHOP = ... # type: int
+IPV6_PKTINFO = ... # type: int
+IPV6_RECVDSTOPTS = ... # type: int
+IPV6_RECVHOPLIMIT = ... # type: int
+IPV6_RECVHOPOPTS = ... # type: int
+IPV6_RECVPKTINFO = ... # type: int
+IPV6_RECVRTHDR = ... # type: int
+IPV6_RECVTCLASS = ... # type: int
+IPV6_RTHDR = ... # type: int
+IPV6_RTHDRDSTOPTS = ... # type: int
+IPV6_RTHDR_TYPE_0 = ... # type: int
+IPV6_TCLASS = ... # type: int
+IPV6_UNICAST_HOPS = ... # type: int
+IPV6_V6ONLY = ... # type: int
+IP_ADD_MEMBERSHIP = ... # type: int
+IP_DEFAULT_MULTICAST_LOOP = ... # type: int
+IP_DEFAULT_MULTICAST_TTL = ... # type: int
+IP_DROP_MEMBERSHIP = ... # type: int
+IP_HDRINCL = ... # type: int
+IP_MAX_MEMBERSHIPS = ... # type: int
+IP_MULTICAST_IF = ... # type: int
+IP_MULTICAST_LOOP = ... # type: int
+IP_MULTICAST_TTL = ... # type: int
+IP_OPTIONS = ... # type: int
+IP_RECVOPTS = ... # type: int
+IP_RECVRETOPTS = ... # type: int
+IP_RETOPTS = ... # type: int
+IP_TOS = ... # type: int
+IP_TTL = ... # type: int
+MSG_CTRUNC = ... # type: int
+MSG_DONTROUTE = ... # type: int
+MSG_DONTWAIT = ... # type: int
+MSG_EOR = ... # type: int
+MSG_OOB = ... # type: int
+MSG_PEEK = ... # type: int
+MSG_TRUNC = ... # type: int
+MSG_WAITALL = ... # type: int
+MethodType = ... # type: type
+NETLINK_DNRTMSG = ... # type: int
+NETLINK_FIREWALL = ... # type: int
+NETLINK_IP6_FW = ... # type: int
+NETLINK_NFLOG = ... # type: int
+NETLINK_ROUTE = ... # type: int
+NETLINK_USERSOCK = ... # type: int
+NETLINK_XFRM = ... # type: int
+NI_DGRAM = ... # type: int
+NI_MAXHOST = ... # type: int
+NI_MAXSERV = ... # type: int
+NI_NAMEREQD = ... # type: int
+NI_NOFQDN = ... # type: int
+NI_NUMERICHOST = ... # type: int
+NI_NUMERICSERV = ... # type: int
+PACKET_BROADCAST = ... # type: int
+PACKET_FASTROUTE = ... # type: int
+PACKET_HOST = ... # type: int
+PACKET_LOOPBACK = ... # type: int
+PACKET_MULTICAST = ... # type: int
+PACKET_OTHERHOST = ... # type: int
+PACKET_OUTGOING = ... # type: int
+PF_PACKET = ... # type: int
+SHUT_RD = ... # type: int
+SHUT_RDWR = ... # type: int
+SHUT_WR = ... # type: int
+SOCK_DGRAM = ... # type: int
+SOCK_RAW = ... # type: int
+SOCK_RDM = ... # type: int
+SOCK_SEQPACKET = ... # type: int
+SOCK_STREAM = ... # type: int
+SOL_HCI = ... # type: int
+SOL_IP = ... # type: int
+SOL_SOCKET = ... # type: int
+SOL_TCP = ... # type: int
+SOL_TIPC = ... # type: int
+SOL_UDP = ... # type: int
+SOMAXCONN = ... # type: int
+SO_ACCEPTCONN = ... # type: int
+SO_BROADCAST = ... # type: int
+SO_DEBUG = ... # type: int
+SO_DONTROUTE = ... # type: int
+SO_ERROR = ... # type: int
+SO_KEEPALIVE = ... # type: int
+SO_LINGER = ... # type: int
+SO_OOBINLINE = ... # type: int
+SO_RCVBUF = ... # type: int
+SO_RCVLOWAT = ... # type: int
+SO_RCVTIMEO = ... # type: int
+SO_REUSEADDR = ... # type: int
+SO_REUSEPORT = ... # type: int
+SO_SNDBUF = ... # type: int
+SO_SNDLOWAT = ... # type: int
+SO_SNDTIMEO = ... # type: int
+SO_TYPE = ... # type: int
+SSL_ERROR_EOF = ... # type: int
+SSL_ERROR_INVALID_ERROR_CODE = ... # type: int
+SSL_ERROR_SSL = ... # type: int
+SSL_ERROR_SYSCALL = ... # type: int
+SSL_ERROR_WANT_CONNECT = ... # type: int
+SSL_ERROR_WANT_READ = ... # type: int
+SSL_ERROR_WANT_WRITE = ... # type: int
+SSL_ERROR_WANT_X509_LOOKUP = ... # type: int
+SSL_ERROR_ZERO_RETURN = ... # type: int
+TCP_CORK = ... # type: int
+TCP_DEFER_ACCEPT = ... # type: int
+TCP_INFO = ... # type: int
+TCP_KEEPCNT = ... # type: int
+TCP_KEEPIDLE = ... # type: int
+TCP_KEEPINTVL = ... # type: int
+TCP_LINGER2 = ... # type: int
+TCP_MAXSEG = ... # type: int
+TCP_NODELAY = ... # type: int
+TCP_QUICKACK = ... # type: int
+TCP_SYNCNT = ... # type: int
+TCP_WINDOW_CLAMP = ... # type: int
+TIPC_ADDR_ID = ... # type: int
+TIPC_ADDR_NAME = ... # type: int
+TIPC_ADDR_NAMESEQ = ... # type: int
+TIPC_CFG_SRV = ... # type: int
+TIPC_CLUSTER_SCOPE = ... # type: int
+TIPC_CONN_TIMEOUT = ... # type: int
+TIPC_CRITICAL_IMPORTANCE = ... # type: int
+TIPC_DEST_DROPPABLE = ... # type: int
+TIPC_HIGH_IMPORTANCE = ... # type: int
+TIPC_IMPORTANCE = ... # type: int
+TIPC_LOW_IMPORTANCE = ... # type: int
+TIPC_MEDIUM_IMPORTANCE = ... # type: int
+TIPC_NODE_SCOPE = ... # type: int
+TIPC_PUBLISHED = ... # type: int
+TIPC_SRC_DROPPABLE = ... # type: int
+TIPC_SUBSCR_TIMEOUT = ... # type: int
+TIPC_SUB_CANCEL = ... # type: int
+TIPC_SUB_PORTS = ... # type: int
+TIPC_SUB_SERVICE = ... # type: int
+TIPC_TOP_SRV = ... # type: int
+TIPC_WAIT_FOREVER = ... # type: int
+TIPC_WITHDRAWN = ... # type: int
+TIPC_ZONE_SCOPE = ... # type: int
+
+# PyCapsule
+CAPI = ... # type: Any
+
+has_ipv6 = ... # type: bool
+
+class error(IOError): ...
+class gaierror(error): ...
+class timeout(error): ...
+
+class SocketType(object):
+ family = ... # type: int
+ type = ... # type: int
+ proto = ... # type: int
+ timeout = ... # type: float
+
+ def __init__(self, family: int = ..., type: int = ..., proto: int = ...) -> None: ...
+ def accept(self) -> Tuple['SocketType', tuple]: ...
+ def bind(self, address: tuple) -> None: ...
+ def close(self) -> None: ...
+ def connect(self, address: tuple) -> None:
+ raise gaierror
+ raise timeout
+ def connect_ex(self, address: tuple) -> int: ...
+ def dup(self) -> "SocketType": ...
+ def fileno(self) -> int: ...
+ def getpeername(self) -> tuple: ...
+ def getsockname(self) -> tuple: ...
+ def getsockopt(self, level: int, option: int, buffersize: int = ...) -> str: ...
+ def gettimeout(self) -> float: ...
+ def listen(self, backlog: int) -> None:
+ raise error
+ def makefile(self, mode: str = ..., buffersize: int = ...) -> IO[Any]: ...
+ def recv(self, buffersize: int, flags: int = ...) -> str: ...
+ def recv_into(self, buffer: bytearray, nbytes: int = ..., flags: int = ...) -> int: ...
+ def recvfrom(self, buffersize: int, flags: int = ...) -> tuple:
+ raise error
+ def recvfrom_into(self, buffer: bytearray, nbytes: int = ...,
+ flags: int = ...) -> int: ...
+ def send(self, data: str, flags: int =...) -> int: ...
+ def sendall(self, data: str, flags: int = ...) -> None: ...
+ @overload
+ def sendto(self, data: str, address: tuple) -> int: ...
+ @overload
+ def sendto(self, data: str, flags: int, address: tuple) -> int: ...
+ def setblocking(self, flag: bool) -> None: ...
+ def setsockopt(self, level: int, option: int, value: Union[int, str]) -> None: ...
+ def settimeout(self, value: Optional[float]) -> None: ...
+ def shutdown(self, flag: int) -> None: ...
diff --git a/typeshed/stdlib/2/_sre.pyi b/typeshed/stdlib/2/_sre.pyi
new file mode 100644
index 0000000..08d1ecc
--- /dev/null
+++ b/typeshed/stdlib/2/_sre.pyi
@@ -0,0 +1,53 @@
+"""Stub file for the '_sre' module."""
+
+from typing import Any, Union, Iterable, Optional, Mapping, Sequence, Dict, List, Tuple, overload
+
+CODESIZE = ... # type: int
+MAGIC = ... # type: int
+MAXREPEAT = ... # type: long
+copyright = ... # type: str
+
+class SRE_Match(object):
+ def start(self, group: int = ...) -> int:
+ raise IndexError()
+ def end(self, group: int = ...) -> int:
+ raise IndexError()
+ def expand(self, s: str) -> Any: ...
+ @overload
+ def group(self) -> str: ...
+ @overload
+ def group(self, group: int = ...) -> Optional[str]: ...
+ def groupdict(self) -> Dict[int, Optional[str]]: ...
+ def groups(self) -> Tuple[Optional[str]]: ...
+ def span(self) -> Tuple[int, int]:
+ raise IndexError()
+
+class SRE_Scanner(object):
+ pattern = ... # type: str
+ def match(self) -> SRE_Match: ...
+ def search(self) -> SRE_Match: ...
+
+class SRE_Pattern(object):
+ pattern = ... # type: str
+ flags = ... # type: int
+ groups = ... # type: int
+ groupindex = ... # type: Mapping[int, int]
+ indexgroup = ... # type: Sequence[int]
+ def findall(self, source: str, pos: int = ..., endpos: int = ...) -> List[Union[tuple, str]]: ...
+ def finditer(self, source: str, pos: int = ..., endpos: int = ...) -> Iterable[Union[tuple, str]]: ...
+ def match(self, pattern, pos: int = ..., endpos: int = ...) -> SRE_Match: ...
+ def scanner(self, s: str, start: int = ..., end: int = ...) -> SRE_Scanner: ...
+ def search(self, pattern, pos: int = ..., endpos: int = ...) -> SRE_Match: ...
+ def split(self, source: str, maxsplit: int = ...) -> List[Optional[str]]: ...
+ def sub(self, repl: str, string: str, count: int = ...) -> tuple: ...
+ def subn(self, repl: str, string: str, count: int = ...) -> tuple: ...
+
+def compile(pattern: str, flags: int, code: List[int],
+ groups: int = ...,
+ groupindex: Mapping[int, int] = ...,
+ indexgroup: Sequence[int] = ...) -> SRE_Pattern:
+ raise OverflowError()
+
+def getcodesize() -> int: ...
+
+def getlower(a: int, b: int) -> int: ...
diff --git a/typeshed/stdlib/2/_struct.pyi b/typeshed/stdlib/2/_struct.pyi
new file mode 100644
index 0000000..8917187
--- /dev/null
+++ b/typeshed/stdlib/2/_struct.pyi
@@ -0,0 +1,22 @@
+"""Stub file for the '_struct' module."""
+
+from typing import Any, AnyStr, Tuple
+
+class error(Exception): ...
+
+class Struct(object):
+ size = ... # type: int
+ format = ... # type: str
+
+ def __init__(self, fmt: str) -> None: ...
+ def pack_into(self, buffer: bytearray, offset: int, obj: Any) -> None: ...
+ def pack(self, *args) -> str: ...
+ def unpack(self, s: str) -> Tuple[Any]: ...
+ def unpack_from(self, buffer: bytearray, offset: int = ...) -> Tuple[Any]: ...
+
+def _clearcache() -> None: ...
+def calcsize(fmt: str) -> int: ...
+def pack(fmt: AnyStr, obj: Any) -> str: ...
+def pack_into(fmt: AnyStr, buffer: bytearray, offset: int, obj: Any) -> None: ...
+def unpack(fmt: AnyStr, data: str) -> Tuple[Any]: ...
+def unpack_from(fmt: AnyStr, buffer: bytearray, offset: int = ...) -> Tuple[Any]: ...
diff --git a/typeshed/stdlib/2/_symtable.pyi b/typeshed/stdlib/2/_symtable.pyi
new file mode 100644
index 0000000..fd8b691
--- /dev/null
+++ b/typeshed/stdlib/2/_symtable.pyi
@@ -0,0 +1,39 @@
+from typing import List, Dict
+
+CELL = ... # type: int
+DEF_BOUND = ... # type: int
+DEF_FREE = ... # type: int
+DEF_FREE_CLASS = ... # type: int
+DEF_GLOBAL = ... # type: int
+DEF_IMPORT = ... # type: int
+DEF_LOCAL = ... # type: int
+DEF_PARAM = ... # type: int
+FREE = ... # type: int
+GLOBAL_EXPLICIT = ... # type: int
+GLOBAL_IMPLICIT = ... # type: int
+LOCAL = ... # type: int
+OPT_BARE_EXEC = ... # type: int
+OPT_EXEC = ... # type: int
+OPT_IMPORT_STAR = ... # type: int
+SCOPE_MASK = ... # type: int
+SCOPE_OFF = ... # type: int
+TYPE_CLASS = ... # type: int
+TYPE_FUNCTION = ... # type: int
+TYPE_MODULE = ... # type: int
+USE = ... # type: int
+
+class _symtable_entry(object):
+ ...
+
+class symtable(object):
+ children = ... # type: List[_symtable_entry]
+ id = ... # type: int
+ lineno = ... # type: int
+ name = ... # type: str
+ nested = ... # type: int
+ optimized = ... # type: int
+ symbols = ... # type: Dict[str, int]
+ type = ... # type: int
+ varnames = ... # type: List[str]
+
+ def __init__(self, src: str, filename: str, startstr: str) -> None: ...
diff --git a/typeshed/stdlib/2/_warnings.pyi b/typeshed/stdlib/2/_warnings.pyi
new file mode 100644
index 0000000..4f54529
--- /dev/null
+++ b/typeshed/stdlib/2/_warnings.pyi
@@ -0,0 +1,11 @@
+from typing import Any, List
+
+default_action = ... # type: str
+filters = ... # type: List[tuple]
+once_registry = ... # type: dict
+
+def warn(message: Warning, category: type = ..., stacklevel: int = ...) -> None: ...
+def warn_explicit(message: Warning, category: type,
+ filename: str, lineno: int,
+ module: Any = ..., registry: dict = ...,
+ module_globals: dict = ...) -> None: ...
diff --git a/typeshed/stdlib/2/_weakref.pyi b/typeshed/stdlib/2/_weakref.pyi
new file mode 100644
index 0000000..a7bb9ea
--- /dev/null
+++ b/typeshed/stdlib/2/_weakref.pyi
@@ -0,0 +1,21 @@
+from typing import Any, Callable, Generic, Optional, TypeVar
+
+_T = TypeVar('_T')
+
+class CallableProxyType(object): # "weakcallableproxy"
+ pass
+
+class ProxyType(object): # "weakproxy"
+ pass
+
+class ReferenceType(Generic[_T]):
+ # TODO rest of members
+ def __init__(self, o: _T, callback: Callable[[ReferenceType[_T]],
+ Any] = ...) -> None: ...
+ def __call__(self) -> Optional[_T]: ...
+
+ref = ReferenceType
+
+def getweakrefcount(object: Any) -> int: ...
+def getweakrefs(object: Any) -> int: ...
+def proxy(object: Any, callback: Callable[[Any], Any] = ...) -> None: ...
diff --git a/typeshed/stdlib/2/_weakrefset.pyi b/typeshed/stdlib/2/_weakrefset.pyi
new file mode 100644
index 0000000..27aade6
--- /dev/null
+++ b/typeshed/stdlib/2/_weakrefset.pyi
@@ -0,0 +1,14 @@
+from typing import Iterator, Any, Iterable, MutableSet, TypeVar, Generic
+
+_T = TypeVar('_T')
+
+class WeakSet(MutableSet[_T], Generic[_T]):
+ def __init__(self, data: Iterable[_T] = ...) -> None: ...
+
+ def add(self, x: _T) -> None: ...
+ def discard(self, x: _T) -> None: ...
+ def __contains__(self, x: Any) -> bool: ...
+ def __len__(self) -> int: ...
+ def __iter__(self) -> Iterator[_T]: ...
+
+ # TODO: difference, difference_update, ...
diff --git a/typeshed/stdlib/2/abc.pyi b/typeshed/stdlib/2/abc.pyi
new file mode 100644
index 0000000..3ae3b52
--- /dev/null
+++ b/typeshed/stdlib/2/abc.pyi
@@ -0,0 +1,37 @@
+from typing import Any, Dict, Set, Union, Tuple
+import _weakrefset
+
+# mypy has special processing for ABCMeta and abstractmethod.
+
+WeakSet = ... # type: _weakrefset.WeakSet
+_InstanceType = ... # type: type
+types = ... # type: module
+
+def abstractmethod(funcobj: Any) -> Any: ...
+
+class ABCMeta(type):
+ # TODO: FrozenSet
+ __abstractmethods__ = ... # type: Set[Any]
+ _abc_cache = ... # type: _weakrefset.WeakSet
+ _abc_invalidation_counter = ... # type: int
+ _abc_negative_cache = ... # type: _weakrefset.WeakSet
+ _abc_negative_cache_version = ... # type: int
+ _abc_registry = ... # type: _weakrefset.WeakSet
+ def __init__(self, name: str, bases: Tuple[type, ...], namespace: Dict[Any, Any]) -> None: ...
+ def __instancecheck__(cls: "ABCMeta", instance: Any) -> Any: ...
+ def __subclasscheck__(cls: "ABCMeta", subclass: Any) -> Any: ...
+ def _dump_registry(cls: "ABCMeta", *args: Any, **kwargs: Any) -> None: ...
+ # TODO: subclass: Union["ABCMeta", type, Tuple[type, ...]]
+ def register(cls: "ABCMeta", subclass: Any) -> None: ...
+
+class _C:
+ pass
+
+# TODO: The real abc.abstractproperty inherits from "property".
+class abstractproperty(object):
+ def __new__(cls, func: Any) -> Any: ...
+ __isabstractmethod__ = ... # type: bool
+ doc = ... # type: Any
+ fdel = ... # type: Any
+ fget = ... # type: Any
+ fset = ... # type: Any
diff --git a/typeshed/stdlib/2/array.pyi b/typeshed/stdlib/2/array.pyi
new file mode 100644
index 0000000..3ff4081
--- /dev/null
+++ b/typeshed/stdlib/2/array.pyi
@@ -0,0 +1,56 @@
+"""Stub file for the 'array' module."""
+
+from typing import (Any, Generic, IO, Iterable, Sequence, TypeVar,
+ Union, overload, Iterator, Tuple, BinaryIO, List)
+
+T = TypeVar('T')
+
+class array(Generic[T]):
+ def __init__(self, typecode: str, init: Iterable[T] = ...) -> None: ...
+ def __add__(self, y: "array[T]") -> "array[T]": ...
+ def __contains__(self, y: Any) -> bool: ...
+ def __copy__(self) -> "array[T]": ...
+ def __deepcopy__(self) -> "array": ...
+ def __delitem__(self, y: Union[slice, int]) -> None: ...
+ def __delslice__(self, i: int, j: int) -> None: ...
+ @overload
+ def __getitem__(self, i: int) -> Any: ...
+ @overload
+ def __getitem__(self, s: slice) -> "array": ...
+ def __iadd__(self, y: "array[T]") -> "array[T]": ...
+ def __imul__(self, y: int) -> "array[T]": ...
+ def __iter__(self) -> Iterator[T]: ...
+ def __len__(self) -> int: ...
+ def __mul__(self, n: int) -> "array[T]": ...
+ def __rmul__(self, n: int) -> "array[T]": ...
+ @overload
+ def __setitem__(self, i: int, y: T) -> None: ...
+ @overload
+ def __setitem__(self, i: slice, y: "array[T]") -> None: ...
+
+ def append(self, x: T) -> None: ...
+ def buffer_info(self) -> Tuple[int, int]: ...
+ def byteswap(self) -> None:
+ raise RuntimeError()
+ def count(self) -> int: ...
+ def extend(self, x: Sequence[T]) -> None: ...
+ def fromlist(self, list: List[T]) -> None:
+ raise EOFError()
+ raise IOError()
+ def fromfile(self, f: BinaryIO, n: int) -> None: ...
+ def fromstring(self, s: str) -> None: ...
+ def fromunicode(self, u: unicode) -> None: ...
+ def index(self, x: T) -> int: ...
+ def insert(self, i: int, x: T) -> None: ...
+ def pop(self, i: int = ...) -> T: ...
+ def read(self, f: IO[str], n: int) -> None:
+ raise DeprecationWarning()
+ def remove(self, x: T) -> None: ...
+ def reverse(self) -> None: ...
+ def tofile(self, f: BinaryIO) -> None:
+ raise IOError()
+ def tolist(self) -> List[T]: ...
+ def tostring(self) -> str: ...
+ def tounicode(self) -> unicode: ...
+ def write(self, f: IO[str]) -> None:
+ raise DeprecationWarning()
diff --git a/typeshed/stdlib/2/ast.pyi b/typeshed/stdlib/2/ast.pyi
new file mode 100644
index 0000000..95bda54
--- /dev/null
+++ b/typeshed/stdlib/2/ast.pyi
@@ -0,0 +1,40 @@
+# Python 2.7 ast
+
+import typing
+from typing import Any, Iterator, Union
+
+from _ast import (
+ Add, alias, And, arguments, Assert, Assign, AST, Attribute, AugAssign,
+ AugLoad, AugStore, BinOp, BitAnd, BitOr, BitXor, BoolOp, boolop, Break,
+ Call, ClassDef, cmpop, Compare, comprehension, Continue, Del, Delete, Dict,
+ DictComp, Div, Ellipsis, Eq, ExceptHandler, Exec, Expr, expr, Expression,
+ expr_context, ExtSlice, FloorDiv, For, FunctionDef, GeneratorExp, Global,
+ Gt, GtE, If, IfExp, Import, ImportFrom, In, Index, Interactive, Invert, Is,
+ IsNot, keyword, Lambda, List, ListComp, Load, LShift, Lt, LtE, Mod, mod,
+ Module, Mult, Name, Not, NotEq, NotIn, Num, operator, Or, Param, Pass, Pow,
+ Print, Raise, Repr, Return, RShift, Set, SetComp, Slice, slice, stmt,
+ Store, Str, Sub, Subscript, Suite, TryExcept, TryFinally, Tuple, UAdd,
+ UnaryOp, unaryop, USub, While, With, Yield
+)
+
+__version__ = ... # type: str
+PyCF_ONLY_AST = ... # type: int
+
+
+def parse(source: Union[str, bytes], filename: Union[str, bytes] = ..., mode: str = ...) -> AST: ...
+def copy_location(new_node: AST, old_node: AST) -> AST: ...
+def dump(node: AST, annotate_fields: bool = ..., include_attributes: bool = ...) -> str: ...
+def fix_missing_locations(node: AST) -> AST: ...
+def get_docstring(node: AST, clean: bool = ...) -> str: ...
+def increment_lineno(node: AST, n: int = ...) -> AST: ...
+def iter_child_nodes(node: AST) -> Iterator[AST]: ...
+def iter_fields(node: AST) -> Iterator[typing.Tuple[str, Any]]: ...
+def literal_eval(node_or_string: Union[str, AST]) -> Any: ...
+def walk(node: AST) -> Iterator[AST]: ...
+
+class NodeVisitor():
+ def visit(self, node: AST) -> Any: ...
+ def generic_visit(self, node: AST) -> None: ...
+
+class NodeTransformer(NodeVisitor):
+ def generic_visit(self, node: AST) -> None: ...
diff --git a/typeshed/stdlib/2/atexit.pyi b/typeshed/stdlib/2/atexit.pyi
new file mode 100644
index 0000000..13d2602
--- /dev/null
+++ b/typeshed/stdlib/2/atexit.pyi
@@ -0,0 +1,5 @@
+from typing import TypeVar, Any
+
+_FT = TypeVar('_FT')
+
+def register(func: _FT, *args: Any, **kargs: Any) -> _FT: ...
diff --git a/typeshed/stdlib/2/base64.pyi b/typeshed/stdlib/2/base64.pyi
new file mode 100644
index 0000000..d593fa8
--- /dev/null
+++ b/typeshed/stdlib/2/base64.pyi
@@ -0,0 +1,25 @@
+# Stubs for base64
+
+# Based on http://docs.python.org/3.2/library/base64.html
+
+from typing import IO
+
+def b64encode(s: str, altchars: str = ...) -> str: ...
+def b64decode(s: str, altchars: str = ...,
+ validate: bool = ...) -> str: ...
+def standard_b64encode(s: str) -> str: ...
+def standard_b64decode(s: str) -> str: ...
+def urlsafe_b64encode(s: str) -> str: ...
+def urlsafe_b64decode(s: str) -> str: ...
+def b32encode(s: str) -> str: ...
+def b32decode(s: str, casefold: bool = ...,
+ map01: str = ...) -> str: ...
+def b16encode(s: str) -> str: ...
+def b16decode(s: str, casefold: bool = ...) -> str: ...
+
+def decode(input: IO[str], output: IO[str]) -> None: ...
+def decodebytes(s: str) -> str: ...
+def decodestring(s: str) -> str: ...
+def encode(input: IO[str], output: IO[str]) -> None: ...
+def encodebytes(s: str) -> str: ...
+def encodestring(s: str) -> str: ...
diff --git a/typeshed/stdlib/2/binascii.pyi b/typeshed/stdlib/2/binascii.pyi
new file mode 100644
index 0000000..f8b85b6
--- /dev/null
+++ b/typeshed/stdlib/2/binascii.pyi
@@ -0,0 +1,21 @@
+"""Stubs for the binascii module."""
+
+def a2b_base64(string: str) -> str: ...
+def a2b_hex(hexstr: str) -> str: ...
+def a2b_hqx(string: str) -> str: ...
+def a2b_qp(string: str, header: bool = ...) -> str: ...
+def a2b_uu(string: str) -> str: ...
+def b2a_base64(data: str) -> str: ...
+def b2a_hex(data: str) -> str: ...
+def b2a_hqx(data: str) -> str: ...
+def b2a_qp(data: str, quotetabs: bool = ..., istext: bool = ..., header: bool = ...) -> str: ...
+def b2a_uu(data: str) -> str: ...
+def crc32(data: str, crc: int = None) -> int: ...
+def crc_hqx(data: str, oldcrc: int) -> int: ...
+def hexlify(data: str) -> str: ...
+def rlecode_hqx(data: str) -> str: ...
+def rledecode_hqx(data: str) -> str: ...
+def unhexlify(hexstr: str) -> str: ...
+
+class Error(Exception): ...
+class Incomplete(Exception): ...
diff --git a/typeshed/stdlib/2/builtins.pyi b/typeshed/stdlib/2/builtins.pyi
new file mode 100644
index 0000000..e8d4ae0
--- /dev/null
+++ b/typeshed/stdlib/2/builtins.pyi
@@ -0,0 +1,947 @@
+# Stubs for builtins (Python 2.7)
+
+# True and False are deliberately omitted because they are keywords in
+# Python 3, and stub files conform to Python 3 syntax.
+
+from typing import (
+ TypeVar, Iterator, Iterable, overload,
+ Sequence, Mapping, Tuple, List, Any, Dict, Callable, Generic, Set,
+ AbstractSet, FrozenSet, Sized, Reversible, SupportsInt, SupportsFloat, SupportsAbs,
+ SupportsRound, IO, BinaryIO, Union, AnyStr, MutableSequence, MutableMapping,
+ MutableSet, ItemsView, KeysView, ValuesView, Optional, Container,
+)
+from abc import abstractmethod, ABCMeta
+from mypy_extensions import NoReturn
+
+_T = TypeVar('_T')
+_T_co = TypeVar('_T_co', covariant=True)
+_KT = TypeVar('_KT')
+_VT = TypeVar('_VT')
+_S = TypeVar('_S')
+_T1 = TypeVar('_T1')
+_T2 = TypeVar('_T2')
+_T3 = TypeVar('_T3')
+_T4 = TypeVar('_T4')
+_TT = TypeVar('_TT', bound='type')
+
+class staticmethod: pass # Special, only valid as a decorator.
+class classmethod: pass # Special, only valid as a decorator.
+
+class object:
+ __doc__ = ... # type: Optional[str]
+ __class__ = ... # type: type
+ __slots__ = ... # type: Optional[Union[str, unicode, Iterable[Union[str, unicode]]]]
+
+ def __init__(self) -> None: ...
+ def __new__(cls) -> Any: ...
+ def __setattr__(self, name: str, value: Any) -> None: ...
+ def __eq__(self, o: object) -> bool: ...
+ def __ne__(self, o: object) -> bool: ...
+ def __str__(self) -> str: ...
+ def __repr__(self) -> str: ...
+ def __hash__(self) -> int: ...
+ def __format__(self, format_spec: str) -> str: ...
+ def __getattribute__(self, name: str) -> Any: ...
+ def __delattr__(self, name: str) -> None: ...
+
+class type:
+ __bases__ = ... # type: Tuple[type, ...]
+ __name__ = ... # type: str
+ __module__ = ... # type: str
+ __dict__ = ... # type: Dict[unicode, Any]
+
+ @overload
+ def __init__(self, o: object) -> None: ...
+ @overload
+ def __init__(self, name: str, bases: Tuple[type, ...], dict: Dict[str, Any]) -> None: ...
+ # TODO: __new__ may have to be special and not a static method.
+ @overload
+ def __new__(cls, o: object) -> type: ...
+ @overload
+ def __new__(cls, name: str, bases: Tuple[type, ...], namespace: Dict[str, Any]) -> type: ...
+ def __call__(self, *args: Any, **kwds: Any) -> Any: ...
+
+ # Only new-style classes
+ __mro__ = ... # type: Tuple[type, ...]
+ # Note: the documentation doesnt specify what the return type is, the standard
+ # implementation seems to be returning a list.
+ def mro(self) -> List[type]: ...
+ def __subclasses__(self: _TT) -> List[_TT]: ...
+
+class int(SupportsInt, SupportsFloat, SupportsAbs[int]):
+ @overload
+ def __init__(self) -> None: ...
+ @overload
+ def __init__(self, x: SupportsInt) -> None: ...
+ @overload
+ def __init__(self, x: Union[str, unicode, bytearray], base: int = 10) -> None: ...
+ def bit_length(self) -> int: ...
+
+ def __add__(self, x: int) -> int: ...
+ def __sub__(self, x: int) -> int: ...
+ def __mul__(self, x: int) -> int: ...
+ def __floordiv__(self, x: int) -> int: ...
+ def __div__(self, x: int) -> int: ...
+ def __truediv__(self, x: int) -> float: ...
+ def __mod__(self, x: int) -> int: ...
+ def __radd__(self, x: int) -> int: ...
+ def __rsub__(self, x: int) -> int: ...
+ def __rmul__(self, x: int) -> int: ...
+ def __rfloordiv__(self, x: int) -> int: ...
+ def __rdiv__(self, x: int) -> int: ...
+ def __rtruediv__(self, x: int) -> float: ...
+ def __rmod__(self, x: int) -> int: ...
+ def __pow__(self, x: int) -> Any: ... # Return type can be int or float, depending on x.
+ def __rpow__(self, x: int) -> Any: ...
+ def __and__(self, n: int) -> int: ...
+ def __or__(self, n: int) -> int: ...
+ def __xor__(self, n: int) -> int: ...
+ def __lshift__(self, n: int) -> int: ...
+ def __rshift__(self, n: int) -> int: ...
+ def __rand__(self, n: int) -> int: ...
+ def __ror__(self, n: int) -> int: ...
+ def __rxor__(self, n: int) -> int: ...
+ def __rlshift__(self, n: int) -> int: ...
+ def __rrshift__(self, n: int) -> int: ...
+ def __neg__(self) -> int: ...
+ def __pos__(self) -> int: ...
+ def __invert__(self) -> int: ...
+
+ def __eq__(self, x: object) -> bool: ...
+ def __ne__(self, x: object) -> bool: ...
+ def __lt__(self, x: int) -> bool: ...
+ def __le__(self, x: int) -> bool: ...
+ def __gt__(self, x: int) -> bool: ...
+ def __ge__(self, x: int) -> bool: ...
+
+ def __str__(self) -> str: ...
+ def __float__(self) -> float: ...
+ def __int__(self) -> int: ...
+ def __abs__(self) -> int: ...
+ def __hash__(self) -> int: ...
+
+class float(SupportsFloat, SupportsInt, SupportsAbs[float]):
+ @overload
+ def __init__(self) -> None: ...
+ @overload
+ def __init__(self, x: SupportsFloat) -> None: ...
+ @overload
+ def __init__(self, x: unicode) -> None: ...
+ @overload
+ def __init__(self, x: bytearray) -> None: ...
+ def as_integer_ratio(self) -> Tuple[int, int]: ...
+ def hex(self) -> str: ...
+ def is_integer(self) -> bool: ...
+ @classmethod
+ def fromhex(cls, s: str) -> float: ...
+
+ def __add__(self, x: float) -> float: ...
+ def __sub__(self, x: float) -> float: ...
+ def __mul__(self, x: float) -> float: ...
+ def __floordiv__(self, x: float) -> float: ...
+ def __div__(self, x: float) -> float: ...
+ def __truediv__(self, x: float) -> float: ...
+ def __mod__(self, x: float) -> float: ...
+ def __pow__(self, x: float) -> float: ...
+ def __radd__(self, x: float) -> float: ...
+ def __rsub__(self, x: float) -> float: ...
+ def __rmul__(self, x: float) -> float: ...
+ def __rfloordiv__(self, x: float) -> float: ...
+ def __rdiv__(self, x: float) -> float: ...
+ def __rtruediv__(self, x: float) -> float: ...
+ def __rmod__(self, x: float) -> float: ...
+ def __rpow__(self, x: float) -> float: ...
+
+ def __eq__(self, x: object) -> bool: ...
+ def __ne__(self, x: object) -> bool: ...
+ def __lt__(self, x: float) -> bool: ...
+ def __le__(self, x: float) -> bool: ...
+ def __gt__(self, x: float) -> bool: ...
+ def __ge__(self, x: float) -> bool: ...
+ def __neg__(self) -> float: ...
+ def __pos__(self) -> float: ...
+
+ def __str__(self) -> str: ...
+ def __int__(self) -> int: ...
+ def __float__(self) -> float: ...
+ def __abs__(self) -> float: ...
+ def __hash__(self) -> int: ...
+
+class complex(SupportsAbs[float]):
+ @overload
+ def __init__(self, re: float = 0.0, im: float = 0.0) -> None: ...
+ @overload
+ def __init__(self, s: str) -> None: ...
+
+ @property
+ def real(self) -> float: ...
+ @property
+ def imag(self) -> float: ...
+
+ def conjugate(self) -> complex: ...
+
+ def __add__(self, x: complex) -> complex: ...
+ def __sub__(self, x: complex) -> complex: ...
+ def __mul__(self, x: complex) -> complex: ...
+ def __pow__(self, x: complex) -> complex: ...
+ def __div__(self, x: complex) -> complex: ...
+ def __truediv__(self, x: complex) -> complex: ...
+ def __radd__(self, x: complex) -> complex: ...
+ def __rsub__(self, x: complex) -> complex: ...
+ def __rmul__(self, x: complex) -> complex: ...
+ def __rpow__(self, x: complex) -> complex: ...
+ def __rdiv__(self, x: complex) -> complex: ...
+ def __rtruediv__(self, x: complex) -> complex: ...
+
+ def __eq__(self, x: object) -> bool: ...
+ def __ne__(self, x: object) -> bool: ...
+ def __neg__(self) -> complex: ...
+ def __pos__(self) -> complex: ...
+
+ def __str__(self) -> str: ...
+ def __abs__(self) -> float: ...
+ def __hash__(self) -> int: ...
+
+class basestring(metaclass=ABCMeta): ...
+
+class unicode(basestring, Sequence[unicode]):
+ @overload
+ def __init__(self) -> None: ...
+ @overload
+ def __init__(self, o: object) -> None: ...
+ @overload
+ def __init__(self, o: str, encoding: unicode = ..., errors: unicode = ...) -> None: ...
+ def capitalize(self) -> unicode: ...
+ def center(self, width: int, fillchar: unicode = u' ') -> unicode: ...
+ def count(self, x: unicode) -> int: ...
+ def decode(self, encoding: unicode = ..., errors: unicode = ...) -> unicode: ...
+ def encode(self, encoding: unicode = ..., errors: unicode = ...) -> str: ...
+ def endswith(self, suffix: Union[unicode, Tuple[unicode, ...]], start: int = 0,
+ end: int = ...) -> bool: ...
+ def expandtabs(self, tabsize: int = 8) -> unicode: ...
+ def find(self, sub: unicode, start: int = 0, end: int = 0) -> int: ...
+ def format(self, *args: Any, **kwargs: Any) -> unicode: ...
+ def format_map(self, map: Mapping[unicode, Any]) -> unicode: ...
+ def index(self, sub: unicode, start: int = 0, end: int = 0) -> int: ...
+ def isalnum(self) -> bool: ...
+ def isalpha(self) -> bool: ...
+ def isdecimal(self) -> bool: ...
+ def isdigit(self) -> bool: ...
+ def isidentifier(self) -> bool: ...
+ def islower(self) -> bool: ...
+ def isnumeric(self) -> bool: ...
+ def isprintable(self) -> bool: ...
+ def isspace(self) -> bool: ...
+ def istitle(self) -> bool: ...
+ def isupper(self) -> bool: ...
+ def join(self, iterable: Iterable[unicode]) -> unicode: ...
+ def ljust(self, width: int, fillchar: unicode = u' ') -> unicode: ...
+ def lower(self) -> unicode: ...
+ def lstrip(self, chars: unicode = ...) -> unicode: ...
+ def partition(self, sep: unicode) -> Tuple[unicode, unicode, unicode]: ...
+ def replace(self, old: unicode, new: unicode, count: int = ...) -> unicode: ...
+ def rfind(self, sub: unicode, start: int = 0, end: int = 0) -> int: ...
+ def rindex(self, sub: unicode, start: int = 0, end: int = 0) -> int: ...
+ def rjust(self, width: int, fillchar: unicode = u' ') -> unicode: ...
+ def rpartition(self, sep: unicode) -> Tuple[unicode, unicode, unicode]: ...
+ def rsplit(self, sep: Optional[unicode] = ..., maxsplit: int = ...) -> List[unicode]: ...
+ def rstrip(self, chars: unicode = ...) -> unicode: ...
+ def split(self, sep: Optional[unicode] = ..., maxsplit: int = ...) -> List[unicode]: ...
+ def splitlines(self, keepends: bool = ...) -> List[unicode]: ...
+ def startswith(self, prefix: Union[unicode, Tuple[unicode, ...]], start: int = 0,
+ end: int = ...) -> bool: ...
+ def strip(self, chars: unicode = ...) -> unicode: ...
+ def swapcase(self) -> unicode: ...
+ def title(self) -> unicode: ...
+ def translate(self, table: Union[Dict[int, Any], unicode]) -> unicode: ...
+ def upper(self) -> unicode: ...
+ def zfill(self, width: int) -> unicode: ...
+
+ @overload
+ def __getitem__(self, i: int) -> unicode: ...
+ @overload
+ def __getitem__(self, s: slice) -> unicode: ...
+ def __getslice__(self, start: int, stop: int) -> unicode: ...
+ def __add__(self, s: unicode) -> unicode: ...
+ def __mul__(self, n: int) -> unicode: ...
+ def __mod__(self, x: Any) -> unicode: ...
+ def __eq__(self, x: object) -> bool: ...
+ def __ne__(self, x: object) -> bool: ...
+ def __lt__(self, x: unicode) -> bool: ...
+ def __le__(self, x: unicode) -> bool: ...
+ def __gt__(self, x: unicode) -> bool: ...
+ def __ge__(self, x: unicode) -> bool: ...
+
+ def __len__(self) -> int: ...
+ def __contains__(self, s: object) -> bool: ...
+ def __iter__(self) -> Iterator[unicode]: ...
+ def __str__(self) -> str: ...
+ def __repr__(self) -> str: ...
+ def __int__(self) -> int: ...
+ def __float__(self) -> float: ...
+ def __hash__(self) -> int: ...
+
+class str(basestring, Sequence[str]):
+ def __init__(self, object: object) -> None: ...
+ def capitalize(self) -> str: ...
+ def center(self, width: int, fillchar: str = ...) -> str: ...
+ def count(self, x: unicode) -> int: ...
+ def decode(self, encoding: unicode = ..., errors: unicode = ...) -> unicode: ...
+ def encode(self, encoding: unicode = ..., errors: unicode = ...) -> str: ...
+ def endswith(self, suffix: Union[unicode, Tuple[unicode, ...]]) -> bool: ...
+ def expandtabs(self, tabsize: int = 8) -> str: ...
+ def find(self, sub: unicode, start: int = 0, end: int = 0) -> int: ...
+ def format(self, *args: Any, **kwargs: Any) -> str: ...
+ def index(self, sub: unicode, start: int = 0, end: int = 0) -> int: ...
+ def isalnum(self) -> bool: ...
+ def isalpha(self) -> bool: ...
+ def isdigit(self) -> bool: ...
+ def islower(self) -> bool: ...
+ def isspace(self) -> bool: ...
+ def istitle(self) -> bool: ...
+ def isupper(self) -> bool: ...
+ def join(self, iterable: Iterable[AnyStr]) -> AnyStr: ...
+ def ljust(self, width: int, fillchar: str = ...) -> str: ...
+ def lower(self) -> str: ...
+ @overload
+ def lstrip(self, chars: str = ...) -> str: ...
+ @overload
+ def lstrip(self, chars: unicode) -> unicode: ...
+ @overload
+ def partition(self, sep: bytearray) -> Tuple[str, bytearray, str]: ...
+ @overload
+ def partition(self, sep: str) -> Tuple[str, str, str]: ...
+ @overload
+ def partition(self, sep: unicode) -> Tuple[unicode, unicode, unicode]: ...
+ def replace(self, old: AnyStr, new: AnyStr, count: int = ...) -> AnyStr: ...
+ def rfind(self, sub: unicode, start: int = 0, end: int = 0) -> int: ...
+ def rindex(self, sub: unicode, start: int = 0, end: int = 0) -> int: ...
+ def rjust(self, width: int, fillchar: str = ...) -> str: ...
+ @overload
+ def rpartition(self, sep: bytearray) -> Tuple[str, bytearray, str]: ...
+ @overload
+ def rpartition(self, sep: str) -> Tuple[str, str, str]: ...
+ @overload
+ def rpartition(self, sep: unicode) -> Tuple[unicode, unicode, unicode]: ...
+ @overload
+ def rsplit(self, sep: Optional[str] = ..., maxsplit: int = ...) -> List[str]: ...
+ @overload
+ def rsplit(self, sep: unicode, maxsplit: int = ...) -> List[unicode]: ...
+ @overload
+ def rstrip(self, chars: str = ...) -> str: ...
+ @overload
+ def rstrip(self, chars: unicode) -> unicode: ...
+ @overload
+ def split(self, sep: Optional[str] = ..., maxsplit: int = ...) -> List[str]: ...
+ @overload
+ def split(self, sep: unicode, maxsplit: int = ...) -> List[unicode]: ...
+ def splitlines(self, keepends: bool = ...) -> List[str]: ...
+ def startswith(self, prefix: Union[unicode, Tuple[unicode, ...]]) -> bool: ...
+ @overload
+ def strip(self, chars: str = ...) -> str: ...
+ @overload
+ def strip(self, chars: unicode) -> unicode: ...
+ def swapcase(self) -> str: ...
+ def title(self) -> str: ...
+ def translate(self, table: Optional[AnyStr], deletechars: AnyStr = ...) -> AnyStr: ...
+ def upper(self) -> str: ...
+ def zfill(self, width: int) -> str: ...
+
+ def __len__(self) -> int: ...
+ def __iter__(self) -> Iterator[str]: ...
+ def __str__(self) -> str: ...
+ def __repr__(self) -> str: ...
+ def __int__(self) -> int: ...
+ def __float__(self) -> float: ...
+ def __hash__(self) -> int: ...
+ @overload
+ def __getitem__(self, i: int) -> str: ...
+ @overload
+ def __getitem__(self, s: slice) -> str: ...
+ def __getslice__(self, start: int, stop: int) -> str: ...
+ def __add__(self, s: AnyStr) -> AnyStr: ...
+ def __mul__(self, n: int) -> str: ...
+ def __rmul__(self, n: int) -> str: ...
+ def __contains__(self, o: object) -> bool: ...
+ def __eq__(self, x: object) -> bool: ...
+ def __ne__(self, x: object) -> bool: ...
+ def __lt__(self, x: unicode) -> bool: ...
+ def __le__(self, x: unicode) -> bool: ...
+ def __gt__(self, x: unicode) -> bool: ...
+ def __ge__(self, x: unicode) -> bool: ...
+ def __mod__(self, x: Any) -> str: ...
+
+class bytearray(MutableSequence[int]):
+ @overload
+ def __init__(self) -> None: ...
+ @overload
+ def __init__(self, x: Union[Iterable[int], str]) -> None: ...
+ @overload
+ def __init__(self, x: unicode, encoding: unicode,
+ errors: unicode = ...) -> None: ...
+ @overload
+ def __init__(self, length: int) -> None: ...
+ def capitalize(self) -> bytearray: ...
+ def center(self, width: int, fillchar: str = ...) -> bytearray: ...
+ def count(self, x: str) -> int: ...
+ def decode(self, encoding: unicode = ..., errors: unicode = ...) -> str: ...
+ def endswith(self, suffix: Union[str, Tuple[str, ...]]) -> bool: ...
+ def expandtabs(self, tabsize: int = 8) -> bytearray: ...
+ def find(self, sub: str, start: int = 0, end: int = ...) -> int: ...
+ def index(self, sub: str, start: int = 0, end: int = ...) -> int: ...
+ def insert(self, index: int, object: int) -> None: ...
+ def isalnum(self) -> bool: ...
+ def isalpha(self) -> bool: ...
+ def isdigit(self) -> bool: ...
+ def islower(self) -> bool: ...
+ def isspace(self) -> bool: ...
+ def istitle(self) -> bool: ...
+ def isupper(self) -> bool: ...
+ def join(self, iterable: Iterable[str]) -> bytearray: ...
+ def ljust(self, width: int, fillchar: str = ...) -> bytearray: ...
+ def lower(self) -> bytearray: ...
+ def lstrip(self, chars: str = ...) -> bytearray: ...
+ def partition(self, sep: str) -> Tuple[bytearray, bytearray, bytearray]: ...
+ def replace(self, old: str, new: str, count: int = ...) -> bytearray: ...
+ def rfind(self, sub: str, start: int = 0, end: int = ...) -> int: ...
+ def rindex(self, sub: str, start: int = 0, end: int = ...) -> int: ...
+ def rjust(self, width: int, fillchar: str = ...) -> bytearray: ...
+ def rpartition(self, sep: str) -> Tuple[bytearray, bytearray, bytearray]: ...
+ def rsplit(self, sep: Optional[str] = ..., maxsplit: int = ...) -> List[bytearray]: ...
+ def rstrip(self, chars: str = ...) -> bytearray: ...
+ def split(self, sep: Optional[str] = ..., maxsplit: int = ...) -> List[bytearray]: ...
+ def splitlines(self, keepends: bool = ...) -> List[bytearray]: ...
+ def startswith(self, prefix: Union[str, Tuple[str, ...]]) -> bool: ...
+ def strip(self, chars: str = ...) -> bytearray: ...
+ def swapcase(self) -> bytearray: ...
+ def title(self) -> bytearray: ...
+ def translate(self, table: str) -> bytearray: ...
+ def upper(self) -> bytearray: ...
+ def zfill(self, width: int) -> bytearray: ...
+ @staticmethod
+ def fromhex(x: str) -> bytearray: ...
+
+ def __len__(self) -> int: ...
+ def __iter__(self) -> Iterator[int]: ...
+ def __str__(self) -> str: ...
+ def __repr__(self) -> str: ...
+ def __int__(self) -> int: ...
+ def __float__(self) -> float: ...
+ def __hash__(self) -> int: ...
+ @overload
+ def __getitem__(self, i: int) -> int: ...
+ @overload
+ def __getitem__(self, s: slice) -> bytearray: ...
+ def __getslice__(self, start: int, stop: int) -> bytearray: ...
+ @overload
+ def __setitem__(self, i: int, x: int) -> None: ...
+ @overload
+ def __setitem__(self, s: slice, x: Union[Iterable[int], str]) -> None: ...
+ def __setslice__(self, start: int, stop: int, x: Union[Sequence[int], str]) -> None: ...
+ def __delitem__(self, i: Union[int, slice]) -> None: ...
+ def __delslice__(self, start: int, stop: int) -> None: ...
+ def __add__(self, s: str) -> bytearray: ...
+ def __mul__(self, n: int) -> bytearray: ...
+ def __contains__(self, o: object) -> bool: ...
+ def __eq__(self, x: object) -> bool: ...
+ def __ne__(self, x: object) -> bool: ...
+ def __lt__(self, x: str) -> bool: ...
+ def __le__(self, x: str) -> bool: ...
+ def __gt__(self, x: str) -> bool: ...
+ def __ge__(self, x: str) -> bool: ...
+
+class bool(int, SupportsInt, SupportsFloat):
+ def __init__(self, o: object = ...) -> None: ...
+
+class slice:
+ start = 0
+ step = 0
+ stop = 0
+ def __init__(self, start: int, stop: int = 0, step: int = 0) -> None: ...
+
+class tuple(Sequence[_T_co], Generic[_T_co]):
+ def __init__(self, iterable: Iterable[_T_co] = ...) -> None: ...
+ def __len__(self) -> int: ...
+ def __contains__(self, x: object) -> bool: ...
+ @overload
+ def __getitem__(self, x: int) -> _T_co: ...
+ @overload
+ def __getitem__(self, x: slice) -> Tuple[_T_co, ...]: ...
+ def __iter__(self) -> Iterator[_T_co]: ...
+ def __lt__(self, x: Tuple[_T_co, ...]) -> bool: ...
+ def __le__(self, x: Tuple[_T_co, ...]) -> bool: ...
+ def __gt__(self, x: Tuple[_T_co, ...]) -> bool: ...
+ def __ge__(self, x: Tuple[_T_co, ...]) -> bool: ...
+ def __add__(self, x: Tuple[_T_co, ...]) -> Tuple[_T_co, ...]: ...
+ def __mul__(self, n: int) -> Tuple[_T_co, ...]: ...
+ def __rmul__(self, n: int) -> Tuple[_T_co, ...]: ...
+ def count(self, x: Any) -> int: ...
+ def index(self, x: Any) -> int: ...
+
+class function:
+ # TODO name of the class (corresponds to Python 'function' class)
+ __name__ = ... # type: str
+ __module__ = ... # type: str
+
+class list(MutableSequence[_T], Generic[_T]):
+ @overload
+ def __init__(self) -> None: ...
+ @overload
+ def __init__(self, iterable: Iterable[_T]) -> None: ...
+ def append(self, object: _T) -> None: ...
+ def extend(self, iterable: Iterable[_T]) -> None: ...
+ def pop(self, index: int = -1) -> _T: ...
+ def index(self, object: _T, start: int = 0, stop: int = ...) -> int: ...
+ def count(self, object: _T) -> int: ...
+ def insert(self, index: int, object: _T) -> None: ...
+ def remove(self, object: _T) -> None: ...
+ def reverse(self) -> None: ...
+ def sort(self, cmp: Callable[[_T, _T], Any] = ..., key: Callable[[_T], Any] = ..., reverse: bool = ...) -> None: ...
+
+ def __len__(self) -> int: ...
+ def __iter__(self) -> Iterator[_T]: ...
+ def __str__(self) -> str: ...
+ def __hash__(self) -> int: ...
+ @overload
+ def __getitem__(self, i: int) -> _T: ...
+ @overload
+ def __getitem__(self, s: slice) -> List[_T]: ...
+ def __getslice__(self, start: int, stop: int) -> List[_T]: ...
+ @overload
+ def __setitem__(self, i: int, o: _T) -> None: ...
+ @overload
+ def __setitem__(self, s: slice, o: Iterable[_T]) -> None: ...
+ def __setslice__(self, start: int, stop: int, o: Sequence[_T]) -> None: ...
+ def __delitem__(self, i: Union[int, slice]) -> None: ...
+ def __delslice__(self, start: int, stop: int) -> None: ...
+ def __add__(self, x: List[_T]) -> List[_T]: ...
+ def __iadd__(self, x: Iterable[_T]) -> List[_T]: ...
+ def __mul__(self, n: int) -> List[_T]: ...
+ def __rmul__(self, n: int) -> List[_T]: ...
+ def __contains__(self, o: object) -> bool: ...
+ def __reversed__(self) -> Iterator[_T]: ...
+ def __gt__(self, x: List[_T]) -> bool: ...
+ def __ge__(self, x: List[_T]) -> bool: ...
+ def __lt__(self, x: List[_T]) -> bool: ...
+ def __le__(self, x: List[_T]) -> bool: ...
+
+class dict(MutableMapping[_KT, _VT], Generic[_KT, _VT]):
+ # NOTE: Keyword arguments are special. If they are used, _KT must include
+ # str, but we have no way of enforcing it here.
+ @overload
+ def __init__(self, **kwargs: _VT) -> None: ...
+ @overload
+ def __init__(self, map: Mapping[_KT, _VT], **kwargs: _VT) -> None: ...
+ @overload
+ def __init__(self, iterable: Iterable[Tuple[_KT, _VT]], **kwargs: _VT) -> None: ...
+
+ def has_key(self, k: _KT) -> bool: ...
+ def clear(self) -> None: ...
+ def copy(self) -> Dict[_KT, _VT]: ...
+ def get(self, k: _KT, default: _VT = None) -> _VT: ...
+ def pop(self, k: _KT, default: _VT = ...) -> _VT: ...
+ def popitem(self) -> Tuple[_KT, _VT]: ...
+ def setdefault(self, k: _KT, default: _VT = ...) -> _VT: ...
+ @overload
+ def update(self, m: Mapping[_KT, _VT], **kwargs: _VT) -> None: ...
+ @overload
+ def update(self, m: Iterable[Tuple[_KT, _VT]], **kwargs: _VT) -> None: ...
+ def keys(self) -> List[_KT]: ...
+ def values(self) -> List[_VT]: ...
+ def items(self) -> List[Tuple[_KT, _VT]]: ...
+ def iterkeys(self) -> Iterator[_KT]: ...
+ def itervalues(self) -> Iterator[_VT]: ...
+ def iteritems(self) -> Iterator[Tuple[_KT, _VT]]: ...
+ def viewkeys(self) -> KeysView[_KT]: ...
+ def viewvalues(self) -> ValuesView[_VT]: ...
+ def viewitems(self) -> ItemsView[_KT, _VT]: ...
+ @staticmethod
+ @overload
+ def fromkeys(seq: Sequence[_T]) -> Dict[_T, Any]: ... # TODO: Actually a class method (mypy/issues#328)
+ @staticmethod
+ @overload
+ def fromkeys(seq: Sequence[_T], value: _S) -> Dict[_T, _S]: ...
+ def __len__(self) -> int: ...
+ def __getitem__(self, k: _KT) -> _VT: ...
+ def __setitem__(self, k: _KT, v: _VT) -> None: ...
+ def __delitem__(self, v: _KT) -> None: ...
+ def __contains__(self, o: object) -> bool: ...
+ def __iter__(self) -> Iterator[_KT]: ...
+ def __str__(self) -> str: ...
+
+class set(MutableSet[_T], Generic[_T]):
+ def __init__(self, iterable: Iterable[_T] = ...) -> None: ...
+ def add(self, element: _T) -> None: ...
+ def clear(self) -> None: ...
+ def copy(self) -> set[_T]: ...
+ def difference(self, *s: Iterable[Any]) -> set[_T]: ...
+ def difference_update(self, *s: Iterable[Any]) -> None: ...
+ def discard(self, element: _T) -> None: ...
+ def intersection(self, *s: Iterable[Any]) -> set[_T]: ...
+ def intersection_update(self, *s: Iterable[Any]) -> None: ...
+ def isdisjoint(self, s: Iterable[Any]) -> bool: ...
+ def issubset(self, s: Iterable[Any]) -> bool: ...
+ def issuperset(self, s: Iterable[Any]) -> bool: ...
+ def pop(self) -> _T: ...
+ def remove(self, element: _T) -> None: ...
+ def symmetric_difference(self, s: Iterable[_T]) -> set[_T]: ...
+ def symmetric_difference_update(self, s: Iterable[_T]) -> None: ...
+ def union(self, *s: Iterable[_T]) -> set[_T]: ...
+ def update(self, *s: Iterable[_T]) -> None: ...
+ def __len__(self) -> int: ...
+ def __contains__(self, o: object) -> bool: ...
+ def __iter__(self) -> Iterator[_T]: ...
+ def __str__(self) -> str: ...
+ def __and__(self, s: AbstractSet[Any]) -> set[_T]: ...
+ def __iand__(self, s: AbstractSet[Any]) -> set[_T]: ...
+ def __or__(self, s: AbstractSet[_S]) -> set[Union[_T, _S]]: ...
+ def __ior__(self, s: AbstractSet[_S]) -> set[Union[_T, _S]]: ...
+ def __sub__(self, s: AbstractSet[Any]) -> set[_T]: ...
+ def __isub__(self, s: AbstractSet[Any]) -> set[_T]: ...
+ def __xor__(self, s: AbstractSet[_S]) -> set[Union[_T, _S]]: ...
+ def __ixor__(self, s: AbstractSet[_S]) -> set[Union[_T, _S]]: ...
+ def __le__(self, s: AbstractSet[Any]) -> bool: ...
+ def __lt__(self, s: AbstractSet[Any]) -> bool: ...
+ def __ge__(self, s: AbstractSet[Any]) -> bool: ...
+ def __gt__(self, s: AbstractSet[Any]) -> bool: ...
+ # TODO more set operations
+
+class frozenset(FrozenSet[_T], Generic[_T]):
+ @overload
+ def __init__(self) -> None: ...
+ @overload
+ def __init__(self, iterable: Iterable[_T]) -> None: ...
+ def copy(self) -> frozenset[_T]: ...
+ def difference(self, *s: Iterable[Any]) -> frozenset[_T]: ...
+ def intersection(self, *s: Iterable[Any]) -> frozenset[_T]: ...
+ def isdisjoint(self, s: Iterable[_T]) -> bool: ...
+ def issubset(self, s: Iterable[Any]) -> bool: ...
+ def issuperset(self, s: Iterable[Any]) -> bool: ...
+ def symmetric_difference(self, s: Iterable[_T]) -> frozenset[_T]: ...
+ def union(self, *s: Iterable[_T]) -> frozenset[_T]: ...
+ def __len__(self) -> int: ...
+ def __contains__(self, o: object) -> bool: ...
+ def __iter__(self) -> Iterator[_T]: ...
+ def __str__(self) -> str: ...
+ def __and__(self, s: AbstractSet[_T]) -> frozenset[_T]: ...
+ def __or__(self, s: AbstractSet[_S]) -> frozenset[Union[_T, _S]]: ...
+ def __sub__(self, s: AbstractSet[_T]) -> frozenset[_T]: ...
+ def __xor__(self, s: AbstractSet[_S]) -> frozenset[Union[_T, _S]]: ...
+ def __le__(self, s: AbstractSet[Any]) -> bool: ...
+ def __lt__(self, s: AbstractSet[Any]) -> bool: ...
+ def __ge__(self, s: AbstractSet[Any]) -> bool: ...
+ def __gt__(self, s: AbstractSet[Any]) -> bool: ...
+
+class enumerate(Iterator[Tuple[int, _T]], Generic[_T]):
+ def __init__(self, iterable: Iterable[_T], start: int = 0) -> None: ...
+ def __iter__(self) -> Iterator[Tuple[int, _T]]: ...
+ def next(self) -> Tuple[int, _T]: ...
+ # TODO __getattribute__
+
+class xrange(Sized, Iterable[int], Reversible[int]):
+ @overload
+ def __init__(self, stop: int) -> None: ...
+ @overload
+ def __init__(self, start: int, stop: int, step: int = 1) -> None: ...
+ def __len__(self) -> int: ...
+ def __iter__(self) -> Iterator[int]: ...
+ def __getitem__(self, i: int) -> int: ...
+ def __reversed__(self) -> Iterator[int]: ...
+
+class module:
+ __name__ = ... # type: str
+ __file__ = ... # type: str
+ __dict__ = ... # type: Dict[unicode, Any]
+
+class property:
+ def __init__(self, fget: Callable[[Any], Any] = None,
+ fset: Callable[[Any, Any], None] = None,
+ fdel: Callable[[Any], None] = None, doc: str = None) -> None: ...
+ def getter(self, fget: Callable[[Any], Any]) -> property: ...
+ def setter(self, fset: Callable[[Any, Any], None]) -> property: ...
+ def deleter(self, fdel: Callable[[Any], None]) -> property: ...
+ def __get__(self, obj: Any, type: type=None) -> Any: ...
+ def __set__(self, obj: Any, value: Any) -> None: ...
+ def __delete__(self, obj: Any) -> None: ...
+
+long = int
+bytes = str
+
+NotImplemented = ... # type: Any
+
+def abs(n: SupportsAbs[_T]) -> _T: ...
+def all(i: Iterable) -> bool: ...
+def any(i: Iterable) -> bool: ...
+def bin(number: int) -> str: ...
+def callable(o: object) -> bool: ...
+def chr(code: int) -> str: ...
+def compile(source: Any, filename: unicode, mode: str, flags: int = 0,
+ dont_inherit: int = 0) -> Any: ...
+def delattr(o: Any, name: unicode) -> None: ...
+def dir(o: object = ...) -> List[str]: ...
+ at overload
+def divmod(a: int, b: int) -> Tuple[int, int]: ...
+ at overload
+def divmod(a: float, b: float) -> Tuple[float, float]: ...
+def exit(code: int = ...) -> NoReturn: ...
+ at overload
+def filter(function: Callable[[_T], Any],
+ iterable: Iterable[_T]) -> List[_T]: ...
+ at overload
+def filter(function: None,
+ iterable: Iterable[Optional[_T]]) -> List[_T]: ...
+def format(o: object, format_spec: str = '') -> str: ... # TODO unicode
+def getattr(o: Any, name: unicode, default: Any = None) -> Any: ...
+def hasattr(o: Any, name: unicode) -> bool: ...
+def hash(o: object) -> int: ...
+def hex(i: int) -> str: ... # TODO __index__
+def id(o: object) -> int: ...
+def input(prompt: unicode = ...) -> Any: ...
+def intern(string: str) -> str: ...
+ at overload
+def iter(iterable: Iterable[_T]) -> Iterator[_T]: ...
+ at overload
+def iter(function: Callable[[], _T], sentinel: _T) -> Iterator[_T]: ...
+def isinstance(o: object, t: Union[type, Tuple[type, ...]]) -> bool: ...
+def issubclass(cls: type, classinfo: Union[type, Tuple[type, ...]]) -> bool: ...
+def len(o: Sized) -> int: ...
+ at overload
+def map(func: Callable[[_T1], _S], iter1: Iterable[_T1]) -> List[_S]: ...
+ at overload
+def map(func: Callable[[_T1, _T2], _S],
+ iter1: Iterable[_T1],
+ iter2: Iterable[_T2]) -> List[_S]: ... # TODO more than two iterables
+ at overload
+def max(arg1: _T, arg2: _T, *args: _T, key: Callable[[_T], Any] = ...) -> _T: ...
+ at overload
+def max(iterable: Iterable[_T], key: Callable[[_T], Any] = ...) -> _T: ...
+ at overload
+def min(arg1: _T, arg2: _T, *args: _T, key: Callable[[_T], Any] = ...) -> _T: ...
+ at overload
+def min(iterable: Iterable[_T], key: Callable[[_T], Any] = ...) -> _T: ...
+ at overload
+def next(i: Iterator[_T]) -> _T: ...
+ at overload
+def next(i: Iterator[_T], default: _T) -> _T: ...
+def oct(i: int) -> str: ... # TODO __index__
+ at overload
+def open(file: str, mode: str = 'r', buffering: int = ...) -> BinaryIO: ...
+ at overload
+def open(file: unicode, mode: str = 'r', buffering: int = ...) -> BinaryIO: ...
+ at overload
+def open(file: int, mode: str = 'r', buffering: int = ...) -> BinaryIO: ...
+def ord(c: unicode) -> int: ...
+# This is only available after from __future__ import print_function.
+def print(*values: Any, sep: unicode = u' ', end: unicode = u'\n',
+ file: IO[Any] = ...) -> None: ...
+ at overload
+def pow(x: int, y: int) -> Any: ... # The return type can be int or float, depending on y.
+ at overload
+def pow(x: int, y: int, z: int) -> Any: ...
+ at overload
+def pow(x: float, y: float) -> float: ...
+ at overload
+def pow(x: float, y: float, z: float) -> float: ...
+def quit(code: int = ...) -> None: ...
+def range(x: int, y: int = 0, step: int = 1) -> List[int]: ...
+def raw_input(prompt: unicode = ...) -> str: ...
+
+ at overload
+def reduce(function: Callable[[_T, _S], _T], iterable: Iterable[_S], initializer: _T) -> _T: ...
+ at overload
+def reduce(function: Callable[[_T, _T], _T], iterable: Iterable[_T]) -> _T: ...
+
+def reload(module: Any) -> Any: ...
+ at overload
+def reversed(object: Reversible[_T]) -> Iterator[_T]: ...
+ at overload
+def reversed(object: Sequence[_T]) -> Iterator[_T]: ...
+def repr(o: object) -> str: ...
+ at overload
+def round(number: float) -> float: ...
+ at overload
+def round(number: float, ndigits: int) -> float: ... # Always return a float if given ndigits.
+ at overload
+def round(number: SupportsRound[_T]) -> _T: ...
+ at overload
+def round(number: SupportsRound[_T], ndigits: int) -> _T: ...
+def setattr(object: Any, name: unicode, value: Any) -> None: ...
+def sorted(iterable: Iterable[_T], *,
+ cmp: Callable[[_T, _T], int] = ...,
+ key: Callable[[_T], Any] = ...,
+ reverse: bool = ...) -> List[_T]: ...
+def sum(iterable: Iterable[_T], start: _T = ...) -> _T: ...
+def unichr(i: int) -> unicode: ...
+def vars(object: Any = ...) -> Dict[str, Any]: ...
+ at overload
+def zip(iter1: Iterable[_T1]) -> List[Tuple[_T1]]: ...
+ at overload
+def zip(iter1: Iterable[_T1],
+ iter2: Iterable[_T2]) -> List[Tuple[_T1, _T2]]: ...
+ at overload
+def zip(iter1: Iterable[_T1], iter2: Iterable[_T2],
+ iter3: Iterable[_T3]) -> List[Tuple[_T1, _T2, _T3]]: ...
+ at overload
+def zip(iter1: Iterable[_T1], iter2: Iterable[_T2], iter3: Iterable[_T3],
+ iter4: Iterable[_T4]) -> List[Tuple[_T1, _T2,
+ _T3, _T4]]: ... # TODO more than four iterables
+def __import__(name: unicode,
+ globals: Dict[str, Any] = ...,
+ locals: Dict[str, Any] = ...,
+ fromlist: List[str] = ..., level: int = ...) -> Any: ...
+
+def globals() -> Dict[str, Any]: ...
+def locals() -> Dict[str, Any]: ...
+
+# Actually the type of Ellipsis is <type 'ellipsis'>, but since it's
+# not exposed anywhere under that name, we make it private here.
+class ellipsis: ...
+Ellipsis = ... # type: ellipsis
+
+# TODO: buffer support is incomplete; e.g. some_string.startswith(some_buffer) doesn't type check.
+AnyBuffer = TypeVar('AnyBuffer', str, unicode, bytearray, buffer)
+
+class buffer(Sized):
+ def __init__(self, object: AnyBuffer, offset: int = ..., size: int = ...) -> None: ...
+ def __add__(self, other: AnyBuffer) -> str: ...
+ def __cmp__(self, other: AnyBuffer) -> bool: ...
+ def __getitem__(self, key: Union[int, slice]) -> str: ...
+ def __getslice__(self, i: int, j: int) -> str: ...
+ def __len__(self) -> int: ...
+ def __mul__(self, x: int) -> str: ...
+
+class memoryview(Sized, Container[bytes]):
+ format = ... # type: str
+ itemsize = ... # type: int
+ shape = ... # type: Optional[Tuple[int, ...]]
+ strides = ... # type: Optional[Tuple[int, ...]]
+ suboffsets = ... # type: Optional[Tuple[int, ...]]
+ readonly = ... # type: bool
+ ndim = ... # type: int
+
+ def __init__(self, obj: Union[str, bytearray, buffer, memoryview]) -> None: ...
+
+ @overload
+ def __getitem__(self, i: int) -> bytes: ...
+ @overload
+ def __getitem__(self, s: slice) -> memoryview: ...
+
+ def __contains__(self, x: object) -> bool: ...
+ def __iter__(self) -> Iterator[bytes]: ...
+ def __len__(self) -> int: ...
+
+ @overload
+ def __setitem__(self, i: int, o: bytes) -> None: ...
+ @overload
+ def __setitem__(self, s: slice, o: Sequence[bytes]) -> None: ...
+ @overload
+ def __setitem__(self, s: slice, o: memoryview) -> None: ...
+
+ def tobytes(self) -> bytes: ...
+ def tolist(self) -> List[int]: ...
+
+class BaseException:
+ args = ... # type: Tuple[Any, ...]
+ message = ... # type: str
+ def __init__(self, *args: Any) -> None: ...
+class GeneratorExit(BaseException): ...
+class KeyboardInterrupt(BaseException): ...
+class SystemExit(BaseException):
+ code = 0
+class Exception(BaseException): ...
+class StopIteration(Exception): ...
+class StandardError(Exception): ...
+class ArithmeticError(StandardError): ...
+class BufferError(StandardError): ...
+class EnvironmentError(StandardError):
+ errno = 0
+ strerror = ... # type: str
+ # TODO can this be unicode?
+ filename = ... # type: str
+class LookupError(StandardError): ...
+class RuntimeError(StandardError): ...
+class ValueError(StandardError): ...
+class AssertionError(StandardError): ...
+class AttributeError(StandardError): ...
+class EOFError(StandardError): ...
+class FloatingPointError(ArithmeticError): ...
+class IOError(EnvironmentError): ...
+class ImportError(StandardError): ...
+class IndexError(LookupError): ...
+class KeyError(LookupError): ...
+class MemoryError(StandardError): ...
+class NameError(StandardError): ...
+class NotImplementedError(RuntimeError): ...
+class OSError(EnvironmentError): ...
+class WindowsError(OSError):
+ winerror = ... # type: int
+class OverflowError(ArithmeticError): ...
+class ReferenceError(StandardError): ...
+class SyntaxError(StandardError):
+ msg = ... # type: str
+ lineno = ... # type: int
+ offset = ... # type: int
+ text = ... # type: str
+class IndentationError(SyntaxError): ...
+class TabError(IndentationError): ...
+class SystemError(StandardError): ...
+class TypeError(StandardError): ...
+class UnboundLocalError(NameError): ...
+class UnicodeError(ValueError): ...
+class UnicodeDecodeError(UnicodeError): ...
+class UnicodeEncodeError(UnicodeError): ...
+class UnicodeTranslateError(UnicodeError): ...
+class ZeroDivisionError(ArithmeticError): ...
+
+class Warning(Exception): ...
+class UserWarning(Warning): ...
+class DeprecationWarning(Warning): ...
+class SyntaxWarning(Warning): ...
+class RuntimeWarning(Warning): ...
+class FutureWarning(Warning): ...
+class PendingDeprecationWarning(Warning): ...
+class ImportWarning(Warning): ...
+class UnicodeWarning(Warning): ...
+class BytesWarning(Warning): ...
+class ResourceWarning(Warning): ...
+
+def eval(s: str, globals: Dict[str, Any] = ..., locals: Dict[str, Any] = ...) -> Any: ...
+def exec(object: str,
+ globals: Dict[str, Any] = None,
+ locals: Dict[str, Any] = None) -> Any: ... # TODO code object as source
+
+def cmp(x: Any, y: Any) -> int: ...
+
+def execfile(filename: str, globals: Dict[str, Any] = None, locals: Dict[str, Any] = None) -> None: ...
+
+class file(BinaryIO):
+ @overload
+ def __init__(self, file: str, mode: str = 'r', buffering: int = ...) -> None: ...
+ @overload
+ def __init__(self, file: unicode, mode: str = 'r', buffering: int = ...) -> None: ...
+ @overload
+ def __init__(self, file: int, mode: str = 'r', buffering: int = ...) -> None: ...
+ def __iter__(self) -> Iterator[str]: ...
+ def read(self, n: int = ...) -> str: ...
+ def __enter__(self) -> BinaryIO: ...
+ def __exit__(self, t: type = None, exc: BaseException = None, tb: Any = None) -> bool: ...
+ def flush(self) -> None: ...
+ def fileno(self) -> int: ...
+ def isatty(self) -> bool: ...
+ def close(self) -> None: ...
+
+ def readable(self) -> bool: ...
+ def writable(self) -> bool: ...
+ def seekable(self) -> bool: ...
+ def seek(self, offset: int, whence: int = ...) -> None: ...
+ def tell(self) -> int: ...
+ def readline(self, limit: int = ...) -> str: ...
+ def readlines(self, hint: int = ...) -> List[str]: ...
+ def write(self, data: str) -> None: ...
+ def writelines(self, data: Iterable[str]) -> None: ...
+ def truncate(self, pos: int = ...) -> int: ...
+
+# Very old builtins
+def apply(func: Callable[..., _T], args: Sequence[Any] = None, kwds: Mapping[str, Any] = None) -> _T: ...
+_N = TypeVar('_N', bool, int, float, complex)
+def coerce(x: _N, y: _N) -> Tuple[_N, _N]: ...
diff --git a/typeshed/stdlib/2/cPickle.pyi b/typeshed/stdlib/2/cPickle.pyi
new file mode 100644
index 0000000..fb129d1
--- /dev/null
+++ b/typeshed/stdlib/2/cPickle.pyi
@@ -0,0 +1,32 @@
+from typing import Any, IO, List
+
+HIGHEST_PROTOCOL = ... # type: int
+compatible_formats = ... # type: List[str]
+format_version = ... # type: str
+
+class Pickler:
+ def __init__(self, file: IO[str], protocol: int = ...) -> None: ...
+
+ def dump(self, obj: Any) -> None: ...
+
+ def clear_memo(self) -> None: ...
+
+
+class Unpickler:
+ def __init__(self, file: IO[str]) -> None: ...
+
+ def load(self) -> Any: ...
+
+ def noload(self) -> Any: ...
+
+
+def dump(obj: Any, file: IO[str], protocol: int = ...) -> None: ...
+def dumps(obj: Any, protocol: int = ...) -> str: ...
+def load(file: IO[str]) -> Any: ...
+def loads(str: str) -> Any: ...
+
+class PickleError(Exception): ...
+class UnpicklingError(PickleError): ...
+class BadPickleGet(UnpicklingError): ...
+class PicklingError(PickleError): ...
+class UnpickleableError(PicklingError): ...
diff --git a/typeshed/stdlib/2/cStringIO.pyi b/typeshed/stdlib/2/cStringIO.pyi
new file mode 100644
index 0000000..5b4ad25
--- /dev/null
+++ b/typeshed/stdlib/2/cStringIO.pyi
@@ -0,0 +1,50 @@
+# Stubs for cStringIO (Python 2.7)
+# See https://docs.python.org/2/library/stringio.html
+
+from typing import overload, IO, List, Iterable, Iterator, Optional, Union
+from types import TracebackType
+
+# TODO the typing.IO[] generics should be split into input and output.
+
+class InputType(IO[str], Iterator[str]):
+ def getvalue(self) -> str: ...
+ def close(self) -> None: ...
+ @property
+ def closed(self) -> bool: ...
+ def flush(self) -> None: ...
+ def isatty(self) -> bool: ...
+ def read(self, size: int = ...) -> str: ...
+ def readline(self, size: int = ...) -> str: ...
+ def readlines(self, hint: int = ...) -> List[str]: ...
+ def seek(self, offset: int, whence: int = ...) -> None: ...
+ def tell(self) -> int: ...
+ def truncate(self, size: int = ...) -> Optional[int]: ...
+ def __iter__(self) -> 'InputType': ...
+ def next(self) -> str: ...
+ def reset(self) -> None: ...
+
+class OutputType(IO[str], Iterator[str]):
+ @property
+ def softspace(self) -> int: ...
+ def getvalue(self) -> str: ...
+ def close(self) -> None: ...
+ @property
+ def closed(self) -> bool: ...
+ def flush(self) -> None: ...
+ def isatty(self) -> bool: ...
+ def read(self, size: int = ...) -> str: ...
+ def readline(self, size: int = ...) -> str: ...
+ def readlines(self, hint: int = ...) -> List[str]: ...
+ def seek(self, offset: int, whence: int = ...) -> None: ...
+ def tell(self) -> int: ...
+ def truncate(self, size: int = ...) -> Optional[int]: ...
+ def __iter__(self) -> 'OutputType': ...
+ def next(self) -> str: ...
+ def reset(self) -> None: ...
+ def write(self, b: Union[str, unicode]) -> None: ...
+ def writelines(self, lines: Iterable[Union[str, unicode]]) -> None: ...
+
+ at overload
+def StringIO() -> OutputType: ...
+ at overload
+def StringIO(s: str) -> InputType: ...
diff --git a/typeshed/stdlib/2/calendar.pyi b/typeshed/stdlib/2/calendar.pyi
new file mode 100644
index 0000000..6f1fd45
--- /dev/null
+++ b/typeshed/stdlib/2/calendar.pyi
@@ -0,0 +1,92 @@
+from typing import Any, Iterable, List, Optional, Tuple, Sequence
+import datetime
+
+LocaleType = Tuple[Optional[str], Optional[str]]
+
+class IllegalMonthError(ValueError):
+ def __init__(self, month: int) -> None: ...
+ def __str__(self) -> str: ...
+
+class IllegalWeekdayError(ValueError):
+ def __init__(self, weekday: int) -> None: ...
+ def __str__(self) -> str: ...
+
+def isleap(year: int) -> bool: ...
+def leapdays(y1: int, y2: int) -> int: ...
+def weekday(year: int, month: int, day: int) -> int: ...
+def monthrange(year: int, month: int) -> Tuple[int, int]: ...
+
+class Calendar(object):
+ def __init__(self, firstweekday: int = 0) -> None: ...
+ def getfirstweekday(self) -> int: ...
+ def setfirstweekday(self, firstweekday: int) -> None: ...
+ def iterweekdays(self) -> Iterable[int]: ...
+ def itermonthdates(self, year: int, month: int) -> Iterable[datetime.date]: ...
+ def itermonthdays2(self, year: int, month: int) -> Iterable[Tuple[int, int]]: ...
+ def itermonthdays(self, year: int, month: int) -> Iterable[int]: ...
+ def monthdatescalendar(self, year: int, month: int) -> List[List[datetime.date]]: ...
+ def monthdays2calendar(self, year: int, month: int) -> List[List[Tuple[int, int]]]: ...
+ def monthdayscalendar(self, year: int, month: int) -> List[List[int]]: ...
+ def yeardatescalendar(self, year: int, width: int = 3) -> List[List[int]]: ...
+ def yeardays2calendar(self, year: int, width: int = 3) -> List[List[Tuple[int, int]]]: ...
+ def yeardayscalendar(self, year: int, width: int = 3) -> List[List[int]]: ...
+
+class TextCalendar(Calendar):
+ def prweek(self, theweek: int, width: int) -> None: ...
+ def formatday(self, day: int, weekday: int, width: int) -> str: ...
+ def formatweek(self, theweek: int, width: int) -> str: ...
+ def formatweekday(self, day: int, width: int) -> str: ...
+ def formatweekheader(self, width: int) -> str: ...
+ def formatmonthname(self, theyear: int, themonth: int, width: int, withyear: bool = ...) -> str: ...
+ def prmonth(self, theyear: int, themonth: int, w: Any=0, l: Any = 0) -> None: ...
+ def formatmonth(self, theyear: int, themonth: int, w: int = 0, l: int = 0) -> str: ...
+ def formatyear(self, theyear: int, w: int = 2, l: int = 1, c: int = 6, m: int = 3) -> str: ...
+ def pryear(self, theyear: int, w: Any = 0, l: Any = 0, c: Any = 6, m: Any = 3) -> None: ...
+
+class HTMLCalendar(Calendar):
+ def formatday(self, day: int, weekday: int) -> str: ...
+ def formatweek(self, theweek: int) -> str: ...
+ def formatweekday(self, day: int) -> str: ...
+ def formatweekheader(self) -> str: ...
+ def formatmonthname(self, theyear: int, themonth: int, withyear: bool = ...) -> str: ...
+ def formatmonth(self, theyear: int, themonth: int, withyear: bool = ...) -> str: ...
+ def formatyear(self, theyear: int, width: int = 3) -> str: ...
+ def formatyearpage(self, theyear: int, width: int = 3, css: Optional[str] = ..., encoding: Optional[str] = ...) -> str: ...
+
+class TimeEncoding:
+ def __init__(self, locale: LocaleType) -> None: ...
+ def __enter__(self) -> LocaleType: ...
+ def __exit__(self, *args) -> None: ...
+
+class LocaleTextCalendar(TextCalendar):
+ def __init__(self, firstweekday: int = 0, locale: Optional[LocaleType] = ...) -> None: ...
+ def formatweekday(self, day: int, width: int) -> str: ...
+ def formatmonthname(self, theyear: int, themonth: int, width: int, withyear: bool = ...) -> str: ...
+
+class LocaleHTMLCalendar(HTMLCalendar):
+ def __init__(self, firstweekday: int = 0, locale: Optional[LocaleType] = ...) -> None: ...
+ def formatweekday(self, day: int) -> str: ...
+ def formatmonthname(self, theyear: int, themonth: int, withyear: bool = ...) -> str: ...
+
+c = ... # type: TextCalendar
+def setfirstweekday(firstweekday: int) -> None: ...
+def format(cols: int, colwidth: int = ..., spacing: int = ...) -> str: ...
+def formatstring(cols: int, colwidth: int = ..., spacing: int = ...) -> str: ...
+def timegm(tuple: Tuple[int, ...]) -> int: ...
+
+# Data attributes
+day_name = ... # type: Sequence[str]
+day_abbr = ... # type: Sequence[str]
+month_name = ... # type: Sequence[str]
+month_abbr = ... # type: Sequence[str]
+
+# Below constants are not in docs or __all__, but enough people have used them
+# they are now effectively public.
+
+MONDAY = ... # type: int
+TUESDAY = ... # type: int
+WEDNESDAY = ... # type: int
+THURSDAY = ... # type: int
+FRIDAY = ... # type: int
+SATURDAY = ... # type: int
+SUNDAY = ... # type: int
diff --git a/typeshed/stdlib/2/codecs.pyi b/typeshed/stdlib/2/codecs.pyi
new file mode 100644
index 0000000..0b2b49a
--- /dev/null
+++ b/typeshed/stdlib/2/codecs.pyi
@@ -0,0 +1,203 @@
+# Better codecs stubs hand-written by o11c.
+# https://docs.python.org/2/library/codecs.html
+from typing import (
+ BinaryIO,
+ Callable,
+ Iterable,
+ Iterator,
+ List,
+ Optional,
+ Tuple,
+ Union,
+)
+
+from abc import abstractmethod
+
+
+# TODO: this only satisfies the most common interface, where
+# str is the raw form and unicode is the cooked form.
+# In the long run, both should become template parameters maybe?
+# There *are* str->str and unicode->unicode encodings in the standard library.
+# And unlike python 3, they are in fairly widespread use.
+
+_decoded = unicode
+_encoded = str
+
+# TODO: It is not possible to specify these signatures correctly, because
+# they have an optional positional or keyword argument for errors=.
+_encode_type = Callable[[_decoded], _encoded] # signature of Codec().encode
+_decode_type = Callable[[_encoded], _decoded] # signature of Codec().decode
+_stream_reader_type = Callable[[BinaryIO], 'StreamReader'] # signature of StreamReader __init__
+_stream_writer_type = Callable[[BinaryIO], 'StreamWriter'] # signature of StreamWriter __init__
+_incremental_encoder_type = Callable[[], 'IncrementalEncoder'] # signature of IncrementalEncoder __init__
+_incremental_decode_type = Callable[[], 'IncrementalDecoder'] # signature of IncrementalDecoder __init__
+
+
+def encode(obj: _decoded, encoding: str = ..., errors: str = ...) -> _encoded:
+ ...
+def decode(obj: _encoded, encoding: str = ..., errors: str = ...) -> _decoded:
+ ...
+
+def lookup(encoding: str) -> 'CodecInfo':
+ ...
+class CodecInfo(Tuple[_encode_type, _decode_type, _stream_reader_type, _stream_writer_type]):
+ def __init__(self, encode: _encode_type, decode: _decode_type, streamreader: _stream_reader_type = ..., streamwriter: _stream_writer_type = ..., incrementalencoder: _incremental_encoder_type = ..., incrementaldecoder: _incremental_decode_type = ..., name: str = ...) -> None: ...
+ encode = ... # type: _encode_type
+ decode = ... # type: _decode_type
+ streamreader = ... # type: _stream_reader_type
+ streamwriter = ... # type: _stream_writer_type
+ incrementalencoder = ... # type: _incremental_encoder_type
+ incrementaldecoder = ... # type: _incremental_decode_type
+ name = ... # type: str
+
+def getencoder(encoding: str) -> _encode_type:
+ ...
+def getdecoder(encoding: str) -> _encode_type:
+ ...
+def getincrementalencoder(encoding: str) -> _incremental_encoder_type:
+ ...
+def getincrementaldecoder(encoding: str) -> _incremental_encoder_type:
+ ...
+def getreader(encoding: str) -> _stream_reader_type:
+ ...
+def getwriter(encoding: str) -> _stream_writer_type:
+ ...
+
+def register(search_function: Callable[[str], CodecInfo]) -> None:
+ ...
+
+def open(filename: str, mode: str = ..., encoding: str = ..., errors: str = ..., buffering: int = ...) -> StreamReaderWriter:
+ ...
+
+def EncodedFile(file: BinaryIO, data_encoding: str, file_encoding: str = ..., errors: Optional[str] = ...) -> 'StreamRecoder':
+ ...
+
+def iterencode(iterator: Iterable[_decoded], encoding: str, errors: str = ...) -> Iterator[_encoded]:
+ ...
+def iterdecode(iterator: Iterable[_encoded], encoding: str, errors: str = ...) -> Iterator[_decoded]:
+ ...
+
+BOM = b''
+BOM_BE = b''
+BOM_LE = b''
+BOM_UTF8 = b''
+BOM_UTF16 = b''
+BOM_UTF16_BE = b''
+BOM_UTF16_LE = b''
+BOM_UTF32 = b''
+BOM_UTF32_BE = b''
+BOM_UTF32_LE = b''
+
+# It is expected that different actions be taken depending on which of the
+# three subclasses of `UnicodeError` is actually ...ed. However, the Union
+# is still needed for at least one of the cases.
+def register_error(name: str, error_handler: Callable[[UnicodeError], Tuple[Union[str, bytes], int]]) -> None:
+ ...
+def lookup_error(name: str) -> Callable[[UnicodeError], Tuple[Union[str, bytes], int]]:
+ ...
+
+def strict_errors(exception: UnicodeError) -> Tuple[Union[str, bytes], int]:
+ ...
+def replace_errors(exception: UnicodeError) -> Tuple[Union[str, bytes], int]:
+ ...
+def ignore_errors(exception: UnicodeError) -> Tuple[Union[str, bytes], int]:
+ ...
+def xmlcharrefreplace_errors(exception: UnicodeError) -> Tuple[Union[str, bytes], int]:
+ ...
+def backslashreplace_errors(exception: UnicodeError) -> Tuple[Union[str, bytes], int]:
+ ...
+
+class Codec:
+ # These are sort of @abstractmethod but sort of not.
+ # The StreamReader and StreamWriter subclasses only implement one.
+ def encode(self, input: _decoded, errors: str = ...) -> Tuple[_encoded, int]:
+ ...
+ def decode(self, input: _encoded, errors: str = ...) -> Tuple[_decoded, int]:
+ ...
+
+class IncrementalEncoder:
+ errors = ... # type: str
+ def __init__(self, errors: str = ...) -> None:
+ ...
+ @abstractmethod
+ def encode(self, object: _decoded, final: bool = ...) -> _encoded:
+ ...
+ def reset(self) -> None:
+ ...
+ # documentation says int but str is needed for the subclass.
+ def getstate(self) -> Union[int, _decoded]:
+ ...
+ def setstate(self, state: Union[int, _decoded]) -> None:
+ ...
+
+class IncrementalDecoder:
+ errors = ... # type: str
+ def __init__(self, errors: str = ...) -> None:
+ ...
+ @abstractmethod
+ def decode(self, object: _encoded, final: bool = ...) -> _decoded:
+ ...
+ def reset(self) -> None:
+ ...
+ def getstate(self) -> Tuple[_encoded, int]:
+ ...
+ def setstate(self, state: Tuple[_encoded, int]) -> None:
+ ...
+
+# These are not documented but used in encodings/*.py implementations.
+class BufferedIncrementalEncoder(IncrementalEncoder):
+ buffer = ... # type: str
+ def __init__(self, errors: str = ...) -> None:
+ ...
+ @abstractmethod
+ def _buffer_encode(self, input: _decoded, errors: str, final: bool) -> _encoded:
+ ...
+ def encode(self, input: _decoded, final: bool = ...) -> _encoded:
+ ...
+class BufferedIncrementalDecoder(IncrementalDecoder):
+ buffer = ... # type: str
+ def __init__(self, errors: str = ...) -> None:
+ ...
+ @abstractmethod
+ def _buffer_decode(self, input: _encoded, errors: str, final: bool) -> Tuple[_decoded, int]:
+ ...
+ def decode(self, object: _encoded, final: bool = ...) -> _decoded:
+ ...
+
+# TODO: it is not possible to specify the requirement that all other
+# attributes and methods are passed-through from the stream.
+class StreamWriter(Codec):
+ errors = ... # type: str
+ def __init__(self, stream: BinaryIO, errors: str = ...) -> None:
+ ...
+ def write(self, obj: _decoded) -> None:
+ ...
+ def writelines(self, list: List[str]) -> None:
+ ...
+ def reset(self) -> None:
+ ...
+
+class StreamReader(Codec):
+ errors = ... # type: str
+ def __init__(self, stream: BinaryIO, errors: str = ...) -> None:
+ ...
+ def read(self, size: int = ..., chars: int = ..., firstline: bool = ...) -> _decoded:
+ ...
+ def readline(self, size: int = ..., keepends: bool = ...) -> _decoded:
+ ...
+ def readlines(self, sizehint: int = ..., keepends: bool = ...) -> List[_decoded]:
+ ...
+ def reset(self) -> None:
+ ...
+
+class StreamReaderWriter:
+ def __init__(self, stream: BinaryIO, Reader: _stream_reader_type, Writer: _stream_writer_type, errors: str = ...) -> None:
+ ...
+ def __enter__(self) -> BinaryIO:
+ ...
+ def __exit__(self, typ, exc, tb) -> bool:
+ ...
+
+class StreamRecoder(BinaryIO):
+ def __init__(self, stream: BinaryIO, encode: _encode_type, decode: _decode_type, Reader: _stream_reader_type, Writer: _stream_writer_type, errors: str = ...) -> None:
+ ...
diff --git a/typeshed/stdlib/2/collections.pyi b/typeshed/stdlib/2/collections.pyi
new file mode 100644
index 0000000..74fc2a8
--- /dev/null
+++ b/typeshed/stdlib/2/collections.pyi
@@ -0,0 +1,108 @@
+# Stubs for collections
+
+# Based on http://docs.python.org/2.7/library/collections.html
+
+# TODO more abstract base classes (interfaces in mypy)
+
+# NOTE: These are incomplete!
+
+from typing import (
+ Any, Container, Dict, Generic, TypeVar, Iterable, Tuple, Callable, Mapping, overload,
+ Iterator, Type, Sized, Optional, List, Set, Sequence, Union, Reversible,
+ MutableMapping, MutableSet, MutableSequence,
+)
+import typing
+
+_T = TypeVar('_T')
+_KT = TypeVar('_KT')
+_VT = TypeVar('_VT')
+
+# namedtuple is special-cased in the type checker; the initializer is ignored.
+def namedtuple(typename: str, field_names: Union[str, Iterable[Any]], *,
+ verbose: bool = ..., rename: bool = ...) -> Type[tuple]: ...
+
+class deque(Sized, Iterable[_T], Reversible[_T], Generic[_T]):
+ def __init__(self, iterable: Iterable[_T] = ...,
+ maxlen: int = ...) -> None: ...
+ @property
+ def maxlen(self) -> Optional[int]: ...
+ def append(self, x: _T) -> None: ...
+ def appendleft(self, x: _T) -> None: ...
+ def clear(self) -> None: ...
+ def count(self, x: _T) -> int: ...
+ def extend(self, iterable: Iterable[_T]) -> None: ...
+ def extendleft(self, iterable: Iterable[_T]) -> None: ...
+ def pop(self) -> _T: ...
+ def popleft(self) -> _T: ...
+ def remove(self, value: _T) -> None: ...
+ def reverse(self) -> None: ...
+ def rotate(self, n: int) -> None: ...
+ def __len__(self) -> int: ...
+ def __iter__(self) -> Iterator[_T]: ...
+ def __str__(self) -> str: ...
+ def __hash__(self) -> int: ...
+ def __getitem__(self, i: int) -> _T: ...
+ def __setitem__(self, i: int, x: _T) -> None: ...
+ def __contains__(self, o: _T) -> bool: ...
+ def __reversed__(self) -> Iterator[_T]: ...
+
+class Counter(Dict[_T, int], Generic[_T]):
+ # TODO: __init__ keyword arguments
+ @overload
+ def __init__(self) -> None: ...
+ @overload
+ def __init__(self, Mapping: Mapping[_T, int]) -> None: ...
+ @overload
+ def __init__(self, iterable: Iterable[_T]) -> None: ...
+ def elements(self) -> Iterator[_T]: ...
+ def most_common(self, n: int = ...) -> List[_T]: ...
+ @overload
+ def subtract(self, mapping: Mapping[_T, int]) -> None: ...
+ @overload
+ def subtract(self, iterable: Iterable[_T]) -> None: ...
+ # The Iterable[Tuple[...]] argument type is not actually desirable
+ # (the tuples will be added as keys, breaking type safety) but
+ # it's included so that the signature is compatible with
+ # Dict.update. Not sure if we should use '# type: ignore' instead
+ # and omit the type from the union.
+ @overload
+ def update(self, m: Mapping[_T, int], **kwargs: _VT) -> None: ...
+ @overload
+ def update(self, m: Union[Iterable[_T], Iterable[Tuple[_T, int]]], **kwargs: _VT) -> None: ...
+
+class OrderedDict(Dict[_KT, _VT], Generic[_KT, _VT]):
+ def popitem(self, last: bool = ...) -> Tuple[_KT, _VT]: ...
+ def move_to_end(self, key: _KT, last: bool = ...) -> None: ...
+
+class defaultdict(Dict[_KT, _VT], Generic[_KT, _VT]):
+ default_factory = ... # type: Callable[[], _VT]
+ # TODO: __init__ keyword args
+ @overload
+ def __init__(self) -> None: ...
+ @overload
+ def __init__(self, map: Mapping[_KT, _VT]) -> None: ...
+ @overload
+ def __init__(self, iterable: Iterable[Tuple[_KT, _VT]]) -> None: ...
+ @overload
+ def __init__(self, default_factory: Callable[[], _VT]) -> None: ...
+ @overload
+ def __init__(self, default_factory: Callable[[], _VT],
+ map: Mapping[_KT, _VT]) -> None: ...
+ @overload
+ def __init__(self, default_factory: Callable[[], _VT],
+ iterable: Iterable[Tuple[_KT, _VT]]) -> None: ...
+ def __missing__(self, key: _KT) -> _VT: ...
+
+class ChainMap(Dict[_KT, _VT], Generic[_KT, _VT]):
+ @overload
+ def __init__(self) -> None: ...
+ @overload
+ def __init__(self, *maps: Mapping[_KT, _VT]) -> None: ...
+
+ @property
+ def maps(self) -> List[Mapping[_KT, _VT]]: ...
+
+ def new_child(self, m: Mapping[_KT, _VT] = ...) -> ChainMap[_KT, _VT]: ...
+
+ @property
+ def parents(self) -> ChainMap[_KT, _VT]: ...
diff --git a/typeshed/stdlib/2/commands.pyi b/typeshed/stdlib/2/commands.pyi
new file mode 100644
index 0000000..864dbf4
--- /dev/null
+++ b/typeshed/stdlib/2/commands.pyi
@@ -0,0 +1,5 @@
+from typing import Tuple
+
+def getstatus(file: str) -> str: ...
+def getoutput(cmd: str) -> str: ...
+def getstatusoutput(cmd: str) -> Tuple[int, str]: ...
diff --git a/typeshed/stdlib/2/compileall.pyi b/typeshed/stdlib/2/compileall.pyi
new file mode 100644
index 0000000..103d622
--- /dev/null
+++ b/typeshed/stdlib/2/compileall.pyi
@@ -0,0 +1,7 @@
+# Stubs for compileall (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+def compile_dir(dir, maxlevels=..., ddir=..., force=..., rx=..., quiet=...): ...
+def compile_file(fullname, ddir=..., force=..., rx=..., quiet=...): ...
+def compile_path(skip_curdir=..., maxlevels=..., force=..., quiet=...): ...
diff --git a/typeshed/stdlib/2/cookielib.pyi b/typeshed/stdlib/2/cookielib.pyi
new file mode 100644
index 0000000..f7389df
--- /dev/null
+++ b/typeshed/stdlib/2/cookielib.pyi
@@ -0,0 +1,110 @@
+# Stubs for cookielib (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class Cookie:
+ version = ... # type: Any
+ name = ... # type: Any
+ value = ... # type: Any
+ port = ... # type: Any
+ port_specified = ... # type: Any
+ domain = ... # type: Any
+ domain_specified = ... # type: Any
+ domain_initial_dot = ... # type: Any
+ path = ... # type: Any
+ path_specified = ... # type: Any
+ secure = ... # type: Any
+ expires = ... # type: Any
+ discard = ... # type: Any
+ comment = ... # type: Any
+ comment_url = ... # type: Any
+ rfc2109 = ... # type: Any
+ def __init__(self, version, name, value, port, port_specified, domain, domain_specified, domain_initial_dot, path, path_specified, secure, expires, discard, comment, comment_url, rest, rfc2109=False): ...
+ def has_nonstandard_attr(self, name): ...
+ def get_nonstandard_attr(self, name, default=None): ...
+ def set_nonstandard_attr(self, name, value): ...
+ def is_expired(self, now=None): ...
+
+class CookiePolicy:
+ def set_ok(self, cookie, request): ...
+ def return_ok(self, cookie, request): ...
+ def domain_return_ok(self, domain, request): ...
+ def path_return_ok(self, path, request): ...
+
+class DefaultCookiePolicy(CookiePolicy):
+ DomainStrictNoDots = ... # type: Any
+ DomainStrictNonDomain = ... # type: Any
+ DomainRFC2965Match = ... # type: Any
+ DomainLiberal = ... # type: Any
+ DomainStrict = ... # type: Any
+ netscape = ... # type: Any
+ rfc2965 = ... # type: Any
+ rfc2109_as_netscape = ... # type: Any
+ hide_cookie2 = ... # type: Any
+ strict_domain = ... # type: Any
+ strict_rfc2965_unverifiable = ... # type: Any
+ strict_ns_unverifiable = ... # type: Any
+ strict_ns_domain = ... # type: Any
+ strict_ns_set_initial_dollar = ... # type: Any
+ strict_ns_set_path = ... # type: Any
+ def __init__(self, blocked_domains=None, allowed_domains=None, netscape=True, rfc2965=False, rfc2109_as_netscape=None, hide_cookie2=False, strict_domain=False, strict_rfc2965_unverifiable=True, strict_ns_unverifiable=False, strict_ns_domain=..., strict_ns_set_initial_dollar=False, strict_ns_set_path=False): ...
+ def blocked_domains(self): ...
+ def set_blocked_domains(self, blocked_domains): ...
+ def is_blocked(self, domain): ...
+ def allowed_domains(self): ...
+ def set_allowed_domains(self, allowed_domains): ...
+ def is_not_allowed(self, domain): ...
+ def set_ok(self, cookie, request): ...
+ def set_ok_version(self, cookie, request): ...
+ def set_ok_verifiability(self, cookie, request): ...
+ def set_ok_name(self, cookie, request): ...
+ def set_ok_path(self, cookie, request): ...
+ def set_ok_domain(self, cookie, request): ...
+ def set_ok_port(self, cookie, request): ...
+ def return_ok(self, cookie, request): ...
+ def return_ok_version(self, cookie, request): ...
+ def return_ok_verifiability(self, cookie, request): ...
+ def return_ok_secure(self, cookie, request): ...
+ def return_ok_expires(self, cookie, request): ...
+ def return_ok_port(self, cookie, request): ...
+ def return_ok_domain(self, cookie, request): ...
+ def domain_return_ok(self, domain, request): ...
+ def path_return_ok(self, path, request): ...
+
+class Absent: ...
+
+class CookieJar:
+ non_word_re = ... # type: Any
+ quote_re = ... # type: Any
+ strict_domain_re = ... # type: Any
+ domain_re = ... # type: Any
+ dots_re = ... # type: Any
+ magic_re = ... # type: Any
+ def __init__(self, policy=None): ...
+ def set_policy(self, policy): ...
+ def add_cookie_header(self, request): ...
+ def make_cookies(self, response, request): ...
+ def set_cookie_if_ok(self, cookie, request): ...
+ def set_cookie(self, cookie): ...
+ def extract_cookies(self, response, request): ...
+ def clear(self, domain=None, path=None, name=None): ...
+ def clear_session_cookies(self): ...
+ def clear_expired_cookies(self): ...
+ def __iter__(self): ...
+ def __len__(self): ...
+
+class LoadError(IOError): ...
+
+class FileCookieJar(CookieJar):
+ filename = ... # type: Any
+ delayload = ... # type: Any
+ def __init__(self, filename=None, delayload=False, policy=None): ...
+ def save(self, filename=None, ignore_discard=False, ignore_expires=False): ...
+ def load(self, filename=None, ignore_discard=False, ignore_expires=False): ...
+ def revert(self, filename=None, ignore_discard=False, ignore_expires=False): ...
+
+MozillaCookieJar = FileCookieJar
+LWPCookieJar = FileCookieJar
+def lwp_cookie_str(cookie: Cookie) -> str: ...
diff --git a/typeshed/stdlib/2/copy.pyi b/typeshed/stdlib/2/copy.pyi
new file mode 100644
index 0000000..0661cb7
--- /dev/null
+++ b/typeshed/stdlib/2/copy.pyi
@@ -0,0 +1,10 @@
+# Stubs for copy
+
+# NOTE: These are incomplete!
+
+from typing import TypeVar, Dict, Any
+
+_T = TypeVar('_T')
+
+def deepcopy(x: _T, memo: Dict[Any, Any] = ...) -> _T: ...
+def copy(x: _T) -> _T: ...
diff --git a/typeshed/stdlib/2/csv.pyi b/typeshed/stdlib/2/csv.pyi
new file mode 100644
index 0000000..c91d330
--- /dev/null
+++ b/typeshed/stdlib/2/csv.pyi
@@ -0,0 +1,88 @@
+# Stubs for csv (Python 2.7)
+#
+# NOTE: Based on a dynamically typed stub automatically generated by stubgen.
+
+from typing import Any, Dict, Iterable, List, Sequence, Union
+
+# Public interface of _csv.reader's return type
+class _Reader(Iterable[List[str]]):
+ dialect = ... # type: Dialect
+ line_num = ... # type: int
+
+ def next(self) -> List[str]: ...
+
+_Row = Sequence[Union[str, int]]
+
+# Public interface of _csv.writer's return type
+class _Writer:
+ dialect = ... # type: Dialect
+
+ def writerow(self, row: _Row) -> None: ...
+ def writerows(self, rows: Iterable[_Row]) -> None: ...
+
+QUOTE_ALL = ... # type: int
+QUOTE_MINIMAL = ... # type: int
+QUOTE_NONE = ... # type: int
+QUOTE_NONNUMERIC = ... # type: int
+
+class Error(Exception): ...
+
+_Dialect = Union[str, Dialect]
+
+def writer(csvfile: Any, dialect: _Dialect = ..., **fmtparams) -> _Writer: ...
+def reader(csvfile: Iterable[str], dialect: _Dialect = ..., **fmtparams) -> _Reader: ...
+def register_dialect(name, dialect=..., **fmtparams): ...
+def unregister_dialect(name): ...
+def get_dialect(name: str) -> Dialect: ...
+def list_dialects(): ...
+def field_size_limit(new_limit: int = ...) -> int: ...
+
+class Dialect:
+ delimiter = ... # type: str
+ quotechar = ... # type: str
+ escapechar = ... # type: str
+ doublequote = ... # type: bool
+ skipinitialspace = ... # type: bool
+ lineterminator = ... # type: str
+ quoting = ... # type: int
+ def __init__(self) -> None: ...
+
+class excel(Dialect):
+ pass
+
+class excel_tab(excel):
+ pass
+
+class unix_dialect(Dialect):
+ pass
+
+class DictReader(Iterable):
+ restkey = ... # type: Any
+ restval = ... # type: Any
+ reader = ... # type: Any
+ dialect = ... # type: _Dialect
+ line_num = ... # type: int
+ fieldnames = ... # type: Sequence[Any]
+ def __init__(self, f: Iterable[str], fieldnames: Sequence[Any] = ..., restkey=...,
+ restval=..., dialect: _Dialect = ..., *args, **kwds) -> None: ...
+ def __iter__(self): ...
+ def __next__(self): ...
+
+_DictRow = Dict[Any, Union[str, int]]
+
+class DictWriter:
+ fieldnames = ... # type: Any
+ restval = ... # type: Any
+ extrasaction = ... # type: Any
+ writer = ... # type: Any
+ def __init__(self, f: Any, fieldnames: Sequence[Any], restval=..., extrasaction: str = ...,
+ dialect: _Dialect = ..., *args, **kwds) -> None: ...
+ def writeheader(self) -> None: ...
+ def writerow(self, rowdict: _DictRow) -> None: ...
+ def writerows(self, rowdicts: Iterable[_DictRow]) -> None: ...
+
+class Sniffer:
+ preferred = ... # type: Any
+ def __init__(self) -> None: ...
+ def sniff(self, sample: str, delimiters: str = ...) -> Dialect: ...
+ def has_header(self, sample: str) -> bool: ...
diff --git a/typeshed/stdlib/2/datetime.pyi b/typeshed/stdlib/2/datetime.pyi
new file mode 100644
index 0000000..e7f4b44
--- /dev/null
+++ b/typeshed/stdlib/2/datetime.pyi
@@ -0,0 +1,212 @@
+# Stubs for datetime
+
+# NOTE: These are incomplete!
+
+from time import struct_time
+from typing import Optional, SupportsAbs, Tuple, Union, overload
+
+MINYEAR = 0
+MAXYEAR = 0
+
+class tzinfo(object):
+ def tzname(self, dt: Optional[datetime]) -> str: ...
+ def utcoffset(self, dt: Optional[datetime]) -> Optional[timedelta]: ...
+ def dst(self, dt: Optional[datetime]) -> Optional[timedelta]: ...
+ def fromutc(self, dt: datetime) -> datetime: ...
+
+_tzinfo = tzinfo
+
+class date(object):
+ min = ... # type: date
+ max = ... # type: date
+ resolution = ... # type: timedelta
+
+ def __init__(self, year: int, month: int = ..., day: int = ...) -> None: ...
+
+ @classmethod
+ def fromtimestamp(cls, t: float) -> date: ...
+ @classmethod
+ def today(cls) -> date: ...
+ @classmethod
+ def fromordinal(cls, n: int) -> date: ...
+
+ @property
+ def year(self) -> int: ...
+ @property
+ def month(self) -> int: ...
+ @property
+ def day(self) -> int: ...
+
+ def ctime(self) -> str: ...
+ def strftime(self, fmt: str) -> str: ...
+ def __format__(self, fmt: Union[str, unicode]) -> str: ...
+ def isoformat(self) -> str: ...
+ def timetuple(self) -> struct_time: ...
+ def toordinal(self) -> int: ...
+ def replace(self, year: int = ..., month: int = ..., day: int = ...) -> date: ...
+ def __le__(self, other: date) -> bool: ...
+ def __lt__(self, other: date) -> bool: ...
+ def __ge__(self, other: date) -> bool: ...
+ def __gt__(self, other: date) -> bool: ...
+ def __add__(self, other: timedelta) -> date: ...
+ @overload
+ def __sub__(self, other: timedelta) -> date: ...
+ @overload
+ def __sub__(self, other: date) -> timedelta: ...
+ def __hash__(self) -> int: ...
+ def weekday(self) -> int: ...
+ def isoweekday(self) -> int: ...
+ def isocalendar(self) -> Tuple[int, int, int]: ...
+
+class time:
+ min = ... # type: time
+ max = ... # type: time
+ resolution = ... # type: timedelta
+
+ def __init__(self, hour: int = ..., minute: int = ..., second: int = ..., microsecond: int = ...,
+ tzinfo: tzinfo = ...) -> None: ...
+
+ @property
+ def hour(self) -> int: ...
+ @property
+ def minute(self) -> int: ...
+ @property
+ def second(self) -> int: ...
+ @property
+ def microsecond(self) -> int: ...
+ @property
+ def tzinfo(self) -> _tzinfo: ...
+
+ def __le__(self, other: time) -> bool: ...
+ def __lt__(self, other: time) -> bool: ...
+ def __ge__(self, other: time) -> bool: ...
+ def __gt__(self, other: time) -> bool: ...
+ def __hash__(self) -> int: ...
+ def isoformat(self) -> str: ...
+ def strftime(self, fmt: str) -> str: ...
+ def __format__(self, fmt: str) -> str: ...
+ def utcoffset(self) -> Optional[timedelta]: ...
+ def tzname(self) -> Optional[str]: ...
+ def dst(self) -> Optional[int]: ...
+ def replace(self, hour: int = ..., minute: int = ..., second: int = ...,
+ microsecond: int = ..., tzinfo: Union[_tzinfo, bool] = ...) -> time: ...
+
+_date = date
+_time = time
+
+class timedelta(SupportsAbs[timedelta]):
+ min = ... # type: timedelta
+ max = ... # type: timedelta
+ resolution = ... # type: timedelta
+
+ def __init__(self, days: float = ..., seconds: float = ..., microseconds: float = ...,
+ milliseconds: float = ..., minutes: float = ..., hours: float = ...,
+ weeks: float = ...) -> None: ...
+
+ @property
+ def days(self) -> int: ...
+ @property
+ def seconds(self) -> int: ...
+ @property
+ def microseconds(self) -> int: ...
+
+ def total_seconds(self) -> float: ...
+ def __add__(self, other: timedelta) -> timedelta: ...
+ def __radd__(self, other: timedelta) -> timedelta: ...
+ def __sub__(self, other: timedelta) -> timedelta: ...
+ def __rsub(self, other: timedelta) -> timedelta: ...
+ def __neg__(self) -> timedelta: ...
+ def __pos__(self) -> timedelta: ...
+ def __abs__(self) -> timedelta: ...
+ def __mul__(self, other: float) -> timedelta: ...
+ def __rmul__(self, other: float) -> timedelta: ...
+ @overload
+ def __floordiv__(self, other: timedelta) -> int: ...
+ @overload
+ def __floordiv__(self, other: int) -> timedelta: ...
+ @overload
+ def __truediv__(self, other: timedelta) -> float: ...
+ @overload
+ def __truediv__(self, other: float) -> timedelta: ...
+ def __mod__(self, other: timedelta) -> timedelta: ...
+ def __divmod__(self, other: timedelta) -> Tuple[int, timedelta]: ...
+ def __le__(self, other: timedelta) -> bool: ...
+ def __lt__(self, other: timedelta) -> bool: ...
+ def __ge__(self, other: timedelta) -> bool: ...
+ def __gt__(self, other: timedelta) -> bool: ...
+ def __hash__(self) -> int: ...
+
+class datetime(object):
+ # TODO: is actually subclass of date, but __le__, __lt__, __ge__, __gt__ don't work with date.
+ min = ... # type: datetime
+ max = ... # type: datetime
+ resolution = ... # type: timedelta
+
+ def __init__(self, year: int, month: int = ..., day: int = ..., hour: int = ...,
+ minute: int = ..., second: int = ..., microseconds: int = ...,
+ tzinfo: tzinfo = ...) -> None: ...
+
+ @property
+ def year(self) -> int: ...
+ @property
+ def month(self) -> int: ...
+ @property
+ def day(self) -> int: ...
+ @property
+ def hour(self) -> int: ...
+ @property
+ def minute(self) -> int: ...
+ @property
+ def second(self) -> int: ...
+ @property
+ def microsecond(self) -> int: ...
+ @property
+ def tzinfo(self) -> _tzinfo: ...
+
+ @classmethod
+ def fromtimestamp(cls, t: float, tz: _tzinfo = ...) -> datetime: ...
+ @classmethod
+ def utcfromtimestamp(cls, t: float) -> datetime: ...
+ @classmethod
+ def today(cls) -> datetime: ...
+ @classmethod
+ def fromordinal(cls, n: int) -> datetime: ...
+ @classmethod
+ def now(cls, tz: _tzinfo = ...) -> datetime: ...
+ @classmethod
+ def utcnow(cls) -> datetime: ...
+ @classmethod
+ def combine(cls, date: date, time: time) -> datetime: ...
+ def strftime(self, fmt: str) -> str: ...
+ def __format__(self, fmt: str) -> str: ...
+ def toordinal(self) -> int: ...
+ def timetuple(self) -> struct_time: ...
+ def timestamp(self) -> float: ...
+ def utctimetuple(self) -> struct_time: ...
+ def date(self) -> _date: ...
+ def time(self) -> _time: ...
+ def timetz(self) -> _time: ...
+ def replace(self, year: int = ..., month: int = ..., day: int = ..., hour: int = ...,
+ minute: int = ..., second: int = ..., microsecond: int = ..., tzinfo:
+ Union[_tzinfo, bool] = ...) -> datetime: ...
+ def astimezone(self, tz: _tzinfo = ...) -> datetime: ...
+ def ctime(self) -> str: ...
+ def isoformat(self, sep: str = ...) -> str: ...
+ @classmethod
+ def strptime(cls, date_string: str, format: str) -> datetime: ...
+ def utcoffset(self) -> Optional[timedelta]: ...
+ def tzname(self) -> Optional[str]: ...
+ def dst(self) -> Optional[int]: ...
+ def __le__(self, other: datetime) -> bool: ...
+ def __lt__(self, other: datetime) -> bool: ...
+ def __ge__(self, other: datetime) -> bool: ...
+ def __gt__(self, other: datetime) -> bool: ...
+ def __add__(self, other: timedelta) -> datetime: ...
+ @overload
+ def __sub__(self, other: datetime) -> timedelta: ...
+ @overload
+ def __sub__(self, other: timedelta) -> datetime: ...
+ def __hash__(self) -> int: ...
+ def weekday(self) -> int: ...
+ def isoweekday(self) -> int: ...
+ def isocalendar(self) -> Tuple[int, int, int]: ...
diff --git a/typeshed/stdlib/2/decimal.pyi b/typeshed/stdlib/2/decimal.pyi
new file mode 100644
index 0000000..ce4d586
--- /dev/null
+++ b/typeshed/stdlib/2/decimal.pyi
@@ -0,0 +1,245 @@
+# Stubs for decimal (Python 2)
+
+from typing import (
+ Any, Dict, NamedTuple, Optional, Sequence, Tuple, Union,
+ SupportsAbs, SupportsFloat, SupportsInt,
+)
+
+_Decimal = Union[Decimal, int]
+_ComparableNum = Union[Decimal, int, float]
+
+DecimalTuple = NamedTuple('DecimalTuple',
+ [('sign', int),
+ ('digits', Sequence[int]), # TODO: Use Tuple[int, ...]
+ ('exponent', int)])
+
+ROUND_DOWN = ... # type: str
+ROUND_HALF_UP = ... # type: str
+ROUND_HALF_EVEN = ... # type: str
+ROUND_CEILING = ... # type: str
+ROUND_FLOOR = ... # type: str
+ROUND_UP = ... # type: str
+ROUND_HALF_DOWN = ... # type: str
+ROUND_05UP = ... # type: str
+
+class DecimalException(ArithmeticError):
+ def handle(self, context, *args): ...
+
+class Clamped(DecimalException): ...
+
+class InvalidOperation(DecimalException): ...
+
+class ConversionSyntax(InvalidOperation): ...
+
+class DivisionByZero(DecimalException, ZeroDivisionError): ...
+
+class DivisionImpossible(InvalidOperation): ...
+
+class DivisionUndefined(InvalidOperation, ZeroDivisionError): ...
+
+class Inexact(DecimalException): ...
+
+class InvalidContext(InvalidOperation): ...
+
+class Rounded(DecimalException): ...
+
+class Subnormal(DecimalException): ...
+
+class Overflow(Inexact, Rounded): ...
+
+class Underflow(Inexact, Rounded, Subnormal): ...
+
+def setcontext(context: Context): ...
+def getcontext() -> Context: ...
+def localcontext(ctx: Optional[Context] = None) -> _ContextManager: ...
+
+class Decimal(SupportsAbs[Decimal], SupportsFloat, SupportsInt):
+ def __init__(cls, value: Union[_Decimal, float, str,
+ Tuple[int, Sequence[int], int]] = ...,
+ context: Context = ...) -> None: ...
+ @classmethod
+ def from_float(cls, f: float) -> Decimal: ...
+ def __nonzero__(self) -> bool: ...
+ def __eq__(self, other: object) -> bool: ...
+ def __ne__(self, other: object) -> bool: ...
+ def __lt__(self, other: _ComparableNum) -> bool: ...
+ def __le__(self, other: _ComparableNum) -> bool: ...
+ def __gt__(self, other: _ComparableNum) -> bool: ...
+ def __ge__(self, other: _ComparableNum) -> bool: ...
+ def compare(self, other: _Decimal) -> Decimal: ...
+ def __hash__(self) -> int: ...
+ def as_tuple(self) -> DecimalTuple: ...
+ def to_eng_string(self, context: Context = ...) -> str: ...
+ def __neg__(self) -> Decimal: ...
+ def __pos__(self) -> Decimal: ...
+ def __abs__(self, round: bool = True) -> Decimal: ...
+ def __add__(self, other: _Decimal) -> Decimal: ...
+ def __radd__(self, other: int) -> Decimal: ...
+ def __sub__(self, other: _Decimal) -> Decimal: ...
+ def __rsub__(self, other: int) -> Decimal: ...
+ def __mul__(self, other: _Decimal) -> Decimal: ...
+ def __rmul__(self, other: int) -> Decimal: ...
+ def __truediv__(self, other: _Decimal) -> Decimal: ...
+ def __rtruediv__(self, other: int) -> Decimal: ...
+ def __div__(self, other: _Decimal) -> Decimal: ...
+ def __rdiv__(self, other: int) -> Decimal: ...
+ def __divmod__(self, other: _Decimal) -> Tuple[Decimal, Decimal]: ...
+ def __rdivmod__(self, other: int) -> Tuple[Decimal, Decimal]: ...
+ def __mod__(self, other: _Decimal) -> Decimal: ...
+ def __rmod__(self, other: int) -> Decimal: ...
+ def remainder_near(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+ def __floordiv__(self, other: _Decimal) -> Decimal: ...
+ def __rfloordiv__(self, other: int) -> Decimal: ...
+ def __float__(self) -> float: ...
+ def __int__(self) -> int: ...
+ def __trunc__(self) -> int: ...
+ @property
+ def imag(self) -> Decimal: ...
+ @property
+ def real(self) -> Decimal: ...
+ def conjugate(self) -> Decimal: ...
+ def __complex__(self) -> complex: ...
+ def __long__(self) -> long: ...
+ def fma(self, other: _Decimal, third: _Decimal, context: Context = ...) -> Decimal: ...
+ def __pow__(self, other: _Decimal) -> Decimal: ...
+ def __rpow__(self, other: int) -> Decimal: ...
+ def normalize(self, context: Context = ...) -> Decimal: ...
+ def quantize(self, exp: _Decimal, rounding: str = ...,
+ context: Context = ...) -> Decimal: ...
+ def same_quantum(self, other: Decimal) -> bool: ...
+ def to_integral(self, rounding: str = ..., context: Context = ...) -> Decimal: ...
+ def to_integral_exact(self, rounding: str = ..., context: Context = ...) -> Decimal: ...
+ def to_integral_value(self, rounding: str = ..., context: Context = ...) -> Decimal: ...
+ def sqrt(self, context: Context = ...) -> Decimal: ...
+ def max(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+ def min(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+ def adjusted(self) -> int: ...
+ def canonical(self, context: Context = ...) -> Decimal: ...
+ def compare_signal(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+ def compare_total(self, other: _Decimal) -> Decimal: ...
+ def compare_total_mag(self, other: _Decimal) -> Decimal: ...
+ def copy_abs(self) -> Decimal: ...
+ def copy_negate(self) -> Decimal: ...
+ def copy_sign(self, other: _Decimal) -> Decimal: ...
+ def exp(self, context: Context = ...) -> Decimal: ...
+ def is_canonical(self) -> bool: ...
+ def is_finite(self) -> bool: ...
+ def is_infinite(self) -> bool: ...
+ def is_nan(self) -> bool: ...
+ def is_normal(self, context: Context = ...) -> bool: ...
+ def is_qnan(self) -> bool: ...
+ def is_signed(self) -> bool: ...
+ def is_snan(self) -> bool: ...
+ def is_subnormal(self, context: Context = ...) -> bool: ...
+ def is_zero(self) -> bool: ...
+ def ln(self, context: Context = ...) -> Decimal: ...
+ def log10(self, context: Context = ...) -> Decimal: ...
+ def logb(self, context: Context = ...) -> Decimal: ...
+ def logical_and(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+ def logical_invert(self, context: Context = ...) -> Decimal: ...
+ def logical_or(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+ def logical_xor(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+ def max_mag(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+ def min_mag(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+ def next_minus(self, context: Context = ...) -> Decimal: ...
+ def next_plus(self, context: Context = ...) -> Decimal: ...
+ def next_toward(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+ def number_class(self, context: Context = ...) -> str: ...
+ def radix(self) -> Decimal: ...
+ def rotate(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+ def scaleb(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+ def shift(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+ def __reduce__(self): ...
+ def __copy__(self): ...
+ def __deepcopy__(self, memo): ...
+ def __format__(self, specifier, context=None, _localeconv=None) -> str: ...
+
+class _ContextManager:
+ new_context = ... # type: Context
+ saved_context = ... # type: Context
+ def __init__(self, new_context: Context) -> None: ...
+ def __enter__(self): ...
+ def __exit__(self, t, v, tb): ...
+
+class Context:
+ prec = ... # type: int
+ rounding = ... # type: str
+ Emin = ... # type: int
+ Emax = ... # type: int
+ capitals = ... # type: int
+ traps = ... # type: Dict[type, bool]
+ flags = ... # type: Any
+ def __init__(self, prec=None, rounding=None, traps=None, flags=None, Emin=None, Emax=None, capitals=None, _clamp=0, _ignored_flags=None): ...
+ def clear_flags(self): ...
+ def copy(self): ...
+ __copy__ = ... # type: Any
+ __hash__ = ... # type: Any
+ def Etiny(self): ...
+ def Etop(self): ...
+ def create_decimal(self, num=...): ...
+ def create_decimal_from_float(self, f): ...
+ def abs(self, a): ...
+ def add(self, a, b): ...
+ def canonical(self, a): ...
+ def compare(self, a, b): ...
+ def compare_signal(self, a, b): ...
+ def compare_total(self, a, b): ...
+ def compare_total_mag(self, a, b): ...
+ def copy_abs(self, a): ...
+ def copy_decimal(self, a): ...
+ def copy_negate(self, a): ...
+ def copy_sign(self, a, b): ...
+ def divide(self, a, b): ...
+ def divide_int(self, a, b): ...
+ def divmod(self, a, b): ...
+ def exp(self, a): ...
+ def fma(self, a, b, c): ...
+ def is_canonical(self, a): ...
+ def is_finite(self, a): ...
+ def is_infinite(self, a): ...
+ def is_nan(self, a): ...
+ def is_normal(self, a): ...
+ def is_qnan(self, a): ...
+ def is_signed(self, a): ...
+ def is_snan(self, a): ...
+ def is_subnormal(self, a): ...
+ def is_zero(self, a): ...
+ def ln(self, a): ...
+ def log10(self, a): ...
+ def logb(self, a): ...
+ def logical_and(self, a, b): ...
+ def logical_invert(self, a): ...
+ def logical_or(self, a, b): ...
+ def logical_xor(self, a, b): ...
+ def max(self, a, b): ...
+ def max_mag(self, a, b): ...
+ def min(self, a, b): ...
+ def min_mag(self, a, b): ...
+ def minus(self, a): ...
+ def multiply(self, a, b): ...
+ def next_minus(self, a): ...
+ def next_plus(self, a): ...
+ def next_toward(self, a, b): ...
+ def normalize(self, a): ...
+ def number_class(self, a): ...
+ def plus(self, a): ...
+ def power(self, a, b, modulo=None): ...
+ def quantize(self, a, b): ...
+ def radix(self): ...
+ def remainder(self, a, b): ...
+ def remainder_near(self, a, b): ...
+ def rotate(self, a, b): ...
+ def same_quantum(self, a, b): ...
+ def scaleb(self, a, b): ...
+ def shift(self, a, b): ...
+ def sqrt(self, a): ...
+ def subtract(self, a, b): ...
+ def to_eng_string(self, a): ...
+ def to_sci_string(self, a): ...
+ def to_integral_exact(self, a): ...
+ def to_integral_value(self, a): ...
+ def to_integral(self, a): ...
+
+DefaultContext = ... # type: Context
+BasicContext = ... # type: Context
+ExtendedContext = ... # type: Context
diff --git a/typeshed/stdlib/2/difflib.pyi b/typeshed/stdlib/2/difflib.pyi
new file mode 100644
index 0000000..e0809f8
--- /dev/null
+++ b/typeshed/stdlib/2/difflib.pyi
@@ -0,0 +1,64 @@
+# Stubs for difflib
+
+# Based on https://docs.python.org/2.7/library/difflib.html
+
+# TODO: Support unicode?
+
+from typing import (
+ TypeVar, Callable, Iterable, Iterator, List, NamedTuple, Sequence, Tuple,
+ Generic, Optional
+)
+
+_T = TypeVar('_T')
+
+class SequenceMatcher(Generic[_T]):
+ def __init__(self, isjunk: Optional[Callable[[_T], bool]] = ...,
+ a: Sequence[_T] = ..., b: Sequence[_T] = ...,
+ autojunk: bool = ...) -> None: ...
+ def set_seqs(self, a: Sequence[_T], b: Sequence[_T]) -> None: ...
+ def set_seq1(self, a: Sequence[_T]) -> None: ...
+ def set_seq2(self, b: Sequence[_T]) -> None: ...
+ def find_longest_match(self, alo: int, ahi: int, blo: int,
+ bhi: int) -> Tuple[int, int, int]: ...
+ def get_matching_blocks(self) -> List[Tuple[int, int, int]]: ...
+ def get_opcodes(self) -> List[Tuple[str, int, int, int, int]]: ...
+ def get_grouped_opcodes(self, n: int = ...
+ ) -> Iterable[Tuple[str, int, int, int, int]]: ...
+ def ratio(self) -> float: ...
+ def quick_ratio(self) -> float: ...
+ def real_quick_ratio(self) -> float: ...
+
+def get_close_matches(word: Sequence[_T], possibilities: List[Sequence[_T]],
+ n: int = ..., cutoff: float = ...) -> List[Sequence[_T]]: ...
+
+class Differ:
+ def __init__(self, linejunk: Callable[[str], bool] = ...,
+ charjunk: Callable[[str], bool] = ...) -> None: ...
+ def compare(self, a: Sequence[str], b: Sequence[str]) -> Iterator[str]: ...
+
+def IS_LINE_JUNK(str) -> bool: ...
+def IS_CHARACTER_JUNK(str) -> bool: ...
+def unified_diff(a: Sequence[str], b: Sequence[str], fromfile: str = ...,
+ tofile: str = ..., fromfiledate: str = ..., tofiledate: str = ...,
+ n: int = ..., lineterm: str = ...) -> Iterator[str]: ...
+def context_diff(a: Sequence[str], b: Sequence[str], fromfile: str=...,
+ tofile: str = ..., fromfiledate: str = ..., tofiledate: str = ...,
+ n: int = ..., lineterm: str = ...) -> Iterator[str]: ...
+def ndiff(a: Sequence[str], b: Sequence[str],
+ linejunk: Callable[[str], bool] = ...,
+ charjunk: Callable[[str], bool] = ...
+ ) -> Iterator[str]: ...
+
+class HtmlDiff(object):
+ def __init__(self, tabsize: int = ..., wrapcolumn: int = ...,
+ linejunk: Callable[[str], bool] = ...,
+ charjunk: Callable[[str], bool] = ...
+ ) -> None: ...
+ def make_file(self, fromlines: Sequence[str], tolines: Sequence[str],
+ fromdesc: str = ..., todesc: str = ..., context: bool = ...,
+ numlines: int = ...) -> str: ...
+ def make_table(self, fromlines: Sequence[str], tolines: Sequence[str],
+ fromdesc: str = ..., todesc: str = ..., context: bool = ...,
+ numlines: int = ...) -> str: ...
+
+def restore(delta: Iterable[str], which: int) -> Iterator[int]: ...
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/2/distutils/__init__.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/2/distutils/__init__.pyi
diff --git a/typeshed/stdlib/2/distutils/emxccompiler.pyi b/typeshed/stdlib/2/distutils/emxccompiler.pyi
new file mode 100644
index 0000000..97e4a29
--- /dev/null
+++ b/typeshed/stdlib/2/distutils/emxccompiler.pyi
@@ -0,0 +1,5 @@
+# Stubs for emxccompiler
+
+from distutils.unixccompiler import UnixCCompiler
+
+class EMXCCompiler(UnixCCompiler): ...
diff --git a/typeshed/stdlib/2/doctest.pyi b/typeshed/stdlib/2/doctest.pyi
new file mode 100644
index 0000000..ab88328
--- /dev/null
+++ b/typeshed/stdlib/2/doctest.pyi
@@ -0,0 +1,9 @@
+# Stubs for doctest
+
+# NOTE: These are incomplete!
+
+from typing import Any, Tuple
+
+# TODO arguments missing
+def testmod(m: Any = ..., name: str = ..., globs: Any = ...,
+ verbose: bool = ...) -> Tuple[int, int]: ...
diff --git a/typeshed/stdlib/2/email/MIMEText.pyi b/typeshed/stdlib/2/email/MIMEText.pyi
new file mode 100644
index 0000000..a15eb1d
--- /dev/null
+++ b/typeshed/stdlib/2/email/MIMEText.pyi
@@ -0,0 +1,8 @@
+# Stubs for email.MIMEText (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from email.mime.nonmultipart import MIMENonMultipart
+
+class MIMEText(MIMENonMultipart):
+ def __init__(self, _text, _subtype=..., _charset=...) -> None: ...
diff --git a/typeshed/stdlib/2/email/__init__.pyi b/typeshed/stdlib/2/email/__init__.pyi
new file mode 100644
index 0000000..384d956
--- /dev/null
+++ b/typeshed/stdlib/2/email/__init__.pyi
@@ -0,0 +1,6 @@
+from typing import IO, Any, AnyStr
+
+def message_from_string(s: AnyStr, *args, **kwargs): ...
+def message_from_bytes(s: str, *args, **kwargs): ...
+def message_from_file(fp: IO[AnyStr], *args, **kwargs): ...
+def message_from_binary_file(fp: IO[str], *args, **kwargs): ...
diff --git a/typeshed/stdlib/2/email/_parseaddr.pyi b/typeshed/stdlib/2/email/_parseaddr.pyi
new file mode 100644
index 0000000..97e859e
--- /dev/null
+++ b/typeshed/stdlib/2/email/_parseaddr.pyi
@@ -0,0 +1,44 @@
+# Stubs for email._parseaddr (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+def parsedate_tz(data): ...
+def parsedate(data): ...
+def mktime_tz(data): ...
+def quote(str): ...
+
+class AddrlistClass:
+ specials = ... # type: Any
+ pos = ... # type: Any
+ LWS = ... # type: Any
+ CR = ... # type: Any
+ FWS = ... # type: Any
+ atomends = ... # type: Any
+ phraseends = ... # type: Any
+ field = ... # type: Any
+ commentlist = ... # type: Any
+ def __init__(self, field): ...
+ def gotonext(self): ...
+ def getaddrlist(self): ...
+ def getaddress(self): ...
+ def getrouteaddr(self): ...
+ def getaddrspec(self): ...
+ def getdomain(self): ...
+ def getdelimited(self, beginchar, endchars, allowcomments=True): ...
+ def getquote(self): ...
+ def getcomment(self): ...
+ def getdomainliteral(self): ...
+ def getatom(self, atomends=None): ...
+ def getphraselist(self): ...
+
+class AddressList(AddrlistClass):
+ addresslist = ... # type: Any
+ def __init__(self, field): ...
+ def __len__(self): ...
+ def __add__(self, other): ...
+ def __iadd__(self, other): ...
+ def __sub__(self, other): ...
+ def __isub__(self, other): ...
+ def __getitem__(self, index): ...
diff --git a/mypy/test/collect.py b/typeshed/stdlib/2/email/mime/__init__.pyi
similarity index 100%
rename from mypy/test/collect.py
rename to typeshed/stdlib/2/email/mime/__init__.pyi
diff --git a/typeshed/stdlib/2/email/mime/base.pyi b/typeshed/stdlib/2/email/mime/base.pyi
new file mode 100644
index 0000000..0a3eb4c
--- /dev/null
+++ b/typeshed/stdlib/2/email/mime/base.pyi
@@ -0,0 +1,10 @@
+# Stubs for email.mime.base (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+# import message
+
+# TODO
+# class MIMEBase(message.Message):
+class MIMEBase:
+ def __init__(self, _maintype, _subtype, **_params) -> None: ...
diff --git a/typeshed/stdlib/2/email/mime/multipart.pyi b/typeshed/stdlib/2/email/mime/multipart.pyi
new file mode 100644
index 0000000..2bc5a9e
--- /dev/null
+++ b/typeshed/stdlib/2/email/mime/multipart.pyi
@@ -0,0 +1,8 @@
+# Stubs for email.mime.multipart (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from email.mime.base import MIMEBase
+
+class MIMEMultipart(MIMEBase):
+ def __init__(self, _subtype=..., boundary=..., _subparts=..., **_params) -> None: ...
diff --git a/typeshed/stdlib/2/email/mime/nonmultipart.pyi b/typeshed/stdlib/2/email/mime/nonmultipart.pyi
new file mode 100644
index 0000000..b0894ab
--- /dev/null
+++ b/typeshed/stdlib/2/email/mime/nonmultipart.pyi
@@ -0,0 +1,8 @@
+# Stubs for email.mime.nonmultipart (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from email.mime.base import MIMEBase
+
+class MIMENonMultipart(MIMEBase):
+ def attach(self, payload): ...
diff --git a/typeshed/stdlib/2/email/mime/text.pyi b/typeshed/stdlib/2/email/mime/text.pyi
new file mode 100644
index 0000000..b6ec4c8
--- /dev/null
+++ b/typeshed/stdlib/2/email/mime/text.pyi
@@ -0,0 +1,8 @@
+# Stubs for email.mime.text (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from email.mime.nonmultipart import MIMENonMultipart
+
+class MIMEText(MIMENonMultipart):
+ def __init__(self, _text, _subtype=..., _charset=...) -> None: ...
diff --git a/typeshed/stdlib/2/email/utils.pyi b/typeshed/stdlib/2/email/utils.pyi
new file mode 100644
index 0000000..48d2aa3
--- /dev/null
+++ b/typeshed/stdlib/2/email/utils.pyi
@@ -0,0 +1,22 @@
+# Stubs for email.utils (Python 2)
+#
+# Derived from stub automatically generated by stubgen.
+
+from email._parseaddr import AddressList as _AddressList
+from email._parseaddr import mktime_tz as mktime_tz
+from email._parseaddr import parsedate as _parsedate
+from email._parseaddr import parsedate_tz as _parsedate_tz
+from quopri import decodestring as _qdecode
+
+def formataddr(pair): ...
+def getaddresses(fieldvalues): ...
+def formatdate(timeval=None, localtime=False, usegmt=False): ...
+def make_msgid(idstring=None): ...
+def parsedate(data): ...
+def parsedate_tz(data): ...
+def parseaddr(addr): ...
+def unquote(str): ...
+def decode_rfc2231(s): ...
+def encode_rfc2231(s, charset=None, language=None): ...
+def decode_params(params): ...
+def collapse_rfc2231_value(value, errors=..., fallback_charset=...): ...
diff --git a/typeshed/stdlib/2/encodings/__init__.pyi b/typeshed/stdlib/2/encodings/__init__.pyi
new file mode 100644
index 0000000..2ae6c0a
--- /dev/null
+++ b/typeshed/stdlib/2/encodings/__init__.pyi
@@ -0,0 +1,6 @@
+import codecs
+
+import typing
+
+def search_function(encoding: str) -> codecs.CodecInfo:
+ ...
diff --git a/typeshed/stdlib/2/encodings/utf_8.pyi b/typeshed/stdlib/2/encodings/utf_8.pyi
new file mode 100644
index 0000000..3be496a
--- /dev/null
+++ b/typeshed/stdlib/2/encodings/utf_8.pyi
@@ -0,0 +1,14 @@
+import codecs
+
+class IncrementalEncoder(codecs.IncrementalEncoder):
+ pass
+class IncrementalDecoder(codecs.BufferedIncrementalDecoder):
+ pass
+class StreamWriter(codecs.StreamWriter):
+ pass
+class StreamReader(codecs.StreamReader):
+ pass
+
+def getregentry() -> codecs.CodecInfo: pass
+def encode(input: str, errors: str = ...) -> bytes: pass
+def decode(input: bytes, errors: str = ...) -> str: pass
diff --git a/typeshed/stdlib/2/exceptions.pyi b/typeshed/stdlib/2/exceptions.pyi
new file mode 100644
index 0000000..9b00e34
--- /dev/null
+++ b/typeshed/stdlib/2/exceptions.pyi
@@ -0,0 +1,80 @@
+from typing import Any, Tuple, Optional
+
+class StandardError(Exception): ...
+class ArithmeticError(StandardError): ...
+class AssertionError(StandardError): ...
+class AttributeError(StandardError): ...
+class BaseException(object):
+ args = ... # type: Tuple[Any, ...]
+ message = ... # type: str
+ def __getslice__(self, start, end) -> Any: ...
+ def __getitem__(self, start, end) -> Any: ...
+ def __unicode__(self) -> unicode: ...
+class BufferError(StandardError): ...
+class BytesWarning(Warning): ...
+class DeprecationWarning(Warning): ...
+class EOFError(StandardError): ...
+class EnvironmentError(StandardError):
+ errno = ... # type: int
+ strerror = ... # type: str
+ filename = ... # type: str
+class Exception(BaseException): ...
+class FloatingPointError(ArithmeticError): ...
+class FutureWarning(Warning): ...
+class GeneratorExit(BaseException): ...
+class IOError(EnvironmentError): ...
+class ImportError(StandardError): ...
+class ImportWarning(Warning): ...
+class IndentationError(SyntaxError): ...
+class IndexError(LookupError): ...
+class KeyError(LookupError): ...
+class KeyboardInterrupt(BaseException): ...
+class LookupError(StandardError): ...
+class MemoryError(StandardError): ...
+class NameError(StandardError): ...
+class NotImplementedError(RuntimeError): ...
+class OSError(EnvironmentError): ...
+class OverflowError(ArithmeticError): ...
+class PendingDeprecationWarning(Warning): ...
+class ReferenceError(StandardError): ...
+class RuntimeError(StandardError): ...
+class RuntimeWarning(Warning): ...
+class StopIteration(Exception): ...
+class SyntaxError(StandardError):
+ text = ... # type: str
+ print_file_and_line = ... # type: Optional[str]
+ filename = ... # type: str
+ lineno = ... # type: int
+ offset = ... # type: int
+ msg = ... # type: str
+class SyntaxWarning(Warning): ...
+class SystemError(StandardError): ...
+class SystemExit(BaseException):
+ code = ... # type: int
+class TabError(IndentationError): ...
+class TypeError(StandardError): ...
+class UnboundLocalError(NameError): ...
+class UnicodeError(ValueError): ...
+class UnicodeDecodeError(UnicodeError):
+ start = ... # type: int
+ reason = ... # type: str
+ object = ... # type: str
+ end = ... # type: int
+ encoding = ... # type: str
+class UnicodeEncodeError(UnicodeError):
+ start = ... # type: int
+ reason = ... # type: str
+ object = ... # type: unicode
+ end = ... # type: int
+ encoding = ... # type: str
+class UnicodeTranslateError(UnicodeError):
+ start = ... # type: int
+ reason = ... # type: str
+ object = ... # type: Any
+ end = ... # type: int
+ encoding = ... # type: str
+class UnicodeWarning(Warning): ...
+class UserWarning(Warning): ...
+class ValueError(StandardError): ...
+class Warning(Exception): ...
+class ZeroDivisionError(ArithmeticError): ...
diff --git a/typeshed/stdlib/2/fcntl.pyi b/typeshed/stdlib/2/fcntl.pyi
new file mode 100644
index 0000000..5e7da7f
--- /dev/null
+++ b/typeshed/stdlib/2/fcntl.pyi
@@ -0,0 +1,87 @@
+from typing import Any, Union
+import io
+
+FASYNC = ... # type: int
+FD_CLOEXEC = ... # type: int
+
+DN_ACCESS = ... # type: int
+DN_ATTRIB = ... # type: int
+DN_CREATE = ... # type: int
+DN_DELETE = ... # type: int
+DN_MODIFY = ... # type: int
+DN_MULTISHOT = ... # type: int
+DN_RENAME = ... # type: int
+F_DUPFD = ... # type: int
+F_EXLCK = ... # type: int
+F_GETFD = ... # type: int
+F_GETFL = ... # type: int
+F_GETLEASE = ... # type: int
+F_GETLK = ... # type: int
+F_GETLK64 = ... # type: int
+F_GETOWN = ... # type: int
+F_GETSIG = ... # type: int
+F_NOTIFY = ... # type: int
+F_RDLCK = ... # type: int
+F_SETFD = ... # type: int
+F_SETFL = ... # type: int
+F_SETLEASE = ... # type: int
+F_SETLK = ... # type: int
+F_SETLK64 = ... # type: int
+F_SETLKW = ... # type: int
+F_SETLKW64 = ... # type: int
+F_SETOWN = ... # type: int
+F_SETSIG = ... # type: int
+F_SHLCK = ... # type: int
+F_UNLCK = ... # type: int
+F_WRLCK = ... # type: int
+I_ATMARK = ... # type: int
+I_CANPUT = ... # type: int
+I_CKBAND = ... # type: int
+I_FDINSERT = ... # type: int
+I_FIND = ... # type: int
+I_FLUSH = ... # type: int
+I_FLUSHBAND = ... # type: int
+I_GETBAND = ... # type: int
+I_GETCLTIME = ... # type: int
+I_GETSIG = ... # type: int
+I_GRDOPT = ... # type: int
+I_GWROPT = ... # type: int
+I_LINK = ... # type: int
+I_LIST = ... # type: int
+I_LOOK = ... # type: int
+I_NREAD = ... # type: int
+I_PEEK = ... # type: int
+I_PLINK = ... # type: int
+I_POP = ... # type: int
+I_PUNLINK = ... # type: int
+I_PUSH = ... # type: int
+I_RECVFD = ... # type: int
+I_SENDFD = ... # type: int
+I_SETCLTIME = ... # type: int
+I_SETSIG = ... # type: int
+I_SRDOPT = ... # type: int
+I_STR = ... # type: int
+I_SWROPT = ... # type: int
+I_UNLINK = ... # type: int
+LOCK_EX = ... # type: int
+LOCK_MAND = ... # type: int
+LOCK_NB = ... # type: int
+LOCK_READ = ... # type: int
+LOCK_RW = ... # type: int
+LOCK_SH = ... # type: int
+LOCK_UN = ... # type: int
+LOCK_WRITE = ... # type: int
+
+_ANYFILE = Union[int, io.IOBase]
+
+# TODO All these return either int or bytes depending on the value of
+# cmd (not on the type of arg).
+def fcntl(fd: _ANYFILE, op: int, arg: Union[int, bytes] = ...) -> Any: ...
+
+# TODO: arg: int or read-only buffer interface or read-write buffer interface
+def ioctl(fd: _ANYFILE, op: int, arg: Union[int, bytes] = ...,
+ mutate_flag: bool = ...) -> Any: ...
+
+def flock(fd: _ANYFILE, op: int) -> None: ...
+def lockf(fd: _ANYFILE, op: int, length: int = ..., start: int = ...,
+ whence: int = ...) -> Any: ...
diff --git a/typeshed/stdlib/2/fileinput.pyi b/typeshed/stdlib/2/fileinput.pyi
new file mode 100644
index 0000000..f3e1f37
--- /dev/null
+++ b/typeshed/stdlib/2/fileinput.pyi
@@ -0,0 +1,46 @@
+from typing import Iterable, Callable, IO, Optional, Union, Iterator
+
+class FileInput(Iterable[str]):
+ def __init__(
+ self,
+ files: Optional[Union[str, Iterable[str]]] = None,
+ inplace: bool = ...,
+ backup: str = ...,
+ bufsize: int = ...,
+ mode: str = ...,
+ openhook: Callable[[str, str], IO[str]] = ...
+ ) -> None: ...
+
+ def __del__(self) -> None: ...
+ def close(self) -> None: ...
+ def __iter__(self) -> Iterator[str]: ...
+ def __getitem__(self, i: Union[int, slice]) -> str: ...
+ def next(self) -> str: ...
+ def nextfile(self) -> None: ...
+ def readline(self) -> str: ...
+ def filename(self) -> Optional[str]: ...
+ def lineno(self) -> int: ...
+ def filelineno(self) -> int: ...
+ def fileno(self) -> int: ...
+ def isfirstline(self) -> bool: ...
+ def isstdin(self) -> bool: ...
+
+def input(
+ files: Optional[Union[str, Iterable[str]]] = None,
+ inplace: bool = ...,
+ backup: str = ...,
+ bufsize: int = ...,
+ mode: str = ...,
+ openhook: Callable[[str, str], IO[str]] = ...) -> FileInput: ...
+
+
+def filename() -> Optional[str]: ...
+def lineno() -> int: ...
+def filelineno() -> int: ...
+def isfirstline() -> bool: ...
+def isstdin() -> bool: ...
+def nextfile() -> None: ...
+def close() -> None: ...
+
+def hook_compressed(filename: str, mode: str) -> IO[str]: ...
+def hook_encoded(encoding: str) -> Callable[[str, str], IO[str]]: ...
diff --git a/typeshed/stdlib/2/fnmatch.pyi b/typeshed/stdlib/2/fnmatch.pyi
new file mode 100644
index 0000000..23b5978
--- /dev/null
+++ b/typeshed/stdlib/2/fnmatch.pyi
@@ -0,0 +1,6 @@
+from typing import Iterable
+
+def fnmatch(filename: str, pattern: str) -> bool: ...
+def fnmatchcase(filename: str, pattern: str) -> bool: ...
+def filter(names: Iterable[str], pattern: str) -> Iterable[str]: ...
+def translate(pattern: str) -> str: ...
diff --git a/typeshed/stdlib/2/functools.pyi b/typeshed/stdlib/2/functools.pyi
new file mode 100644
index 0000000..f3bcc90
--- /dev/null
+++ b/typeshed/stdlib/2/functools.pyi
@@ -0,0 +1,34 @@
+# Stubs for functools (Python 2.7)
+
+# NOTE: These are incomplete!
+
+from abc import ABCMeta, abstractmethod
+from typing import Any, Callable, Generic, Dict, Iterable, Optional, Sequence, Tuple, TypeVar, overload
+from collections import namedtuple
+
+_AnyCallable = Callable[..., Any]
+
+_T = TypeVar("_T")
+_S = TypeVar("_S")
+ at overload
+def reduce(function: Callable[[_T, _T], _T],
+ sequence: Iterable[_T]) -> _T: ...
+ at overload
+def reduce(function: Callable[[_T, _S], _T],
+ sequence: Iterable[_S], initial: _T) -> _T: ...
+
+WRAPPER_ASSIGNMENTS = ... # type: Sequence[str]
+WRAPPER_UPDATES = ... # type: Sequence[str]
+
+def update_wrapper(wrapper: _AnyCallable, wrapped: _AnyCallable, assigned: Sequence[str] = ...,
+ updated: Sequence[str] = ...) -> None: ...
+def wraps(wrapped: _AnyCallable, assigned: Sequence[str] = ..., updated: Sequence[str] = ...) -> Callable[[_AnyCallable], _AnyCallable]: ...
+def total_ordering(cls: type) -> type: ...
+def cmp_to_key(mycmp: Callable[[_T, _T], int]) -> Callable[[_T], Any]: ...
+
+class partial(Generic[_T]):
+ func = ... # Callable[..., _T]
+ args = ... # type: Tuple[Any, ...]
+ keywords = ... # type: Dict[str, Any]
+ def __init__(self, func: Callable[..., _T], *args: Any, **kwargs: Any) -> None: ...
+ def __call__(self, *args: Any, **kwargs: Any) -> _T: ...
diff --git a/typeshed/stdlib/2/future_builtins.pyi b/typeshed/stdlib/2/future_builtins.pyi
new file mode 100644
index 0000000..a9b25b2
--- /dev/null
+++ b/typeshed/stdlib/2/future_builtins.pyi
@@ -0,0 +1,14 @@
+from typing import Any
+
+from itertools import ifilter as filter
+from itertools import imap as map
+from itertools import izip as zip
+
+
+def ascii(obj: Any) -> str: ...
+
+
+def hex(x: int) -> str: ...
+
+
+def oct(x: int) -> str: ...
diff --git a/typeshed/stdlib/2/gc.pyi b/typeshed/stdlib/2/gc.pyi
new file mode 100644
index 0000000..d93e996
--- /dev/null
+++ b/typeshed/stdlib/2/gc.pyi
@@ -0,0 +1,29 @@
+# Stubs for gc
+
+from typing import Any, List, Tuple
+
+
+def enable() -> None: ...
+def disable() -> None: ...
+def isenabled() -> bool: ...
+def collect(generation: int = ...) -> int: ...
+def set_debug(flags: int) -> None: ...
+def get_debug() -> int: ...
+def get_objects() -> List[Any]: ...
+def set_threshold(threshold0: int, threshold1: int = ...,
+ threshold2: int = ...) -> None: ...
+def get_count() -> Tuple[int, int, int]: ...
+def get_threshold() -> Tuple[int, int, int]: ...
+def get_referrers(*objs: Any) -> List[Any]: ...
+def get_referents(*objs: Any) -> List[Any]: ...
+def is_tracked(obj: Any) -> bool: ...
+
+garbage = ... # type: List[Any]
+
+DEBUG_STATS = ... # type: int
+DEBUG_COLLECTABLE = ... # type: int
+DEBUG_UNCOLLECTABLE = ... # type: int
+DEBUG_INSTANCES = ... # type: int
+DEBUG_OBJECTS = ... # type: int
+DEBUG_SAVEALL = ... # type: int
+DEBUG_LEAK = ... # type: int
diff --git a/typeshed/stdlib/2/genericpath.pyi b/typeshed/stdlib/2/genericpath.pyi
new file mode 100644
index 0000000..85f1c0f
--- /dev/null
+++ b/typeshed/stdlib/2/genericpath.pyi
@@ -0,0 +1,14 @@
+# Stubs for genericpath (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+class _unicode: ...
+
+def exists(path): ...
+def isfile(path): ...
+def isdir(s): ...
+def getsize(filename): ...
+def getmtime(filename): ...
+def getatime(filename): ...
+def getctime(filename): ...
+def commonprefix(m): ...
diff --git a/typeshed/stdlib/2/getopt.pyi b/typeshed/stdlib/2/getopt.pyi
new file mode 100644
index 0000000..bc6577f
--- /dev/null
+++ b/typeshed/stdlib/2/getopt.pyi
@@ -0,0 +1,17 @@
+from typing import List, Tuple
+
+class GetoptError(Exception):
+ opt = ... # type: str
+ msg = ... # type: str
+ def __init__(self, msg: str, opt: str=...) -> None: ...
+ def __str__(self) -> str: ...
+
+error = GetoptError
+
+def getopt(args: List[str], shortopts: str,
+ longopts: List[str]=...) -> Tuple[List[Tuple[str, str]],
+ List[str]]: ...
+
+def gnu_getopt(args: List[str], shortopts: str,
+ longopts: List[str]=...) -> Tuple[List[Tuple[str, str]],
+ List[str]]: ...
diff --git a/typeshed/stdlib/2/getpass.pyi b/typeshed/stdlib/2/getpass.pyi
new file mode 100644
index 0000000..011fc8e
--- /dev/null
+++ b/typeshed/stdlib/2/getpass.pyi
@@ -0,0 +1,8 @@
+# Stubs for getpass (Python 2)
+
+from typing import Any, IO
+
+class GetPassWarning(UserWarning): ...
+
+def getpass(prompt: str = ..., stream: IO[Any] = ...) -> str: ...
+def getuser() -> str: ...
diff --git a/typeshed/stdlib/2/gettext.pyi b/typeshed/stdlib/2/gettext.pyi
new file mode 100644
index 0000000..51dd523
--- /dev/null
+++ b/typeshed/stdlib/2/gettext.pyi
@@ -0,0 +1,43 @@
+# TODO(MichalPokorny): better types
+
+from typing import Any, IO, List, Optional, Union
+
+def bindtextdomain(domain: str, localedir: str = ...) -> str: ...
+def bind_textdomain_codeset(domain: str, codeset: str = ...) -> str: ...
+def textdomain(domain: str = ...) -> str: ...
+def gettext(message: str) -> str: ...
+def lgettext(message: str) -> str: ...
+def dgettext(domain: str, message: str) -> str: ...
+def ldgettext(domain: str, message: str) -> str: ...
+def ngettext(singular: str, plural: str, n: int) -> str: ...
+def lngettext(singular: str, plural: str, n: int) -> str: ...
+def dngettext(domain: str, singular: str, plural: str, n: int) -> str: ...
+def ldngettext(domain: str, singular: str, plural: str, n: int) -> str: ...
+
+class NullTranslations(object):
+ def __init__(self, fp: IO[str] = ...) -> None: ...
+ def _parse(self, fp: IO[str]) -> None: ...
+ def add_fallback(self, fallback: NullTranslations) -> None: ...
+ def gettext(self, message: str) -> str: ...
+ def lgettext(self, message: str) -> str: ...
+ def ugettext(self, message: Union[str, unicode]) -> unicode: ...
+ def ngettext(self, singular: str, plural: str, n: int) -> str: ...
+ def lngettext(self, singular: str, plural: str, n: int) -> str: ...
+ def ungettext(self, singular: Union[str, unicode], plural: Union[str, unicode], n: int) -> unicode: ...
+ def info(self) -> Any: ...
+ def charset(self) -> Any: ...
+ def output_charset(self) -> Any: ...
+ def set_output_charset(self, charset: Any) -> None: ...
+ def install(self, unicode: bool = ..., names: Any = ...) -> None: ...
+
+class GNUTranslations(NullTranslations):
+ LE_MAGIC = ... # type: int
+ BE_MAGIC = ... # type: int
+
+def find(domain: str, localedir: str = ..., languages: List[str] = ...,
+ all: Any = ...) -> Optional[Union[str, List[str]]]: ...
+
+def translation(domain: str, localedir: str = ..., languages: List[str] = ...,
+ class_: Any = ..., fallback: Any = ..., codeset: Any = ...) -> NullTranslations: ...
+def install(domain: str, localedir: str = ..., unicode: Any = ..., codeset: Any = ...,
+ names: Any = ...) -> None: ...
diff --git a/typeshed/stdlib/2/glob.pyi b/typeshed/stdlib/2/glob.pyi
new file mode 100644
index 0000000..9b70e5c
--- /dev/null
+++ b/typeshed/stdlib/2/glob.pyi
@@ -0,0 +1,4 @@
+from typing import List, Iterator, AnyStr
+
+def glob(pathname: AnyStr) -> List[AnyStr]: ...
+def iglob(pathname: AnyStr) -> Iterator[AnyStr]: ...
diff --git a/typeshed/stdlib/2/grp.pyi b/typeshed/stdlib/2/grp.pyi
new file mode 100644
index 0000000..6a1f758
--- /dev/null
+++ b/typeshed/stdlib/2/grp.pyi
@@ -0,0 +1,11 @@
+from typing import Optional, List
+
+class struct_group(object):
+ gr_name = ... # type: Optional[str]
+ gr_passwd = ... # type: Optional[str]
+ gr_gid = ... # type: int
+ gr_mem = ... # type: List[str]
+
+def getgrall() -> List[struct_group]: ...
+def getgrgid(id: int) -> struct_group: ...
+def getgrnam(name: str) -> struct_group: ...
diff --git a/typeshed/stdlib/2/gzip.pyi b/typeshed/stdlib/2/gzip.pyi
new file mode 100644
index 0000000..30d9e83
--- /dev/null
+++ b/typeshed/stdlib/2/gzip.pyi
@@ -0,0 +1,41 @@
+# Stubs for gzip (Python 2)
+#
+# NOTE: Based on a dynamically typed stub automatically generated by stubgen.
+
+from typing import Any, IO
+import io
+
+class GzipFile(io.BufferedIOBase):
+ myfileobj = ... # type: Any
+ max_read_chunk = ... # type: Any
+ mode = ... # type: Any
+ extrabuf = ... # type: Any
+ extrasize = ... # type: Any
+ extrastart = ... # type: Any
+ name = ... # type: Any
+ min_readsize = ... # type: Any
+ compress = ... # type: Any
+ fileobj = ... # type: Any
+ offset = ... # type: Any
+ mtime = ... # type: Any
+ def __init__(self, filename: str = ..., mode: str = ..., compresslevel: int = ...,
+ fileobj: IO[str] = ..., mtime: float = ...) -> None: ...
+ @property
+ def filename(self): ...
+ size = ... # type: Any
+ crc = ... # type: Any
+ def write(self, data): ...
+ def read(self, size=...): ...
+ @property
+ def closed(self): ...
+ def close(self): ...
+ def flush(self, zlib_mode=...): ...
+ def fileno(self): ...
+ def rewind(self): ...
+ def readable(self): ...
+ def writable(self): ...
+ def seekable(self): ...
+ def seek(self, offset, whence=...): ...
+ def readline(self, size=...): ...
+
+def open(filename: str, mode: str = ..., compresslevel: int = ...) -> GzipFile: ...
diff --git a/typeshed/stdlib/2/hashlib.pyi b/typeshed/stdlib/2/hashlib.pyi
new file mode 100644
index 0000000..95f2b82
--- /dev/null
+++ b/typeshed/stdlib/2/hashlib.pyi
@@ -0,0 +1,27 @@
+# Stubs for hashlib (Python 2)
+
+from typing import Tuple
+
+class _hash(object):
+ # This is not actually in the module namespace.
+ digest_size = 0
+ block_size = 0
+ def update(self, arg: str) -> None: ...
+ def digest(self) -> str: ...
+ def hexdigest(self) -> str: ...
+ def copy(self) -> _hash: ...
+
+def new(name: str, data: str = ...) -> _hash: ...
+
+def md5(s: str = ...) -> _hash: ...
+def sha1(s: str = ...) -> _hash: ...
+def sha224(s: str = ...) -> _hash: ...
+def sha256(s: str = ...) -> _hash: ...
+def sha384(s: str = ...) -> _hash: ...
+def sha512(s: str = ...) -> _hash: ...
+
+algorithms = ... # type: Tuple[str, ...]
+algorithms_guaranteed = ... # type: Tuple[str, ...]
+algorithms_available = ... # type: Tuple[str, ...]
+
+def pbkdf2_hmac(name: str, password: str, salt: str, rounds: int, dklen: int = ...) -> str: ...
diff --git a/typeshed/stdlib/2/heapq.pyi b/typeshed/stdlib/2/heapq.pyi
new file mode 100644
index 0000000..4a7a65f
--- /dev/null
+++ b/typeshed/stdlib/2/heapq.pyi
@@ -0,0 +1,15 @@
+from typing import TypeVar, List, Iterable, Any, Callable
+
+_T = TypeVar('_T')
+
+def cmp_lt(x, y) -> bool: ...
+def heappush(heap: List[_T], item: _T) -> None: ...
+def heappop(heap: List[_T]) -> _T:
+ raise IndexError() # if heap is empty
+def heappushpop(heap: List[_T], item: _T) -> _T: ...
+def heapify(x: List[_T]) -> None: ...
+def heapreplace(heap: List[_T], item: _T) -> _T:
+ raise IndexError() # if heap is empty
+def merge(*iterables: Iterable[_T]) -> Iterable[_T]: ...
+def nlargest(n: int, iterable: Iterable[_T]) -> List[_T]: ...
+def nsmallest(n: int, iterable: Iterable[_T]) -> List[_T]: ...
diff --git a/typeshed/stdlib/2/htmlentitydefs.pyi b/typeshed/stdlib/2/htmlentitydefs.pyi
new file mode 100644
index 0000000..c90f3a9
--- /dev/null
+++ b/typeshed/stdlib/2/htmlentitydefs.pyi
@@ -0,0 +1,9 @@
+# Stubs for htmlentitydefs (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Mapping
+
+name2codepoint = ... # type: Mapping[str, int]
+codepoint2name = ... # type: Mapping[int, str]
+entitydefs = ... # type: Mapping[str, str]
diff --git a/typeshed/stdlib/2/httplib.pyi b/typeshed/stdlib/2/httplib.pyi
new file mode 100644
index 0000000..d8d5e51
--- /dev/null
+++ b/typeshed/stdlib/2/httplib.pyi
@@ -0,0 +1,189 @@
+# Stubs for httplib (Python 2)
+#
+# Generated by stubgen and manually massaged a bit.
+# Needs lots more work!
+
+from typing import Any, Dict
+import mimetools
+
+class HTTPMessage(mimetools.Message):
+ def addheader(self, key: str, value: str) -> None: ...
+ def addcontinue(self, key: str, more: str) -> None: ...
+ dict = ... # type: Dict[str, str]
+ unixfrom = ... # type: str
+ headers = ... # type: Any
+ status = ... # type: str
+ seekable = ... # type: bool
+ def readheaders(self) -> None: ...
+
+class HTTPResponse:
+ fp = ... # type: Any
+ debuglevel = ... # type: Any
+ strict = ... # type: Any
+ msg = ... # type: Any
+ version = ... # type: Any
+ status = ... # type: Any
+ reason = ... # type: Any
+ chunked = ... # type: Any
+ chunk_left = ... # type: Any
+ length = ... # type: Any
+ will_close = ... # type: Any
+ def __init__(self, sock, debuglevel=0, strict=0, method=None, buffering: bool=...) -> None: ...
+ def begin(self): ...
+ def close(self): ...
+ def isclosed(self): ...
+ def read(self, amt=None): ...
+ def fileno(self): ...
+ def getheader(self, name, default=None): ...
+ def getheaders(self): ...
+
+class HTTPConnection:
+ response_class = ... # type: Any
+ default_port = ... # type: Any
+ auto_open = ... # type: Any
+ debuglevel = ... # type: Any
+ strict = ... # type: Any
+ timeout = ... # type: Any
+ source_address = ... # type: Any
+ sock = ... # type: Any
+ def __init__(self, host, port=None, strict=None, timeout=..., source_address=None) -> None: ...
+ def set_tunnel(self, host, port=None, headers=None): ...
+ def set_debuglevel(self, level): ...
+ def connect(self): ...
+ def close(self): ...
+ def send(self, data): ...
+ def putrequest(self, method, url, skip_host=0, skip_accept_encoding=0): ...
+ def putheader(self, header, *values): ...
+ def endheaders(self, message_body=None): ...
+ def request(self, method, url, body=None, headers=...): ...
+ def getresponse(self, buffering: bool=...): ...
+
+class HTTP:
+ debuglevel = ... # type: Any
+ def __init__(self, host: str=..., port=None, strict=None) -> None: ...
+ def connect(self, host=None, port=None): ...
+ def getfile(self): ...
+ file = ... # type: Any
+ headers = ... # type: Any
+ def getreply(self, buffering: bool=...): ...
+ def close(self): ...
+
+class HTTPSConnection(HTTPConnection):
+ default_port = ... # type: Any
+ key_file = ... # type: Any
+ cert_file = ... # type: Any
+ def __init__(self, host, port=None, key_file=None, cert_file=None, strict=None, timeout=..., source_address=None, context=None) -> None: ...
+ sock = ... # type: Any
+ def connect(self): ...
+
+class HTTPS(HTTP):
+ key_file = ... # type: Any
+ cert_file = ... # type: Any
+ def __init__(self, host: str=..., port=None, key_file=None, cert_file=None, strict=None, context=None) -> None: ...
+
+class HTTPException(Exception): ...
+class NotConnected(HTTPException): ...
+class InvalidURL(HTTPException): ...
+
+class UnknownProtocol(HTTPException):
+ args = ... # type: Any
+ version = ... # type: Any
+ def __init__(self, version) -> None: ...
+
+class UnknownTransferEncoding(HTTPException): ...
+class UnimplementedFileMode(HTTPException): ...
+
+class IncompleteRead(HTTPException):
+ args = ... # type: Any
+ partial = ... # type: Any
+ expected = ... # type: Any
+ def __init__(self, partial, expected=None) -> None: ...
+
+class ImproperConnectionState(HTTPException): ...
+class CannotSendRequest(ImproperConnectionState): ...
+class CannotSendHeader(ImproperConnectionState): ...
+class ResponseNotReady(ImproperConnectionState): ...
+
+class BadStatusLine(HTTPException):
+ args = ... # type: Any
+ line = ... # type: Any
+ def __init__(self, line) -> None: ...
+
+class LineTooLong(HTTPException):
+ def __init__(self, line_type) -> None: ...
+
+error = ... # type: Any
+
+class LineAndFileWrapper:
+ def __init__(self, line, file) -> None: ...
+ def __getattr__(self, attr): ...
+ def read(self, amt=None): ...
+ def readline(self): ...
+ def readlines(self, size=None): ...
+
+# Constants
+
+responses = ... # type: Dict[int, str]
+
+HTTP_PORT = ... # type: int
+HTTPS_PORT = ... # type: int
+
+# status codes
+# informational
+CONTINUE = ... # type: int
+SWITCHING_PROTOCOLS = ... # type: int
+PROCESSING = ... # type: int
+
+# successful
+OK = ... # type: int
+CREATED = ... # type: int
+ACCEPTED = ... # type: int
+NON_AUTHORITATIVE_INFORMATION = ... # type: int
+NO_CONTENT = ... # type: int
+RESET_CONTENT = ... # type: int
+PARTIAL_CONTENT = ... # type: int
+MULTI_STATUS = ... # type: int
+IM_USED = ... # type: int
+
+# redirection
+MULTIPLE_CHOICES = ... # type: int
+MOVED_PERMANENTLY = ... # type: int
+FOUND = ... # type: int
+SEE_OTHER = ... # type: int
+NOT_MODIFIED = ... # type: int
+USE_PROXY = ... # type: int
+TEMPORARY_REDIRECT = ... # type: int
+
+# client error
+BAD_REQUEST = ... # type: int
+UNAUTHORIZED = ... # type: int
+PAYMENT_REQUIRED = ... # type: int
+FORBIDDEN = ... # type: int
+NOT_FOUND = ... # type: int
+METHOD_NOT_ALLOWED = ... # type: int
+NOT_ACCEPTABLE = ... # type: int
+PROXY_AUTHENTICATION_REQUIRED = ... # type: int
+REQUEST_TIMEOUT = ... # type: int
+CONFLICT = ... # type: int
+GONE = ... # type: int
+LENGTH_REQUIRED = ... # type: int
+PRECONDITION_FAILED = ... # type: int
+REQUEST_ENTITY_TOO_LARGE = ... # type: int
+REQUEST_URI_TOO_LONG = ... # type: int
+UNSUPPORTED_MEDIA_TYPE = ... # type: int
+REQUESTED_RANGE_NOT_SATISFIABLE = ... # type: int
+EXPECTATION_FAILED = ... # type: int
+UNPROCESSABLE_ENTITY = ... # type: int
+LOCKED = ... # type: int
+FAILED_DEPENDENCY = ... # type: int
+UPGRADE_REQUIRED = ... # type: int
+
+# server error
+INTERNAL_SERVER_ERROR = ... # type: int
+NOT_IMPLEMENTED = ... # type: int
+BAD_GATEWAY = ... # type: int
+SERVICE_UNAVAILABLE = ... # type: int
+GATEWAY_TIMEOUT = ... # type: int
+HTTP_VERSION_NOT_SUPPORTED = ... # type: int
+INSUFFICIENT_STORAGE = ... # type: int
+NOT_EXTENDED = ... # type: int
diff --git a/typeshed/stdlib/2/imp.pyi b/typeshed/stdlib/2/imp.pyi
new file mode 100644
index 0000000..ffb1ad3
--- /dev/null
+++ b/typeshed/stdlib/2/imp.pyi
@@ -0,0 +1,35 @@
+"""Stubs for the 'imp' module."""
+
+from typing import List, Optional, Tuple, Iterable, IO, Any
+import types
+
+C_BUILTIN = ... # type: int
+C_EXTENSION = ... # type: int
+IMP_HOOK = ... # type: int
+PKG_DIRECTORY = ... # type: int
+PY_CODERESOURCE = ... # type: int
+PY_COMPILED = ... # type: int
+PY_FROZEN = ... # type: int
+PY_RESOURCE = ... # type: int
+PY_SOURCE = ... # type: int
+SEARCH_ERROR = ... # type: int
+
+def acquire_lock() -> None: ...
+def find_module(name: str, path: Iterable[str] = ...) -> Optional[Tuple[str, str, Tuple[str, str, int]]]: ...
+def get_magic() -> str: ...
+def get_suffixes() -> List[Tuple[str, str, int]]: ...
+def init_builtin(name: str) -> types.ModuleType: ...
+def init_frozen(name: str) -> types.ModuleType: ...
+def is_builtin(name: str) -> int: ...
+def is_frozen(name: str) -> bool: ...
+def load_compiled(name: str, pathname: str, file: IO[Any] = ...) -> types.ModuleType: ...
+def load_dynamic(name: str, pathname: str, file: IO[Any] = ...) -> types.ModuleType: ...
+def load_module(name: str, file: str, pathname: str, description: Tuple[str, str, int]) -> types.ModuleType: ...
+def load_source(name: str, pathname: str, file: IO[Any] = ...) -> types.ModuleType: ...
+def lock_held() -> bool: ...
+def new_module(name: str) -> types.ModuleType: ...
+def release_lock() -> None: ...
+
+class NullImporter:
+ def __init__(self, path_string: str) -> None: ...
+ def find_module(self, fullname: str, path: str = ...) -> None: ...
diff --git a/typeshed/stdlib/2/importlib.pyi b/typeshed/stdlib/2/importlib.pyi
new file mode 100644
index 0000000..afa073d
--- /dev/null
+++ b/typeshed/stdlib/2/importlib.pyi
@@ -0,0 +1,3 @@
+import types
+
+def import_module(name: str, package: str = ...) -> types.ModuleType: ...
diff --git a/typeshed/stdlib/2/inspect.pyi b/typeshed/stdlib/2/inspect.pyi
new file mode 100644
index 0000000..e86da66
--- /dev/null
+++ b/typeshed/stdlib/2/inspect.pyi
@@ -0,0 +1,88 @@
+# TODO incomplete
+from types import TracebackType, FrameType, ModuleType
+from typing import Any, Callable, List, Optional, Tuple, Union, NamedTuple
+
+# Types and members
+ModuleInfo = NamedTuple('ModuleInfo', [('name', str),
+ ('suffix', str),
+ ('mode', str),
+ ('module_type', int),
+ ])
+def getmembers(
+ object: object,
+ predicate: Callable[[Any], bool] = ...
+) -> List[Tuple[str, Any]]: ...
+def getmoduleinfo(path: str) -> Optional[ModuleInfo]: ...
+def getmodulename(path: str) -> Optional[str]: ...
+
+def ismodule(object: object) -> bool: ...
+def isclass(object: object) -> bool: ...
+def ismethod(object: object) -> bool: ...
+def isfunction(object: object) -> bool: ...
+def isisgeneratorfunction(object: object) -> bool: ...
+def isgenerator(object: object) -> bool: ...
+def istraceback(object: object) -> bool: ...
+def isframe(object: object) -> bool: ...
+def iscode(object: object) -> bool: ...
+def isbuiltin(object: object) -> bool: ...
+def isroutine(object: object) -> bool: ...
+def isabstract(object: object) -> bool: ...
+def ismethoddescriptor(object: object) -> bool: ...
+def isdatadescriptor(object: object) -> bool: ...
+def isgetsetdescriptor(object: object) -> bool: ...
+def ismemberdescriptor(object: object) -> bool: ...
+
+# Retrieving source code
+def getdoc(object: object) -> str: ...
+def getcomments(object: object) -> str: ...
+def getfile(object: object) -> str: ...
+def getmodule(object: object) -> ModuleType: ...
+def getsourcefile(object: object) -> str: ...
+# TODO restrict to "module, class, method, function, traceback, frame,
+# or code object"
+def getsourcelines(object: object) -> Tuple[List[str], int]: ...
+# TODO restrict to "a module, class, method, function, traceback, frame,
+# or code object"
+def getsource(object: object) -> str: ...
+def cleandoc(doc: str) -> str: ...
+
+# Classes and functions
+# TODO make the return type more specific
+def getclasstree(classes: List[type], unique: bool = ...) -> Any: ...
+
+ArgSpec = NamedTuple('ArgSpec', [('args', List[str]),
+ ('varargs', str),
+ ('keywords', str),
+ ('defaults', tuple),
+ ])
+
+def getargspec(func: object) -> ArgSpec: ...
+# TODO make the return type more specific
+def getargvalues(frame: FrameType) -> Any: ...
+# TODO formatargspec
+# TODO formatargvalues
+def getmro(cls: type) -> Tuple[type, ...]: ...
+# TODO getcallargs
+
+# The interpreter stack
+
+Traceback = NamedTuple(
+ 'Traceback',
+ [
+ ('filename', str),
+ ('lineno', int),
+ ('function', str),
+ ('code_context', List[str]),
+ ('index', int),
+ ]
+)
+
+_FrameRecord = Tuple[FrameType, str, int, str, List[str], int]
+
+def getouterframes(frame: FrameType, context: int = ...) -> List[FrameType]: ...
+def getframeinfo(frame: Union[FrameType, TracebackType], context: int = ...) -> Traceback: ...
+def getinnerframes(traceback: TracebackType, context: int = ...) -> List[FrameType]: ...
+
+def currentframe() -> FrameType: ...
+def stack(context: int = ...) -> List[_FrameRecord]: ...
+def trace(context: int = ...) -> List[_FrameRecord]: ...
diff --git a/typeshed/stdlib/2/io.pyi b/typeshed/stdlib/2/io.pyi
new file mode 100644
index 0000000..5fa20c7
--- /dev/null
+++ b/typeshed/stdlib/2/io.pyi
@@ -0,0 +1,105 @@
+# Stubs for io
+
+# Based on https://docs.python.org/2/library/io.html
+
+# Only a subset of functionality is included.
+
+from typing import List, BinaryIO, TextIO, IO, overload, Iterator, Iterable, Any, Union
+
+DEFAULT_BUFFER_SIZE = 0
+
+def open(file: Union[str, unicode, int],
+ mode: unicode = ..., buffering: int = ..., encoding: unicode = ...,
+ errors: unicode = ..., newline: unicode = ...,
+ closefd: bool = ...) -> IO[Any]: ...
+
+class IOBase:
+ # TODO
+ ...
+
+class BytesIO(BinaryIO):
+ def __init__(self, initial_bytes: str = ...) -> None: ...
+ # TODO getbuffer
+ # TODO see comments in BinaryIO for missing functionality
+ def close(self) -> None: ...
+ def closed(self) -> bool: ...
+ def fileno(self) -> int: ...
+ def flush(self) -> None: ...
+ def isatty(self) -> bool: ...
+ def read(self, n: int = ...) -> str: ...
+ def readable(self) -> bool: ...
+ def readline(self, limit: int = ...) -> str: ...
+ def readlines(self, hint: int = ...) -> List[str]: ...
+ def seek(self, offset: int, whence: int = ...) -> None: ...
+ def seekable(self) -> bool: ...
+ def tell(self) -> int: ...
+ def truncate(self, size: int = ...) -> int: ...
+ def writable(self) -> bool: ...
+ def write(self, s: str) -> None: ...
+ def writelines(self, lines: Iterable[str]) -> None: ...
+ def getvalue(self) -> str: ...
+ def read1(self) -> str: ...
+
+ def __iter__(self) -> Iterator[str]: ...
+ def next(self) -> str: ...
+ def __enter__(self) -> 'BytesIO': ...
+ def __exit__(self, type, value, traceback) -> bool: ...
+
+class StringIO(TextIO):
+ def __init__(self, initial_value: unicode = ...,
+ newline: unicode = ...) -> None: ...
+ # TODO see comments in BinaryIO for missing functionality
+ name = ... # type: str
+ def close(self) -> None: ...
+ def closed(self) -> bool: ...
+ def fileno(self) -> int: ...
+ def flush(self) -> None: ...
+ def isatty(self) -> bool: ...
+ def read(self, n: int = ...) -> unicode: ...
+ def readable(self) -> bool: ...
+ def readline(self, limit: int = ...) -> unicode: ...
+ def readlines(self, hint: int = ...) -> List[unicode]: ...
+ def seek(self, offset: int, whence: int = ...) -> None: ...
+ def seekable(self) -> bool: ...
+ def tell(self) -> int: ...
+ def truncate(self, size: int = ...) -> int: ...
+ def writable(self) -> bool: ...
+ def write(self, s: unicode) -> None: ...
+ def writelines(self, lines: Iterable[unicode]) -> None: ...
+ def getvalue(self) -> unicode: ...
+
+ def __iter__(self) -> Iterator[unicode]: ...
+ def next(self) -> unicode: ...
+ def __enter__(self) -> 'StringIO': ...
+ def __exit__(self, type, value, traceback) -> bool: ...
+
+class TextIOWrapper(TextIO):
+ # write_through is undocumented but used by subprocess
+ def __init__(self, buffer: IO[str], encoding: unicode = ...,
+ errors: unicode = ..., newline: unicode = ...,
+ line_buffering: bool = ...,
+ write_through: bool = ...) -> None: ...
+ # TODO see comments in BinaryIO for missing functionality
+ def close(self) -> None: ...
+ def closed(self) -> bool: ...
+ def fileno(self) -> int: ...
+ def flush(self) -> None: ...
+ def isatty(self) -> bool: ...
+ def read(self, n: int = ...) -> unicode: ...
+ def readable(self) -> bool: ...
+ def readline(self, limit: int = ...) -> unicode: ...
+ def readlines(self, hint: int = ...) -> List[unicode]: ...
+ def seek(self, offset: int, whence: int = ...) -> None: ...
+ def seekable(self) -> bool: ...
+ def tell(self) -> int: ...
+ def truncate(self, size: int = ...) -> int: ...
+ def writable(self) -> bool: ...
+ def write(self, s: unicode) -> None: ...
+ def writelines(self, lines: Iterable[unicode]) -> None: ...
+
+ def __iter__(self) -> Iterator[unicode]: ...
+ def next(self) -> unicode: ...
+ def __enter__(self) -> StringIO: ...
+ def __exit__(self, type, value, traceback) -> bool: ...
+
+class BufferedIOBase(IOBase): ...
diff --git a/typeshed/stdlib/2/itertools.pyi b/typeshed/stdlib/2/itertools.pyi
new file mode 100644
index 0000000..286d200
--- /dev/null
+++ b/typeshed/stdlib/2/itertools.pyi
@@ -0,0 +1,87 @@
+# Stubs for itertools
+
+# Based on https://docs.python.org/2/library/itertools.html
+
+from typing import (Iterator, TypeVar, Iterable, overload, Any, Callable, Tuple,
+ Union, Sequence, Generic, Optional)
+
+_T = TypeVar('_T')
+_S = TypeVar('_S')
+
+def count(start: int = ...,
+ step: int = ...) -> Iterator[int]: ... # more general types?
+def cycle(iterable: Iterable[_T]) -> Iterator[_T]: ...
+
+def repeat(object: _T, times: int = ...) -> Iterator[_T]: ...
+
+def accumulate(iterable: Iterable[_T]) -> Iterator[_T]: ...
+
+class chain(Iterator[_T], Generic[_T]):
+ def __init__(self, *iterables: Iterable[_T]) -> None: ...
+ def next(self) -> _T: ...
+ def __iter__(self) -> Iterator[_T]: ...
+ @staticmethod
+ def from_iterable(iterable: Iterable[Iterable[_S]]) -> Iterator[_S]: ...
+
+def compress(data: Iterable[_T], selectors: Iterable[Any]) -> Iterator[_T]: ...
+def dropwhile(predicate: Callable[[_T], Any],
+ iterable: Iterable[_T]) -> Iterator[_T]: ...
+def ifilter(predicate: Callable[[_T], Any],
+ iterable: Iterable[_T]) -> Iterator[_T]: ...
+def ifilterfalse(predicate: Callable[[_T], Any],
+ iterable: Iterable[_T]) -> Iterator[_T]: ...
+
+ at overload
+def groupby(iterable: Iterable[_T]) -> Iterator[Tuple[_T, Iterator[_T]]]: ...
+ at overload
+def groupby(iterable: Iterable[_T],
+ key: Callable[[_T], _S]) -> Iterator[Tuple[_S, Iterator[_T]]]: ...
+
+ at overload
+def islice(iterable: Iterable[_T], stop: int) -> Iterator[_T]: ...
+ at overload
+def islice(iterable: Iterable[_T], start: int, stop: Optional[int],
+ step: int = ...) -> Iterator[_T]: ...
+
+_T1 = TypeVar('_T1')
+_T2 = TypeVar('_T2')
+_T3 = TypeVar('_T3')
+_T4 = TypeVar('_T4')
+
+ at overload
+def imap(func: Callable[[_T1], _S], iter1: Iterable[_T1]) -> Iterable[_S]: ...
+ at overload
+def imap(func: Callable[[_T1, _T2], _S],
+ iter1: Iterable[_T1],
+ iter2: Iterable[_T2]) -> Iterable[_S]: ... # TODO more than two iterables
+
+def starmap(func: Any, iterable: Iterable[Any]) -> Iterator[Any]: ...
+def takewhile(predicate: Callable[[_T], Any],
+ iterable: Iterable[_T]) -> Iterator[_T]: ...
+def tee(iterable: Iterable[Any], n: int = ...) -> Iterator[Any]: ...
+
+ at overload
+def izip(iter1: Iterable[_T1]) -> Iterable[Tuple[_T1]]: ...
+ at overload
+def izip(iter1: Iterable[_T1],
+ iter2: Iterable[_T2]) -> Iterable[Tuple[_T1, _T2]]: ...
+ at overload
+def izip(iter1: Iterable[_T1], iter2: Iterable[_T2],
+ iter3: Iterable[_T3]) -> Iterable[Tuple[_T1, _T2, _T3]]: ...
+ at overload
+def izip(iter1: Iterable[_T1], iter2: Iterable[_T2], iter3: Iterable[_T3],
+ iter4: Iterable[_T4]) -> Iterable[Tuple[_T1, _T2,
+ _T3, _T4]]: ... # TODO more than four iterables
+def izip_longest(*p: Iterable[Any],
+ fillvalue: Any = ...) -> Iterator[Any]: ...
+
+# TODO: Return type should be Iterator[Tuple[..]], but unknown tuple shape.
+# Iterator[Sequence[_T]] loses this type information.
+def product(*p: Iterable[_T], repeat: int = ...) -> Iterator[Sequence[_T]]: ...
+
+def permutations(iterable: Iterable[_T],
+ r: int = ...) -> Iterator[Sequence[_T]]: ...
+def combinations(iterable: Iterable[_T],
+ r: int) -> Iterable[Sequence[_T]]: ...
+def combinations_with_replacement(iterable: Iterable[_T],
+ r: int) -> Iterable[Sequence[_T]]: ...
diff --git a/typeshed/stdlib/2/json.pyi b/typeshed/stdlib/2/json.pyi
new file mode 100644
index 0000000..44a2067
--- /dev/null
+++ b/typeshed/stdlib/2/json.pyi
@@ -0,0 +1,97 @@
+from typing import Any, IO, Optional, Tuple, Callable, Dict, List, Union, Text
+
+class JSONDecodeError(ValueError):
+ def dumps(self, obj: Any) -> str: ...
+ def dump(self, obj: Any, fp: IO[str], *args: Any, **kwds: Any) -> None: ...
+ def loads(self, s: str) -> Any: ...
+ def load(self, fp: IO[str]) -> Any: ...
+
+def dumps(obj: Any,
+ skipkeys: bool = ...,
+ ensure_ascii: bool = ...,
+ check_circular: bool = ...,
+ allow_nan: bool = ...,
+ cls: Any = ...,
+ indent: Optional[int] = ...,
+ separators: Optional[Tuple[str, str]] = ...,
+ encoding: str = ...,
+ default: Optional[Callable[[Any], Any]] = ...,
+ sort_keys: bool = ...,
+ **kwds: Any) -> str: ...
+
+def dump(obj: Any,
+ fp: IO[str],
+ skipkeys: bool = ...,
+ ensure_ascii: bool = ...,
+ check_circular: bool = ...,
+ allow_nan: bool = ...,
+ cls: Any = ...,
+ indent: Optional[int] = ...,
+ separators: Optional[Tuple[str, str]] = ...,
+ encoding: str = ...,
+ default: Optional[Callable[[Any], Any]] = ...,
+ sort_keys: bool = ...,
+ **kwds: Any) -> None: ...
+
+def loads(s: Union[Text, bytes],
+ encoding: Any = ...,
+ cls: Any = ...,
+ object_hook: Optional[Callable[[Dict], Any]] = ...,
+ parse_float: Optional[Callable[[str], Any]] = ...,
+ parse_int: Optional[Callable[[str], Any]] = ...,
+ parse_constant: Optional[Callable[[str], Any]] = ...,
+ object_pairs_hook: Optional[Callable[[List[Tuple[Any, Any]]], Any]] = ...,
+ **kwds: Any) -> Any: ...
+
+def load(fp: IO[str],
+ encoding: Optional[str] = ...,
+ cls: Any = ...,
+ object_hook: Optional[Callable[[Dict], Any]] = ...,
+ parse_float: Optional[Callable[[str], Any]] = ...,
+ parse_int: Optional[Callable[[str], Any]] = ...,
+ parse_constant: Optional[Callable[[str], Any]] = ...,
+ object_pairs_hook: Optional[Callable[[List[Tuple[Any, Any]]], Any]] = ...,
+ **kwds: Any) -> Any: ...
+
+class JSONDecoder(object):
+ def __init__(self,
+ encoding: Union[Text, bytes] = ...,
+ object_hook: Callable[..., Any] = ...,
+ parse_float: Callable[[str], float] = ...,
+ parse_int: Callable[[str], int] = ...,
+ parse_constant: Callable[[str], Any] = ...,
+ strict: bool = ...,
+ object_pairs_hook: Callable[..., Any] = ...) -> None: ...
+
+ def decode(self, s: Union[Text, bytes], _w: Any = ...) -> Any: ...
+
+ def raw_decode(self,
+ s: Union[Text, bytes],
+ idx: int = ...) -> Tuple[Any, Any]: ...
+
+class JSONEncoder(object):
+ item_separator = ... # type: str
+ key_separator = ... # type: str
+ skipkeys = ... # type: bool
+ ensure_ascii = ... # type: bool
+ check_circular = ... # type: bool
+ allow_nan = ... # type: bool
+ sort_keys = ... # type: bool
+ indent = ... # type: int
+
+ def __init__(self,
+ skipkeys: bool = ...,
+ ensure_ascii: bool = ...,
+ check_circular: bool = ...,
+ allow_nan: bool = ...,
+ sort_keys: bool = ...,
+ indent: int = ...,
+ separators: Tuple[Union[Text, bytes], Union[Text, bytes]] = ...,
+ encoding: Union[Text, bytes] = ...,
+ default: Callable[..., Any] = ...) -> None: ...
+
+ def default(self, o: Any) -> Any: ...
+
+ def encode(self, o: Any) -> str: ...
+
+ def iterencode(self, o: Any, _one_shot: bool = ...) -> str: ...
diff --git a/typeshed/stdlib/2/linecache.pyi b/typeshed/stdlib/2/linecache.pyi
new file mode 100644
index 0000000..9859788
--- /dev/null
+++ b/typeshed/stdlib/2/linecache.pyi
@@ -0,0 +1,7 @@
+# Stubs for linecache (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+def getline(filename, lineno, module_globals=None): ...
+def clearcache(): ...
+def checkcache(filename=None): ...
diff --git a/typeshed/stdlib/2/markupbase.pyi b/typeshed/stdlib/2/markupbase.pyi
new file mode 100644
index 0000000..129b49b
--- /dev/null
+++ b/typeshed/stdlib/2/markupbase.pyi
@@ -0,0 +1,9 @@
+from typing import Tuple
+
+class ParserBase(object):
+ def __init__(self) -> None: ...
+ def error(self, message: str) -> None: ...
+ def reset(self) -> None: ...
+ def getpos(self) -> Tuple[int, int]: ...
+
+ def unkown_decl(self, data: str) -> None: ...
diff --git a/typeshed/stdlib/2/md5.pyi b/typeshed/stdlib/2/md5.pyi
new file mode 100644
index 0000000..3488466
--- /dev/null
+++ b/typeshed/stdlib/2/md5.pyi
@@ -0,0 +1,11 @@
+# Stubs for Python 2.7 md5 stdlib module
+
+class md5(object):
+ def update(self, arg: str) -> None: ...
+ def digest(self) -> str: ...
+ def hexdigest(self) -> str: ...
+ def copy(self) -> md5: ...
+
+def new(string: str = ...) -> md5: ...
+blocksize = 0
+digest_size = 0
diff --git a/typeshed/stdlib/2/mimetools.pyi b/typeshed/stdlib/2/mimetools.pyi
new file mode 100644
index 0000000..abae2b5
--- /dev/null
+++ b/typeshed/stdlib/2/mimetools.pyi
@@ -0,0 +1,31 @@
+# Stubs for mimetools (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+import rfc822
+
+class Message(rfc822.Message):
+ encodingheader = ... # type: Any
+ typeheader = ... # type: Any
+ def __init__(self, fp, seekable=1): ...
+ plisttext = ... # type: Any
+ type = ... # type: Any
+ maintype = ... # type: Any
+ subtype = ... # type: Any
+ def parsetype(self): ...
+ plist = ... # type: Any
+ def parseplist(self): ...
+ def getplist(self): ...
+ def getparam(self, name): ...
+ def getparamnames(self): ...
+ def getencoding(self): ...
+ def gettype(self): ...
+ def getmaintype(self): ...
+ def getsubtype(self): ...
+
+def choose_boundary(): ...
+def decode(input, output, encoding): ...
+def encode(input, output, encoding): ...
+def copyliteral(input, output): ...
+def copybinary(input, output): ...
diff --git a/typeshed/stdlib/2/multiprocessing/__init__.pyi b/typeshed/stdlib/2/multiprocessing/__init__.pyi
new file mode 100644
index 0000000..c830c8b
--- /dev/null
+++ b/typeshed/stdlib/2/multiprocessing/__init__.pyi
@@ -0,0 +1,32 @@
+# Stubs for multiprocessing (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from multiprocessing.process import Process as Process, current_process as current_process, active_children as active_children
+from multiprocessing.util import SUBDEBUG as SUBDEBUG, SUBWARNING as SUBWARNING
+
+class ProcessError(Exception): ...
+class BufferTooShort(ProcessError): ...
+class TimeoutError(ProcessError): ...
+class AuthenticationError(ProcessError): ...
+
+def Manager(): ...
+def Pipe(duplex=True): ...
+def cpu_count() -> int: ...
+def freeze_support(): ...
+def get_logger(): ...
+def log_to_stderr(level=None): ...
+def allow_connection_pickling(): ...
+def Lock(): ...
+def RLock(): ...
+def Condition(lock=None): ...
+def Semaphore(value=1): ...
+def BoundedSemaphore(value=1): ...
+def Event(): ...
+def Queue(maxsize=0): ...
+def JoinableQueue(maxsize=0): ...
+def Pool(processes=None, initializer=None, initargs=..., maxtasksperchild=None): ...
+def RawValue(typecode_or_type, *args): ...
+def RawArray(typecode_or_type, size_or_initializer): ...
+def Value(typecode_or_type, *args, **kwds): ...
+def Array(typecode_or_type, size_or_initializer, **kwds): ...
diff --git a/typeshed/stdlib/2/multiprocessing/process.pyi b/typeshed/stdlib/2/multiprocessing/process.pyi
new file mode 100644
index 0000000..8d4af5d
--- /dev/null
+++ b/typeshed/stdlib/2/multiprocessing/process.pyi
@@ -0,0 +1,39 @@
+# Stubs for multiprocessing.process (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+def current_process(): ...
+def active_children(): ...
+
+class Process:
+ def __init__(self, group=None, target=None, name=None, args=..., kwargs=...): ...
+ def run(self): ...
+ def start(self): ...
+ def terminate(self): ...
+ def join(self, timeout=None): ...
+ def is_alive(self): ...
+ @property
+ def name(self): ...
+ @name.setter
+ def name(self, name): ...
+ @property
+ def daemon(self): ...
+ @daemon.setter
+ def daemon(self, daemonic): ...
+ @property
+ def authkey(self): ...
+ @authkey.setter
+ def authkey(self, authkey): ...
+ @property
+ def exitcode(self): ...
+ @property
+ def ident(self): ...
+ pid = ... # type: Any
+
+class AuthenticationString(bytes):
+ def __reduce__(self): ...
+
+class _MainProcess(Process):
+ def __init__(self): ...
diff --git a/typeshed/stdlib/2/multiprocessing/util.pyi b/typeshed/stdlib/2/multiprocessing/util.pyi
new file mode 100644
index 0000000..e660fab
--- /dev/null
+++ b/typeshed/stdlib/2/multiprocessing/util.pyi
@@ -0,0 +1,33 @@
+# Stubs for multiprocessing.util (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+import threading
+
+SUBDEBUG = ... # type: Any
+SUBWARNING = ... # type: Any
+
+def sub_debug(msg, *args): ...
+def debug(msg, *args): ...
+def info(msg, *args): ...
+def sub_warning(msg, *args): ...
+def get_logger(): ...
+def log_to_stderr(level=None): ...
+def get_temp_dir(): ...
+def register_after_fork(obj, func): ...
+
+class Finalize:
+ def __init__(self, obj, callback, args=..., kwargs=None, exitpriority=None): ...
+ def __call__(self, wr=None): ...
+ def cancel(self): ...
+ def still_active(self): ...
+
+def is_exiting(): ...
+
+class ForkAwareThreadLock:
+ def __init__(self): ...
+
+class ForkAwareLocal(threading.local):
+ def __init__(self): ...
+ def __reduce__(self): ...
diff --git a/typeshed/stdlib/2/optparse.pyi b/typeshed/stdlib/2/optparse.pyi
new file mode 100644
index 0000000..0606a62
--- /dev/null
+++ b/typeshed/stdlib/2/optparse.pyi
@@ -0,0 +1,249 @@
+# Generated by pytype, with only minor tweaks. Might be incomplete.
+
+from typing import Any, Optional, List, Callable, Tuple, Dict, Iterable, Union
+
+# See https://groups.google.com/forum/#!topic/python-ideas/gA1gdj3RZ5g
+Text = Union[str, unicode]
+
+NO_DEFAULT = ... # type: Tuple[str, ...]
+SUPPRESS_HELP = ... # type: str
+SUPPRESS_USAGE = ... # type: str
+
+def check_builtin(option: Option, opt, value: Text) -> Any: ...
+def check_choice(option: Option, opt, value) -> Any: ...
+def isbasestring(x) -> bool: ...
+
+class OptParseError(Exception):
+ msg = ... # type: Any
+ def __init__(self, msg) -> None: ...
+
+class BadOptionError(OptParseError):
+ opt_str = ... # type: Any
+ def __init__(self, opt_str) -> None: ...
+
+class AmbiguousOptionError(BadOptionError):
+ possibilities = ... # type: Any
+ def __init__(self, opt_str, possibilities) -> None: ...
+
+class OptionError(OptParseError):
+ msg = ... # type: Any
+ option_id = ... # type: str
+ def __init__(self, msg, option: Option) -> None: ...
+
+class OptionConflictError(OptionError): ...
+
+class HelpFormatter:
+ NO_DEFAULT_VALUE = ... # type: str
+ _long_opt_fmt = ... # type: Union[str, unicode]
+ _short_opt_fmt = ... # type: Union[str, unicode]
+ current_indent = ... # type: int
+ default_tag = ... # type: str
+ help_position = ... # type: Any
+ help_width = ... # type: Any
+ indent_increment = ... # type: Any
+ level = ... # type: int
+ max_help_position = ... # type: int
+ option_strings = ... # type: Dict[Option, str]
+ parser = ... # type: Any
+ short_first = ... # type: Any
+ width = ... # type: Any
+ def __init__(self, indent_increment, max_help_position, width, short_first) -> None: ...
+ def _format_text(self, text: Text) -> Text: ...
+ def dedent(self) -> None: ...
+ def expand_default(self, option: Option) -> Text: ...
+ def format_description(self, description) -> Any: ...
+ def format_epilog(self, epilog) -> Any: ...
+ def format_heading(self, heading) -> Any: ...
+ def format_option(self, option: Any) -> str: ...
+ def format_option_strings(self, option: Any) -> Any: ...
+ def format_usage(self, usage) -> Any: ...
+ def indent(self) -> None: ...
+ def set_long_opt_delimiter(self, delim) -> None: ...
+ def set_parser(self, parser) -> None: ...
+ def set_short_opt_delimiter(self, delim) -> None: ...
+ def store_option_strings(self, parser) -> None: ...
+
+class IndentedHelpFormatter(HelpFormatter):
+ _long_opt_fmt = ... # type: str
+ _short_opt_fmt = ... # type: str
+ current_indent = ... # type: int
+ default_tag = ... # type: str
+ help_position = ... # type: int
+ help_width = ... # type: Optional[int]
+ indent_increment = ... # type: Any
+ level = ... # type: int
+ max_help_position = ... # type: int
+ option_strings = ... # type: Dict[Any, Any]
+ parser = ... # type: Optional[OptionParser]
+ short_first = ... # type: Any
+ width = ... # type: Any
+ def __init__(self, *args, **kwargs) -> None: ...
+ def format_heading(self, heading) -> str: ...
+ def format_usage(self, usage) -> str: ...
+
+class Option:
+ ACTIONS = ... # type: Tuple[str, ...]
+ ALWAYS_TYPED_ACTIONS = ... # type: Tuple[str, ...]
+ ATTRS = ... # type: List[str]
+ CHECK_METHODS = ... # type: Union[None, List[Callable]]
+ CONST_ACTIONS = ... # type: Tuple[str, ...]
+ STORE_ACTIONS = ... # type: Tuple[str, ...]
+ TYPED_ACTIONS = ... # type: Tuple[str, ...]
+ TYPES = ... # type: Tuple[str, ...]
+ TYPE_CHECKER = ... # type: Dict[str, Callable]
+ _long_opts = ... # type: List[Text]
+ _short_opts = ... # type: List[Text]
+ action = ... # type: str
+ dest = ... # type: Any
+ nargs = ... # type: int
+ type = ... # type: Any
+ def __init__(self, *args, **kwargs) -> None: ...
+ def __repr__(self) -> str: ...
+ def __str__(self) -> str: ...
+ def _check_action(self) -> None: ...
+ def _check_callback(self) -> None: ...
+ def _check_choice(self) -> None: ...
+ def _check_const(self) -> None: ...
+ def _check_dest(self) -> None: ...
+ def _check_nargs(self) -> None: ...
+ def _check_opt_strings(self, opts) -> Any: ...
+ def _check_type(self) -> None: ...
+ def _set_attrs(self, attrs: Dict[str, Any]) -> None: ...
+ def _set_opt_strings(self, opts) -> None: ...
+ def check_value(self, opt, value) -> Any: ...
+ def convert_value(self, opt, value) -> Any: ...
+ def get_opt_string(self) -> Text: ...
+ def process(self, opt, value, values: Any, parser: OptionParser) -> int: ...
+ def take_action(self, action, dest, opt, value, values, parser: OptionParser) -> int: ...
+ def takes_value(self) -> bool: ...
+
+make_option = Option
+
+class OptionContainer:
+ _long_opt = ... # type: Dict[Text, Any]
+ _short_opt = ... # type: Dict[Text, Any]
+ conflict_handler = ... # type: Any
+ defaults = ... # type: Dict[Text, Any]
+ description = ... # type: Any
+ option_class = ... # type: Any
+ def __init__(self, option_class, conflict_handler, description) -> None: ...
+ def _check_conflict(self, option: Any) -> None: ...
+ def _create_option_mappings(self) -> None: ...
+ def _share_option_mappings(self, parser) -> None: ...
+ def add_option(self, *args, **kwargs) -> Any: ...
+ def add_options(self, option_list) -> None: ...
+ def destroy(self) -> None: ...
+ def format_description(self, formatter: Optional[HelpFormatter]) -> Any: ...
+ def format_help(self, formatter: HelpFormatter) -> str: ...
+ def format_option_help(self, formatter: Optional[HelpFormatter]) -> str: ...
+ def get_description(self) -> Any: ...
+ def get_option(self, opt_str) -> Optional[Option]: ...
+ def has_option(self, opt_str) -> bool: ...
+ def remove_option(self, opt_str) -> None: ...
+ def set_conflict_handler(self, handler) -> None: ...
+ def set_description(self, description) -> None: ...
+
+class OptionGroup(OptionContainer):
+ _long_opt = ... # type: Dict[Any, Any]
+ _short_opt = ... # type: Dict[Any, Any]
+ conflict_handler = ... # type: Any
+ defaults = ... # type: Dict[Text, Any]
+ description = ... # type: Any
+ option_class = ... # type: Any
+ option_list = ... # type: List
+ parser = ... # type: Any
+ title = ... # type: Any
+ def __init__(self, parser, title, *args, **kwargs) -> None: ...
+ def _create_option_list(self) -> None: ...
+ def format_help(self, formatter: HelpFormatter) -> Any: ...
+ def set_title(self, title) -> None: ...
+
+class OptionParser(OptionContainer):
+ _long_opt = ... # type: Dict[Text, Any]
+ _short_opt = ... # type: Dict[Any, Any]
+ allow_interspersed_args = ... # type: bool
+ conflict_handler = ... # type: Any
+ defaults = ... # type: Dict[Any, Any]
+ description = ... # type: Text
+ epilog = ... # type: Any
+ formatter = ... # type: HelpFormatter
+ largs = ... # type: Union[None, List[Text]]
+ option_class = ... # type: Callable
+ option_groups = ... # type: List[OptionParser]
+ option_list = ... # type: List[Any]
+ process_default_values = ... # type: Any
+ prog = ... # type: Any
+ rargs = ... # type: Optional[List[Any]]
+ standard_option_list = ... # type: List
+ usage = ... # type: Optional[Text]
+ values = ... # type: Any
+ version = ... # type: Text
+ def __init__(self, *args, **kwargs) -> None: ...
+ def _add_help_option(self) -> None: ...
+ def _add_version_option(self) -> None: ...
+ def _create_option_list(self) -> None: ...
+ def _get_all_options(self) -> List[Any]: ...
+ def _get_args(self, args: Iterable) -> List[Any]: ...
+ def _get_encoding(self, file) -> Any: ...
+ def _init_parsing_state(self) -> None: ...
+ def _match_long_opt(self, opt) -> Any: ...
+ def _populate_option_list(self, option_list, *args, **kwargs) -> None: ...
+ def _process_args(self, largs: List[Text], rargs: List, values: Values) -> None: ...
+ def _process_long_opt(self, rargs: List, values) -> None: ...
+ def _process_short_opts(self, rargs: List, values) -> None: ...
+ def add_option_group(self, *args, **kwargs) -> OptionParser: ...
+ def check_values(self, values, args) -> Tuple[Any, ...]: ...
+ def disable_interspersed_args(self) -> None: ...
+ def enable_interspersed_args(self) -> None: ...
+ def error(self, msg) -> None: ...
+ def exit(self, *args, **kwargs) -> None: ...
+ def expand_prog_name(self, s: Optional[Text]) -> Any: ...
+ def format_epilog(self, formatter: Union[HelpFormatter, OptionParser, None]) -> Any: ...
+ def format_help(self, *args, **kwargs) -> str: ...
+ def format_option_help(self, *args, **kwargs) -> str: ...
+ def get_default_values(self) -> Values: ...
+ def get_option_group(self, opt_str) -> Any: ...
+ def get_prog_name(self) -> Any: ...
+ def get_usage(self) -> Text: ...
+ def get_version(self) -> Any: ...
+ def parse_args(self, *args, **kwargs) -> Tuple[Any, ...]: ...
+ def print_help(self, *args, **kwargs) -> None: ...
+ def print_usage(self, *args, **kwargs) -> None: ...
+ def print_version(self, *args, **kwargs) -> None: ...
+ def set_default(self, dest, value) -> None: ...
+ def set_defaults(self, *args, **kwargs) -> None: ...
+ def set_process_default_values(self, process) -> None: ...
+ def set_usage(self, usage: Text) -> None: ...
+
+class OptionValueError(OptParseError):
+ msg = ... # type: Any
+
+class TitledHelpFormatter(HelpFormatter):
+ _long_opt_fmt = ... # type: str
+ _short_opt_fmt = ... # type: str
+ current_indent = ... # type: int
+ default_tag = ... # type: str
+ help_position = ... # type: int
+ help_width = ... # type: None
+ indent_increment = ... # type: Any
+ level = ... # type: int
+ max_help_position = ... # type: int
+ option_strings = ... # type: Dict
+ parser = ... # type: None
+ short_first = ... # type: Any
+ width = ... # type: Any
+ def __init__(self, *args, **kwargs) -> None: ...
+ def format_heading(self, heading) -> str: ...
+ def format_usage(self, usage) -> str: ...
+
+class Values:
+ def __cmp__(self, other) -> int: ...
+ def __init__(self, *args, **kwargs) -> None: ...
+ def __repr__(self) -> str: ...
+ def __str__(self) -> str: ...
+ def _update(self, dict: Dict[str, Any], mode) -> None: ...
+ def _update_careful(self, dict: Dict[str, Any]) -> None: ...
+ def _update_loose(self, dict) -> None: ...
+ def ensure_value(self, attr, value) -> Any: ...
+ def read_file(self, filename, *args, **kwargs) -> None: ...
+ def read_module(self, modname, *args, **kwargs) -> None: ...
diff --git a/typeshed/stdlib/2/os/__init__.pyi b/typeshed/stdlib/2/os/__init__.pyi
new file mode 100644
index 0000000..3bd50d8
--- /dev/null
+++ b/typeshed/stdlib/2/os/__init__.pyi
@@ -0,0 +1,303 @@
+# created from https://docs.python.org/2/library/os.html
+
+from typing import (
+ List, Tuple, Union, Sequence, Mapping, IO, Any, Optional, AnyStr, Iterator,
+ Dict, MutableMapping, NamedTuple, overload
+)
+from . import path
+from mypy_extensions import NoReturn
+
+error = OSError
+name = ... # type: str
+
+class _Environ(MutableMapping[str, str]):
+ def copy(self) -> Dict[str, str]: ...
+
+environ = ... # type: _Environ
+
+def chdir(path: unicode) -> None: ...
+def fchdir(fd: int) -> None: ...
+def getcwd() -> str: ...
+def ctermid() -> str: ...
+def getegid() -> int: ...
+def geteuid() -> int: ...
+def getgid() -> int: ...
+def getgroups() -> List[int]: ...
+def initgroups(username: str, gid: int) -> None: ...
+def getlogin() -> str: ...
+def getpgid(pid: int) -> int: ...
+def getpgrp() -> int: ...
+def getpid() -> int: ...
+def getppid() -> int: ...
+def getresuid() -> Tuple[int, int, int]: ...
+def getresgid() -> Tuple[int, int, int]: ...
+def getuid() -> int: ...
+def getenv(varname: unicode, value: unicode = ...) -> str: ...
+def putenv(varname: unicode, value: unicode) -> None: ...
+def setegid(egid: int) -> None: ...
+def seteuid(euid: int) -> None: ...
+def setgid(gid: int) -> None: ...
+def setgroups(groups: Sequence[int]) -> None: ...
+
+# TODO(MichalPokorny)
+def setpgrp(*args) -> None: ...
+
+def setpgid(pid: int, pgrp: int) -> None: ...
+def setregid(rgid: int, egid: int) -> None: ...
+def setresgid(rgid: int, egid: int, sgid: int) -> None: ...
+def setresuid(ruid: int, euid: int, suid: int) -> None: ...
+def setreuid(ruid: int, euid: int) -> None: ...
+def getsid(pid: int) -> int: ...
+def setsid() -> None: ...
+def setuid(pid: int) -> None: ...
+
+def strerror(code: int) -> str: ...
+
+def umask(mask: int) -> int: ...
+def uname() -> Tuple[str, str, str, str, str]: ...
+def unsetenv(varname: str) -> None: ...
+
+# TODO(MichalPokorny)
+def fdopen(fd: int, *args, **kwargs) -> IO[Any]: ...
+def popen(command: str, *args, **kwargs) -> Optional[IO[Any]]: ...
+def tmpfile() -> IO[Any]: ...
+
+def tmpnam() -> str: ...
+def tempnam(dir: str = ..., prefix: str = ...) -> str: ...
+
+def popen2(cmd: str, *args, **kwargs) -> Tuple[IO[Any], IO[Any]]: ...
+def popen3(cmd: str, *args, **kwargs) -> Tuple[IO[Any], IO[Any], IO[Any]]: ...
+def popen4(cmd: str, *args, **kwargs) -> Tuple[IO[Any], IO[Any]]: ...
+
+def close(fd: int) -> None: ...
+def closerange(fd_low: int, fd_high: int) -> None: ...
+def dup(fd: int) -> int: ...
+def dup2(fd: int, fd2: int) -> None: ...
+def fchmod(fd: int, mode: int) -> None: ...
+def fchown(fd: int, uid: int, gid: int) -> None: ...
+def fdatasync(fd: int) -> None: ...
+def fpathconf(fd: int, name: str) -> None: ...
+
+# TODO(prvak)
+def fstat(fd: int) -> Any: ...
+def fsync(fd: int) -> None: ...
+def ftruncate(fd: int, length: int) -> None: ...
+def isatty(fd: int) -> bool: ...
+
+def lseek(fd: int, pos: int, how: int) -> None: ...
+SEEK_SET = 0
+SEEK_CUR = 0
+SEEK_END = 0
+
+# TODO(prvak): maybe file should be unicode? (same with all other paths...)
+def open(file: unicode, flags: int, mode: int = ...) -> int: ...
+def openpty() -> Tuple[int, int]: ...
+def pipe() -> Tuple[int, int]: ...
+def read(fd: int, n: int) -> str: ...
+def tcgetpgrp(fd: int) -> int: ...
+def tcsetpgrp(fd: int, pg: int) -> None: ...
+def ttyname(fd: int) -> str: ...
+def write(fd: int, str: str) -> int: ...
+
+# TODO: O_*
+
+def access(path: unicode, mode: int) -> bool: ...
+F_OK = 0
+R_OK = 0
+W_OK = 0
+X_OK = 0
+
+def getcwdu() -> unicode: ...
+def chflags(path: unicode, flags: int) -> None: ...
+def chroot(path: unicode) -> None: ...
+def chmod(path: unicode, mode: int) -> None: ...
+def chown(path: unicode, uid: int, gid: int) -> None: ...
+def lchflags(path: unicode, flags: int) -> None: ...
+def lchmod(path: unicode, uid: int, gid: int) -> None: ...
+def lchown(path: unicode, uid: int, gid: int) -> None: ...
+def link(source: unicode, link_name: unicode) -> None: ...
+def listdir(path: AnyStr) -> List[AnyStr]: ...
+
+# TODO(MichalPokorny)
+def lstat(path: unicode) -> Any: ...
+
+def mkfifo(path: unicode, mode: int = ...) -> None: ...
+def mknod(filename: unicode, mode: int = ..., device: int = ...) -> None: ...
+def major(device: int) -> int: ...
+def minor(device: int) -> int: ...
+def makedev(major: int, minor: int) -> int: ...
+def mkdir(path: unicode, mode: int = ...) -> None: ...
+def makedirs(path: unicode, mode: int = ...) -> None: ...
+def pathconf(path: unicode, name: str) -> str: ...
+
+pathconf_names = ... # type: Mapping[str, int]
+
+def readlink(path: AnyStr) -> AnyStr: ...
+def remove(path: unicode) -> None: ...
+def removedirs(path: unicode) -> None: ...
+def rename(src: unicode, dst: unicode) -> None: ...
+def renames(old: unicode, new: unicode) -> None: ...
+def rmdir(path: unicode) -> None: ...
+
+# TODO(MichalPokorny)
+def stat(path: unicode) -> Any: ...
+
+_StatVFS = NamedTuple('_StatVFS', [('f_bsize', int), ('f_frsize', int), ('f_blocks', int),
+ ('f_bfree', int), ('f_bavail', int), ('f_files', int),
+ ('f_ffree', int), ('f_favail', int), ('f_flag', int),
+ ('f_namemax', int)])
+
+def fstatvfs(fd: int) -> _StatVFS: ...
+def statvfs(path: unicode) -> _StatVFS: ...
+
+def walk(top: AnyStr, topdown: bool = ..., onerror: Any = ...,
+ followlinks: bool = ...) -> Iterator[Tuple[AnyStr, List[AnyStr],
+ List[AnyStr]]]: ...
+
+def symlink(source: unicode, link_name: unicode) -> None: ...
+def unlink(path: unicode) -> None: ...
+def utime(path: unicode, times: Optional[Tuple[int, int]]) -> None: ...
+
+def abort() -> None: ...
+
+EX_OK = 0 # Unix only
+EX_USAGE = 0 # Unix only
+EX_DATAERR = 0 # Unix only
+EX_NOINPUT = 0 # Unix only
+EX_NOUSER = 0 # Unix only
+EX_NOHOST = 0 # Unix only
+EX_UNAVAILABLE = 0 # Unix only
+EX_SOFTWARE = 0 # Unix only
+EX_OSERR = 0 # Unix only
+EX_OSFILE = 0 # Unix only
+EX_CANTCREAT = 0 # Unix only
+EX_IOERR = 0 # Unix only
+EX_TEMPFAIL = 0 # Unix only
+EX_PROTOCOL = 0 # Unix only
+EX_NOPERM = 0 # Unix only
+EX_CONFIG = 0 # Unix only
+
+def execl(file: AnyStr, *args) -> None: ...
+def execle(file: AnyStr, *args) -> None: ...
+def execlp(file: AnyStr, *args) -> None: ...
+def execlpe(file: AnyStr, *args) -> None: ...
+def execvp(file: AnyStr, args: Union[Tuple[AnyStr], List[AnyStr]]) -> None: ...
+def execvpe(file: AnyStr, args: Union[Tuple[AnyStr], List[AnyStr]], env: Mapping[AnyStr, AnyStr]) -> None: ...
+def execv(path: AnyStr, args: Union[Tuple[AnyStr], List[AnyStr]]) -> None: ...
+def execve(path: AnyStr, args: Union[Tuple[AnyStr], List[AnyStr]], env: Mapping[AnyStr, AnyStr]) -> None: ...
+
+def _exit(n: int) -> NoReturn: ...
+
+def fork() -> int: ...
+def forkpty() -> Tuple[int, int]: ...
+
+def kill(pid: int, sig: int) -> None: ...
+def killpg(pgid: int, sig: int) -> None: ...
+def nice(increment: int) -> int: ...
+
+# TODO: plock, popen*, P_*
+
+def spawnl(mode: int, path: AnyStr, arg0: AnyStr, *args: AnyStr) -> int: ...
+def spawnle(mode: int, path: AnyStr, arg0: AnyStr,
+ *args: Any) -> int: ... # Imprecise sig
+def spawnlp(mode: int, file: AnyStr, arg0: AnyStr,
+ *args: AnyStr) -> int: ... # Unix only TODO
+def spawnlpe(mode: int, file: AnyStr, arg0: AnyStr, *args: Any) -> int:
+ ... # Imprecise signature; Unix only TODO
+def spawnv(mode: int, path: AnyStr, args: List[AnyStr]) -> int: ...
+def spawnve(mode: int, path: AnyStr, args: List[AnyStr],
+ env: Mapping[str, str]) -> int: ...
+def spawnvp(mode: int, file: AnyStr, args: List[AnyStr]) -> int: ... # Unix only
+def spawnvpe(mode: int, file: AnyStr, args: List[AnyStr],
+ env: Mapping[str, str]) -> int:
+ ... # Unix only
+def startfile(path: unicode, operation: str = ...) -> None: ... # Windows only
+def system(command: unicode) -> int: ...
+def times() -> Tuple[float, float, float, float, float]: ...
+def wait() -> Tuple[int, int]: ... # Unix only
+def wait3(options: int) -> Tuple[int, int, Any]: ... # Unix only
+def wait4(pid: int, options: int) -> Tuple[int, int, Any]: ... # Unix only
+def waitpid(pid: int, options: int) -> Tuple[int, int]: ...
+
+def confstr(name: Union[str, int]) -> Optional[str]: ...
+confstr_names = ... # type: Mapping[str, int]
+
+def getloadavg() -> Tuple[float, float, float]: ...
+
+def sysconf(name: Union[str, int]) -> int: ...
+sysconf_names = ... # type: Mapping[str, int]
+
+curdir = ... # type: str
+pardir = ... # type: str
+sep = ... # type: str
+altsep = ... # type: str
+extsep = ... # type: str
+pathsep = ... # type: str
+defpath = ... # type: str
+linesep = ... # type: str
+devnull = ... # type: str
+
+def urandom(n: int) -> str: ...
+
+# More constants, copied from stdlib/3/os/__init__.pyi
+
+O_RDONLY = 0
+O_WRONLY = 0
+O_RDWR = 0
+O_APPEND = 0
+O_CREAT = 0
+O_EXCL = 0
+O_TRUNC = 0
+O_DSYNC = 0 # Unix only
+O_RSYNC = 0 # Unix only
+O_SYNC = 0 # Unix only
+O_NDELAY = 0 # Unix only
+O_NONBLOCK = 0 # Unix only
+O_NOCTTY = 0 # Unix only
+O_SHLOCK = 0 # Unix only
+O_EXLOCK = 0 # Unix only
+O_BINARY = 0 # Windows only
+O_NOINHERIT = 0 # Windows only
+O_SHORT_LIVED = 0 # Windows only
+O_TEMPORARY = 0 # Windows only
+O_RANDOM = 0 # Windows only
+O_SEQUENTIAL = 0 # Windows only
+O_TEXT = 0 # Windows only
+O_ASYNC = 0 # Gnu extension if in C library
+O_DIRECT = 0 # Gnu extension if in C library
+O_DIRECTORY = 0 # Gnu extension if in C library
+O_NOFOLLOW = 0 # Gnu extension if in C library
+O_NOATIME = 0 # Gnu extension if in C library
+O_LARGEFILE = 0 # Gnu extension if in C library
+
+P_NOWAIT = 0
+P_NOWAITO = 0
+P_WAIT = 0
+# P_DETACH = 0 # Windows only
+# P_OVERLAY = 0 # Windows only
+
+# wait()/waitpid() options
+WNOHANG = 0 # Unix only
+WCONTINUED = 0 # some Unix systems
+WUNTRACED = 0 # Unix only
+
+P_ALL = 0
+WEXITED = 0
+WNOWAIT = 0
+
+TMP_MAX = 0
+
+# Below are Unix-only
+def WCOREDUMP(status: int) -> bool: ...
+def WEXITSTATUS(status: int) -> int: ...
+def WIFCONTINUED(status: int) -> bool: ...
+def WIFEXITED(status: int) -> bool: ...
+def WIFSIGNALED(status: int) -> bool: ...
+def WIFSTOPPED(status: int) -> bool: ...
+def WSTOPSIG(status: int) -> int: ...
+def WTERMSIG(status: int) -> int: ...
+
+ at overload
+def stat_float_times(newvalue: bool = ...) -> None: ...
+ at overload
+def stat_float_times() -> bool: ...
diff --git a/typeshed/stdlib/2/os/path.pyi b/typeshed/stdlib/2/os/path.pyi
new file mode 100644
index 0000000..bfd88a4
--- /dev/null
+++ b/typeshed/stdlib/2/os/path.pyi
@@ -0,0 +1,65 @@
+# Stubs for os.path
+# Ron Murawski <ron at horizonchess.com>
+
+# based on http://docs.python.org/3.2/library/os.path.html
+# adapted for 2.7 by Michal Pokorny
+
+from typing import overload, List, Any, Tuple, BinaryIO, TextIO, TypeVar, Callable, AnyStr
+
+# ----- os.path variables -----
+supports_unicode_filenames = False
+# aliases (also in os)
+curdir = ... # type: str
+pardir = ... # type: str
+sep = ... # type: str
+altsep = ... # type: str
+extsep = ... # type: str
+pathsep = ... # type: str
+defpath = ... # type: str
+devnull = ... # type: str
+
+# ----- os.path function stubs -----
+def abspath(path: AnyStr) -> AnyStr: ...
+def basename(path: AnyStr) -> AnyStr: ...
+
+def commonprefix(list: List[AnyStr]) -> AnyStr: ...
+def dirname(path: AnyStr) -> AnyStr: ...
+def exists(path: unicode) -> bool: ...
+def lexists(path: unicode) -> bool: ...
+def expanduser(path: AnyStr) -> AnyStr: ...
+def expandvars(path: AnyStr) -> AnyStr: ...
+
+# These return float if os.stat_float_times() == True,
+# but int is a subclass of float.
+def getatime(path: unicode) -> float: ...
+def getmtime(path: unicode) -> float: ...
+def getctime(path: unicode) -> float: ...
+
+def getsize(path: unicode) -> int: ...
+def isabs(path: unicode) -> bool: ...
+def isfile(path: unicode) -> bool: ...
+def isdir(path: unicode) -> bool: ...
+def islink(path: unicode) -> bool: ...
+def ismount(path: unicode) -> bool: ...
+
+def join(path: AnyStr, *paths: AnyStr) -> AnyStr: ...
+
+def normcase(path: AnyStr) -> AnyStr: ...
+def normpath(path: AnyStr) -> AnyStr: ...
+def realpath(path: AnyStr) -> AnyStr: ...
+def relpath(path: AnyStr, start: AnyStr = ...) -> AnyStr: ...
+
+def samefile(path1: unicode, path2: unicode) -> bool: ...
+def sameopenfile(fp1: int, fp2: int) -> bool: ...
+# TODO
+# def samestat(stat1: stat_result,
+# stat2: stat_result) -> bool: ... # Unix only
+
+def split(path: AnyStr) -> Tuple[AnyStr, AnyStr]: ...
+def splitdrive(path: AnyStr) -> Tuple[AnyStr, AnyStr]: ...
+def splitext(path: AnyStr) -> Tuple[AnyStr, AnyStr]: ...
+
+def splitunc(path: AnyStr) -> Tuple[AnyStr, AnyStr]: ... # Windows only, deprecated
+
+_T = TypeVar('_T')
+def walk(path: AnyStr, visit: Callable[[_T, AnyStr, List[AnyStr]], Any], arg: _T) -> None: ...
diff --git a/typeshed/stdlib/2/pdb.pyi b/typeshed/stdlib/2/pdb.pyi
new file mode 100644
index 0000000..1c375fe
--- /dev/null
+++ b/typeshed/stdlib/2/pdb.pyi
@@ -0,0 +1,30 @@
+# Stub for pdb (incomplete, only some global functions)
+
+from typing import Any, Dict
+
+def run(statement: str,
+ globals: Dict[str, Any] = None,
+ locals: Dict[str, Any] = None) -> None:
+ ...
+
+def runeval(expression: str,
+ globals: Dict[str, Any] = None,
+ locals: Dict[str, Any] = None) -> Any:
+ ...
+
+def runctx(statement: str,
+ globals: Dict[str, Any],
+ locals: Dict[str, Any]) -> None:
+ ...
+
+def runcall(*args: Any, **kwds: Any) -> Any:
+ ...
+
+def set_trace() -> None:
+ ...
+
+def post_mortem(t: Any = None) -> None:
+ ...
+
+def pm() -> None:
+ ...
diff --git a/typeshed/stdlib/2/pickle.pyi b/typeshed/stdlib/2/pickle.pyi
new file mode 100644
index 0000000..1b5b1d6
--- /dev/null
+++ b/typeshed/stdlib/2/pickle.pyi
@@ -0,0 +1,38 @@
+# Stubs for pickle (Python 2)
+
+from typing import Any, BinaryIO
+
+
+HIGHEST_PROTOCOL = ... # type: int
+
+
+def dump(obj: Any, file: BinaryIO, protocol: int = None) -> None: ...
+def dumps(obj: Any, protocol: int = ...) -> bytes: ...
+def load(file: BinaryIO) -> Any: ...
+def loads(string: bytes) -> Any: ...
+
+
+class PickleError(Exception):
+ pass
+
+
+class PicklingError(PickleError):
+ pass
+
+
+class UnpicklingError(PickleError):
+ pass
+
+
+class Pickler:
+ def __init__(self, file: BinaryIO, protocol: int = None) -> None: ...
+
+ def dump(self, obj: Any) -> None: ...
+
+ def clear_memo(self) -> None: ...
+
+
+class Unpickler:
+ def __init__(self, file: BinaryIO) -> None: ...
+
+ def load(self) -> Any: ...
diff --git a/typeshed/stdlib/2/pipes.pyi b/typeshed/stdlib/2/pipes.pyi
new file mode 100644
index 0000000..d5f5291
--- /dev/null
+++ b/typeshed/stdlib/2/pipes.pyi
@@ -0,0 +1,13 @@
+from typing import Any, IO
+
+class Template:
+ def __init__(self) -> None: ...
+ def reset(self) -> None: ...
+ def clone(self) -> Template: ...
+ def debug(self, flag: bool) -> None: ...
+ def append(self, cmd: str, kind: str) -> None: ...
+ def prepend(self, cmd: str, kind: str) -> None: ...
+ def open(self, file: str, mode: str) -> IO[Any]: ...
+ def copy(self, infile: str, outfile: str) -> None: ...
+
+def quote(s: str) -> str: ...
diff --git a/typeshed/stdlib/2/platform.pyi b/typeshed/stdlib/2/platform.pyi
new file mode 100644
index 0000000..75125f8
--- /dev/null
+++ b/typeshed/stdlib/2/platform.pyi
@@ -0,0 +1,45 @@
+# Stubs for platform (Python 2)
+#
+# Based on stub generated by stubgen.
+
+from typing import Any
+
+__copyright__ = ... # type: Any
+DEV_NULL = ... # type: Any
+
+def libc_ver(executable=..., lib=..., version=..., chunksize=2048): ...
+def linux_distribution(distname=..., version=..., id=..., supported_dists=..., full_distribution_name=1): ...
+def dist(distname=..., version=..., id=..., supported_dists=...): ...
+
+class _popen:
+ tmpfile = ... # type: Any
+ pipe = ... # type: Any
+ bufsize = ... # type: Any
+ mode = ... # type: Any
+ def __init__(self, cmd, mode=..., bufsize=None): ...
+ def read(self): ...
+ def readlines(self): ...
+ def close(self, remove=..., error=...): ...
+ __del__ = ... # type: Any
+
+def popen(cmd, mode=..., bufsize=None): ...
+def win32_ver(release=..., version=..., csd=..., ptype=...): ...
+def mac_ver(release=..., versioninfo=..., machine=...): ...
+def java_ver(release=..., vendor=..., vminfo=..., osinfo=...): ...
+def system_alias(system, release, version): ...
+def architecture(executable=..., bits=..., linkage=...): ...
+def uname(): ...
+def system(): ...
+def node(): ...
+def release(): ...
+def version(): ...
+def machine(): ...
+def processor(): ...
+def python_implementation(): ...
+def python_version(): ...
+def python_version_tuple(): ...
+def python_branch(): ...
+def python_revision(): ...
+def python_build(): ...
+def python_compiler(): ...
+def platform(aliased=0, terse=0): ...
diff --git a/typeshed/stdlib/2/posix.pyi b/typeshed/stdlib/2/posix.pyi
new file mode 100644
index 0000000..f8feb03
--- /dev/null
+++ b/typeshed/stdlib/2/posix.pyi
@@ -0,0 +1,205 @@
+from typing import List, Mapping, Tuple, Union, Sequence, IO, Optional, TypeVar
+
+error = OSError
+
+confstr_names = ... # type: Dict[str, int]
+environ = ... # type: Dict[str, str]
+pathconf_names = ... # type: Dict[str, int]
+sysconf_names = ... # type: Dict[str, int]
+
+EX_CANTCREAT = ... # type: int
+EX_CONFIG = ... # type: int
+EX_DATAERR = ... # type: int
+EX_IOERR = ... # type: int
+EX_NOHOST = ... # type: int
+EX_NOINPUT = ... # type: int
+EX_NOPERM = ... # type: int
+EX_NOUSER = ... # type: int
+EX_OK = ... # type: int
+EX_OSERR = ... # type: int
+EX_OSFILE = ... # type: int
+EX_PROTOCOL = ... # type: int
+EX_SOFTWARE = ... # type: int
+EX_TEMPFAIL = ... # type: int
+EX_UNAVAILABLE = ... # type: int
+EX_USAGE = ... # type: int
+F_OK = ... # type: int
+NGROUPS_MAX = ... # type: int
+O_APPEND = ... # type: int
+O_ASYNC = ... # type: int
+O_CREAT = ... # type: int
+O_DIRECT = ... # type: int
+O_DIRECTORY = ... # type: int
+O_DSYNC = ... # type: int
+O_EXCL = ... # type: int
+O_LARGEFILE = ... # type: int
+O_NDELAY = ... # type: int
+O_NOATIME = ... # type: int
+O_NOCTTY = ... # type: int
+O_NOFOLLOW = ... # type: int
+O_NONBLOCK = ... # type: int
+O_RDONLY = ... # type: int
+O_RDWR = ... # type: int
+O_RSYNC = ... # type: int
+O_SYNC = ... # type: int
+O_TRUNC = ... # type: int
+O_WRONLY = ... # type: int
+R_OK = ... # type: int
+TMP_MAX = ... # type: int
+WCONTINUED = ... # type: int
+WNOHANG = ... # type: int
+WUNTRACED = ... # type: int
+W_OK = ... # type: int
+X_OK = ... # type: int
+
+def WCOREDUMP(status: int) -> bool: ...
+def WEXITSTATUS(status: int) -> bool: ...
+def WIFCONTINUED(status: int) -> bool: ...
+def WIFEXITED(status: int) -> bool: ...
+def WIFSIGNALED(status: int) -> bool: ...
+def WIFSTOPPED(status: int) -> bool: ...
+def WSTOPSIG(status: int) -> bool: ...
+def WTERMSIG(status: int) -> bool: ...
+
+class stat_result(object):
+ n_fields = ... # type: int
+ n_sequence_fields = ... # type: int
+ n_unnamed_fields = ... # type: int
+ st_mode = ... # type: int
+ st_ino = ... # type: int
+ st_dev = ... # type: int
+ st_nlink = ... # type: int
+ st_uid = ... # type: int
+ st_gid = ... # type: int
+ st_size = ... # type: int
+ st_atime = ... # type: int
+ st_mtime = ... # type: int
+ st_ctime = ... # type: int
+
+class statvfs_result(object):
+ n_fields = ... # type: int
+ n_sequence_fields = ... # type: int
+ n_unnamed_fields = ... # type: int
+ f_bsize = ... # type: int
+ f_frsize = ... # type: int
+ f_blocks = ... # type: int
+ f_bfree = ... # type: int
+ f_bavail = ... # type: int
+ f_files = ... # type: int
+ f_ffree = ... # type: int
+ f_favail = ... # type: int
+ f_flag = ... # type: int
+ f_namemax = ... # type: int
+
+def _exit(status: int) -> None: ...
+def abort() -> None: ...
+def access(path: unicode, mode: int) -> bool: ...
+def chdir(path: unicode) -> None: ...
+def chmod(path: unicode, mode: int) -> None: ...
+def chown(path: unicode, uid: int, gid: int) -> None: ...
+def chroot(path: unicode) -> None: ...
+def close(fd: int) -> None: ...
+def closerange(fd_low: int, fd_high: int) -> None: ...
+def confstr(name: Union[str, int]) -> str: ...
+def ctermid() -> str: ...
+def dup(fd: int) -> int: ...
+def dup2(fd: int, fd2: int) -> None: ...
+def execv(path: str, args: Sequence[str], env: Mapping[str, str]) -> None: ...
+def execve(path: str, args: Sequence[str], env: Mapping[str, str]) -> None: ...
+def fchdir(fd: int) -> None: ...
+def fchmod(fd: int, mode: int) -> None: ...
+def fchown(fd: int, uid: int, gid: int) -> None: ...
+def fdatasync(fd: int) -> None: ...
+def fdopen(fd: int, mode: str = ..., bufsize: int = ...) -> IO[str]: ...
+def fork() -> int:
+ raise OSError()
+def forkpty() -> Tuple[int, int]:
+ raise OSError()
+def fpathconf(fd: int, name: str) -> None: ...
+def fstat(fd: int) -> stat_result: ...
+def fstatvfs(fd: int) -> statvfs_result: ...
+def fsync(fd: int) -> None: ...
+def ftruncate(fd: int, length: int) -> None: ...
+def getcwd() -> str: ...
+def getcwdu() -> unicode: ...
+def getegid() -> int: ...
+def geteuid() -> int: ...
+def getgid() -> int: ...
+def getgroups() -> List[int]: ...
+def getloadavg() -> Tuple[float, float, float]:
+ raise OSError()
+def getlogin() -> str: ...
+def getpgid(pid: int) -> int: ...
+def getpgrp() -> int: ...
+def getpid() -> int: ...
+def getppid() -> int: ...
+def getresgid() -> Tuple[int, int, int]: ...
+def getresuid() -> Tuple[int, int, int]: ...
+def getsid(pid: int) -> int: ...
+def getuid() -> int: ...
+def initgroups(username: str, gid: int) -> None: ...
+def isatty(fd: int) -> bool: ...
+def kill(pid: int, sig: int) -> None: ...
+def killpg(pgid: int, sig: int) -> None: ...
+def lchown(path: unicode, uid: int, gid: int) -> None: ...
+def link(source: unicode, link_name: str) -> None: ...
+_T = TypeVar("_T")
+def listdir(path: _T) -> List[_T]: ...
+def lseek(fd: int, pos: int, how: int) -> None: ...
+def lstat(path: unicode) -> stat_result: ...
+def major(device: int) -> int: ...
+def makedev(major: int, minor: int) -> int: ...
+def minor(device: int) -> int: ...
+def mkdir(path: unicode, mode: int = ...) -> None: ...
+def mkfifo(path: unicode, mode: int = ...) -> None: ...
+def mknod(filename: unicode, mode: int = ..., device: int = ...) -> None: ...
+def nice(increment: int) -> int: ...
+def open(file: unicode, flags: int, mode: int = ...) -> int: ...
+def openpty() -> Tuple[int, int]: ...
+def pathconf(path: unicode, name: str) -> str: ...
+def pipe() -> Tuple[int, int]: ...
+def popen(command: str, mode: str = ..., bufsize: int = ...) -> IO[str]: ...
+def putenv(varname: str, value: str) -> None: ...
+def read(fd: int, n: int) -> str: ...
+def readlink(path: _T) -> _T: ...
+def remove(path: unicode) -> None: ...
+def rename(src: unicode, dst: unicode) -> None: ...
+def rmdir(path: unicode) -> None: ...
+def setegid(egid: int) -> None: ...
+def seteuid(euid: int) -> None: ...
+def setgid(gid: int) -> None: ...
+def setgroups(groups: Sequence[int]) -> None: ...
+def setpgid(pid: int, pgrp: int) -> None: ...
+def setpgrp() -> None: ...
+def setregid(rgid: int, egid: int) -> None: ...
+def setresgid(rgid: int, egid: int, sgid: int) -> None: ...
+def setresuid(ruid: int, euid: int, suid: int) -> None: ...
+def setreuid(ruid: int, euid: int) -> None: ...
+def setsid() -> None: ...
+def setuid(pid: int) -> None: ...
+def stat(path: unicode) -> stat_result: ...
+def statvfs(path: unicode) -> statvfs_result: ...
+def stat_float_times(fd: int) -> None: ...
+def strerror(code: int) -> str: ...
+def symlink(source: unicode, link_name: unicode) -> None: ...
+def sysconf(name: Union[str, int]) -> int: ...
+def system(command: unicode) -> int: ...
+def tcgetpgrp(fd: int) -> int: ...
+def tcsetpgrp(fd: int, pg: int) -> None: ...
+def times() -> Tuple[float, float, float, float, float]: ...
+def tmpfile() -> IO[str]: ...
+def ttyname(fd: int) -> str: ...
+def umask(mask: int) -> int: ...
+def uname() -> Tuple[str, str, str, str, str]: ...
+def unlink(path: unicode) -> None: ...
+def unsetenv(varname: str) -> None: ...
+def urandom(n: int) -> str: ...
+def utime(path: unicode, times: Optional[Tuple[int, int]]) -> None:
+ raise OSError
+def wait() -> int: ...
+_r = Tuple[float, float, int, int, int, int, int, int, int, int, int, int, int, int, int, int]
+def wait3(options: int) -> Tuple[int, int, _r]: ...
+def wait4(pid: int, options: int) -> Tuple[int, int, _r]: ...
+def waitpid(pid: int, options: int) -> int:
+ raise OSError()
+def write(fd: int, str: str) -> int: ...
diff --git a/typeshed/stdlib/2/posixpath.pyi b/typeshed/stdlib/2/posixpath.pyi
new file mode 100644
index 0000000..5e5439f
--- /dev/null
+++ b/typeshed/stdlib/2/posixpath.pyi
@@ -0,0 +1,50 @@
+# Stubs for posixpath (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, AnyStr, List
+from genericpath import * # noqa: F403
+
+curdir = ... # type: Any
+pardir = ... # type: Any
+extsep = ... # type: Any
+sep = ... # type: Any
+pathsep = ... # type: Any
+defpath = ... # type: Any
+altsep = ... # type: Any
+devnull = ... # type: Any
+
+def normcase(s): ...
+def isabs(s): ...
+def join(a, *p): ...
+def split(p): ...
+def splitext(p): ...
+def splitdrive(p): ...
+def basename(p): ...
+def dirname(p): ...
+def islink(path): ...
+def lexists(path): ...
+def samefile(f1, f2): ...
+def sameopenfile(fp1, fp2): ...
+def samestat(s1, s2): ...
+def ismount(path): ...
+def walk(top, func, arg): ...
+def expanduser(path): ...
+def expandvars(path): ...
+def normpath(path): ...
+def abspath(path): ...
+def realpath(filename): ...
+
+supports_unicode_filenames = ... # type: Any
+
+def relpath(path, start=...): ...
+
+# posixpath imports these from genericpath.py:
+def commonprefix(list: List[AnyStr]) -> AnyStr: ...
+def exists(path: unicode) -> bool: ...
+def getatime(path: unicode) -> float: ...
+def getmtime(path: unicode) -> float: ...
+def getctime(path: unicode) -> float: ...
+def getsize(path: unicode) -> int: ...
+def isfile(path: unicode) -> bool: ...
+def isdir(path: unicode) -> bool: ...
diff --git a/typeshed/stdlib/2/pprint.pyi b/typeshed/stdlib/2/pprint.pyi
new file mode 100644
index 0000000..5275d03
--- /dev/null
+++ b/typeshed/stdlib/2/pprint.pyi
@@ -0,0 +1,24 @@
+# Stubs for pprint (Python 2)
+#
+# NOTE: Based on a dynamically typed automatically generated by stubgen.
+
+from typing import IO, Any
+
+def pprint(object: Any, stream: IO[str] = ..., indent: int = ..., width: int = ...,
+ depth: int = ...) -> None: ...
+def pformat(object: Any, indent: int =..., width: int =..., depth: int =...) -> str: ...
+def saferepr(object): ...
+def isreadable(object): ...
+def isrecursive(object): ...
+
+class PrettyPrinter:
+ def __init__(self,
+ indent: int = ...,
+ width: int = ...,
+ depth: int = ...,
+ stream: IO[Any] = ...) -> None: ...
+ def pprint(self, object: Any) -> str: ...
+ def pformat(self, object): ...
+ def isrecursive(self, object): ...
+ def isreadable(self, object): ...
+ def format(self, object, context, maxlevels, level): ...
diff --git a/typeshed/stdlib/2/pwd.pyi b/typeshed/stdlib/2/pwd.pyi
new file mode 100644
index 0000000..ff6c6a4
--- /dev/null
+++ b/typeshed/stdlib/2/pwd.pyi
@@ -0,0 +1,17 @@
+from typing import List
+
+class struct_passwd(tuple):
+ n_fields = ... # type: int
+ n_sequence_fields = ... # type: int
+ n_unnamed_fields = ... # type: int
+ pw_dir = ... # type: str
+ pw_name = ... # type: str
+ pw_passwd = ... # type: str
+ pw_shell = ... # type: str
+ pw_gecos = ... # type: str
+ pw_gid = ... # type: int
+ pw_uid = ... # type: int
+
+def getpwall() -> List[struct_passwd]: ...
+def getpwnam(name: str) -> struct_passwd: ...
+def getpwuid(uid: int) -> struct_passwd: ...
diff --git a/typeshed/stdlib/2/quopri.pyi b/typeshed/stdlib/2/quopri.pyi
new file mode 100644
index 0000000..93ac393
--- /dev/null
+++ b/typeshed/stdlib/2/quopri.pyi
@@ -0,0 +1,8 @@
+# Stubs for quopri (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+def encode(input, output, quotetabs, header=0): ...
+def encodestring(s, quotetabs=0, header=0): ...
+def decode(input, output, header=0): ...
+def decodestring(s, header=0): ...
diff --git a/typeshed/stdlib/2/random.pyi b/typeshed/stdlib/2/random.pyi
new file mode 100644
index 0000000..9aa2ddb
--- /dev/null
+++ b/typeshed/stdlib/2/random.pyi
@@ -0,0 +1,76 @@
+# Stubs for random
+# Ron Murawski <ron at horizonchess.com>
+# Updated by Jukka Lehtosalo
+
+# based on https://docs.python.org/2/library/random.html
+
+# ----- random classes -----
+
+import _random
+from typing import (
+ Any, TypeVar, Sequence, List, Callable, AbstractSet, Union,
+ overload
+)
+
+_T = TypeVar('_T')
+
+class Random(_random.Random):
+ def __init__(self, x: object = ...) -> None: ...
+ def seed(self, x: object = ...) -> None: ...
+ def getstate(self) -> _random._State: ...
+ def setstate(self, state: _random._State) -> None: ...
+ def jumpahead(self, n: int) -> None: ...
+ def getrandbits(self, k: int) -> int: ...
+ @overload
+ def randrange(self, stop: int) -> int: ...
+ @overload
+ def randrange(self, start: int, stop: int, step: int = ...) -> int: ...
+ def randint(self, a: int, b: int) -> int: ...
+ def choice(self, seq: Sequence[_T]) -> _T: ...
+ def shuffle(self, x: List[Any], random: Callable[[], None] = ...) -> None: ...
+ def sample(self, population: Union[Sequence[_T], AbstractSet[_T]], k: int) -> List[_T]: ...
+ def random(self) -> float: ...
+ def uniform(self, a: float, b: float) -> float: ...
+ def triangular(self, low: float = ..., high: float = ...,
+ mode: float = ...) -> float: ...
+ def betavariate(self, alpha: float, beta: float) -> float: ...
+ def expovariate(self, lambd: float) -> float: ...
+ def gammavariate(self, alpha: float, beta: float) -> float: ...
+ def gauss(self, mu: float, sigma: float) -> float: ...
+ def lognormvariate(self, mu: float, sigma: float) -> float: ...
+ def normalvariate(self, mu: float, sigma: float) -> float: ...
+ def vonmisesvariate(self, mu: float, kappa: float) -> float: ...
+ def paretovariate(self, alpha: float) -> float: ...
+ def weibullvariate(self, alpha: float, beta: float) -> float: ...
+
+# SystemRandom is not implemented for all OS's; good on Windows & Linux
+class SystemRandom(Random):
+ ...
+
+# ----- random function stubs -----
+def seed(x: object = ...) -> None: ...
+def getstate() -> object: ...
+def setstate(state: object) -> None: ...
+def jumpahead(n: int) -> None: ...
+def getrandbits(k: int) -> int: ...
+ at overload
+def randrange(stop: int) -> int: ...
+ at overload
+def randrange(start: int, stop: int, step: int = ...) -> int: ...
+def randint(a: int, b: int) -> int: ...
+def choice(seq: Sequence[_T]) -> _T: ...
+def shuffle(x: List[Any], random: Callable[[], float] = ...) -> None: ...
+def sample(population: Union[Sequence[_T], AbstractSet[_T]], k: int) -> List[_T]: ...
+def random() -> float: ...
+def uniform(a: float, b: float) -> float: ...
+def triangular(low: float = ..., high: float = ...,
+ mode: float = ...) -> float: ...
+def betavariate(alpha: float, beta: float) -> float: ...
+def expovariate(lambd: float) -> float: ...
+def gammavariate(alpha: float, beta: float) -> float: ...
+def gauss(mu: float, sigma: float) -> float: ...
+def lognormvariate(mu: float, sigma: float) -> float: ...
+def normalvariate(mu: float, sigma: float) -> float: ...
+def vonmisesvariate(mu: float, kappa: float) -> float: ...
+def paretovariate(alpha: float) -> float: ...
+def weibullvariate(alpha: float, beta: float) -> float: ...
diff --git a/typeshed/stdlib/2/re.pyi b/typeshed/stdlib/2/re.pyi
new file mode 100644
index 0000000..8df3a44
--- /dev/null
+++ b/typeshed/stdlib/2/re.pyi
@@ -0,0 +1,99 @@
+# Stubs for re
+# Ron Murawski <ron at horizonchess.com>
+# 'bytes' support added by Jukka Lehtosalo
+
+# based on: http: //docs.python.org/2.7/library/re.html
+
+from typing import (
+ List, Iterator, overload, Callable, Tuple, Sequence, Dict,
+ Generic, AnyStr, Match, Pattern, Any, Union
+)
+
+# ----- re variables and constants -----
+DEBUG = 0
+I = 0
+IGNORECASE = 0
+L = 0
+LOCALE = 0
+M = 0
+MULTILINE = 0
+S = 0
+DOTALL = 0
+X = 0
+VERBOSE = 0
+U = 0
+UNICODE = 0
+T = 0
+TEMPLATE = 0
+
+class error(Exception): ...
+
+ at overload
+def compile(pattern: AnyStr, flags: int = ...) -> Pattern[AnyStr]: ...
+ at overload
+def compile(pattern: Pattern[AnyStr], flags: int = ...) -> Pattern[AnyStr]: ...
+
+ at overload
+def search(pattern: Union[str, unicode], string: AnyStr, flags: int = ...) -> Match[AnyStr]: ...
+ at overload
+def search(pattern: Union[Pattern[str], Pattern[unicode]], string: AnyStr, flags: int = ...) -> Match[AnyStr]: ...
+
+ at overload
+def match(pattern: Union[str, unicode], string: AnyStr, flags: int = ...) -> Match[AnyStr]: ...
+ at overload
+def match(pattern: Union[Pattern[str], Pattern[unicode]], string: AnyStr, flags: int = ...) -> Match[AnyStr]: ...
+
+ at overload
+def split(pattern: Union[str, unicode], string: AnyStr,
+ maxsplit: int = ..., flags: int = ...) -> List[AnyStr]: ...
+ at overload
+def split(pattern: Union[Pattern[str], Pattern[unicode]], string: AnyStr,
+ maxsplit: int = ..., flags: int = ...) -> List[AnyStr]: ...
+
+ at overload
+def findall(pattern: Union[str, unicode], string: AnyStr, flags: int = ...) -> List[Any]: ...
+ at overload
+def findall(pattern: Union[Pattern[str], Pattern[unicode]], string: AnyStr, flags: int = ...) -> List[Any]: ...
+
+# Return an iterator yielding match objects over all non-overlapping matches
+# for the RE pattern in string. The string is scanned left-to-right, and
+# matches are returned in the order found. Empty matches are included in the
+# result unless they touch the beginning of another match.
+ at overload
+def finditer(pattern: Union[str, unicode], string: AnyStr,
+ flags: int = ...) -> Iterator[Match[AnyStr]]: ...
+ at overload
+def finditer(pattern: Union[Pattern[str], Pattern[unicode]], string: AnyStr,
+ flags: int = ...) -> Iterator[Match[AnyStr]]: ...
+
+ at overload
+def sub(pattern: Union[str, unicode], repl: AnyStr, string: AnyStr, count: int = ...,
+ flags: int = ...) -> AnyStr: ...
+ at overload
+def sub(pattern: Union[str, unicode], repl: Callable[[Match[AnyStr]], AnyStr],
+ string: AnyStr, count: int = ..., flags: int = ...) -> AnyStr: ...
+ at overload
+def sub(pattern: Union[Pattern[str], Pattern[unicode]], repl: AnyStr, string: AnyStr, count: int = ...,
+ flags: int = ...) -> AnyStr: ...
+ at overload
+def sub(pattern: Union[Pattern[str], Pattern[unicode]], repl: Callable[[Match[AnyStr]], AnyStr],
+ string: AnyStr, count: int = ..., flags: int = ...) -> AnyStr: ...
+
+ at overload
+def subn(pattern: Union[str, unicode], repl: AnyStr, string: AnyStr, count: int = ...,
+ flags: int = ...) -> Tuple[AnyStr, int]: ...
+ at overload
+def subn(pattern: Union[str, unicode], repl: Callable[[Match[AnyStr]], AnyStr],
+ string: AnyStr, count: int = ...,
+ flags: int = ...) -> Tuple[AnyStr, int]: ...
+ at overload
+def subn(pattern: Union[Pattern[str], Pattern[unicode]], repl: AnyStr, string: AnyStr, count: int = ...,
+ flags: int = ...) -> Tuple[AnyStr, int]: ...
+ at overload
+def subn(pattern: Union[Pattern[str], Pattern[unicode]], repl: Callable[[Match[AnyStr]], AnyStr],
+ string: AnyStr, count: int = ...,
+ flags: int = ...) -> Tuple[AnyStr, int]: ...
+
+def escape(string: AnyStr) -> AnyStr: ...
+
+def purge() -> None: ...
diff --git a/typeshed/stdlib/2/resource.pyi b/typeshed/stdlib/2/resource.pyi
new file mode 100644
index 0000000..92654a9
--- /dev/null
+++ b/typeshed/stdlib/2/resource.pyi
@@ -0,0 +1,33 @@
+from typing import Tuple, NamedTuple
+
+class error(Exception): ...
+
+RLIM_INFINITY = ... # type: int
+def getrlimit(resource: int) -> Tuple[int, int]: ...
+def setrlimit(resource: int, limits: Tuple[int, int]) -> None: ...
+
+RLIMIT_CORE = ... # type: int
+RLIMIT_CPU = ... # type: int
+RLIMIT_FSIZE = ... # type: int
+RLIMIT_DATA = ... # type: int
+RLIMIT_STACK = ... # type: int
+RLIMIT_RSS = ... # type: int
+RLIMIT_NPROC = ... # type: int
+RLIMIT_NOFILE = ... # type: int
+RLIMIT_OFILE = ... # type: int
+RLIMIT_MEMLOCK = ... # type: int
+RLIMIT_VMEM = ... # type: int
+RLIMIT_AS = ... # type: int
+
+_RUsage = NamedTuple('_RUsage', [('ru_utime', float), ('ru_stime', float), ('ru_maxrss', int),
+ ('ru_ixrss', int), ('ru_idrss', int), ('ru_isrss', int),
+ ('ru_minflt', int), ('ru_majflt', int), ('ru_nswap', int),
+ ('ru_inblock', int), ('ru_oublock', int), ('ru_msgsnd', int),
+ ('ru_msgrcv', int), ('ru_nsignals', int), ('ru_nvcsw', int),
+ ('ru_nivcsw', int)])
+def getrusage(who: int) -> _RUsage: ...
+def getpagesize() -> int: ...
+
+RUSAGE_SELF = ... # type: int
+RUSAGE_CHILDREN = ... # type: int
+RUSAGE_BOTH = ... # type: int
diff --git a/typeshed/stdlib/2/rfc822.pyi b/typeshed/stdlib/2/rfc822.pyi
new file mode 100644
index 0000000..28ba759
--- /dev/null
+++ b/typeshed/stdlib/2/rfc822.pyi
@@ -0,0 +1,79 @@
+# Stubs for rfc822 (Python 2)
+#
+# Based on stub generated by stubgen.
+
+from typing import Any
+
+class Message:
+ fp = ... # type: Any
+ seekable = ... # type: Any
+ startofheaders = ... # type: Any
+ startofbody = ... # type: Any
+ def __init__(self, fp, seekable=1): ...
+ def rewindbody(self): ...
+ dict = ... # type: Any
+ unixfrom = ... # type: Any
+ headers = ... # type: Any
+ status = ... # type: Any
+ def readheaders(self): ...
+ def isheader(self, line): ...
+ def islast(self, line): ...
+ def iscomment(self, line): ...
+ def getallmatchingheaders(self, name): ...
+ def getfirstmatchingheader(self, name): ...
+ def getrawheader(self, name): ...
+ def getheader(self, name, default=None): ...
+ get = ... # type: Any
+ def getheaders(self, name): ...
+ def getaddr(self, name): ...
+ def getaddrlist(self, name): ...
+ def getdate(self, name): ...
+ def getdate_tz(self, name): ...
+ def __len__(self): ...
+ def __getitem__(self, name): ...
+ def __setitem__(self, name, value): ...
+ def __delitem__(self, name): ...
+ def setdefault(self, name, default=...): ...
+ def has_key(self, name): ...
+ def __contains__(self, name): ...
+ def __iter__(self): ...
+ def keys(self): ...
+ def values(self): ...
+ def items(self): ...
+
+class AddrlistClass:
+ specials = ... # type: Any
+ pos = ... # type: Any
+ LWS = ... # type: Any
+ CR = ... # type: Any
+ atomends = ... # type: Any
+ phraseends = ... # type: Any
+ field = ... # type: Any
+ commentlist = ... # type: Any
+ def __init__(self, field): ...
+ def gotonext(self): ...
+ def getaddrlist(self): ...
+ def getaddress(self): ...
+ def getrouteaddr(self): ...
+ def getaddrspec(self): ...
+ def getdomain(self): ...
+ def getdelimited(self, beginchar, endchars, allowcomments=1): ...
+ def getquote(self): ...
+ def getcomment(self): ...
+ def getdomainliteral(self): ...
+ def getatom(self, atomends=None): ...
+ def getphraselist(self): ...
+
+class AddressList(AddrlistClass):
+ addresslist = ... # type: Any
+ def __init__(self, field): ...
+ def __len__(self): ...
+ def __add__(self, other): ...
+ def __iadd__(self, other): ...
+ def __sub__(self, other): ...
+ def __isub__(self, other): ...
+ def __getitem__(self, index): ...
+
+def parsedate_tz(data): ...
+def parsedate(data): ...
+def mktime_tz(data): ...
diff --git a/typeshed/stdlib/2/robotparser.pyi b/typeshed/stdlib/2/robotparser.pyi
new file mode 100644
index 0000000..403039a
--- /dev/null
+++ b/typeshed/stdlib/2/robotparser.pyi
@@ -0,0 +1,7 @@
+class RobotFileParser:
+ def set_url(self, url: str): ...
+ def read(self): ...
+ def parse(self, lines: str): ...
+ def can_fetch(self, user_agent: str, url: str): ...
+ def mtime(self): ...
+ def modified(self): ...
diff --git a/typeshed/stdlib/2/runpy.pyi b/typeshed/stdlib/2/runpy.pyi
new file mode 100644
index 0000000..0d24e7e
--- /dev/null
+++ b/typeshed/stdlib/2/runpy.pyi
@@ -0,0 +1,21 @@
+# Stubs for runpy (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class _TempModule:
+ mod_name = ... # type: Any
+ module = ... # type: Any
+ def __init__(self, mod_name): ...
+ def __enter__(self): ...
+ def __exit__(self, *args): ...
+
+class _ModifiedArgv0:
+ value = ... # type: Any
+ def __init__(self, value): ...
+ def __enter__(self): ...
+ def __exit__(self, *args): ...
+
+def run_module(mod_name, init_globals=None, run_name=None, alter_sys=False): ...
+def run_path(path_name, init_globals=None, run_name=None): ...
diff --git a/typeshed/stdlib/2/select.pyi b/typeshed/stdlib/2/select.pyi
new file mode 100644
index 0000000..a88311e
--- /dev/null
+++ b/typeshed/stdlib/2/select.pyi
@@ -0,0 +1,100 @@
+"""Stubs for the 'select' module."""
+
+from typing import Any, Optional, Tuple, Iterable, List
+
+EPOLLERR = ... # type: int
+EPOLLET = ... # type: int
+EPOLLHUP = ... # type: int
+EPOLLIN = ... # type: int
+EPOLLMSG = ... # type: int
+EPOLLONESHOT = ... # type: int
+EPOLLOUT = ... # type: int
+EPOLLPRI = ... # type: int
+EPOLLRDBAND = ... # type: int
+EPOLLRDNORM = ... # type: int
+EPOLLWRBAND = ... # type: int
+EPOLLWRNORM = ... # type: int
+EPOLL_RDHUP = ... # type: int
+KQ_EV_ADD = ... # type: int
+KQ_EV_CLEAR = ... # type: int
+KQ_EV_DELETE = ... # type: int
+KQ_EV_DISABLE = ... # type: int
+KQ_EV_ENABLE = ... # type: int
+KQ_EV_EOF = ... # type: int
+KQ_EV_ERROR = ... # type: int
+KQ_EV_FLAG1 = ... # type: int
+KQ_EV_ONESHOT = ... # type: int
+KQ_EV_SYSFLAGS = ... # type: int
+KQ_FILTER_AIO = ... # type: int
+KQ_FILTER_NETDEV = ... # type: int
+KQ_FILTER_PROC = ... # type: int
+KQ_FILTER_READ = ... # type: int
+KQ_FILTER_SIGNAL = ... # type: int
+KQ_FILTER_TIMER = ... # type: int
+KQ_FILTER_VNODE = ... # type: int
+KQ_FILTER_WRITE = ... # type: int
+KQ_NOTE_ATTRIB = ... # type: int
+KQ_NOTE_CHILD = ... # type: int
+KQ_NOTE_DELETE = ... # type: int
+KQ_NOTE_EXEC = ... # type: int
+KQ_NOTE_EXIT = ... # type: int
+KQ_NOTE_EXTEND = ... # type: int
+KQ_NOTE_FORK = ... # type: int
+KQ_NOTE_LINK = ... # type: int
+KQ_NOTE_LINKDOWN = ... # type: int
+KQ_NOTE_LINKINV = ... # type: int
+KQ_NOTE_LINKUP = ... # type: int
+KQ_NOTE_LOWAT = ... # type: int
+KQ_NOTE_PCTRLMASK = ... # type: int
+KQ_NOTE_PDATAMASK = ... # type: int
+KQ_NOTE_RENAME = ... # type: int
+KQ_NOTE_REVOKE = ... # type: int
+KQ_NOTE_TRACK = ... # type: int
+KQ_NOTE_TRACKERR = ... # type: int
+KQ_NOTE_WRITE = ... # type: int
+PIPE_BUF = ... # type: int
+POLLERR = ... # type: int
+POLLHUP = ... # type: int
+POLLIN = ... # type: int
+POLLMSG = ... # type: int
+POLLNVAL = ... # type: int
+POLLOUT = ... # type: int
+POLLPRI = ... # type: int
+POLLRDBAND = ... # type: int
+POLLRDNORM = ... # type: int
+POLLWRBAND = ... # type: int
+POLLWRNORM = ... # type: int
+
+def poll() -> epoll: ...
+def select(rlist, wlist, xlist, timeout: float = None) -> Tuple[List, List, List]: ...
+
+class error(Exception): ...
+
+class kevent(object):
+ data = ... # type: Any
+ fflags = ... # type: int
+ filter = ... # type: int
+ flags = ... # type: int
+ ident = ... # type: Any
+ udata = ... # type: Any
+ def __init__(self, *args, **kwargs) -> None: ...
+
+class kqueue(object):
+ closed = ... # type: bool
+ def __init__(self) -> None: ...
+ def close(self) -> None: ...
+ def control(self, changelist: Optional[Iterable[kevent]], max_events: int, timeout: int = ...) -> List[kevent]: ...
+ def fileno(self) -> int: ...
+ @classmethod
+ def fromfd(cls, fd: int) -> kqueue: ...
+
+class epoll(object):
+ def __init__(self, sizehint: int = ...) -> None: ...
+ def close(self) -> None: ...
+ def fileno(self) -> int: ...
+ def register(self, fd: int, eventmask: int = ...) -> None: ...
+ def modify(self, fd: int, eventmask: int) -> None: ...
+ def unregister(self, fd: int) -> None: ...
+ def poll(self, timeout: float = ..., maxevents: int = ...) -> Any: ...
+ @classmethod
+ def fromfd(cls, fd: int) -> epoll: ...
diff --git a/typeshed/stdlib/2/sha.pyi b/typeshed/stdlib/2/sha.pyi
new file mode 100644
index 0000000..f1606fa
--- /dev/null
+++ b/typeshed/stdlib/2/sha.pyi
@@ -0,0 +1,11 @@
+# Stubs for Python 2.7 sha stdlib module
+
+class sha(object):
+ def update(self, arg: str) -> None: ...
+ def digest(self) -> str: ...
+ def hexdigest(self) -> str: ...
+ def copy(self) -> sha: ...
+
+def new(string: str = ...) -> sha: ...
+blocksize = 0
+digest_size = 0
diff --git a/typeshed/stdlib/2/shelve.pyi b/typeshed/stdlib/2/shelve.pyi
new file mode 100644
index 0000000..f5a92b9
--- /dev/null
+++ b/typeshed/stdlib/2/shelve.pyi
@@ -0,0 +1,33 @@
+from typing import Any, Dict, Iterator, List, Optional, Tuple
+import collections
+
+
+class Shelf(collections.MutableMapping):
+ def __init__(self, dict: Dict[Any, Any], protocol: Optional[int] = None, writeback: bool = ..., keyencoding: str = 'utf-8') -> None: ...
+ def __iter__(self) -> Iterator[str]: ...
+ def keys(self) -> List[Any]: ...
+ def __len__(self) -> int: ...
+ def has_key(self, key: Any) -> bool: ...
+ def __contains__(self, key: Any) -> bool: ...
+ def get(self, key: Any, default: Any = None) -> Any: ...
+ def __getitem__(self, key: Any) -> Any: ...
+ def __setitem__(self, key: Any, value: Any) -> None: ...
+ def __delitem__(self, key: Any) -> None: ...
+ def __enter__(self) -> Shelf: ...
+ def __exit__(self, type: Any, value: Any, traceback: Any) -> None: ...
+ def close(self) -> None: ...
+ def __del__(self) -> None: ...
+ def sync(self) -> None: ...
+
+class BsdDbShelf(Shelf):
+ def __init__(self, dict: Dict[Any, Any], protocol: Optional[int] = None, writeback: bool = ..., keyencoding: str = 'utf-8') -> None: ...
+ def set_location(self, key: Any) -> Tuple[str, Any]: ...
+ def next(self) -> Tuple[str, Any]: ...
+ def previous(self) -> Tuple[str, Any]: ...
+ def first(self) -> Tuple[str, Any]: ...
+ def last(self) -> Tuple[str, Any]: ...
+
+class DbfilenameShelf(Shelf):
+ def __init__(self, filename: str, flag: str = 'c', protocol: Optional[int] = None, writeback: bool = ...) -> None: ...
+
+def open(filename: str, flag: str = 'c', protocol: Optional[int] = None, writeback: bool = ...) -> DbfilenameShelf: ...
diff --git a/typeshed/stdlib/2/shlex.pyi b/typeshed/stdlib/2/shlex.pyi
new file mode 100644
index 0000000..4b80fb6
--- /dev/null
+++ b/typeshed/stdlib/2/shlex.pyi
@@ -0,0 +1,27 @@
+from typing import Optional, List, Any, IO
+
+def split(s: Optional[str], comments: bool = ..., posix: bool = ...) -> List[str]: ...
+
+class shlex:
+ def __init__(self, instream: IO[Any] = ..., infile: IO[Any] = ..., posix: bool = ...) -> None: ...
+ def get_token(self) -> Optional[str]: ...
+ def push_token(self, _str: str) -> None: ...
+ def read_token(self) -> str: ...
+ def sourcehook(self, filename: str) -> None: ...
+ def push_source(self, stream: IO[Any], filename: str = ...) -> None: ...
+ def pop_source(self) -> IO[Any]: ...
+ def error_leader(self, file: str = ..., line: int = ...) -> str: ...
+
+ commenters = ... # type: str
+ wordchars = ... # type: str
+ whitespace = ... # type: str
+ escape = ... # type: str
+ quotes = ... # type: str
+ escapedquotes = ... # type: str
+ whitespace_split = ... # type: bool
+ infile = ... # type: IO[Any]
+ source = ... # type: Optional[str]
+ debug = ... # type: int
+ lineno = ... # type: int
+ token = ... # type: Any
+ eof = ... # type: Optional[str]
diff --git a/typeshed/stdlib/2/shutil.pyi b/typeshed/stdlib/2/shutil.pyi
new file mode 100644
index 0000000..c39f257
--- /dev/null
+++ b/typeshed/stdlib/2/shutil.pyi
@@ -0,0 +1,30 @@
+# Stubs for shutil (Python 2)
+#
+# NOTE: Based on a dynamically typed stub automatically generated by stubgen.
+
+from typing import List, Iterable, Callable, IO, AnyStr, Any, Optional, Tuple, Sequence
+
+class Error(EnvironmentError): ...
+class SpecialFileError(EnvironmentError): ...
+class ExecError(EnvironmentError): ...
+
+def copyfileobj(fsrc: IO[AnyStr], fdst: IO[AnyStr], length: int = ...) -> None: ...
+def copyfile(src: unicode, dst: unicode) -> None: ...
+def copymode(src: unicode, dst: unicode) -> None: ...
+def copystat(src: unicode, dst: unicode) -> None: ...
+def copy(src: unicode, dst: unicode) -> None: ...
+def copy2(src: unicode, dst: unicode) -> None: ...
+def ignore_patterns(*patterns: AnyStr) -> Callable[[AnyStr, List[AnyStr]], Iterable[AnyStr]]: ...
+def copytree(src: AnyStr, dst: AnyStr, symlinks: bool = ...,
+ ignore: Optional[Callable[[AnyStr, List[AnyStr]], Iterable[AnyStr]]] = ...) -> None: ...
+def rmtree(path: AnyStr, ignore_errors: bool = ...,
+ onerror: Callable[[Any, AnyStr, Any], None] = ...) -> None: ...
+def move(src: unicode, dst: unicode) -> None: ...
+def get_archive_formats() -> List[Tuple[str, str]]: ...
+def register_archive_format(name: str, function: Callable[..., Any],
+ extra_args: Sequence[Tuple[str, Any]] = ...,
+ description: str = ...) -> None: ...
+def unregister_archive_format(name: str) -> None: ...
+def make_archive(base_name: AnyStr, format: str, root_dir: unicode = ...,
+ base_dir: unicode = ..., verbose: int = ..., dry_run: int = ...,
+ owner: str = ..., group: str = ..., logger: Any = ...) -> AnyStr: ...
diff --git a/typeshed/stdlib/2/signal.pyi b/typeshed/stdlib/2/signal.pyi
new file mode 100644
index 0000000..1c9481b
--- /dev/null
+++ b/typeshed/stdlib/2/signal.pyi
@@ -0,0 +1,62 @@
+from typing import Callable, Any, Tuple, Union
+from types import FrameType
+
+SIG_DFL = ... # type: int
+SIG_IGN = ... # type: int
+ITIMER_REAL = ... # type: int
+ITIMER_VIRTUAL = ... # type: int
+ITIMER_PROF = ... # type: int
+
+SIGABRT = ... # type: int
+SIGALRM = ... # type: int
+SIGBUS = ... # type: int
+SIGCHLD = ... # type: int
+SIGCLD = ... # type: int
+SIGCONT = ... # type: int
+SIGFPE = ... # type: int
+SIGHUP = ... # type: int
+SIGILL = ... # type: int
+SIGINT = ... # type: int
+SIGIO = ... # type: int
+SIGIOT = ... # type: int
+SIGKILL = ... # type: int
+SIGPIPE = ... # type: int
+SIGPOLL = ... # type: int
+SIGPROF = ... # type: int
+SIGPWR = ... # type: int
+SIGQUIT = ... # type: int
+SIGRTMAX = ... # type: int
+SIGRTMIN = ... # type: int
+SIGSEGV = ... # type: int
+SIGSTOP = ... # type: int
+SIGSYS = ... # type: int
+SIGTERM = ... # type: int
+SIGTRAP = ... # type: int
+SIGTSTP = ... # type: int
+SIGTTIN = ... # type: int
+SIGTTOU = ... # type: int
+SIGURG = ... # type: int
+SIGUSR1 = ... # type: int
+SIGUSR2 = ... # type: int
+SIGVTALRM = ... # type: int
+SIGWINCH = ... # type: int
+SIGXCPU = ... # type: int
+SIGXFSZ = ... # type: int
+NSIG = ... # type: int
+
+class ItimerError(IOError): ...
+
+_HANDLER = Union[Callable[[int, FrameType], None], int, None]
+
+def alarm(time: int) -> int: ...
+def getsignal(signalnum: int) -> _HANDLER: ...
+def pause() -> None: ...
+def setitimer(which: int, seconds: float, interval: float = ...) -> Tuple[float, float]: ...
+def getitimer(which: int) -> Tuple[float, float]: ...
+def set_wakeup_fd(fd: int) -> int: ...
+def siginterrupt(signalnum: int, flag: bool) -> None:
+ raise RuntimeError()
+def signal(signalnum: int, handler: _HANDLER) -> _HANDLER:
+ raise RuntimeError()
+def default_int_handler(signum: int, frame: FrameType) -> None:
+ raise KeyboardInterrupt()
diff --git a/typeshed/stdlib/2/smtplib.pyi b/typeshed/stdlib/2/smtplib.pyi
new file mode 100644
index 0000000..cb5f893
--- /dev/null
+++ b/typeshed/stdlib/2/smtplib.pyi
@@ -0,0 +1,90 @@
+# Stubs for smtplib (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class SMTPException(Exception): ...
+class SMTPServerDisconnected(SMTPException): ...
+
+class SMTPResponseException(SMTPException):
+ smtp_code = ... # type: Any
+ smtp_error = ... # type: Any
+ args = ... # type: Any
+ def __init__(self, code, msg) -> None: ...
+
+class SMTPSenderRefused(SMTPResponseException):
+ smtp_code = ... # type: Any
+ smtp_error = ... # type: Any
+ sender = ... # type: Any
+ args = ... # type: Any
+ def __init__(self, code, msg, sender) -> None: ...
+
+class SMTPRecipientsRefused(SMTPException):
+ recipients = ... # type: Any
+ args = ... # type: Any
+ def __init__(self, recipients) -> None: ...
+
+class SMTPDataError(SMTPResponseException): ...
+class SMTPConnectError(SMTPResponseException): ...
+class SMTPHeloError(SMTPResponseException): ...
+class SMTPAuthenticationError(SMTPResponseException): ...
+
+def quoteaddr(addr): ...
+def quotedata(data): ...
+
+class SSLFakeFile:
+ sslobj = ... # type: Any
+ def __init__(self, sslobj) -> None: ...
+ def readline(self, size=...): ...
+ def close(self): ...
+
+class SMTP:
+ debuglevel = ... # type: Any
+ file = ... # type: Any
+ helo_resp = ... # type: Any
+ ehlo_msg = ... # type: Any
+ ehlo_resp = ... # type: Any
+ does_esmtp = ... # type: Any
+ default_port = ... # type: Any
+ timeout = ... # type: Any
+ esmtp_features = ... # type: Any
+ local_hostname = ... # type: Any
+ def __init__(self, host: str = ..., port: int = ..., local_hostname=..., timeout=...) -> None: ...
+ def set_debuglevel(self, debuglevel): ...
+ sock = ... # type: Any
+ def connect(self, host=..., port=...): ...
+ def send(self, str): ...
+ def putcmd(self, cmd, args=...): ...
+ def getreply(self): ...
+ def docmd(self, cmd, args=...): ...
+ def helo(self, name=...): ...
+ def ehlo(self, name=...): ...
+ def has_extn(self, opt): ...
+ def help(self, args=...): ...
+ def rset(self): ...
+ def noop(self): ...
+ def mail(self, sender, options=...): ...
+ def rcpt(self, recip, options=...): ...
+ def data(self, msg): ...
+ def verify(self, address): ...
+ vrfy = ... # type: Any
+ def expn(self, address): ...
+ def ehlo_or_helo_if_needed(self): ...
+ def login(self, user, password): ...
+ def starttls(self, keyfile=..., certfile=...): ...
+ def sendmail(self, from_addr, to_addrs, msg, mail_options=..., rcpt_options=...): ...
+ def close(self): ...
+ def quit(self): ...
+
+class SMTP_SSL(SMTP):
+ default_port = ... # type: Any
+ keyfile = ... # type: Any
+ certfile = ... # type: Any
+ def __init__(self, host=..., port=..., local_hostname=..., keyfile=..., certfile=..., timeout=...) -> None: ...
+
+class LMTP(SMTP):
+ ehlo_msg = ... # type: Any
+ def __init__(self, host=..., port=..., local_hostname=...) -> None: ...
+ sock = ... # type: Any
+ def connect(self, host=..., port=...): ...
diff --git a/typeshed/stdlib/2/socket.pyi b/typeshed/stdlib/2/socket.pyi
new file mode 100644
index 0000000..cbc3573
--- /dev/null
+++ b/typeshed/stdlib/2/socket.pyi
@@ -0,0 +1,362 @@
+# Stubs for socket
+# Ron Murawski <ron at horizonchess.com>
+
+# based on: http://docs.python.org/3.2/library/socket.html
+# see: http://hg.python.org/cpython/file/3d0686d90f55/Lib/socket.py
+# see: http://nullege.com/codes/search/socket
+# adapted for Python 2.7 by Michal Pokorny
+
+from typing import Any, Tuple, List, Optional, Union, overload
+
+# ----- variables and constants -----
+
+AF_UNIX = 0
+AF_INET = 0
+AF_INET6 = 0
+SOCK_STREAM = 0
+SOCK_DGRAM = 0
+SOCK_RAW = 0
+SOCK_RDM = 0
+SOCK_SEQPACKET = 0
+SOCK_CLOEXEC = 0
+SOCK_NONBLOCK = 0
+SOMAXCONN = 0
+has_ipv6 = False
+_GLOBAL_DEFAULT_TIMEOUT = ... # type: Any
+SocketType = ... # type: Any
+SocketIO = ... # type: Any
+
+
+# the following constants are included with Python 3.2.3 (Ubuntu)
+# some of the constants may be Linux-only
+# all Windows/Mac-specific constants are absent
+AF_APPLETALK = 0
+AF_ASH = 0
+AF_ATMPVC = 0
+AF_ATMSVC = 0
+AF_AX25 = 0
+AF_BLUETOOTH = 0
+AF_BRIDGE = 0
+AF_DECnet = 0
+AF_ECONET = 0
+AF_IPX = 0
+AF_IRDA = 0
+AF_KEY = 0
+AF_LLC = 0
+AF_NETBEUI = 0
+AF_NETLINK = 0
+AF_NETROM = 0
+AF_PACKET = 0
+AF_PPPOX = 0
+AF_ROSE = 0
+AF_ROUTE = 0
+AF_SECURITY = 0
+AF_SNA = 0
+AF_TIPC = 0
+AF_UNSPEC = 0
+AF_WANPIPE = 0
+AF_X25 = 0
+AI_ADDRCONFIG = 0
+AI_ALL = 0
+AI_CANONNAME = 0
+AI_NUMERICHOST = 0
+AI_NUMERICSERV = 0
+AI_PASSIVE = 0
+AI_V4MAPPED = 0
+BDADDR_ANY = 0
+BDADDR_LOCAL = 0
+BTPROTO_HCI = 0
+BTPROTO_L2CAP = 0
+BTPROTO_RFCOMM = 0
+BTPROTO_SCO = 0
+CAPI = 0
+EAGAIN = 0
+EAI_ADDRFAMILY = 0
+EAI_AGAIN = 0
+EAI_BADFLAGS = 0
+EAI_FAIL = 0
+EAI_FAMILY = 0
+EAI_MEMORY = 0
+EAI_NODATA = 0
+EAI_NONAME = 0
+EAI_OVERFLOW = 0
+EAI_SERVICE = 0
+EAI_SOCKTYPE = 0
+EAI_SYSTEM = 0
+EBADF = 0
+EINTR = 0
+EWOULDBLOCK = 0
+HCI_DATA_DIR = 0
+HCI_FILTER = 0
+HCI_TIME_STAMP = 0
+INADDR_ALLHOSTS_GROUP = 0
+INADDR_ANY = 0
+INADDR_BROADCAST = 0
+INADDR_LOOPBACK = 0
+INADDR_MAX_LOCAL_GROUP = 0
+INADDR_NONE = 0
+INADDR_UNSPEC_GROUP = 0
+IPPORT_RESERVED = 0
+IPPORT_USERRESERVED = 0
+IPPROTO_AH = 0
+IPPROTO_DSTOPTS = 0
+IPPROTO_EGP = 0
+IPPROTO_ESP = 0
+IPPROTO_FRAGMENT = 0
+IPPROTO_GRE = 0
+IPPROTO_HOPOPTS = 0
+IPPROTO_ICMP = 0
+IPPROTO_ICMPV6 = 0
+IPPROTO_IDP = 0
+IPPROTO_IGMP = 0
+IPPROTO_IP = 0
+IPPROTO_IPIP = 0
+IPPROTO_IPV6 = 0
+IPPROTO_NONE = 0
+IPPROTO_PIM = 0
+IPPROTO_PUP = 0
+IPPROTO_RAW = 0
+IPPROTO_ROUTING = 0
+IPPROTO_RSVP = 0
+IPPROTO_TCP = 0
+IPPROTO_TP = 0
+IPPROTO_UDP = 0
+IPV6_CHECKSUM = 0
+IPV6_DSTOPTS = 0
+IPV6_HOPLIMIT = 0
+IPV6_HOPOPTS = 0
+IPV6_JOIN_GROUP = 0
+IPV6_LEAVE_GROUP = 0
+IPV6_MULTICAST_HOPS = 0
+IPV6_MULTICAST_IF = 0
+IPV6_MULTICAST_LOOP = 0
+IPV6_NEXTHOP = 0
+IPV6_PKTINFO = 0
+IPV6_RECVDSTOPTS = 0
+IPV6_RECVHOPLIMIT = 0
+IPV6_RECVHOPOPTS = 0
+IPV6_RECVPKTINFO = 0
+IPV6_RECVRTHDR = 0
+IPV6_RECVTCLASS = 0
+IPV6_RTHDR = 0
+IPV6_RTHDRDSTOPTS = 0
+IPV6_RTHDR_TYPE_0 = 0
+IPV6_TCLASS = 0
+IPV6_UNICAST_HOPS = 0
+IPV6_V6ONLY = 0
+IP_ADD_MEMBERSHIP = 0
+IP_DEFAULT_MULTICAST_LOOP = 0
+IP_DEFAULT_MULTICAST_TTL = 0
+IP_DROP_MEMBERSHIP = 0
+IP_HDRINCL = 0
+IP_MAX_MEMBERSHIPS = 0
+IP_MULTICAST_IF = 0
+IP_MULTICAST_LOOP = 0
+IP_MULTICAST_TTL = 0
+IP_OPTIONS = 0
+IP_RECVOPTS = 0
+IP_RECVRETOPTS = 0
+IP_RETOPTS = 0
+IP_TOS = 0
+IP_TTL = 0
+MSG_CTRUNC = 0
+MSG_DONTROUTE = 0
+MSG_DONTWAIT = 0
+MSG_EOR = 0
+MSG_OOB = 0
+MSG_PEEK = 0
+MSG_TRUNC = 0
+MSG_WAITALL = 0
+NETLINK_DNRTMSG = 0
+NETLINK_FIREWALL = 0
+NETLINK_IP6_FW = 0
+NETLINK_NFLOG = 0
+NETLINK_ROUTE = 0
+NETLINK_USERSOCK = 0
+NETLINK_XFRM = 0
+NI_DGRAM = 0
+NI_MAXHOST = 0
+NI_MAXSERV = 0
+NI_NAMEREQD = 0
+NI_NOFQDN = 0
+NI_NUMERICHOST = 0
+NI_NUMERICSERV = 0
+PACKET_BROADCAST = 0
+PACKET_FASTROUTE = 0
+PACKET_HOST = 0
+PACKET_LOOPBACK = 0
+PACKET_MULTICAST = 0
+PACKET_OTHERHOST = 0
+PACKET_OUTGOING = 0
+PF_PACKET = 0
+SHUT_RD = 0
+SHUT_RDWR = 0
+SHUT_WR = 0
+SOL_HCI = 0
+SOL_IP = 0
+SOL_SOCKET = 0
+SOL_TCP = 0
+SOL_TIPC = 0
+SOL_UDP = 0
+SO_ACCEPTCONN = 0
+SO_BROADCAST = 0
+SO_DEBUG = 0
+SO_DONTROUTE = 0
+SO_ERROR = 0
+SO_KEEPALIVE = 0
+SO_LINGER = 0
+SO_OOBINLINE = 0
+SO_RCVBUF = 0
+SO_RCVLOWAT = 0
+SO_RCVTIMEO = 0
+SO_REUSEADDR = 0
+SO_SNDBUF = 0
+SO_SNDLOWAT = 0
+SO_SNDTIMEO = 0
+SO_TYPE = 0
+TCP_CORK = 0
+TCP_DEFER_ACCEPT = 0
+TCP_INFO = 0
+TCP_KEEPCNT = 0
+TCP_KEEPIDLE = 0
+TCP_KEEPINTVL = 0
+TCP_LINGER2 = 0
+TCP_MAXSEG = 0
+TCP_NODELAY = 0
+TCP_QUICKACK = 0
+TCP_SYNCNT = 0
+TCP_WINDOW_CLAMP = 0
+TIPC_ADDR_ID = 0
+TIPC_ADDR_NAME = 0
+TIPC_ADDR_NAMESEQ = 0
+TIPC_CFG_SRV = 0
+TIPC_CLUSTER_SCOPE = 0
+TIPC_CONN_TIMEOUT = 0
+TIPC_CRITICAL_IMPORTANCE = 0
+TIPC_DEST_DROPPABLE = 0
+TIPC_HIGH_IMPORTANCE = 0
+TIPC_IMPORTANCE = 0
+TIPC_LOW_IMPORTANCE = 0
+TIPC_MEDIUM_IMPORTANCE = 0
+TIPC_NODE_SCOPE = 0
+TIPC_PUBLISHED = 0
+TIPC_SRC_DROPPABLE = 0
+TIPC_SUBSCR_TIMEOUT = 0
+TIPC_SUB_CANCEL = 0
+TIPC_SUB_PORTS = 0
+TIPC_SUB_SERVICE = 0
+TIPC_TOP_SRV = 0
+TIPC_WAIT_FOREVER = 0
+TIPC_WITHDRAWN = 0
+TIPC_ZONE_SCOPE = 0
+
+
+# ----- exceptions -----
+class error(IOError):
+ ...
+
+class herror(error):
+ def __init__(self, herror: int, string: str) -> None: ...
+
+class gaierror(error):
+ def __init__(self, error: int, string: str) -> None: ...
+
+class timeout(error):
+ ...
+
+
+# Addresses can be either tuples of varying lengths (AF_INET, AF_INET6,
+# AF_NETLINK, AF_TIPC) or strings (AF_UNIX).
+
+# TODO AF_PACKET and AF_BLUETOOTH address objects
+
+
+# ----- classes -----
+class socket:
+ family = 0
+ type = 0
+ proto = 0
+
+ def __init__(self, family: int = ..., type: int = ...,
+ proto: int = ...) -> None: ...
+
+ # --- methods ---
+ # second tuple item is an address
+ def accept(self) -> Tuple['socket', Any]: ...
+ def bind(self, address: Union[tuple, str]) -> None: ...
+ def close(self) -> None: ...
+ def connect(self, address: Union[tuple, str]) -> None: ...
+ def connect_ex(self, address: Union[tuple, str]) -> int: ...
+ def detach(self) -> int: ...
+ def fileno(self) -> int: ...
+
+ # return value is an address
+ def getpeername(self) -> Any: ...
+ def getsockname(self) -> Any: ...
+
+ @overload
+ def getsockopt(self, level: int, optname: int) -> int: ...
+ @overload
+ def getsockopt(self, level: int, optname: int, buflen: int) -> bytes: ...
+
+ def gettimeout(self) -> float: ...
+ def ioctl(self, control: object,
+ option: Tuple[int, int, int]) -> None: ...
+ def listen(self, backlog: int) -> None: ...
+ # TODO the return value may be BinaryIO or TextIO, depending on mode
+ def makefile(self, mode: str = ..., buffering: int = ...,
+ encoding: str = ..., errors: str = ...,
+ newline: str = ...) -> Any:
+ ...
+ def recv(self, bufsize: int, flags: int = ...) -> str: ...
+
+ # return type is an address
+ def recvfrom(self, bufsize: int, flags: int = ...) -> Any: ...
+ def recvfrom_into(self, buffer: str, nbytes: int,
+ flags: int = ...) -> Any: ...
+ def recv_into(self, buffer: str, nbytes: int,
+ flags: int = ...) -> Any: ...
+ def send(self, data: str, flags: int = ...) -> int: ...
+ def sendall(self, data: str, flags: int = ...) -> None:
+ ... # return type: None on success
+ def sendto(self, data: str, address: Union[tuple, str], flags: int = ...) -> int: ...
+ def setblocking(self, flag: bool) -> None: ...
+ def settimeout(self, value: Union[float, None]) -> None: ...
+ def setsockopt(self, level: int, optname: int, value: Union[int, bytes]) -> None: ...
+ def shutdown(self, how: int) -> None: ...
+
+
+# ----- functions -----
+def create_connection(address: Tuple[str, int],
+ timeout: float = ...,
+ source_address: Tuple[str, int] = ...) -> socket: ...
+
+# the 5th tuple item is an address
+def getaddrinfo(
+ host: Optional[str], port: Union[str, int, None], family: int = ...,
+ socktype: int = ..., proto: int = ..., flags: int = ...) -> List[Tuple[int, int, int, str, Union[Tuple[str, int], Tuple[str, int, int, int]]]]:
+ ...
+
+def getfqdn(name: str = ...) -> str: ...
+def gethostbyname(hostname: str) -> str: ...
+def gethostbyname_ex(hostname: str) -> Tuple[str, List[str], List[str]]: ...
+def gethostname() -> str: ...
+def gethostbyaddr(ip_address: str) -> Tuple[str, List[str], List[str]]: ...
+def getnameinfo(sockaddr: tuple, flags: int) -> Tuple[str, int]: ...
+def getprotobyname(protocolname: str) -> int: ...
+def getservbyname(servicename: str, protocolname: str = ...) -> int: ...
+def getservbyport(port: int, protocolname: str = ...) -> str: ...
+def socketpair(family: int = ...,
+ type: int = ...,
+ proto: int = ...) -> Tuple[socket, socket]: ...
+def fromfd(fd: int, family: int, type: int, proto: int = ...) -> socket: ...
+def ntohl(x: int) -> int: ... # param & ret val are 32-bit ints
+def ntohs(x: int) -> int: ... # param & ret val are 16-bit ints
+def htonl(x: int) -> int: ... # param & ret val are 32-bit ints
+def htons(x: int) -> int: ... # param & ret val are 16-bit ints
+def inet_aton(ip_string: str) -> str: ... # ret val 4 bytes in length
+def inet_ntoa(packed_ip: str) -> str: ...
+def inet_pton(address_family: int, ip_string: str) -> str: ...
+def inet_ntop(address_family: int, packed_ip: str) -> str: ...
+def getdefaulttimeout() -> Union[float, None]: ...
+def setdefaulttimeout(timeout: float) -> None: ...
diff --git a/typeshed/stdlib/2/spwd.pyi b/typeshed/stdlib/2/spwd.pyi
new file mode 100644
index 0000000..ee09838
--- /dev/null
+++ b/typeshed/stdlib/2/spwd.pyi
@@ -0,0 +1,15 @@
+from typing import List
+
+class struct_spwd(object):
+ sp_nam = ... # type: str
+ sp_pwd = ... # type: str
+ sp_lstchg = ... # type: int
+ sp_min = ... # type: int
+ sp_max = ... # type: int
+ sp_warn = ... # type: int
+ sp_inact = ... # type: int
+ sp_expire = ... # type: int
+ sp_flag = ... # type: int
+
+def getspall() -> List[struct_spwd]: pass
+def getspnam() -> struct_spwd: pass
diff --git a/typeshed/stdlib/2/sqlite3/__init__.pyi b/typeshed/stdlib/2/sqlite3/__init__.pyi
new file mode 100644
index 0000000..fc22e5d
--- /dev/null
+++ b/typeshed/stdlib/2/sqlite3/__init__.pyi
@@ -0,0 +1,5 @@
+# Stubs for sqlite3 (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from sqlite3.dbapi2 import * # noqa: F403
diff --git a/typeshed/stdlib/2/sqlite3/dbapi2.pyi b/typeshed/stdlib/2/sqlite3/dbapi2.pyi
new file mode 100644
index 0000000..7a6dcf1
--- /dev/null
+++ b/typeshed/stdlib/2/sqlite3/dbapi2.pyi
@@ -0,0 +1,256 @@
+# Filip Hron <filip.hron at gmail.com>
+# based heavily on Andrey Vlasovskikh's python-skeletons https://github.com/JetBrains/python-skeletons/blob/master/sqlite3.py
+
+from typing import Any, Union, List, Iterator
+from numbers import Integral
+from datetime import time, datetime
+from collections import Iterable
+
+paramstyle = ... # type: str
+threadsafety = ... # type: int
+apilevel = ... # type: str
+Date = ... # type: datetime
+Time = ... # type: time
+Timestamp = ... # type: datetime
+
+def DateFromTicks(ticks): ...
+def TimeFromTicks(ticks): ...
+def TimestampFromTicks(ticks): ...
+
+version_info = ... # type: Any
+sqlite_version_info = ... # type: Any
+Binary = ... # type: Any
+
+def register_adapters_and_converters(): ...
+
+# The remaining definitions are imported from _sqlite3.
+
+PARSE_COLNAMES = ... # type: int
+PARSE_DECLTYPES = ... # type: int
+SQLITE_ALTER_TABLE = ... # type: int
+SQLITE_ANALYZE = ... # type: int
+SQLITE_ATTACH = ... # type: int
+SQLITE_CREATE_INDEX = ... # type: int
+SQLITE_CREATE_TABLE = ... # type: int
+SQLITE_CREATE_TEMP_INDEX = ... # type: int
+SQLITE_CREATE_TEMP_TABLE = ... # type: int
+SQLITE_CREATE_TEMP_TRIGGER = ... # type: int
+SQLITE_CREATE_TEMP_VIEW = ... # type: int
+SQLITE_CREATE_TRIGGER = ... # type: int
+SQLITE_CREATE_VIEW = ... # type: int
+SQLITE_DELETE = ... # type: int
+SQLITE_DENY = ... # type: int
+SQLITE_DETACH = ... # type: int
+SQLITE_DROP_INDEX = ... # type: int
+SQLITE_DROP_TABLE = ... # type: int
+SQLITE_DROP_TEMP_INDEX = ... # type: int
+SQLITE_DROP_TEMP_TABLE = ... # type: int
+SQLITE_DROP_TEMP_TRIGGER = ... # type: int
+SQLITE_DROP_TEMP_VIEW = ... # type: int
+SQLITE_DROP_TRIGGER = ... # type: int
+SQLITE_DROP_VIEW = ... # type: int
+SQLITE_IGNORE = ... # type: int
+SQLITE_INSERT = ... # type: int
+SQLITE_OK = ... # type: int
+SQLITE_PRAGMA = ... # type: int
+SQLITE_READ = ... # type: int
+SQLITE_REINDEX = ... # type: int
+SQLITE_SELECT = ... # type: int
+SQLITE_TRANSACTION = ... # type: int
+SQLITE_UPDATE = ... # type: int
+adapters = ... # type: Any
+converters = ... # type: Any
+sqlite_version = ... # type: str
+version = ... # type: str
+
+# TODO: adapt needs to get probed
+def adapt(obj, protocol, alternate): ...
+def complete_statement(sql: str) -> bool: ...
+def connect(database: Union[bytes, unicode],
+ timeout: float = ...,
+ detect_types: int = ...,
+ isolation_level: Union[str, None] = ...,
+ check_same_thread: bool = ...,
+ factory: Union[Connection, None] = ...,
+ cached_statements: int = ...) -> Connection: ...
+def enable_callback_tracebacks(flag: bool) -> None: ...
+def enable_shared_cache(do_enable: int) -> None: ...
+def register_adapter(type: type, callable: Any) -> None: ...
+# TODO: sqlite3.register_converter.__doc__ specifies callable as unknown
+def register_converter(typename: str, callable: bytes) -> None: ...
+
+class Cache:
+ def __init__(self, *args, **kwargs) -> None: ...
+ def display(self, *args, **kwargs) -> None: ...
+ def get(self, *args, **kwargs) -> None: ...
+
+class Connection:
+ DataError = ... # type: Any
+ DatabaseError = ... # type: Any
+ Error = ... # type: Any
+ IntegrityError = ... # type: Any
+ InterfaceError = ... # type: Any
+ InternalError = ... # type: Any
+ NotSupportedError = ... # type: Any
+ OperationalError = ... # type: Any
+ ProgrammingError = ... # type: Any
+ Warning = ... # type: Any
+ in_transaction = ... # type: Any
+ isolation_level = ... # type: Any
+ row_factory = ... # type: Any
+ text_factory = ... # type: Any
+ total_changes = ... # type: Any
+ def __init__(self, *args, **kwargs): ...
+ def close(self) -> None: ...
+ def commit(self) -> None: ...
+ def create_aggregate(self, name: str, num_params: int, aggregate_class: type) -> None: ...
+ def create_collation(self, name: str, callable: Any) -> None: ...
+ def create_function(self, name: str, num_params: int, func: Any) -> None: ...
+ def cursor(self, cursorClass=...) -> Cursor: ...
+ def execute(self, sql: str, parameters: Iterable = ...) -> Cursor: ...
+ # TODO: please check in executemany() if seq_of_parameters type is possible like this
+ def executemany(self, sql: str, seq_of_parameters: Iterable[Iterable]) -> Cursor: ...
+ def executescript(self, sql_script: Union[bytes, unicode]) -> Cursor: ...
+ def interrupt(self, *args, **kwargs) -> None: ...
+ def iterdump(self, *args, **kwargs) -> None: ...
+ def rollback(self, *args, **kwargs) -> None: ...
+ # TODO: set_authorizer(authorzer_callback)
+ # see https://docs.python.org/2/library/sqlite3.html#sqlite3.Connection.set_authorizer
+ # returns [SQLITE_OK, SQLITE_DENY, SQLITE_IGNORE] so perhaps int
+ def set_authorizer(self, *args, **kwargs) -> None: ...
+ # set_progress_handler(handler, n) -> see https://docs.python.org/2/library/sqlite3.html#sqlite3.Connection.set_progress_handler
+ def set_progress_handler(self, *args, **kwargs) -> None: ...
+ def set_trace_callback(self, *args, **kwargs): ...
+ def __call__(self, *args, **kwargs): ...
+ def __enter__(self, *args, **kwargs): ...
+ def __exit__(self, *args, **kwargs): ...
+
+class Cursor(Iterator[Any]):
+ arraysize = ... # type: Any
+ connection = ... # type: Any
+ description = ... # type: Any
+ lastrowid = ... # type: Any
+ row_factory = ... # type: Any
+ rowcount = ... # type: Any
+ # TODO: Cursor class accepts exactly 1 argument
+ # required type is sqlite3.Connection (which is imported as _Connection)
+ # however, the name of the __init__ variable is unknown
+ def __init__(self, *args, **kwargs): ...
+ def close(self, *args, **kwargs): ...
+ def execute(self, sql: str, parameters: Iterable = ...) -> Cursor: ...
+ def executemany(self, sql: str, seq_of_parameters: Iterable[Iterable]): ...
+ def executescript(self, sql_script: Union[bytes, unicode]) -> Cursor: ...
+ def fetchall(self) -> List[Any]: ...
+ def fetchmany(self, size: Integral = ...) -> List[Any]: ...
+ def fetchone(self) -> Any: ...
+ def setinputsizes(self, *args, **kwargs): ...
+ def setoutputsize(self, *args, **kwargs): ...
+ def __iter__(self) -> Cursor: ...
+ def __next__(self) -> Any: ...
+
+
+class DataError(DatabaseError): ...
+
+class DatabaseError(Error): ...
+
+class Error(Exception): ...
+
+class IntegrityError(DatabaseError): ...
+
+class InterfaceError(Error): ...
+
+class InternalError(DatabaseError): ...
+
+class NotSupportedError(DatabaseError): ...
+
+class OperationalError(DatabaseError): ...
+
+class OptimizedUnicode:
+ maketrans = ... # type: Any
+ def __init__(self, *args, **kwargs): ...
+ def capitalize(self, *args, **kwargs): ...
+ def casefold(self, *args, **kwargs): ...
+ def center(self, *args, **kwargs): ...
+ def count(self, *args, **kwargs): ...
+ def encode(self, *args, **kwargs): ...
+ def endswith(self, *args, **kwargs): ...
+ def expandtabs(self, *args, **kwargs): ...
+ def find(self, *args, **kwargs): ...
+ def format(self, *args, **kwargs): ...
+ def format_map(self, *args, **kwargs): ...
+ def index(self, *args, **kwargs): ...
+ def isalnum(self, *args, **kwargs): ...
+ def isalpha(self, *args, **kwargs): ...
+ def isdecimal(self, *args, **kwargs): ...
+ def isdigit(self, *args, **kwargs): ...
+ def isidentifier(self, *args, **kwargs): ...
+ def islower(self, *args, **kwargs): ...
+ def isnumeric(self, *args, **kwargs): ...
+ def isprintable(self, *args, **kwargs): ...
+ def isspace(self, *args, **kwargs): ...
+ def istitle(self, *args, **kwargs): ...
+ def isupper(self, *args, **kwargs): ...
+ def join(self, *args, **kwargs): ...
+ def ljust(self, *args, **kwargs): ...
+ def lower(self, *args, **kwargs): ...
+ def lstrip(self, *args, **kwargs): ...
+ def partition(self, *args, **kwargs): ...
+ def replace(self, *args, **kwargs): ...
+ def rfind(self, *args, **kwargs): ...
+ def rindex(self, *args, **kwargs): ...
+ def rjust(self, *args, **kwargs): ...
+ def rpartition(self, *args, **kwargs): ...
+ def rsplit(self, *args, **kwargs): ...
+ def rstrip(self, *args, **kwargs): ...
+ def split(self, *args, **kwargs): ...
+ def splitlines(self, *args, **kwargs): ...
+ def startswith(self, *args, **kwargs): ...
+ def strip(self, *args, **kwargs): ...
+ def swapcase(self, *args, **kwargs): ...
+ def title(self, *args, **kwargs): ...
+ def translate(self, *args, **kwargs): ...
+ def upper(self, *args, **kwargs): ...
+ def zfill(self, *args, **kwargs): ...
+ def __add__(self, other): ...
+ def __contains__(self, *args, **kwargs): ...
+ def __eq__(self, other): ...
+ def __format__(self, *args, **kwargs): ...
+ def __ge__(self, other): ...
+ def __getitem__(self, index): ...
+ def __getnewargs__(self, *args, **kwargs): ...
+ def __gt__(self, other): ...
+ def __hash__(self): ...
+ def __iter__(self): ...
+ def __le__(self, other): ...
+ def __len__(self, *args, **kwargs): ...
+ def __lt__(self, other): ...
+ def __mod__(self, other): ...
+ def __mul__(self, other): ...
+ def __ne__(self, other): ...
+ def __rmod__(self, other): ...
+ def __rmul__(self, other): ...
+ def __sizeof__(self): ...
+
+class PrepareProtocol:
+ def __init__(self, *args, **kwargs): ...
+
+class ProgrammingError(DatabaseError): ...
+
+class Row:
+ def __init__(self, *args, **kwargs): ...
+ def keys(self, *args, **kwargs): ...
+ def __eq__(self, other): ...
+ def __ge__(self, other): ...
+ def __getitem__(self, index): ...
+ def __gt__(self, other): ...
+ def __hash__(self): ...
+ def __iter__(self): ...
+ def __le__(self, other): ...
+ def __len__(self, *args, **kwargs): ...
+ def __lt__(self, other): ...
+ def __ne__(self, other): ...
+
+class Statement:
+ def __init__(self, *args, **kwargs): ...
+
+class Warning(Exception): ...
diff --git a/typeshed/stdlib/2/ssl.pyi b/typeshed/stdlib/2/ssl.pyi
new file mode 100644
index 0000000..3c07549
--- /dev/null
+++ b/typeshed/stdlib/2/ssl.pyi
@@ -0,0 +1,204 @@
+# Stubs for ssl
+
+from typing import (
+ Any, Dict, Callable, List, NamedTuple, Optional, Set, Tuple, Union,
+)
+import socket
+import sys
+
+_PCTRTT = Tuple[Tuple[str, str], ...]
+_PCTRTTT = Tuple[_PCTRTT, ...]
+_PeerCertRetDictType = Dict[str, Union[str, _PCTRTTT, _PCTRTT]]
+_PeerCertRetType = Union[_PeerCertRetDictType, bytes, None]
+_EnumRetType = List[Tuple[bytes, str, Union[Set[str], bool]]]
+_PasswordType = Union[Callable[[], Union[str, bytes]], str, bytes]
+_SrvnmeCbType = Callable[['SSLSocket', Optional[str], 'SSLSocket'], Optional[int]]
+
+class SSLError(OSError):
+ library = ... # type: str
+ reason = ... # type: str
+class SSLZeroReturnError(SSLError): ...
+class SSLWantReadError(SSLError): ...
+class SSLWantWriteError(SSLError): ...
+class SSLSyscallError(SSLError): ...
+class SSLEOFError(SSLError): ...
+class CertificateError(Exception): ...
+
+
+def wrap_socket(sock: socket.socket, keyfile: Optional[str] = ...,
+ certfile: Optional[str] = ..., server_side: bool = ...,
+ cert_reqs: int = ..., ssl_version: int = ...,
+ ca_certs: Optional[str] = ...,
+ do_handshake_on_connect: bool = ...,
+ suppress_ragged_eofs: bool = ...,
+ ciphers: Optional[str] = ...) -> 'SSLSocket': ...
+
+
+def create_default_context(purpose: Any = ..., *,
+ cafile: Optional[str] = ...,
+ capath: Optional[str] = ...,
+ cadata: Optional[str] = ...) -> 'SSLContext': ...
+
+
+def RAND_status() -> bool: ...
+def RAND_egd(path: str) -> None: ...
+def RAND_add(bytes: bytes, entropy: float) -> None: ...
+
+
+def match_hostname(cert: _PeerCertRetType, hostname: str) -> None: ...
+def cert_time_to_seconds(cert_time: str) -> int: ...
+def get_server_certificate(addr: Tuple[str, int], ssl_version: int = ...,
+ ca_certs: Optional[str] = ...) -> str: ...
+def DER_cert_to_PEM_cert(der_cert_bytes: bytes) -> str: ...
+def PEM_cert_to_DER_cert(pem_cert_string: str) -> bytes: ...
+DefaultVerifyPaths = NamedTuple('DefaultVerifyPaths',
+ [('cafile', str), ('capath', str),
+ ('openssl_cafile_env', str),
+ ('openssl_cafile', str),
+ ('openssl_capath_env', str),
+ ('openssl_capath', str)])
+def get_default_verify_paths() -> DefaultVerifyPaths: ...
+
+if sys.platform == 'win32':
+ def enum_certificates(store_name: str) -> _EnumRetType: ...
+ def enum_crls(store_name: str) -> _EnumRetType: ...
+
+
+CERT_NONE = ... # type: int
+CERT_OPTIONAL = ... # type: int
+CERT_REQUIRED = ... # type: int
+
+VERIFY_DEFAULT = ... # type: int
+VERIFY_CRL_CHECK_LEAF = ... # type: int
+VERIFY_CRL_CHECK_CHAIN = ... # type: int
+VERIFY_X509_STRICT = ... # type: int
+VERIFY_X509_TRUSTED_FIRST = ... # type: int
+
+PROTOCOL_SSLv23 = ... # type: int
+PROTOCOL_SSLv2 = ... # type: int
+PROTOCOL_SSLv3 = ... # type: int
+PROTOCOL_TLSv1 = ... # type: int
+PROTOCOL_TLSv1_1 = ... # type: int
+PROTOCOL_TLSv1_2 = ... # type: int
+
+OP_ALL = ... # type: int
+OP_NO_SSLv2 = ... # type: int
+OP_NO_SSLv3 = ... # type: int
+OP_NO_TLSv1 = ... # type: int
+OP_NO_TLSv1_1 = ... # type: int
+OP_NO_TLSv1_2 = ... # type: int
+OP_CIPHER_SERVER_PREFERENCE = ... # type: int
+OP_SINGLE_DH_USE = ... # type: int
+OP_SINGLE_ECDH_USE = ... # type: int
+OP_NO_COMPRESSION = ... # type: int
+
+HAS_ALPN = ... # type: int
+HAS_ECDH = ... # type: bool
+HAS_SNI = ... # type: bool
+HAS_NPN = ... # type: bool
+CHANNEL_BINDING_TYPES = ... # type: List[str]
+
+OPENSSL_VERSION = ... # type: str
+OPENSSL_VERSION_INFO = ... # type: Tuple[int, int, int, int, int]
+OPENSSL_VERSION_NUMBER = ... # type: int
+
+ALERT_DESCRIPTION_HANDSHAKE_FAILURE = ... # type: int
+ALERT_DESCRIPTION_INTERNAL_ERROR = ... # type: int
+ALERT_DESCRIPTION_ACCESS_DENIED = ... # type: int
+ALERT_DESCRIPTION_BAD_CERTIFICATE = ... # type: int
+ALERT_DESCRIPTION_BAD_CERTIFICATE_HASH_VALUE = ... # type: int
+ALERT_DESCRIPTION_BAD_CERTIFICATE_STATUS_RESPONSE = ... # type: int
+ALERT_DESCRIPTION_BAD_RECORD_MAC = ... # type: int
+ALERT_DESCRIPTION_CERTIFICATE_EXPIRED = ... # type: int
+ALERT_DESCRIPTION_CERTIFICATE_REVOKED = ... # type: int
+ALERT_DESCRIPTION_CERTIFICATE_UNKNOWN = ... # type: int
+ALERT_DESCRIPTION_CERTIFICATE_UNOBTAINABLE = ... # type: int
+ALERT_DESCRIPTION_CLOSE_NOTIFY = ... # type: int
+ALERT_DESCRIPTION_DECODE_ERROR = ... # type: int
+ALERT_DESCRIPTION_DECOMPRESSION_FAILURE = ... # type: int
+ALERT_DESCRIPTION_DECRYPT_ERROR = ... # type: int
+ALERT_DESCRIPTION_ILLEGAL_PARAMETER = ... # type: int
+ALERT_DESCRIPTION_INSUFFICIENT_SECURITY = ... # type: int
+ALERT_DESCRIPTION_NO_RENEGOTIATION = ... # type: int
+ALERT_DESCRIPTION_PROTOCOL_VERSION = ... # type: int
+ALERT_DESCRIPTION_RECORD_OVERFLOW = ... # type: int
+ALERT_DESCRIPTION_UNEXPECTED_MESSAGE = ... # type: int
+ALERT_DESCRIPTION_UNKNOWN_CA = ... # type: int
+ALERT_DESCRIPTION_UNKNOWN_PSK_IDENTITY = ... # type: int
+ALERT_DESCRIPTION_UNRECOGNIZED_NAME = ... # type: int
+ALERT_DESCRIPTION_UNSUPPORTED_CERTIFICATE = ... # type: int
+ALERT_DESCRIPTION_UNSUPPORTED_EXTENSION = ... # type: int
+ALERT_DESCRIPTION_USER_CANCELLED = ... # type: int
+
+_PurposeType = NamedTuple('_PurposeType',
+ [('nid', int), ('shortname', str),
+ ('longname', str), ('oid', str)])
+class Purpose:
+ SERVER_AUTH = ... # type: _PurposeType
+ CLIENT_AUTH = ... # type: _PurposeType
+
+
+class SSLSocket(socket.socket):
+ def do_handshake(self) -> None: ...
+ def getpeercert(self, binary_form: bool = ...) -> _PeerCertRetType: ...
+ def cipher(self) -> Tuple[str, int, int]: ...
+ def compression(self) -> Optional[str]: ...
+ def get_channel_binding(self, cb_type: str = ...) -> Optional[bytes]: ...
+ def selected_alpn_protocol(self) -> Optional[str]: ...
+ def selected_npn_protocol(self) -> Optional[str]: ...
+ def unwrap(self) -> socket.socket: ...
+ def version(self) -> Optional[str]: ...
+
+
+class SSLContext:
+ check_hostname = ... # type: bool
+ options = ... # type: int
+ @property
+ def protocol(self) -> int: ...
+ verify_flags = ... # type: int
+ verify_mode = ... # type: int
+ def __init__(self, protocol: int) -> None: ...
+ def cert_store_stats(self) -> Dict[str, int]: ...
+ def load_cert_chain(self, certfile: str, keyfile: Optional[str] = ...,
+ password: _PasswordType = ...) -> None: ...
+ def load_default_certs(self, purpose: _PurposeType = ...) -> None: ...
+ def load_verify_locations(self, cafile: Optional[str] = ...,
+ capath: Optional[str] = ...,
+ cadata: Union[str, bytes, None] = ...) -> None: ...
+ def get_ca_certs(self,
+ binary_form: bool = ...) -> Union[List[_PeerCertRetDictType], List[bytes]]: ...
+ def set_default_verify_paths(self) -> None: ...
+ def set_ciphers(self, ciphers: str) -> None: ...
+ def set_alpn_protocols(self, protocols: List[str]) -> None: ...
+ def set_npn_protocols(self, protocols: List[str]) -> None: ...
+ def set_servername_callback(self,
+ server_name_callback: Optional[_SrvnmeCbType]) -> None: ...
+ def load_dh_params(self, dhfile: str) -> None: ...
+ def set_ecdh_curve(self, curve_name: str) -> None: ...
+ def wrap_socket(self, sock: socket.socket, server_side: bool = ...,
+ do_handshake_on_connect: bool = ...,
+ suppress_ragged_eofs: bool = ...,
+ server_hostname: Optional[str] = ...) -> 'SSLContext': ...
+ def session_stats(self) -> Dict[str, int]: ...
+
+
+# TODO below documented in cpython but not in docs.python.org
+# taken from python 3.4
+SSL_ERROR_EOF = ... # type: int
+SSL_ERROR_INVALID_ERROR_CODE = ... # type: int
+SSL_ERROR_SSL = ... # type: int
+SSL_ERROR_SYSCALL = ... # type: int
+SSL_ERROR_WANT_CONNECT = ... # type: int
+SSL_ERROR_WANT_READ = ... # type: int
+SSL_ERROR_WANT_WRITE = ... # type: int
+SSL_ERROR_WANT_X509_LOOKUP = ... # type: int
+SSL_ERROR_ZERO_RETURN = ... # type: int
+
+def get_protocol_name(protocol_code: int) -> str: ...
+
+AF_INET = ... # type: int
+PEM_FOOTER = ... # type: str
+PEM_HEADER = ... # type: str
+SOCK_STREAM = ... # type: int
+SOL_SOCKET = ... # type: int
+SO_TYPE = ... # type: int
diff --git a/typeshed/stdlib/2/stat.pyi b/typeshed/stdlib/2/stat.pyi
new file mode 100644
index 0000000..dd3418d
--- /dev/null
+++ b/typeshed/stdlib/2/stat.pyi
@@ -0,0 +1,59 @@
+def S_ISDIR(mode: int) -> bool: ...
+def S_ISCHR(mode: int) -> bool: ...
+def S_ISBLK(mode: int) -> bool: ...
+def S_ISREG(mode: int) -> bool: ...
+def S_ISFIFO(mode: int) -> bool: ...
+def S_ISLNK(mode: int) -> bool: ...
+def S_ISSOCK(mode: int) -> bool: ...
+
+def S_IMODE(mode: int) -> int: ...
+def S_IFMT(mode: int) -> int: ...
+
+ST_MODE = 0
+ST_INO = 0
+ST_DEV = 0
+ST_NLINK = 0
+ST_UID = 0
+ST_GID = 0
+ST_SIZE = 0
+ST_ATIME = 0
+ST_MTIME = 0
+ST_CTIME = 0
+S_IFSOCK = 0
+S_IFLNK = 0
+S_IFREG = 0
+S_IFBLK = 0
+S_IFDIR = 0
+S_IFCHR = 0
+S_IFIFO = 0
+S_ISUID = 0
+S_ISGID = 0
+S_ISVTX = 0
+S_IRWXU = 0
+S_IRUSR = 0
+S_IWUSR = 0
+S_IXUSR = 0
+S_IRWXG = 0
+S_IRGRP = 0
+S_IWGRP = 0
+S_IXGRP = 0
+S_IRWXO = 0
+S_IROTH = 0
+S_IWOTH = 0
+S_IXOTH = 0
+S_ENFMT = 0
+S_IREAD = 0
+S_IWRITE = 0
+S_IEXEC = 0
+UF_NODUMP = 0
+UF_IMMUTABLE = 0
+UF_APPEND = 0
+UF_OPAQUE = 0
+UF_NOUNLINK = 0
+UF_COMPRESSED = 0
+UF_HIDDEN = 0
+SF_ARCHIVED = 0
+SF_IMMUTABLE = 0
+SF_APPEND = 0
+SF_NOUNLINK = 0
+SF_SNAPSHOT = 0
diff --git a/typeshed/stdlib/2/string.pyi b/typeshed/stdlib/2/string.pyi
new file mode 100644
index 0000000..4bbfb48
--- /dev/null
+++ b/typeshed/stdlib/2/string.pyi
@@ -0,0 +1,74 @@
+# Stubs for string
+
+# Based on http://docs.python.org/3.2/library/string.html
+
+from typing import Mapping, Sequence, Any, Optional, Union, List, Tuple, Iterable, AnyStr
+
+ascii_letters = ... # type: str
+ascii_lowercase = ... # type: str
+ascii_uppercase = ... # type: str
+digits = ... # type: str
+hexdigits = ... # type: str
+letters = ... # type: str
+lowercase = ... # type: str
+octdigits = ... # type: str
+punctuation = ... # type: str
+printable = ... # type: str
+uppercase = ... # type: str
+whitespace = ... # type: str
+
+def capwords(s: AnyStr, sep: AnyStr = ...) -> AnyStr: ...
+# TODO: originally named 'from'
+def maketrans(_from: str, to: str) -> str: ...
+def atof(s: unicode) -> float: ...
+def atoi(s: unicode, base: int = ...) -> int: ...
+def atol(s: unicode, base: int = ...) -> int: ...
+def capitalize(word: AnyStr) -> AnyStr: ...
+def find(s: unicode, sub: unicode, start: int = ..., end: int = ...) -> int: ...
+def rfind(s: unicode, sub: unicode, start: int = ..., end: int = ...) -> int: ...
+def index(s: unicode, sub: unicode, start: int = ..., end: int = ...) -> int: ...
+def rindex(s: unicode, sub: unicode, start: int = ..., end: int = ...) -> int: ...
+def count(s: unicode, sub: unicode, start: int = ..., end: int = ...) -> int: ...
+def lower(s: AnyStr) -> AnyStr: ...
+def split(s: AnyStr, sep: AnyStr = ..., maxsplit: int = ...) -> List[AnyStr]: ...
+def rsplit(s: AnyStr, sep: AnyStr = ..., maxsplit: int = ...) -> List[AnyStr]: ...
+def splitfields(s: AnyStr, sep: AnyStr = ..., maxsplit: int = ...) -> List[AnyStr]: ...
+def join(words: Iterable[AnyStr], sep: AnyStr = ...) -> AnyStr: ...
+def joinfields(word: Iterable[AnyStr], sep: AnyStr = ...) -> AnyStr: ...
+def lstrip(s: AnyStr, chars: AnyStr = ...) -> AnyStr: ...
+def rstrip(s: AnyStr, chars: AnyStr = ...) -> AnyStr: ...
+def strip(s: AnyStr, chars: AnyStr = ...) -> AnyStr: ...
+def swapcase(s: AnyStr) -> AnyStr: ...
+def translate(s: str, table: str, deletechars: str = ...) -> str: ...
+def upper(s: AnyStr) -> AnyStr: ...
+def ljust(s: AnyStr, width: int, fillhar: AnyStr = ...) -> AnyStr: ...
+def rjust(s: AnyStr, width: int, fillhar: AnyStr = ...) -> AnyStr: ...
+def center(s: AnyStr, width: int, fillhar: AnyStr = ...) -> AnyStr: ...
+def zfill(s: AnyStr, width: int) -> AnyStr: ...
+def replace(s: AnyStr, old: AnyStr, new: AnyStr, maxreplace: int = ...) -> AnyStr: ...
+
+class Template(object):
+ # TODO: Unicode support?
+ template = ... # type: str
+
+ def __init__(self, template: str) -> None: ...
+ def substitute(self, mapping: Mapping[str, str] = ..., **kwds: str) -> str: ...
+ def safe_substitute(self, mapping: Mapping[str, str] = ...,
+ **kwds: str) -> str: ...
+
+# TODO(MichalPokorny): This is probably badly and/or loosely typed.
+class Formatter(object):
+ def format(self, format_string: str, *args, **kwargs) -> str: ...
+ def vformat(self, format_string: str, args: Sequence[Any],
+ kwargs: Mapping[str, Any]) -> str: ...
+ def parse(self, format_string: str) -> Iterable[Tuple[str, str, str, str]]: ...
+ def get_field(self, field_name: str, args: Sequence[Any],
+ kwargs: Mapping[str, Any]) -> Any: ...
+ def get_value(self, key: Union[int, str], args: Sequence[Any],
+ kwargs: Mapping[str, Any]) -> Any:
+ raise IndexError()
+ raise KeyError()
+ def check_unused_args(self, used_args: Sequence[Union[int, str]], args: Sequence[Any],
+ kwargs: Mapping[str, Any]) -> None: ...
+ def format_field(self, value: Any, format_spec: str) -> Any: ...
+ def convert_field(self, value: Any, conversion: str) -> Any: ...
diff --git a/typeshed/stdlib/2/strop.pyi b/typeshed/stdlib/2/strop.pyi
new file mode 100644
index 0000000..736c716
--- /dev/null
+++ b/typeshed/stdlib/2/strop.pyi
@@ -0,0 +1,72 @@
+"""Stub file for the 'strop' module."""
+
+from typing import List, Sequence
+
+lowercase = ... # type: str
+uppercase = ... # type: str
+whitespace = ... # type: str
+
+def atof(a: str) -> float:
+ raise DeprecationWarning()
+
+def atoi(a: str, base: int = ...) -> int:
+ raise DeprecationWarning()
+
+def atol(a: str, base: int = ...) -> long:
+ raise DeprecationWarning()
+
+def capitalize(s: str) -> str:
+ raise DeprecationWarning()
+
+def count(s: str, sub: str, start: int = ..., end: int = ...) -> int:
+ raise DeprecationWarning()
+
+def expandtabs(string: str, tabsize: int = ...) -> str:
+ raise DeprecationWarning()
+ raise OverflowError()
+
+def find(s: str, sub: str, start: int = ..., end: int = ...) -> int:
+ raise DeprecationWarning()
+
+def join(list: Sequence[str], sep: str = ...) -> str:
+ raise DeprecationWarning()
+ raise OverflowError()
+
+def joinfields(list: Sequence[str], sep: str = ...) -> str:
+ raise DeprecationWarning()
+ raise OverflowError()
+
+def lower(s: str) -> str:
+ raise DeprecationWarning()
+
+def lstrip(s: str) -> str:
+ raise DeprecationWarning()
+
+def maketrans(frm: str, to: str) -> str: ...
+
+def replace(s: str, old: str, new: str, maxsplit: int = ...) -> str:
+ raise DeprecationWarning()
+
+def rfind(s: str, sub: str, start: int = ..., end: int = ...) -> int:
+ raise DeprecationWarning()
+
+def rstrip(s: str) -> str:
+ raise DeprecationWarning()
+
+def split(s: str, sep: str, maxsplit: int = ...) -> List[str]:
+ raise DeprecationWarning()
+
+def splitfields(s: str, sep: str, maxsplit: int = ...) -> List[str]:
+ raise DeprecationWarning()
+
+def strip(s: str) -> str:
+ raise DeprecationWarning()
+
+def swapcase(s: str) -> str:
+ raise DeprecationWarning()
+
+def translate(s: str, table: str, deletechars: str = ...) -> str:
+ raise DeprecationWarning()
+
+def upper(s: str) -> str:
+ raise DeprecationWarning()
diff --git a/typeshed/stdlib/2/struct.pyi b/typeshed/stdlib/2/struct.pyi
new file mode 100644
index 0000000..213b618
--- /dev/null
+++ b/typeshed/stdlib/2/struct.pyi
@@ -0,0 +1,28 @@
+# Stubs for struct for Python 2.7
+# Based on https://docs.python.org/2/library/struct.html
+
+from typing import Any, Tuple
+
+class error(Exception): ...
+
+def pack(fmt: str, *v: Any) -> str: ...
+# TODO buffer type
+def pack_into(fmt: str, buffer: Any, offset: int, *v: Any) -> None: ...
+
+# TODO buffer type
+def unpack(fmt: str, buffer: Any) -> Tuple[Any, ...]: ...
+def unpack_from(fmt: str, buffer: Any, offset: int = ...) -> Tuple[Any, ...]: ...
+
+def calcsize(fmt: str) -> int: ...
+
+class Struct:
+ format = ... # type: str
+ size = ... # type: int
+
+ def __init__(self, format: str) -> None: ...
+
+ def pack(self, *v: Any) -> str: ...
+ # TODO buffer type
+ def pack_into(self, buffer: Any, offset: int, *v: Any) -> None: ...
+ def unpack(self, buffer: Any) -> Tuple[Any, ...]: ...
+ def unpack_from(self, buffer: Any, offset: int = ...) -> Tuple[Any, ...]: ...
diff --git a/typeshed/stdlib/2/subprocess.pyi b/typeshed/stdlib/2/subprocess.pyi
new file mode 100644
index 0000000..288e82b
--- /dev/null
+++ b/typeshed/stdlib/2/subprocess.pyi
@@ -0,0 +1,109 @@
+# Stubs for subprocess
+
+# Based on http://docs.python.org/2/library/subprocess.html and Python 3 stub
+
+from typing import Sequence, Any, AnyStr, Mapping, Callable, Tuple, IO, Union, Optional
+
+_FILE = Union[int, IO[Any]]
+
+# Same args as Popen.__init__
+def call(args: Union[str, Sequence[str]],
+ bufsize: int = ...,
+ executable: str = ...,
+ stdin: _FILE = ...,
+ stdout: _FILE = ...,
+ stderr: _FILE = ...,
+ preexec_fn: Callable[[], Any] = ...,
+ close_fds: bool = ...,
+ shell: bool = ...,
+ cwd: str = ...,
+ env: Mapping[str, str] = ...,
+ universal_newlines: bool = ...,
+ startupinfo: Any = ...,
+ creationflags: int = ...) -> int: ...
+
+def check_call(args: Union[str, Sequence[str]],
+ bufsize: int = ...,
+ executable: str = ...,
+ stdin: _FILE = ...,
+ stdout: _FILE = ...,
+ stderr: _FILE = ...,
+ preexec_fn: Callable[[], Any] = ...,
+ close_fds: bool = ...,
+ shell: bool = ...,
+ cwd: str = ...,
+ env: Mapping[str, str] = ...,
+ universal_newlines: bool = ...,
+ startupinfo: Any = ...,
+ creationflags: int = ...) -> int: ...
+
+# Same args as Popen.__init__ except for stdout
+def check_output(args: Union[str, Sequence[str]],
+ bufsize: int = ...,
+ executable: str = ...,
+ stdin: _FILE = ...,
+ stderr: _FILE = ...,
+ preexec_fn: Callable[[], Any] = ...,
+ close_fds: bool = ...,
+ shell: bool = ...,
+ cwd: str = ...,
+ env: Mapping[str, str] = ...,
+ universal_newlines: bool = ...,
+ startupinfo: Any = ...,
+ creationflags: int = ...) -> str: ...
+
+PIPE = ... # type: int
+STDOUT = ... # type: int
+
+class CalledProcessError(Exception):
+ returncode = 0
+ cmd = ... # type: str
+ output = ... # type: str # May be None
+
+ def __init__(self, returncode: int, cmd: str, output: Optional[str] = ...) -> None: ...
+
+class Popen:
+ stdin = ... # type: Optional[IO[Any]]
+ stdout = ... # type: Optional[IO[Any]]
+ stderr = ... # type: Optional[IO[Any]]
+ pid = 0
+ returncode = 0
+
+ def __init__(self,
+ args: Union[str, Sequence[str]],
+ bufsize: int = ...,
+ executable: Optional[str] = ...,
+ stdin: Optional[_FILE] = ...,
+ stdout: Optional[_FILE] = ...,
+ stderr: Optional[_FILE] = ...,
+ preexec_fn: Optional[Callable[[], Any]] = ...,
+ close_fds: bool = ...,
+ shell: bool = ...,
+ cwd: Optional[str] = ...,
+ env: Optional[Mapping[str, str]] = ...,
+ universal_newlines: bool = ...,
+ startupinfo: Optional[Any] = ...,
+ creationflags: int = ...) -> None: ...
+
+ def poll(self) -> int: ...
+ def wait(self) -> int: ...
+ def communicate(self, input: Optional[AnyStr] = ...) -> Tuple[Optional[bytes], Optional[bytes]]: ...
+ def send_signal(self, signal: int) -> None: ...
+ def terminate(self) -> None: ...
+ def kill(self) -> None: ...
+ def __enter__(self) -> 'Popen': ...
+ def __exit__(self, type, value, traceback) -> bool: ...
+
+def getstatusoutput(cmd: str) -> Tuple[int, str]: ...
+def getoutput(cmd: str) -> str: ...
+
+# Windows-only: STARTUPINFO etc.
+
+STD_INPUT_HANDLE = ... # type: Any
+STD_OUTPUT_HANDLE = ... # type: Any
+STD_ERROR_HANDLE = ... # type: Any
+SW_HIDE = ... # type: Any
+STARTF_USESTDHANDLES = ... # type: Any
+STARTF_USESHOWWINDOW = ... # type: Any
+CREATE_NEW_CONSOLE = ... # type: Any
+CREATE_NEW_PROCESS_GROUP = ... # type: Any
diff --git a/typeshed/stdlib/2/sys.pyi b/typeshed/stdlib/2/sys.pyi
new file mode 100644
index 0000000..cb9172a
--- /dev/null
+++ b/typeshed/stdlib/2/sys.pyi
@@ -0,0 +1,137 @@
+"""Stubs for the 'sys' module."""
+
+from typing import (
+ IO, Union, List, Sequence, Any, Dict, Tuple, BinaryIO, Optional, Callable,
+ overload, Type,
+)
+from types import FrameType, ModuleType, TracebackType, ClassType
+from mypy_extensions import NoReturn
+
+class _flags:
+ bytes_warning = ... # type: int
+ debug = ... # type: int
+ division_new = ... # type: int
+ division_warning = ... # type: int
+ dont_write_bytecode = ... # type: int
+ hash_randomization = ... # type: int
+ ignore_environment = ... # type: int
+ inspect = ... # type: int
+ interactive = ... # type: int
+ no_site = ... # type: int
+ no_user_site = ... # type: int
+ optimize = ... # type: int
+ py3k_warning = ... # type: int
+ tabcheck = ... # type: int
+ unicode = ... # type: int
+ verbose = ... # type: int
+
+class _float_info:
+ max = ... # type: float
+ max_exp = ... # type: int
+ max_10_exp = ... # type: int
+ min = ... # type: float
+ min_exp = ... # type: int
+ min_10_exp = ... # type: int
+ dig = ... # type: int
+ mant_dig = ... # type: int
+ epsilon = ... # type: float
+ radix = ... # type: int
+ rounds = ... # type: int
+
+class _version_info(Tuple[int, int, int, str, int]):
+ major = 0
+ minor = 0
+ micro = 0
+ releaselevel = ... # type: str
+ serial = 0
+
+_mercurial = ... # type: Tuple[str, str, str]
+api_version = ... # type: int
+argv = ... # type: List[str]
+builtin_module_names = ... # type: Tuple[str, ...]
+byteorder = ... # type: str
+copyright = ... # type: str
+dont_write_bytecode = ... # type: bool
+exec_prefix = ... # type: str
+executable = ... # type: str
+flags = ... # type: _flags
+float_repr_style = ... # type: str
+hexversion = ... # type: int
+long_info = ... # type: object
+maxint = ... # type: int
+maxsize = ... # type: int
+maxunicode = ... # type: int
+modules = ... # type: Dict[str, ModuleType]
+path = ... # type: List[str]
+platform = ... # type: str
+prefix = ... # type: str
+py3kwarning = ... # type: bool
+__stderr__ = ... # type: IO[str]
+__stdin__ = ... # type: IO[str]
+__stdout__ = ... # type: IO[str]
+stderr = ... # type: IO[str]
+stdin = ... # type: IO[str]
+stdout = ... # type: IO[str]
+subversion = ... # type: Tuple[str, str, str]
+version = ... # type: str
+warnoptions = ... # type: object
+float_info = ... # type: _float_info
+version_info = ... # type: _version_info
+ps1 = ... # type: str
+ps2 = ... # type: str
+last_type = ... # type: type
+last_value = ... # type: BaseException
+last_traceback = ... # type: TracebackType
+# TODO precise types
+meta_path = ... # type: List[Any]
+path_hooks = ... # type: List[Any]
+path_importer_cache = ... # type: Dict[str, Any]
+displayhook = ... # type: Optional[Callable[[int], None]]
+excepthook = ... # type: Optional[Callable[[type, BaseException, TracebackType], None]]
+exc_type = ... # type: Optional[type]
+exc_value = ... # type: Union[BaseException, ClassType]
+exc_traceback = ... # type: TracebackType
+
+class _WindowsVersionType:
+ major = ... # type: Any
+ minor = ... # type: Any
+ build = ... # type: Any
+ platform = ... # type: Any
+ service_pack = ... # type: Any
+ service_pack_major = ... # type: Any
+ service_pack_minor = ... # type: Any
+ suite_mask = ... # type: Any
+ product_type = ... # type: Any
+
+def getwindowsversion() -> _WindowsVersionType: ...
+
+def _clear_type_cache() -> None: ...
+def _current_frames() -> Dict[int, FrameType]: ...
+def _getframe(depth: int = ...) -> FrameType: ...
+def call_tracing(fn: Any, args: Any) -> Any: ...
+def __displayhook__(value: int) -> None: ...
+def __excepthook__(type_: type, value: BaseException, traceback: TracebackType) -> None: ...
+def exc_clear() -> None:
+ raise DeprecationWarning()
+# TODO should be a union of tuple, see mypy#1178
+def exc_info() -> Tuple[Optional[Type[BaseException]],
+ Optional[BaseException],
+ Optional[TracebackType]]: ...
+
+# sys.exit() accepts an optional argument of anything printable
+def exit(arg: Any = ...) -> NoReturn:
+ raise SystemExit()
+def getcheckinterval() -> int: ... # deprecated
+def getdefaultencoding() -> str: ...
+def getdlopenflags() -> int: ...
+def getfilesystemencoding() -> Union[str, None]: ...
+def getrefcount(arg: Any) -> int: ...
+def getrecursionlimit() -> int: ...
+def getsizeof(obj: object, default: int = ...) -> int: ...
+def getprofile() -> None: ...
+def gettrace() -> None: ...
+def setcheckinterval(interval: int) -> None: ... # deprecated
+def setdlopenflags(n: int) -> None: ...
+def setprofile(profilefunc: Any) -> None: ... # TODO type
+def setrecursionlimit(limit: int) -> None: ...
+def settrace(tracefunc: Any) -> None: ... # TODO type
diff --git a/typeshed/stdlib/2/syslog.pyi b/typeshed/stdlib/2/syslog.pyi
new file mode 100644
index 0000000..82e0b9a
--- /dev/null
+++ b/typeshed/stdlib/2/syslog.pyi
@@ -0,0 +1,38 @@
+LOG_ALERT = ... # type: int
+LOG_AUTH = ... # type: int
+LOG_CONS = ... # type: int
+LOG_CRIT = ... # type: int
+LOG_CRON = ... # type: int
+LOG_DAEMON = ... # type: int
+LOG_DEBUG = ... # type: int
+LOG_EMERG = ... # type: int
+LOG_ERR = ... # type: int
+LOG_INFO = ... # type: int
+LOG_KERN = ... # type: int
+LOG_LOCAL0 = ... # type: int
+LOG_LOCAL1 = ... # type: int
+LOG_LOCAL2 = ... # type: int
+LOG_LOCAL3 = ... # type: int
+LOG_LOCAL4 = ... # type: int
+LOG_LOCAL5 = ... # type: int
+LOG_LOCAL6 = ... # type: int
+LOG_LOCAL7 = ... # type: int
+LOG_LPR = ... # type: int
+LOG_MAIL = ... # type: int
+LOG_NDELAY = ... # type: int
+LOG_NEWS = ... # type: int
+LOG_NOTICE = ... # type: int
+LOG_NOWAIT = ... # type: int
+LOG_PERROR = ... # type: int
+LOG_PID = ... # type: int
+LOG_SYSLOG = ... # type: int
+LOG_USER = ... # type: int
+LOG_UUCP = ... # type: int
+LOG_WARNING = ... # type: int
+
+def LOG_MASK(a: int) -> int: ...
+def LOG_UPTO(a: int) -> int: ...
+def closelog() -> None: ...
+def openlog(ident: str = ..., logoption: int = ..., facility: int = ...) -> None: ...
+def setlogmask(x: int) -> int: ...
+def syslog(priority: int, message: str) -> None: ...
diff --git a/typeshed/stdlib/2/tempfile.pyi b/typeshed/stdlib/2/tempfile.pyi
new file mode 100644
index 0000000..d718bd7
--- /dev/null
+++ b/typeshed/stdlib/2/tempfile.pyi
@@ -0,0 +1,104 @@
+# Stubs for tempfile
+# Ron Murawski <ron at horizonchess.com>
+
+# based on http: //docs.python.org/3.3/library/tempfile.html
+# Adapted for Python 2.7 by Michal Pokorny
+
+# TODO: Don't use basestring. Use Union[str, bytes] or AnyStr for arguments.
+# Avoid using Union[str, bytes] for return values, as it implies that
+# an isinstance() check will often be required, which is inconvenient.
+
+from typing import Tuple, IO, Union, AnyStr, Any, overload, Iterator, List, Type, Optional
+
+import thread
+import random
+
+TMP_MAX = ... # type: int
+tempdir = ... # type: str
+template = ... # type: str
+_name_sequence = ... # type: Optional[_RandomNameSequence]
+
+class _RandomNameSequence:
+ _rng = ... # type: random.Random
+ _rng_pid = ... # type: int
+ characters = ... # type: str
+ mutex = ... # type: thread.LockType
+ rng = ... # type: random.Random
+ def __iter__(self) -> "_RandomNameSequence": ...
+ def next(self) -> str: ...
+ # from os.path:
+ def normcase(self, path: AnyStr) -> AnyStr: ...
+
+class _TemporaryFileWrapper(IO[str]):
+ close_called = ... # type: bool
+ delete = ... # type: bool
+ file = ... # type: IO
+ name = ... # type: Any
+ def __init__(self, file: IO, name, delete: bool = ...) -> None: ...
+ def __del__(self) -> None: ...
+ def __enter__(self) -> "_TemporaryFileWrapper": ...
+ def __exit__(self, exc, value, tb) -> bool: ...
+ def __getattr__(self, name: unicode) -> Any: ...
+ def close(self) -> None: ...
+ def unlink(self, path: unicode) -> None: ...
+
+# TODO text files
+
+def TemporaryFile(
+ mode: Union[bytes, unicode] = ...,
+ bufsize: int = ...,
+ suffix: Union[bytes, unicode] = ...,
+ prefix: Union[bytes, unicode] = ...,
+ dir: Union[bytes, unicode] = ...
+) -> _TemporaryFileWrapper:
+ ...
+
+def NamedTemporaryFile(
+ mode: Union[bytes, unicode] = ...,
+ bufsize: int = ...,
+ suffix: Union[bytes, unicode] = ...,
+ prefix: Union[bytes, unicode] = ...,
+ dir: Union[bytes, unicode] = ...,
+ delete: bool = ...
+) -> _TemporaryFileWrapper:
+ ...
+
+def SpooledTemporaryFile(
+ max_size: int = ...,
+ mode: Union[bytes, unicode] = ...,
+ buffering: int = ...,
+ suffix: Union[bytes, unicode] = ...,
+ prefix: Union[bytes, unicode] = ...,
+ dir: Union[bytes, unicode] = ...
+) -> _TemporaryFileWrapper:
+ ...
+
+class TemporaryDirectory:
+ name = ... # type: Any # Can be str or unicode
+ def __init__(self,
+ suffix: Union[bytes, unicode] = ...,
+ prefix: Union[bytes, unicode] = ...,
+ dir: Union[bytes, unicode] = ...) -> None: ...
+ def cleanup(self) -> None: ...
+ def __enter__(self) -> Any: ... # Can be str or unicode
+ def __exit__(self, type, value, traceback) -> bool: ...
+
+ at overload
+def mkstemp() -> Tuple[int, str]: ...
+ at overload
+def mkstemp(suffix: AnyStr = ..., prefix: AnyStr = ..., dir: AnyStr = ...,
+ text: bool = ...) -> Tuple[int, AnyStr]: ...
+ at overload
+def mkdtemp() -> str: ...
+ at overload
+def mkdtemp(suffix: AnyStr = ..., prefix: AnyStr = ..., dir: AnyStr = ...) -> AnyStr: ...
+ at overload
+def mktemp() -> str: ...
+ at overload
+def mktemp(suffix: AnyStr = ..., prefix: AnyStr = ..., dir: AnyStr = ...) -> AnyStr: ...
+def gettempdir() -> str: ...
+def gettempprefix() -> str: ...
+
+def _candidate_tempdir_list() -> List[str]: ...
+def _get_candidate_names() -> Optional[_RandomNameSequence]: ...
+def _get_default_tempdir() -> str: ...
diff --git a/typeshed/stdlib/2/textwrap.pyi b/typeshed/stdlib/2/textwrap.pyi
new file mode 100644
index 0000000..7d1a6d3
--- /dev/null
+++ b/typeshed/stdlib/2/textwrap.pyi
@@ -0,0 +1,33 @@
+# Stubs for textwrap (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class _unicode: ...
+
+class TextWrapper:
+ whitespace_trans = ... # type: Any
+ unicode_whitespace_trans = ... # type: Any
+ uspace = ... # type: Any
+ wordsep_re = ... # type: Any
+ wordsep_simple_re = ... # type: Any
+ sentence_end_re = ... # type: Any
+ width = ... # type: Any
+ initial_indent = ... # type: Any
+ subsequent_indent = ... # type: Any
+ expand_tabs = ... # type: Any
+ replace_whitespace = ... # type: Any
+ fix_sentence_endings = ... # type: Any
+ break_long_words = ... # type: Any
+ drop_whitespace = ... # type: Any
+ break_on_hyphens = ... # type: Any
+ wordsep_re_uni = ... # type: Any
+ wordsep_simple_re_uni = ... # type: Any
+ def __init__(self, width=..., initial_indent=..., subsequent_indent=..., expand_tabs=..., replace_whitespace=..., fix_sentence_endings=..., break_long_words=..., drop_whitespace=..., break_on_hyphens=...) -> None: ...
+ def wrap(self, text): ...
+ def fill(self, text): ...
+
+def wrap(text, width=..., **kwargs): ...
+def fill(text, width=..., **kwargs): ...
+def dedent(text): ...
diff --git a/typeshed/stdlib/2/thread.pyi b/typeshed/stdlib/2/thread.pyi
new file mode 100644
index 0000000..a54a946
--- /dev/null
+++ b/typeshed/stdlib/2/thread.pyi
@@ -0,0 +1,33 @@
+"""Stubs for the "thread" module."""
+from typing import Callable, Any
+
+def _count() -> int: ...
+
+class error(Exception): ...
+
+class LockType:
+ def acquire(self, waitflag: int = ...) -> bool: ...
+ def acquire_lock(self, waitflag: int = ...) -> bool: ...
+ def release(self) -> None: ...
+ def release_lock(self) -> None: ...
+ def locked(self) -> bool: ...
+ def locked_lock(self) -> bool: ...
+ def __enter__(self) -> LockType: ...
+ def __exit__(self, value: Any, traceback: Any) -> None: ...
+
+class _local(object):
+ pass
+
+class _localdummy(object):
+ pass
+
+def start_new(function: Callable[..., Any], args: Any, kwargs: Any = ...) -> int: ...
+def start_new_thread(function: Callable[..., Any], args: Any, kwargs: Any = ...) -> int: ...
+def interrupt_main() -> None: ...
+def exit() -> None:
+ raise SystemExit()
+def exit_thread() -> Any:
+ raise SystemExit()
+def allocate_lock() -> LockType: ...
+def get_ident() -> int: ...
+def stack_size(size: int = ...) -> int: ...
diff --git a/typeshed/stdlib/2/time.pyi b/typeshed/stdlib/2/time.pyi
new file mode 100644
index 0000000..6bea209
--- /dev/null
+++ b/typeshed/stdlib/2/time.pyi
@@ -0,0 +1,51 @@
+"""Stub file for the 'time' module."""
+# See https://docs.python.org/2/library/time.html
+
+from typing import NamedTuple, Tuple, Union, Any, Optional
+
+# ----- variables and constants -----
+accept2dyear = False
+altzone = 0
+daylight = 0
+timezone = 0
+tzname = ... # type: Tuple[str, str]
+
+class struct_time(NamedTuple('_struct_time',
+ [('tm_year', int), ('tm_mon', int), ('tm_mday', int),
+ ('tm_hour', int), ('tm_min', int), ('tm_sec', int),
+ ('tm_wday', int), ('tm_yday', int), ('tm_isdst', int)])):
+ def __init__(self, o: Tuple[int, int, int,
+ int, int, int,
+ int, int, int], _arg: Any = ...) -> None: ...
+
+_TIME_TUPLE = Tuple[int, int, int, int, int, int, int, int, int]
+
+def asctime(t: struct_time = ...) -> str:
+ raise ValueError()
+
+def clock() -> float: ...
+
+def ctime(secs: Optional[float] = ...) -> str:
+ raise ValueError()
+
+def gmtime(secs: Optional[float] = ...) -> struct_time: ...
+
+def localtime(secs: Optional[float] = ...) -> struct_time: ...
+
+def mktime(t: struct_time) -> float:
+ raise OverflowError()
+ raise ValueError()
+
+def sleep(secs: float) -> None: ...
+
+def strftime(format: str, t: struct_time = ...) -> str:
+ raise MemoryError()
+ raise ValueError()
+
+def strptime(string: str, format: str = ...) -> struct_time:
+ raise ValueError()
+
+def time() -> float:
+ raise IOError()
+
+def tzset() -> None: ...
diff --git a/typeshed/stdlib/2/token.pyi b/typeshed/stdlib/2/token.pyi
new file mode 100644
index 0000000..1c14dc4
--- /dev/null
+++ b/typeshed/stdlib/2/token.pyi
@@ -0,0 +1,62 @@
+from typing import Dict
+
+ENDMARKER = 0
+NAME = 0
+NUMBER = 0
+STRING = 0
+NEWLINE = 0
+INDENT = 0
+DEDENT = 0
+LPAR = 0
+RPAR = 0
+LSQB = 0
+RSQB = 0
+COLON = 0
+COMMA = 0
+SEMI = 0
+PLUS = 0
+MINUS = 0
+STAR = 0
+SLASH = 0
+VBAR = 0
+AMPER = 0
+LESS = 0
+GREATER = 0
+EQUAL = 0
+DOT = 0
+PERCENT = 0
+BACKQUOTE = 0
+LBRACE = 0
+RBRACE = 0
+EQEQUAL = 0
+NOTEQUAL = 0
+LESSEQUAL = 0
+GREATEREQUAL = 0
+TILDE = 0
+CIRCUMFLEX = 0
+LEFTSHIFT = 0
+RIGHTSHIFT = 0
+DOUBLESTAR = 0
+PLUSEQUAL = 0
+MINEQUAL = 0
+STAREQUAL = 0
+SLASHEQUAL = 0
+PERCENTEQUAL = 0
+AMPEREQUAL = 0
+VBAREQUAL = 0
+CIRCUMFLEXEQUAL = 0
+LEFTSHIFTEQUAL = 0
+RIGHTSHIFTEQUAL = 0
+DOUBLESTAREQUAL = 0
+DOUBLESLASH = 0
+DOUBLESLASHEQUAL = 0
+AT = 0
+OP = 0
+ERRORTOKEN = 0
+N_TOKENS = 0
+NT_OFFSET = 0
+tok_name = ... # type: Dict[int, str]
+
+def ISTERMINAL(x) -> bool: ...
+def ISNONTERMINAL(x) -> bool: ...
+def ISEOF(x) -> bool: ...
diff --git a/typeshed/stdlib/2/tokenize.pyi b/typeshed/stdlib/2/tokenize.pyi
new file mode 100644
index 0000000..159adf9
--- /dev/null
+++ b/typeshed/stdlib/2/tokenize.pyi
@@ -0,0 +1,143 @@
+# Automatically generated by pytype, manually fixed up. May still contain errors.
+
+from typing import Any, Callable, Dict, Generator, Iterator, List, Tuple, Union, Iterable
+
+__all__ = ... # type: List[str]
+__author__ = ... # type: str
+__credits__ = ... # type: str
+
+AMPER = ... # type: int
+AMPEREQUAL = ... # type: int
+AT = ... # type: int
+BACKQUOTE = ... # type: int
+Binnumber = ... # type: str
+Bracket = ... # type: str
+CIRCUMFLEX = ... # type: int
+CIRCUMFLEXEQUAL = ... # type: int
+COLON = ... # type: int
+COMMA = ... # type: int
+COMMENT = ... # type: int
+Comment = ... # type: str
+ContStr = ... # type: str
+DEDENT = ... # type: int
+DOT = ... # type: int
+DOUBLESLASH = ... # type: int
+DOUBLESLASHEQUAL = ... # type: int
+DOUBLESTAR = ... # type: int
+DOUBLESTAREQUAL = ... # type: int
+Decnumber = ... # type: str
+Double = ... # type: str
+Double3 = ... # type: str
+ENDMARKER = ... # type: int
+EQEQUAL = ... # type: int
+EQUAL = ... # type: int
+ERRORTOKEN = ... # type: int
+Expfloat = ... # type: str
+Exponent = ... # type: str
+Floatnumber = ... # type: str
+Funny = ... # type: str
+GREATER = ... # type: int
+GREATEREQUAL = ... # type: int
+Hexnumber = ... # type: str
+INDENT = ... # type: int
+
+def ISEOF(x: int) -> bool: ...
+def ISNONTERMINAL(x: int) -> bool: ...
+def ISTERMINAL(x: int) -> bool: ...
+
+Ignore = ... # type: str
+Imagnumber = ... # type: str
+Intnumber = ... # type: str
+LBRACE = ... # type: int
+LEFTSHIFT = ... # type: int
+LEFTSHIFTEQUAL = ... # type: int
+LESS = ... # type: int
+LESSEQUAL = ... # type: int
+LPAR = ... # type: int
+LSQB = ... # type: int
+MINEQUAL = ... # type: int
+MINUS = ... # type: int
+NAME = ... # type: int
+NEWLINE = ... # type: int
+NL = ... # type: int
+NOTEQUAL = ... # type: int
+NT_OFFSET = ... # type: int
+NUMBER = ... # type: int
+N_TOKENS = ... # type: int
+Name = ... # type: str
+Number = ... # type: str
+OP = ... # type: int
+Octnumber = ... # type: str
+Operator = ... # type: str
+PERCENT = ... # type: int
+PERCENTEQUAL = ... # type: int
+PLUS = ... # type: int
+PLUSEQUAL = ... # type: int
+PlainToken = ... # type: str
+Pointfloat = ... # type: str
+PseudoExtras = ... # type: str
+PseudoToken = ... # type: str
+RBRACE = ... # type: int
+RIGHTSHIFT = ... # type: int
+RIGHTSHIFTEQUAL = ... # type: int
+RPAR = ... # type: int
+RSQB = ... # type: int
+SEMI = ... # type: int
+SLASH = ... # type: int
+SLASHEQUAL = ... # type: int
+STAR = ... # type: int
+STAREQUAL = ... # type: int
+STRING = ... # type: int
+Single = ... # type: str
+Single3 = ... # type: str
+Special = ... # type: str
+String = ... # type: str
+TILDE = ... # type: int
+Token = ... # type: str
+Triple = ... # type: str
+VBAR = ... # type: int
+VBAREQUAL = ... # type: int
+Whitespace = ... # type: str
+chain = ... # type: type
+double3prog = ... # type: type
+endprogs = ... # type: Dict[str, Any]
+pseudoprog = ... # type: type
+re = ... # type: module
+single3prog = ... # type: type
+single_quoted = ... # type: Dict[str, str]
+string = ... # type: module
+sys = ... # type: module
+t = ... # type: str
+tabsize = ... # type: int
+tok_name = ... # type: Dict[int, str]
+token = ... # type: module
+tokenprog = ... # type: type
+triple_quoted = ... # type: Dict[str, str]
+x = ... # type: str
+
+_Pos = Tuple[int, int]
+_TokenType = Tuple[int, str, _Pos, _Pos, str]
+
+def any(*args, **kwargs) -> str: ...
+def generate_tokens(readline: Callable[[], str]) -> Generator[_TokenType, None, None]: ...
+def group(*args: str) -> str: ...
+def maybe(*args: str) -> str: ...
+def printtoken(type: int, token: str, srow_scol: _Pos, erow_ecol: _Pos, line: str) -> None: ...
+def tokenize(readline: Callable[[], str], tokeneater: Callable[[Tuple[int, str, _Pos, _Pos, str]], None]) -> None: ...
+def tokenize_loop(readline: Callable[[], str], tokeneater: Callable[[Tuple[int, str, _Pos, _Pos, str]], None]) -> None: ...
+def untokenize(iterable: Iterable[_TokenType]) -> str: ...
+
+class StopTokenizing(Exception):
+ pass
+
+class TokenError(Exception):
+ pass
+
+class Untokenizer:
+ prev_col = ... # type: int
+ prev_row = ... # type: int
+ tokens = ... # type: List[str]
+ def __init__(self) -> None: ...
+ def add_whitespace(self, _Pos) -> None: ...
+ def compat(self, token: Tuple[int, Any], iterable: Iterator[_TokenType]) -> None: ...
+ def untokenize(self, iterable: Iterable[_TokenType]) -> str: ...
diff --git a/typeshed/stdlib/2/types.pyi b/typeshed/stdlib/2/types.pyi
new file mode 100644
index 0000000..2f3b935
--- /dev/null
+++ b/typeshed/stdlib/2/types.pyi
@@ -0,0 +1,161 @@
+# Stubs for types
+# Note, all classes "defined" here require special handling.
+
+from typing import (
+ Any, Callable, Dict, Iterable, Iterator, List, Optional,
+ Tuple, TypeVar, Union, overload,
+)
+
+_T = TypeVar('_T')
+
+class NoneType: ...
+TypeType = type
+ObjectType = object
+
+IntType = int
+LongType = long
+FloatType = float
+BooleanType = bool
+ComplexType = complex
+StringType = str
+UnicodeType = unicode
+StringTypes = (StringType, UnicodeType)
+BufferType = buffer
+TupleType = tuple
+ListType = list
+DictType = DictionaryType = dict
+
+class _Cell:
+ cell_contents = ... # type: Any
+
+class FunctionType:
+ func_closure = ... # type: Optional[Tuple[_Cell, ...]]
+ func_code = ... # type: CodeType
+ func_defaults = ... # type: Optional[Tuple[Any, ...]]
+ func_dict = ... # type: Dict[str, Any]
+ func_doc = ... # type: Optional[str]
+ func_globals = ... # type: Dict[str, Any]
+ func_name = ... # type: str
+ __closure__ = func_closure
+ __code__ = func_code
+ __defaults__ = func_defaults
+ __dict__ = func_dict
+ __globals__ = func_globals
+ __name__ = func_name
+ def __call__(self, *args: Any, **kwargs: Any) -> Any: ...
+ def __get__(self, obj: Optional[object], type: Optional[type]) -> 'UnboundMethodType': ...
+
+LambdaType = FunctionType
+
+class CodeType:
+ co_argcount = ... # type: int
+ co_cellvars = ... # type: Tuple[str, ...]
+ co_code = ... # type: str
+ co_consts = ... # type: Tuple[Any, ...]
+ co_filename = ... # type: Optional[str]
+ co_firstlineno = ... # type: int
+ co_flags = ... # type: int
+ co_freevars = ... # type: Tuple[str, ...]
+ co_lnotab = ... # type: str
+ co_name = ... # type: str
+ co_names = ... # type: Tuple[str, ...]
+ co_nlocals = ... # type: int
+ co_stacksize = ... # type: int
+ co_varnames = ... # type: Tuple[str, ...]
+
+class GeneratorType:
+ gi_code = ... # type: CodeType
+ gi_frame = ... # type: FrameType
+ gi_running = ... # type: int
+ def __iter__(self) -> 'GeneratorType': ...
+ def close(self) -> None: ...
+ def next(self) -> Any: ...
+ def send(self, arg: Any) -> Any: ...
+ @overload
+ def throw(self, val: BaseException) -> Any: ...
+ @overload
+ def throw(self, typ: type, val: BaseException = ..., tb: 'TracebackType' = ...) -> Any: ...
+
+class ClassType: ...
+class UnboundMethodType:
+ im_class = ... # type: type
+ im_func = ... # type: FunctionType
+ im_self = ... # type: Optional[object]
+ __func__ = im_func
+ __self__ = im_self
+ def __call__(self, *args: Any, **kwargs: Any) -> Any: ...
+class InstanceType: ...
+MethodType = UnboundMethodType
+
+class BuiltinFunctionType:
+ __self__ = ... # type: Optional[object]
+ def __call__(self, *args: Any, **kwargs: Any) -> Any: ...
+BuiltinMethodType = BuiltinFunctionType
+
+class ModuleType:
+ __doc__ = ... # type: Optional[str]
+ __file__ = ... # type: Optional[str]
+ __name__ = ... # type: str
+ __package__ = ... # type: Optional[str]
+ __path__ = ... # type: Optional[Iterable[str]]
+ def __init__(self, name: str, doc: str) -> None: ...
+FileType = file
+XRangeType = xrange
+
+class TracebackType:
+ tb_frame = ... # type: FrameType
+ tb_lasti = ... # type: int
+ tb_lineno = ... # type: int
+ tb_next = ... # type: TracebackType
+
+class FrameType:
+ f_back = ... # type: FrameType
+ f_builtins = ... # type: Dict[str, Any]
+ f_code = ... # type: CodeType
+ f_exc_type = ... # type: None
+ f_exc_value = ... # type: None
+ f_exc_traceback = ... # type: None
+ f_globals = ... # type: Dict[str, Any]
+ f_lasti = ... # type: int
+ f_lineno = ... # type: int
+ f_locals = ... # type: Dict[str, Any]
+ f_restricted = ... # type: bool
+ f_trace = ... # type: Callable[[], None]
+
+ def clear(self) -> None: pass
+
+SliceType = slice
+class EllipsisType: ...
+
+class DictProxyType:
+ # TODO is it possible to have non-string keys?
+ # no __init__
+ def copy(self) -> dict: ...
+ def get(self, key: str, default: _T = ...) -> Union[Any, _T]: ...
+ def has_key(self, key: str) -> bool: ...
+ def items(self) -> List[Tuple[str, Any]]: ...
+ def iteritems(self) -> Iterator[Tuple[str, Any]]: ...
+ def iterkeys(self) -> Iterator[str]: ...
+ def itervalues(self) -> Iterator[Any]: ...
+ def keys(self) -> List[str]: ...
+ def values(self) -> List[Any]: ...
+ def __contains__(self, key: str) -> bool: ...
+ def __getitem__(self, key: str) -> Any: ...
+ def __iter__(self) -> Iterator[str]: ...
+ def __len__(self) -> int: ...
+
+class NotImplementedType: ...
+
+class GetSetDescriptorType:
+ __name__ = ... # type: str
+ __objclass__ = ... # type: type
+ def __get__(self, obj: Any, type: type = ...) -> Any: ...
+ def __set__(self, obj: Any) -> None: ...
+ def __delete__(self, obj: Any) -> None: ...
+# Same type on Jython, different on CPython and PyPy, unknown on IronPython.
+class MemberDescriptorType:
+ __name__ = ... # type: str
+ __objclass__ = ... # type: type
+ def __get__(self, obj: Any, type: type = ...) -> Any: ...
+ def __set__(self, obj: Any) -> None: ...
+ def __delete__(self, obj: Any) -> None: ...
diff --git a/typeshed/stdlib/2/typing.pyi b/typeshed/stdlib/2/typing.pyi
new file mode 100644
index 0000000..035f36e
--- /dev/null
+++ b/typeshed/stdlib/2/typing.pyi
@@ -0,0 +1,360 @@
+# Stubs for typing (Python 2.7)
+
+from abc import abstractmethod, ABCMeta
+
+# Definitions of special type checking related constructs. Their definition
+# are not used, so their value does not matter.
+
+overload = object()
+Any = object()
+TypeVar = object()
+Generic = object()
+Tuple = object()
+Callable = object()
+Type = object()
+_promote = object()
+
+class GenericMeta(type): ...
+
+# Type aliases
+
+class TypeAlias:
+ # Class for defining generic aliases for library types.
+ def __init__(self, target_type: type) -> None: ...
+ def __getitem__(self, typeargs: Any) -> Any: ...
+
+Union = TypeAlias(object)
+Optional = TypeAlias(object)
+List = TypeAlias(object)
+Dict = TypeAlias(object)
+DefaultDict = TypeAlias(object)
+Set = TypeAlias(object)
+
+# Predefined type variables.
+AnyStr = TypeVar('AnyStr', str, unicode)
+
+# Abstract base classes.
+
+# These type variables are used by the container types.
+_T = TypeVar('_T')
+_S = TypeVar('_S')
+_KT = TypeVar('_KT') # Key type.
+_VT = TypeVar('_VT') # Value type.
+_T_co = TypeVar('_T_co', covariant=True) # Any type covariant containers.
+_V_co = TypeVar('_V_co', covariant=True) # Any type covariant containers.
+_KT_co = TypeVar('_KT_co', covariant=True) # Key type covariant containers.
+_VT_co = TypeVar('_VT_co', covariant=True) # Value type covariant containers.
+_T_contra = TypeVar('_T_contra', contravariant=True) # Ditto contravariant.
+
+class SupportsInt(metaclass=ABCMeta):
+ @abstractmethod
+ def __int__(self) -> int: ...
+
+class SupportsFloat(metaclass=ABCMeta):
+ @abstractmethod
+ def __float__(self) -> float: ...
+
+class SupportsAbs(Generic[_T]):
+ @abstractmethod
+ def __abs__(self) -> _T: ...
+
+class SupportsRound(Generic[_T]):
+ @abstractmethod
+ def __round__(self, ndigits: int = ...) -> _T: ...
+
+class Reversible(Generic[_T_co]):
+ @abstractmethod
+ def __reversed__(self) -> Iterator[_T_co]: ...
+
+class Sized(metaclass=ABCMeta):
+ @abstractmethod
+ def __len__(self) -> int: ...
+
+class Iterable(Generic[_T_co]):
+ @abstractmethod
+ def __iter__(self) -> Iterator[_T_co]: ...
+
+class Iterator(Iterable[_T_co], Generic[_T_co]):
+ @abstractmethod
+ def next(self) -> _T_co: ...
+
+class Generator(Iterator[_T_co], Generic[_T_co, _T_contra, _V_co]):
+ @abstractmethod
+ def next(self) -> _T_co: ...
+
+ @abstractmethod
+ def send(self, value: _T_contra) -> _T_co: ...
+
+ @abstractmethod
+ def throw(self, typ: BaseException, val: Any = None, tb: Any = None) -> None: ...
+
+ @abstractmethod
+ def close(self) -> None: ...
+
+class Container(Generic[_T_co]):
+ @abstractmethod
+ def __contains__(self, x: object) -> bool: ...
+
+class Sequence(Iterable[_T_co], Container[_T_co], Sized, Reversible[_T_co], Generic[_T_co]):
+ @overload
+ @abstractmethod
+ def __getitem__(self, i: int) -> _T_co: ...
+ @overload
+ @abstractmethod
+ def __getitem__(self, s: slice) -> Sequence[_T_co]: ...
+ # Mixin methods
+ def index(self, x: Any) -> int: ...
+ def count(self, x: Any) -> int: ...
+ def __contains__(self, x: object) -> bool: ...
+ def __iter__(self) -> Iterator[_T_co]: ...
+ def __reversed__(self) -> Iterator[_T_co]: ...
+
+class MutableSequence(Sequence[_T], Generic[_T]):
+ @abstractmethod
+ def insert(self, index: int, object: _T) -> None: ...
+ @overload
+ @abstractmethod
+ def __setitem__(self, i: int, o: _T) -> None: ...
+ @overload
+ @abstractmethod
+ def __setitem__(self, s: slice, o: Iterable[_T]) -> None: ...
+ @abstractmethod
+ def __delitem__(self, i: Union[int, slice]) -> None: ...
+ # Mixin methods
+ def append(self, object: _T) -> None: ...
+ def extend(self, iterable: Iterable[_T]) -> None: ...
+ def reverse(self) -> None: ...
+ def pop(self, index: int = ...) -> _T: ...
+ def remove(self, object: _T) -> None: ...
+ def __iadd__(self, x: Iterable[_T]) -> MutableSequence[_T]: ...
+
+class AbstractSet(Sized, Iterable[_T_co], Container[_T_co], Generic[_T_co]):
+ @abstractmethod
+ def __contains__(self, x: object) -> bool: ...
+ # Mixin methods
+ def __le__(self, s: AbstractSet[Any]) -> bool: ...
+ def __lt__(self, s: AbstractSet[Any]) -> bool: ...
+ def __gt__(self, s: AbstractSet[Any]) -> bool: ...
+ def __ge__(self, s: AbstractSet[Any]) -> bool: ...
+ def __and__(self, s: AbstractSet[Any]) -> AbstractSet[_T_co]: ...
+ def __or__(self, s: AbstractSet[_T]) -> AbstractSet[Union[_T_co, _T]]: ...
+ def __sub__(self, s: AbstractSet[Any]) -> AbstractSet[_T_co]: ...
+ def __xor__(self, s: AbstractSet[_T]) -> AbstractSet[Union[_T_co, _T]]: ...
+ # TODO: argument can be any container?
+ def isdisjoint(self, s: AbstractSet[Any]) -> bool: ...
+
+class FrozenSet(AbstractSet[_T_co], Generic[_T_co]): ...
+
+class MutableSet(AbstractSet[_T], Generic[_T]):
+ @abstractmethod
+ def add(self, x: _T) -> None: ...
+ @abstractmethod
+ def discard(self, x: _T) -> None: ...
+ # Mixin methods
+ def clear(self) -> None: ...
+ def pop(self) -> _T: ...
+ def remove(self, element: _T) -> None: ...
+ def __ior__(self, s: AbstractSet[_S]) -> MutableSet[Union[_T, _S]]: ...
+ def __iand__(self, s: AbstractSet[Any]) -> MutableSet[_T]: ...
+ def __ixor__(self, s: AbstractSet[_S]) -> MutableSet[Union[_T, _S]]: ...
+ def __isub__(self, s: AbstractSet[Any]) -> MutableSet[_T]: ...
+
+class MappingView(Sized):
+ def __len__(self) -> int: ...
+
+class ItemsView(AbstractSet[Tuple[_KT_co, _VT_co]], MappingView, Generic[_KT_co, _VT_co]):
+ def __contains__(self, o: object) -> bool: ...
+ def __iter__(self) -> Iterator[Tuple[_KT_co, _VT_co]]: ...
+
+class KeysView(AbstractSet[_KT_co], MappingView, Generic[_KT_co]):
+ def __contains__(self, o: object) -> bool: ...
+ def __iter__(self) -> Iterator[_KT_co]: ...
+
+class ValuesView(MappingView, Iterable[_VT_co], Generic[_VT_co]):
+ def __contains__(self, o: object) -> bool: ...
+ def __iter__(self) -> Iterator[_VT_co]: ...
+
+class Mapping(Sized, Iterable[_KT], Container[_KT], Generic[_KT, _VT_co]):
+ # TODO: We wish the key type could also be covariant, but that doesn't work,
+ # see discussion in https: //github.com/python/typing/pull/273.
+ @abstractmethod
+ def __getitem__(self, k: _KT) -> _VT_co:
+ ...
+ # Mixin methods
+ def get(self, k: _KT, default: _VT_co = ...) -> _VT_co: # type: ignore
+ ...
+ def keys(self) -> list[_KT]: ...
+ def values(self) -> list[_VT_co]: ...
+ def items(self) -> list[Tuple[_KT, _VT_co]]: ...
+ def iterkeys(self) -> Iterator[_KT]: ...
+ def itervalues(self) -> Iterator[_VT_co]: ...
+ def iteritems(self) -> Iterator[Tuple[_KT, _VT_co]]: ...
+ def __contains__(self, o: object) -> bool: ...
+
+class MutableMapping(Mapping[_KT, _VT], Generic[_KT, _VT]):
+ @abstractmethod
+ def __setitem__(self, k: _KT, v: _VT) -> None: ...
+ @abstractmethod
+ def __delitem__(self, v: _KT) -> None: ...
+
+ def clear(self) -> None: ...
+ def pop(self, k: _KT, default: _VT = ...) -> _VT: ...
+ def popitem(self) -> Tuple[_KT, _VT]: ...
+ def setdefault(self, k: _KT, default: _VT = ...) -> _VT: ...
+ @overload
+ def update(self, m: Mapping[_KT, _VT], **kwargs: _VT) -> None: ...
+ @overload
+ def update(self, m: Iterable[Tuple[_KT, _VT]], **kwargs: _VT) -> None: ...
+
+Text = unicode
+
+TYPE_CHECKING = True
+
+class IO(Iterator[AnyStr], Generic[AnyStr]):
+ # TODO detach
+ # TODO use abstract properties
+ @property
+ def mode(self) -> str: ...
+ @property
+ def name(self) -> str: ...
+ @abstractmethod
+ def close(self) -> None: ...
+ @property
+ def closed(self) -> bool: ...
+ @abstractmethod
+ def fileno(self) -> int: ...
+ @abstractmethod
+ def flush(self) -> None: ...
+ @abstractmethod
+ def isatty(self) -> bool: ...
+ # TODO what if n is None?
+ @abstractmethod
+ def read(self, n: int = ...) -> AnyStr: ...
+ @abstractmethod
+ def readable(self) -> bool: ...
+ @abstractmethod
+ def readline(self, limit: int = ...) -> AnyStr: ...
+ @abstractmethod
+ def readlines(self, hint: int = ...) -> list[AnyStr]: ...
+ @abstractmethod
+ def seek(self, offset: int, whence: int = ...) -> None: ...
+ @abstractmethod
+ def seekable(self) -> bool: ...
+ @abstractmethod
+ def tell(self) -> int: ...
+ @abstractmethod
+ def truncate(self, size: int = ...) -> Optional[int]: ...
+ @abstractmethod
+ def writable(self) -> bool: ...
+ # TODO buffer objects
+ @abstractmethod
+ def write(self, s: AnyStr) -> None: ...
+ @abstractmethod
+ def writelines(self, lines: Iterable[AnyStr]) -> None: ...
+
+ @abstractmethod
+ def next(self) -> AnyStr: ...
+ @abstractmethod
+ def __iter__(self) -> Iterator[AnyStr]: ...
+ @abstractmethod
+ def __enter__(self) -> 'IO[AnyStr]': ...
+ @abstractmethod
+ def __exit__(self, t: Optional[Type[BaseException]], value: Optional[BaseException],
+ # TODO: traceback should be TracebackType but that's defined in types
+ traceback: Optional[Any]) -> bool: ...
+
+class BinaryIO(IO[str]):
+ # TODO readinto
+ # TODO read1?
+ # TODO peek?
+ @abstractmethod
+ def __enter__(self) -> BinaryIO: ...
+
+class TextIO(IO[unicode]):
+ # TODO use abstractproperty
+ @property
+ def buffer(self) -> BinaryIO: ...
+ @property
+ def encoding(self) -> str: ...
+ @property
+ def errors(self) -> Optional[str]: ...
+ @property
+ def line_buffering(self) -> bool: ...
+ @property
+ def newlines(self) -> Any: ... # None, str or tuple
+ @abstractmethod
+ def __enter__(self) -> TextIO: ...
+
+class Match(Generic[AnyStr]):
+ pos = 0
+ endpos = 0
+ lastindex = 0
+ lastgroup = ... # type: AnyStr
+ string = ... # type: AnyStr
+
+ # The regular expression object whose match() or search() method produced
+ # this match instance.
+ re = ... # type: 'Pattern[AnyStr]'
+
+ def expand(self, template: AnyStr) -> AnyStr: ...
+
+ @overload
+ def group(self, group1: int = ...) -> AnyStr: ...
+ @overload
+ def group(self, group1: str) -> AnyStr: ...
+ @overload
+ def group(self, group1: int, group2: int,
+ *groups: int) -> Sequence[AnyStr]: ...
+ @overload
+ def group(self, group1: str, group2: str,
+ *groups: str) -> Sequence[AnyStr]: ...
+
+ def groups(self, default: AnyStr = ...) -> Sequence[AnyStr]: ...
+ def groupdict(self, default: AnyStr = ...) -> dict[str, AnyStr]: ...
+ def start(self, group: Union[int, str] = ...) -> int: ...
+ def end(self, group: Union[int, str] = ...) -> int: ...
+ def span(self, group: Union[int, str] = ...) -> Tuple[int, int]: ...
+
+class Pattern(Generic[AnyStr]):
+ flags = 0
+ groupindex = 0
+ groups = 0
+ pattern = ... # type: AnyStr
+
+ def search(self, string: AnyStr, pos: int = ...,
+ endpos: int = ...) -> Match[AnyStr]: ...
+ def match(self, string: AnyStr, pos: int = ...,
+ endpos: int = ...) -> Match[AnyStr]: ...
+ def split(self, string: AnyStr, maxsplit: int = ...) -> list[AnyStr]: ...
+ def findall(self, string: AnyStr, pos: int = ...,
+ endpos: int = ...) -> list[Any]: ...
+ def finditer(self, string: AnyStr, pos: int = ...,
+ endpos: int = ...) -> Iterator[Match[AnyStr]]: ...
+
+ @overload
+ def sub(self, repl: AnyStr, string: AnyStr,
+ count: int = ...) -> AnyStr: ...
+ @overload
+ def sub(self, repl: Callable[[Match[AnyStr]], AnyStr], string: AnyStr,
+ count: int = ...) -> AnyStr: ...
+
+ @overload
+ def subn(self, repl: AnyStr, string: AnyStr,
+ count: int = ...) -> Tuple[AnyStr, int]: ...
+ @overload
+ def subn(self, repl: Callable[[Match[AnyStr]], AnyStr], string: AnyStr,
+ count: int = ...) -> Tuple[AnyStr, int]: ...
+
+# Functions
+
+def get_type_hints(obj: Callable) -> dict[str, Any]: ...
+
+def cast(tp: Type[_T], obj: Any) -> _T: ...
+
+# Type constructors
+
+# NamedTuple is special-cased in the type checker; the initializer is ignored.
+def NamedTuple(typename: str, fields: Iterable[Tuple[str, Any]], *,
+ verbose: bool = ..., rename: bool = ...) -> Type[tuple]: ...
+
+def NewType(name: str, tp: Type[_T]) -> Type[_T]: ...
diff --git a/typeshed/stdlib/2/unicodedata.pyi b/typeshed/stdlib/2/unicodedata.pyi
new file mode 100644
index 0000000..1faf16a
--- /dev/null
+++ b/typeshed/stdlib/2/unicodedata.pyi
@@ -0,0 +1,40 @@
+"""Stubs for the 'unicodedata' module."""
+
+from typing import Any, TypeVar, Union
+
+ucd_3_2_0 = ... # type: UCD
+unidata_version = ... # type: str
+# PyCapsule
+ucnhash_CAPI = ... # type: Any
+
+_default = TypeVar("_default")
+
+def bidirectional(unichr: unicode) -> str: ...
+def category(unichr: unicode) -> str: ...
+def combining(unichr: unicode) -> int: ...
+def decimal(chr: unicode, default: _default = ...) -> Union[int, _default]: ...
+def decomposition(unichr: unicode) -> str: ...
+def digit(chr: unicode, default: _default = ...) -> Union[int, _default]: ...
+def east_asian_width(unichr: unicode) -> str: ...
+def lookup(name: str) -> unicode: ...
+def mirrored(unichr: unicode) -> int: ...
+def name(chr: unicode, default: _default = ...) -> Union[str, _default]: ...
+def normalize(form: str, unistr: unicode) -> unicode: ...
+def numeric(chr, default: _default = ...) -> Union[float, _default]: ...
+
+class UCD(object):
+ unidata_version = ... # type: str
+ # The methods below are constructed from the same array in C
+ # (unicodedata_functions) and hence identical to the methods above.
+ def bidirectional(self, unichr: unicode) -> str: ...
+ def category(self, unichr: unicode) -> str: ...
+ def combining(self, unichr: unicode) -> int: ...
+ def decimal(self, chr: unicode, default: _default = ...) -> Union[int, _default]: ...
+ def decomposition(self, unichr: unicode) -> str: ...
+ def digit(self, chr: unicode, default: _default = ...) -> Union[int, _default]: ...
+ def east_asian_width(self, unichr: unicode) -> str: ...
+ def lookup(self, name: str) -> unicode: ...
+ def mirrored(self, unichr: unicode) -> int: ...
+ def name(self, chr: unicode, default: _default = ...) -> Union[str, _default]: ...
+ def normalize(self, form: str, unistr: unicode) -> unicode: ...
+ def numeric(self, chr: unicode, default: _default = ...) -> Union[float, _default]: ...
diff --git a/typeshed/stdlib/2/unittest.pyi b/typeshed/stdlib/2/unittest.pyi
new file mode 100644
index 0000000..ce06d35
--- /dev/null
+++ b/typeshed/stdlib/2/unittest.pyi
@@ -0,0 +1,176 @@
+# Stubs for unittest
+
+# Based on http://docs.python.org/2.7/library/unittest.html
+
+# Only a subset of functionality is included.
+
+from typing import (
+ Any, Callable, Dict, Iterable, Tuple, List, TextIO, Sequence,
+ overload, Set, TypeVar, Pattern
+)
+from abc import abstractmethod, ABCMeta
+
+_T = TypeVar('_T')
+_FT = TypeVar('_FT')
+
+class Testable(metaclass=ABCMeta):
+ @abstractmethod
+ def run(self, result: 'TestResult') -> None: ...
+ @abstractmethod
+ def debug(self) -> None: ...
+ @abstractmethod
+ def countTestCases(self) -> int: ...
+
+# TODO ABC for test runners?
+
+class TestResult:
+ errors = ... # type: List[Tuple[Testable, str]]
+ failures = ... # type: List[Tuple[Testable, str]]
+ testsRun = 0
+ shouldStop = ... # type: bool
+
+ def wasSuccessful(self) -> bool: ...
+ def stop(self) -> None: ...
+ def startTest(self, test: Testable) -> None: ...
+ def stopTest(self, test: Testable) -> None: ...
+ def addError(self, test: Testable,
+ err: Tuple[type, Any, Any]) -> None: ... # TODO
+ def addFailure(self, test: Testable,
+ err: Tuple[type, Any, Any]) -> None: ... # TODO
+ def addSuccess(self, test: Testable) -> None: ...
+
+class _AssertRaisesBaseContext:
+ expected = ... # type: Any
+ failureException = ... # type: type
+ obj_name = ... # type: str
+ expected_regex = ... # type: Pattern[str]
+
+class _AssertRaisesContext(_AssertRaisesBaseContext):
+ exception = ... # type: Any # TODO precise type
+ def __enter__(self) -> _AssertRaisesContext: ...
+ def __exit__(self, exc_type, exc_value, tb) -> bool: ...
+
+class TestCase(Testable):
+ def __init__(self, methodName: str = ...) -> None: ...
+ # TODO failureException
+ def setUp(self) -> None: ...
+ def tearDown(self) -> None: ...
+ def run(self, result: TestResult = ...) -> None: ...
+ def debug(self) -> None: ...
+ def assert_(self, expr: Any, msg: object = ...) -> None: ...
+ def failUnless(self, expr: Any, msg: object = ...) -> None: ...
+ def assertTrue(self, expr: Any, msg: object = ...) -> None: ...
+ def assertEqual(self, first: Any, second: Any,
+ msg: object = ...) -> None: ...
+ def assertEquals(self, first: Any, second: Any,
+ msg: object = ...) -> None: ...
+ def failUnlessEqual(self, first: Any, second: Any,
+ msg: object = ...) -> None: ...
+ def assertNotEqual(self, first: Any, second: Any,
+ msg: object = ...) -> None: ...
+ def assertNotEquals(self, first: Any, second: Any,
+ msg: object = ...) -> None: ...
+ def failIfEqual(self, first: Any, second: Any,
+ msg: object = ...) -> None: ...
+ def assertAlmostEqual(self, first: float, second: float, places: int = ...,
+ msg: object = ...,
+ delta: float = ...) -> None: ...
+ def assertAlmostEquals(self, first: float, second: float, places: int = ...,
+ msg: object = ...,
+ delta: float = ...) -> None: ...
+ def failUnlessAlmostEqual(self, first: float, second: float, places: int = ...,
+ msg: object = ...) -> None: ...
+ def assertNotAlmostEqual(self, first: float, second: float, places: int = ...,
+ msg: object = ...,
+ delta: float = ...) -> None: ...
+ def assertNotAlmostEquals(self, first: float, second: float, places: int = ...,
+ msg: object = ...,
+ delta: float = ...) -> None: ...
+ def failIfAlmostEqual(self, first: float, second: float, places: int = ...,
+ msg: object = ...,
+ delta: float = ...) -> None: ...
+ def assertGreater(self, first: Any, second: Any,
+ msg: object = ...) -> None: ...
+ def assertGreaterEqual(self, first: Any, second: Any,
+ msg: object = ...) -> None: ...
+ def assertMultiLineEqual(self, first: str, second: str,
+ msg: object = ...) -> None: ...
+ def assertSequenceEqual(self, first: Sequence[Any], second: Sequence[Any],
+ msg: object = ..., seq_type: type = ...) -> None: ...
+ def assertListEqual(self, first: List[Any], second: List[Any],
+ msg: object = ...) -> None: ...
+ def assertTupleEqual(self, first: Tuple[Any, ...], second: Tuple[Any, ...],
+ msg: object = ...) -> None: ...
+ def assertSetEqual(self, first: Set[Any], second: Set[Any],
+ msg: object = ...) -> None: ...
+ def assertDictEqual(self, first: Dict[Any, Any], second: Dict[Any, Any],
+ msg: object = ...) -> None: ...
+ def assertLess(self, first: Any, second: Any,
+ msg: object = ...) -> None: ...
+ def assertLessEqual(self, first: Any, second: Any,
+ msg: object = ...) -> None: ...
+ def assertRaises(self, expected_exception: type, *args: Any, **kwargs: Any) -> Any: ...
+ def failUnlessRaises(self, expected_exception: type, *args: Any, **kwargs: Any) -> Any: ...
+ def failIf(self, expr: Any, msg: object = ...) -> None: ...
+ def assertFalse(self, expr: Any, msg: object = ...) -> None: ...
+ def assertIs(self, first: object, second: object,
+ msg: object = ...) -> None: ...
+ def assertIsNot(self, first: object, second: object,
+ msg: object = ...) -> None: ...
+ def assertIsNone(self, expr: Any, msg: object = ...) -> None: ...
+ def assertIsNotNone(self, expr: Any, msg: object = ...) -> None: ...
+ def assertIn(self, first: _T, second: Iterable[_T],
+ msg: object = ...) -> None: ...
+ def assertNotIn(self, first: _T, second: Iterable[_T],
+ msg: object = ...) -> None: ...
+ def assertIsInstance(self, obj: Any, cls: type,
+ msg: object = ...) -> None: ...
+ def assertNotIsInstance(self, obj: Any, cls: type,
+ msg: object = ...) -> None: ...
+ def fail(self, msg: object = ...) -> None: ...
+ def countTestCases(self) -> int: ...
+ def defaultTestResult(self) -> TestResult: ...
+ def id(self) -> str: ...
+ def shortDescription(self) -> str: ... # May return None
+ def addCleanup(function: Any, *args: Any, **kwargs: Any) -> None: ...
+ def skipTest(self, reason: Any) -> None: ...
+
+class CallableTestCase(Testable):
+ def __init__(self, testFunc: Callable[[], None],
+ setUp: Callable[[], None] = ...,
+ tearDown: Callable[[], None] = ...,
+ description: str = ...) -> None: ...
+ def run(self, result: TestResult) -> None: ...
+ def debug(self) -> None: ...
+ def countTestCases(self) -> int: ...
+
+class TestSuite(Testable):
+ def __init__(self, tests: Iterable[Testable] = ...) -> None: ...
+ def addTest(self, test: Testable) -> None: ...
+ def addTests(self, tests: Iterable[Testable]) -> None: ...
+ def run(self, result: TestResult) -> None: ...
+ def debug(self) -> None: ...
+ def countTestCases(self) -> int: ...
+
+# TODO TestLoader
+# TODO defaultTestLoader
+
+class TextTestRunner:
+ def __init__(self, stream: TextIO = ..., descriptions: bool = ...,
+ verbosity: int = ..., failfast: bool = ...) -> None: ...
+
+class SkipTest(Exception):
+ ...
+
+# TODO precise types
+def skipUnless(condition: Any, reason: str) -> Any: ...
+def skipIf(condition: Any, reason: str) -> Any: ...
+def expectedFailure(func: _FT) -> _FT: ...
+def skip(reason: str) -> Any: ...
+
+def main(module: str = ..., defaultTest: str = ...,
+ argv: List[str] = ..., testRunner: Any = ...,
+ testLoader: Any = ...) -> None: ... # TODO types
+
+# private but occasionally used
+util = ... # type: module
diff --git a/typeshed/stdlib/2/urllib.pyi b/typeshed/stdlib/2/urllib.pyi
new file mode 100644
index 0000000..0882926
--- /dev/null
+++ b/typeshed/stdlib/2/urllib.pyi
@@ -0,0 +1,135 @@
+# Stubs for urllib (Python 2)
+# NOTE: This dynamically typed stub was originally automatically generated by stubgen.
+
+from typing import Any, Mapping, Union, Tuple, Sequence, IO
+
+def url2pathname(pathname: str) -> str: ...
+def pathname2url(pathname: str) -> str: ...
+def urlopen(url: str, data=..., proxies: Mapping[str, str] = ..., context=...) -> IO[Any]: ...
+def urlretrieve(url, filename=..., reporthook=..., data=..., context=...): ...
+def urlcleanup() -> None: ...
+
+class ContentTooShortError(IOError):
+ content = ... # type: Any
+ def __init__(self, message, content) -> None: ...
+
+class URLopener:
+ version = ... # type: Any
+ proxies = ... # type: Any
+ key_file = ... # type: Any
+ cert_file = ... # type: Any
+ context = ... # type: Any
+ addheaders = ... # type: Any
+ tempcache = ... # type: Any
+ ftpcache = ... # type: Any
+ def __init__(self, proxies: Mapping[str, str] = ..., context=..., **x509) -> None: ...
+ def __del__(self): ...
+ def close(self): ...
+ def cleanup(self): ...
+ def addheader(self, *args): ...
+ type = ... # type: Any
+ def open(self, fullurl: str, data=...): ...
+ def open_unknown(self, fullurl, data=...): ...
+ def open_unknown_proxy(self, proxy, fullurl, data=...): ...
+ def retrieve(self, url, filename=..., reporthook=..., data=...): ...
+ def open_http(self, url, data=...): ...
+ def http_error(self, url, fp, errcode, errmsg, headers, data=...): ...
+ def http_error_default(self, url, fp, errcode, errmsg, headers): ...
+ def open_https(self, url, data=...): ...
+ def open_file(self, url): ...
+ def open_local_file(self, url): ...
+ def open_ftp(self, url): ...
+ def open_data(self, url, data=...): ...
+
+class FancyURLopener(URLopener):
+ auth_cache = ... # type: Any
+ tries = ... # type: Any
+ maxtries = ... # type: Any
+ def __init__(self, *args, **kwargs) -> None: ...
+ def http_error_default(self, url, fp, errcode, errmsg, headers): ...
+ def http_error_302(self, url, fp, errcode, errmsg, headers, data=...): ...
+ def redirect_internal(self, url, fp, errcode, errmsg, headers, data): ...
+ def http_error_301(self, url, fp, errcode, errmsg, headers, data=...): ...
+ def http_error_303(self, url, fp, errcode, errmsg, headers, data=...): ...
+ def http_error_307(self, url, fp, errcode, errmsg, headers, data=...): ...
+ def http_error_401(self, url, fp, errcode, errmsg, headers, data=...): ...
+ def http_error_407(self, url, fp, errcode, errmsg, headers, data=...): ...
+ def retry_proxy_http_basic_auth(self, url, realm, data=...): ...
+ def retry_proxy_https_basic_auth(self, url, realm, data=...): ...
+ def retry_http_basic_auth(self, url, realm, data=...): ...
+ def retry_https_basic_auth(self, url, realm, data=...): ...
+ def get_user_passwd(self, host, realm, clear_cache=...): ...
+ def prompt_user_passwd(self, host, realm): ...
+
+class ftpwrapper:
+ user = ... # type: Any
+ passwd = ... # type: Any
+ host = ... # type: Any
+ port = ... # type: Any
+ dirs = ... # type: Any
+ timeout = ... # type: Any
+ refcount = ... # type: Any
+ keepalive = ... # type: Any
+ def __init__(self, user, passwd, host, port, dirs, timeout=..., persistent=...) -> None: ...
+ busy = ... # type: Any
+ ftp = ... # type: Any
+ def init(self): ...
+ def retrfile(self, file, type): ...
+ def endtransfer(self): ...
+ def close(self): ...
+ def file_close(self): ...
+ def real_close(self): ...
+
+class addbase:
+ fp = ... # type: Any
+ read = ... # type: Any
+ readline = ... # type: Any
+ readlines = ... # type: Any
+ fileno = ... # type: Any
+ __iter__ = ... # type: Any
+ next = ... # type: Any
+ def __init__(self, fp) -> None: ...
+ def close(self): ...
+
+class addclosehook(addbase):
+ closehook = ... # type: Any
+ hookargs = ... # type: Any
+ def __init__(self, fp, closehook, *hookargs) -> None: ...
+ def close(self): ...
+
+class addinfo(addbase):
+ headers = ... # type: Any
+ def __init__(self, fp, headers) -> None: ...
+ def info(self): ...
+
+class addinfourl(addbase):
+ headers = ... # type: Any
+ url = ... # type: Any
+ code = ... # type: Any
+ def __init__(self, fp, headers, url, code=...) -> None: ...
+ def info(self): ...
+ def getcode(self): ...
+ def geturl(self): ...
+
+def unwrap(url): ...
+def splittype(url): ...
+def splithost(url): ...
+def splituser(host): ...
+def splitpasswd(user): ...
+def splitport(host): ...
+def splitnport(host, defport=...): ...
+def splitquery(url): ...
+def splittag(url): ...
+def splitattr(url): ...
+def splitvalue(attr): ...
+def unquote(s: str) -> str: ...
+def unquote_plus(s: str) -> str: ...
+def quote(s: str, safe=...) -> str: ...
+def quote_plus(s: str, safe=...) -> str: ...
+def urlencode(query: Union[Sequence[Tuple[Any, Any]], Mapping[Any, Any]], doseq=...) -> str: ...
+
+def getproxies() -> Mapping[str, str]: ...
+def proxy_bypass(host): ...
+
+# Names in __all__ with no definition:
+# basejoin
diff --git a/typeshed/stdlib/2/urllib2.pyi b/typeshed/stdlib/2/urllib2.pyi
new file mode 100644
index 0000000..728d298
--- /dev/null
+++ b/typeshed/stdlib/2/urllib2.pyi
@@ -0,0 +1,160 @@
+
+from typing import AnyStr, Dict, List, Union
+from urllib import addinfourl
+
+class URLError(IOError):
+ reason = ... # type: Union[str, BaseException]
+
+class HTTPError(URLError, addinfourl):
+ code = ... # type: int
+ headers = ... # type: Dict[str, str]
+
+class Request(object):
+ host = ... # type: str
+ port = ... # type: str
+ data = ... # type: str
+ headers = ... # type: Dict[str, str]
+ unverifiable = ... # type: bool
+ type = ...
+ origin_req_host = ...
+ unredirected_hdrs = ...
+
+ def __init__(self, url: str, data: str = None, headers: Dict[str, str] = ...,
+ origin_req_host: str = None, unverifiable: bool = ...) -> None: ...
+ def __getattr__(self, attr): ...
+ def get_method(self) -> str: ...
+ def add_data(self, data) -> None: ...
+ def has_data(self) -> bool: ...
+ def get_data(self) -> str: ...
+ def get_full_url(self) -> str: ...
+ def get_type(self): ...
+ def get_host(self) -> str: ...
+ def get_selector(self): ...
+ def set_proxy(self, host, type) -> None: ...
+ def has_proxy(self) -> bool: ...
+ def get_origin_req_host(self) -> str: ...
+ def is_unverifiable(self) -> bool: ...
+ def add_header(self, key: str, val: str) -> None: ...
+ def add_unredirected_header(self, key: str, val: str) -> None: ...
+ def has_header(self, header_name: str) -> bool: ...
+ def get_header(self, header_name: str, default: str = None) -> str: ...
+ def header_items(self): ...
+
+class OpenerDirector(object): ...
+
+def urlopen(url, data=None, timeout=..., cafile=None, capath=None, cadefault=False,
+ context=None): ...
+def install_opener(opener): ...
+def build_opener(*handlers): ...
+
+class BaseHandler:
+ handler_order = ... # int
+
+ def add_parent(self, parent) -> None: ...
+ def close(self) -> None: ...
+ def __lt__(self, other) -> bool: ...
+
+class HTTPErrorProcessor(BaseHandler):
+ def http_response(self, request, response): ...
+
+class HTTPDefaultErrorHandler(BaseHandler):
+ def http_error_default(self, req, fp, code, msg, hdrs): ...
+
+class HTTPRedirectHandler(BaseHandler):
+ max_repeats = ... # int
+ max_redirections = ... # int
+ def redirect_request(self, req, fp, code, msg, headers, newurl): ...
+ def http_error_301(self, req, fp, code, msg, headers): ...
+ def http_error_302(self, req, fp, code, msg, headers): ...
+ def http_error_303(self, req, fp, code, msg, headers): ...
+ def http_error_307(self, req, fp, code, msg, headers): ...
+ inf_msg = ... # type: str
+
+
+class ProxyHandler(BaseHandler):
+ def __init__(self, proxies=None): ...
+ def proxy_open(self, req, proxy, type): ...
+
+class HTTPPasswordMgr:
+ def __init__(self) -> None: ...
+ def add_password(self, realm, uri, user, passwd): ...
+ def find_user_password(self, realm, authuri): ...
+ def reduce_uri(self, uri, default_port: bool): ...
+ def is_suburi(self, base, test): ...
+
+class HTTPPasswordMgrWithDefaultRealm(HTTPPasswordMgr): ...
+
+class AbstractBasicAuthHandler:
+ def __init__(self, password_mgr=None): ...
+ def reset_retry_count(self): ...
+ def http_error_auth_reqed(self, authreq, host, req, headers): ...
+ def retry_http_basic_auth(self, host, req, realm): ...
+
+class HTTPBasicAuthHandler(AbstractBasicAuthHandler, BaseHandler):
+ auth_header = ... # type: str
+ def http_error_401(self, req, fp, code, msg, headers): ...
+
+class ProxyBasicAuthHandler(AbstractBasicAuthHandler, BaseHandler):
+ auth_header = ... # type: str
+ def http_error_407(self, req, fp, code, msg, headers): ...
+
+class AbstractDigestAuthHandler:
+ def __init__(self, passwd=None): ...
+ def reset_retry_count(self): ...
+ def http_error_auth_reqed(self, auth_header, host, req, headers): ...
+ def retry_http_digest_auth(self, req, auth): ...
+ def get_cnonce(self, nonce): ...
+ def get_authorization(self, req, chal): ...
+ def get_algorithm_impls(self, algorithm): ...
+ def get_entity_digest(self, data, chal): ...
+
+class HTTPDigestAuthHandler(BaseHandler, AbstractDigestAuthHandler):
+ auth_header = ... # str
+ handler_order = ... # int
+ def http_error_401(self, req, fp, code, msg, headers): ...
+
+class ProxyDigestAuthHandler(BaseHandler, AbstractDigestAuthHandler):
+ auth_header = ... # str
+ handler_order = ... # int
+ def http_error_407(self, req, fp, code, msg, headers): ...
+
+class AbstractHTTPHandler(BaseHandler):
+ def __init__(self, debuglevel: int) -> None: ...
+ def do_request_(self, request): ...
+ def do_open(self, http_class, req): ...
+
+class HTTPHandler(AbstractHTTPHandler):
+ def http_open(self, req): ...
+ def http_request(self, request): ...
+
+class HTTPSHandler(AbstractHTTPHandler):
+ def __init__(self, debuglevel=0, context=None): ...
+ def https_open(self, req): ...
+ def https_request(self, request): ...
+
+class HTTPCookieProcessor(BaseHandler):
+ def __init__(self, cookiejar=None): ...
+ def http_request(self, request): ...
+ def http_response(self, request, response): ...
+
+class UnknownHandler(BaseHandler):
+ def unknown_open(self, req): ...
+
+class FileHandler(BaseHandler):
+ def file_open(self, req): ...
+ def get_names(self): ...
+ def open_local_file(self, req): ...
+
+class FTPHandler(BaseHandler):
+ def ftp_open(self, req): ...
+ def connect_ftp(self, user, passwd, host, port, dirs, timeout): ...
+
+class CacheFTPHandler(FTPHandler):
+ def __init__(self): ...
+ def setTimeout(self, t): ...
+ def setMaxConns(self, m): ...
+ def check_cache(self): ...
+ def clear_cache(self): ...
+
+def parse_http_list(s: AnyStr) -> List[AnyStr]: ...
+def parse_keqv_list(l: List[AnyStr]) -> Dict[AnyStr, AnyStr]: ...
diff --git a/typeshed/stdlib/2/urlparse.pyi b/typeshed/stdlib/2/urlparse.pyi
new file mode 100644
index 0000000..9d0a702
--- /dev/null
+++ b/typeshed/stdlib/2/urlparse.pyi
@@ -0,0 +1,68 @@
+# Stubs for urlparse (Python 2)
+
+from typing import Dict, List, NamedTuple, Tuple, Sequence, Union, overload
+
+uses_relative = ... # type: List[str]
+uses_netloc = ... # type: List[str]
+uses_params = ... # type: List[str]
+non_hierarchical = ... # type: List[str]
+uses_query = ... # type: List[str]
+uses_fragment = ... # type: List[str]
+scheme_chars = ... # type: str
+MAX_CACHE_SIZE = 0
+
+def clear_cache() -> None: ...
+
+class ResultMixin(object):
+ @property
+ def username(self) -> str: ...
+ @property
+ def password(self) -> str: ...
+ @property
+ def hostname(self) -> str: ...
+ @property
+ def port(self) -> int: ...
+
+class SplitResult(
+ NamedTuple(
+ 'SplitResult',
+ [
+ ('scheme', str), ('netloc', str), ('path', str), ('query', str), ('fragment', str)
+ ]
+ ),
+ ResultMixin
+):
+ def geturl(self) -> str: ...
+
+class ParseResult(
+ NamedTuple(
+ 'ParseResult',
+ [
+ ('scheme', str), ('netloc', str), ('path', str), ('params', str), ('query', str),
+ ('fragment', str)
+ ]
+ ),
+ ResultMixin
+):
+ def geturl(self) -> str: ...
+
+def urlparse(url: Union[str, unicode], scheme: str = ...,
+ allow_fragments: bool = ...) -> ParseResult: ...
+def urlsplit(url: Union[str, unicode], scheme: str = ...,
+ allow_fragments: bool = ...) -> SplitResult: ...
+ at overload
+def urlunparse(data: Tuple[str, str, str, str, str, str]) -> str: ...
+ at overload
+def urlunparse(data: Sequence[str]) -> str: ...
+ at overload
+def urlunsplit(data: Tuple[str, str, str, str, str]) -> str: ...
+ at overload
+def urlunsplit(data: Sequence[str]) -> str: ...
+def urljoin(base: Union[str, unicode], url: Union[str, unicode],
+ allow_fragments: bool = ...) -> str: ...
+def urldefrag(url: Union[str, unicode]) -> str: ...
+def unquote(s: str) -> str: ...
+def parse_qs(qs: str, keep_blank_values: bool = ...,
+ strict_parsing: bool = ...) -> Dict[str, List[str]]: ...
+def parse_qsl(qs: str, keep_blank_values: int = ...,
+ strict_parsing: bool = ...) -> List[Tuple[str, str]]: ...
diff --git a/typeshed/stdlib/2/uuid.pyi b/typeshed/stdlib/2/uuid.pyi
new file mode 100644
index 0000000..ce8a2a4
--- /dev/null
+++ b/typeshed/stdlib/2/uuid.pyi
@@ -0,0 +1,36 @@
+from typing import NamedTuple, Any, Tuple
+
+_int_type = int
+
+class _UUIDFields(NamedTuple('_UUIDFields',
+ [('time_low', int), ('time_mid', int), ('time_hi_version', int), ('clock_seq_hi_variant', int), ('clock_seq_low', int), ('node', int)])):
+ time = ... # type: int
+ clock_seq = ... # type: int
+
+class UUID:
+ def __init__(self, hex: str = ..., bytes: str = ..., bytes_le: str = ...,
+ fields: Tuple[int, int, int, int, int, int] = ..., int: int = ..., version: Any = ...) -> None: ...
+ bytes = ... # type: str
+ bytes_le = ... # type: str
+ fields = ... # type: _UUIDFields
+ hex = ... # type: str
+ int = ... # type: _int_type
+ urn = ... # type: str
+ variant = ... # type: _int_type
+ version = ... # type: _int_type
+
+RESERVED_NCS = ... # type: int
+RFC_4122 = ... # type: int
+RESERVED_MICROSOFT = ... # type: int
+RESERVED_FUTURE = ... # type: int
+
+def getnode() -> int: ...
+def uuid1(node: int = ..., clock_seq: int = ...) -> UUID: ...
+def uuid3(namespace: UUID, name: str) -> UUID: ...
+def uuid4() -> UUID: ...
+def uuid5(namespace: UUID, name: str) -> UUID: ...
+
+NAMESPACE_DNS = ... # type: UUID
+NAMESPACE_URL = ... # type: UUID
+NAMESPACE_OID = ... # type: UUID
+NAMESPACE_X500 = ... # type: UUID
diff --git a/typeshed/stdlib/2/weakref.pyi b/typeshed/stdlib/2/weakref.pyi
new file mode 100644
index 0000000..b040e25
--- /dev/null
+++ b/typeshed/stdlib/2/weakref.pyi
@@ -0,0 +1,47 @@
+# Stubs for weakref (Python 2)
+#
+# Based on stub automatically generated by stubgen.
+
+from typing import Any, MutableMapping, Generic, Iterator, List, TypeVar
+from _weakref import (getweakrefcount, getweakrefs, ref, proxy,
+ CallableProxyType, ProxyType, ReferenceType)
+from _weakrefset import WeakSet
+
+ProxyTypes = ... # type: Any
+
+_KT = TypeVar('_KT')
+_VT = TypeVar('_VT')
+
+# Don't inherit from typing.Dict since
+# isinstance(weakref.WeakValueDictionary(), dict) is False
+class WeakValueDictionary(MutableMapping[_KT, _VT], Generic[_KT, _VT]):
+ def itervaluerefs(self) -> Iterator[ReferenceType[_VT]]: ...
+ def valuerefs(self) -> List[ReferenceType[_VT]]: ...
+
+ def __setitem__(self, k: _KT, v: _VT) -> None: ...
+ def __delitem__(self, v: _KT) -> None: ...
+ def __getitem__(self, k: _KT) -> _VT: ...
+ def __len__(self) -> int: ...
+ def __iter__(self) -> Iterator[_KT]: ...
+
+ def has_key(self, key: _KT) -> bool: ...
+ def copy(self) -> WeakValueDictionary[_KT, _VT]: ...
+
+class WeakKeyDictionary(MutableMapping[_KT, _VT], Generic[_KT, _VT]):
+ def iterkeyrefs(self) -> Iterator[ReferenceType[_KT]]: ...
+ def keyrefs(self) -> List[ReferenceType[_KT]]: ...
+
+ def __setitem__(self, k: _KT, v: _VT) -> None: ...
+ def __delitem__(self, v: _KT) -> None: ...
+ def __getitem__(self, k: _KT) -> _VT: ...
+ def __len__(self) -> int: ...
+ def __iter__(self) -> Iterator[_KT]: ...
+
+ def has_key(self, key: _KT) -> bool: ...
+ def copy(self) -> WeakKeyDictionary[_KT, _VT]: ...
+
+# TODO: make generic
+class KeyedRef(ReferenceType):
+ key = ... # type: Any
+ def __new__(type, ob, callback, key): ...
+ def __init__(self, ob, callback, key): ...
diff --git a/mypy/test/update.py b/typeshed/stdlib/2/wsgiref/__init__.pyi
similarity index 100%
rename from mypy/test/update.py
rename to typeshed/stdlib/2/wsgiref/__init__.pyi
diff --git a/typeshed/stdlib/2/wsgiref/validate.pyi b/typeshed/stdlib/2/wsgiref/validate.pyi
new file mode 100644
index 0000000..490889c
--- /dev/null
+++ b/typeshed/stdlib/2/wsgiref/validate.pyi
@@ -0,0 +1,47 @@
+# Stubs for wsgiref.validate (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class WSGIWarning(Warning): ...
+
+def validator(application): ...
+
+class InputWrapper:
+ input = ... # type: Any
+ def __init__(self, wsgi_input): ...
+ def read(self, *args): ...
+ def readline(self): ...
+ def readlines(self, *args): ...
+ def __iter__(self): ...
+ def close(self): ...
+
+class ErrorWrapper:
+ errors = ... # type: Any
+ def __init__(self, wsgi_errors): ...
+ def write(self, s): ...
+ def flush(self): ...
+ def writelines(self, seq): ...
+ def close(self): ...
+
+class WriteWrapper:
+ writer = ... # type: Any
+ def __init__(self, wsgi_writer): ...
+ def __call__(self, s): ...
+
+class PartialIteratorWrapper:
+ iterator = ... # type: Any
+ def __init__(self, wsgi_iterator): ...
+ def __iter__(self): ...
+
+class IteratorWrapper:
+ original_iterator = ... # type: Any
+ iterator = ... # type: Any
+ closed = ... # type: Any
+ check_start_response = ... # type: Any
+ def __init__(self, wsgi_iterator, check_start_response): ...
+ def __iter__(self): ...
+ def next(self): ...
+ def close(self): ...
+ def __del__(self): ...
diff --git a/pinfer/__init__.py b/typeshed/stdlib/2/xml/__init__.pyi
similarity index 100%
rename from pinfer/__init__.py
rename to typeshed/stdlib/2/xml/__init__.pyi
diff --git a/typeshed/stdlib/2/xml/etree/ElementInclude.pyi b/typeshed/stdlib/2/xml/etree/ElementInclude.pyi
new file mode 100644
index 0000000..290ee09
--- /dev/null
+++ b/typeshed/stdlib/2/xml/etree/ElementInclude.pyi
@@ -0,0 +1,19 @@
+# Stubs for xml.etree.ElementInclude (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Union, Optional, Callable
+from xml.etree.ElementTree import Element
+
+XINCLUDE = ... # type: str
+XINCLUDE_INCLUDE = ... # type: str
+XINCLUDE_FALLBACK = ... # type: str
+
+class FatalIncludeError(SyntaxError): ...
+
+def default_loader(href: Union[str, bytes, int], parse: str, encoding: Optional[str]=...) -> Union[str, Element]: ...
+
+# TODO: loader is of type default_loader ie it takes a callable that has the
+# same signature as default_loader. But default_loader has a keyword argument
+# Which can't be represented using Callable...
+def include(elem: Element, loader: Callable[..., Union[str, Element]]=...) -> None: ...
diff --git a/typeshed/stdlib/2/xml/etree/ElementPath.pyi b/typeshed/stdlib/2/xml/etree/ElementPath.pyi
new file mode 100644
index 0000000..d0095e3
--- /dev/null
+++ b/typeshed/stdlib/2/xml/etree/ElementPath.pyi
@@ -0,0 +1,35 @@
+# Stubs for xml.etree.ElementPath (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Pattern, Dict, Generator, Tuple, List, Union, TypeVar, Callable, Optional
+from xml.etree.ElementTree import Element
+
+xpath_tokenizer_re = ... # type: Pattern
+
+_token = Tuple[str, str]
+_next = Callable[[], _token]
+_callback = Callable[['_SelectorContext', List[Element]], Generator[Element, None, None]]
+
+def xpath_tokenizer(pattern: str, namespaces: Dict[str, str]=...) -> Generator[_token, None, None]: ...
+def get_parent_map(context: '_SelectorContext') -> Dict[Element, Element]: ...
+def prepare_child(next: _next, token: _token) -> _callback: ...
+def prepare_star(next: _next, token: _token) -> _callback: ...
+def prepare_self(next: _next, token: _token) -> _callback: ...
+def prepare_descendant(next: _next, token: _token) -> _callback: ...
+def prepare_parent(next: _next, token: _token) -> _callback: ...
+def prepare_predicate(next: _next, token: _token) -> _callback: ...
+
+ops = ... # type: Dict[str, Callable[[_next, _token], _callback]]
+
+class _SelectorContext:
+ parent_map = ... # type: Dict[Element, Element]
+ root = ... # type: Element
+ def __init__(self, root: Element) -> None: ...
+
+_T = TypeVar('_T')
+
+def iterfind(elem: Element, path: str, namespaces: Dict[str, str]=...) -> List[Element]: ...
+def find(elem: Element, path: str, namespaces: Dict[str, str]=...) -> Optional[Element]: ...
+def findall(elem: Element, path: str, namespaces: Dict[str, str]=...) -> List[Element]: ...
+def findtext(elem: Element, path: str, default: _T=..., namespaces: Dict[str, str]=...) -> Union[_T, str]: ...
diff --git a/typeshed/stdlib/2/xml/etree/ElementTree.pyi b/typeshed/stdlib/2/xml/etree/ElementTree.pyi
new file mode 100644
index 0000000..89e61f6
--- /dev/null
+++ b/typeshed/stdlib/2/xml/etree/ElementTree.pyi
@@ -0,0 +1,116 @@
+# Stubs for xml.etree.ElementTree (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, AnyStr, Union, IO, Callable, Dict, List, Tuple, Sequence, Iterator, TypeVar, Optional, Generator
+import io
+
+VERSION = ... # type: str
+
+_Ss = TypeVar('_Ss', str, bytes)
+_T = TypeVar('_T')
+_str_or_bytes = Union[str, bytes]
+
+class _SimpleElementPath:
+ def find(self, element: 'Element', tag: _str_or_bytes, namespaces: Any=...) -> Optional['Element']: ...
+ def findtext(self, element: 'Element', tag: _str_or_bytes, default: _T=..., namespaces: Any=...) -> Union[str, bytes, _T]: ...
+ def iterfind(self, element: 'Element', tag: _str_or_bytes, namespaces: Any=...) -> Generator['Element', None, None]: ...
+ def findall(self, element: 'Element', tag: _str_or_bytes, namespaces: Any=...) -> List['Element']: ...
+
+class ParseError(SyntaxError): ...
+
+def iselement(element: 'Element') -> bool: ...
+
+class Element(Sequence['Element']):
+ tag = ... # type: _str_or_bytes
+ attrib = ... # type: Dict[_str_or_bytes, _str_or_bytes]
+ text = ... # type: Optional[_str_or_bytes]
+ tail = ... # type: Optional[_str_or_bytes]
+ def __init__(self, tag: Union[AnyStr, Callable[..., 'Element']], attrib: Dict[AnyStr, AnyStr]=..., **extra: AnyStr) -> None: ...
+ def append(self, element: 'Element') -> None: ...
+ def clear(self) -> None: ...
+ def copy(self) -> 'Element': ...
+ def extend(self, elements: Sequence['Element']) -> None: ...
+ def find(self, path: str, namespaces: Dict[str, str]=...) -> Optional['Element']: ...
+ def findall(self, path: str, namespaces: Dict[str, str]=...) -> List['Element']: ...
+ def findtext(self, path: str, default: _T=..., namespaces: Dict[str, str]=...) -> Union[_T, str]: ...
+ def get(self, key: AnyStr, default: _T=...) -> Union[AnyStr, _T]: ...
+ def getchildren(self) -> List['Element']: ...
+ def getiterator(self, tag: Union[str, AnyStr]=...) -> List['Element']: ...
+ def insert(self, index: int, element: 'Element') -> None: ...
+ def items(self) -> List[Tuple[AnyStr, AnyStr]]: ...
+ def iter(self, tag: Union[str, AnyStr]=...) -> Generator['Element', None, None]: ...
+ def iterfind(self, path: str, namespaces: Dict[str, str]=...) -> List['Element']: ...
+ def itertext(self) -> Generator[str, None, None]: ...
+ def keys(self) -> List[AnyStr]: ...
+ def makeelement(self, tag: _Ss, attrib: Dict[_Ss, _Ss]) -> 'Element': ...
+ def remove(self, element: 'Element') -> None: ...
+ def set(self, key: AnyStr, value: AnyStr) -> None: ...
+ def __bool__(self) -> bool: ...
+ def __delitem__(self, index: int) -> None: ...
+ def __getitem__(self, index) -> 'Element': ...
+ def __len__(self) -> int: ...
+ def __setitem__(self, index: int, element: 'Element') -> None: ...
+
+def SubElement(parent: Element, tag: AnyStr, attrib: Dict[AnyStr, AnyStr]=..., **extra: AnyStr) -> Element: ...
+def Comment(text: _str_or_bytes=...) -> Element: ...
+def ProcessingInstruction(target: str, text: str=...) -> Element: ...
+
+PI = ... # type: Callable[..., Element]
+
+class QName:
+ text = ... # type: str
+ def __init__(self, text_or_uri: str, tag: str=...) -> None: ...
+
+
+_file_or_filename = Union[str, bytes, int, IO[Any]]
+
+class ElementTree:
+ def __init__(self, element: Element=..., file: _file_or_filename=...) -> None: ...
+ def getroot(self) -> Element: ...
+ def parse(self, source: _file_or_filename, parser: 'XMLParser'=...) -> Element: ...
+ def iter(self, tag: Union[str, AnyStr]=...) -> Generator[Element, None, None]: ...
+ def getiterator(self, tag: Union[str, AnyStr]=...) -> List[Element]: ...
+ def find(self, path: str, namespaces: Dict[str, str]=...) -> Optional[Element]: ...
+ def findtext(self, path: str, default: _T=..., namespaces: Dict[str, str]=...) -> Union[_T, str]: ...
+ def findall(self, path: str, namespaces: Dict[str, str]=...) -> List[Element]: ...
+ def iterfind(self, path: str, namespaces: Dict[str, str]=...) -> List[Element]: ...
+ def write(self, file_or_filename: _file_or_filename, encoding: str=..., xml_declaration: Optional[bool]=..., default_namespace: str=..., method: str=...) -> None: ...
+ def write_c14n(self, file: _file_or_filename) -> None: ...
+
+def register_namespace(prefix: str, uri: str) -> None: ...
+def tostring(element: Element, encoding: str=..., method: str=...) -> str: ...
+def tostringlist(element: Element, encoding: str=..., method: str=...) -> List[str]: ...
+def dump(elem: Element) -> None: ...
+def parse(source: _file_or_filename, parser: 'XMLParser'=...) -> ElementTree: ...
+def iterparse(source: _file_or_filename, events: Sequence[str]=..., parser: 'XMLParser'=...) -> Iterator[Tuple[str, Element]]: ...
+
+class _IterParseIterator:
+ root = ... # type: Any
+ def __init__(self, source: _file_or_filename, events: Sequence[str], parser: 'XMLParser', close_source: bool=...) -> None: ...
+ def next(self) -> Tuple[str, Element]: ...
+ def __iter__(self) -> _IterParseIterator: ...
+
+def XML(text: AnyStr, parser: 'XMLParser'=...) -> Element: ...
+def XMLID(text: AnyStr, parser: 'XMLParser'=...) -> Tuple[Element, Dict[str, Element]]: ...
+# TODO-improve this type
+fromstring = ... # type: Callable[..., Element]
+def fromstringlist(sequence: Sequence[AnyStr], parser: 'XMLParser'=...) -> Element: ...
+
+class TreeBuilder:
+ def __init__(self, element_factory: Callable[[AnyStr, Dict[AnyStr, AnyStr]], Element]=...) -> None: ...
+ def close(self) -> Element: ...
+ def data(self, data: AnyStr) -> None: ...
+ def start(self, tag: AnyStr, attrs: Dict[AnyStr, AnyStr]) -> Element: ...
+ def end(self, tag: AnyStr) -> Element: ...
+
+class XMLParser:
+ parser = ... # type: Any
+ target = ... # type: TreeBuilder
+ # TODO-what is entity used for???
+ entity = ... # type: Any
+ version = ... # type: str
+ def __init__(self, html: int=..., target: TreeBuilder=..., encoding: str=...) -> None: ...
+ def doctype(self, name: str, pubid: str, system: str) -> None: ...
+ def close(self) -> Any: ... # TODO-most of the time, this will be Element, but it can be anything target.close() returns
+ def feed(self, data: AnyStr)-> None: ...
diff --git a/test-data/stdlib-samples/3.2/incomplete/urllib/__init__.py b/typeshed/stdlib/2/xml/etree/__init__.pyi
similarity index 100%
rename from test-data/stdlib-samples/3.2/incomplete/urllib/__init__.py
rename to typeshed/stdlib/2/xml/etree/__init__.pyi
diff --git a/typeshed/stdlib/2/xml/etree/cElementTree.pyi b/typeshed/stdlib/2/xml/etree/cElementTree.pyi
new file mode 100644
index 0000000..8f689de
--- /dev/null
+++ b/typeshed/stdlib/2/xml/etree/cElementTree.pyi
@@ -0,0 +1,5 @@
+# Stubs for xml.etree.cElementTree (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from xml.etree.ElementTree import * # noqa: F403
diff --git a/typeshed/stdlib/2/xxsubtype.pyi b/typeshed/stdlib/2/xxsubtype.pyi
new file mode 100644
index 0000000..56a183f
--- /dev/null
+++ b/typeshed/stdlib/2/xxsubtype.pyi
@@ -0,0 +1,17 @@
+"""Stub file for the 'xxsubtype' module."""
+
+from typing import Any
+
+def bench(obj: Any, name: str, n: int = ...) -> float: ...
+
+class spamdict(dict):
+ state = ... # type: int
+ def getstate(self) -> int: ...
+ def setstate(self, a: int) -> None: ...
+
+class spamlist(list):
+ state = ... # type: int
+ def getstate(self) -> int: ...
+ def setstate(self, a: int) -> None: ...
+ def classmeth(self, *args, **kwargs) -> tuple: ...
+ def staticmeth(self, *args, **kwargs) -> tuple: ...
diff --git a/typeshed/stdlib/2/zlib.pyi b/typeshed/stdlib/2/zlib.pyi
new file mode 100644
index 0000000..a232cc5
--- /dev/null
+++ b/typeshed/stdlib/2/zlib.pyi
@@ -0,0 +1,42 @@
+# Stubs for zlib (Python 2.7)
+
+DEFLATED = ... # type: int
+DEF_MEM_LEVEL = ... # type: int
+MAX_WBITS = ... # type: int
+ZLIB_VERSION = ... # type: str
+Z_BEST_COMPRESSION = ... # type: int
+Z_BEST_SPEED = ... # type: int
+Z_DEFAULT_COMPRESSION = ... # type: int
+Z_DEFAULT_STRATEGY = ... # type: int
+Z_FILTERED = ... # type: int
+Z_FINISH = ... # type: int
+Z_FULL_FLUSH = ... # type: int
+Z_HUFFMAN_ONLY = ... # type: int
+Z_NO_FLUSH = ... # type: int
+Z_SYNC_FLUSH = ... # type: int
+
+
+class error(Exception): ...
+
+
+class Compress:
+ def compress(self, data: str) -> str: ...
+ def flush(self) -> str: ...
+ def copy(self) -> "Compress": ...
+
+
+class Decompress:
+ unused_data = ... # type: str
+ unconsumed_tail = ... # type: str
+ def decompress(self, data: str, max_length: int = ...) -> str: ...
+ def flush(self) -> str: ...
+ def copy(self) -> "Decompress": ...
+
+
+def adler32(data: str, value: int = ...) -> int: ...
+def compress(data: str, level: int = ...) -> str: ...
+def compressobj(level: int = ..., method: int = ..., wbits: int = ...,
+ memlevel: int = ..., strategy: int = ...) -> Compress: ...
+def crc32(data: str, value: int = ...) -> int: ...
+def decompress(data: str, wbits: int = ..., bufsize: int = ...) -> str: ...
+def decompressobj(wbits: int = ...) -> Decompress: ...
diff --git a/typeshed/stdlib/2and3/_bisect.pyi b/typeshed/stdlib/2and3/_bisect.pyi
new file mode 100644
index 0000000..4b6ad96
--- /dev/null
+++ b/typeshed/stdlib/2and3/_bisect.pyi
@@ -0,0 +1,11 @@
+"""Stub file for the '_bisect' module."""
+
+from typing import Any, Sequence, TypeVar
+
+T = TypeVar('T')
+def bisect(a: Sequence[T], x: T, lo: int = ..., hi: int = ...) -> int: ...
+def bisect_left(a: Sequence[T], x: T, lo: int = ..., hi: int = ...) -> int: ...
+def bisect_right(a: Sequence[T], x: T, lo: int = ..., hi: int = ...) -> int: ...
+def insort(a: Sequence[T], x: T, lo: int = ..., hi: int = ...) -> None: ...
+def insort_left(a: Sequence[T], x: T, lo: int = ..., hi: int = ...) -> None: ...
+def insort_right(a: Sequence[T], x: T, lo: int = ..., hi: int = ...) -> None: ...
diff --git a/typeshed/stdlib/2and3/_heapq.pyi b/typeshed/stdlib/2and3/_heapq.pyi
new file mode 100644
index 0000000..8b7f6ea
--- /dev/null
+++ b/typeshed/stdlib/2and3/_heapq.pyi
@@ -0,0 +1,15 @@
+"""Stub file for the '_heapq' module."""
+
+from typing import TypeVar, List
+
+_T = TypeVar("_T")
+
+def heapify(heap: List[_T]) -> None: ...
+def heappop(heap: List[_T]) -> _T:
+ raise IndexError() # if list is empty
+def heappush(heap: List[_T], item: _T) -> None: ...
+def heappushpop(heap: List[_T], item: _T) -> _T: ...
+def heapreplace(heap: List[_T], item: _T) -> _T:
+ raise IndexError() # if list is empty
+def nlargest(a: int, b: List[_T]) -> List[_T]: ...
+def nsmallest(a: int, b: List[_T]) -> List[_T]: ...
diff --git a/typeshed/stdlib/2and3/argparse.pyi b/typeshed/stdlib/2and3/argparse.pyi
new file mode 100644
index 0000000..627426d
--- /dev/null
+++ b/typeshed/stdlib/2and3/argparse.pyi
@@ -0,0 +1,155 @@
+# Stubs for argparse (Python 3.4)
+
+from typing import (
+ Any, Callable, Iterable, List, IO, Optional, Sequence, Tuple, Type, Union,
+ TypeVar, overload
+)
+import sys
+
+_T = TypeVar('_T')
+
+
+ONE_OR_MORE = ... # type: str
+OPTIONAL = ... # type: str
+PARSER = ... # type: str
+REMAINDER = ... # type: str
+SUPPRESS = ... # type: str
+ZERO_OR_MORE = ... # type: str
+
+class ArgumentError(Exception): ...
+
+class ArgumentParser:
+ if sys.version_info >= (3, 5):
+ def __init__(self,
+ prog: Optional[str] = ...,
+ usage: Optional[str] = ...,
+ description: Optional[str] = ...,
+ epilog: Optional[str] = ...,
+ parents: Sequence[ArgumentParser] = ...,
+ formatter_class: Type[HelpFormatter] = ...,
+ prefix_chars: str = ...,
+ fromfile_prefix_chars: Optional[str] = ...,
+ argument_default: Optional[str] = ...,
+ conflict_handler: str = ...,
+ add_help: bool = ...,
+ allow_abbrev: bool = ...) -> None: ...
+ else:
+ def __init__(self,
+ prog: Optional[str] = ...,
+ usage: Optional[str] = ...,
+ description: Optional[str] = ...,
+ epilog: Optional[str] = ...,
+ parents: Sequence[ArgumentParser] = ...,
+ formatter_class: Type[HelpFormatter] = ...,
+ prefix_chars: str = ...,
+ fromfile_prefix_chars: Optional[str] = ...,
+ argument_default: Optional[str] = ...,
+ conflict_handler: str = ...,
+ add_help: bool = ...) -> None: ...
+ def add_argument(self,
+ *name_or_flags: Union[str, Sequence[str]],
+ action: Union[str, Type[Action]] = ...,
+ nargs: Union[int, str] = ...,
+ const: Any = ...,
+ default: Any = ...,
+ type: Union[Callable[[str], _T], FileType] = ...,
+ choices: Iterable[_T] = ...,
+ required: bool = ...,
+ help: str = ...,
+ metavar: Union[str, Tuple[str, ...]] = ...,
+ dest: str = ...,
+ version: str = ...) -> None: ... # weirdly documented
+ def parse_args(self, args: Optional[Sequence[str]] = ...,
+ namespace: Optional[Namespace] = ...) -> Namespace: ...
+ def add_subparsers(self, title: str = ...,
+ description: Optional[str] = ...,
+ prog: str = ...,
+ parser_class: Type[ArgumentParser] = ...,
+ action: Type[Action] = ...,
+ option_string: str = ...,
+ dest: Optional[str] = ...,
+ help: Optional[str] = ...,
+ metavar: Optional[str] = ...) -> _SubParsersAction: ...
+ def add_argument_group(self, title: Optional[str] = ...,
+ description: Optional[str] = ...) -> _ArgumentGroup: ...
+ def add_mutually_exclusive_group(self, required: bool = ...) -> _MutuallyExclusiveGroup: ...
+ def set_defaults(self, **kwargs: Any) -> None: ...
+ def get_default(self, dest: str) -> Any: ...
+ def print_usage(self, file: Optional[IO[str]] = ...) -> None: ...
+ def print_help(self, file: Optional[IO[str]] = ...) -> None: ...
+ def format_usage(self) -> str: ...
+ def format_help(self) -> str: ...
+ def parse_known_args(self, args: Optional[Sequence[str]] = ...,
+ namespace: Optional[Namespace] = ...) -> Tuple[Namespace, List[str]]: ...
+ def convert_arg_line_to_args(self, arg_line: str) -> List[str]: ...
+ def exit(self, status: int = ..., message: Optional[str] = ...) -> None: ...
+ def error(self, message: str) -> None: ...
+
+class HelpFormatter:
+ # not documented
+ def __init__(self, prog: str, indent_increment: int = ...,
+ max_help_position: int = ...,
+ width: Optional[int] = ...) -> None: ...
+class RawDescriptionHelpFormatter(HelpFormatter): ...
+class RawTextHelpFormatter(HelpFormatter): ...
+class ArgumentDefaultsHelpFormatter(HelpFormatter): ...
+if sys.version_info >= (3,):
+ class MetavarTypeHelpFormatter(HelpFormatter): ...
+
+class Action:
+ def __init__(self,
+ option_strings: Sequence[str],
+ dest: str = ...,
+ nargs: Optional[Union[int, str]] = ...,
+ const: Any = ...,
+ default: Any = ...,
+ type: Union[Callable[[str], _T], FileType, None] = ...,
+ choices: Optional[Iterable[_T]] = ...,
+ required: bool = ...,
+ help: Optional[str] = ...,
+ metavar: Union[str, Tuple[str, ...]] = ...) -> None: ...
+ def __call__(self, parser: ArgumentParser, namespace: Namespace,
+ values: Union[str, Sequence[Any], None],
+ option_string: str = ...) -> None: ...
+
+class Namespace:
+ def __getattr__(self, name: str) -> Any: ...
+ def __setattr__(self, name: str, value: Any) -> None: ...
+
+class FileType:
+ if sys.version_info >= (3, 4):
+ def __init__(self, mode: str = ..., bufsize: int = ...,
+ encoding: Optional[str] = ...,
+ errors: Optional[str] = ...) -> None: ...
+ elif sys.version_info >= (3,):
+ def __init__(self,
+ mode: str = ..., bufsize: int = ...) -> None: ...
+ else:
+ def __init__(self,
+ mode: str = ..., bufsize: Optional[int] = ...) -> None: ...
+ def __call__(self, string: str) -> IO[Any]: ...
+
+class _ArgumentGroup:
+ def add_argument(self,
+ *name_or_flags: Union[str, Sequence[str]],
+ action: Union[str, Type[Action]] = ...,
+ nargs: Union[int, str] = ...,
+ const: Any = ...,
+ default: Any = ...,
+ type: Union[Callable[[str], _T], FileType] = ...,
+ choices: Iterable[_T] = ...,
+ required: bool = ...,
+ help: str = ...,
+ metavar: Union[str, Tuple[str, ...]] = ...,
+ dest: str = ...,
+ version: str = ...) -> None: ...
+ def add_mutually_exclusive_group(self, required: bool = ...) -> _MutuallyExclusiveGroup: ...
+
+class _MutuallyExclusiveGroup(_ArgumentGroup): ...
+
+class _SubParsersAction:
+ # TODO: Type keyword args properly.
+ def add_parser(self, name: str, **kwargs: Any) -> ArgumentParser: ...
+
+# not documented
+class ArgumentTypeError(Exception): ...
diff --git a/typeshed/stdlib/2and3/asynchat.pyi b/typeshed/stdlib/2and3/asynchat.pyi
new file mode 100644
index 0000000..b5cf3c0
--- /dev/null
+++ b/typeshed/stdlib/2and3/asynchat.pyi
@@ -0,0 +1,41 @@
+from abc import abstractmethod
+import asyncore
+import socket
+import sys
+from typing import Union, Tuple, Sequence
+
+
+class simple_producer:
+ def __init__(self, data: str, buffer_size: int = ...) -> None: ...
+ def more(self) -> str: ...
+
+class async_chat (asyncore.dispatcher):
+ ac_in_buffer_size = ... # type: int
+ ac_out_buffer_size = ... # type: int
+ def __init__(self, sock: socket.socket = None, map: asyncore._maptype = None) -> None: ...
+
+ @abstractmethod
+ def collect_incoming_data(self, data: str) -> None: ...
+ @abstractmethod
+ def found_terminator(self) -> None: ...
+ def set_terminator(self, term: Union[str, int, None]) -> None: ...
+ def get_terminator(self) -> Union[str, int, None]: ...
+ def handle_read(self) -> None: ...
+ def handle_write(self) -> None: ...
+ def handle_close(self) -> None: ...
+ def push(self, data: str) -> None: ...
+ def push_with_producer(self, producer: simple_producer) -> None: ...
+ def readable(self) -> bool: ...
+ def writable(self) -> bool: ...
+ def close_when_done(self) -> None: ...
+ def initiate_send(self) -> None: ...
+ def discard_buffers(self) -> None: ...
+
+if sys.version_info < (3, 0, 0):
+ class fifo:
+ def __init__(self, list: Sequence[Union[str, simple_producer]] = ...) -> None: ...
+ def __len__(self) -> int: ...
+ def is_empty(self) -> bool: ...
+ def first(self) -> str: ...
+ def push(self, data: Union[str, simple_producer]) -> None: ...
+ def pop(self) -> Tuple[int, str]: ...
diff --git a/typeshed/stdlib/2and3/asyncore.pyi b/typeshed/stdlib/2and3/asyncore.pyi
new file mode 100644
index 0000000..c7bf793
--- /dev/null
+++ b/typeshed/stdlib/2and3/asyncore.pyi
@@ -0,0 +1,132 @@
+from typing import Tuple, Union, Optional, Any, Dict, overload
+
+import os
+import select
+import socket
+import sys
+import time
+import warnings
+
+from errno import (EALREADY, EINPROGRESS, EWOULDBLOCK, ECONNRESET, EINVAL,
+ ENOTCONN, ESHUTDOWN, EINTR, EISCONN, EBADF, ECONNABORTED,
+ EPIPE, EAGAIN, errorcode)
+
+# cyclic dependence with asynchat
+_maptype = Dict[str, Any]
+
+
+class ExitNow(Exception): pass
+
+def read(obj: Any) -> None: ...
+def write(obj: Any) -> None: ...
+def readwrite(obj: Any, flags: int) -> None: ...
+def poll(timeout: float = ..., map: _maptype = ...) -> None: ...
+def poll2(timeout: float = ..., map: _maptype = ...) -> None: ...
+
+poll3 = poll2
+
+def loop(timeout: float = ..., use_poll: bool = ..., map: _maptype = ..., count: int = None) -> None: ...
+
+
+# Not really subclass of socket.socket; it's only delegation.
+# It is not covariant to it.
+class dispatcher:
+
+ debug = ... # type: bool
+ connected = ... # type: bool
+ accepting = ... # type: bool
+ connecting = ... # type: bool
+ closing = ... # type: bool
+ ignore_log_types = ... # type: frozenset[str]
+
+ def __init__(self, sock: socket.socket = None, map: _maptype = ...) -> None: ...
+ def add_channel(self, map: _maptype = ...) -> None: ...
+ def del_channel(self, map: _maptype = ...) -> None: ...
+ def create_socket(self, family: int, type: int) -> None: ...
+ def set_socket(self, sock: socket.socket, map: _maptype = ...) -> None: ...
+ def set_reuse_addr(self) -> None: ...
+ def readable(self) -> bool: ...
+ def writable(self) -> bool: ...
+ def accept(self) -> Optional[Tuple[socket.socket, Any]]: ...
+ def recv(self, buffer_size: int) -> str: ...
+ def log(self, message: Any) -> None: ...
+
+ def log_info(self, message: Any, type: str = ...) -> None: ...
+ def handle_read_event(self) -> None: ...
+ def handle_connect_event(self) -> None: ...
+ def handle_write_event(self) -> None: ...
+ def handle_expt_event(self) -> None: ...
+ def handle_error(self) -> None: ...
+ def handle_expt(self) -> None: ...
+ def handle_read(self) -> None: ...
+ def handle_write(self) -> None: ...
+ def handle_connect(self) -> None: ...
+ def handle_accept(self) -> None: ...
+ def handle_close(self) -> None: ...
+ def detach(self) -> int: ...
+ def fileno(self) -> int: ...
+
+ # return value is an address
+ def getpeername(self) -> Any: ...
+ def getsockname(self) -> Any: ...
+
+ @overload
+ def getsockopt(self, level: int, optname: int) -> int: ...
+ @overload
+ def getsockopt(self, level: int, optname: int, buflen: int) -> bytes: ...
+
+ def gettimeout(self) -> float: ...
+ def ioctl(self, control: object,
+ option: Tuple[int, int, int]) -> None: ...
+ def listen(self, backlog: int) -> None: ...
+ # TODO the return value may be BinaryIO or TextIO, depending on mode
+ def makefile(self, mode: str = ..., buffering: int = ...,
+ encoding: str = ..., errors: str = ...,
+ newline: str = ...) -> Any:
+ ...
+
+ # return type is an address
+ def recvfrom(self, bufsize: int, flags: int = ...) -> Any: ...
+ def recvfrom_into(self, buffer: str, nbytes: int, flags: int = ...) -> Any: ...
+ def recv_into(self, buffer: str, nbytes: int, flags: int = ...) -> Any: ...
+ def send(self, data: str, flags: int = ...) -> Optional[int]: ...
+ def sendall(self, data: str, flags: int = ...) -> None: ...
+ def sendto(self, data: str, address: Union[tuple, str], flags: int = ...) -> int: ...
+ def setblocking(self, flag: bool) -> None: ...
+ def settimeout(self, value: Union[float, None]) -> None: ...
+ def setsockopt(self, level: int, optname: int, value: Union[int, str]) -> None: ...
+ def shutdown(self, how: int) -> None: ...
+
+class dispatcher_with_send(dispatcher):
+ def __init__(self, sock: socket.socket = ..., map: _maptype = ...) -> None: ...
+ def initiate_send(self) -> None: ...
+ def handle_write(self) -> None: ...
+ # incompatible signature:
+ # def send(self, data: str) -> Optional[int]: ...
+
+def compact_traceback() -> Tuple[Tuple[str, str, str], type, type, str]: ...
+def close_all(map: _maptype = ..., ignore_all: bool = ...) -> None: ...
+
+# if os.name == 'posix':
+# import fcntl
+class file_wrapper:
+ fd = ... # type: int
+
+ def __init__(self, fd: int) -> None: ...
+ def recv(self, bufsize: int, flags: int = ...) -> str: ...
+ def send(self, data: str, flags: int = ...) -> int: ...
+
+ @overload
+ def getsockopt(self, level: int, optname: int) -> int: ...
+ @overload
+ def getsockopt(self, level: int, optname: int, buflen: int) -> bytes: ...
+
+ def read(self, bufsize: int, flags: int = ...) -> str: ...
+ def write(self, data: str, flags: int = ...) -> int: ...
+
+ def close(self) -> None: ...
+ def fileno(self) -> int: ...
+
+class file_dispatcher(dispatcher):
+ def __init__(self, fd: int, map: _maptype = ...) -> None: ...
+ def set_file(self, fd: int) -> None: ...
diff --git a/typeshed/stdlib/2and3/bisect.pyi b/typeshed/stdlib/2and3/bisect.pyi
new file mode 100644
index 0000000..5c54112
--- /dev/null
+++ b/typeshed/stdlib/2and3/bisect.pyi
@@ -0,0 +1,22 @@
+# Stubs for bisect
+
+from typing import Any, Sequence, TypeVar
+
+_T = TypeVar('_T')
+
+# TODO uncomment when mypy# 2035 is fixed
+# def bisect_left(a: Sequence[_T], x: _T, lo: int = ..., hi: int = ...) -> int: ...
+# def bisect_right(a: Sequence[_T], x: _T, lo: int = ..., hi: int = ...) -> int: ...
+# def bisect(a: Sequence[_T], x: _T, lo: int = ..., hi: int = ...) -> int: ...
+#
+# def insort_left(a: Sequence[_T], x: _T, lo: int = ..., hi: int = ...) -> int: ...
+# def insort_right(a: Sequence[_T], x: _T, lo: int = ..., hi: int = ...) -> int: ...
+# def insort(a: Sequence[_T], x: _T, lo: int = ..., hi: int = ...) -> int: ...
+
+def bisect_left(a: Sequence, x: Any, lo: int = ..., hi: int = ...) -> int: ...
+def bisect_right(a: Sequence, x: Any, lo: int = ..., hi: int = ...) -> int: ...
+def bisect(a: Sequence, x: Any, lo: int = ..., hi: int = ...) -> int: ...
+
+def insort_left(a: Sequence, x: Any, lo: int = ..., hi: int = ...) -> int: ...
+def insort_right(a: Sequence, x: Any, lo: int = ..., hi: int = ...) -> int: ...
+def insort(a: Sequence, x: Any, lo: int = ..., hi: int = ...) -> int: ...
diff --git a/typeshed/stdlib/2and3/bz2.pyi b/typeshed/stdlib/2and3/bz2.pyi
new file mode 100644
index 0000000..e7cdab5
--- /dev/null
+++ b/typeshed/stdlib/2and3/bz2.pyi
@@ -0,0 +1,33 @@
+# Stubs for bz2
+
+from typing import Any, BinaryIO, TextIO, IO, Union
+
+def compress(data: bytes, compresslevel: int = ...) -> bytes: ...
+def decompress(data: bytes) -> bytes: ...
+
+def open(filename: Union[str, bytes, IO[Any]],
+ mode: str = 'rb',
+ encoding: str = None,
+ errors: str = None,
+ newline: str = None) -> IO[Any]: ...
+
+class BZ2File(BinaryIO):
+ def __init__(self,
+ filename: Union[str, bytes, IO[Any]],
+ mode: str = "r",
+ buffering: Any = None,
+ compresslevel: int = 9) -> None: ...
+
+class BZ2Compressor(object):
+ def __init__(self, compresslevel: int = 9) -> None: ...
+ def compress(self, data: bytes) -> bytes: ...
+ def flush(self) -> bytes: ...
+
+class BZ2Decompressor(object):
+ def decompress(self, data: bytes) -> bytes: ...
+ @property
+ def eof(self) -> bool: ...
+ @property
+ def needs_input(self) -> bool: ...
+ @property
+ def unused_data(self) -> bytes: ...
diff --git a/typeshed/stdlib/2and3/cProfile.pyi b/typeshed/stdlib/2and3/cProfile.pyi
new file mode 100644
index 0000000..b31ea03
--- /dev/null
+++ b/typeshed/stdlib/2and3/cProfile.pyi
@@ -0,0 +1,18 @@
+from typing import Any, Callable, Dict, Optional, TypeVar
+
+def run(statement: str, filename: Optional[str] = ..., sort: int = ...) -> None: ...
+def runctx(statement: str, globals: Dict[str, Any], locals: Dict[str, Any], filename: Optional[str] = ..., sort: int = ...) -> None: ...
+
+_SelfT = TypeVar('_SelfT', bound='Profile')
+_T = TypeVar('_T')
+
+class Profile:
+ def __init__(self, custom_timer: Callable[[], float] = ..., time_unit: float = ..., subcalls: bool = ..., builtins: bool = ...) -> None: ...
+ def enable(self) -> None: ...
+ def disable(self) -> None: ...
+ def print_stats(self, sort: int = ...) -> None: ...
+ def dump_stats(self, file: str) -> None: ...
+ def create_stats(self) -> None: ...
+ def run(self: _SelfT, cmd: str) -> _SelfT: ...
+ def runctx(self: _SelfT, cmd: str, globals: Dict[str, Any], locals: Dict[str, Any]) -> _SelfT: ...
+ def runcall(self, func: Callable[..., _T], *args: Any, **kw: Any) -> _T: ...
diff --git a/typeshed/stdlib/2and3/cmath.pyi b/typeshed/stdlib/2and3/cmath.pyi
new file mode 100644
index 0000000..ada931c
--- /dev/null
+++ b/typeshed/stdlib/2and3/cmath.pyi
@@ -0,0 +1,34 @@
+"""Stub file for the 'cmath' module."""
+
+import sys
+from typing import Union, Tuple
+
+e = ... # type: float
+pi = ... # type: float
+
+_C = Union[float, complex]
+
+def acos(x: _C) -> complex: ...
+def acosh(x: _C) -> complex: ...
+def asin(x: _C) -> complex: ...
+def asinh(x: _C) -> complex: ...
+def atan(x: _C) -> complex: ...
+def atanh(x: _C) -> complex: ...
+def cos(x: _C) -> complex: ...
+def cosh(x: _C) -> complex: ...
+def exp(x: _C) -> complex: ...
+def isinf(z: _C) -> bool: ...
+def isnan(z: _C) -> bool: ...
+def log(x: _C, base: _C = ...) -> complex: ...
+def log10(x: _C) -> complex: ...
+def phase(z: _C) -> float: ...
+def polar(z: _C) -> Tuple[float, float]: ...
+def rect(r: float, phi: float) -> complex: ...
+def sin(x: _C) -> complex: ...
+def sinh(x: _C) -> complex: ...
+def sqrt(x: _C) -> complex: ...
+def tan(x: _C) -> complex: ...
+def tanh(x: _C) -> complex: ...
+
+if sys.version_info >= (3,):
+ def isfinite(z: _C) -> bool: ...
diff --git a/typeshed/stdlib/2and3/code.pyi b/typeshed/stdlib/2and3/code.pyi
new file mode 100644
index 0000000..e775851
--- /dev/null
+++ b/typeshed/stdlib/2and3/code.pyi
@@ -0,0 +1,27 @@
+# Stubs for code
+
+from typing import Any, Callable, Mapping, Optional
+from types import CodeType
+
+class InteractiveInterpreter:
+ def __init__(self, locals: Optional[Mapping[str, Any]] = ...) -> None: ...
+ def runsource(self, source: str, filename: str = ...,
+ symbol: str = ...) -> bool: ...
+ def runcode(self, code: CodeType) -> None: ...
+ def showsyntaxerror(self, filename: Optional[str] = ...) -> None: ...
+ def showtraceback(self) -> None: ...
+ def write(self, data: str) -> None: ...
+
+class InteractiveConsole(InteractiveInterpreter):
+ def __init__(self, locals: Optional[Mapping[str, Any]] = ...,
+ filename: str = ...) -> None: ...
+ def interact(self, banner: Optional[str] = ...) -> None: ...
+ def push(self, line: str) -> bool: ...
+ def resetbuffer(self) -> None: ...
+ def raw_input(self, prompt: str = ...) -> str: ...
+
+def interact(banner: Optional[str] = ...,
+ readfunc: Optional[Callable[[str], str]] = ...,
+ local: Optional[Mapping[str, Any]] = ...) -> None: ...
+def compile_command(source: str, filename: str = ...,
+ symbol: str = ...) -> Optional[CodeType]: ...
diff --git a/typeshed/stdlib/2and3/colorsys.pyi b/typeshed/stdlib/2and3/colorsys.pyi
new file mode 100644
index 0000000..ee17ba9
--- /dev/null
+++ b/typeshed/stdlib/2and3/colorsys.pyi
@@ -0,0 +1,15 @@
+# Stubs for colorsys
+
+from typing import Tuple
+
+def rgb_to_yiq(r: float, g: float, b: float) -> Tuple[float, float, float]: ...
+def yiq_to_rgb(y: float, i: float, q: float) -> Tuple[float, float, float]: ...
+def rgb_to_hls(r: float, g: float, b: float) -> Tuple[float, float, float]: ...
+def hls_to_rgb(h: float, l: float, s: float) -> Tuple[float, float, float]: ...
+def rgb_to_hsv(r: float, g: float, b: float) -> Tuple[float, float, float]: ...
+def hsv_to_rgb(h: float, s: float, v: float) -> Tuple[float, float, float]: ...
+
+# TODO undocumented
+ONE_SIXTH = ... # type: float
+ONE_THIRD = ... # type: float
+TWO_THIRD = ... # type: float
diff --git a/typeshed/stdlib/2and3/contextlib.pyi b/typeshed/stdlib/2and3/contextlib.pyi
new file mode 100644
index 0000000..0f14afa
--- /dev/null
+++ b/typeshed/stdlib/2and3/contextlib.pyi
@@ -0,0 +1,53 @@
+# Stubs for contextlib
+
+from typing import (
+ Any, Callable, Generator, IO, Iterable, Iterator, Optional, Type,
+ Generic, TypeVar,
+)
+from types import TracebackType
+import sys
+
+_T = TypeVar('_T')
+_ExitFunc = Callable[[Optional[Type[BaseException]],
+ Optional[Exception],
+ Optional[TracebackType]], bool]
+_CM_EF = TypeVar('_CM_EF', ContextManager, _ExitFunc)
+
+# TODO already in PEP, have to get added to mypy
+class ContextManager(Generic[_T]):
+ def __enter__(self) -> _T: ...
+ def __exit__(self, exc_type: Optional[Type[BaseException]],
+ exc_val: Optional[Exception],
+ exc_tb: Optional[TracebackType]) -> bool: ...
+
+def contextmanager(func: Callable[..., Iterator[_T]]) -> Callable[..., ContextManager[_T]]: ...
+
+if sys.version_info < (3,):
+ def nested(*mgr: ContextManager[Any]) -> ContextManager[Iterable[Any]]: ...
+
+class closing(Generic[_T], ContextManager[_T]):
+ def __init__(self, thing: _T) -> None: ...
+
+if sys.version_info >= (3, 4):
+ class suppress(ContextManager[None]):
+ def __init__(self, *exceptions: Type[BaseException]) -> None: ...
+
+ class redirect_stdout(ContextManager[None]):
+ def __init__(self, new_target: IO[str]) -> None: ...
+
+if sys.version_info >= (3, 5):
+ class redirect_stderr(ContextManager[None]):
+ def __init__(self, new_target: IO[str]) -> None: ...
+
+if sys.version_info >= (3,):
+ class ContextDecorator:
+ def __call__(self, func: Callable[..., None]) -> Callable[..., ContextManager[None]]: ...
+
+ class ExitStack(ContextManager[ExitStack]):
+ def __init__(self) -> None: ...
+ def enter_context(self, cm: ContextManager[_T]) -> _T: ...
+ def push(self, exit: _CM_EF) -> _CM_EF: ...
+ def callback(self, callback: Callable[..., None],
+ *args: Any, **kwds: Any) -> Callable[..., None]: ...
+ def pop_all(self) -> ExitStack: ...
+ def close(self) -> None: ...
diff --git a/test-data/stdlib-samples/3.2/test/__init__.py b/typeshed/stdlib/2and3/distutils/__init__.pyi
similarity index 100%
rename from test-data/stdlib-samples/3.2/test/__init__.py
rename to typeshed/stdlib/2and3/distutils/__init__.pyi
diff --git a/typeshed/stdlib/2and3/distutils/archive_util.pyi b/typeshed/stdlib/2and3/distutils/archive_util.pyi
new file mode 100644
index 0000000..12172f3
--- /dev/null
+++ b/typeshed/stdlib/2and3/distutils/archive_util.pyi
@@ -0,0 +1,12 @@
+# Stubs for distutils.archive_util
+
+from typing import Optional
+
+
+def make_archive(base_name: str, format: str, root_dir: Optional[str] = ...,
+ base_dir: Optional[str] = ..., verbose: int = ...,
+ dry_run: int = ...) -> str: ...
+def make_tarball(base_name: str, base_dir: str, compress: Optional[str] = ...,
+ verbose: int = ..., dry_run: int = ...) -> str: ...
+def make_zipfile(base_name: str, base_dir: str, verbose: int = ...,
+ dry_run: int = ...) -> str: ...
diff --git a/typeshed/stdlib/2and3/distutils/bcppcompiler.pyi b/typeshed/stdlib/2and3/distutils/bcppcompiler.pyi
new file mode 100644
index 0000000..9f27a0a
--- /dev/null
+++ b/typeshed/stdlib/2and3/distutils/bcppcompiler.pyi
@@ -0,0 +1,6 @@
+# Stubs for distutils.bcppcompiler
+
+from distutils.ccompiler import CCompiler
+
+
+class BCPPCompiler(CCompiler): ...
diff --git a/typeshed/stdlib/2and3/distutils/ccompiler.pyi b/typeshed/stdlib/2and3/distutils/ccompiler.pyi
new file mode 100644
index 0000000..94fad8b
--- /dev/null
+++ b/typeshed/stdlib/2and3/distutils/ccompiler.pyi
@@ -0,0 +1,119 @@
+# Stubs for distutils.ccompiler
+
+from typing import Any, Callable, List, Optional, Tuple, Union
+
+
+_Macro = Union[Tuple[str], Tuple[str, str]]
+
+
+def gen_lib_options(compiler: CCompiler, library_dirs: List[str],
+ runtime_library_dirs: List[str],
+ libraries: List[str]) -> List[str]: ...
+def gen_preprocess_options(macros: List[_Macro],
+ include_dirs: List[str]) -> List[str]: ...
+def get_default_compiler(osname: Optional[str] = ...,
+ platform: Optional[str] = ...) -> str: ...
+def new_compiler(plat: Optional[str] = ..., compiler: Optional[str] = ...,
+ verbose: int = ..., dry_run: int = ...,
+ force: int = ...) -> CCompiler: ...
+def show_compilers() -> None: ...
+
+class CCompiler:
+ def __init__(self, verbose: int = ..., dry_run: int = ...,
+ force: int = ...) -> None: ...
+ def add_include_dir(self, dir: str) -> None: ...
+ def set_include_dirs(self, dirs: List[str]) -> None: ...
+ def add_library(self, libname: str) -> None: ...
+ def set_libraries(self, libnames: List[str]) -> None: ...
+ def add_library_dir(self, dir: str) -> None: ...
+ def set_library_dirs(self, dirs: List[str]) -> None: ...
+ def add_runtime_library_dir(self, dir: str) -> None: ...
+ def set_runtime_library_dirs(self, dirs: List[str]) -> None: ...
+ def define_macro(self, name: str, value: Optional[str] = ...) -> None: ...
+ def undefine_macro(self, name: str) -> None: ...
+ def add_link_object(self, object: str) -> None: ...
+ def set_link_objects(self, objects: List[str]) -> None: ...
+ def detect_language(self, sources: Union[str, List[str]]) -> Optional[str]: ...
+ def find_library_file(self, dirs: List[str], lib: str,
+ debug: bool = ...) -> Optional[str]: ...
+ def has_function(self, funcname: str, includes: Optional[List[str]] = ...,
+ include_dirs: Optional[List[str]] = ...,
+ libraries: Optional[List[str]] = ...,
+ library_dirs: Optional[List[str]] = ...) -> bool: ...
+ def library_dir_option(self, dir: str) -> str: ...
+ def library_option(self, lib: str) -> str: ...
+ def runtime_library_dir_option(self, dir: str) -> str: ...
+ def set_executables(self, **args: str) -> None: ...
+ def compile(self, sources: List[str], output_dir: Optional[str] = ...,
+ macros: Optional[_Macro] = ...,
+ include_dirs: Optional[List[str]] = ..., debug: bool = ...,
+ extra_preargs: Optional[List[str]] = ...,
+ extra_postargs: Optional[List[str]] = ...,
+ depends: Optional[List[str]] = ...) -> List[str]: ...
+ def create_static_lib(self, objects: List[str], output_libname: str,
+ output_dir: Optional[str] = ..., debug: bool = ...,
+ target_lang: Optional[str] = ...) -> None: ...
+ def link(self, target_desc: str, objects: List[str], output_filename: str,
+ output_dir: Optional[str] = ...,
+ libraries: Optional[List[str]] = ...,
+ library_dirs: Optional[List[str]] = ...,
+ runtime_library_dirs: Optional[List[str]] = ...,
+ export_symbols: Optional[List[str]] = ..., debug: bool = ...,
+ extra_preargs: Optional[List[str]] = ...,
+ extra_postargs: Optional[List[str]] = ...,
+ build_temp: Optional[str] = ...,
+ target_lang: Optional[str] = ...) -> None: ...
+ def link_executable(self, objects: List[str], output_progname: str,
+ output_dir: Optional[str] = ...,
+ libraries: Optional[List[str]] = ...,
+ library_dirs: Optional[List[str]] = ...,
+ runtime_library_dirs: Optional[List[str]] = ...,
+ debug: bool = ...,
+ extra_preargs: Optional[List[str]] = ...,
+ extra_postargs: Optional[List[str]] = ...,
+ target_lang: Optional[str] = ...) -> None: ...
+ def link_shared_lib(self, objects: List[str], output_libname: str,
+ output_dir: Optional[str] = ...,
+ libraries: Optional[List[str]] = ...,
+ library_dirs: Optional[List[str]] = ...,
+ runtime_library_dirs: Optional[List[str]] = ...,
+ export_symbols: Optional[List[str]] = ...,
+ debug: bool = ...,
+ extra_preargs: Optional[List[str]] = ...,
+ extra_postargs: Optional[List[str]] = ...,
+ build_temp: Optional[str] = ...,
+ target_lang: Optional[str] = ...) -> None: ...
+ def link_shared_object(self, objects: List[str], output_filename: str,
+ output_dir: Optional[str] = ...,
+ libraries: Optional[List[str]] = ...,
+ library_dirs: Optional[List[str]] = ...,
+ runtime_library_dirs: Optional[List[str]] = ...,
+ export_symbols: Optional[List[str]] = ...,
+ debug: bool = ...,
+ extra_preargs: Optional[List[str]] = ...,
+ extra_postargs: Optional[List[str]] = ...,
+ build_temp: Optional[str] = ...,
+ target_lang: Optional[str] = ...) -> None: ...
+ def preprocess(self, source: str, output_file: Optional[str] = ...,
+ macros: Optional[List[_Macro]] = ...,
+ include_dirs: Optional[List[str]] = ...,
+ extra_preargs: Optional[List[str]] = ...,
+ extra_postargs: Optional[List[str]] = ...) -> None: ...
+ def executable_filename(self, basename: str, strip_dir: int = ...,
+ output_dir: str = ...) -> str: ...
+ def library_filename(self, libname: str, lib_type: str = ...,
+ strip_dir: int = ...,
+ output_dir: str = ...) -> str: ...
+ def object_filenames(self, source_filenames: List[str],
+ strip_dir: int = ...,
+ output_dir: str = ...) -> List[str]: ...
+ def shared_object_filename(self, basename: str, strip_dir: int = ...,
+ output_dir: str = ...) -> str: ...
+ def execute(self, func: Callable[..., None], args: Tuple[Any, ...],
+ msg: Optional[str] = ..., level: int = ...) -> None: ...
+ def spawn(self, cmd: List[str]) -> None: ...
+ def mkpath(self, name: str, mode: int = ...) -> None: ...
+ def move_file(self, src: str, dst: str) -> str: ...
+ def announce(self, msg: str, level: int = ...) -> None: ...
+ def warn(self, msg: str) -> None: ...
+ def debug_print(self, msg: str) -> None: ...
diff --git a/typeshed/stdlib/2and3/distutils/cmd.pyi b/typeshed/stdlib/2and3/distutils/cmd.pyi
new file mode 100644
index 0000000..126ef15
--- /dev/null
+++ b/typeshed/stdlib/2and3/distutils/cmd.pyi
@@ -0,0 +1,15 @@
+# Stubs for distutils.cmd
+
+from typing import Callable, List, Tuple, Union
+from abc import abstractmethod
+from distutils.dist import Distribution
+
+class Command:
+ sub_commands = ... # type: List[Tuple[str, Union[Callable[[], bool], str, None]]]
+ def __init__(self, dist: Distribution) -> None: ...
+ @abstractmethod
+ def initialize_options(self) -> None: ...
+ @abstractmethod
+ def finalize_options(self) -> None: ...
+ @abstractmethod
+ def run(self) -> None: ...
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/2and3/distutils/command/__init__.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/2and3/distutils/command/__init__.pyi
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/2and3/distutils/command/bdist.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/2and3/distutils/command/bdist.pyi
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/2and3/distutils/command/bdist_dumb.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/2and3/distutils/command/bdist_dumb.pyi
diff --git a/typeshed/stdlib/2and3/distutils/command/bdist_msi.pyi b/typeshed/stdlib/2and3/distutils/command/bdist_msi.pyi
new file mode 100644
index 0000000..3813699
--- /dev/null
+++ b/typeshed/stdlib/2and3/distutils/command/bdist_msi.pyi
@@ -0,0 +1,5 @@
+# Stubs for distutils.command.bdist_msi
+
+from distutils.cmd import Command
+
+class bdist_msi(Command): ...
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/2and3/distutils/command/bdist_packager.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/2and3/distutils/command/bdist_packager.pyi
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/2and3/distutils/command/bdist_rpm.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/2and3/distutils/command/bdist_rpm.pyi
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/2and3/distutils/command/bdist_wininst.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/2and3/distutils/command/bdist_wininst.pyi
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/2and3/distutils/command/build.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/2and3/distutils/command/build.pyi
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/2and3/distutils/command/build_clib.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/2and3/distutils/command/build_clib.pyi
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/2and3/distutils/command/build_ext.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/2and3/distutils/command/build_ext.pyi
diff --git a/typeshed/stdlib/2and3/distutils/command/build_py.pyi b/typeshed/stdlib/2and3/distutils/command/build_py.pyi
new file mode 100644
index 0000000..23b3f9e
--- /dev/null
+++ b/typeshed/stdlib/2and3/distutils/command/build_py.pyi
@@ -0,0 +1,8 @@
+# Stubs for distutils.command.bdist_msi
+
+from distutils.cmd import Command
+import sys
+
+if sys.version_info >= (3,):
+ class build_py(Command): ...
+ class build_py_2to3(Command): ...
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/2and3/distutils/command/build_scripts.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/2and3/distutils/command/build_scripts.pyi
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/2and3/distutils/command/check.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/2and3/distutils/command/check.pyi
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/2and3/distutils/command/clean.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/2and3/distutils/command/clean.pyi
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/2and3/distutils/command/config.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/2and3/distutils/command/config.pyi
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/2and3/distutils/command/install.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/2and3/distutils/command/install.pyi
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/2and3/distutils/command/install_data.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/2and3/distutils/command/install_data.pyi
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/2and3/distutils/command/install_headers.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/2and3/distutils/command/install_headers.pyi
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/2and3/distutils/command/install_lib.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/2and3/distutils/command/install_lib.pyi
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/2and3/distutils/command/install_scripts.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/2and3/distutils/command/install_scripts.pyi
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/2and3/distutils/command/register.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/2and3/distutils/command/register.pyi
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/2and3/distutils/command/sdist.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/2and3/distutils/command/sdist.pyi
diff --git a/typeshed/stdlib/2and3/distutils/core.pyi b/typeshed/stdlib/2and3/distutils/core.pyi
new file mode 100644
index 0000000..38d6a1a
--- /dev/null
+++ b/typeshed/stdlib/2and3/distutils/core.pyi
@@ -0,0 +1,35 @@
+# Stubs for distutils.core
+
+from typing import Any, List, Mapping, Optional, Tuple, Type, Union
+from distutils.cmd import Command as Command
+from distutils.dist import Distribution as Distribution
+from distutils.extension import Extension as Extension
+
+def setup(name: str = ...,
+ version: str = ...,
+ description: str = ...,
+ long_description: str = ...,
+ author: str = ...,
+ author_email: str = ...,
+ maintainer: str = ...,
+ maintainer_email: str = ...,
+ url: str = ...,
+ download_url: str = ...,
+ packages: List[str] = ...,
+ py_modules: List[str] = ...,
+ scripts: List[str] = ...,
+ ext_modules: List[Extension] = ...,
+ classifiers: List[str] = ...,
+ distclass: Type[Distribution] = ...,
+ script_name: str = ...,
+ script_args: List[str] = ...,
+ options: Mapping[str, Any] = ...,
+ license: str = ...,
+ keywords: Union[List[str], str] = ...,
+ platforms: Union[List[str], str] = ...,
+ cmdclass: Mapping[str, Command] = ...,
+ data_files: List[Tuple[str, List[str]]] = ...,
+ package_dir: Mapping[str, str] = ...) -> None: ...
+def run_setup(script_name: str,
+ script_args: Optional[List[str]] = ...,
+ stop_after: str = ...) -> Distribution: ...
diff --git a/typeshed/stdlib/2and3/distutils/cygwinccompiler.pyi b/typeshed/stdlib/2and3/distutils/cygwinccompiler.pyi
new file mode 100644
index 0000000..1bfab90
--- /dev/null
+++ b/typeshed/stdlib/2and3/distutils/cygwinccompiler.pyi
@@ -0,0 +1,7 @@
+# Stubs for distutils.cygwinccompiler
+
+from distutils.unixccompiler import UnixCCompiler
+
+
+class CygwinCCompiler(UnixCCompiler): ...
+class Mingw32CCompiler(CygwinCCompiler): ...
diff --git a/typeshed/stdlib/2and3/distutils/debug.pyi b/typeshed/stdlib/2and3/distutils/debug.pyi
new file mode 100644
index 0000000..c3a1849
--- /dev/null
+++ b/typeshed/stdlib/2and3/distutils/debug.pyi
@@ -0,0 +1,3 @@
+# Stubs for distutils.debug
+
+DEBUG = ... # type: bool
diff --git a/typeshed/stdlib/2and3/distutils/dep_util.pyi b/typeshed/stdlib/2and3/distutils/dep_util.pyi
new file mode 100644
index 0000000..7df5847
--- /dev/null
+++ b/typeshed/stdlib/2and3/distutils/dep_util.pyi
@@ -0,0 +1,8 @@
+# Stubs for distutils.dep_util
+
+from typing import List, Tuple
+
+def newer(source: str, target: str) -> bool: ...
+def newer_pairwise(sources: List[str],
+ targets: List[str]) -> List[Tuple[str, str]]: ...
+def newer_group(sources: List[str], target: str, missing: str = ...) -> bool: ...
diff --git a/typeshed/stdlib/2and3/distutils/dir_util.pyi b/typeshed/stdlib/2and3/distutils/dir_util.pyi
new file mode 100644
index 0000000..667ac2f
--- /dev/null
+++ b/typeshed/stdlib/2and3/distutils/dir_util.pyi
@@ -0,0 +1,15 @@
+# Stubs for distutils.dir_util
+
+from typing import List
+
+
+def mkpath(name: str, mode: int = ..., verbose: int = ...,
+ dry_run: int = ...) -> List[str]: ...
+def create_tree(base_dir: str, files: List[str], mode: int = ...,
+ verbose: int = ..., dry_run: int = ...) -> None: ...
+def copy_tree(src: str, dst: str, preserve_mode: int = ...,
+ preserve_times: int = ..., preserve_symlinks: int = ...,
+ update: int = ..., verbose: int = ...,
+ dry_run: int = ...) -> List[str]: ...
+def remove_tree(directory: str, verbose: int = ...,
+ dry_run: int = ...) -> None: ...
diff --git a/typeshed/stdlib/2and3/distutils/dist.pyi b/typeshed/stdlib/2and3/distutils/dist.pyi
new file mode 100644
index 0000000..2d9c162
--- /dev/null
+++ b/typeshed/stdlib/2and3/distutils/dist.pyi
@@ -0,0 +1,7 @@
+# Stubs for distutils.dist
+
+from typing import Any, Mapping, Optional
+
+
+class Distribution:
+ def __init__(self, attrs: Optional[Mapping[str, Any]] = ...) -> None: ...
diff --git a/typeshed/stdlib/2and3/distutils/errors.pyi b/typeshed/stdlib/2and3/distutils/errors.pyi
new file mode 100644
index 0000000..49ca06f
--- /dev/null
+++ b/typeshed/stdlib/2and3/distutils/errors.pyi
@@ -0,0 +1,4 @@
+# Stubs for distutils.errors
+
+class DistutilsExecError(Exception): ...
+class DistutilsFileError(Exception): ...
diff --git a/typeshed/stdlib/2and3/distutils/extension.pyi b/typeshed/stdlib/2and3/distutils/extension.pyi
new file mode 100644
index 0000000..5aa070e
--- /dev/null
+++ b/typeshed/stdlib/2and3/distutils/extension.pyi
@@ -0,0 +1,39 @@
+# Stubs for distutils.extension
+
+from typing import List, Optional, Tuple
+import sys
+
+class Extension:
+ if sys.version_info >= (3,):
+ def __init__(self,
+ name: str,
+ sources: List[str],
+ include_dirs: List[str] = ...,
+ define_macros: List[Tuple[str, Optional[str]]] = ...,
+ undef_macros: List[str] = ...,
+ library_dirs: List[str] = ...,
+ libraries: List[str] = ...,
+ runtime_library_dirs: List[str] = ...,
+ extra_objects: List[str] = ...,
+ extra_compile_args: List[str] = ...,
+ extra_link_args: List[str] = ...,
+ export_symbols: List[str] = ...,
+ depends: List[str] = ...,
+ language: str = ...,
+ optional: bool = ...) -> None: ...
+ else:
+ def __init__(self,
+ name: str,
+ sources: List[str],
+ include_dirs: List[str] = ...,
+ define_macros: List[Tuple[str, Optional[str]]] = ...,
+ undef_macros: List[str] = ...,
+ library_dirs: List[str] = ...,
+ libraries: List[str] = ...,
+ runtime_library_dirs: List[str] = ...,
+ extra_objects: List[str] = ...,
+ extra_compile_args: List[str] = ...,
+ extra_link_args: List[str] = ...,
+ export_symbols: List[str] = ...,
+ depends: List[str] = ...,
+ language: str = ...) -> None: ...
diff --git a/typeshed/stdlib/2and3/distutils/fancy_getopt.pyi b/typeshed/stdlib/2and3/distutils/fancy_getopt.pyi
new file mode 100644
index 0000000..aa7e964
--- /dev/null
+++ b/typeshed/stdlib/2and3/distutils/fancy_getopt.pyi
@@ -0,0 +1,27 @@
+# Stubs for distutils.fancy_getopt
+
+from typing import (
+ Any, List, Mapping, Optional, Tuple, Union,
+ TypeVar, overload,
+)
+
+_Option = Tuple[str, str, str]
+_GR = Tuple[List[str], OptionDummy]
+
+def fancy_getopt(options: List[_Option],
+ negative_opt: Mapping[_Option, _Option],
+ object: Any,
+ args: Optional[List[str]]) -> Union[List[str], _GR]: ...
+def wrap_text(text: str, width: int) -> List[str]: ...
+
+class FancyGetopt:
+ def __init__(self, option_table: Optional[List[_Option]] = ...) -> None: ...
+ # TODO kinda wrong, `getopt(object=object())` is invalid
+ @overload
+ def getopt(self, args: Optional[List[str]] = ...) -> _GR: ...
+ @overload
+ def getopt(self, args: Optional[List[str]], object: Any) -> List[str]: ...
+ def get_option_order(self) -> List[Tuple[str, str]]: ...
+ def generate_help(self, header: Optional[str] = ...) -> List[str]: ...
+
+class OptionDummy: ...
diff --git a/typeshed/stdlib/2and3/distutils/file_util.pyi b/typeshed/stdlib/2and3/distutils/file_util.pyi
new file mode 100644
index 0000000..6324d63
--- /dev/null
+++ b/typeshed/stdlib/2and3/distutils/file_util.pyi
@@ -0,0 +1,12 @@
+# Stubs for distutils.file_util
+
+from typing import Optional, Sequence, Tuple
+
+
+def copy_file(src: str, dst: str, preserve_mode: bool = ...,
+ preserve_times: bool = ..., update: bool = ...,
+ link: Optional[str] = ..., verbose: bool = ...,
+ dry_run: bool = ...) -> Tuple[str, str]: ...
+def move_file(src: str, dst: str, verbose: bool = ...,
+ dry_run: bool = ...) -> str: ...
+def write_file(filename: str, contents: Sequence[str]) -> None: ...
diff --git a/typeshed/stdlib/2and3/distutils/filelist.pyi b/typeshed/stdlib/2and3/distutils/filelist.pyi
new file mode 100644
index 0000000..4ecaeba
--- /dev/null
+++ b/typeshed/stdlib/2and3/distutils/filelist.pyi
@@ -0,0 +1,3 @@
+# Stubs for distutils.filelist
+
+class FileList: ...
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/2and3/distutils/log.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/2and3/distutils/log.pyi
diff --git a/typeshed/stdlib/2and3/distutils/msvccompiler.pyi b/typeshed/stdlib/2and3/distutils/msvccompiler.pyi
new file mode 100644
index 0000000..ffc9e44
--- /dev/null
+++ b/typeshed/stdlib/2and3/distutils/msvccompiler.pyi
@@ -0,0 +1,6 @@
+# Stubs for distutils.msvccompiler
+
+from distutils.ccompiler import CCompiler
+
+
+class MSVCCompiler(CCompiler): ...
diff --git a/typeshed/stdlib/2and3/distutils/spawn.pyi b/typeshed/stdlib/2and3/distutils/spawn.pyi
new file mode 100644
index 0000000..8df9eba
--- /dev/null
+++ b/typeshed/stdlib/2and3/distutils/spawn.pyi
@@ -0,0 +1,8 @@
+# Stubs for distutils.spawn
+
+from typing import List, Optional
+
+def spawn(cmd: List[str], search_path: bool = ...,
+ verbose: bool = ..., dry_run: bool = ...) -> None: ...
+def find_executable(executable: str,
+ path: Optional[str] = ...) -> Optional[str]: ...
diff --git a/typeshed/stdlib/2and3/distutils/sysconfig.pyi b/typeshed/stdlib/2and3/distutils/sysconfig.pyi
new file mode 100644
index 0000000..f87cd46
--- /dev/null
+++ b/typeshed/stdlib/2and3/distutils/sysconfig.pyi
@@ -0,0 +1,19 @@
+# Stubs for distutils.sysconfig
+
+from typing import Mapping, Optional, Union
+from distutils.ccompiler import CCompiler
+
+PREFIX = ... # type: str
+EXEC_PREFIX = ... # type: str
+
+def get_config_var(name: str) -> Union[int, str, None]: ...
+def get_config_vars(*args: str) -> Mapping[str, Union[int, str]]: ...
+def get_config_h_filename() -> str: ...
+def get_makefile_filename() -> str: ...
+def get_python_inc(plat_specific: bool = ...,
+ prefix: Optional[str] = ...) -> str: ...
+def get_python_lib(plat_specific: bool = ..., standard_lib: bool = ...,
+ prefix: Optional[str] = ...) -> str: ...
+
+def customize_compiler(compiler: CCompiler) -> None: ...
+def set_python_build() -> None: ...
diff --git a/typeshed/stdlib/2and3/distutils/text_file.pyi b/typeshed/stdlib/2and3/distutils/text_file.pyi
new file mode 100644
index 0000000..8f90d41
--- /dev/null
+++ b/typeshed/stdlib/2and3/distutils/text_file.pyi
@@ -0,0 +1,18 @@
+# Stubs for distutils.text_file
+
+from typing import IO, List, Optional, Tuple, Union
+
+class TextFile:
+ def __init__(self, filename: Optional[str] = ...,
+ file: Optional[IO[str]] = ...,
+ *, strip_comments: bool = ...,
+ lstrip_ws: bool = ..., rstrip_ws: bool = ...,
+ skip_blanks: bool = ..., join_lines: bool = ...,
+ collapse_join: bool = ...) -> None: ...
+ def open(self, filename: str) -> None: ...
+ def close(self) -> None: ...
+ def warn(self, msg: str,
+ line: Union[List[int], Tuple[int, int], int] = ...) -> None: ...
+ def readline(self) -> Optional[str]: ...
+ def readlines(self) -> List[str]: ...
+ def unreadline(self, line: str) -> str: ...
diff --git a/typeshed/stdlib/2and3/distutils/unixccompiler.pyi b/typeshed/stdlib/2and3/distutils/unixccompiler.pyi
new file mode 100644
index 0000000..7ab7298
--- /dev/null
+++ b/typeshed/stdlib/2and3/distutils/unixccompiler.pyi
@@ -0,0 +1,6 @@
+# Stubs for distutils.unixccompiler
+
+from distutils.ccompiler import CCompiler
+
+
+class UnixCCompiler(CCompiler): ...
diff --git a/typeshed/stdlib/2and3/distutils/util.pyi b/typeshed/stdlib/2and3/distutils/util.pyi
new file mode 100644
index 0000000..942886d
--- /dev/null
+++ b/typeshed/stdlib/2and3/distutils/util.pyi
@@ -0,0 +1,20 @@
+# Stubs for distutils.util
+
+from typing import Any, Callable, List, Mapping, Optional, Tuple
+
+
+def get_platform() -> str: ...
+def convert_path(pathname: str) -> str: ...
+def change_root(new_root: str, pathname: str) -> str: ...
+def check_environ() -> None: ...
+def subst_vars(s: str, local_vars: Mapping[str, str]) -> None: ...
+def split_quoted(s: str) -> List[str]: ...
+def execute(func: Callable[..., None], args: Tuple[Any, ...],
+ msg: Optional[str] = ..., verbose: bool = ...,
+ dry_run: bool = ...) -> None: ...
+def strtobool(val: str) -> bool: ...
+def byte_compile(py_files: List[str], optimize: int = ..., force: bool = ...,
+ prefix: Optional[str] = ..., base_dir: Optional[str] = ...,
+ verbose: bool = ..., dry_run: bool = ...,
+ direct: Optional[bool] = ...) -> None: ...
+def rfc822_escape(header: str) -> str: ...
diff --git a/typeshed/stdlib/2and3/distutils/version.pyi b/typeshed/stdlib/2and3/distutils/version.pyi
new file mode 100644
index 0000000..6b6efbf
--- /dev/null
+++ b/typeshed/stdlib/2and3/distutils/version.pyi
@@ -0,0 +1,35 @@
+# Stubs for distutils.version (Python 2 and 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+import sys
+from typing import Any
+
+class Version:
+ def __init__(self, vstring=None): ...
+
+ if sys.version_info >= (3,):
+ def __eq__(self, other): ...
+ def __lt__(self, other): ...
+ def __le__(self, other): ...
+ def __gt__(self, other): ...
+ def __ge__(self, other): ...
+
+class StrictVersion(Version):
+ version_re = ... # type: Any
+ version = ... # type: Any
+ prerelease = ... # type: Any
+ def parse(self, vstring): ...
+
+ if sys.version_info < (3,):
+ def __cmp__(self, other): ...
+
+class LooseVersion(Version):
+ component_re = ... # type: Any
+ def __init__(self, vstring=None): ...
+ vstring = ... # type: Any
+ version = ... # type: Any
+ def parse(self, vstring): ...
+
+ if sys.version_info < (3,):
+ def __cmp__(self, other): ...
diff --git a/typeshed/stdlib/2and3/errno.pyi b/typeshed/stdlib/2and3/errno.pyi
new file mode 100644
index 0000000..d24f2e4
--- /dev/null
+++ b/typeshed/stdlib/2and3/errno.pyi
@@ -0,0 +1,129 @@
+# Stubs for errno
+
+from typing import Mapping
+import sys
+
+errorcode = ... # type: Mapping[int, str]
+
+EPERM = ... # type: int
+ENOENT = ... # type: int
+ESRCH = ... # type: int
+EINTR = ... # type: int
+EIO = ... # type: int
+ENXIO = ... # type: int
+E2BIG = ... # type: int
+ENOEXEC = ... # type: int
+EBADF = ... # type: int
+ECHILD = ... # type: int
+EAGAIN = ... # type: int
+ENOMEM = ... # type: int
+EACCES = ... # type: int
+EFAULT = ... # type: int
+ENOTBLK = ... # type: int
+EBUSY = ... # type: int
+EEXIST = ... # type: int
+EXDEV = ... # type: int
+ENODEV = ... # type: int
+ENOTDIR = ... # type: int
+EISDIR = ... # type: int
+EINVAL = ... # type: int
+ENFILE = ... # type: int
+EMFILE = ... # type: int
+ENOTTY = ... # type: int
+ETXTBSY = ... # type: int
+EFBIG = ... # type: int
+ENOSPC = ... # type: int
+ESPIPE = ... # type: int
+EROFS = ... # type: int
+EMLINK = ... # type: int
+EPIPE = ... # type: int
+EDOM = ... # type: int
+ERANGE = ... # type: int
+EDEADLCK = ... # type: int
+ENAMETOOLONG = ... # type: int
+ENOLCK = ... # type: int
+ENOSYS = ... # type: int
+ENOTEMPTY = ... # type: int
+ELOOP = ... # type: int
+EWOULDBLOCK = ... # type: int
+ENOMSG = ... # type: int
+EIDRM = ... # type: int
+ECHRNG = ... # type: int
+EL2NSYNC = ... # type: int
+EL3HLT = ... # type: int
+EL3RST = ... # type: int
+ELNRNG = ... # type: int
+EUNATCH = ... # type: int
+ENOCSI = ... # type: int
+EL2HLT = ... # type: int
+EBADE = ... # type: int
+EBADR = ... # type: int
+EXFULL = ... # type: int
+ENOANO = ... # type: int
+EBADRQC = ... # type: int
+EBADSLT = ... # type: int
+EDEADLOCK = ... # type: int
+EBFONT = ... # type: int
+ENOSTR = ... # type: int
+ENODATA = ... # type: int
+ETIME = ... # type: int
+ENOSR = ... # type: int
+ENONET = ... # type: int
+ENOPKG = ... # type: int
+EREMOTE = ... # type: int
+ENOLINK = ... # type: int
+EADV = ... # type: int
+ESRMNT = ... # type: int
+ECOMM = ... # type: int
+EPROTO = ... # type: int
+EMULTIHOP = ... # type: int
+EDOTDOT = ... # type: int
+EBADMSG = ... # type: int
+EOVERFLOW = ... # type: int
+ENOTUNIQ = ... # type: int
+EBADFD = ... # type: int
+EREMCHG = ... # type: int
+ELIBACC = ... # type: int
+ELIBBAD = ... # type: int
+ELIBSCN = ... # type: int
+ELIBMAX = ... # type: int
+ELIBEXEC = ... # type: int
+EILSEQ = ... # type: int
+ERESTART = ... # type: int
+ESTRPIPE = ... # type: int
+EUSERS = ... # type: int
+ENOTSOCK = ... # type: int
+EDESTADDRREQ = ... # type: int
+EMSGSIZE = ... # type: int
+EPROTOTYPE = ... # type: int
+ENOPROTOOPT = ... # type: int
+EPROTONOSUPPORT = ... # type: int
+ESOCKTNOSUPPORT = ... # type: int
+EOPNOTSUPP = ... # type: int
+EPFNOSUPPORT = ... # type: int
+EAFNOSUPPORT = ... # type: int
+EADDRINUSE = ... # type: int
+EADDRNOTAVAIL = ... # type: int
+ENETDOWN = ... # type: int
+ENETUNREACH = ... # type: int
+ENETRESET = ... # type: int
+ECONNABORTED = ... # type: int
+ECONNRESET = ... # type: int
+ENOBUFS = ... # type: int
+EISCONN = ... # type: int
+ENOTCONN = ... # type: int
+ESHUTDOWN = ... # type: int
+ETOOMANYREFS = ... # type: int
+ETIMEDOUT = ... # type: int
+ECONNREFUSED = ... # type: int
+EHOSTDOWN = ... # type: int
+EHOSTUNREACH = ... # type: int
+EALREADY = ... # type: int
+EINPROGRESS = ... # type: int
+ESTALE = ... # type: int
+EUCLEAN = ... # type: int
+ENOTNAM = ... # type: int
+ENAVAIL = ... # type: int
+EISNAM = ... # type: int
+EREMOTEIO = ... # type: int
+EDQUOT = ... # type: int
diff --git a/typeshed/stdlib/2and3/fractions.pyi b/typeshed/stdlib/2and3/fractions.pyi
new file mode 100644
index 0000000..66408fb
--- /dev/null
+++ b/typeshed/stdlib/2and3/fractions.pyi
@@ -0,0 +1,94 @@
+# Stubs for fractions
+# See https://docs.python.org/3/library/fractions.html
+#
+# Note: these stubs are incomplete. The more complex type
+# signatures are currently omitted. Also see numbers.pyi.
+
+from typing import Optional, TypeVar, Union, overload
+from numbers import Real, Integral, Rational
+from decimal import Decimal
+import sys
+
+_ComparableNum = Union[int, float, Decimal, Real]
+
+
+ at overload
+def gcd(a: int, b: int) -> int: ...
+ at overload
+def gcd(a: Integral, b: int) -> Integral: ...
+ at overload
+def gcd(a: int, b: Integral) -> Integral: ...
+ at overload
+def gcd(a: Integral, b: Integral) -> Integral: ...
+
+
+class Fraction(Rational):
+ @overload
+ def __init__(self,
+ numerator: Union[int, Rational] = 0,
+ denominator: Optional[Union[int, Rational]] = 0,
+ *,
+ _normalize: bool = True) -> None: ...
+ @overload
+ def __init__(self, value: float, *, _normalize=True) -> None: ...
+ @overload
+ def __init__(self, value: Decimal, *, _normalize=True) -> None: ...
+ @overload
+ def __init__(self, value: str, *, _normalize=True) -> None: ...
+
+ @classmethod
+ def from_float(cls, f: float) -> 'Fraction': ...
+ @classmethod
+ def from_decimal(cls, dec: Decimal) -> 'Fraction': ...
+ def limit_denominator(self, max_denominator: int = 1000000) -> 'Fraction': ...
+
+ @property
+ def numerator(self) -> int: ...
+ @property
+ def denominator(self) -> int: ...
+
+ def __add__(self, other): ...
+ def __radd__(self, other): ...
+ def __sub__(self, other): ...
+ def __rsub__(self, other): ...
+ def __mul__(self, other): ...
+ def __rmul__(self, other): ...
+ def __truediv__(self, other): ...
+ def __rtruediv__(self, other): ...
+ if sys.version_info < (3, 0):
+ def __div__(self, other): ...
+ def __rdiv__(self, other): ...
+ def __floordiv__(self, other) -> int: ...
+ def __rfloordiv__(self, other) -> int: ...
+ def __mod__(self, other): ...
+ def __rmod__(self, other): ...
+ def __pow__(self, other): ...
+ def __rpow__(self, other): ...
+
+ def __pos__(self) -> 'Fraction': ...
+ def __neg__(self) -> 'Fraction': ...
+ def __abs__(self) -> 'Fraction': ...
+ def __trunc__(self) -> int: ...
+ if sys.version_info >= (3, 0):
+ def __floor__(self) -> int: ...
+ def __ceil__(self) -> int: ...
+ def __round__(self, ndigits=None): ...
+
+ def __hash__(self) -> int: ...
+ def __eq__(self, other: object) -> bool: ...
+ def __lt__(self, other: _ComparableNum) -> bool: ...
+ def __gt__(self, other: _ComparableNum) -> bool: ...
+ def __le__(self, other: _ComparableNum) -> bool: ...
+ def __ge__(self, other: _ComparableNum) -> bool: ...
+ if sys.version_info >= (3, 0):
+ def __bool__(self) -> bool: ...
+ else:
+ def __nonzero__(self) -> bool: ...
+
+ # Not actually defined within fractions.py, but provides more useful
+ # overrides
+ @property
+ def real(self) -> 'Fraction': ...
+ @property
+ def imag(self) -> 'Fraction': ...
+ def conjugate(self) -> 'Fraction': ...
diff --git a/typeshed/stdlib/2and3/hmac.pyi b/typeshed/stdlib/2and3/hmac.pyi
new file mode 100644
index 0000000..59aaf36
--- /dev/null
+++ b/typeshed/stdlib/2and3/hmac.pyi
@@ -0,0 +1,35 @@
+# Stubs for hmac
+
+from typing import Any, Callable, Optional, Union, overload
+from types import ModuleType
+import sys
+
+_B = Union[bytes, bytearray]
+
+# TODO more precise type for object of hashlib
+_Hash = Any
+
+if sys.version_info >= (3, 4):
+ def new(key: _B, msg: Optional[_B] = ...,
+ digestmod: Optional[Union[str, Callable[[], _Hash], ModuleType]] = ...) -> HMAC: ...
+else:
+ def new(key: _B, msg: Optional[_B] = ...,
+ digestmod: Optional[Union[Callable[[], _Hash], ModuleType]] = ...) -> HMAC: ...
+
+class HMAC:
+ if sys.version_info >= (3,):
+ digest_size = ... # type: int
+ if sys.version_info >= (3, 4):
+ block_size = ... # type: int
+ name = ... # type: str
+ def update(self, msg: _B) -> None: ...
+ def digest(self) -> bytes: ...
+ def hexdigest(self) -> str: ...
+ def copy(self) -> HMAC: ...
+
+ at overload
+def compare_digest(a: str, b: str) -> bool: ...
+ at overload
+def compare_digest(a: bytes, b: bytes) -> bool: ...
+ at overload
+def compare_digest(a: bytearray, b: bytearray) -> bool: ...
diff --git a/typeshed/stdlib/2and3/keyword.pyi b/typeshed/stdlib/2and3/keyword.pyi
new file mode 100644
index 0000000..6e0fb5f
--- /dev/null
+++ b/typeshed/stdlib/2and3/keyword.pyi
@@ -0,0 +1,6 @@
+# Stubs for keyword
+
+from typing import Sequence, Text, Union
+
+def iskeyword(s: Union[Text, bytes]) -> bool: ...
+kwlist = ... # type: Sequence[str]
diff --git a/typeshed/stdlib/2and3/locale.pyi b/typeshed/stdlib/2and3/locale.pyi
new file mode 100644
index 0000000..9ad00e7
--- /dev/null
+++ b/typeshed/stdlib/2and3/locale.pyi
@@ -0,0 +1,104 @@
+# Stubs for locale
+
+from typing import Any, Iterable, List, Mapping, Optional, Sequence, Tuple, Union
+import sys
+
+# workaround for mypy#2010
+if sys.version_info < (3,):
+ from __builtin__ import str as _str
+else:
+ from builtins import str as _str
+
+CODESET = ... # type: int
+D_T_FMT = ... # type: int
+D_FMT = ... # type: int
+T_FMT = ... # type: int
+T_FMT_AMPM = ... # type: int
+
+DAY_1 = ... # type: int
+DAY_2 = ... # type: int
+DAY_3 = ... # type: int
+DAY_4 = ... # type: int
+DAY_5 = ... # type: int
+DAY_6 = ... # type: int
+DAY_7 = ... # type: int
+ABDAY_1 = ... # type: int
+ABDAY_2 = ... # type: int
+ABDAY_3 = ... # type: int
+ABDAY_4 = ... # type: int
+ABDAY_5 = ... # type: int
+ABDAY_6 = ... # type: int
+ABDAY_7 = ... # type: int
+
+MON_1 = ... # type: int
+MON_2 = ... # type: int
+MON_3 = ... # type: int
+MON_4 = ... # type: int
+MON_5 = ... # type: int
+MON_6 = ... # type: int
+MON_7 = ... # type: int
+MON_8 = ... # type: int
+MON_9 = ... # type: int
+MON_10 = ... # type: int
+MON_11 = ... # type: int
+MON_12 = ... # type: int
+ABMON_1 = ... # type: int
+ABMON_2 = ... # type: int
+ABMON_3 = ... # type: int
+ABMON_4 = ... # type: int
+ABMON_5 = ... # type: int
+ABMON_6 = ... # type: int
+ABMON_7 = ... # type: int
+ABMON_8 = ... # type: int
+ABMON_9 = ... # type: int
+ABMON_10 = ... # type: int
+ABMON_11 = ... # type: int
+ABMON_12 = ... # type: int
+
+RADIXCHAR = ... # type: int
+THOUSEP = ... # type: int
+YESEXPR = ... # type: int
+NOEXPR = ... # type: int
+CRNCYSTR = ... # type: int
+
+ERA = ... # type: int
+ERA_D_T_FMT = ... # type: int
+ERA_D_FMT = ... # type: int
+ERA_T_FMT = ... # type: int
+
+ALT_DIGITS = ... # type: int
+
+LC_CTYPE = ... # type: int
+LC_COLLATE = ... # type: int
+LC_TIME = ... # type: int
+LC_MONETARY = ... # type: int
+LC_MESSAGES = ... # type: int
+LC_NUMERIC = ... # type: int
+LC_ALL = ... # type: int
+
+CHAR_MAX = ... # type: int
+
+class Error(Exception): ...
+
+def setlocale(category: int,
+ locale: Union[_str, Iterable[_str], None] = ...) -> _str: ...
+def localeconv() -> Mapping[_str, Union[int, _str, List[int]]]: ...
+def nl_langinfo(option: int) -> _str: ...
+def getdefaultlocale(envvars: Tuple[_str] = ...) -> Tuple[Optional[_str], Optional[_str]]: ...
+def getlocale(category: int = ...) -> Sequence[_str]: ...
+def getpreferredencoding(do_setlocale: bool = ...) -> _str: ...
+def normalize(localename: _str) -> _str: ...
+def resetlocale(category: int = ...) -> None: ...
+def strcoll(string1: _str, string2: _str) -> int: ...
+def strxfrm(string: _str) -> _str: ...
+def format(format: _str, val: int, grouping: bool = ...,
+ monetary: bool = ...) -> _str: ...
+def format_string(format: _str, val: Sequence[Any],
+ grouping: bool = ...) -> _str: ...
+def currency(val: int, symbol: bool = ..., grouping: bool = ...,
+ international: bool = ...) -> _str: ...
+if sys.version_info >= (3, 5):
+ def delocalize(string: _str) -> None: ...
+def atof(string: _str) -> float: ...
+def atoi(string: _str) -> int: ...
+def str(float: float) -> _str: ...
diff --git a/typeshed/stdlib/2and3/logging/__init__.pyi b/typeshed/stdlib/2and3/logging/__init__.pyi
new file mode 100644
index 0000000..eb7fcee
--- /dev/null
+++ b/typeshed/stdlib/2and3/logging/__init__.pyi
@@ -0,0 +1,397 @@
+# Stubs for logging (Python 3.4)
+
+from typing import (
+ Any, Callable, Dict, Iterable, Mapping, MutableMapping, Optional, IO,
+ Tuple, Text, Union, overload,
+)
+from string import Template
+from time import struct_time
+from types import TracebackType
+import sys
+import threading
+
+_SysExcInfoType = Union[Tuple[type, BaseException, TracebackType],
+ Tuple[None, None, None]]
+if sys.version_info >= (3, 5):
+ _ExcInfoType = Union[bool, _SysExcInfoType, Exception]
+else:
+ _ExcInfoType = Union[bool, _SysExcInfoType]
+_ArgsType = Union[Tuple[Any, ...], Dict[str, Any]]
+_FilterType = Union['Filter', Callable[['LogRecord'], int]]
+
+
+class Logger:
+ name = ... # type: str
+ level = ... # type: int
+ parent = ... # type: Union[Logger, PlaceHolder]
+ propagate = ... # type: bool
+ handlers = ... # type: List[Handler]
+ disabled = ... # type: int
+ def setLevel(self, lvl: Union[int, str]) -> None: ...
+ def isEnabledFor(self, lvl: int) -> bool: ...
+ def getEffectiveLevel(self) -> int: ...
+ def getChild(self, suffix: str) -> 'Logger': ...
+ if sys.version_info > (3,):
+ def debug(self, msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+ stack_info: bool = ..., extra: Dict[str, Any] = ...,
+ **kwargs: Any) -> None: ...
+ def info(self, msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+ stack_info: bool = ..., extra: Dict[str, Any] = ...,
+ **kwargs: Any) -> None: ...
+ def warning(self, msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+ stack_info: bool = ..., extra: Dict[str, Any] = ...,
+ **kwargs: Any) -> None: ...
+ def warn(self, msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+ stack_info: bool = ..., extra: Dict[str, Any] = ...,
+ **kwargs: Any) -> None: ...
+ def error(self, msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+ stack_info: bool = ..., extra: Dict[str, Any] = ...,
+ **kwargs: Any) -> None: ...
+ def critical(self, msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+ stack_info: bool = ..., extra: Dict[str, Any] = ...,
+ **kwargs: Any) -> None: ...
+ def log(self, lvl: int, msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+ stack_info: bool = ..., extra: Dict[str, Any] = ...,
+ **kwargs: Any) -> None: ...
+ def exception(self, msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+ stack_info: bool = ..., extra: Dict[str, Any] = ...,
+ **kwargs: Any) -> None: ...
+ else:
+ def debug(self,
+ msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+ extra: Dict[str, Any] = ..., **kwargs: Any) -> None: ...
+ def info(self,
+ msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+ extra: Dict[str, Any] = ..., **kwargs: Any) -> None: ...
+ def warning(self,
+ msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+ extra: Dict[str, Any] = ..., **kwargs: Any) -> None: ...
+ def warn(self,
+ msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+ extra: Dict[str, Any] = ..., **kwargs: Any) -> None: ...
+ def error(self,
+ msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+ extra: Dict[str, Any] = ..., **kwargs: Any) -> None: ...
+ def critical(self,
+ msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+ extra: Dict[str, Any] = ..., **kwargs: Any) -> None: ...
+ def log(self,
+ lvl: int, msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+ extra: Dict[str, Any] = ..., **kwargs: Any) -> None: ...
+ def exception(self,
+ msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+ extra: Dict[str, Any] = ..., **kwargs: Any) -> None: ...
+ def addFilter(self, filt: _FilterType) -> None: ...
+ def removeFilter(self, filt: _FilterType) -> None: ...
+ def filter(self, record: 'LogRecord') -> bool: ...
+ def addHandler(self, hdlr: 'Handler') -> None: ...
+ def removeHandler(self, hdlr: 'Handler') -> None: ...
+ if sys.version_info >= (3,):
+ def findCaller(self, stack_info: bool = ...) -> Tuple[str, int, str, Optional[str]]: ...
+ else:
+ def findCaller(self) -> Tuple[str, int, str]: ...
+ def handle(self, record: 'LogRecord') -> None: ...
+ if sys.version_info >= (3,):
+ def makeRecord(self, name: str, lvl: int, fn: str, lno: int, msg: Text,
+ args: Mapping[str, Any],
+ exc_info: Optional[_SysExcInfoType],
+ func: Optional[str] = ...,
+ extra: Optional[Mapping[str, Any]] = ...,
+ sinfo: Optional[str] = ...) -> None: ...
+ else:
+ def makeRecord(self,
+ name: str, lvl: int, fn: str, lno: int, msg: Text,
+ args: Mapping[str, Any],
+ exc_info: Optional[_SysExcInfoType],
+ func: Optional[str] = ...,
+ extra: Optional[Mapping[str, Any]] = ...) -> None: ...
+ if sys.version_info >= (3,):
+ def hasHandlers(self) -> bool: ...
+
+
+CRITICAL = ... # type: int
+ERROR = ... # type: int
+WARNING = ... # type: int
+WARN = ... # type: int
+INFO = ... # type: int
+DEBUG = ... # type: int
+NOTSET = ... # type: int
+
+
+class Filterer(object):
+ filters = ... # type: List[Filter]
+ def __init__(self) -> None: ...
+ def addFilter(self, filter: Filter) -> None: ...
+ def removeFilter(self, filter: Filter) -> None: ...
+ def filter(self, record) -> bool: ...
+
+
+class Handler(Filterer):
+ level = ... # type: int
+ formatter = ... # type: Optional[Formatter]
+ lock = ... # type: Optional[threading.Lock]
+ def __init__(self, level: int = ...) -> None: ...
+ def createLock(self) -> None: ...
+ def acquire(self) -> None: ...
+ def release(self) -> None: ...
+ def setLevel(self, lvl: Union[int, str]) -> None: ...
+ def setFormatter(self, form: 'Formatter') -> None: ...
+ def addFilter(self, filt: _FilterType) -> None: ...
+ def removeFilter(self, filt: _FilterType) -> None: ...
+ def filter(self, record: 'LogRecord') -> bool: ...
+ def flush(self) -> None: ...
+ def close(self) -> None: ...
+ def handle(self, record: 'LogRecord') -> None: ...
+ def handleError(self, record: 'LogRecord') -> None: ...
+ def format(self, record: 'LogRecord') -> None: ...
+ def emit(self, record: 'LogRecord') -> None: ...
+
+
+class Formatter:
+ converter = ... # type: Callable[[Optional[float]], struct_time]
+ _fmt = ... # type: Optional[str]
+ datefmt = ... # type: Optional[str]
+ if sys.version_info >= (3,):
+ _style = ... # type: PercentStyle
+ default_time_format = ... # type: str
+ default_msec_format = ... # type: str
+
+ if sys.version_info >= (3,):
+ def __init__(self, fmt: Optional[str] = ...,
+ datefmt: Optional[str] =...,
+ style: str = ...) -> None: ...
+ else:
+ def __init__(self,
+ fmt: Optional[str] = ...,
+ datefmt: Optional[str] =...) -> None: ...
+
+ def format(self, record: 'LogRecord') -> str: ...
+ def formatTime(self, record: 'LogRecord', datefmt: str = ...) -> str: ...
+ def formatException(self, exc_info: _SysExcInfoType) -> str: ...
+ if sys.version_info >= (3,):
+ def formatStack(self, stack_info: str) -> str: ...
+
+
+class Filter:
+ def __init__(self, name: str = ...) -> None: ...
+ def filter(self, record: 'LogRecord') -> int: ...
+
+
+class LogRecord:
+ args = ... # type: _ArgsType
+ asctime = ... # type: str
+ created = ... # type: int
+ exc_info = ... # type: Optional[_SysExcInfoType]
+ filename = ... # type: str
+ funcName = ... # type: str
+ levelname = ... # type: str
+ levelno = ... # type: int
+ lineno = ... # type: int
+ module = ... # type: str
+ msecs = ... # type: int
+ message = ... # type: str
+ msg = ... # type: str
+ name = ... # type: str
+ pathname = ... # type: str
+ process = ... # type: int
+ processName = ... # type: str
+ relativeCreated = ... # type: int
+ if sys.version_info >= (3,):
+ stack_info = ... # type: Optional[str]
+ thread = ... # type: int
+ threadName = ... # type: str
+ if sys.version_info >= (3,):
+ def __init__(self, name: str, level: int, pathname: str, lineno: int,
+ msg: Text, args: _ArgsType,
+ exc_info: Optional[_SysExcInfoType],
+ func: Optional[str] = ...,
+ sinfo: Optional[str] = ...) -> None: ...
+ else:
+ def __init__(self,
+ name: str, level: int, pathname: str, lineno: int,
+ msg: Text, args: _ArgsType,
+ exc_info: Optional[_SysExcInfoType],
+ func: Optional[str] = ...) -> None: ...
+ def getMessage(self) -> str: ...
+
+
+class LoggerAdapter:
+ def __init__(self, logger: Logger, extra: Mapping[str, Any]) -> None: ...
+ def process(self, msg: Text, kwargs: MutableMapping[str, Any]) -> Tuple[str, MutableMapping[str, Any]]: ...
+ if sys.version_info > (3,):
+ def debug(self, msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+ stack_info: bool = ..., extra: Dict[str, Any] = ...,
+ **kwargs: Any) -> None: ...
+ def info(self, msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+ stack_info: bool = ..., extra: Dict[str, Any] = ...,
+ **kwargs: Any) -> None: ...
+ def warning(self, msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+ stack_info: bool = ..., extra: Dict[str, Any] = ...,
+ **kwargs: Any) -> None: ...
+ def error(self, msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+ stack_info: bool = ..., extra: Dict[str, Any] = ...,
+ **kwargs: Any) -> None: ...
+ def exception(self, msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+ stack_info: bool = ..., extra: Dict[str, Any] = ...,
+ **kwargs: Any) -> None: ...
+ def critical(self, msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+ stack_info: bool = ..., extra: Dict[str, Any] = ...,
+ **kwargs: Any) -> None: ...
+ def log(self, lvl: int, msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+ stack_info: bool = ..., extra: Dict[str, Any] = ...,
+ **kwargs: Any) -> None: ...
+ else:
+ def debug(self,
+ msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+ extra: Dict[str, Any] = ..., **kwargs: Any) -> None: ...
+ def info(self,
+ msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+ extra: Dict[str, Any] = ..., **kwargs: Any) -> None: ...
+ def warning(self,
+ msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+ extra: Dict[str, Any] = ..., **kwargs: Any) -> None: ...
+ def error(self,
+ msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+ extra: Dict[str, Any] = ..., **kwargs: Any) -> None: ...
+ def exception(self,
+ msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+ extra: Dict[str, Any] = ..., **kwargs: Any) -> None: ...
+ def critical(self,
+ msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+ extra: Dict[str, Any] = ..., **kwargs: Any) -> None: ...
+ def log(self,
+ lvl: int, msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+ extra: Dict[str, Any] = ..., **kwargs: Any) -> None: ...
+ def isEnabledFor(self, lvl: int) -> bool: ...
+ if sys.version_info >= (3,):
+ def getEffectiveLevel(self) -> int: ...
+ def setLevel(self, lvl: Union[int, str]) -> None: ...
+ def hasHandlers(self) -> bool: ...
+
+
+if sys.version_info >= (3,):
+ def getLogger(name: Optional[str] = ...) -> Logger: ...
+else:
+ @overload
+ def getLogger() -> Logger: ...
+ @overload
+ def getLogger(name: str) -> Logger: ...
+def getLoggerClass() -> type: ...
+if sys.version_info >= (3,):
+ def getLogRecordFactory() -> Callable[..., LogRecord]: ...
+
+if sys.version_info > (3,):
+ def debug(msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+ stack_info: bool = ..., extra: Dict[str, Any] = ...,
+ **kwargs: Any) -> None: ...
+ def info(msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+ stack_info: bool = ..., extra: Dict[str, Any] = ...,
+ **kwargs: Any) -> None: ...
+ def warning(msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+ stack_info: bool = ..., extra: Dict[str, Any] = ...,
+ **kwargs: Any) -> None: ...
+ def warn(msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+ stack_info: bool = ..., extra: Dict[str, Any] = ...,
+ **kwargs: Any) -> None: ...
+ def error(msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+ stack_info: bool = ..., extra: Dict[str, Any] = ...,
+ **kwargs: Any) -> None: ...
+ def critical(msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+ stack_info: bool = ..., extra: Dict[str, Any] = ...,
+ **kwargs: Any) -> None: ...
+ def exception(msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+ stack_info: bool = ..., extra: Dict[str, Any] = ...,
+ **kwargs: Any) -> None: ...
+ def log(lvl: int, msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+ stack_info: bool = ..., extra: Dict[str, Any] = ...,
+ **kwargs: Any) -> None: ...
+else:
+ def debug(msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+ extra: Dict[str, Any] = ..., **kwargs: Any) -> None: ...
+ def info(msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+ extra: Dict[str, Any] = ..., **kwargs: Any) -> None: ...
+ def warning(msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+ extra: Dict[str, Any] = ..., **kwargs: Any) -> None: ...
+ def warn(msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+ extra: Dict[str, Any] = ..., **kwargs: Any) -> None: ...
+ def error(msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+ extra: Dict[str, Any] = ..., **kwargs: Any) -> None: ...
+ def critical(msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+ extra: Dict[str, Any] = ..., **kwargs: Any) -> None: ...
+ def exception(msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+ extra: Dict[str, Any] = ..., **kwargs: Any) -> None: ...
+ def log(lvl: int, msg: Text, *args: Any, exc_info: _ExcInfoType = ...,
+ extra: Dict[str, Any] = ..., **kwargs: Any) -> None: ...
+
+def disable(lvl: int) -> None: ...
+def addLevelName(lvl: int, levelName: str) -> None: ...
+def getLevelName(lvl: int) -> str: ...
+
+def makeLogRecord(attrdict: Mapping[str, Any]) -> LogRecord: ...
+
+if sys.version_info >= (3,):
+ def basicConfig(*, filename: str = ..., filemode: str = ...,
+ format: str = ..., datefmt: str = ..., style: str = ...,
+ level: int = ..., stream: IO[str] = ...,
+ handlers: Iterable[Handler] = ...) -> None: ...
+else:
+ @overload
+ def basicConfig() -> None: ...
+ @overload
+ def basicConfig(*, filename: str = ..., filemode: str = ...,
+ format: str = ..., datefmt: str = ...,
+ level: int = ..., stream: IO[str] = ...) -> None: ...
+def shutdown() -> None: ...
+
+def setLoggerClass(klass: type) -> None: ...
+if sys.version_info >= (3,):
+ def setLogRecordFactory(factory: Callable[..., LogRecord]) -> None: ...
+
+
+if sys.version_info >= (3,):
+ lastResort = ... # type: Optional['StreamHandler']
+
+
+class StreamHandler(Handler):
+ def __init__(self, stream: Optional[IO[str]] = ...) -> None: ...
+
+
+class FileHandler(Handler):
+ def __init__(self, filename: str, mode: str = ...,
+ encoding: Optional[str] = ..., delay: bool = ...) -> None: ...
+
+
+class NullHandler(Handler): ...
+
+
+class PlaceHolder:
+ def __init__(self, alogger: Logger) -> None: ...
+ def append(self, alogger: Logger) -> None: ...
+
+
+# Below aren't in module docs but still visible
+
+class RootLogger(Logger): ...
+
+root = ... # type: RootLogger
+
+
+if sys.version_info >= (3,):
+ class PercentStyle(object):
+ default_format = ... # type: str
+ asctime_format = ... # type: str
+ asctime_search = ... # type: str
+ _fmt = ... # type: str
+
+ def __init__(self, fmt) -> None: ...
+ def usesTime(self) -> bool: ...
+ def format(self, record: Any) -> str: ...
+
+ class StrFormatStyle(PercentStyle):
+ ...
+
+ class StringTemplateStyle(PercentStyle):
+ _tpl = ... # type: Template
+
+ BASIC_FORMAT = ... # type: str
+ _STYLES = ... # type: Dict[str, Tuple[PercentStyle, str]]
diff --git a/typeshed/stdlib/2and3/logging/config.pyi b/typeshed/stdlib/2and3/logging/config.pyi
new file mode 100644
index 0000000..99f7406
--- /dev/null
+++ b/typeshed/stdlib/2and3/logging/config.pyi
@@ -0,0 +1,25 @@
+# Stubs for logging.config (Python 3.4)
+
+from typing import Any, Callable, Dict, Optional, IO, Union
+import sys
+if sys.version_info >= (3,):
+ # from configparser import RawConfigParser
+ # TODO add RawConfigParser to configparser stubs
+ RawConfigParser = Any
+else:
+ from ConfigParser import RawConfigParser
+
+
+def dictConfig(config: Dict[str, Any]) -> None: ...
+if sys.version_info >= (3, 4):
+ def fileConfig(fname: Union[str, IO[str], RawConfigParser],
+ defaults: Optional[Dict[str, str]] = ...,
+ disable_existing_loggers: bool = ...) -> None: ...
+ def listen(port: int = ...,
+ verify: Optional[Callable[[bytes], Optional[bytes]]] = ...) -> None: ...
+else:
+ def fileConfig(fname: Union[str, IO[str]],
+ defaults: Optional[Dict[str, str]] = ...,
+ disable_existing_loggers: bool = ...) -> None: ...
+ def listen(port: int = ...) -> None: ...
+def stopListening() -> None: ...
diff --git a/typeshed/stdlib/2and3/logging/handlers.pyi b/typeshed/stdlib/2and3/logging/handlers.pyi
new file mode 100644
index 0000000..50ffa0e
--- /dev/null
+++ b/typeshed/stdlib/2and3/logging/handlers.pyi
@@ -0,0 +1,200 @@
+# Stubs for logging.handlers (Python 2.4)
+
+import datetime
+from logging import Handler, FileHandler, LogRecord
+from socket import SocketType
+import ssl
+import sys
+from typing import Any, Callable, Dict, List, Optional, Tuple, Union, overload
+if sys.version_info >= (3,):
+ from queue import Queue
+else:
+ from Queue import Queue
+# TODO update socket stubs to add SocketKind
+SocketKind = int
+
+
+class WatchedFileHandler(Handler):
+ @overload
+ def __init__(self, filename: str) -> None: ...
+ @overload
+ def __init__(self, filename: str, mode: str) -> None: ...
+ @overload
+ def __init__(self, filename: str, mode: str,
+ encoding: Optional[str]) -> None: ...
+ @overload
+ def __init__(self, filename: str, mode: str, encoding: Optional[str],
+ delay: bool) -> None: ...
+
+
+if sys.version_info >= (3,):
+ class BaseRotatingHandler(FileHandler):
+ namer = ... # type: Optional[Callable[[str], None]]
+ rotator = ... # type: Optional[Callable[[str, str], None]]
+ def __init__(self, filename: str, mode: str,
+ encoding: Optional[str] = ...,
+ delay: bool = ...) -> None: ...
+ def rotation_filename(self, default_name: str) -> None: ...
+ def rotate(self, source: str, dest: str) -> None: ...
+
+
+if sys.version_info >= (3,):
+ class RotatingFileHandler(BaseRotatingHandler):
+ def __init__(self, filename: str, mode: str = ..., maxBytes: int = ...,
+ backupCount: int = ..., encoding: Optional[str] = ...,
+ delay: bool = ...) -> None: ...
+ def doRollover(self) -> None: ...
+else:
+ class RotatingFileHandler(Handler):
+ def __init__(self, filename: str, mode: str = ..., maxBytes: int = ...,
+ backupCount: int = ..., encoding: Optional[str] = ...,
+ delay: bool = ...) -> None: ...
+ def doRollover(self) -> None: ...
+
+
+if sys.version_info >= (3,):
+ class TimedRotatingFileHandler(BaseRotatingHandler):
+ if sys.version_info >= (3, 4):
+ def __init__(self, filename: str, when: str = ...,
+ interval: int = ...,
+ backupCount: int = ..., encoding: Optional[str] = ...,
+ delay: bool = ..., utc: bool = ...,
+ atTime: Optional[datetime.datetime] = ...) -> None: ...
+ else:
+ def __init__(self,
+ filename: str, when: str = ..., interval: int = ...,
+ backupCount: int = ..., encoding: Optional[str] = ...,
+ delay: bool = ..., utc: bool = ...) -> None: ...
+ def doRollover(self) -> None: ...
+else:
+ class TimedRotatingFileHandler:
+ def __init__(self,
+ filename: str, when: str = ..., interval: int = ...,
+ backupCount: int = ..., encoding: Optional[str] = ...,
+ delay: bool = ..., utc: bool = ...) -> None: ...
+ def doRollover(self) -> None: ...
+
+
+class SocketHandler(Handler):
+ retryStart = ... # type: float
+ retryFactor = ... # type: float
+ retryMax = ... # type: float
+ if sys.version_info >= (3, 4):
+ def __init__(self, host: str, port: Optional[int]) -> None: ...
+ else:
+ def __init__(self, host: str, port: int) -> None: ...
+ def makeSocket(self) -> SocketType: ...
+ def makePickle(self, record: LogRecord) -> bytes: ...
+ def send(self, packet: bytes) -> None: ...
+ def createSocket(self) -> None: ...
+
+
+class DatagramHandler(SocketHandler): ...
+
+
+class SysLogHandler(Handler):
+ LOG_ALERT = ... # type: int
+ LOG_CRIT = ... # type: int
+ LOG_DEBUG = ... # type: int
+ LOG_EMERG = ... # type: int
+ LOG_ERR = ... # type: int
+ LOG_INFO = ... # type: int
+ LOG_NOTICE = ... # type: int
+ LOG_WARNING = ... # type: int
+ LOG_AUTH = ... # type: int
+ LOG_AUTHPRIV = ... # type: int
+ LOG_CRON = ... # type: int
+ LOG_DAEMON = ... # type: int
+ LOG_FTP = ... # type: int
+ LOG_KERN = ... # type: int
+ LOG_LPR = ... # type: int
+ LOG_MAIL = ... # type: int
+ LOG_NEWS = ... # type: int
+ LOG_SYSLOG = ... # type: int
+ LOG_USER = ... # type: int
+ LOG_UUCP = ... # type: int
+ LOG_LOCAL0 = ... # type: int
+ LOG_LOCAL1 = ... # type: int
+ LOG_LOCAL2 = ... # type: int
+ LOG_LOCAL3 = ... # type: int
+ LOG_LOCAL4 = ... # type: int
+ LOG_LOCAL5 = ... # type: int
+ LOG_LOCAL6 = ... # type: int
+ LOG_LOCAL7 = ... # type: int
+ def __init__(self, address: Union[Tuple[str, int], str] = ...,
+ facility: int = ..., socktype: SocketKind = ...) -> None: ...
+ def encodePriority(self, facility: Union[int, str],
+ priority: Union[int, str]) -> int: ...
+ def mapPriority(self, levelName: int) -> str: ...
+
+
+class NTEventLogHandler(Handler):
+ def __init__(self, appname: str, dllname: str = ...,
+ logtype: str = ...) -> None: ...
+ def getEventCategory(self, record: LogRecord) -> int: ...
+ # TODO correct return value?
+ def getEventType(self, record: LogRecord) -> int: ...
+ def getMessageID(self, record: LogRecord) -> int: ...
+
+
+class SMTPHandler(Handler):
+ # TODO `secure` can also be an empty tuple
+ if sys.version_info >= (3,):
+ def __init__(self, mailhost: Union[str, Tuple[str, int]], fromaddr: str,
+ toaddrs: List[str], subject: str,
+ credentials: Optional[Tuple[str, str]] = ...,
+ secure: Union[Tuple[str], Tuple[str, str], None] =...,
+ timeout: float = ...) -> None: ...
+ else:
+ def __init__(self,
+ mailhost: Union[str, Tuple[str, int]], fromaddr: str,
+ toaddrs: List[str], subject: str,
+ credentials: Optional[Tuple[str, str]] = ...,
+ secure: Union[Tuple[str], Tuple[str, str], None] =...) -> None: ...
+ def getSubject(self, record: LogRecord) -> str: ...
+
+
+class BufferingHandler(Handler):
+ def __init__(self, capacity: int) -> None: ...
+ def shouldFlush(self, record: LogRecord) -> bool: ...
+
+class MemoryHandler(BufferingHandler):
+ def __init__(self, capacity: int, flushLevel: int = ...,
+ target: Optional[Handler] =...) -> None: ...
+ def setTarget(self, target: Handler) -> None: ...
+
+
+class HTTPHandler(Handler):
+ if sys.version_info >= (3, 5):
+ def __init__(self, host: str, url: str, method: str = ...,
+ secure: bool = ...,
+ credentials: Optional[Tuple[str, str]] = ...,
+ context: Optional[ssl.SSLContext] = ...) -> None: ...
+ elif sys.version_info >= (3,):
+ def __init__(self,
+ host: str, url: str, method: str = ..., secure: bool = ...,
+ credentials: Optional[Tuple[str, str]] = ...) -> None: ...
+ else:
+ def __init__(self,
+ host: str, url: str, method: str = ...) -> None: ...
+ def mapLogRecord(self, record: LogRecord) -> Dict[str, Any]: ...
+
+
+if sys.version_info > (3,):
+ class QueueHandler(Handler):
+ def __init__(self, queue: Queue) -> None: ...
+ def prepare(self, record: LogRecord) -> Any: ...
+ def enqueue(self, record: LogRecord) -> None: ...
+
+ class QueueListener:
+ if sys.version_info >= (3, 5):
+ def __init__(self, queue: Queue, *handlers: Handler,
+ respect_handler_level: bool = ...) -> None: ...
+ else:
+ def __init__(self,
+ queue: Queue, *handlers: Handler) -> None: ...
+ def dequeue(self, block: bool) -> LogRecord: ...
+ def prepare(self, record: LogRecord) -> Any: ...
+ def start(self) -> None: ...
+ def stop(self) -> None: ...
+ def enqueue_sentinel(self) -> None: ...
diff --git a/typeshed/stdlib/2and3/marshal.pyi b/typeshed/stdlib/2and3/marshal.pyi
new file mode 100644
index 0000000..eb2d57a
--- /dev/null
+++ b/typeshed/stdlib/2and3/marshal.pyi
@@ -0,0 +1,8 @@
+from typing import Any, IO
+
+version = ... # type: int
+
+def dump(value: Any, file: IO[Any], version: int = ...) -> None: ...
+def load(file: IO[Any]) -> Any: ...
+def dumps(value: Any, version: int = ...) -> str: ...
+def loads(string: str) -> Any: ...
diff --git a/typeshed/stdlib/2and3/math.pyi b/typeshed/stdlib/2and3/math.pyi
new file mode 100644
index 0000000..95f4115
--- /dev/null
+++ b/typeshed/stdlib/2and3/math.pyi
@@ -0,0 +1,66 @@
+# Stubs for math
+# See: http://docs.python.org/2/library/math.html
+
+from typing import Tuple, Iterable, Optional
+
+import sys
+
+e = ... # type: float
+pi = ... # type: float
+if sys.version_info >= (3, 5):
+ inf = ... # type: float
+ nan = ... # type: float
+if sys.version_info >= (3, 6):
+ tau = ... # type: float
+
+def acos(x: float) -> float: ...
+def acosh(x: float) -> float: ...
+def asin(x: float) -> float: ...
+def asinh(x: float) -> float: ...
+def atan(x: float) -> float: ...
+def atan2(y: float, x: float) -> float: ...
+def atanh(x: float) -> float: ...
+def ceil(x: float) -> int: ...
+def copysign(x: float, y: float) -> float: ...
+def cos(x: float) -> float: ...
+def cosh(x: float) -> float: ...
+def degrees(x: float) -> float: ...
+def erf(x: float) -> float: ...
+def erfc(x: float) -> float: ...
+def exp(x: float) -> float: ...
+def expm1(x: float) -> float: ...
+def fabs(x: float) -> float: ...
+def factorial(x: int) -> int: ...
+if sys.version_info >= (3,):
+ def floor(x: float) -> int: ...
+else:
+ def floor(x: float) -> float: ...
+def fmod(x: float, y: float) -> float: ...
+def frexp(x: float) -> Tuple[float, int]: ...
+def fsum(iterable: Iterable) -> float: ...
+def gamma(x: float) -> float: ...
+if sys.version_info >= (3, 5):
+ def gcd(a: int, b: int) -> int: ...
+def hypot(x: float, y: float) -> float: ...
+if sys.version_info >= (3, 5):
+ def isclose(a: float, b: float, rel_tol: float = ..., abs_tol: float = ...) -> bool: ...
+def isinf(x: float) -> bool: ...
+if sys.version_info >= (3,):
+ def isfinite(x: float) -> bool: ...
+def isnan(x: float) -> bool: ...
+def ldexp(x: float, i: int) -> float: ...
+def lgamma(x: float) -> float: ...
+def log(x: float, base: float = ...) -> float: ...
+def log10(x: float) -> float: ...
+def log1p(x: float) -> float: ...
+if sys.version_info >= (3, 3):
+ def log2(x: float) -> float: ...
+def modf(x: float) -> Tuple[float, float]: ...
+def pow(x: float, y: float) -> float: ...
+def radians(x: float) -> float: ...
+def sin(x: float) -> float: ...
+def sinh(x: float) -> float: ...
+def sqrt(x: float) -> float: ...
+def tan(x: float) -> float: ...
+def tanh(x: float) -> float: ...
+def trunc(x: float) -> int: ...
diff --git a/typeshed/stdlib/2and3/mimetypes.pyi b/typeshed/stdlib/2and3/mimetypes.pyi
new file mode 100644
index 0000000..493e612
--- /dev/null
+++ b/typeshed/stdlib/2and3/mimetypes.pyi
@@ -0,0 +1,38 @@
+# Stubs for mimetypes
+
+from typing import Dict, IO, List, Optional, Sequence, Text, Tuple
+import sys
+
+def guess_type(url: Text,
+ strict: bool = ...) -> Tuple[Optional[str], Optional[str]]: ...
+def guess_all_extensions(type: str, strict: bool = ...) -> List[str]: ...
+def guess_extension(type: str, strict: bool = ...) -> Optional[str]: ...
+
+def init(files: Optional[Sequence[str]] = ...) -> None: ...
+def read_mime_types(filename: str) -> Optional[Dict[str, str]]: ...
+def add_type(type: str, ext: str, strict: bool = ...) -> None: ...
+
+inited = ... # type: bool
+knownfiles = ... # type: List[str]
+suffix_map = ... # type: Dict[str, str]
+encodings_map = ... # type: Dict[str, str]
+types_map = ... # type: Dict[str, str]
+common_types = ... # type: Dict[str, str]
+
+class MimeTypes:
+ suffix_map = ... # type: Dict[str, str]
+ encodings_map = ... # type: Dict[str, str]
+ types_map = ... # type: Tuple[Dict[str, str], Dict[str, str]]
+ types_map_inv = ... # type: Tuple[Dict[str, str], Dict[str, str]]
+ def __init__(self, filenames: Tuple[str, ...] = ...,
+ strict: bool = ...) -> None: ...
+ def guess_extension(self, type: str,
+ strict: bool = ...) -> Optional[str]: ...
+ def guess_type(self, url: str,
+ strict: bool = ...) -> Tuple[Optional[str], Optional[str]]: ...
+ def guess_all_extensions(self, type: str,
+ strict: bool = ...) -> List[str]: ...
+ def read(self, filename: str, strict: bool = ...) -> None: ...
+ def readfp(self, fp: IO[str], strict: bool = ...) -> None: ...
+ if sys.platform == 'win32':
+ def read_windows_registry(self, strict: bool = ...) -> None: ...
diff --git a/typeshed/stdlib/2and3/mmap.pyi b/typeshed/stdlib/2and3/mmap.pyi
new file mode 100644
index 0000000..d0be9df
--- /dev/null
+++ b/typeshed/stdlib/2and3/mmap.pyi
@@ -0,0 +1,79 @@
+# Stubs for mmap
+
+import sys
+from types import TracebackType
+from typing import (Optional, Sequence, Union, Generic, TypeVar, overload,
+ Iterable, Container, Sized, Reversible, Type)
+
+
+_T = TypeVar('_T', str, bytes)
+
+# TODO already in PEP, have to get added to mypy
+_C = TypeVar('_C')
+class _ContextManager(Generic[_C]):
+ def __enter__(self) -> _C: ...
+ def __exit__(self, exc_type: Optional[Type[BaseException]],
+ exc_val: Optional[Exception],
+ exc_tb: Optional[TracebackType]) -> bool: ...
+
+
+ACCESS_READ = ... # type: int
+ACCESS_WRITE = ... # type: int
+ACCESS_COPY = ... # type: int
+
+ALLOCATIONGRANULARITY = ... # type: int
+
+if sys.platform != 'win32':
+ MAP_PRIVATE = ... # type: int
+ MAP_SHARED = ... # type: int
+ PROT_READ = ... # type: int
+ PROT_WRITE = ... # type: int
+
+ PAGESIZE = ... # type: int
+
+class _mmap(Generic[_T]):
+ if sys.platform == 'win32':
+ def __init__(self, fileno: int, length: int,
+ tagname: Optional[str] = ..., access: int = ...,
+ offset: int = ...) -> None: ...
+ else:
+ def __init__(self,
+ fileno: int, length: int, flags: int = ...,
+ prot: int = ..., access: int = ...,
+ offset: int = ...) -> None: ...
+ def close(self) -> None: ...
+ def find(self, sub: _T,
+ start: int = ..., end: int = ...) -> int: ...
+ def flush(self, offset: int = ..., size: int = ...) -> int: ...
+ def move(self, dest: int, src: int, count: int) -> None: ...
+ def read(self, n: int = ...) -> _T: ...
+ def read_byte(self) -> _T: ...
+ def readline(self) -> _T: ...
+ def resize(self, newsize: int) -> None: ...
+ def seek(self, pos: int, whence: int = ...) -> None: ...
+ def size(self) -> int: ...
+ def tell(self) -> int: ...
+ def write(self, bytes: _T) -> None: ...
+ def write_byte(self, byte: _T) -> None: ...
+ def __len__(self) -> int: ...
+
+if sys.version_info >= (3,):
+ class mmap(_mmap, _ContextManager[mmap], Iterable[bytes], Container[bytes],
+ Sized, Reversible[bytes]):
+ closed = ... # type: bool
+ def rfind(self, sub: bytes, start: int = ..., stop: int = ...) -> int: ...
+ @overload
+ def __getitem__(self, index: int) -> int: ...
+ @overload
+ def __getitem__(self, index: slice) -> bytes: ...
+ def __delitem__(self, index: Union[int, slice]) -> None: ...
+ @overload
+ def __setitem__(self, index: int, object: int) -> None: ...
+ @overload
+ def __setitem__(self, index: slice, object: bytes) -> None: ...
+else:
+ class mmap(_mmap, Sequence[bytes]):
+ def rfind(self, string: bytes, start: int = ..., stop: int = ...) -> int: ...
+ def __getitem__(self, index: Union[int, slice]) -> bytes: ...
+ def __delitem__(self, index: Union[int, slice]) -> None: ...
+ def __setitem__(self, index: Union[int, slice], object: bytes) -> None: ...
diff --git a/typeshed/stdlib/2and3/numbers.pyi b/typeshed/stdlib/2and3/numbers.pyi
new file mode 100644
index 0000000..e4f7603
--- /dev/null
+++ b/typeshed/stdlib/2and3/numbers.pyi
@@ -0,0 +1,140 @@
+# Stubs for numbers (Python 3.5)
+# See https://docs.python.org/2.7/library/numbers.html
+# and https://docs.python.org/3/library/numbers.html
+#
+# Note: these stubs are incomplete. The more complex type
+# signatures are currently omitted.
+
+from typing import Any, Optional, TypeVar
+from abc import ABCMeta, abstractmethod
+import sys
+
+class Number(metaclass=ABCMeta):
+ @abstractmethod
+ def __hash__(self) -> int: ...
+
+class Complex(Number):
+ @abstractmethod
+ def __complex__(self) -> complex: ...
+ if sys.version_info >= (3, 0):
+ def __bool__(self) -> bool: ...
+ else:
+ def __nonzero__(self) -> bool: ...
+ @property
+ @abstractmethod
+ def real(self): ...
+ @property
+ @abstractmethod
+ def imag(self): ...
+ @abstractmethod
+ def __add__(self, other): ...
+ @abstractmethod
+ def __radd__(self, other): ...
+ @abstractmethod
+ def __neg__(self): ...
+ @abstractmethod
+ def __pos__(self): ...
+ def __sub__(self, other): ...
+ def __rsub__(self, other): ...
+ @abstractmethod
+ def __mul__(self, other): ...
+ @abstractmethod
+ def __rmul__(self, other): ...
+ if sys.version_info < (3, 0):
+ @abstractmethod
+ def __div__(self, other): ...
+ @abstractmethod
+ def __rdiv__(self, other): ...
+ @abstractmethod
+ def __truediv__(self, other): ...
+ @abstractmethod
+ def __rtruediv__(self, other): ...
+ @abstractmethod
+ def __pow__(self, exponent): ...
+ @abstractmethod
+ def __rpow__(self, base): ...
+ def __abs__(self): ...
+ def conjugate(self): ...
+ def __eq__(self, other: object) -> bool: ...
+ if sys.version_info < (3, 0):
+ def __ne__(self, other: object) -> bool: ...
+
+class Real(Complex):
+ @abstractmethod
+ def __float__(self) -> float: ...
+ @abstractmethod
+ def __trunc__(self) -> int: ...
+ if sys.version_info >= (3, 0):
+ @abstractmethod
+ def __floor__(self) -> int: ...
+ @abstractmethod
+ def __ceil__(self) -> int: ...
+ @abstractmethod
+ def __round__(self, ndigits: Optional[int] = None): ...
+ def __divmod__(self, other): ...
+ def __rdivmod__(self, other): ...
+ @abstractmethod
+ def __floordiv__(self, other): ...
+ @abstractmethod
+ def __rfloordiv__(self, other): ...
+ @abstractmethod
+ def __mod__(self, other): ...
+ @abstractmethod
+ def __rmod__(self, other): ...
+ @abstractmethod
+ def __lt__(self, other) -> bool: ...
+ @abstractmethod
+ def __le__(self, other) -> bool: ...
+ def __complex__(self) -> complex: ...
+ @property
+ def real(self): ...
+ @property
+ def imag(self): ...
+ def conjugate(self): ...
+
+class Rational(Real):
+ @property
+ @abstractmethod
+ def numerator(self) -> int: ...
+ @property
+ @abstractmethod
+ def denominator(self) -> int: ...
+ def __float__(self) -> float: ...
+
+class Integral(Rational):
+ if sys.version_info >= (3, 0):
+ @abstractmethod
+ def __int__(self) -> int: ...
+ else:
+ @abstractmethod
+ def __long__(self) -> long: ...
+ def __index__(self) -> int: ...
+ @abstractmethod
+ def __pow__(self, exponent, modulus=None): ...
+ @abstractmethod
+ def __lshift__(self, other): ...
+ @abstractmethod
+ def __rlshift__(self, other): ...
+ @abstractmethod
+ def __rshift__(self, other): ...
+ @abstractmethod
+ def __rrshift__(self, other): ...
+ @abstractmethod
+ def __and__(self, other): ...
+ @abstractmethod
+ def __rand__(self, other): ...
+ @abstractmethod
+ def __xor__(self, other): ...
+ @abstractmethod
+ def __rxor__(self, other): ...
+ @abstractmethod
+ def __or__(self, other): ...
+ @abstractmethod
+ def __ror__(self, other): ...
+ @abstractmethod
+ def __invert__(self): ...
+ def __float__(self) -> float: ...
+ @property
+ def numerator(self) -> int: ...
+ @property
+ def denominator(self) -> int: ...
diff --git a/typeshed/stdlib/2and3/operator.pyi b/typeshed/stdlib/2and3/operator.pyi
new file mode 100644
index 0000000..eafc37c
--- /dev/null
+++ b/typeshed/stdlib/2and3/operator.pyi
@@ -0,0 +1,227 @@
+# Stubs for operator
+
+from typing import (
+ Any, Callable, Container, Mapping, MutableMapping, MutableSequence, Sequence, SupportsAbs, Tuple,
+ TypeVar, overload,
+)
+import sys
+
+
+_T = TypeVar('_T')
+_K = TypeVar('_K')
+_V = TypeVar('_V')
+
+
+def lt(a: Any, b: Any) -> Any: ...
+def le(a: Any, b: Any) -> Any: ...
+def eq(a: Any, b: Any) -> Any: ...
+def ne(a: Any, b: Any) -> Any: ...
+def ge(a: Any, b: Any) -> Any: ...
+def gt(a: Any, b: Any) -> Any: ...
+def __lt__(a: Any, b: Any) -> Any: ...
+def __le__(a: Any, b: Any) -> Any: ...
+def __eq__(a: Any, b: Any) -> Any: ...
+def __ne__(a: Any, b: Any) -> Any: ...
+def __ge__(a: Any, b: Any) -> Any: ...
+def __gt__(a: Any, b: Any) -> Any: ...
+
+def not_(obj: Any) -> bool: ...
+def __not__(obj: Any) -> bool: ...
+
+def truth(x: Any) -> bool: ...
+
+def is_(a: Any, b: Any) -> bool: ...
+
+def is_not(a: Any, b: Any) -> bool: ...
+
+def abs(x: SupportsAbs) -> Any: ...
+def __abs__(a: SupportsAbs) -> Any: ...
+
+def add(a: Any, b: Any) -> Any: ...
+def __add__(a: Any, b: Any) -> Any: ...
+
+def and_(a: Any, b: Any) -> Any: ...
+def __and__(a: Any, b: Any) -> Any: ...
+
+if sys.version_info < (3, ):
+ def div(a: Any, b: Any) -> Any: ...
+ def __div__(a: Any, b: Any) -> Any: ...
+
+def floordiv(a: Any, b: Any) -> Any: ...
+def __floordiv__(a: Any, b: Any) -> Any: ...
+
+def index(a: Any) -> int: ...
+def __index__(a: Any) -> int: ...
+
+def inv(obj: Any) -> Any: ...
+def invert(obj: Any) -> Any: ...
+def __inv__(obj: Any) -> Any: ...
+def __invert__(obj: Any) -> Any: ...
+
+def lshift(a: Any, b: Any) -> Any: ...
+def __lshift__(a: Any, b: Any) -> Any: ...
+
+def mod(a: Any, b: Any) -> Any: ...
+def __mod__(a: Any, b: Any) -> Any: ...
+
+def mul(a: Any, b: Any) -> Any: ...
+def __mul__(a: Any, b: Any) -> Any: ...
+
+if sys.version_info >= (3, 5):
+ def matmul(a: Any, b: Any) -> Any: ...
+ def __matmul__(a: Any, b: Any) -> Any: ...
+
+def neg(obj: Any) -> Any: ...
+def __neg__(obj: Any) -> Any: ...
+
+def or_(a: Any, b: Any) -> Any: ...
+def __or__(a: Any, b: Any) -> Any: ...
+
+def pos(obj: Any) -> Any: ...
+def __pos__(obj: Any) -> Any: ...
+
+def pow(a: Any, b: Any) -> Any: ...
+def __pow__(a: Any, b: Any) -> Any: ...
+
+def rshift(a: Any, b: Any) -> Any: ...
+def __rshift__(a: Any, b: Any) -> Any: ...
+
+def sub(a: Any, b: Any) -> Any: ...
+def __sub__(a: Any, b: Any) -> Any: ...
+
+def truediv(a: Any, b: Any) -> Any: ...
+def __truediv__(a: Any, b: Any) -> Any: ...
+
+def xor(a: Any, b: Any) -> Any: ...
+def __xor__(a: Any, b: Any) -> Any: ...
+
+def concat(a: Sequence[_T], b: Sequence[_T]) -> Sequence[_T]: ...
+def __concat__(a: Sequence[_T], b: Sequence[_T]) -> Sequence[_T]: ...
+
+def contains(a: Container[Any], b: Any) -> bool: ...
+def __contains__(a: Container[Any], b: Any) -> bool: ...
+
+def countOf(a: Container[Any], b: Any) -> int: ...
+
+ at overload
+def delitem(a: MutableSequence[_T], b: int) -> None: ...
+ at overload
+def delitem(a: MutableMapping[_K, _V], b: _K) -> None: ...
+ at overload
+def __delitem__(a: MutableSequence[_T], b: int) -> None: ...
+ at overload
+def __delitem__(a: MutableMapping[_K, _V], b: _K) -> None: ...
+
+if sys.version_info < (3, ):
+ def delslice(a: MutableSequence[Any], b: int, c: int) -> None: ...
+ def __delslice__(a: MutableSequence[Any], b: int, c: int) -> None: ...
+
+ at overload
+def getitem(a: Sequence[_T], b: int) -> _T: ...
+ at overload
+def getitem(a: Mapping[_K, _V], b: _K) -> _V: ...
+ at overload
+def __getitem__(a: Sequence[_T], b: int) -> _T: ...
+ at overload
+def __getitem__(a: Mapping[_K, _V], b: _K) -> _V: ...
+
+if sys.version_info < (3, ):
+ def getslice(a: Sequence[_T], b: int, c: int) -> Sequence[_T]: ...
+ def __getslice__(a: Sequence[_T], b: int, c: int) -> Sequence[_T]: ...
+
+def indexOf(a: Sequence[_T], b: _T) -> int: ...
+
+if sys.version_info < (3, ):
+ def repeat(a: Any, b: int) -> Any: ...
+ def __repeat__(a: Any, b: int) -> Any: ...
+
+if sys.version_info < (3, ):
+ def sequenceIncludes(a: Container[Any], b: Any) -> bool: ...
+
+ at overload
+def setitem(a: MutableSequence[_T], b: int, c: _T) -> None: ...
+ at overload
+def setitem(a: MutableMapping[_K, _V], b: _K, c: _V) -> None: ...
+ at overload
+def __setitem__(a: MutableSequence[_T], b: int, c: _T) -> None: ...
+ at overload
+def __setitem__(a: MutableMapping[_K, _V], b: _K, c: _V) -> None: ...
+
+if sys.version_info < (3, ):
+ def setslice(a: MutableSequence[_T], b: int, c: int, v: Sequence[_T]) -> None: ...
+ def __setslice__(a: MutableSequence[_T], b: int, c: int, v: Sequence[_T]) -> None: ...
+
+
+if sys.version_info >= (3, 4):
+ def length_hint(obj: Any, default: int = ...) -> int: ...
+
+ at overload
+def attrgetter(attr: str) -> Callable[[Any], Any]: ...
+ at overload
+def attrgetter(*attrs: str) -> Callable[[Any], Tuple[Any, ...]]: ...
+
+ at overload
+def itemgetter(item: Any) -> Callable[[Any], Any]: ...
+ at overload
+def itemgetter(*items: Any) -> Callable[[Any], Tuple[Any, ...]]: ...
+
+def methodcaller(name: str, *args: Any, **kwargs: Any) -> Callable[..., Any]: ...
+
+
+def iadd(a: Any, b: Any) -> Any: ...
+def __iadd__(a: Any, b: Any) -> Any: ...
+
+def iand(a: Any, b: Any) -> Any: ...
+def __iand__(a: Any, b: Any) -> Any: ...
+
+def iconcat(a: Any, b: Any) -> Any: ...
+def __iconcat__(a: Any, b: Any) -> Any: ...
+
+if sys.version_info < (3, ):
+ def idiv(a: Any, b: Any) -> Any: ...
+ def __idiv__(a: Any, b: Any) -> Any: ...
+
+def ifloordiv(a: Any, b: Any) -> Any: ...
+def __ifloordiv__(a: Any, b: Any) -> Any: ...
+
+def ilshift(a: Any, b: Any) -> Any: ...
+def __ilshift__(a: Any, b: Any) -> Any: ...
+
+def imod(a: Any, b: Any) -> Any: ...
+def __imod__(a: Any, b: Any) -> Any: ...
+
+def imul(a: Any, b: Any) -> Any: ...
+def __imul__(a: Any, b: Any) -> Any: ...
+
+if sys.version_info >= (3, 5):
+ def imatmul(a: Any, b: Any) -> Any: ...
+ def __imatmul__(a: Any, b: Any) -> Any: ...
+
+def ior(a: Any, b: Any) -> Any: ...
+def __ior__(a: Any, b: Any) -> Any: ...
+
+def ipow(a: Any, b: Any) -> Any: ...
+def __ipow__(a: Any, b: Any) -> Any: ...
+
+if sys.version_info < (3, ):
+ def irepeat(a: Any, b: int) -> Any: ...
+ def __irepeat__(a: Any, b: int) -> Any: ...
+
+def irshift(a: Any, b: Any) -> Any: ...
+def __irshift__(a: Any, b: Any) -> Any: ...
+
+def isub(a: Any, b: Any) -> Any: ...
+def __isub__(a: Any, b: Any) -> Any: ...
+
+def itruediv(a: Any, b: Any) -> Any: ...
+def __itruediv__(a: Any, b: Any) -> Any: ...
+
+def ixor(a: Any, b: Any) -> Any: ...
+def __ixor__(a: Any, b: Any) -> Any: ...
+
+
+if sys.version_info < (3, ):
+ def isCallable(x: Any) -> bool: ...
+ def isMappingType(x: Any) -> bool: ...
+ def isNumberType(x: Any) -> bool: ...
+ def isSequenceType(x: Any) -> bool: ...
diff --git a/typeshed/stdlib/2and3/pkgutil.pyi b/typeshed/stdlib/2and3/pkgutil.pyi
new file mode 100644
index 0000000..e6d4672
--- /dev/null
+++ b/typeshed/stdlib/2and3/pkgutil.pyi
@@ -0,0 +1,31 @@
+# Stubs for pkgutil
+
+from typing import Any, Callable, Generator, IO, Iterable, List, Optional, Tuple
+import sys
+
+if sys.version_info >= (3,):
+ from importlib.abc import Loader
+else:
+ Loader = Any
+
+_YMFNI = Generator[Tuple[Any, str, bool], None, None]
+
+
+def extend_path(path: Iterable[str], name: str) -> Iterable[str]: ...
+
+class ImpImporter:
+ def __init__(self, dirname: Optional[str] = ...) -> None: ...
+
+class ImpLoader:
+ def __init__(self, fullname: str, file: IO[str], filename: str,
+ etc: Tuple[str, str, int]) -> None: ...
+
+def find_loader(fullname: str) -> Loader: ...
+def get_importer(path_item: str) -> Any: ... # TODO precise type
+def get_loader(module_or_name: str) -> Loader: ...
+def iter_importers(fullname: str = ...) -> Generator[Any, None, None]: ... # TODO precise type
+def iter_modules(path: Optional[List[str]] = ...,
+ prefix: str = ...) -> _YMFNI: ... # TODO precise type
+def walk_packages(path: Optional[str] = ..., prefix: str = ...,
+ onerror: Optional[Callable[[str], None]] = ...) -> _YMFNI: ...
+def get_data(package: str, resource: str) -> bytes: ...
diff --git a/typeshed/stdlib/2and3/plistlib.pyi b/typeshed/stdlib/2and3/plistlib.pyi
new file mode 100644
index 0000000..2790199
--- /dev/null
+++ b/typeshed/stdlib/2and3/plistlib.pyi
@@ -0,0 +1,60 @@
+# Stubs for plistlib
+
+from typing import (
+ Any, IO, Mapping, MutableMapping, Optional, Union,
+ Type, TypeVar,
+)
+from typing import Dict as DictT
+from enum import Enum
+import sys
+
+mm = MutableMapping[str, Any]
+_D = TypeVar('_D', mm)
+if sys.version_info >= (3,):
+ _Path = str
+else:
+ _Path = Union[str, unicode]
+
+
+if sys.version_info >= (3,):
+ class PlistFormat(Enum):
+ FMT_XML = ... # type: PlistFormat
+ FMT_BINARY = ... # type: PlistFormat
+
+if sys.version_info >= (3, 4):
+ def load(fp: IO[bytes], *, fmt: Optional[PlistFormat] = ...,
+ use_builtin_types: bool, dict_type: Type[_D] =...) -> _D: ...
+ def loads(data: bytes, *, fmt: Optional[PlistFormat] = ...,
+ use_builtin_types: bool = ..., dict_type: Type[_D] = ...) -> _D: ...
+ def dump(value: Mapping[str, Any], fp: IO[bytes], *,
+ fmt: PlistFormat =..., sort_keys: bool = ...,
+ skipkeys: bool = ...) -> None: ...
+ def dumps(value: Mapping[str, Any], *, fmt: PlistFormat = ...,
+ skipkeys: bool = ..., sort_keys: bool = ...) -> bytes: ...
+
+def readPlist(pathOrFile: Union[_Path, IO[bytes]]) -> DictT[str, Any]: ...
+def writePlist(value: Mapping[str, Any], pathOrFile: Union[_Path, IO[bytes]]) -> None: ...
+def readPlistFromBytes(data: bytes) -> DictT[str, Any]: ...
+def writePlistToBytes(value: Mapping[str, Any]) -> bytes: ...
+if sys.version_info < (3,):
+ def readPlistFromResource(path: _Path, restype: str = ...,
+ resid: int = ...) -> DictT[str, Any]: ...
+ def writePlistToResource(rootObject: Mapping[str, Any], path: _Path,
+ restype: str = ...,
+ resid: int = ...) -> None: ...
+ def readPlistFromString(data: str) -> DictT[str, Any]: ...
+ def writePlistToString(rootObject: Mapping[str, Any]) -> str: ...
+
+if sys.version_info >= (3,):
+ class Dict(dict):
+ def __getattr__(self, attr: str) -> Any: ...
+ def __setattr__(self, attr: str, value: Any) -> None: ...
+ def __delattr__(self, attr: str) -> None: ...
+
+class Data:
+ data = ... # type: bytes
+ def __init__(self, data: bytes) -> None: ...
+
+if sys.version_info >= (3,):
+ FMT_XML = PlistFormat.FMT_XML
+ FMT_BINARY = PlistFormat.FMT_BINARY
diff --git a/typeshed/stdlib/2and3/profile.pyi b/typeshed/stdlib/2and3/profile.pyi
new file mode 100644
index 0000000..21a7c8f
--- /dev/null
+++ b/typeshed/stdlib/2and3/profile.pyi
@@ -0,0 +1,21 @@
+from typing import Any, Callable, Dict, Optional, TypeVar
+
+def run(statement: str, filename: Optional[str] = ..., sort: int = ...) -> None: ...
+def runctx(statement: str, globals: Dict[str, Any], locals: Dict[str, Any], filename: Optional[str] = ..., sort: int = ...) -> None: ...
+
+_SelfT = TypeVar('_SelfT', bound='Profile')
+_T = TypeVar('_T')
+
+class Profile:
+ def __init__(self, timer: Optional[Callable[[], float]] = ..., bias: Optional[int] = ...) -> None: ...
+ def set_cmd(self, cmd: str) -> None: ...
+ def simulate_call(self, name: str) -> None: ...
+ def simulate_cmd_complete(self) -> None: ...
+ def print_stats(self, sort: int = ...) -> None: ...
+ def dump_stats(self, file: str) -> None: ...
+ def create_stats(self) -> None: ...
+ def snapshot_stats(self) -> None: ...
+ def run(self: _SelfT, cmd: str) -> _SelfT: ...
+ def runctx(self: _SelfT, cmd: str, globals: Dict[str, Any], locals: Dict[str, Any]) -> _SelfT: ...
+ def runcall(self, func: Callable[..., _T], *args: Any, **kw: Any) -> _T: ...
+ def calibrate(self, m: int, verbose: int = ...) -> float: ...
diff --git a/typeshed/stdlib/2and3/pstats.pyi b/typeshed/stdlib/2and3/pstats.pyi
new file mode 100644
index 0000000..9a872c2
--- /dev/null
+++ b/typeshed/stdlib/2and3/pstats.pyi
@@ -0,0 +1,33 @@
+from profile import Profile
+from cProfile import Profile as cProfile
+from typing import Any, AnyStr, Dict, IO, Iterable, List, Text, Tuple, TypeVar, Union, overload
+
+_Selector = Union[str, float, int]
+_T = TypeVar('_T', bound='Stats')
+
+class Stats:
+ def __init__(self: _T, __arg: Union[None, str, Text, Profile, cProfile] = ...,
+ *args: Union[None, str, Text, Profile, cProfile, _T],
+ stream: IO[Any]) -> None: ...
+ def init(self, arg: Union[None, str, Text, Profile, cProfile]) -> None: ...
+ def load_stats(self, arg: Union[None, str, Text, Profile, cProfile]) -> None: ...
+ def get_top_level_stats(self) -> None: ...
+ def add(self: _T, *arg_list: Union[None, str, Text, Profile, cProfile, _T]) -> _T: ...
+ def dump_stats(self, filename: AnyStr) -> None: ...
+ def get_sort_arg_defs(self) -> Dict[str, Tuple[Tuple[Tuple[int, int], ...], str]]: ...
+ @overload
+ def sort_stats(self: _T, field: int) -> _T: ...
+ @overload
+ def sort_stats(self: _T, *field: str) -> _T: ...
+ def reverse_order(self: _T) -> _T: ...
+ def strip_dirs(self: _T) -> _T: ...
+ def calc_callees(self) -> None: ...
+ def eval_print_amount(self, sel: _Selector, list: List[str], msg: str) -> Tuple[List[str], str]: ...
+ def get_print_list(self, sel_list: Iterable[_Selector]) -> Tuple[int, List[str]]: ...
+ def print_stats(self: _T, *amount: _Selector) -> _T: ...
+ def print_callees(self: _T, *amount: _Selector) -> _T: ...
+ def print_callers(self: _T, *amount: _Selector) -> _T: ...
+ def print_call_heading(self, name_size: int, column_title: str) -> None: ...
+ def print_call_line(self, name_size: int, source: str, call_dict: Dict[str, Any], arrow: str = ...) -> None: ...
+ def print_title(self) -> None: ...
+ def print_line(self, func: str) -> None: ...
diff --git a/typeshed/stdlib/2and3/readline.pyi b/typeshed/stdlib/2and3/readline.pyi
new file mode 100644
index 0000000..aff2deb
--- /dev/null
+++ b/typeshed/stdlib/2and3/readline.pyi
@@ -0,0 +1,41 @@
+# Stubs for readline
+
+from typing import Callable, Optional, Sequence
+import sys
+
+_CompleterT = Optional[Callable[[str, int], Optional[str]]]
+_CompDispT = Optional[Callable[[str, Sequence[str], int], None]]
+
+
+def parse_and_bind(string: str) -> None: ...
+def read_init_file(filename: str = ...) -> None: ...
+
+def get_line_buffer() -> str: ...
+def insert_text(string: str) -> None: ...
+def redisplay() -> None: ...
+
+def read_history_file(filename: str = ...) -> None: ...
+def write_history_file(filename: str = ...) -> None: ...
+if sys.version_info >= (3, 5):
+ def append_history_file(nelements: int, filename: str = ...) -> None: ...
+def get_history_length() -> int: ...
+def set_history_length(length: int) -> None: ...
+
+def clear_history() -> None: ...
+def get_current_history_length() -> int: ...
+def get_history_item(index: int) -> str: ...
+def remove_history_item(pos: int) -> None: ...
+def replace_history_item(pos: int, line: str) -> None: ...
+def add_history(string: str) -> None: ...
+
+def set_startup_hook(function: Optional[Callable[[], None]] = ...) -> None: ...
+def set_pre_input_hook(function: Optional[Callable[[], None]] = ...) -> None: ...
+
+def set_completer(function: _CompleterT = ...) -> None: ...
+def get_completer() -> _CompleterT: ...
+def get_completion_type() -> int: ...
+def get_begidx() -> int: ...
+def get_endidx() -> int: ...
+def set_completer_delims(string: str) -> None: ...
+def get_completer_delims() -> str: ...
+def set_completion_display_matches_hook(function: _CompDispT = ...) -> None: ...
diff --git a/typeshed/stdlib/2and3/rlcompleter.pyi b/typeshed/stdlib/2and3/rlcompleter.pyi
new file mode 100644
index 0000000..17e98c6
--- /dev/null
+++ b/typeshed/stdlib/2and3/rlcompleter.pyi
@@ -0,0 +1,13 @@
+# Stubs for rlcompleter
+
+from typing import Optional, Union
+import sys
+
+if sys.version_info >= (3,):
+ _Text = str
+else:
+ _Text = Union[str, unicode]
+
+
+class Completer:
+ def complete(self, text: _Text, state: int) -> Optional[str]: ...
diff --git a/typeshed/stdlib/2and3/site.pyi b/typeshed/stdlib/2and3/site.pyi
new file mode 100644
index 0000000..411677a
--- /dev/null
+++ b/typeshed/stdlib/2and3/site.pyi
@@ -0,0 +1,17 @@
+# Stubs for site
+
+from typing import List, Iterable, Optional
+import sys
+
+PREFIXES = ... # type: List[str]
+ENABLE_USER_SITE = ... # type: Optional[bool]
+USER_SITE = ... # type: Optional[str]
+USER_BASE = ... # type: Optional[str]
+
+if sys.version_info < (3,):
+ def main() -> None: ...
+def addsitedir(sitedir: str,
+ known_paths: Optional[Iterable[str]] = ...) -> None: ...
+def getsitepackages(prefixes: Optional[Iterable[str]] = ...) -> List[str]: ...
+def getuserbase() -> str: ...
+def getusersitepackages() -> str: ...
diff --git a/typeshed/stdlib/2and3/tarfile.pyi b/typeshed/stdlib/2and3/tarfile.pyi
new file mode 100644
index 0000000..32a7ca4
--- /dev/null
+++ b/typeshed/stdlib/2and3/tarfile.pyi
@@ -0,0 +1,178 @@
+# Stubs for tarfile
+
+from typing import (
+ Callable, IO, Iterable, Iterator, List, Mapping, Optional, Type,
+ Union,
+)
+import sys
+from types import TracebackType
+
+
+ENCODING = ... # type: str
+
+USTAR_FORMAT = ... # type: int
+GNU_FORMAT = ... # type: int
+PAX_FORMAT = ... # type: int
+DEFAULT_FORMAT = ... # type: int
+
+REGTYPE = ... # type: bytes
+AREGTYPE = ... # type: bytes
+LNKTYPE = ... # type: bytes
+SYMTYPE = ... # type: bytes
+DIRTYPE = ... # type: bytes
+FIFOTYPE = ... # type: bytes
+CONTTYPE = ... # type: bytes
+CHRTYPE = ... # type: bytes
+BLKTYPE = ... # type: bytes
+GNUTYPE_SPARSE = ... # type: bytes
+
+if sys.version_info < (3,):
+ TAR_PLAIN = ... # type: int
+ TAR_GZIPPED = ... # type: int
+
+def open(name: Optional[str] = ..., mode: str = ...,
+ fileobj: Optional[IO[bytes]] = ..., bufsize: int = ...,
+ *, format: Optional[int] = ..., tarinfo: Optional[TarInfo] = ...,
+ dereference: Optional[bool] = ...,
+ ignore_zeros: Optional[bool] = ...,
+ encoding: Optional[str] = ..., errors: str = ...,
+ pax_headers: Optional[Mapping[str, str]] = ...,
+ debug: Optional[int] = ...,
+ errorlevel: Optional[int] = ...) -> TarFile: ...
+
+
+class TarFile(Iterable[TarInfo]):
+ name = ... # type: Optional[str]
+ mode = ... # type: str
+ fileobj = ... # type: Optional[IO[bytes]]
+ format = ... # type: Optional[int]
+ tarinfo = ... # type: Optional[TarInfo]
+ dereference = ... # type: Optional[bool]
+ ignore_zeros = ... # type: Optional[bool]
+ encoding = ... # type: Optional[str]
+ errors = ... # type: str
+ pax_headers = ... # type: Optional[Mapping[str, str]]
+ debug = ... # type: Optional[int]
+ errorlevel = ... # type: Optional[int]
+ if sys.version_info < (3,):
+ posix = ... # type: bool
+ def __init__(self, name: Optional[str] = ..., mode: str = ...,
+ fileobj: Optional[IO[bytes]] = ...,
+ format: Optional[int] = ..., tarinfo: Optional[TarInfo] = ...,
+ dereference: Optional[bool] = ...,
+ ignore_zeros: Optional[bool] = ...,
+ encoding: Optional[str] = ..., errors: str = ...,
+ pax_headers: Optional[Mapping[str, str]] = ...,
+ debug: Optional[int] = ...,
+ errorlevel: Optional[int] = ...) -> None: ...
+ def __enter__(self) -> TarFile: ...
+ def __exit__(self,
+ exc_type: Optional[Type[BaseException]],
+ exc_val: Optional[Exception],
+ exc_tb: Optional[TracebackType]) -> bool: ...
+ def __iter__(self) -> Iterator[TarInfo]: ...
+ @classmethod
+ def open(cls, name: Optional[str] = ..., mode: str = ...,
+ fileobj: Optional[IO[bytes]] = ..., bufsize: int = ...,
+ *, format: Optional[int] = ..., tarinfo: Optional[TarInfo] = ...,
+ dereference: Optional[bool] = ...,
+ ignore_zeros: Optional[bool] = ...,
+ encoding: Optional[str] = ..., errors: str = ...,
+ pax_headers: Optional[Mapping[str, str]] = ...,
+ debug: Optional[int] = ...,
+ errorlevel: Optional[int] = ...) -> TarFile: ...
+ def getmember(self, name: str) -> TarInfo: ...
+ def getmembers(self) -> List[TarInfo]: ...
+ def getnames(self) -> List[str]: ...
+ if sys.version_info >= (3, 5):
+ def list(self, verbose: bool = ...,
+ *, members: Optional[List[TarInfo]] = ...) -> None: ...
+ else:
+ def list(self, verbose: bool = ...) -> None: ...
+ def next(self) -> Optional[TarInfo]: ...
+ if sys.version_info >= (3, 5):
+ def extractall(self, path: str = ...,
+ members: Optional[List[TarInfo]] = ...,
+ *, numeric_owner: bool = ...) -> None: ...
+ else:
+ def extractall(self, path: str = ...,
+ members: Optional[List[TarInfo]] = ...) -> None: ...
+ if sys.version_info >= (3, 5):
+ def extract(self, member: Union[str, TarInfo], path: str = ...,
+ set_attrs: bool = ...,
+ *, numeric_owner: bool = ...) -> None: ...
+ elif sys.version_info >= (3,):
+ def extract(self, member: Union[str, TarInfo], path: str = ...,
+ set_attrs: bool = ...) -> None: ...
+ else:
+ def extract(self, member: Union[str, TarInfo],
+ path: str = ...) -> None: ...
+ def extractfile(self,
+ member: Union[str, TarInfo]) -> Optional[IO[bytes]]: ...
+ if sys.version_info >= (3,):
+ def add(self, name: str, arcname: Optional[str] = ...,
+ recursive: bool = ...,
+ exclude: Optional[Callable[[str], bool]] = ..., *,
+ filter: Optional[Callable[[TarInfo], Optional[TarInfo]]] = ...) -> None: ...
+ else:
+ def add(self, name: str, arcname: Optional[str] = ...,
+ recursive: bool = ...,
+ exclude: Optional[Callable[[str], bool]] = ...,
+ filter: Optional[Callable[[TarInfo], Optional[TarInfo]]] = ...) -> None: ...
+ def addfile(self, tarinfo: TarInfo,
+ fileobj: Optional[IO[bytes]] = ...) -> None: ...
+ def gettarinfo(self, name: Optional[str] = ...,
+ arcname: Optional[str] = ...,
+ fileobj: Optional[IO[bytes]] = ...) -> TarInfo: ...
+ def close(self) -> None: ...
+
+
+def is_tarfile(name: str) -> bool: ...
+
+
+if sys.version_info < (3,):
+ class TarFileCompat:
+ def __init__(self, filename: str, mode: str = ...,
+ compression: int = ...) -> None: ...
+
+
+class TarError(Exception): ...
+class ReadError(TarError): ...
+class CompressionError(TarError): ...
+class StreamError(TarError): ...
+class ExtractError(TarError): ...
+class HeaderError(TarError): ...
+
+
+class TarInfo:
+ name = ... # type: str
+ size = ... # type: int
+ mtime = ... # type: int
+ mode = ... # type: int
+ type = ... # type: bytes
+ linkname = ... # type: str
+ uid = ... # type: int
+ gid = ... # type: int
+ uname = ... # type: str
+ gname = ... # type: str
+ pax_headers = ... # type: Mapping[str, str]
+ def __init__(self, name: str = ...) -> None: ...
+ if sys.version_info >= (3,):
+ @classmethod
+ def frombuf(cls, buf: bytes, encoding: str, errors: str) -> TarInfo: ...
+ else:
+ @classmethod
+ def frombuf(cls, buf: bytes) -> TarInfo: ...
+ @classmethod
+ def fromtarfile(cls, tarfile: TarFile) -> TarInfo: ...
+ def tobuf(self, format: Optional[int] = ...,
+ encoding: Optional[str] = ..., errors: str = ...) -> bytes: ...
+ def isfile(self) -> bool: ...
+ def isreg(self) -> bool: ...
+ def isdir(self) -> bool: ...
+ def issym(self) -> bool: ...
+ def islnk(self) -> bool: ...
+ def ischr(self) -> bool: ...
+ def isblk(self) -> bool: ...
+ def isfifo(self) -> bool: ...
+ def isdev(self) -> bool: ...
diff --git a/typeshed/stdlib/2and3/termios.pyi b/typeshed/stdlib/2and3/termios.pyi
new file mode 100644
index 0000000..2e800d4
--- /dev/null
+++ b/typeshed/stdlib/2and3/termios.pyi
@@ -0,0 +1,246 @@
+# Stubs for termios
+
+from typing import IO, List, Union
+
+_FD = Union[int, IO[str]]
+_Attr = List[Union[int, List[bytes]]]
+
+# TODO constants not really documented
+B0 = ... # type: int
+B1000000 = ... # type: int
+B110 = ... # type: int
+B115200 = ... # type: int
+B1152000 = ... # type: int
+B1200 = ... # type: int
+B134 = ... # type: int
+B150 = ... # type: int
+B1500000 = ... # type: int
+B1800 = ... # type: int
+B19200 = ... # type: int
+B200 = ... # type: int
+B2000000 = ... # type: int
+B230400 = ... # type: int
+B2400 = ... # type: int
+B2500000 = ... # type: int
+B300 = ... # type: int
+B3000000 = ... # type: int
+B3500000 = ... # type: int
+B38400 = ... # type: int
+B4000000 = ... # type: int
+B460800 = ... # type: int
+B4800 = ... # type: int
+B50 = ... # type: int
+B500000 = ... # type: int
+B57600 = ... # type: int
+B576000 = ... # type: int
+B600 = ... # type: int
+B75 = ... # type: int
+B921600 = ... # type: int
+B9600 = ... # type: int
+BRKINT = ... # type: int
+BS0 = ... # type: int
+BS1 = ... # type: int
+BSDLY = ... # type: int
+CBAUD = ... # type: int
+CBAUDEX = ... # type: int
+CDSUSP = ... # type: int
+CEOF = ... # type: int
+CEOL = ... # type: int
+CEOT = ... # type: int
+CERASE = ... # type: int
+CFLUSH = ... # type: int
+CIBAUD = ... # type: int
+CINTR = ... # type: int
+CKILL = ... # type: int
+CLNEXT = ... # type: int
+CLOCAL = ... # type: int
+CQUIT = ... # type: int
+CR0 = ... # type: int
+CR1 = ... # type: int
+CR2 = ... # type: int
+CR3 = ... # type: int
+CRDLY = ... # type: int
+CREAD = ... # type: int
+CRPRNT = ... # type: int
+CRTSCTS = ... # type: int
+CS5 = ... # type: int
+CS6 = ... # type: int
+CS7 = ... # type: int
+CS8 = ... # type: int
+CSIZE = ... # type: int
+CSTART = ... # type: int
+CSTOP = ... # type: int
+CSTOPB = ... # type: int
+CSUSP = ... # type: int
+CWERASE = ... # type: int
+ECHO = ... # type: int
+ECHOCTL = ... # type: int
+ECHOE = ... # type: int
+ECHOK = ... # type: int
+ECHOKE = ... # type: int
+ECHONL = ... # type: int
+ECHOPRT = ... # type: int
+EXTA = ... # type: int
+EXTB = ... # type: int
+FF0 = ... # type: int
+FF1 = ... # type: int
+FFDLY = ... # type: int
+FIOASYNC = ... # type: int
+FIOCLEX = ... # type: int
+FIONBIO = ... # type: int
+FIONCLEX = ... # type: int
+FIONREAD = ... # type: int
+FLUSHO = ... # type: int
+HUPCL = ... # type: int
+ICANON = ... # type: int
+ICRNL = ... # type: int
+IEXTEN = ... # type: int
+IGNBRK = ... # type: int
+IGNCR = ... # type: int
+IGNPAR = ... # type: int
+IMAXBEL = ... # type: int
+INLCR = ... # type: int
+INPCK = ... # type: int
+IOCSIZE_MASK = ... # type: int
+IOCSIZE_SHIFT = ... # type: int
+ISIG = ... # type: int
+ISTRIP = ... # type: int
+IUCLC = ... # type: int
+IXANY = ... # type: int
+IXOFF = ... # type: int
+IXON = ... # type: int
+NCC = ... # type: int
+NCCS = ... # type: int
+NL0 = ... # type: int
+NL1 = ... # type: int
+NLDLY = ... # type: int
+NOFLSH = ... # type: int
+N_MOUSE = ... # type: int
+N_PPP = ... # type: int
+N_SLIP = ... # type: int
+N_STRIP = ... # type: int
+N_TTY = ... # type: int
+OCRNL = ... # type: int
+OFDEL = ... # type: int
+OFILL = ... # type: int
+OLCUC = ... # type: int
+ONLCR = ... # type: int
+ONLRET = ... # type: int
+ONOCR = ... # type: int
+OPOST = ... # type: int
+PARENB = ... # type: int
+PARMRK = ... # type: int
+PARODD = ... # type: int
+PENDIN = ... # type: int
+TAB0 = ... # type: int
+TAB1 = ... # type: int
+TAB2 = ... # type: int
+TAB3 = ... # type: int
+TABDLY = ... # type: int
+TCFLSH = ... # type: int
+TCGETA = ... # type: int
+TCGETS = ... # type: int
+TCIFLUSH = ... # type: int
+TCIOFF = ... # type: int
+TCIOFLUSH = ... # type: int
+TCION = ... # type: int
+TCOFLUSH = ... # type: int
+TCOOFF = ... # type: int
+TCOON = ... # type: int
+TCSADRAIN = ... # type: int
+TCSAFLUSH = ... # type: int
+TCSANOW = ... # type: int
+TCSBRK = ... # type: int
+TCSBRKP = ... # type: int
+TCSETA = ... # type: int
+TCSETAF = ... # type: int
+TCSETAW = ... # type: int
+TCSETS = ... # type: int
+TCSETSF = ... # type: int
+TCSETSW = ... # type: int
+TCXONC = ... # type: int
+TIOCCONS = ... # type: int
+TIOCEXCL = ... # type: int
+TIOCGETD = ... # type: int
+TIOCGICOUNT = ... # type: int
+TIOCGLCKTRMIOS = ... # type: int
+TIOCGPGRP = ... # type: int
+TIOCGSERIAL = ... # type: int
+TIOCGSOFTCAR = ... # type: int
+TIOCGWINSZ = ... # type: int
+TIOCINQ = ... # type: int
+TIOCLINUX = ... # type: int
+TIOCMBIC = ... # type: int
+TIOCMBIS = ... # type: int
+TIOCMGET = ... # type: int
+TIOCMIWAIT = ... # type: int
+TIOCMSET = ... # type: int
+TIOCM_CAR = ... # type: int
+TIOCM_CD = ... # type: int
+TIOCM_CTS = ... # type: int
+TIOCM_DSR = ... # type: int
+TIOCM_DTR = ... # type: int
+TIOCM_LE = ... # type: int
+TIOCM_RI = ... # type: int
+TIOCM_RNG = ... # type: int
+TIOCM_RTS = ... # type: int
+TIOCM_SR = ... # type: int
+TIOCM_ST = ... # type: int
+TIOCNOTTY = ... # type: int
+TIOCNXCL = ... # type: int
+TIOCOUTQ = ... # type: int
+TIOCPKT = ... # type: int
+TIOCPKT_DATA = ... # type: int
+TIOCPKT_DOSTOP = ... # type: int
+TIOCPKT_FLUSHREAD = ... # type: int
+TIOCPKT_FLUSHWRITE = ... # type: int
+TIOCPKT_NOSTOP = ... # type: int
+TIOCPKT_START = ... # type: int
+TIOCPKT_STOP = ... # type: int
+TIOCSCTTY = ... # type: int
+TIOCSERCONFIG = ... # type: int
+TIOCSERGETLSR = ... # type: int
+TIOCSERGETMULTI = ... # type: int
+TIOCSERGSTRUCT = ... # type: int
+TIOCSERGWILD = ... # type: int
+TIOCSERSETMULTI = ... # type: int
+TIOCSERSWILD = ... # type: int
+TIOCSER_TEMT = ... # type: int
+TIOCSETD = ... # type: int
+TIOCSLCKTRMIOS = ... # type: int
+TIOCSPGRP = ... # type: int
+TIOCSSERIAL = ... # type: int
+TIOCSSOFTCAR = ... # type: int
+TIOCSTI = ... # type: int
+TIOCSWINSZ = ... # type: int
+TOSTOP = ... # type: int
+VDISCARD = ... # type: int
+VEOF = ... # type: int
+VEOL = ... # type: int
+VEOL2 = ... # type: int
+VERASE = ... # type: int
+VINTR = ... # type: int
+VKILL = ... # type: int
+VLNEXT = ... # type: int
+VMIN = ... # type: int
+VQUIT = ... # type: int
+VREPRINT = ... # type: int
+VSTART = ... # type: int
+VSTOP = ... # type: int
+VSUSP = ... # type: int
+VSWTC = ... # type: int
+VSWTCH = ... # type: int
+VT0 = ... # type: int
+VT1 = ... # type: int
+VTDLY = ... # type: int
+VTIME = ... # type: int
+VWERASE = ... # type: int
+XCASE = ... # type: int
+XTABS = ... # type: int
+
+def tcgetattr(fd: _FD) -> _Attr: ...
+def tcsetattr(fd: _FD, when: int, attributes: _Attr) -> None: ...
+def tcsendbreak(fd: _FD, duration: int) -> None: ...
+def tcdrain(fd: _FD) -> None: ...
+def tcflush(fd: _FD, queue: int) -> None: ...
+def tcflow(fd: _FD, action: int) -> None: ...
diff --git a/typeshed/stdlib/2and3/threading.pyi b/typeshed/stdlib/2and3/threading.pyi
new file mode 100644
index 0000000..6d0e4a6
--- /dev/null
+++ b/typeshed/stdlib/2and3/threading.pyi
@@ -0,0 +1,191 @@
+# Stubs for threading
+
+from typing import (
+ Any, Callable, Iterable, List, Mapping, Optional, Tuple, Type, Union,
+ TypeVar,
+)
+from types import FrameType, TracebackType
+import sys
+
+# TODO recursive type
+_TF = Callable[[FrameType, str, Any], Optional[Callable[..., Any]]]
+
+_PF = Callable[[FrameType, str, Any], None]
+_T = TypeVar('_T')
+
+
+def active_count() -> int: ...
+if sys.version_info < (3,):
+ def activeCount() -> int: ...
+
+def current_thread() -> Thread: ...
+if sys.version_info < (3,):
+ def currentThread() -> Thread: ...
+
+if sys.version_info >= (3,):
+ def get_ident() -> int: ...
+
+def enumerate() -> List[Thread]: ...
+
+if sys.version_info >= (3, 4):
+ def main_thread() -> Thread: ...
+
+def settrace(func: _TF) -> None: ...
+def setprofile(func: _PF) -> None: ...
+def stack_size(size: int = ...) -> int: ...
+
+if sys.version_info >= (3,):
+ TIMEOUT_MAX = ... # type: int
+
+if sys.version_info < (3,):
+ class ThreadError(Exception): ...
+
+
+# TODO: Change to a class with __getattr__ and __setattr__
+# once mypy supports universal __setattr__.
+# See https://github.com/python/mypy/issues/521
+local = ... # type: Any
+
+
+class Thread:
+ name = ... # type: str
+ ident = ... # type: Optional[int]
+ daemon = ... # type: bool
+ if sys.version_info >= (3,):
+ def __init__(self, group: None = ...,
+ target: Optional[Callable[..., None]] = ...,
+ name: Optional[str] = ...,
+ args: Tuple[Any, ...] = ...,
+ kwargs: Mapping[str, Any] = ...,
+ *, daemon: Optional[bool] = ...) -> None: ...
+ else:
+ def __init__(self, group: None = ...,
+ target: Optional[Callable[..., None]] = ...,
+ name: Optional[str] = ...,
+ args: Tuple[Any, ...] = ...,
+ kwargs: Mapping[str, Any] = ...) -> None: ...
+ def start(self) -> None: ...
+ def run(self) -> None: ...
+ def join(self, timeout: Optional[float] = ...) -> None: ...
+ def getName(self) -> str: ...
+ def setName(self, name: str) -> None: ...
+ def is_alive(self) -> bool: ...
+ if sys.version_info < (3,):
+ def isAlive(self) -> bool: ...
+ def isDaemon(self) -> bool: ...
+ def setDaemon(self, daemonic: bool) -> None: ...
+
+
+class _DummyThread(Thread):
+ pass
+
+
+class Lock:
+ def __init__(self) -> None: ...
+ def __enter__(self) -> bool: ...
+ def __exit__(self, exc_type: Optional[Type[BaseException]],
+ exc_val: Optional[Exception],
+ exc_tb: Optional[TracebackType]) -> bool: ...
+ if sys.version_info >= (3,):
+ def acquire(self, blocking: bool = ..., timeout: int = ...) -> bool: ...
+ else:
+ def acquire(self, blocking: bool = ...) -> bool: ...
+ def release(self) -> None: ...
+ def locked(self) -> bool: ...
+
+
+class _RLock:
+ def __init__(self) -> None: ...
+ def __enter__(self) -> bool: ...
+ def __exit__(self, exc_type: Optional[Type[BaseException]],
+ exc_val: Optional[Exception],
+ exc_tb: Optional[TracebackType]) -> bool: ...
+ if sys.version_info >= (3,):
+ def acquire(self, blocking: bool = ..., timeout: int = ...) -> bool: ...
+ else:
+ def acquire(self, blocking: bool = ...) -> bool: ...
+ def release(self) -> None: ...
+
+
+RLock = _RLock
+
+
+class Condition:
+ def __init__(self, lock: Union[Lock, _RLock, None] = ...) -> None: ...
+ def __enter__(self) -> bool: ...
+ def __exit__(self, exc_type: Optional[Type[BaseException]],
+ exc_val: Optional[Exception],
+ exc_tb: Optional[TracebackType]) -> bool: ...
+ if sys.version_info >= (3,):
+ def acquire(self, blocking: bool = ..., timeout: int = ...) -> bool: ...
+ else:
+ def acquire(self, blocking: bool = ...) -> bool: ...
+ def release(self) -> None: ...
+ def wait(self, timeout: Optional[float] = ...) -> bool: ...
+ if sys.version_info >= (3,):
+ def wait_for(self, predicate: Callable[[], _T],
+ timeout: Optional[float]) -> _T: ...
+ def notify(self, n: int = ...) -> None: ...
+ def notify_all(self) -> None: ...
+ def notifyAll(self) -> None: ...
+
+
+class Semaphore:
+ def __init__(self, value: int = ...) -> None: ...
+ def __enter__(self) -> bool: ...
+ def __exit__(self, exc_type: Optional[Type[BaseException]],
+ exc_val: Optional[Exception],
+ exc_tb: Optional[TracebackType]) -> bool: ...
+ if sys.version_info >= (3,):
+ def acquire(self, blocking: bool = ..., timeout: int = ...) -> bool: ...
+ else:
+ def acquire(self, blocking: bool = ...) -> bool: ...
+ def release(self) -> None: ...
+
+class BoundedSemaphore:
+ def __init__(self, value: int = ...) -> None: ...
+ def __enter__(self) -> bool: ...
+ def __exit__(self, exc_type: Optional[Type[BaseException]],
+ exc_val: Optional[Exception],
+ exc_tb: Optional[TracebackType]) -> bool: ...
+ if sys.version_info >= (3,):
+ def acquire(self, blocking: bool = ..., timeout: int = ...) -> bool: ...
+ else:
+ def acquire(self, blocking: bool = ...) -> bool: ...
+ def release(self) -> None: ...
+
+
+class Event:
+ def __init__(self) -> None: ...
+ def is_set(self) -> bool: ...
+ if sys.version_info < (3,):
+ def isSet(self) -> bool: ...
+ def set(self) -> None: ...
+ def clear(self) -> None: ...
+ def wait(self, timeout: Optional[float] = ...) -> bool: ...
+
+
+class Timer(Thread):
+ if sys.version_info >= (3,):
+ def __init__(self, interval: float, function: Callable[..., None],
+ args: Optional[List[Any]] = ...,
+ kwargs: Optional[Mapping[str, Any]] = ...) -> None: ...
+ else:
+ def __init__(self, interval: float, function: Callable[..., None],
+ args: List[Any] = ...,
+ kwargs: Mapping[str, Any] = ...) -> None: ...
+ def cancel(self) -> None: ...
+
+
+if sys.version_info >= (3,):
+ class Barrier:
+ parties = ... # type: int
+ n_waiting = ... # type: int
+ broken = ... # type: bool
+ def __init__(self, parties: int, action: Optional[Callable[[], None]] = ...,
+ timeout: Optional[float] = ...) -> None: ...
+ def wait(self, timeout: Optional[float] = ...) -> int: ...
+ def reset(self) -> None: ...
+ def abort(self) -> None: ...
+
+ class BrokenBarrierError(RuntimeError): ...
diff --git a/typeshed/stdlib/2and3/traceback.pyi b/typeshed/stdlib/2and3/traceback.pyi
new file mode 100644
index 0000000..ff34ad4
--- /dev/null
+++ b/typeshed/stdlib/2and3/traceback.pyi
@@ -0,0 +1,100 @@
+# Stubs for traceback
+
+from typing import Generator, IO, Iterator, List, Mapping, Optional, Tuple, Type
+from types import FrameType, TracebackType
+import sys
+
+_PT = Tuple[str, int, str, Optional[str]]
+
+
+def print_tb(tb: TracebackType, limit: Optional[int] = ...,
+ file: Optional[IO[str]] = ...) -> None: ...
+if sys.version_info >= (3,):
+ def print_exception(etype: Type[BaseException], value: BaseException,
+ tb: Optional[TracebackType], limit: Optional[int] = ...,
+ file: Optional[IO[str]] = ...,
+ chain: bool = ...) -> None: ...
+ def print_exc(limit: Optional[int] = ..., file: Optional[IO[str]] = ...,
+ chain: bool = ...) -> None: ...
+ def print_last(limit: Optional[int] = ..., file: Optional[IO[str]] = ...,
+ chain: bool = ...) -> None: ...
+else:
+ def print_exception(etype: Type[BaseException], value: BaseException,
+ tb: Optional[TracebackType], limit: Optional[int] = ...,
+ file: Optional[IO[str]] = ...) -> None: ...
+ def print_exc(limit: Optional[int] = ...,
+ file: Optional[IO[str]] = ...) -> None: ...
+ def print_last(limit: Optional[int] = ...,
+ file: Optional[IO[str]] = ...) -> None: ...
+def print_stack(f: Optional[FrameType] = ..., limit: Optional[int] = ...,
+ file: Optional[IO[str]] = ...) -> None: ...
+def extract_tb(tb: TracebackType, limit: Optional[int] = ...) -> List[_PT]: ...
+def extract_stack(f: Optional[FrameType] = ...,
+ limit: Optional[int] = ...) -> List[_PT]: ...
+def format_list(extracted_list: List[_PT]) -> List[str]: ...
+def format_exception_only(etype: Type[BaseException],
+ value: BaseException) -> List[str]: ...
+if sys.version_info >= (3,):
+ def format_exception(etype: Type[BaseException], value: BaseException,
+ tb: TracebackType, limit: Optional[int] = ...,
+ chain: bool = ...) -> List[str]: ...
+ def format_exc(limit: Optional[int] = ..., chain: bool = ...) -> str: ...
+else:
+ def format_exception(etype: Type[BaseException], value: BaseException,
+ tb: TracebackType,
+ limit: Optional[int] = ...) -> List[str]: ...
+ def format_exc(limit: Optional[int] = ...) -> str: ...
+def format_tb(tb: TracebackType, limit: Optional[int] = ...) -> List[str]: ...
+def format_stack(f: Optional[FrameType] = ...,
+ limit: Optional[int] = ...) -> List[str]: ...
+if sys.version_info >= (3, 4):
+ def clear_frames(tb: TracebackType) -> None: ...
+if sys.version_info >= (3, 5):
+ def walk_stack(f: Optional[FrameType]) -> Iterator[Tuple[FrameType, int]]: ...
+ def walk_tb(tb: TracebackType) -> Iterator[Tuple[FrameType, int]]: ...
+if sys.version_info < (3,):
+ def tb_lineno(tb: TracebackType) -> int: ...
+
+
+if sys.version_info >= (3, 5):
+ class TracebackException:
+ __cause__ = ... # type:TracebackException
+ __context__ = ... # type:TracebackException
+ __suppress_context__ = ... # type: bool
+ stack = ... # type: StackSummary
+ exc_type = ... # type: Type[BaseException]
+ filename = ... # type: str
+ lineno = ... # type: int
+ text = ... # type: str
+ offset = ... # type: int
+ msg = ... # type: str
+ def __init__(self, exc_type: Type[BaseException],
+ exc_value: BaseException, exc_traceback: TracebackType,
+ *, limit: Optional[int] = ..., lookup_lines: bool = ...,
+ capture_locals: bool = ...) -> None: ...
+ @classmethod
+ def from_exception(cls, exc: BaseException,
+ *, limit: Optional[int] = ...,
+ lookup_lines: bool = ...,
+ capture_locals: bool = ...) -> TracebackException: ...
+ def format(self, *, chain: bool = ...) -> Generator[str, None, None]: ...
+ def format_exception_only(self) -> Generator[str, None, None]: ...
+
+
+if sys.version_info >= (3, 5):
+ class StackSummary:
+ @classmethod
+ def extract(cls,
+ frame_gen: Generator[Tuple[FrameType, int], None, None],
+ *, limit: Optional[int] = ..., lookup_lines: bool = ...,
+ capture_locals: bool = ...) -> StackSummary: ...
+ @classmethod
+ def from_list(cls, a_list: List[_PT]) -> StackSummary: ...
+
+
+if sys.version_info >= (3, 5):
+ class FrameSummary:
+ def __init__(self, filename: str, lineno: int, name: str,
+ lookup_line: bool = ...,
+ locals: Optional[Mapping[str, str]] = ...,
+ line: Optional[int] = ...) -> None: ...
diff --git a/typeshed/stdlib/2and3/warnings.pyi b/typeshed/stdlib/2and3/warnings.pyi
new file mode 100644
index 0000000..6e8507b
--- /dev/null
+++ b/typeshed/stdlib/2and3/warnings.pyi
@@ -0,0 +1,39 @@
+# Stubs for warnings
+
+from typing import Any, Dict, List, NamedTuple, Optional, TextIO, Tuple, Type, Union
+from types import ModuleType, TracebackType
+
+def warn(message: Union[str, Warning], category: Optional[Type[Warning]] = ...,
+ stacklevel: int = ...) -> None: ...
+def warn_explicit(message: Union[str, Warning], category: Type[Warning],
+ filename: str, lineno: int, module: Optional[str] = ...,
+ registry: Optional[Dict[Union[str, Tuple[str, Type[Warning], int]], int]] = ...,
+ module_globals: Optional[Dict[str, Any]] = ...) -> None: ...
+def showwarning(message: str, category: Type[Warning], filename: str,
+ lineno: int, file: Optional[TextIO] = ...,
+ line: Optional[str] = ...) -> None: ...
+def formatwarning(message: str, category: Type[Warning], filename: str,
+ lineno: int, line: Optional[str] = ...) -> None: ...
+def filterwarnings(action: str, message: str = ...,
+ category: Type[Warning] = ..., module: str = ...,
+ lineno: int = ..., append: bool = ...) -> None: ...
+def simplefilter(action: str, category: Type[Warning] = ..., lineno: int = ...,
+ append: bool = ...) -> None: ...
+def resetwarnings() -> None: ...
+
+_Record = NamedTuple('_Record',
+ [('message', str),
+ ('category', Type[Warning]),
+ ('filename', str),
+ ('lineno', int),
+ ('file', Optional[TextIO]),
+ ('line', Optional[str])]
+)
+
+class catch_warnings:
+ def __init__(self, *, record: bool = ...,
+ module: Optional[ModuleType] = ...) -> None: ...
+ def __enter__(self) -> Optional[List[_Record]]: ...
+ def __exit__(self, exc_type: Optional[Type[BaseException]],
+ exc_val: Optional[Exception],
+ exc_tb: Optional[TracebackType]) -> bool: ...
diff --git a/typeshed/stdlib/2and3/webbrowser.pyi b/typeshed/stdlib/2and3/webbrowser.pyi
new file mode 100644
index 0000000..a478edf
--- /dev/null
+++ b/typeshed/stdlib/2and3/webbrowser.pyi
@@ -0,0 +1,100 @@
+# Stubs for webbrowser (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+import sys
+from typing import Any, Optional, Callable, List
+
+class Error(Exception): ...
+
+def register(name: str, klass: Optional[Callable[[], BaseBrowser]], instance: BaseBrowser=..., update_tryorder: int=...) -> None: ...
+def get(using: str=...) -> BaseBrowser: ...
+def open(url: str, new: int=..., autoraise: bool=...) -> bool: ...
+def open_new(url: str) -> bool: ...
+def open_new_tab(url: str) -> bool: ...
+
+class BaseBrowser:
+ args = ... # type: List[str]
+ name = ... # type: str
+ basename = ... # type: str
+ def __init__(self, name: str=...) -> None: ...
+ def open(self, url: str, new: int=..., autoraise: bool=...) -> bool: ...
+ def open_new(self, url: str) -> bool: ...
+ def open_new_tab(self, url: str) -> bool: ...
+
+class GenericBrowser(BaseBrowser):
+ args = ... # type: List[str]
+ name = ... # type: str
+ basename = ... # type: str
+ def __init__(self, name: str) -> None: ...
+ def open(self, url: str, new: int=..., autoraise: bool=...) -> bool: ...
+
+class BackgroundBrowser(GenericBrowser):
+ def open(self, url: str, new: int=..., autoraise: bool=...) -> bool: ...
+
+class UnixBrowser(BaseBrowser):
+ raise_opts = ... # type: List[str]
+ background = ... # type: bool
+ redirect_stdout = ... # type: bool
+ remote_args = ... # type: List[str]
+ remote_action = ... # type: str
+ remote_action_newwin = ... # type: str
+ remote_action_newtab = ... # type: str
+ def open(self, url: str, new: int=..., autoraise: bool=...) -> bool: ...
+
+class Mozilla(UnixBrowser):
+ raise_opts = ... # type: List[str]
+ remote_args = ... # type: List[str]
+ remote_action = ... # type: str
+ remote_action_newwin = ... # type: str
+ remote_action_newtab = ... # type: str
+ background = ... # type: bool
+
+class Galeon(UnixBrowser):
+ raise_opts = ... # type: List[str]
+ remote_args = ... # type: List[str]
+ remote_action = ... # type: str
+ remote_action_newwin = ... # type: str
+ background = ... # type: bool
+
+if sys.version_info[:2] == (2, 7) or sys.version_info >= (3, 3):
+ class Chrome(UnixBrowser):
+ remote_args = ... # type: List[str]
+ remote_action = ... # type: str
+ remote_action_newwin = ... # type: str
+ remote_action_newtab = ... # type: str
+ background = ... # type: bool
+
+class Opera(UnixBrowser):
+ raise_opts = ... # type: List[str]
+ remote_args = ... # type: List[str]
+ remote_action = ... # type: str
+ remote_action_newwin = ... # type: str
+ remote_action_newtab = ... # type: str
+ background = ... # type: bool
+
+class Elinks(UnixBrowser):
+ remote_args = ... # type: List[str]
+ remote_action = ... # type: str
+ remote_action_newwin = ... # type: str
+ remote_action_newtab = ... # type: str
+ background = ... # type: bool
+ redirect_stdout = ... # type: bool
+
+class Konqueror(BaseBrowser):
+ def open(self, url: str, new: int=..., autoraise: bool=...) -> bool: ...
+
+class Grail(BaseBrowser):
+ def open(self, url: str, new: int=..., autoraise: bool=...) -> bool: ...
+
+class WindowsDefault(BaseBrowser):
+ def open(self, url: str, new: int=..., autoraise: bool=...) -> bool: ...
+
+class MacOSX(BaseBrowser):
+ name = ... # type: str
+ def __init__(self, name: str) -> None: ...
+ def open(self, url: str, new: int=..., autoraise: bool=...) -> bool: ...
+
+class MacOSXOSAScript(BaseBrowser):
+ def __init__(self, name: str) -> None: ...
+ def open(self, url: str, new: int=..., autoraise: bool=...) -> bool: ...
diff --git a/typeshed/stdlib/2and3/xml/__init__.pyi b/typeshed/stdlib/2and3/xml/__init__.pyi
new file mode 100644
index 0000000..a0a0a89
--- /dev/null
+++ b/typeshed/stdlib/2and3/xml/__init__.pyi
@@ -0,0 +1,20 @@
+# Stubs for xml.sax (Python 3)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+class SAXException(Exception):
+ def __init__(self, msg, exception=None): ...
+ def getMessage(self): ...
+ def getException(self): ...
+ def __getitem__(self, ix): ...
+
+class SAXParseException(SAXException):
+ def __init__(self, msg, exception, locator): ...
+ def getColumnNumber(self): ...
+ def getLineNumber(self): ...
+ def getPublicId(self): ...
+ def getSystemId(self): ...
+
+class SAXNotRecognizedException(SAXException): ...
+class SAXNotSupportedException(SAXException): ...
+class SAXReaderNotAvailable(SAXNotSupportedException): ...
diff --git a/typeshed/stdlib/2and3/xml/sax/__init__.pyi b/typeshed/stdlib/2and3/xml/sax/__init__.pyi
new file mode 100644
index 0000000..71534b0
--- /dev/null
+++ b/typeshed/stdlib/2and3/xml/sax/__init__.pyi
@@ -0,0 +1,34 @@
+from typing import List
+
+import xml.sax
+from xml.sax.xmlreader import InputSource
+from xml.sax.handler import ContentHandler, ErrorHandler
+
+class SAXException(Exception):
+ def __init__(self, msg, exception=None): ...
+ def getMessage(self): ...
+ def getException(self): ...
+ def __getitem__(self, ix): ...
+
+class SAXParseException(SAXException):
+ def __init__(self, msg, exception, locator): ...
+ def getColumnNumber(self): ...
+ def getLineNumber(self): ...
+ def getPublicId(self): ...
+ def getSystemId(self): ...
+
+class SAXNotRecognizedException(SAXException): ...
+class SAXNotSupportedException(SAXException): ...
+class SAXReaderNotAvailable(SAXNotSupportedException): ...
+
+default_parser_list = ... # type: List[str]
+
+def make_parser(parser_list: List[str]) -> xml.sax.xmlreader.XMLReader: ...
+
+def parse(source: str, handler: xml.sax.handler.ContentHandler,
+ errorHandler: xml.sax.handler.ErrorHandler=...): ...
+
+def parseString(string: str, handler: xml.sax.handler.ContentHandler,
+ errorHandler: xml.sax.handler.ErrorHandler=...): ...
+
+def _create_parser(parser_name: str) -> xml.sax.xmlreader.XMLReader: ...
diff --git a/typeshed/stdlib/2and3/xml/sax/handler.pyi b/typeshed/stdlib/2and3/xml/sax/handler.pyi
new file mode 100644
index 0000000..f3221b5
--- /dev/null
+++ b/typeshed/stdlib/2and3/xml/sax/handler.pyi
@@ -0,0 +1,50 @@
+# Stubs for xml.sax.handler (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+version = ... # type: Any
+
+class ErrorHandler:
+ def error(self, exception): ...
+ def fatalError(self, exception): ...
+ def warning(self, exception): ...
+
+class ContentHandler:
+ def __init__(self) -> None: ...
+ def setDocumentLocator(self, locator): ...
+ def startDocument(self): ...
+ def endDocument(self): ...
+ def startPrefixMapping(self, prefix, uri): ...
+ def endPrefixMapping(self, prefix): ...
+ def startElement(self, name, attrs): ...
+ def endElement(self, name): ...
+ def startElementNS(self, name, qname, attrs): ...
+ def endElementNS(self, name, qname): ...
+ def characters(self, content): ...
+ def ignorableWhitespace(self, whitespace): ...
+ def processingInstruction(self, target, data): ...
+ def skippedEntity(self, name): ...
+
+class DTDHandler:
+ def notationDecl(self, name, publicId, systemId): ...
+ def unparsedEntityDecl(self, name, publicId, systemId, ndata): ...
+
+class EntityResolver:
+ def resolveEntity(self, publicId, systemId): ...
+
+feature_namespaces = ... # type: Any
+feature_namespace_prefixes = ... # type: Any
+feature_string_interning = ... # type: Any
+feature_validation = ... # type: Any
+feature_external_ges = ... # type: Any
+feature_external_pes = ... # type: Any
+all_features = ... # type: Any
+property_lexical_handler = ... # type: Any
+property_declaration_handler = ... # type: Any
+property_dom_node = ... # type: Any
+property_xml_string = ... # type: Any
+property_encoding = ... # type: Any
+property_interning_dict = ... # type: Any
+all_properties = ... # type: Any
diff --git a/typeshed/stdlib/2and3/xml/sax/saxutils.pyi b/typeshed/stdlib/2and3/xml/sax/saxutils.pyi
new file mode 100644
index 0000000..7ff053a
--- /dev/null
+++ b/typeshed/stdlib/2and3/xml/sax/saxutils.pyi
@@ -0,0 +1,58 @@
+# Stubs for xml.sax.saxutils (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Mapping
+
+from xml.sax import handler
+from xml.sax import xmlreader
+
+def escape(data: str, entities: Mapping[str, str] = ...) -> str: ...
+def unescape(data: str, entities: Mapping[str, str] = ...) -> str: ...
+def quoteattr(data: str, entities: Mapping[str, str] = ...) -> str: ...
+
+class XMLGenerator(handler.ContentHandler):
+ def __init__(self, out=..., encoding=...) -> None: ...
+ def startDocument(self): ...
+ def endDocument(self): ...
+ def startPrefixMapping(self, prefix, uri): ...
+ def endPrefixMapping(self, prefix): ...
+ def startElement(self, name, attrs): ...
+ def endElement(self, name): ...
+ def startElementNS(self, name, qname, attrs): ...
+ def endElementNS(self, name, qname): ...
+ def characters(self, content): ...
+ def ignorableWhitespace(self, content): ...
+ def processingInstruction(self, target, data): ...
+
+class XMLFilterBase(xmlreader.XMLReader):
+ def __init__(self, parent=...) -> None: ...
+ def error(self, exception): ...
+ def fatalError(self, exception): ...
+ def warning(self, exception): ...
+ def setDocumentLocator(self, locator): ...
+ def startDocument(self): ...
+ def endDocument(self): ...
+ def startPrefixMapping(self, prefix, uri): ...
+ def endPrefixMapping(self, prefix): ...
+ def startElement(self, name, attrs): ...
+ def endElement(self, name): ...
+ def startElementNS(self, name, qname, attrs): ...
+ def endElementNS(self, name, qname): ...
+ def characters(self, content): ...
+ def ignorableWhitespace(self, chars): ...
+ def processingInstruction(self, target, data): ...
+ def skippedEntity(self, name): ...
+ def notationDecl(self, name, publicId, systemId): ...
+ def unparsedEntityDecl(self, name, publicId, systemId, ndata): ...
+ def resolveEntity(self, publicId, systemId): ...
+ def parse(self, source): ...
+ def setLocale(self, locale): ...
+ def getFeature(self, name): ...
+ def setFeature(self, name, state): ...
+ def getProperty(self, name): ...
+ def setProperty(self, name, value): ...
+ def getParent(self): ...
+ def setParent(self, parent): ...
+
+def prepare_input_source(source, base=...): ...
diff --git a/typeshed/stdlib/2and3/xml/sax/xmlreader.pyi b/typeshed/stdlib/2and3/xml/sax/xmlreader.pyi
new file mode 100644
index 0000000..a5f5553
--- /dev/null
+++ b/typeshed/stdlib/2and3/xml/sax/xmlreader.pyi
@@ -0,0 +1,75 @@
+# Stubs for xml.sax.xmlreader (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+class XMLReader:
+ def __init__(self) -> None: ...
+ def parse(self, source): ...
+ def getContentHandler(self): ...
+ def setContentHandler(self, handler): ...
+ def getDTDHandler(self): ...
+ def setDTDHandler(self, handler): ...
+ def getEntityResolver(self): ...
+ def setEntityResolver(self, resolver): ...
+ def getErrorHandler(self): ...
+ def setErrorHandler(self, handler): ...
+ def setLocale(self, locale): ...
+ def getFeature(self, name): ...
+ def setFeature(self, name, state): ...
+ def getProperty(self, name): ...
+ def setProperty(self, name, value): ...
+
+class IncrementalParser(XMLReader):
+ def __init__(self, bufsize=...) -> None: ...
+ def parse(self, source): ...
+ def feed(self, data): ...
+ def prepareParser(self, source): ...
+ def close(self): ...
+ def reset(self): ...
+
+class Locator:
+ def getColumnNumber(self): ...
+ def getLineNumber(self): ...
+ def getPublicId(self): ...
+ def getSystemId(self): ...
+
+class InputSource:
+ def __init__(self, system_id=...) -> None: ...
+ def setPublicId(self, public_id): ...
+ def getPublicId(self): ...
+ def setSystemId(self, system_id): ...
+ def getSystemId(self): ...
+ def setEncoding(self, encoding): ...
+ def getEncoding(self): ...
+ def setByteStream(self, bytefile): ...
+ def getByteStream(self): ...
+ def setCharacterStream(self, charfile): ...
+ def getCharacterStream(self): ...
+
+class AttributesImpl:
+ def __init__(self, attrs) -> None: ...
+ def getLength(self): ...
+ def getType(self, name): ...
+ def getValue(self, name): ...
+ def getValueByQName(self, name): ...
+ def getNameByQName(self, name): ...
+ def getQNameByName(self, name): ...
+ def getNames(self): ...
+ def getQNames(self): ...
+ def __len__(self): ...
+ def __getitem__(self, name): ...
+ def keys(self): ...
+ def has_key(self, name): ...
+ def __contains__(self, name): ...
+ def get(self, name, alternative=...): ...
+ def copy(self): ...
+ def items(self): ...
+ def values(self): ...
+
+class AttributesNSImpl(AttributesImpl):
+ def __init__(self, attrs, qnames) -> None: ...
+ def getValueByQName(self, name): ...
+ def getNameByQName(self, name): ...
+ def getQNameByName(self, name): ...
+ def getQNames(self): ...
+ def copy(self): ...
diff --git a/typeshed/stdlib/2and3/zipfile.pyi b/typeshed/stdlib/2and3/zipfile.pyi
new file mode 100644
index 0000000..5a504e3
--- /dev/null
+++ b/typeshed/stdlib/2and3/zipfile.pyi
@@ -0,0 +1,94 @@
+# Stubs for zipfile
+
+from typing import Callable, IO, List, Optional, Tuple, Type, Union
+from types import TracebackType
+import sys
+
+
+_SZI = Union[str, ZipInfo]
+_DT = Tuple[int, int, int, int, int, int]
+
+
+if sys.version_info >= (3,):
+ class BadZipFile(Exception): ...
+ BadZipfile = BadZipFile
+else:
+ class BadZipfile(Exception): ...
+
+class LargeZipFile(Exception): ...
+
+class ZipFile:
+ debug = ... # type: int
+ comment = ... # type: bytes
+ def __init__(self, file: Union[str, IO[bytes]], mode: str = ..., compression: int = ...,
+ allowZip64: bool = ...) -> None: ...
+ def __enter__(self) -> ZipFile: ...
+ def __exit__(self, exc_type: Optional[Type[BaseException]],
+ exc_val: Optional[Exception],
+ exc_tb: Optional[TracebackType]) -> bool: ...
+ def close(self) -> None: ...
+ def getinfo(self, name: str) -> ZipInfo: ...
+ def infolist(self) -> List[ZipInfo]: ...
+ def namelist(self) -> List[str]: ...
+ def open(self, name: _SZI, mode: str = ...,
+ pwd: Optional[bytes] = ...) -> IO[bytes]: ...
+ def extract(self, member: _SZI, path: Optional[_SZI] = ...,
+ pwd: bytes = ...) -> str: ...
+ def extractall(self, path: Optional[str] = ...,
+ members: Optional[List[str]] = ...,
+ pwd: Optional[bytes] = ...) -> None: ...
+ def printdir(self) -> None: ...
+ def setpassword(self, pwd: bytes) -> None: ...
+ def read(self, name: _SZI, pwd: Optional[bytes] = ...) -> bytes: ...
+ def testzip(self) -> Optional[str]: ...
+ def write(self, filename: str, arcname: Optional[str] = ...,
+ compress_type: Optional[int] = ...) -> None: ...
+ if sys.version_info >= (3,):
+ def writestr(self, zinfo_or_arcname: _SZI, data: Union[bytes, str],
+ compress_type: Optional[int] = ...) -> None: ...
+ else:
+ def writestr(self,
+ zinfo_or_arcname: _SZI, bytes: bytes,
+ compress_type: Optional[int] = ...) -> None: ...
+
+class PyZipFile(ZipFile):
+ if sys.version_info >= (3,):
+ def __init__(self, file: Union[str, IO[bytes]], mode: str = ...,
+ compression: int = ..., allowZip64: bool = ...,
+ opimize: int = ...) -> None: ...
+ def writepy(self, pathname: str, basename: str = ...,
+ filterfunc: Optional[Callable[[str], bool]] = ...) -> None: ...
+ else:
+ def writepy(self,
+ pathname: str, basename: str = ...) -> None: ...
+
+class ZipInfo:
+ filename = ... # type: str
+ date_time = ... # type: _DT
+ compress_type = ... # type: int
+ comment = ... # type: bytes
+ extra = ... # type: bytes
+ create_system = ... # type: int
+ create_version = ... # type: int
+ extract_version = ... # type: int
+ reserved = ... # type: int
+ flag_bits = ... # type: int
+ volume = ... # type: int
+ internal_attr = ... # type: int
+ external_attr = ... # type: int
+ header_offset = ... # type: int
+ CRC = ... # type: int
+ compress_size = ... # type: int
+ file_size = ... # type: int
+ if sys.version_info < (3,):
+ def __init__(self, filename: Optional[str] = ...,
+ date_time: Optional[_DT] = ...) -> None: ...
+
+
+def is_zipfile(filename: Union[str, IO[bytes]]) -> bool: ...
+
+ZIP_STORED = ... # type: int
+ZIP_DEFLATED = ... # type: int
+if sys.version_info >= (3, 3):
+ ZIP_BZIP2 = ... # type: int
+ ZIP_LZMA = ... # type: int
diff --git a/typeshed/stdlib/2and3/zipimport.pyi b/typeshed/stdlib/2and3/zipimport.pyi
new file mode 100644
index 0000000..eb70eb3
--- /dev/null
+++ b/typeshed/stdlib/2and3/zipimport.pyi
@@ -0,0 +1,18 @@
+"""Stub file for the 'zipimport' module."""
+
+from typing import Optional
+from types import CodeType, ModuleType
+
+class ZipImportError(ImportError): ...
+
+class zipimporter(object):
+ archive = ... # type: str
+ prefix = ... # type: str
+ def __init__(self, archivepath: str) -> None: ...
+ def find_module(self, fullname: str, path: str = ...) -> Optional[zipimporter]: ...
+ def get_code(self, fullname: str) -> CodeType: ...
+ def get_data(self, pathname: str) -> str: ...
+ def get_filename(self, fullname: str) -> str: ...
+ def get_source(self, fullname: str) -> Optional[str]: ...
+ def is_package(self, fullname: str) -> bool: ...
+ def load_module(self, fullname: str) -> ModuleType: ...
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/3.2/xml/__init__.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/3.2/xml/__init__.pyi
diff --git a/typeshed/stdlib/3.2/xml/etree/ElementInclude.pyi b/typeshed/stdlib/3.2/xml/etree/ElementInclude.pyi
new file mode 100644
index 0000000..bbe3fb3
--- /dev/null
+++ b/typeshed/stdlib/3.2/xml/etree/ElementInclude.pyi
@@ -0,0 +1,19 @@
+# Stubs for xml.etree.ElementInclude (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Union, Optional, Callable
+from .ElementTree import Element
+
+XINCLUDE = ... # type: str
+XINCLUDE_INCLUDE = ... # type: str
+XINCLUDE_FALLBACK = ... # type: str
+
+class FatalIncludeError(SyntaxError): ...
+
+def default_loader(href: Union[str, bytes, int], parse: str, encoding: Optional[str]=...) -> Union[str, Element]: ...
+
+# TODO: loader is of type default_loader ie it takes a callable that has the
+# same signature as default_loader. But default_loader has a keyword argument
+# Which can't be represented using Callable...
+def include(elem: Element, loader: Callable[..., Union[str, Element]]=...) -> None: ...
diff --git a/typeshed/stdlib/3.2/xml/etree/ElementPath.pyi b/typeshed/stdlib/3.2/xml/etree/ElementPath.pyi
new file mode 100644
index 0000000..b1ea50e
--- /dev/null
+++ b/typeshed/stdlib/3.2/xml/etree/ElementPath.pyi
@@ -0,0 +1,35 @@
+# Stubs for xml.etree.ElementPath (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Pattern, Dict, Generator, Tuple, List, Union, TypeVar, Callable, Optional
+from .ElementTree import Element
+
+xpath_tokenizer_re = ... # type: Pattern
+
+_token = Tuple[str, str]
+_next = Callable[[], _token]
+_callback = Callable[['_SelectorContext', List[Element]], Generator[Element, None, None]]
+
+def xpath_tokenizer(pattern: str, namespaces: Dict[str, str]=...) -> Generator[_token, None, None]: ...
+def get_parent_map(context: '_SelectorContext') -> Dict[Element, Element]: ...
+def prepare_child(next: _next, token: _token) -> _callback: ...
+def prepare_star(next: _next, token: _token) -> _callback: ...
+def prepare_self(next: _next, token: _token) -> _callback: ...
+def prepare_descendant(next: _next, token: _token) -> _callback: ...
+def prepare_parent(next: _next, token: _token) -> _callback: ...
+def prepare_predicate(next: _next, token: _token) -> _callback: ...
+
+ops = ... # type: Dict[str, Callable[[_next, _token], _callback]]
+
+class _SelectorContext:
+ parent_map = ... # type: Dict[Element, Element]
+ root = ... # type: Element
+ def __init__(self, root: Element) -> None: ...
+
+_T = TypeVar('_T')
+
+def iterfind(elem: Element, path: str, namespaces: Dict[str, str]=...) -> List[Element]: ...
+def find(elem: Element, path: str, namespaces: Dict[str, str]=...) -> Optional[Element]: ...
+def findall(elem: Element, path: str, namespaces: Dict[str, str]=...) -> List[Element]: ...
+def findtext(elem: Element, path: str, default: _T=..., namespaces: Dict[str, str]=...) -> Union[_T, str]: ...
diff --git a/typeshed/stdlib/3.2/xml/etree/ElementTree.pyi b/typeshed/stdlib/3.2/xml/etree/ElementTree.pyi
new file mode 100644
index 0000000..0ae1e3f
--- /dev/null
+++ b/typeshed/stdlib/3.2/xml/etree/ElementTree.pyi
@@ -0,0 +1,120 @@
+# Stubs for xml.etree.ElementTree (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, AnyStr, Union, IO, Callable, Dict, List, Tuple, Sequence, Iterator, TypeVar, Optional, KeysView, ItemsView, Generator
+import io
+
+VERSION = ... # type: str
+
+_Ss = TypeVar('_Ss', str, bytes)
+_T = TypeVar('_T')
+_str_or_bytes = Union[str, bytes]
+
+class _SimpleElementPath:
+ def find(self, element: 'Element', tag: _str_or_bytes, namespaces: Any=...) -> Optional['Element']: ...
+ def findtext(self, element: 'Element', tag: _str_or_bytes, default: _T=..., namespaces: Any=...) -> Union[str, bytes, _T]: ...
+ def iterfind(self, element: 'Element', tag: _str_or_bytes, namespaces: Any=...) -> Generator['Element', None, None]: ...
+ def findall(self, element: 'Element', tag: _str_or_bytes, namespaces: Any=...) -> List['Element']: ...
+
+class ParseError(SyntaxError): ...
+
+def iselement(element: 'Element') -> bool: ...
+
+class Element(Sequence['Element']):
+ tag = ... # type: _str_or_bytes
+ attrib = ... # type: Dict[_str_or_bytes, _str_or_bytes]
+ text = ... # type: Optional[_str_or_bytes]
+ tail = ... # type: Optional[_str_or_bytes]
+ def __init__(self, tag: Union[AnyStr, Callable[..., 'Element']], attrib: Dict[AnyStr, AnyStr]=..., **extra: AnyStr) -> None: ...
+ def append(self, subelement: 'Element') -> None: ...
+ def clear(self) -> None: ...
+ def copy(self) -> 'Element': ...
+ def extend(self, elements: Sequence['Element']) -> None: ...
+ def find(self, path: str, namespaces: Dict[str, str]=...) -> Optional['Element']: ...
+ def findall(self, path: str, namespaces: Dict[str, str]=...) -> List['Element']: ...
+ def findtext(self, path: str, default: _T=..., namespaces: Dict[str, str]=...) -> Union[_T, str]: ...
+ def get(self, key: AnyStr, default: _T=...) -> Union[AnyStr, _T]: ...
+ def getchildren(self) -> List['Element']: ...
+ def getiterator(self, tag: Union[str, AnyStr]=...) -> List['Element']: ...
+ def insert(self, index: int, subelement: 'Element') -> None: ...
+ def items(self) -> ItemsView[AnyStr, AnyStr]: ...
+ def iter(self, tag: Union[str, AnyStr]=...) -> Generator['Element', None, None]: ...
+ def iterfind(self, path: str, namespaces: Dict[str, str]=...) -> List['Element']: ...
+ def itertext(self) -> Generator[str, None, None]: ...
+ def keys(self) -> KeysView[AnyStr]: ...
+ def makeelement(self, tag: _Ss, attrib: Dict[_Ss, _Ss]) -> 'Element': ...
+ def remove(self, subelement: 'Element') -> None: ...
+ def set(self, key: AnyStr, value: AnyStr) -> None: ...
+ def __bool__(self) -> bool: ...
+ def __delitem__(self, index: int) -> None: ...
+ def __getitem__(self, index) -> 'Element': ...
+ def __len__(self) -> int: ...
+ def __setitem__(self, index: int, element: 'Element') -> None: ...
+
+def SubElement(parent: Element, tag: AnyStr, attrib: Dict[AnyStr, AnyStr]=..., **extra: AnyStr) -> Element: ...
+def Comment(text: _str_or_bytes=...) -> Element: ...
+def ProcessingInstruction(target: str, text: str=...) -> Element: ...
+
+PI = ... # type: Callable[..., Element]
+
+class QName:
+ text = ... # type: str
+ def __init__(self, text_or_uri: str, tag: str=...) -> None: ...
+
+
+_file_or_filename = Union[str, bytes, int, IO[Any]]
+
+class ElementTree:
+ def __init__(self, element: Element=..., file: _file_or_filename=...) -> None: ...
+ def getroot(self) -> Element: ...
+ def parse(self, source: _file_or_filename, parser: 'XMLParser'=...) -> Element: ...
+ def iter(self, tag: Union[str, AnyStr]=...) -> Generator[Element, None, None]: ...
+ def getiterator(self, tag: Union[str, AnyStr]=...) -> List[Element]: ...
+ def find(self, path: str, namespaces: Dict[str, str]=...) -> Optional[Element]: ...
+ def findtext(self, path: str, default: _T=..., namespaces: Dict[str, str]=...) -> Union[_T, str]: ...
+ def findall(self, path: str, namespaces: Dict[str, str]=...) -> List[Element]: ...
+ def iterfind(self, path: str, namespaces: Dict[str, str]=...) -> List[Element]: ...
+ def write(self, file_or_filename: _file_or_filename, encoding: str=..., xml_declaration: Optional[bool]=..., default_namespace: str=..., method: str=...) -> None: ...
+ def write_c14n(self, file: _file_or_filename) -> None: ...
+
+def register_namespace(prefix: str, uri: str) -> None: ...
+def tostring(element: Element, encoding: str=..., method: str=...) -> str: ...
+
+def tostringlist(element: Element, encoding: str=..., method: str=...) -> List[str]: ...
+def dump(elem: Element) -> None: ...
+def parse(source: _file_or_filename, parser: 'XMLParser'=...) -> ElementTree: ...
+def iterparse(source: _file_or_filename, events: Sequence[str]=..., parser: 'XMLParser'=...) -> Iterator[Tuple[str, Element]]: ...
+
+
+class _IterParseIterator:
+ root = ... # type: Any
+ def __init__(self, source: _file_or_filename, events: Sequence[str], parser: 'XMLParser', close_source: bool=...) -> None: ...
+ def __next__(self) -> Tuple[str, Element]: ...
+ def __iter__(self) -> _IterParseIterator: ...
+
+def XML(text: AnyStr, parser: 'XMLParser'=...) -> Element: ...
+def XMLID(text: AnyStr, parser: 'XMLParser'=...) -> Tuple[Element, Dict[str, Element]]: ...
+
+# TODO-improve this type
+fromstring = ... # type: Callable[..., Element]
+
+def fromstringlist(sequence: Sequence[AnyStr], parser: 'XMLParser'=...) -> Element: ...
+
+class TreeBuilder:
+ def __init__(self, element_factory: Callable[[AnyStr, Dict[AnyStr, AnyStr]], Element]=...) -> None: ...
+ def close(self) -> Element: ...
+ def data(self, data: AnyStr) -> None: ...
+ def start(self, tag: AnyStr, attrs: Dict[AnyStr, AnyStr]) -> Element: ...
+ def end(self, tag: AnyStr) -> Element: ...
+
+class XMLParser:
+ parser = ... # type: Any
+ target = ... # type: TreeBuilder
+ # TODO-what is entity used for???
+ entity = ... # type: Any
+ version = ... # type: str
+ def __init__(self, html: int=..., target: TreeBuilder=..., encoding: str=...) -> None: ...
+ def doctype(self, name: str, pubid: str, system: str) -> None: ...
+ def close(self) -> Any: ... # TODO-most of the time, this will be Element, but it can be anything target.close() returns
+ def feed(self, data: AnyStr)-> None: ...
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/3.2/xml/etree/__init__.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/3.2/xml/etree/__init__.pyi
diff --git a/typeshed/stdlib/3.2/xml/etree/cElementTree.pyi b/typeshed/stdlib/3.2/xml/etree/cElementTree.pyi
new file mode 100644
index 0000000..8f689de
--- /dev/null
+++ b/typeshed/stdlib/3.2/xml/etree/cElementTree.pyi
@@ -0,0 +1,5 @@
+# Stubs for xml.etree.cElementTree (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from xml.etree.ElementTree import * # noqa: F403
diff --git a/typeshed/stdlib/3.3/ipaddress.pyi b/typeshed/stdlib/3.3/ipaddress.pyi
new file mode 100644
index 0000000..69c2454
--- /dev/null
+++ b/typeshed/stdlib/3.3/ipaddress.pyi
@@ -0,0 +1,200 @@
+# Stubs for ipaddress (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+IPV4LENGTH = ... # type: Any
+IPV6LENGTH = ... # type: Any
+
+class AddressValueError(ValueError): ...
+class NetmaskValueError(ValueError): ...
+
+def ip_address(address): ...
+def ip_network(address, strict=...): ...
+def ip_interface(address): ...
+def v4_int_to_packed(address): ...
+def v6_int_to_packed(address): ...
+def summarize_address_range(first, last): ...
+def collapse_addresses(addresses): ...
+def get_mixed_type_key(obj): ...
+
+class _TotalOrderingMixin:
+ def __eq__(self, other): ...
+ def __ne__(self, other): ...
+ def __lt__(self, other): ...
+ def __le__(self, other): ...
+ def __gt__(self, other): ...
+ def __ge__(self, other): ...
+
+class _IPAddressBase(_TotalOrderingMixin):
+ @property
+ def exploded(self): ...
+ @property
+ def compressed(self): ...
+ @property
+ def version(self): ...
+
+class _BaseAddress(_IPAddressBase):
+ def __init__(self, address) -> None: ...
+ def __int__(self): ...
+ def __eq__(self, other): ...
+ def __lt__(self, other): ...
+ def __add__(self, other): ...
+ def __sub__(self, other): ...
+ def __hash__(self): ...
+
+class _BaseNetwork(_IPAddressBase):
+ def __init__(self, address) -> None: ...
+ def hosts(self): ...
+ def __iter__(self): ...
+ def __getitem__(self, n): ...
+ def __lt__(self, other): ...
+ def __eq__(self, other): ...
+ def __hash__(self): ...
+ def __contains__(self, other): ...
+ def overlaps(self, other): ...
+ @property
+ def broadcast_address(self): ...
+ @property
+ def hostmask(self): ...
+ @property
+ def with_prefixlen(self): ...
+ @property
+ def with_netmask(self): ...
+ @property
+ def with_hostmask(self): ...
+ @property
+ def num_addresses(self): ...
+ @property
+ def prefixlen(self): ...
+ def address_exclude(self, other): ...
+ def compare_networks(self, other): ...
+ def subnets(self, prefixlen_diff=..., new_prefix=...): ...
+ def supernet(self, prefixlen_diff=..., new_prefix=...): ...
+ @property
+ def is_multicast(self): ...
+ @property
+ def is_reserved(self): ...
+ @property
+ def is_link_local(self): ...
+ @property
+ def is_private(self): ...
+ @property
+ def is_global(self): ...
+ @property
+ def is_unspecified(self): ...
+ @property
+ def is_loopback(self): ...
+
+class _BaseV4:
+ def __init__(self, address) -> None: ...
+ @property
+ def max_prefixlen(self): ...
+ @property
+ def version(self): ...
+
+class IPv4Address(_BaseV4, _BaseAddress):
+ def __init__(self, address) -> None: ...
+ @property
+ def packed(self): ...
+ @property
+ def is_reserved(self): ...
+ @property
+ def is_private(self): ...
+ @property
+ def is_multicast(self): ...
+ @property
+ def is_unspecified(self): ...
+ @property
+ def is_loopback(self): ...
+ @property
+ def is_link_local(self): ...
+
+class IPv4Interface(IPv4Address):
+ network = ... # type: Any
+ netmask = ... # type: Any
+ hostmask = ... # type: Any
+ def __init__(self, address) -> None: ...
+ def __eq__(self, other): ...
+ def __lt__(self, other): ...
+ def __hash__(self): ...
+ @property
+ def ip(self): ...
+ @property
+ def with_prefixlen(self): ...
+ @property
+ def with_netmask(self): ...
+ @property
+ def with_hostmask(self): ...
+
+class IPv4Network(_BaseV4, _BaseNetwork):
+ network_address = ... # type: Any
+ netmask = ... # type: Any
+ hosts = ... # type: Any
+ def __init__(self, address, strict=...) -> None: ...
+ @property
+ def is_global(self): ...
+
+class _BaseV6:
+ def __init__(self, address) -> None: ...
+ @property
+ def max_prefixlen(self): ...
+ @property
+ def version(self): ...
+
+class IPv6Address(_BaseV6, _BaseAddress):
+ def __init__(self, address) -> None: ...
+ @property
+ def packed(self): ...
+ @property
+ def is_multicast(self): ...
+ @property
+ def is_reserved(self): ...
+ @property
+ def is_link_local(self): ...
+ @property
+ def is_site_local(self): ...
+ @property
+ def is_private(self): ...
+ @property
+ def is_global(self): ...
+ @property
+ def is_unspecified(self): ...
+ @property
+ def is_loopback(self): ...
+ @property
+ def ipv4_mapped(self): ...
+ @property
+ def teredo(self): ...
+ @property
+ def sixtofour(self): ...
+
+class IPv6Interface(IPv6Address):
+ network = ... # type: Any
+ netmask = ... # type: Any
+ hostmask = ... # type: Any
+ def __init__(self, address) -> None: ...
+ def __eq__(self, other): ...
+ def __lt__(self, other): ...
+ def __hash__(self): ...
+ @property
+ def ip(self): ...
+ @property
+ def with_prefixlen(self): ...
+ @property
+ def with_netmask(self): ...
+ @property
+ def with_hostmask(self): ...
+ @property
+ def is_unspecified(self): ...
+ @property
+ def is_loopback(self): ...
+
+class IPv6Network(_BaseV6, _BaseNetwork):
+ network_address = ... # type: Any
+ netmask = ... # type: Any
+ def __init__(self, address, strict=...) -> None: ...
+ def hosts(self): ...
+ @property
+ def is_site_local(self): ...
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/3.3/xml/__init__.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/3.3/xml/__init__.pyi
diff --git a/typeshed/stdlib/3.3/xml/etree/ElementInclude.pyi b/typeshed/stdlib/3.3/xml/etree/ElementInclude.pyi
new file mode 100644
index 0000000..bbe3fb3
--- /dev/null
+++ b/typeshed/stdlib/3.3/xml/etree/ElementInclude.pyi
@@ -0,0 +1,19 @@
+# Stubs for xml.etree.ElementInclude (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Union, Optional, Callable
+from .ElementTree import Element
+
+XINCLUDE = ... # type: str
+XINCLUDE_INCLUDE = ... # type: str
+XINCLUDE_FALLBACK = ... # type: str
+
+class FatalIncludeError(SyntaxError): ...
+
+def default_loader(href: Union[str, bytes, int], parse: str, encoding: Optional[str]=...) -> Union[str, Element]: ...
+
+# TODO: loader is of type default_loader ie it takes a callable that has the
+# same signature as default_loader. But default_loader has a keyword argument
+# Which can't be represented using Callable...
+def include(elem: Element, loader: Callable[..., Union[str, Element]]=...) -> None: ...
diff --git a/typeshed/stdlib/3.3/xml/etree/ElementPath.pyi b/typeshed/stdlib/3.3/xml/etree/ElementPath.pyi
new file mode 100644
index 0000000..b1ea50e
--- /dev/null
+++ b/typeshed/stdlib/3.3/xml/etree/ElementPath.pyi
@@ -0,0 +1,35 @@
+# Stubs for xml.etree.ElementPath (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Pattern, Dict, Generator, Tuple, List, Union, TypeVar, Callable, Optional
+from .ElementTree import Element
+
+xpath_tokenizer_re = ... # type: Pattern
+
+_token = Tuple[str, str]
+_next = Callable[[], _token]
+_callback = Callable[['_SelectorContext', List[Element]], Generator[Element, None, None]]
+
+def xpath_tokenizer(pattern: str, namespaces: Dict[str, str]=...) -> Generator[_token, None, None]: ...
+def get_parent_map(context: '_SelectorContext') -> Dict[Element, Element]: ...
+def prepare_child(next: _next, token: _token) -> _callback: ...
+def prepare_star(next: _next, token: _token) -> _callback: ...
+def prepare_self(next: _next, token: _token) -> _callback: ...
+def prepare_descendant(next: _next, token: _token) -> _callback: ...
+def prepare_parent(next: _next, token: _token) -> _callback: ...
+def prepare_predicate(next: _next, token: _token) -> _callback: ...
+
+ops = ... # type: Dict[str, Callable[[_next, _token], _callback]]
+
+class _SelectorContext:
+ parent_map = ... # type: Dict[Element, Element]
+ root = ... # type: Element
+ def __init__(self, root: Element) -> None: ...
+
+_T = TypeVar('_T')
+
+def iterfind(elem: Element, path: str, namespaces: Dict[str, str]=...) -> List[Element]: ...
+def find(elem: Element, path: str, namespaces: Dict[str, str]=...) -> Optional[Element]: ...
+def findall(elem: Element, path: str, namespaces: Dict[str, str]=...) -> List[Element]: ...
+def findtext(elem: Element, path: str, default: _T=..., namespaces: Dict[str, str]=...) -> Union[_T, str]: ...
diff --git a/typeshed/stdlib/3.3/xml/etree/ElementTree.pyi b/typeshed/stdlib/3.3/xml/etree/ElementTree.pyi
new file mode 100644
index 0000000..148b89e
--- /dev/null
+++ b/typeshed/stdlib/3.3/xml/etree/ElementTree.pyi
@@ -0,0 +1,113 @@
+# Stubs for xml.etree.ElementTree (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, AnyStr, Union, IO, Callable, Dict, List, Tuple, Sequence, Iterator, TypeVar, Optional, KeysView, ItemsView, Generator
+import io
+
+VERSION = ... # type: str
+
+class ParseError(SyntaxError): ...
+
+def iselement(element: 'Element') -> bool: ...
+
+_Ss = TypeVar('_Ss', str, bytes)
+_T = TypeVar('_T')
+_str_or_bytes = Union[str, bytes]
+
+class Element(Sequence['Element']):
+ tag = ... # type: _str_or_bytes
+ attrib = ... # type: Dict[_str_or_bytes, _str_or_bytes]
+ text = ... # type: Optional[_str_or_bytes]
+ tail = ... # type: Optional[_str_or_bytes]
+ def __init__(self, tag: Union[AnyStr, Callable[..., 'Element']], attrib: Dict[AnyStr, AnyStr]=..., **extra: AnyStr) -> None: ...
+ def append(self, subelement: 'Element') -> None: ...
+ def clear(self) -> None: ...
+ def copy(self) -> 'Element': ...
+ def extend(self, elements: Sequence['Element']) -> None: ...
+ def find(self, path: str, namespaces: Dict[str, str]=...) -> Optional['Element']: ...
+ def findall(self, path: str, namespaces: Dict[str, str]=...) -> List['Element']: ...
+ def findtext(self, path: str, default: _T=..., namespaces: Dict[str, str]=...) -> Union[_T, str]: ...
+ def get(self, key: AnyStr, default: _T=...) -> Union[AnyStr, _T]: ...
+ def getchildren(self) -> List['Element']: ...
+ def getiterator(self, tag: Union[str, AnyStr]=...) -> List['Element']: ...
+ def insert(self, index: int, subelement: 'Element') -> None: ...
+ def items(self) -> ItemsView[AnyStr, AnyStr]: ...
+ def iter(self, tag: Union[str, AnyStr]=...) -> Generator['Element', None, None]: ...
+ def iterfind(self, path: str, namespaces: Dict[str, str]=...) -> List['Element']: ...
+ def itertext(self) -> Generator[str, None, None]: ...
+ def keys(self) -> KeysView[AnyStr]: ...
+ def makeelement(self, tag: _Ss, attrib: Dict[_Ss, _Ss]) -> 'Element': ...
+ def remove(self, subelement: 'Element') -> None: ...
+ def set(self, key: AnyStr, value: AnyStr) -> None: ...
+ def __bool__(self) -> bool: ...
+ def __delitem__(self, index: int) -> None: ...
+ def __getitem__(self, index) -> 'Element': ...
+ def __len__(self) -> int: ...
+ def __setitem__(self, index: int, element: 'Element') -> None: ...
+
+def SubElement(parent: Element, tag: AnyStr, attrib: Dict[AnyStr, AnyStr]=..., **extra: AnyStr) -> Element: ...
+def Comment(text: _str_or_bytes=...) -> Element: ...
+def ProcessingInstruction(target: str, text: str=...) -> Element: ...
+
+PI = ... # type: Callable[..., Element]
+
+class QName:
+ text = ... # type: str
+ def __init__(self, text_or_uri: str, tag: str=...) -> None: ...
+
+
+_file_or_filename = Union[str, bytes, int, IO[Any]]
+
+class ElementTree:
+ def __init__(self, element: Element=..., file: _file_or_filename=...) -> None: ...
+ def getroot(self) -> Element: ...
+ def parse(self, source: _file_or_filename, parser: 'XMLParser'=...) -> Element: ...
+ def iter(self, tag: Union[str, AnyStr]=...) -> Generator[Element, None, None]: ...
+ def getiterator(self, tag: Union[str, AnyStr]=...) -> List[Element]: ...
+ def find(self, path: str, namespaces: Dict[str, str]=...) -> Optional[Element]: ...
+ def findtext(self, path: str, default: _T=..., namespaces: Dict[str, str]=...) -> Union[_T, str]: ...
+ def findall(self, path: str, namespaces: Dict[str, str]=...) -> List[Element]: ...
+ def iterfind(self, path: str, namespaces: Dict[str, str]=...) -> List[Element]: ...
+ def write(self, file_or_filename: _file_or_filename, encoding: str=..., xml_declaration: Optional[bool]=..., default_namespace: str=..., method: str=...) -> None: ...
+ def write_c14n(self, file: _file_or_filename) -> None: ...
+
+def register_namespace(prefix: str, uri: str) -> None: ...
+def tostring(element: Element, encoding: str=..., method: str=...) -> str: ...
+def tostringlist(element: Element, encoding: str=..., method: str=...) -> List[str]: ...
+def dump(elem: Element) -> None: ...
+def parse(source: _file_or_filename, parser: 'XMLParser'=...) -> ElementTree: ...
+def iterparse(source: _file_or_filename, events: Sequence[str]=..., parser: 'XMLParser'=...) -> Iterator[Tuple[str, Element]]: ...
+
+
+class _IterParseIterator:
+ root = ... # type: Any
+ def __init__(self, source: _file_or_filename, events: Sequence[str], parser: 'XMLParser', close_source: bool=...) -> None: ...
+ def __next__(self) -> Tuple[str, Element]: ...
+ def __iter__(self) -> _IterParseIterator: ...
+
+def XML(text: AnyStr, parser: 'XMLParser'=...) -> Element: ...
+def XMLID(text: AnyStr, parser: 'XMLParser'=...) -> Tuple[Element, Dict[str, Element]]: ...
+
+# TODO-improve this type
+fromstring = ... # type: Callable[..., Element]
+
+def fromstringlist(sequence: Sequence[AnyStr], parser: 'XMLParser'=...) -> Element: ...
+
+class TreeBuilder:
+ def __init__(self, element_factory: Callable[[AnyStr, Dict[AnyStr, AnyStr]], Element]=...) -> None: ...
+ def close(self) -> Element: ...
+ def data(self, data: AnyStr) -> None: ...
+ def start(self, tag: AnyStr, attrs: Dict[AnyStr, AnyStr]) -> Element: ...
+ def end(self, tag: AnyStr) -> Element: ...
+
+class XMLParser:
+ parser = ... # type: Any
+ target = ... # type: TreeBuilder
+ # TODO-what is entity used for???
+ entity = ... # type: Any
+ version = ... # type: str
+ def __init__(self, html: int=..., target: TreeBuilder=..., encoding: str=...) -> None: ...
+ def doctype(self, name: str, pubid: str, system: str) -> None: ...
+ def close(self) -> Any: ... # TODO-most of the time, this will be Element, but it can be anything target.close() returns
+ def feed(self, data: AnyStr)-> None: ...
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/3.3/xml/etree/__init__.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/3.3/xml/etree/__init__.pyi
diff --git a/typeshed/stdlib/3.3/xml/etree/cElementTree.pyi b/typeshed/stdlib/3.3/xml/etree/cElementTree.pyi
new file mode 100644
index 0000000..8f689de
--- /dev/null
+++ b/typeshed/stdlib/3.3/xml/etree/cElementTree.pyi
@@ -0,0 +1,5 @@
+# Stubs for xml.etree.cElementTree (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from xml.etree.ElementTree import * # noqa: F403
diff --git a/typeshed/stdlib/3.4/_stat.pyi b/typeshed/stdlib/3.4/_stat.pyi
new file mode 100644
index 0000000..867321a
--- /dev/null
+++ b/typeshed/stdlib/3.4/_stat.pyi
@@ -0,0 +1,69 @@
+"""Stub file for the '_stat' module."""
+
+SF_APPEND = ... # type: int
+SF_ARCHIVED = ... # type: int
+SF_IMMUTABLE = ... # type: int
+SF_NOUNLINK = ... # type: int
+SF_SNAPSHOT = ... # type: int
+ST_ATIME = ... # type: int
+ST_CTIME = ... # type: int
+ST_DEV = ... # type: int
+ST_GID = ... # type: int
+ST_INO = ... # type: int
+ST_MODE = ... # type: int
+ST_MTIME = ... # type: int
+ST_NLINK = ... # type: int
+ST_SIZE = ... # type: int
+ST_UID = ... # type: int
+S_ENFMT = ... # type: int
+S_IEXEC = ... # type: int
+S_IFBLK = ... # type: int
+S_IFCHR = ... # type: int
+S_IFDIR = ... # type: int
+S_IFDOOR = ... # type: int
+S_IFIFO = ... # type: int
+S_IFLNK = ... # type: int
+S_IFPORT = ... # type: int
+S_IFREG = ... # type: int
+S_IFSOCK = ... # type: int
+S_IFWHT = ... # type: int
+S_IREAD = ... # type: int
+S_IRGRP = ... # type: int
+S_IROTH = ... # type: int
+S_IRUSR = ... # type: int
+S_IRWXG = ... # type: int
+S_IRWXO = ... # type: int
+S_IRWXU = ... # type: int
+S_ISGID = ... # type: int
+S_ISUID = ... # type: int
+S_ISVTX = ... # type: int
+S_IWGRP = ... # type: int
+S_IWOTH = ... # type: int
+S_IWRITE = ... # type: int
+S_IWUSR = ... # type: int
+S_IXGRP = ... # type: int
+S_IXOTH = ... # type: int
+S_IXUSR = ... # type: int
+UF_APPEND = ... # type: int
+UF_COMPRESSED = ... # type: int
+UF_HIDDEN = ... # type: int
+UF_IMMUTABLE = ... # type: int
+UF_NODUMP = ... # type: int
+UF_NOUNLINK = ... # type: int
+UF_OPAQUE = ... # type: int
+
+def S_IMODE(mode: int) -> int: ...
+def S_IFMT(mode: int) -> int: ...
+
+def S_ISBLK(mode: int) -> bool: ...
+def S_ISCHR(mode: int) -> bool: ...
+def S_ISDIR(mode: int) -> bool: ...
+def S_ISDOOR(mode: int) -> bool: ...
+def S_ISFIFO(mode: int) -> bool: ...
+def S_ISLNK(mode: int) -> bool: ...
+def S_ISPORT(mode: int) -> bool: ...
+def S_ISREG(mode: int) -> bool: ...
+def S_ISSOCK(mode: int) -> bool: ...
+def S_ISWHT(mode: int) -> bool: ...
+
+def filemode(mode: int) -> str: ...
diff --git a/typeshed/stdlib/3.4/_tracemalloc.pyi b/typeshed/stdlib/3.4/_tracemalloc.pyi
new file mode 100644
index 0000000..b1db5ab
--- /dev/null
+++ b/typeshed/stdlib/3.4/_tracemalloc.pyi
@@ -0,0 +1,26 @@
+"""Stub file for the '_tracemalloc' module."""
+# This is an autogenerated file. It serves as a starting point
+# for a more precise manual annotation of this module.
+# Feel free to edit the source below, but remove this header when you do.
+
+from typing import Any, List, Tuple, Dict, Generic
+
+def _get_object_traceback(*args, **kwargs) -> Any: ...
+
+def _get_traces() -> Any:
+ raise MemoryError()
+
+def clear_traces() -> None: ...
+
+def get_traceback_limit() -> int: ...
+
+def get_traced_memory() -> tuple: ...
+
+def get_tracemalloc_memory() -> Any: ...
+
+def is_tracing() -> bool: ...
+
+def start(*args, **kwargs) -> None:
+ raise ValueError()
+
+def stop() -> None: ...
diff --git a/typeshed/stdlib/3.4/asyncio/__init__.pyi b/typeshed/stdlib/3.4/asyncio/__init__.pyi
new file mode 100644
index 0000000..5f83bc6
--- /dev/null
+++ b/typeshed/stdlib/3.4/asyncio/__init__.pyi
@@ -0,0 +1,97 @@
+"""The asyncio package, tracking PEP 3156."""
+
+import sys
+from typing import Type
+
+from asyncio.coroutines import (
+ coroutine as coroutine,
+ iscoroutinefunction as iscoroutinefunction,
+ iscoroutine as iscoroutine,
+)
+from asyncio.protocols import (
+ BaseProtocol as BaseProtocol,
+ Protocol as Protocol,
+ DatagramProtocol as DatagramProtocol,
+ SubprocessProtocol as SubprocessProtocol,
+)
+from asyncio.streams import (
+ StreamReader as StreamReader,
+ StreamWriter as StreamWriter,
+ StreamReaderProtocol as StreamReaderProtocol,
+ open_connection as open_connection,
+ start_server as start_server,
+ IncompleteReadError as IncompleteReadError,
+ LimitOverrunError as LimitOverrunError,
+)
+from asyncio.subprocess import (
+ create_subprocess_exec as create_subprocess_exec,
+ create_subprocess_shell as create_subprocess_shell,
+)
+from asyncio.transports import (
+ BaseTransport as BaseTransport,
+ ReadTransport as ReadTransport,
+ WriteTransport as WriteTransport,
+ Transport as Transport,
+ DatagramTransport as DatagramTransport,
+ SubprocessTransport as SubprocessTransport,
+)
+from asyncio.futures import (
+ Future as Future,
+ CancelledError as CancelledError,
+ TimeoutError as TimeoutError,
+ InvalidStateError as InvalidStateError,
+)
+from asyncio.tasks import (
+ FIRST_COMPLETED as FIRST_COMPLETED,
+ FIRST_EXCEPTION as FIRST_EXCEPTION,
+ ALL_COMPLETED as ALL_COMPLETED,
+ as_completed as as_completed,
+ ensure_future as ensure_future,
+ gather as gather,
+ run_coroutine_threadsafe as run_coroutine_threadsafe,
+ shield as shield,
+ sleep as sleep,
+ wait as wait,
+ wait_for as wait_for,
+ Task as Task,
+)
+from asyncio.events import (
+ AbstractEventLoopPolicy as AbstractEventLoopPolicy,
+ AbstractEventLoop as AbstractEventLoop,
+ AbstractServer as AbstractServer,
+ Handle as Handle,
+ get_event_loop_policy as get_event_loop_policy,
+ set_event_loop_policy as set_event_loop_policy,
+ get_event_loop as get_event_loop,
+ set_event_loop as set_event_loop,
+ new_event_loop as new_event_loop,
+ get_child_watcher as get_child_watcher,
+ set_child_watcher as set_child_watcher,
+)
+from asyncio.queues import (
+ Queue as Queue,
+ PriorityQueue as PriorityQueue,
+ LifoQueue as LifoQueue,
+ JoinableQueue as JoinableQueue,
+ QueueFull as QueueFull,
+ QueueEmpty as QueueEmpty,
+)
+from asyncio.locks import (
+ Lock as Lock,
+ Event as Event,
+ Condition as Condition,
+ Semaphore as Semaphore,
+ BoundedSemaphore as BoundedSemaphore,
+)
+
+# TODO: It should be possible to instantiate these classes, but mypy
+# currently disallows this.
+# See https://github.com/python/mypy/issues/1843
+SelectorEventLoop = ... # type: Type[AbstractEventLoop]
+if sys.platform == 'win32':
+ ProactorEventLoop = ... # type: Type[AbstractEventLoop]
+DefaultEventLoopPolicy = ... # type: Type[AbstractEventLoopPolicy]
+
+# TODO: AbstractChildWatcher (UNIX only)
+
+__all__ = ... # type: str
diff --git a/typeshed/stdlib/3.4/asyncio/coroutines.pyi b/typeshed/stdlib/3.4/asyncio/coroutines.pyi
new file mode 100644
index 0000000..9072dd7
--- /dev/null
+++ b/typeshed/stdlib/3.4/asyncio/coroutines.pyi
@@ -0,0 +1,9 @@
+from typing import Any, Callable, Generator, TypeVar
+
+__all__ = ... # type: str
+
+_F = TypeVar('_F', bound=Callable[..., Any])
+
+def coroutine(func: _F) -> _F: ...
+def iscoroutinefunction(func: Callable[..., Any]) -> bool: ...
+def iscoroutine(obj: Any) -> bool: ...
diff --git a/typeshed/stdlib/3.4/asyncio/events.pyi b/typeshed/stdlib/3.4/asyncio/events.pyi
new file mode 100644
index 0000000..2e87f70
--- /dev/null
+++ b/typeshed/stdlib/3.4/asyncio/events.pyi
@@ -0,0 +1,177 @@
+import sys
+from typing import Any, Awaitable, TypeVar, List, Callable, Tuple, Union, Dict, Generator, overload, Optional
+from abc import ABCMeta, abstractmethod
+from asyncio.futures import Future
+from asyncio.coroutines import coroutine
+from asyncio.tasks import Task
+
+__all__ = ... # type: str
+
+_T = TypeVar('_T')
+
+PIPE = ... # type: Any # from subprocess.PIPE
+
+AF_UNSPEC = 0 # from socket
+AI_PASSIVE = 0
+
+class Handle:
+ _cancelled = False
+ _args = ... # type: List[Any]
+ def __init__(self, callback: Callable[..., Any], args: List[Any],
+ loop: AbstractEventLoop) -> None: ...
+ def __repr__(self) -> str: ...
+ def cancel(self) -> None: ...
+ def _run(self) -> None: ...
+
+class AbstractServer:
+ def close(self) -> None: ...
+ @coroutine
+ def wait_closed(self) -> Generator[Any, Any, None]: ...
+
+class AbstractEventLoop(metaclass=ABCMeta):
+ @abstractmethod
+ def run_forever(self) -> None: ...
+
+ # Can't use a union, see mypy issue # 1873.
+ @overload
+ @abstractmethod
+ def run_until_complete(self, future: Generator[Any, Any, _T]) -> _T: ...
+ @overload
+ @abstractmethod
+ def run_until_complete(self, future: Awaitable[_T]) -> _T: ...
+
+ @abstractmethod
+ def stop(self) -> None: ...
+ @abstractmethod
+ def is_running(self) -> bool: ...
+ @abstractmethod
+ def close(self) -> None: ...
+ # Methods scheduling callbacks. All these return Handles.
+ @abstractmethod
+ def call_soon(self, callback: Callable[..., Any], *args: Any) -> Handle: ...
+ @abstractmethod
+ def call_later(self, delay: Union[int, float], callback: Callable[..., Any], *args: Any) -> Handle: ...
+ @abstractmethod
+ def call_at(self, when: float, callback: Callable[..., Any], *args: Any) -> Handle: ...
+ @abstractmethod
+ def time(self) -> float: ...
+ # Future methods
+ if sys.version_info >= (3, 5):
+ @abstractmethod
+ def create_future(self) -> Future[Any]: ...
+ # Tasks methods
+ @abstractmethod
+ def create_task(self, coro: Union[Future[_T], Generator[Any, None, _T]]) -> Task[_T]: ...
+ @abstractmethod
+ def set_task_factory(self, factory: Optional[Callable[[AbstractEventLoop, Generator[Any, None, _T]], Future[_T]]]) -> None: ...
+ @abstractmethod
+ def get_task_factory(self) -> Optional[Callable[[AbstractEventLoop, Generator[Any, None, _T]], Future[_T]]]: ...
+ # Methods for interacting with threads
+ @abstractmethod
+ def call_soon_threadsafe(self, callback: Callable[..., Any], *args: Any) -> Handle: ...
+ @abstractmethod
+ def run_in_executor(self, executor: Any,
+ callback: Callable[[], Any], *args: Any) -> Future[Any]: ...
+ @abstractmethod
+ def set_default_executor(self, executor: Any) -> None: ...
+ # Network I/O methods returning Futures.
+ @abstractmethod
+ def getaddrinfo(self, host: str, port: int, *,
+ family: int = ..., type: int = ..., proto: int = ..., flags: int = ...) -> Future[List[Tuple[int, int, int, str, tuple]]]: ...
+ @abstractmethod
+ def getnameinfo(self, sockaddr: tuple, flags: int = ...) -> Future[Tuple[str, int]]: ...
+ @abstractmethod
+ def create_connection(self, protocol_factory: Any, host: str = ..., port: int = ..., *,
+ ssl: Any = ..., family: int = ..., proto: int = ..., flags: int = ..., sock: Any = ...,
+ local_addr: str = ..., server_hostname: str = ...) -> tuple: ...
+ @abstractmethod
+ def create_server(self, protocol_factory: Any, host: str = ..., port: int = ..., *,
+ family: int = ..., flags: int = ...,
+ sock: Any = ..., backlog: int = ..., ssl: Any = ..., reuse_address: Any = ...) -> Any: ...
+ @abstractmethod
+ def create_unix_connection(self, protocol_factory: Any, path: str, *,
+ ssl: Any = ..., sock: Any = ...,
+ server_hostname: str = ...) -> tuple: ...
+ @abstractmethod
+ def create_unix_server(self, protocol_factory: Any, path: str, *,
+ sock: Any = ..., backlog: int = ..., ssl: Any = ...) -> Any: ...
+ @abstractmethod
+ def create_datagram_endpoint(self, protocol_factory: Any,
+ local_addr: str = ..., remote_addr: str = ..., *,
+ family: int = ..., proto: int = ..., flags: int = ...) -> tuple: ...
+ # Pipes and subprocesses.
+ @abstractmethod
+ def connect_read_pipe(self, protocol_factory: Any, pipe: Any) -> tuple: ...
+ @abstractmethod
+ def connect_write_pipe(self, protocol_factory: Any, pipe: Any) -> tuple: ...
+ @abstractmethod
+ def subprocess_shell(self, protocol_factory: Any, cmd: Union[bytes, str], *, stdin: Any = ...,
+ stdout: Any = ..., stderr: Any = ...,
+ **kwargs: Any) -> tuple: ...
+ @abstractmethod
+ def subprocess_exec(self, protocol_factory: Any, *args: List[Any], stdin: Any = ...,
+ stdout: Any = ..., stderr: Any = ...,
+ **kwargs: Any) -> tuple: ...
+ @abstractmethod
+ def add_reader(self, fd: int, callback: Callable[[], Any], *args: List[Any]) -> None: ...
+ @abstractmethod
+ def remove_reader(self, fd: int) -> None: ...
+ @abstractmethod
+ def add_writer(self, fd: int, callback: Callable[[], Any], *args: List[Any]) -> None: ...
+ @abstractmethod
+ def remove_writer(self, fd: int) -> None: ...
+ # Completion based I/O methods returning Futures.
+ @abstractmethod
+ def sock_recv(self, sock: Any, nbytes: int) -> Any: ... # TODO
+ @abstractmethod
+ def sock_sendall(self, sock: Any, data: bytes) -> None: ... # TODO
+ @abstractmethod
+ def sock_connect(self, sock: Any, address: str) -> Any: ... # TODO
+ @abstractmethod
+ def sock_accept(self, sock: Any) -> Any: ...
+ # Signal handling.
+ @abstractmethod
+ def add_signal_handler(self, sig: int, callback: Callable[[], Any], *args: List[Any]) -> None: ...
+ @abstractmethod
+ def remove_signal_handler(self, sig: int) -> None: ...
+ # Error handlers.
+ @abstractmethod
+ def set_exception_handler(self, handler: Callable[[], Any]) -> None: ...
+ @abstractmethod
+ def default_exception_handler(self, context: Any) -> None: ...
+ @abstractmethod
+ def call_exception_handler(self, context: Any) -> None: ...
+ # Debug flag management.
+ @abstractmethod
+ def get_debug(self) -> bool: ...
+ @abstractmethod
+ def set_debug(self, enabled: bool) -> None: ...
+
+class AbstractEventLoopPolicy(metaclass=ABCMeta):
+ @abstractmethod
+ def get_event_loop(self) -> AbstractEventLoop: ...
+ @abstractmethod
+ def set_event_loop(self, loop: AbstractEventLoop): ...
+ @abstractmethod
+ def new_event_loop(self) -> AbstractEventLoop: ...
+ # Child processes handling (Unix only).
+ @abstractmethod
+ def get_child_watcher(self) -> Any: ... # TODO: unix_events.AbstractChildWatcher
+ @abstractmethod
+ def set_child_watcher(self, watcher: Any) -> None: ... # TODO: unix_events.AbstractChildWatcher
+
+class BaseDefaultEventLoopPolicy(AbstractEventLoopPolicy):
+ def __init__(self) -> None: ...
+ def get_event_loop(self) -> AbstractEventLoop: ...
+ def set_event_loop(self, loop: AbstractEventLoop): ...
+ def new_event_loop(self) -> AbstractEventLoop: ...
+
+def get_event_loop_policy() -> AbstractEventLoopPolicy: ...
+def set_event_loop_policy(policy: AbstractEventLoopPolicy) -> None: ...
+
+def get_event_loop() -> AbstractEventLoop: ...
+def set_event_loop(loop: AbstractEventLoop) -> None: ...
+def new_event_loop() -> AbstractEventLoop: ...
+
+def get_child_watcher() -> Any: ... # TODO: unix_events.AbstractChildWatcher
+def set_child_watcher(watcher: Any) -> None: ... # TODO: unix_events.AbstractChildWatcher
diff --git a/typeshed/stdlib/3.4/asyncio/futures.pyi b/typeshed/stdlib/3.4/asyncio/futures.pyi
new file mode 100644
index 0000000..b880093
--- /dev/null
+++ b/typeshed/stdlib/3.4/asyncio/futures.pyi
@@ -0,0 +1,46 @@
+from typing import Any, Union, Callable, TypeVar, List, Generic, Iterable, Generator, Awaitable
+from .events import AbstractEventLoop
+from concurrent.futures._base import (
+ Error as Error,
+)
+from concurrent.futures import (
+ CancelledError as CancelledError,
+ TimeoutError as TimeoutError,
+)
+
+__all__ = ... # type: str
+
+_T = TypeVar('_T')
+
+class InvalidStateError(Error): ...
+
+class _TracebackLogger:
+ exc = ... # type: BaseException
+ tb = ... # type: List[str]
+ def __init__(self, exc: Any, loop: AbstractEventLoop) -> None: ...
+ def activate(self) -> None: ...
+ def clear(self) -> None: ...
+ def __del__(self) -> None: ...
+
+class Future(Iterable[_T], Awaitable[_T], Generic[_T]):
+ _state = ... # type: str
+ _exception = ... # type: BaseException
+ _blocking = False
+ _log_traceback = False
+ _tb_logger = _TracebackLogger
+ def __init__(self, *, loop: AbstractEventLoop = ...) -> None: ...
+ def __repr__(self) -> str: ...
+ def __del__(self) -> None: ...
+ def cancel(self) -> bool: ...
+ def _schedule_callbacks(self) -> None: ...
+ def cancelled(self) -> bool: ...
+ def done(self) -> bool: ...
+ def result(self) -> _T: ...
+ def exception(self) -> BaseException: ...
+ def add_done_callback(self, fn: Callable[[Future[_T]], Any]) -> None: ...
+ def remove_done_callback(self, fn: Callable[[Future[_T]], Any]) -> int: ...
+ def set_result(self, result: _T) -> None: ...
+ def set_exception(self, exception: Union[type, BaseException]) -> None: ...
+ def _copy_state(self, other: Any) -> None: ...
+ def __iter__(self) -> Generator[Any, None, _T]: ...
+ def __await__(self) -> Generator[Any, None, _T]: ...
diff --git a/typeshed/stdlib/3.4/asyncio/locks.pyi b/typeshed/stdlib/3.4/asyncio/locks.pyi
new file mode 100644
index 0000000..2467ffe
--- /dev/null
+++ b/typeshed/stdlib/3.4/asyncio/locks.pyi
@@ -0,0 +1,59 @@
+from typing import Any, Callable, Generator, Iterable, Iterator, TypeVar, Union
+
+from .coroutines import coroutine
+from .events import AbstractEventLoop
+from .futures import Future
+
+T = TypeVar('T')
+
+__all__ = ... # type: str
+
+class _ContextManager:
+ def __init__(self, lock: Union[Lock, Semaphore]) -> None: ...
+ def __enter__(self) -> object: ...
+ def __exit__(self, *args: Any) -> None: ...
+
+class _ContextManagerMixin(Future[_ContextManager]):
+ # Apparently this exists to *prohibit* use as a context manager.
+ def __enter__(self) -> object: ...
+ def __exit__(self, *args: Any) -> None: ...
+ def __aenter__(self): ...
+ def __aexit__(self, exc_type, exc, tb): ...
+
+class Lock(_ContextManagerMixin):
+ def __init__(self, *, loop: AbstractEventLoop = None) -> None: ...
+ def locked(self) -> bool: ...
+ @coroutine
+ def acquire(self) -> Future[bool]: ...
+ def release(self) -> None: ...
+
+class Event:
+ def __init__(self, *, loop: AbstractEventLoop = None) -> None: ...
+ def is_set(self) -> bool: ...
+ def set(self) -> None: ...
+ def clear(self) -> None: ...
+ @coroutine
+ def wait(self) -> bool: ...
+
+class Condition(_ContextManagerMixin):
+ def __init__(self, lock: Lock = None, *, loop: AbstractEventLoop = None) -> None: ...
+ def locked(self) -> bool: ...
+ @coroutine
+ def acquire(self) -> Future[bool]: ...
+ def release(self) -> None: ...
+ @coroutine
+ def wait(self) -> Future[bool]: ...
+ @coroutine
+ def wait_for(self, predicate: Callable[[], T]) -> Future[T]: ...
+ def notify(self, n: int = 1) -> None: ...
+ def notify_all(self) -> None: ...
+
+class Semaphore(_ContextManagerMixin):
+ def __init__(self, value: int = 1, *, loop: AbstractEventLoop = None) -> None: ...
+ def locked(self) -> bool: ...
+ @coroutine
+ def acquire(self) -> Future[bool]: ...
+ def release(self) -> None: ...
+
+class BoundedSemaphore(Semaphore):
+ def __init__(self, value=1, *, loop: AbstractEventLoop = None) -> None: ...
diff --git a/typeshed/stdlib/3.4/asyncio/protocols.pyi b/typeshed/stdlib/3.4/asyncio/protocols.pyi
new file mode 100644
index 0000000..91b7d94
--- /dev/null
+++ b/typeshed/stdlib/3.4/asyncio/protocols.pyi
@@ -0,0 +1,24 @@
+from asyncio import transports
+from typing import AnyStr
+
+__all__ = ... # type: str
+
+
+class BaseProtocol:
+ def connection_made(self, transport: transports.BaseTransport) -> None: ...
+ def connection_lost(self, exc: Exception) -> None: ...
+ def pause_writing(self) -> None: ...
+ def resume_writing(self) -> None: ...
+
+class Protocol(BaseProtocol):
+ def data_received(self, data: bytes) -> None: ...
+ def eof_received(self) -> bool: ...
+
+class DatagramProtocol(BaseProtocol):
+ def datagram_received(self, data: AnyStr, addr: str) -> None: ...
+ def error_received(self, exc: Exception) -> None: ...
+
+class SubprocessProtocol(BaseProtocol):
+ def pipe_data_received(self, fd: int, data: AnyStr) -> None: ...
+ def pipe_connection_lost(self, fd: int, exc: Exception) -> None: ...
+ def process_exited(self) -> None: ...
diff --git a/typeshed/stdlib/3.4/asyncio/queues.pyi b/typeshed/stdlib/3.4/asyncio/queues.pyi
new file mode 100644
index 0000000..dd1ffe6
--- /dev/null
+++ b/typeshed/stdlib/3.4/asyncio/queues.pyi
@@ -0,0 +1,46 @@
+from asyncio.events import AbstractEventLoop
+from .coroutines import coroutine
+from .futures import Future
+from typing import TypeVar, Generic
+
+__all__ = ... # type: str
+
+
+class QueueEmpty(Exception): ...
+class QueueFull(Exception): ...
+
+T = TypeVar('T')
+
+class Queue(Generic[T]):
+ def __init__(self, maxsize: int = ..., *, loop: AbstractEventLoop = ...) -> None: ...
+ def _init(self, maxsize: int) -> None: ...
+ def _get(self) -> T: ...
+ def _put(self, item: T) -> None: ...
+ def __repr__(self) -> str: ...
+ def __str__(self) -> str: ...
+ def _format(self) -> str: ...
+ def _consume_done_getters(self) -> None: ...
+ def _consume_done_putters(self) -> None: ...
+ def qsize(self) -> int: ...
+ @property
+ def maxsize(self) -> int: ...
+ def empty(self) -> bool: ...
+ def full(self) -> bool: ...
+ @coroutine
+ def put(self, item: T) -> Future[None]: ...
+ def put_nowait(self, item: T) -> None: ...
+ @coroutine
+ def get(self) -> Future[T]: ...
+ def get_nowait(self) -> T: ...
+
+
+class PriorityQueue(Queue): ...
+
+
+class LifoQueue(Queue): ...
+
+
+class JoinableQueue(Queue):
+ def task_done(self) -> None: ...
+ @coroutine
+ def join(self) -> None: ...
diff --git a/typeshed/stdlib/3.4/asyncio/streams.pyi b/typeshed/stdlib/3.4/asyncio/streams.pyi
new file mode 100644
index 0000000..ed20303
--- /dev/null
+++ b/typeshed/stdlib/3.4/asyncio/streams.pyi
@@ -0,0 +1,105 @@
+import socket
+from typing import Any, Callable, Generator, Iterable, Tuple
+
+from . import coroutines
+from . import events
+from . import protocols
+from . import transports
+
+ClientConnectedCallback = Callable[[Tuple[StreamReader, StreamWriter]], None]
+
+
+__all__ = ... # type: str
+
+class IncompleteReadError(EOFError):
+ def __init__(self, partial: str, expected: int) -> None: ...
+
+class LimitOverrunError(Exception):
+ def __init__(self, message: str, consumed: int) -> None: ...
+
+ at coroutines.coroutine
+def open_connection(
+ host: str = ...,
+ port: int = ...,
+ *,
+ loop: events.AbstractEventLoop = ...,
+ limit: int = ...,
+ **kwds: Any
+) -> Generator[Any, None, Tuple[StreamReader, StreamWriter]]: ...
+
+ at coroutines.coroutine
+def start_server(
+ client_connected_cb: ClientConnectedCallback,
+ host: str = ...,
+ port: int = ...,
+ *,
+ loop: events.AbstractEventLoop = ...,
+ limit: int = ...,
+ **kwds: Any
+) -> Generator[Any, None, events.AbstractServer]: ...
+
+if hasattr(socket, 'AF_UNIX'):
+ @coroutines.coroutine
+ def open_unix_connection(
+ path: str = ...,
+ *,
+ loop: events.AbstractEventLoop = ...,
+ limit: int = ...,
+ **kwds: Any
+ ) -> Generator[Any, None, Tuple[StreamReader, StreamWriter]]: ...
+
+ @coroutines.coroutine
+ def start_unix_server(
+ client_connected_cb: ClientConnectedCallback,
+ path: str = ...,
+ *,
+ loop: int = ...,
+ limit: int = ...,
+ **kwds: Any) -> Generator[Any, None, events.AbstractServer]: ...
+
+class FlowControlMixin(protocols.Protocol): ...
+
+class StreamReaderProtocol(FlowControlMixin, protocols.Protocol):
+ def __init__(self,
+ stream_reader: StreamReader,
+ client_connected_cb: ClientConnectedCallback = ...,
+ loop: events.AbstractEventLoop = ...) -> None: ...
+ def connection_made(self, transport: transports.BaseTransport) -> None: ...
+ def connection_lost(self, exc: Exception) -> None: ...
+ def data_received(self, data: bytes) -> None: ...
+ def eof_received(self) -> bool: ...
+
+class StreamWriter:
+ def __init__(self,
+ transport: transports.BaseTransport,
+ protocol: protocols.BaseProtocol,
+ reader: StreamReader,
+ loop: events.AbstractEventLoop) -> None: ...
+ @property
+ def transport(self) -> transports.BaseTransport: ...
+ def write(self, data: bytes) -> None: ...
+ def writelines(self, data: Iterable[bytes]) -> None: ...
+ def write_eof(self) -> None: ...
+ def can_write_eof(self) -> bool: ...
+ def close(self) -> None: ...
+ def get_extra_info(self, name: str, default: Any = ...) -> Any: ...
+ def drain(self) -> None: ...
+
+class StreamReader:
+ def __init__(self,
+ limit: int = ...,
+ loop: events.AbstractEventLoop = ...) -> None: ...
+ def exception(self) -> Exception: ...
+ def set_exception(self, exc: Exception) -> None: ...
+ def set_transport(self, transport: transports.BaseTransport) -> None: ...
+ def feed_eof(self) -> None: ...
+ def at_eof(self) -> bool: ...
+ def feed_data(self, data: bytes): ...
+ @coroutines.coroutine
+ def readline(self) -> Generator[Any, None, bytes]: ...
+ @coroutines.coroutine
+ def readuntil(self, separator=b'\n') -> Generator[Any, None, bytes]: ...
+ @coroutines.coroutine
+ def read(self, n=-1) -> Generator[Any, None, bytes]: ...
+ @coroutines.coroutine
+ def readexactly(self, n) -> Generator[Any, None, bytes]: ...
diff --git a/typeshed/stdlib/3.4/asyncio/subprocess.pyi b/typeshed/stdlib/3.4/asyncio/subprocess.pyi
new file mode 100644
index 0000000..2416f92
--- /dev/null
+++ b/typeshed/stdlib/3.4/asyncio/subprocess.pyi
@@ -0,0 +1,60 @@
+from asyncio import events
+from asyncio import protocols
+from asyncio import streams
+from asyncio import transports
+from asyncio.coroutines import coroutine
+from typing import Any, AnyStr, Tuple, Union
+
+__all__ = ... # type: str
+
+PIPE = ... # type: int
+STDOUT = ... # type: int
+DEVNULL = ... # type: int
+
+class SubprocessStreamProtocol(streams.FlowControlMixin,
+ protocols.SubprocessProtocol):
+ def __init__(self, limit: int, loop: events.AbstractEventLoop) -> None: ...
+ def connection_made(self, transport: transports.BaseTransport) -> None: ...
+ def pipe_data_received(self, fd: int, data: AnyStr) -> None: ...
+ def pipe_connection_lost(self, fd: int, exc: Exception): ...
+ def process_exited(self) -> None: ...
+
+
+class Process:
+ def __init__(self,
+ transport: transports.BaseTransport,
+ protocol: protocols.BaseProtocol,
+ loop: events.AbstractEventLoop) -> None: ...
+ @property
+ def returncode(self) -> int: ...
+ @coroutine
+ def wait(self) -> int: ...
+ def send_signal(self, signal: int) -> None: ...
+ def terminate(self) -> None: ...
+ def kill(self) -> None: ...
+ @coroutine
+ def communicate(self, input: bytes = ...) -> Tuple[bytes, bytes]: ...
+
+
+ at coroutine
+def create_subprocess_shell(
+ *Args: Union[str, bytes], # Union used instead of AnyStr due to mypy issue #1236
+ stdin: int = ...,
+ stdout: int = ...,
+ stderr: int = ...,
+ loop: events.AbstractEventLoop = ...,
+ limit: int = ...,
+ **kwds: Any
+): ...
+
+ at coroutine
+def create_subprocess_exec(
+ program: Union[str, bytes], # Union used instead of AnyStr due to mypy issue #1236
+ *args: Any,
+ stdin: int = ...,
+ stdout: int = ...,
+ stderr: int = ...,
+ loop: events.AbstractEventLoop = ...,
+ limit: int = ...,
+ **kwds: Any
+) -> Process: ...
diff --git a/typeshed/stdlib/3.4/asyncio/tasks.pyi b/typeshed/stdlib/3.4/asyncio/tasks.pyi
new file mode 100644
index 0000000..a33fd15
--- /dev/null
+++ b/typeshed/stdlib/3.4/asyncio/tasks.pyi
@@ -0,0 +1,55 @@
+from typing import (Any, TypeVar, Set, Dict, List, TextIO, Union, Tuple, Generic, Callable,
+ Coroutine, Generator, Iterable, Awaitable, overload, Sequence, Iterator,
+ Optional)
+import concurrent.futures
+from .events import AbstractEventLoop
+from .futures import Future
+
+__all__ = ... # type: str
+
+_T = TypeVar('_T')
+
+FIRST_EXCEPTION = 'FIRST_EXCEPTION'
+FIRST_COMPLETED = 'FIRST_COMPLETED'
+ALL_COMPLETED = 'ALL_COMPLETED'
+
+def as_completed(fs: Sequence[Future[_T]], *, loop: AbstractEventLoop = ...,
+ timeout=None) -> Iterator[Generator[Any, None, _T]]: ...
+def ensure_future(coro_or_future: Union[Future[_T], Generator[Any, None, _T]],
+ *, loop: AbstractEventLoop = ...) -> Future[_T]: ...
+# TODO: gather() should use variadic type vars instead of _TAny.
+_TAny = Any
+def gather(*coros_or_futures: Union[Future[_TAny], Generator[Any, None, _TAny], Awaitable[_TAny]],
+ loop: AbstractEventLoop = ..., return_exceptions: bool = False) -> Future[List[_TAny]]: ...
+def run_coroutine_threadsafe(coro: Union[Generator[Any, None, _T], Coroutine[Any, None, _T], Awaitable[_T]],
+ loop: AbstractEventLoop) -> concurrent.futures.Future[_T]: ...
+def shield(arg: Union[Future[_T], Generator[Any, None, _T]],
+ *, loop: AbstractEventLoop = ...) -> Future[_T]: ...
+def sleep(delay: float, result: _T = ..., loop: AbstractEventLoop = ...) -> Future[_T]: ...
+def wait(fs: List[Task[_T]], *, loop: AbstractEventLoop = ...,
+ timeout: float = ...,
+ return_when: str = ...) -> Future[Tuple[Set[Future[_T]], Set[Future[_T]]]]: ...
+def wait_for(fut: Union[Future[_T], Generator[Any, None, _T], Awaitable[_T]], timeout: Optional[float],
+ *, loop: AbstractEventLoop = ...) -> Future[_T]: ...
+
+class Task(Future[_T], Generic[_T]):
+ _all_tasks = ... # type: Set[Task]
+ _current_tasks = ... # type: Dict[AbstractEventLoop, Task]
+ @classmethod
+ def current_task(cls, loop: AbstractEventLoop = ...) -> Task: ...
+ @classmethod
+ def all_tasks(cls, loop: AbstractEventLoop = ...) -> Set[Task]: ...
+
+ # Can't use a union, see mypy issue #1873.
+ @overload
+ def __init__(self, coro: Generator[Any, None, _T],
+ *, loop: AbstractEventLoop = ...) -> None: ...
+ @overload
+ def __init__(self, coro: Awaitable[_T], *, loop: AbstractEventLoop = ...) -> None: ...
+
+ def __repr__(self) -> str: ...
+ def get_stack(self, *, limit: int = ...) -> List[Any]: ... # return List[stackframe]
+ def print_stack(self, *, limit: int = ..., file: TextIO = ...) -> None: ...
+ def cancel(self) -> bool: ...
+ def _step(self, value: Any = ..., exc: Exception = ...) -> None: ...
+ def _wakeup(self, future: Future[Any]) -> None: ...
diff --git a/typeshed/stdlib/3.4/asyncio/transports.pyi b/typeshed/stdlib/3.4/asyncio/transports.pyi
new file mode 100644
index 0000000..87320a1
--- /dev/null
+++ b/typeshed/stdlib/3.4/asyncio/transports.pyi
@@ -0,0 +1,38 @@
+from typing import Dict, Any, TypeVar, Mapping, List
+
+__all__ = ... # type: str
+
+class BaseTransport:
+ def __init__(self, extra: Mapping[Any, Any] = ...) -> None: ...
+ def get_extra_info(self, name: Any, default: Any = ...) -> Any: ...
+ def is_closing(self) -> bool: ...
+ def close(self) -> None: ...
+
+class ReadTransport(BaseTransport):
+ def pause_reading(self) -> None: ...
+ def resume_reading(self) -> None: ...
+
+class WriteTransport(BaseTransport):
+ def set_write_buffer_limits(
+ self, high: int = ..., low: int = ...
+ ) -> None: ...
+ def get_write_buffer_size(self) -> int: ...
+ def write(self, data: Any) -> None: ...
+ def writelines(self, list_of_data: List[Any]): ...
+ def write_eof(self) -> None: ...
+ def can_write_eof(self) -> bool: ...
+ def abort(self) -> None: ...
+
+class Transport(ReadTransport, WriteTransport): ...
+
+class DatagramTransport(BaseTransport):
+ def sendto(self, data: Any, addr: str = ...) -> None: ...
+ def abort(self) -> None: ...
+
+class SubprocessTransport(BaseTransport):
+ def get_pid(self) -> int: ...
+ def get_returncode(self) -> int: ...
+ def get_pipe_transport(self, fd: int) -> BaseTransport: ...
+ def send_signal(self, signal: int) -> int: ...
+ def terminate(self) -> None: ...
+ def kill(self) -> None: ...
diff --git a/typeshed/stdlib/3.4/enum.pyi b/typeshed/stdlib/3.4/enum.pyi
new file mode 100644
index 0000000..3b97e1b
--- /dev/null
+++ b/typeshed/stdlib/3.4/enum.pyi
@@ -0,0 +1,50 @@
+# FIXME: Stub incomplete, ommissions include:
+# * the metaclass
+# * _sunder_ methods with their transformations
+
+import sys
+from typing import List, Any, TypeVar, Union
+
+class Enum:
+ def __new__(cls, value: Any) -> None: ...
+ def __repr__(self) -> str: ...
+ def __str__(self) -> str: ...
+ def __dir__(self) -> List[str]: ...
+ def __format__(self, format_spec: str) -> str: ...
+ def __hash__(self) -> Any: ...
+ def __reduce_ex__(self, proto: Any) -> Any: ...
+
+ name = ... # type: str
+ value = ... # type: Any
+
+class IntEnum(int, Enum):
+ value = ... # type: int
+
+_T = TypeVar('_T')
+
+def unique(enumeration: _T) -> _T: ...
+
+if sys.version_info >= (3, 6):
+ _auto_null = ... # type: Any
+
+ class auto:
+ value = ... # type: Any
+
+ class Flag(Enum):
+ def __contains__(self: _T, other: _T) -> bool: ...
+ def __repr__(self) -> str: ...
+ def __str__(self) -> str: ...
+ def __bool__(self) -> bool: ...
+ def __or__(self: _T, other: _T) -> _T: ...
+ def __and__(self: _T, other: _T) -> _T: ...
+ def __xor__(self: _T, other: _T) -> _T: ...
+ def __invert__(self: _T) -> _T: ...
+
+ # All `type: ignore` comments below due to IntFlag making the function signatures more permissive.
+ class IntFlag(int, Flag): # type: ignore
+ def __or__(self: _T, other: Union[int, _T]) -> _T: ... # type: ignore
+ def __and__(self: _T, other: Union[int, _T]) -> _T: ... # type: ignore
+ def __xor__(self: _T, other: Union[int, _T]) -> _T: ... # type: ignore
+ __ror__ = __or__
+ __rand__ = __and__
+ __rxor__ = __xor__
diff --git a/typeshed/stdlib/3.4/pathlib.pyi b/typeshed/stdlib/3.4/pathlib.pyi
new file mode 100644
index 0000000..67ad853
--- /dev/null
+++ b/typeshed/stdlib/3.4/pathlib.pyi
@@ -0,0 +1,111 @@
+# Stubs for pathlib (Python 3.4)
+
+from typing import Any, Generator, IO, Optional, Sequence, Tuple, Type, TypeVar, Union
+import os
+import sys
+
+_P = TypeVar('_P', bound='PurePath')
+
+if sys.version_info >= (3, 6):
+ _PurePathBase = os.PathLike
+else:
+ _PurePathBase = object
+
+class PurePath(_PurePathBase):
+ parts = ... # type: Tuple[str, ...]
+ drive = ... # type: str
+ root = ... # type: str
+ anchor = ... # type: str
+ name = ... # type: str
+ suffix = ... # type: str
+ suffixes = ... # type: List[str]
+ stem = ... # type: str
+ if sys.version_info < (3, 5):
+ def __init__(self, *pathsegments: str) -> None: ...
+ else:
+ def __new__(cls: Type[_P], *args: Union[str, PurePath]) -> _P: ...
+ def __hash__(self) -> int: ...
+ def __lt__(self, other: PurePath) -> bool: ...
+ def __le__(self, other: PurePath) -> bool: ...
+ def __gt__(self, other: PurePath) -> bool: ...
+ def __ge__(self, other: PurePath) -> bool: ...
+ def __truediv__(self: _P, key: Union[str, PurePath]) -> _P: ...
+ def __bytes__(self) -> bytes: ...
+ def as_posix(self) -> str: ...
+ def as_uri(self) -> str: ...
+ def is_absolute(self) -> bool: ...
+ def is_reserved(self) -> bool: ...
+ def match(self, path_pattern: str) -> bool: ...
+ def relative_to(self: _P, *other: Union[str, PurePath]) -> _P: ...
+ def with_name(self: _P, name: str) -> _P: ...
+ def with_suffix(self: _P, suffix: str) -> _P: ...
+ def joinpath(self: _P, *other: Union[str, PurePath]) -> _P: ...
+
+ @property
+ def parents(self: _P) -> Sequence[_P]: ...
+ @property
+ def parent(self: _P) -> _P: ...
+
+class PurePosixPath(PurePath): ...
+class PureWindowsPath(PurePath): ...
+
+class Path(PurePath):
+ @classmethod
+ def cwd(cls: Type[_P]) -> _P: ...
+ def stat(self) -> os.stat_result: ...
+ def chmod(self, mode: int) -> None: ...
+ def exists(self) -> bool: ...
+ def glob(self, pattern: str) -> Generator[Path, None, None]: ...
+ def group(self) -> str: ...
+ def is_dir(self) -> bool: ...
+ def is_file(self) -> bool: ...
+ def is_symlink(self) -> bool: ...
+ def is_socket(self) -> bool: ...
+ def is_fifo(self) -> bool: ...
+ def is_block_device(self) -> bool: ...
+ def is_char_device(self) -> bool: ...
+ def iterdir(self) -> Generator[Path, None, None]: ...
+ def lchmod(self, mode: int) -> None: ...
+ def lstat(self) -> os.stat_result: ...
+ if sys.version_info <= (3, 4):
+ def mkdir(self, mode: int = ...,
+ parents: bool = ...) -> None: ...
+ else:
+ def mkdir(self, mode: int = ..., parents: bool = ...,
+ exist_ok: bool = ...) -> None: ...
+ def open(self, mode: str = ..., buffering: int = ...,
+ encoding: Optional[str] = ..., errors: Optional[str] = ...,
+ newline: Optional[str] = ...) -> IO[Any]: ...
+ def owner(self) -> str: ...
+ def rename(self, target: Union[str, PurePath]) -> None: ...
+ def replace(self, target: Union[str, PurePath]) -> None: ...
+ if sys.version_info <= (3, 5):
+ def resolve(self: _P) -> _P: ...
+ else:
+ def resolve(self: _P, strict: bool = ...) -> _P: ...
+ def rglob(self, pattern: str) -> Generator[Path, None, None]: ...
+ def rmdir(self) -> None: ...
+ def symlink_to(self, target: Union[str, Path],
+ target_is_directory: bool = ...) -> None: ...
+ def touch(self, mode: int = ..., exist_ok: bool = ...) -> None: ...
+ def unlink(self) -> None: ...
+
+ if sys.version_info >= (3, 5):
+ @classmethod
+ def home(cls: Type[_P]) -> _P: ...
+ def __new__(cls: Type[_P], *args: Union[str, PurePath],
+ **kwargs: Any) -> _P: ...
+
+ def absolute(self: _P) -> _P: ...
+ def expanduser(self: _P) -> _P: ...
+ def read_bytes(self) -> bytes: ...
+ def read_text(self, encoding: Optional[str] = ...,
+ errors: Optional[str] = ...) -> str: ...
+ def samefile(self, other_path: Union[str, bytes, int, Path]) -> bool: ...
+ def write_bytes(self, data: bytes) -> int: ...
+ def write_text(self, data: str, encoding: Optional[str] = ...,
+ errors: Optional[str] = ...) -> int: ...
+
+
+class PosixPath(Path, PurePosixPath): ...
+class WindowsPath(Path, PureWindowsPath): ...
diff --git a/typeshed/stdlib/3.4/selectors.pyi b/typeshed/stdlib/3.4/selectors.pyi
new file mode 100644
index 0000000..832212b
--- /dev/null
+++ b/typeshed/stdlib/3.4/selectors.pyi
@@ -0,0 +1,90 @@
+# Stubs for selector
+# See https://docs.python.org/3/library/selectors.html
+
+from typing import Any, List, NamedTuple, Mapping, Tuple, Optional, Union
+from abc import ABCMeta, abstractmethod
+import socket
+
+
+# Type aliases added mainly to preserve some context
+#
+# See https://github.com/python/typeshed/issues/482
+# for details regarding how FileObject is typed.
+FileObject = Union[int, socket.socket]
+FileDescriptor = int
+EventMask = int
+
+
+EVENT_READ = ... # type: EventMask
+EVENT_WRITE = ... # type: EventMask
+
+
+SelectorKey = NamedTuple('SelectorKey', [
+ ('fileobj', FileObject),
+ ('fd', FileDescriptor),
+ ('events', EventMask),
+ ('data', Any)
+])
+
+
+class BaseSelector(metaclass=ABCMeta):
+ @abstractmethod
+ def register(self, fileobj: FileObject, events: EventMask, data: Any = None) -> SelectorKey: ...
+
+ @abstractmethod
+ def unregister(self, fileobj: FileObject) -> SelectorKey: ...
+
+ def modify(self, fileobj: FileObject, events: EventMask, data: Any = None) -> SelectorKey: ...
+
+ @abstractmethod
+ def select(self, timeout: Optional[int] = None) -> List[Tuple[SelectorKey, EventMask]]: ...
+
+ def close(self) -> None: ...
+
+ def get_key(self, fileobj: FileObject) -> SelectorKey: ...
+
+ @abstractmethod
+ def get_map(self) -> Mapping[FileObject, SelectorKey]: ...
+
+ def __enter__(self) -> BaseSelector: ...
+
+ def __exit__(self, *args: Any) -> None: ...
+
+class SelectSelector(BaseSelector):
+ def register(self, fileobj: FileObject, events: EventMask, data: Any = None) -> SelectorKey: ...
+ def unregister(self, fileobj: FileObject) -> SelectorKey: ...
+ def select(self, timeout: Optional[int] = None) -> List[Tuple[SelectorKey, EventMask]]: ...
+ def get_map(self) -> Mapping[FileObject, SelectorKey]: ...
+
+class PollSelector(BaseSelector):
+ def register(self, fileobj: FileObject, events: EventMask, data: Any = None) -> SelectorKey: ...
+ def unregister(self, fileobj: FileObject) -> SelectorKey: ...
+ def select(self, timeout: Optional[int] = None) -> List[Tuple[SelectorKey, EventMask]]: ...
+ def get_map(self) -> Mapping[FileObject, SelectorKey]: ...
+
+class EpollSelector(BaseSelector):
+ def fileno(self) -> int: ...
+ def register(self, fileobj: FileObject, events: EventMask, data: Any = None) -> SelectorKey: ...
+ def unregister(self, fileobj: FileObject) -> SelectorKey: ...
+ def select(self, timeout: Optional[int] = None) -> List[Tuple[SelectorKey, EventMask]]: ...
+ def get_map(self) -> Mapping[FileObject, SelectorKey]: ...
+
+class DevpollSelector(BaseSelector):
+ def fileno(self) -> int: ...
+ def register(self, fileobj: FileObject, events: EventMask, data: Any = None) -> SelectorKey: ...
+ def unregister(self, fileobj: FileObject) -> SelectorKey: ...
+ def select(self, timeout: Optional[int] = None) -> List[Tuple[SelectorKey, EventMask]]: ...
+ def get_map(self) -> Mapping[FileObject, SelectorKey]: ...
+
+class KqueueSelector(BaseSelector):
+ def fileno(self) -> int: ...
+ def register(self, fileobj: FileObject, events: EventMask, data: Any = None) -> SelectorKey: ...
+ def unregister(self, fileobj: FileObject) -> SelectorKey: ...
+ def select(self, timeout: Optional[int] = None) -> List[Tuple[SelectorKey, EventMask]]: ...
+ def get_map(self) -> Mapping[FileObject, SelectorKey]: ...
+
+class DefaultSelector(BaseSelector):
+ def register(self, fileobj: FileObject, events: EventMask, data: Any = None) -> SelectorKey: ...
+ def unregister(self, fileobj: FileObject) -> SelectorKey: ...
+ def select(self, timeout: Optional[int] = None) -> List[Tuple[SelectorKey, EventMask]]: ...
+ def get_map(self) -> Mapping[FileObject, SelectorKey]: ...
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/3.4/xml/__init__.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/3.4/xml/__init__.pyi
diff --git a/typeshed/stdlib/3.4/xml/etree/ElementInclude.pyi b/typeshed/stdlib/3.4/xml/etree/ElementInclude.pyi
new file mode 100644
index 0000000..bbe3fb3
--- /dev/null
+++ b/typeshed/stdlib/3.4/xml/etree/ElementInclude.pyi
@@ -0,0 +1,19 @@
+# Stubs for xml.etree.ElementInclude (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Union, Optional, Callable
+from .ElementTree import Element
+
+XINCLUDE = ... # type: str
+XINCLUDE_INCLUDE = ... # type: str
+XINCLUDE_FALLBACK = ... # type: str
+
+class FatalIncludeError(SyntaxError): ...
+
+def default_loader(href: Union[str, bytes, int], parse: str, encoding: Optional[str]=...) -> Union[str, Element]: ...
+
+# TODO: loader is of type default_loader ie it takes a callable that has the
+# same signature as default_loader. But default_loader has a keyword argument
+# Which can't be represented using Callable...
+def include(elem: Element, loader: Callable[..., Union[str, Element]]=...) -> None: ...
diff --git a/typeshed/stdlib/3.4/xml/etree/ElementPath.pyi b/typeshed/stdlib/3.4/xml/etree/ElementPath.pyi
new file mode 100644
index 0000000..b1ea50e
--- /dev/null
+++ b/typeshed/stdlib/3.4/xml/etree/ElementPath.pyi
@@ -0,0 +1,35 @@
+# Stubs for xml.etree.ElementPath (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Pattern, Dict, Generator, Tuple, List, Union, TypeVar, Callable, Optional
+from .ElementTree import Element
+
+xpath_tokenizer_re = ... # type: Pattern
+
+_token = Tuple[str, str]
+_next = Callable[[], _token]
+_callback = Callable[['_SelectorContext', List[Element]], Generator[Element, None, None]]
+
+def xpath_tokenizer(pattern: str, namespaces: Dict[str, str]=...) -> Generator[_token, None, None]: ...
+def get_parent_map(context: '_SelectorContext') -> Dict[Element, Element]: ...
+def prepare_child(next: _next, token: _token) -> _callback: ...
+def prepare_star(next: _next, token: _token) -> _callback: ...
+def prepare_self(next: _next, token: _token) -> _callback: ...
+def prepare_descendant(next: _next, token: _token) -> _callback: ...
+def prepare_parent(next: _next, token: _token) -> _callback: ...
+def prepare_predicate(next: _next, token: _token) -> _callback: ...
+
+ops = ... # type: Dict[str, Callable[[_next, _token], _callback]]
+
+class _SelectorContext:
+ parent_map = ... # type: Dict[Element, Element]
+ root = ... # type: Element
+ def __init__(self, root: Element) -> None: ...
+
+_T = TypeVar('_T')
+
+def iterfind(elem: Element, path: str, namespaces: Dict[str, str]=...) -> List[Element]: ...
+def find(elem: Element, path: str, namespaces: Dict[str, str]=...) -> Optional[Element]: ...
+def findall(elem: Element, path: str, namespaces: Dict[str, str]=...) -> List[Element]: ...
+def findtext(elem: Element, path: str, default: _T=..., namespaces: Dict[str, str]=...) -> Union[_T, str]: ...
diff --git a/typeshed/stdlib/3.4/xml/etree/ElementTree.pyi b/typeshed/stdlib/3.4/xml/etree/ElementTree.pyi
new file mode 100644
index 0000000..0592be7
--- /dev/null
+++ b/typeshed/stdlib/3.4/xml/etree/ElementTree.pyi
@@ -0,0 +1,118 @@
+# Stubs for xml.etree.ElementTree (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, AnyStr, Union, IO, Callable, Dict, List, Tuple, Sequence, Iterator, TypeVar, Optional, KeysView, ItemsView, Generator
+import io
+
+VERSION = ... # type: str
+
+class ParseError(SyntaxError): ...
+
+def iselement(element: 'Element') -> bool: ...
+
+_Ss = TypeVar('_Ss', str, bytes)
+_T = TypeVar('_T')
+_str_or_bytes = Union[str, bytes]
+
+class Element(Sequence['Element']):
+ tag = ... # type: _str_or_bytes
+ attrib = ... # type: Dict[_str_or_bytes, _str_or_bytes]
+ text = ... # type: Optional[_str_or_bytes]
+ tail = ... # type: Optional[_str_or_bytes]
+ def __init__(self, tag: Union[AnyStr, Callable[..., 'Element']], attrib: Dict[AnyStr, AnyStr]=..., **extra: AnyStr) -> None: ...
+ def append(self, subelement: 'Element') -> None: ...
+ def clear(self) -> None: ...
+ def copy(self) -> 'Element': ...
+ def extend(self, elements: Sequence['Element']) -> None: ...
+ def find(self, path: str, namespaces: Dict[str, str]=...) -> Optional['Element']: ...
+ def findall(self, path: str, namespaces: Dict[str, str]=...) -> List['Element']: ...
+ def findtext(self, path: str, default: _T=..., namespaces: Dict[str, str]=...) -> Union[_T, str]: ...
+ def get(self, key: AnyStr, default: _T=...) -> Union[AnyStr, _T]: ...
+ def getchildren(self) -> List['Element']: ...
+ def getiterator(self, tag: Union[str, AnyStr]=...) -> List['Element']: ...
+ def insert(self, index: int, subelement: 'Element') -> None: ...
+ def items(self) -> ItemsView[AnyStr, AnyStr]: ...
+ def iter(self, tag: Union[str, AnyStr]=...) -> Generator['Element', None, None]: ...
+ def iterfind(self, path: str, namespaces: Dict[str, str]=...) -> List['Element']: ...
+ def itertext(self) -> Generator[str, None, None]: ...
+ def keys(self) -> KeysView[AnyStr]: ...
+ def makeelement(self, tag: _Ss, attrib: Dict[_Ss, _Ss]) -> 'Element': ...
+ def remove(self, subelement: 'Element') -> None: ...
+ def set(self, key: AnyStr, value: AnyStr) -> None: ...
+ def __bool__(self) -> bool: ...
+ def __delitem__(self, index: int) -> None: ...
+ def __getitem__(self, index) -> 'Element': ...
+ def __len__(self) -> int: ...
+ def __setitem__(self, index: int, element: 'Element') -> None: ...
+
+def SubElement(parent: Element, tag: AnyStr, attrib: Dict[AnyStr, AnyStr]=..., **extra: AnyStr) -> Element: ...
+def Comment(text: _str_or_bytes=...) -> Element: ...
+def ProcessingInstruction(target: str, text: str=...) -> Element: ...
+
+PI = ... # type: Callable[..., Element]
+
+class QName:
+ text = ... # type: str
+ def __init__(self, text_or_uri: str, tag: str=...) -> None: ...
+
+
+_file_or_filename = Union[str, bytes, int, IO[Any]]
+
+class ElementTree:
+ def __init__(self, element: Element=..., file: _file_or_filename=...) -> None: ...
+ def getroot(self) -> Element: ...
+ def parse(self, source: _file_or_filename, parser: 'XMLParser'=...) -> Element: ...
+ def iter(self, tag: Union[str, AnyStr]=...) -> Generator[Element, None, None]: ...
+ def getiterator(self, tag: Union[str, AnyStr]=...) -> List[Element]: ...
+ def find(self, path: str, namespaces: Dict[str, str]=...) -> Optional[Element]: ...
+ def findtext(self, path: str, default: _T=..., namespaces: Dict[str, str]=...) -> Union[_T, str]: ...
+ def findall(self, path: str, namespaces: Dict[str, str]=...) -> List[Element]: ...
+ def iterfind(self, path: str, namespaces: Dict[str, str]=...) -> List[Element]: ...
+ def write(self, file_or_filename: _file_or_filename, encoding: str=..., xml_declaration: Optional[bool]=..., default_namespace: str=..., method: str=..., *, short_empty_elements: bool=...) -> None: ...
+ def write_c14n(self, file: _file_or_filename) -> None: ...
+
+def register_namespace(prefix: str, uri: str) -> None: ...
+def tostring(element: Element, encoding: str=..., method: str=..., *, short_empty_elements: bool=...) -> str: ...
+def tostringlist(element: Element, encoding: str=..., method: str=..., *, short_empty_elements: bool=...) -> List[str]: ...
+def dump(elem: Element) -> None: ...
+def parse(source: _file_or_filename, parser: 'XMLParser'=...) -> ElementTree: ...
+def iterparse(source: _file_or_filename, events: Sequence[str]=..., parser: 'XMLParser'=...) -> Iterator[Tuple[str, Element]]: ...
+
+class XMLPullParser:
+ def __init__(self, events: Sequence[str]=..., *, _parser: 'XMLParser'=...) -> None: ...
+ def feed(self, data: bytes) -> None: ...
+ def close(self) -> None: ...
+ def read_events(self) -> Iterator[Tuple[str, Element]]: ...
+
+class _IterParseIterator:
+ root = ... # type: Any
+ def __init__(self, source: _file_or_filename, events: Sequence[str], parser: 'XMLParser', close_source: bool=...) -> None: ...
+ def __next__(self) -> Tuple[str, Element]: ...
+ def __iter__(self) -> _IterParseIterator: ...
+
+def XML(text: AnyStr, parser: 'XMLParser'=...) -> Element: ...
+def XMLID(text: AnyStr, parser: 'XMLParser'=...) -> Tuple[Element, Dict[str, Element]]: ...
+
+# TODO-improve this type
+fromstring = ... # type: Callable[..., Element]
+
+def fromstringlist(sequence: Sequence[AnyStr], parser: 'XMLParser'=...) -> Element: ...
+
+class TreeBuilder:
+ def __init__(self, element_factory: Callable[[AnyStr, Dict[AnyStr, AnyStr]], Element]=...) -> None: ...
+ def close(self) -> Element: ...
+ def data(self, data: AnyStr) -> None: ...
+ def start(self, tag: AnyStr, attrs: Dict[AnyStr, AnyStr]) -> Element: ...
+ def end(self, tag: AnyStr) -> Element: ...
+
+class XMLParser:
+ parser = ... # type: Any
+ target = ... # type: TreeBuilder
+ # TODO-what is entity used for???
+ entity = ... # type: Any
+ version = ... # type: str
+ def __init__(self, html: int=..., target: TreeBuilder=..., encoding: str=...) -> None: ...
+ def doctype(self, name: str, pubid: str, system: str) -> None: ...
+ def close(self) -> Any: ... # TODO-most of the time, this will be Element, but it can be anything target.close() returns
+ def feed(self, data: AnyStr)-> None: ...
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/3.4/xml/etree/__init__.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/3.4/xml/etree/__init__.pyi
diff --git a/typeshed/stdlib/3.4/xml/etree/cElementTree.pyi b/typeshed/stdlib/3.4/xml/etree/cElementTree.pyi
new file mode 100644
index 0000000..8f689de
--- /dev/null
+++ b/typeshed/stdlib/3.4/xml/etree/cElementTree.pyi
@@ -0,0 +1,5 @@
+# Stubs for xml.etree.cElementTree (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from xml.etree.ElementTree import * # noqa: F403
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/3.5/xml/__init__.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/3.5/xml/__init__.pyi
diff --git a/typeshed/stdlib/3.5/xml/etree/ElementInclude.pyi b/typeshed/stdlib/3.5/xml/etree/ElementInclude.pyi
new file mode 100644
index 0000000..bbe3fb3
--- /dev/null
+++ b/typeshed/stdlib/3.5/xml/etree/ElementInclude.pyi
@@ -0,0 +1,19 @@
+# Stubs for xml.etree.ElementInclude (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Union, Optional, Callable
+from .ElementTree import Element
+
+XINCLUDE = ... # type: str
+XINCLUDE_INCLUDE = ... # type: str
+XINCLUDE_FALLBACK = ... # type: str
+
+class FatalIncludeError(SyntaxError): ...
+
+def default_loader(href: Union[str, bytes, int], parse: str, encoding: Optional[str]=...) -> Union[str, Element]: ...
+
+# TODO: loader is of type default_loader ie it takes a callable that has the
+# same signature as default_loader. But default_loader has a keyword argument
+# Which can't be represented using Callable...
+def include(elem: Element, loader: Callable[..., Union[str, Element]]=...) -> None: ...
diff --git a/typeshed/stdlib/3.5/xml/etree/ElementPath.pyi b/typeshed/stdlib/3.5/xml/etree/ElementPath.pyi
new file mode 100644
index 0000000..b1ea50e
--- /dev/null
+++ b/typeshed/stdlib/3.5/xml/etree/ElementPath.pyi
@@ -0,0 +1,35 @@
+# Stubs for xml.etree.ElementPath (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Pattern, Dict, Generator, Tuple, List, Union, TypeVar, Callable, Optional
+from .ElementTree import Element
+
+xpath_tokenizer_re = ... # type: Pattern
+
+_token = Tuple[str, str]
+_next = Callable[[], _token]
+_callback = Callable[['_SelectorContext', List[Element]], Generator[Element, None, None]]
+
+def xpath_tokenizer(pattern: str, namespaces: Dict[str, str]=...) -> Generator[_token, None, None]: ...
+def get_parent_map(context: '_SelectorContext') -> Dict[Element, Element]: ...
+def prepare_child(next: _next, token: _token) -> _callback: ...
+def prepare_star(next: _next, token: _token) -> _callback: ...
+def prepare_self(next: _next, token: _token) -> _callback: ...
+def prepare_descendant(next: _next, token: _token) -> _callback: ...
+def prepare_parent(next: _next, token: _token) -> _callback: ...
+def prepare_predicate(next: _next, token: _token) -> _callback: ...
+
+ops = ... # type: Dict[str, Callable[[_next, _token], _callback]]
+
+class _SelectorContext:
+ parent_map = ... # type: Dict[Element, Element]
+ root = ... # type: Element
+ def __init__(self, root: Element) -> None: ...
+
+_T = TypeVar('_T')
+
+def iterfind(elem: Element, path: str, namespaces: Dict[str, str]=...) -> List[Element]: ...
+def find(elem: Element, path: str, namespaces: Dict[str, str]=...) -> Optional[Element]: ...
+def findall(elem: Element, path: str, namespaces: Dict[str, str]=...) -> List[Element]: ...
+def findtext(elem: Element, path: str, default: _T=..., namespaces: Dict[str, str]=...) -> Union[_T, str]: ...
diff --git a/typeshed/stdlib/3.5/xml/etree/ElementTree.pyi b/typeshed/stdlib/3.5/xml/etree/ElementTree.pyi
new file mode 100644
index 0000000..0592be7
--- /dev/null
+++ b/typeshed/stdlib/3.5/xml/etree/ElementTree.pyi
@@ -0,0 +1,118 @@
+# Stubs for xml.etree.ElementTree (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, AnyStr, Union, IO, Callable, Dict, List, Tuple, Sequence, Iterator, TypeVar, Optional, KeysView, ItemsView, Generator
+import io
+
+VERSION = ... # type: str
+
+class ParseError(SyntaxError): ...
+
+def iselement(element: 'Element') -> bool: ...
+
+_Ss = TypeVar('_Ss', str, bytes)
+_T = TypeVar('_T')
+_str_or_bytes = Union[str, bytes]
+
+class Element(Sequence['Element']):
+ tag = ... # type: _str_or_bytes
+ attrib = ... # type: Dict[_str_or_bytes, _str_or_bytes]
+ text = ... # type: Optional[_str_or_bytes]
+ tail = ... # type: Optional[_str_or_bytes]
+ def __init__(self, tag: Union[AnyStr, Callable[..., 'Element']], attrib: Dict[AnyStr, AnyStr]=..., **extra: AnyStr) -> None: ...
+ def append(self, subelement: 'Element') -> None: ...
+ def clear(self) -> None: ...
+ def copy(self) -> 'Element': ...
+ def extend(self, elements: Sequence['Element']) -> None: ...
+ def find(self, path: str, namespaces: Dict[str, str]=...) -> Optional['Element']: ...
+ def findall(self, path: str, namespaces: Dict[str, str]=...) -> List['Element']: ...
+ def findtext(self, path: str, default: _T=..., namespaces: Dict[str, str]=...) -> Union[_T, str]: ...
+ def get(self, key: AnyStr, default: _T=...) -> Union[AnyStr, _T]: ...
+ def getchildren(self) -> List['Element']: ...
+ def getiterator(self, tag: Union[str, AnyStr]=...) -> List['Element']: ...
+ def insert(self, index: int, subelement: 'Element') -> None: ...
+ def items(self) -> ItemsView[AnyStr, AnyStr]: ...
+ def iter(self, tag: Union[str, AnyStr]=...) -> Generator['Element', None, None]: ...
+ def iterfind(self, path: str, namespaces: Dict[str, str]=...) -> List['Element']: ...
+ def itertext(self) -> Generator[str, None, None]: ...
+ def keys(self) -> KeysView[AnyStr]: ...
+ def makeelement(self, tag: _Ss, attrib: Dict[_Ss, _Ss]) -> 'Element': ...
+ def remove(self, subelement: 'Element') -> None: ...
+ def set(self, key: AnyStr, value: AnyStr) -> None: ...
+ def __bool__(self) -> bool: ...
+ def __delitem__(self, index: int) -> None: ...
+ def __getitem__(self, index) -> 'Element': ...
+ def __len__(self) -> int: ...
+ def __setitem__(self, index: int, element: 'Element') -> None: ...
+
+def SubElement(parent: Element, tag: AnyStr, attrib: Dict[AnyStr, AnyStr]=..., **extra: AnyStr) -> Element: ...
+def Comment(text: _str_or_bytes=...) -> Element: ...
+def ProcessingInstruction(target: str, text: str=...) -> Element: ...
+
+PI = ... # type: Callable[..., Element]
+
+class QName:
+ text = ... # type: str
+ def __init__(self, text_or_uri: str, tag: str=...) -> None: ...
+
+
+_file_or_filename = Union[str, bytes, int, IO[Any]]
+
+class ElementTree:
+ def __init__(self, element: Element=..., file: _file_or_filename=...) -> None: ...
+ def getroot(self) -> Element: ...
+ def parse(self, source: _file_or_filename, parser: 'XMLParser'=...) -> Element: ...
+ def iter(self, tag: Union[str, AnyStr]=...) -> Generator[Element, None, None]: ...
+ def getiterator(self, tag: Union[str, AnyStr]=...) -> List[Element]: ...
+ def find(self, path: str, namespaces: Dict[str, str]=...) -> Optional[Element]: ...
+ def findtext(self, path: str, default: _T=..., namespaces: Dict[str, str]=...) -> Union[_T, str]: ...
+ def findall(self, path: str, namespaces: Dict[str, str]=...) -> List[Element]: ...
+ def iterfind(self, path: str, namespaces: Dict[str, str]=...) -> List[Element]: ...
+ def write(self, file_or_filename: _file_or_filename, encoding: str=..., xml_declaration: Optional[bool]=..., default_namespace: str=..., method: str=..., *, short_empty_elements: bool=...) -> None: ...
+ def write_c14n(self, file: _file_or_filename) -> None: ...
+
+def register_namespace(prefix: str, uri: str) -> None: ...
+def tostring(element: Element, encoding: str=..., method: str=..., *, short_empty_elements: bool=...) -> str: ...
+def tostringlist(element: Element, encoding: str=..., method: str=..., *, short_empty_elements: bool=...) -> List[str]: ...
+def dump(elem: Element) -> None: ...
+def parse(source: _file_or_filename, parser: 'XMLParser'=...) -> ElementTree: ...
+def iterparse(source: _file_or_filename, events: Sequence[str]=..., parser: 'XMLParser'=...) -> Iterator[Tuple[str, Element]]: ...
+
+class XMLPullParser:
+ def __init__(self, events: Sequence[str]=..., *, _parser: 'XMLParser'=...) -> None: ...
+ def feed(self, data: bytes) -> None: ...
+ def close(self) -> None: ...
+ def read_events(self) -> Iterator[Tuple[str, Element]]: ...
+
+class _IterParseIterator:
+ root = ... # type: Any
+ def __init__(self, source: _file_or_filename, events: Sequence[str], parser: 'XMLParser', close_source: bool=...) -> None: ...
+ def __next__(self) -> Tuple[str, Element]: ...
+ def __iter__(self) -> _IterParseIterator: ...
+
+def XML(text: AnyStr, parser: 'XMLParser'=...) -> Element: ...
+def XMLID(text: AnyStr, parser: 'XMLParser'=...) -> Tuple[Element, Dict[str, Element]]: ...
+
+# TODO-improve this type
+fromstring = ... # type: Callable[..., Element]
+
+def fromstringlist(sequence: Sequence[AnyStr], parser: 'XMLParser'=...) -> Element: ...
+
+class TreeBuilder:
+ def __init__(self, element_factory: Callable[[AnyStr, Dict[AnyStr, AnyStr]], Element]=...) -> None: ...
+ def close(self) -> Element: ...
+ def data(self, data: AnyStr) -> None: ...
+ def start(self, tag: AnyStr, attrs: Dict[AnyStr, AnyStr]) -> Element: ...
+ def end(self, tag: AnyStr) -> Element: ...
+
+class XMLParser:
+ parser = ... # type: Any
+ target = ... # type: TreeBuilder
+ # TODO-what is entity used for???
+ entity = ... # type: Any
+ version = ... # type: str
+ def __init__(self, html: int=..., target: TreeBuilder=..., encoding: str=...) -> None: ...
+ def doctype(self, name: str, pubid: str, system: str) -> None: ...
+ def close(self) -> Any: ... # TODO-most of the time, this will be Element, but it can be anything target.close() returns
+ def feed(self, data: AnyStr)-> None: ...
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/3.5/xml/etree/__init__.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/3.5/xml/etree/__init__.pyi
diff --git a/typeshed/stdlib/3.5/xml/etree/cElementTree.pyi b/typeshed/stdlib/3.5/xml/etree/cElementTree.pyi
new file mode 100644
index 0000000..8f689de
--- /dev/null
+++ b/typeshed/stdlib/3.5/xml/etree/cElementTree.pyi
@@ -0,0 +1,5 @@
+# Stubs for xml.etree.cElementTree (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from xml.etree.ElementTree import * # noqa: F403
diff --git a/typeshed/stdlib/3.6/secrets.pyi b/typeshed/stdlib/3.6/secrets.pyi
new file mode 100644
index 0000000..bff4716
--- /dev/null
+++ b/typeshed/stdlib/3.6/secrets.pyi
@@ -0,0 +1,14 @@
+# Stubs for secrets (Python 3.6)
+
+from typing import Optional, Sequence, TypeVar
+from hmac import compare_digest as compare_digest
+from random import SystemRandom as SystemRandom
+
+_T = TypeVar('_T')
+
+def randbelow(exclusive_upper_bound: int) -> int: ...
+def randbits(k: int) -> int: ...
+def choice(seq: Sequence[_T]) -> _T: ...
+def token_bytes(nbytes: Optional[int]) -> bytes: ...
+def token_hex(nbytes: Optional[int]) -> str: ...
+def token_urlsafe(nbytes: Optional[int]) -> str: ...
diff --git a/typeshed/stdlib/3/__future__.pyi b/typeshed/stdlib/3/__future__.pyi
new file mode 100644
index 0000000..f59753c
--- /dev/null
+++ b/typeshed/stdlib/3/__future__.pyi
@@ -0,0 +1,16 @@
+import sys
+
+class _Feature:
+ def getOptionalRelease(self) -> sys._version_info: ...
+ def getMandatoryRelease(self) -> sys._version_info: ...
+
+absolute_import = ... # type: _Feature
+division = ... # type: _Feature
+generators = ... # type: _Feature
+nested_scopes = ... # type: _Feature
+print_function = ... # type: _Feature
+unicode_literals = ... # type: _Feature
+with_statement = ... # type: _Feature
+
+if sys.version_info[:2] >= (3, 5):
+ generator_stop = ... # type: _Feature
diff --git a/typeshed/stdlib/3/_ast.pyi b/typeshed/stdlib/3/_ast.pyi
new file mode 100644
index 0000000..6736181
--- /dev/null
+++ b/typeshed/stdlib/3/_ast.pyi
@@ -0,0 +1,358 @@
+# Python 3.5 _ast
+import typing
+from typing import Any, Optional, Union
+
+PyCF_ONLY_AST = ... # type: int
+
+identifier = str
+
+class AST:
+ _attributes = ... # type: typing.Tuple[str, ...]
+ _fields = ... # type: typing.Tuple[str, ...]
+ def __init__(self, *args: Any, **kwargs: Any) -> None: ...
+
+class mod(AST):
+ ...
+
+class Module(mod):
+ body = ... # type: typing.List[stmt]
+
+class Interactive(mod):
+ body = ... # type: typing.List[stmt]
+
+class Expression(mod):
+ body = ... # type: expr
+
+class Suite(mod):
+ body = ... # type: typing.List[stmt]
+
+
+class stmt(AST):
+ lineno = ... # type: int
+ col_offset = ... # type: int
+
+class FunctionDef(stmt):
+ name = ... # type: identifier
+ args = ... # type: arguments
+ body = ... # type: typing.List[stmt]
+ decorator_list = ... # type: typing.List[expr]
+ returns = ... # type: Optional[expr]
+
+class AsyncFunctionDef(stmt):
+ name = ... # type: identifier
+ args = ... # type: arguments
+ body = ... # type: typing.List[stmt]
+ decorator_list = ... # type: typing.List[expr]
+ returns = ... # type: Optional[expr]
+
+class ClassDef(stmt):
+ name = ... # type: identifier
+ bases = ... # type: typing.List[expr]
+ keywords = ... # type: typing.List[keyword]
+ body = ... # type: typing.List[stmt]
+ decorator_list = ... # type: typing.List[expr]
+
+class Return(stmt):
+ value = ... # type: Optional[expr]
+
+class Delete(stmt):
+ targets = ... # type: typing.List[expr]
+
+class Assign(stmt):
+ targets = ... # type: typing.List[expr]
+ value = ... # type: expr
+
+class AugAssign(stmt):
+ target = ... # type: expr
+ op = ... # type: operator
+ value = ... # type: expr
+
+class For(stmt):
+ target = ... # type: expr
+ iter = ... # type: expr
+ body = ... # type: typing.List[stmt]
+ orelse = ... # type: typing.List[stmt]
+
+class AsyncFor(stmt):
+ target = ... # type: expr
+ iter = ... # type: expr
+ body = ... # type: typing.List[stmt]
+ orelse = ... # type: typing.List[stmt]
+
+class While(stmt):
+ test = ... # type: expr
+ body = ... # type: typing.List[stmt]
+ orelse = ... # type: typing.List[stmt]
+
+class If(stmt):
+ test = ... # type: expr
+ body = ... # type: typing.List[stmt]
+ orelse = ... # type: typing.List[stmt]
+
+class With(stmt):
+ items = ... # type: typing.List[withitem]
+ body = ... # type: typing.List[stmt]
+
+class AsyncWith(stmt):
+ items = ... # type: typing.List[withitem]
+ body = ... # type: typing.List[stmt]
+
+class Raise(stmt):
+ exc = ... # type: Optional[expr]
+ cause = ... # type: Optional[expr]
+
+class Try(stmt):
+ body = ... # type: typing.List[stmt]
+ handlers = ... # type: typing.List[ExceptHandler]
+ orelse = ... # type: typing.List[stmt]
+ finalbody = ... # type: typing.List[stmt]
+
+class Assert(stmt):
+ test = ... # type: expr
+ msg = ... # type: Optional[expr]
+
+class Import(stmt):
+ names = ... # type: typing.List[alias]
+
+class ImportFrom(stmt):
+ module = ... # type: Optional[identifier]
+ names = ... # type: typing.List[alias]
+ level = ... # type: Optional[int]
+
+class Global(stmt):
+ names = ... # type: typing.List[identifier]
+
+class Nonlocal(stmt):
+ names = ... # type: typing.List[identifier]
+
+class Expr(stmt):
+ value = ... # type: expr
+
+class Pass(stmt): ...
+class Break(stmt): ...
+class Continue(stmt): ...
+
+
+class slice(AST):
+ ...
+
+_slice = slice # this lets us type the variable named 'slice' below
+
+class Slice(slice):
+ lower = ... # type: Optional[expr]
+ upper = ... # type: Optional[expr]
+ step = ... # type: Optional[expr]
+
+class ExtSlice(slice):
+ dims = ... # type: typing.List[slice]
+
+class Index(slice):
+ value = ... # type: expr
+
+
+class expr(AST):
+ lineno = ... # type: int
+ col_offset = ... # type: int
+
+class BoolOp(expr):
+ op = ... # type: boolop
+ values = ... # type: typing.List[expr]
+
+class BinOp(expr):
+ left = ... # type: expr
+ op = ... # type: operator
+ right = ... # type: expr
+
+class UnaryOp(expr):
+ op = ... # type: unaryop
+ operand = ... # type: expr
+
+class Lambda(expr):
+ args = ... # type: arguments
+ body = ... # type: expr
+
+class IfExp(expr):
+ test = ... # type: expr
+ body = ... # type: expr
+ orelse = ... # type: expr
+
+class Dict(expr):
+ keys = ... # type: typing.List[expr]
+ values = ... # type: typing.List[expr]
+
+class Set(expr):
+ elts = ... # type: typing.List[expr]
+
+class ListComp(expr):
+ elt = ... # type: expr
+ generators = ... # type: typing.List[comprehension]
+
+class SetComp(expr):
+ elt = ... # type: expr
+ generators = ... # type: typing.List[comprehension]
+
+class DictComp(expr):
+ key = ... # type: expr
+ value = ... # type: expr
+ generators = ... # type: typing.List[comprehension]
+
+class GeneratorExp(expr):
+ elt = ... # type: expr
+ generators = ... # type: typing.List[comprehension]
+
+class Await(expr):
+ value = ... # type: expr
+
+class Yield(expr):
+ value = ... # type: Optional[expr]
+
+class YieldFrom(expr):
+ value = ... # type: expr
+
+class Compare(expr):
+ left = ... # type: expr
+ ops = ... # type: typing.List[cmpop]
+ comparators = ... # type: typing.List[expr]
+
+class Call(expr):
+ func = ... # type: expr
+ args = ... # type: typing.List[expr]
+ keywords = ... # type: typing.List[keyword]
+
+class Num(expr):
+ n = ... # type: Union[int, float]
+
+class Str(expr):
+ s = ... # type: str
+
+class Bytes(expr):
+ s = ... # type: bytes
+
+class NameConstant(expr):
+ value = ... # type: Any
+
+class Ellipsis(expr): ...
+
+class Attribute(expr):
+ value = ... # type: expr
+ attr = ... # type: identifier
+ ctx = ... # type: expr_context
+
+class Subscript(expr):
+ value = ... # type: expr
+ slice = ... # type: _slice
+ ctx = ... # type: expr_context
+
+class Starred(expr):
+ value = ... # type: expr
+ ctx = ... # type: expr_context
+
+class Name(expr):
+ id = ... # type: identifier
+ ctx = ... # type: expr_context
+
+class List(expr):
+ elts = ... # type: typing.List[expr]
+ ctx = ... # type: expr_context
+
+class Tuple(expr):
+ elts = ... # type: typing.List[expr]
+ ctx = ... # type: expr_context
+
+
+class expr_context(AST):
+ ...
+
+class AugLoad(expr_context): ...
+class AugStore(expr_context): ...
+class Del(expr_context): ...
+class Load(expr_context): ...
+class Param(expr_context): ...
+class Store(expr_context): ...
+
+
+class boolop(AST):
+ ...
+
+class And(boolop): ...
+class Or(boolop): ...
+
+class operator(AST):
+ ...
+
+class Add(operator): ...
+class BitAnd(operator): ...
+class BitOr(operator): ...
+class BitXor(operator): ...
+class Div(operator): ...
+class FloorDiv(operator): ...
+class LShift(operator): ...
+class Mod(operator): ...
+class Mult(operator): ...
+class MatMult(operator): ...
+class Pow(operator): ...
+class RShift(operator): ...
+class Sub(operator): ...
+
+class unaryop(AST):
+ ...
+
+class Invert(unaryop): ...
+class Not(unaryop): ...
+class UAdd(unaryop): ...
+class USub(unaryop): ...
+
+class cmpop(AST):
+ ...
+
+class Eq(cmpop): ...
+class Gt(cmpop): ...
+class GtE(cmpop): ...
+class In(cmpop): ...
+class Is(cmpop): ...
+class IsNot(cmpop): ...
+class Lt(cmpop): ...
+class LtE(cmpop): ...
+class NotEq(cmpop): ...
+class NotIn(cmpop): ...
+
+
+class comprehension(AST):
+ target = ... # type: expr
+ iter = ... # type: expr
+ ifs = ... # type: typing.List[expr]
+
+
+class ExceptHandler(AST):
+ type = ... # type: Optional[expr]
+ name = ... # type: Optional[identifier]
+ body = ... # type: typing.List[stmt]
+ lineno = ... # type: int
+ col_offset = ... # type: int
+
+
+class arguments(AST):
+ args = ... # type: typing.List[arg]
+ vararg = ... # type: Optional[arg]
+ kwonlyargs = ... # type: typing.List[arg]
+ kw_defaults = ... # type: typing.List[expr]
+ kwarg = ... # type: Optional[arg]
+ defaults = ... # type: typing.List[expr]
+
+class arg(AST):
+ arg = ... # type: identifier
+ annotation = ... # type: Optional[expr]
+ lineno = ... # type: int
+ col_offset = ... # type: int
+
+class keyword(AST):
+ arg = ... # type: Optional[identifier]
+ value = ... # type: expr
+
+class alias(AST):
+ name = ... # type: identifier
+ asname = ... # type: Optional[identifier]
+
+class withitem(AST):
+ context_expr = ... # type: expr
+ optional_vars = ... # type: Optional[expr]
diff --git a/typeshed/stdlib/3/_codecs.pyi b/typeshed/stdlib/3/_codecs.pyi
new file mode 100644
index 0000000..8d4fb3c
--- /dev/null
+++ b/typeshed/stdlib/3/_codecs.pyi
@@ -0,0 +1,51 @@
+"""Stub file for the '_codecs' module."""
+
+from typing import Any, AnyStr, Callable, Tuple, Optional, Dict
+
+import codecs
+
+# For convenience:
+_Handler = Callable[[Exception], Tuple[str, int]]
+
+def register(search_function: Callable[[str], Any]) -> None: ...
+def register_error(errors: str, handler: _Handler) -> None: ...
+def lookup(a: str) -> codecs.CodecInfo: ...
+def lookup_error(a: str) -> _Handler: ...
+def decode(obj: Any, encoding: str = ..., errors: str = ...) -> Any: ...
+def encode(obj: Any, encoding: str = ..., errors: str = ...) -> Any: ...
+def charmap_build(a: str) -> Dict[int, int]: ...
+
+def ascii_decode(data: AnyStr, errors: str = ...) -> Tuple[str, int]: ...
+def ascii_encode(data: AnyStr, errors: str = ...) -> Tuple[bytes, int]: ...
+def charbuffer_encode(data: AnyStr, errors: str = ...) -> Tuple[bytes, int]: ...
+def charmap_decode(data: AnyStr, errors: str = ..., mapping: Optional[Dict[int, int]] = ...) -> Tuple[str, int]: ...
+def charmap_encode(data: AnyStr, errors: str, mapping: Optional[Dict[int, int]] = ...) -> Tuple[bytes, int]: ...
+def escape_decode(data: AnyStr, errors: str = ...) -> Tuple[str, int]: ...
+def escape_encode(data: AnyStr, errors: str = ...) -> Tuple[bytes, int]: ...
+def latin_1_decode(data: AnyStr, errors: str = ...) -> Tuple[str, int]: ...
+def latin_1_encode(data: AnyStr, errors: str = ...) -> Tuple[bytes, int]: ...
+def raw_unicode_escape_decode(data: AnyStr, errors: str = ...) -> Tuple[str, int]: ...
+def raw_unicode_escape_encode(data: AnyStr, errors: str = ...) -> Tuple[bytes, int]: ...
+def readbuffer_encode(data: AnyStr, errors: str = ...) -> Tuple[bytes, int]: ...
+def unicode_escape_decode(data: AnyStr, errors: str = ...) -> Tuple[str, int]: ...
+def unicode_escape_encode(data: AnyStr, errors: str = ...) -> Tuple[bytes, int]: ...
+def unicode_internal_decode(data: AnyStr, errors: str = ...) -> Tuple[str, int]: ...
+def unicode_internal_encode(data: AnyStr, errors: str = ...) -> Tuple[bytes, int]: ...
+def utf_16_be_decode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[str, int]: ...
+def utf_16_be_encode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[bytes, int]: ...
+def utf_16_decode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[str, int]: ...
+def utf_16_encode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[bytes, int]: ...
+def utf_16_ex_decode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[str, int]: ...
+def utf_16_le_decode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[str, int]: ...
+def utf_16_le_encode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[bytes, int]: ...
+def utf_32_be_decode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[str, int]: ...
+def utf_32_be_encode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[bytes, int]: ...
+def utf_32_decode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[str, int]: ...
+def utf_32_encode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[bytes, int]: ...
+def utf_32_ex_decode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[str, int]: ...
+def utf_32_le_decode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[str, int]: ...
+def utf_32_le_encode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[bytes, int]: ...
+def utf_7_decode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[str, int]: ...
+def utf_7_encode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[bytes, int]: ...
+def utf_8_decode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[str, int]: ...
+def utf_8_encode(data: AnyStr, errors: str = ..., final: int = ...) -> Tuple[bytes, int]: ...
diff --git a/typeshed/stdlib/3/_compression.pyi b/typeshed/stdlib/3/_compression.pyi
new file mode 100644
index 0000000..527d795
--- /dev/null
+++ b/typeshed/stdlib/3/_compression.pyi
@@ -0,0 +1,20 @@
+# Stubs for _compression (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+import io
+
+BUFFER_SIZE = ... # type: Any
+
+class BaseStream(io.BufferedIOBase): ...
+
+class DecompressReader(io.RawIOBase):
+ def readable(self): ...
+ def __init__(self, fp, decomp_factory, trailing_error=..., **decomp_args): ...
+ def close(self): ...
+ def seekable(self): ...
+ def readinto(self, b): ...
+ def read(self, size=-1): ...
+ def seek(self, offset, whence=...): ...
+ def tell(self): ...
diff --git a/typeshed/stdlib/3/_curses.pyi b/typeshed/stdlib/3/_curses.pyi
new file mode 100644
index 0000000..368dda2
--- /dev/null
+++ b/typeshed/stdlib/3/_curses.pyi
@@ -0,0 +1,297 @@
+# Stubs for _curses (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, BinaryIO, Tuple, Union
+
+chtype = Union[str, bytes, int]
+
+ALL_MOUSE_EVENTS = ... # type: int
+A_ALTCHARSET = ... # type: int
+A_ATTRIBUTES = ... # type: int
+A_BLINK = ... # type: int
+A_BOLD = ... # type: int
+A_CHARTEXT = ... # type: int
+A_COLOR = ... # type: int
+A_DIM = ... # type: int
+A_HORIZONTAL = ... # type: int
+A_INVIS = ... # type: int
+A_LEFT = ... # type: int
+A_LOW = ... # type: int
+A_NORMAL = ... # type: int
+A_PROTECT = ... # type: int
+A_REVERSE = ... # type: int
+A_RIGHT = ... # type: int
+A_STANDOUT = ... # type: int
+A_TOP = ... # type: int
+A_UNDERLINE = ... # type: int
+A_VERTICAL = ... # type: int
+BUTTON1_CLICKED = ... # type: int
+BUTTON1_DOUBLE_CLICKED = ... # type: int
+BUTTON1_PRESSED = ... # type: int
+BUTTON1_RELEASED = ... # type: int
+BUTTON1_TRIPLE_CLICKED = ... # type: int
+BUTTON2_CLICKED = ... # type: int
+BUTTON2_DOUBLE_CLICKED = ... # type: int
+BUTTON2_PRESSED = ... # type: int
+BUTTON2_RELEASED = ... # type: int
+BUTTON2_TRIPLE_CLICKED = ... # type: int
+BUTTON3_CLICKED = ... # type: int
+BUTTON3_DOUBLE_CLICKED = ... # type: int
+BUTTON3_PRESSED = ... # type: int
+BUTTON3_RELEASED = ... # type: int
+BUTTON3_TRIPLE_CLICKED = ... # type: int
+BUTTON4_CLICKED = ... # type: int
+BUTTON4_DOUBLE_CLICKED = ... # type: int
+BUTTON4_PRESSED = ... # type: int
+BUTTON4_RELEASED = ... # type: int
+BUTTON4_TRIPLE_CLICKED = ... # type: int
+BUTTON_ALT = ... # type: int
+BUTTON_CTRL = ... # type: int
+BUTTON_SHIFT = ... # type: int
+COLOR_BLACK = ... # type: int
+COLOR_BLUE = ... # type: int
+COLOR_CYAN = ... # type: int
+COLOR_GREEN = ... # type: int
+COLOR_MAGENTA = ... # type: int
+COLOR_RED = ... # type: int
+COLOR_WHITE = ... # type: int
+COLOR_YELLOW = ... # type: int
+ERR = ... # type: int
+KEY_A1 = ... # type: int
+KEY_A3 = ... # type: int
+KEY_B2 = ... # type: int
+KEY_BACKSPACE = ... # type: int
+KEY_BEG = ... # type: int
+KEY_BREAK = ... # type: int
+KEY_BTAB = ... # type: int
+KEY_C1 = ... # type: int
+KEY_C3 = ... # type: int
+KEY_CANCEL = ... # type: int
+KEY_CATAB = ... # type: int
+KEY_CLEAR = ... # type: int
+KEY_CLOSE = ... # type: int
+KEY_COMMAND = ... # type: int
+KEY_COPY = ... # type: int
+KEY_CREATE = ... # type: int
+KEY_CTAB = ... # type: int
+KEY_DC = ... # type: int
+KEY_DL = ... # type: int
+KEY_DOWN = ... # type: int
+KEY_EIC = ... # type: int
+KEY_END = ... # type: int
+KEY_ENTER = ... # type: int
+KEY_EOL = ... # type: int
+KEY_EOS = ... # type: int
+KEY_EXIT = ... # type: int
+KEY_F0 = ... # type: int
+KEY_F1 = ... # type: int
+KEY_F10 = ... # type: int
+KEY_F11 = ... # type: int
+KEY_F12 = ... # type: int
+KEY_F13 = ... # type: int
+KEY_F14 = ... # type: int
+KEY_F15 = ... # type: int
+KEY_F16 = ... # type: int
+KEY_F17 = ... # type: int
+KEY_F18 = ... # type: int
+KEY_F19 = ... # type: int
+KEY_F2 = ... # type: int
+KEY_F20 = ... # type: int
+KEY_F21 = ... # type: int
+KEY_F22 = ... # type: int
+KEY_F23 = ... # type: int
+KEY_F24 = ... # type: int
+KEY_F25 = ... # type: int
+KEY_F26 = ... # type: int
+KEY_F27 = ... # type: int
+KEY_F28 = ... # type: int
+KEY_F29 = ... # type: int
+KEY_F3 = ... # type: int
+KEY_F30 = ... # type: int
+KEY_F31 = ... # type: int
+KEY_F32 = ... # type: int
+KEY_F33 = ... # type: int
+KEY_F34 = ... # type: int
+KEY_F35 = ... # type: int
+KEY_F36 = ... # type: int
+KEY_F37 = ... # type: int
+KEY_F38 = ... # type: int
+KEY_F39 = ... # type: int
+KEY_F4 = ... # type: int
+KEY_F40 = ... # type: int
+KEY_F41 = ... # type: int
+KEY_F42 = ... # type: int
+KEY_F43 = ... # type: int
+KEY_F44 = ... # type: int
+KEY_F45 = ... # type: int
+KEY_F46 = ... # type: int
+KEY_F47 = ... # type: int
+KEY_F48 = ... # type: int
+KEY_F49 = ... # type: int
+KEY_F5 = ... # type: int
+KEY_F50 = ... # type: int
+KEY_F51 = ... # type: int
+KEY_F52 = ... # type: int
+KEY_F53 = ... # type: int
+KEY_F54 = ... # type: int
+KEY_F55 = ... # type: int
+KEY_F56 = ... # type: int
+KEY_F57 = ... # type: int
+KEY_F58 = ... # type: int
+KEY_F59 = ... # type: int
+KEY_F6 = ... # type: int
+KEY_F60 = ... # type: int
+KEY_F61 = ... # type: int
+KEY_F62 = ... # type: int
+KEY_F63 = ... # type: int
+KEY_F7 = ... # type: int
+KEY_F8 = ... # type: int
+KEY_F9 = ... # type: int
+KEY_FIND = ... # type: int
+KEY_HELP = ... # type: int
+KEY_HOME = ... # type: int
+KEY_IC = ... # type: int
+KEY_IL = ... # type: int
+KEY_LEFT = ... # type: int
+KEY_LL = ... # type: int
+KEY_MARK = ... # type: int
+KEY_MAX = ... # type: int
+KEY_MESSAGE = ... # type: int
+KEY_MIN = ... # type: int
+KEY_MOUSE = ... # type: int
+KEY_MOVE = ... # type: int
+KEY_NEXT = ... # type: int
+KEY_NPAGE = ... # type: int
+KEY_OPEN = ... # type: int
+KEY_OPTIONS = ... # type: int
+KEY_PPAGE = ... # type: int
+KEY_PREVIOUS = ... # type: int
+KEY_PRINT = ... # type: int
+KEY_REDO = ... # type: int
+KEY_REFERENCE = ... # type: int
+KEY_REFRESH = ... # type: int
+KEY_REPLACE = ... # type: int
+KEY_RESET = ... # type: int
+KEY_RESIZE = ... # type: int
+KEY_RESTART = ... # type: int
+KEY_RESUME = ... # type: int
+KEY_RIGHT = ... # type: int
+KEY_SAVE = ... # type: int
+KEY_SBEG = ... # type: int
+KEY_SCANCEL = ... # type: int
+KEY_SCOMMAND = ... # type: int
+KEY_SCOPY = ... # type: int
+KEY_SCREATE = ... # type: int
+KEY_SDC = ... # type: int
+KEY_SDL = ... # type: int
+KEY_SELECT = ... # type: int
+KEY_SEND = ... # type: int
+KEY_SEOL = ... # type: int
+KEY_SEXIT = ... # type: int
+KEY_SF = ... # type: int
+KEY_SFIND = ... # type: int
+KEY_SHELP = ... # type: int
+KEY_SHOME = ... # type: int
+KEY_SIC = ... # type: int
+KEY_SLEFT = ... # type: int
+KEY_SMESSAGE = ... # type: int
+KEY_SMOVE = ... # type: int
+KEY_SNEXT = ... # type: int
+KEY_SOPTIONS = ... # type: int
+KEY_SPREVIOUS = ... # type: int
+KEY_SPRINT = ... # type: int
+KEY_SR = ... # type: int
+KEY_SREDO = ... # type: int
+KEY_SREPLACE = ... # type: int
+KEY_SRESET = ... # type: int
+KEY_SRIGHT = ... # type: int
+KEY_SRSUME = ... # type: int
+KEY_SSAVE = ... # type: int
+KEY_SSUSPEND = ... # type: int
+KEY_STAB = ... # type: int
+KEY_SUNDO = ... # type: int
+KEY_SUSPEND = ... # type: int
+KEY_UNDO = ... # type: int
+KEY_UP = ... # type: int
+OK = ... # type: int
+REPORT_MOUSE_POSITION = ... # type: int
+_C_API = ... # type: Any
+version = ... # type: bytes
+
+def baudrate() -> int: ...
+def beep() -> None: ...
+def can_change_color() -> bool: ...
+def cbreak(flag: bool = ...) -> None: ...
+def color_content(color_number: int) -> Tuple[int, int, int]: ...
+def color_pair(color_number: int) -> int: ...
+def curs_set(visibility: int) -> int: ...
+def def_prog_mode() -> None: ...
+def def_shell_mode() -> None: ...
+def delay_output(ms: int) -> None: ...
+def doupdate() -> None: ...
+def echo(flag: bool = ...) -> None: ...
+def endwin() -> None: ...
+def erasechar() -> bytes: ...
+def filter() -> None: ...
+def flash() -> None: ...
+def flushinp() -> None: ...
+def getmouse() -> Tuple[int, int, int, int, int]: ...
+def getsyx() -> Tuple[int, int]: ...
+def getwin(f: BinaryIO): ...
+def halfdelay(tenths: int) -> None: ...
+def has_colors() -> bool: ...
+def has_ic() -> bool: ...
+def has_il() -> bool: ...
+def has_key(ch: int) -> bool: ...
+def init_color(color_number: int, r: int, g: int, b: int) -> None: ...
+def init_pair(pair_number: int, fg: int, bg: int) -> None: ...
+def initscr(): ...
+def intrflush(ch: bool) -> None: ...
+def is_term_resized(nlines: int, ncols: int) -> bool: ...
+def isendwin() -> bool: ...
+def keyname(k: int) -> bytes: ...
+def killchar() -> bytes: ...
+def longname() -> bytes: ...
+def meta(yes: bool) -> None: ...
+def mouseinterval(interval: int) -> None: ...
+def mousemask(mousemask: int) -> Tuple[int, int]: ...
+def napms(ms: int) -> int: ...
+def newpad(nlines: int, ncols: int): ...
+def newwin(nlines: int, ncols: int, begin_y: int = ..., begin_x: int = ...): ...
+def nl(flag: bool = ...) -> None: ...
+def nocbreak() -> None: ...
+def noecho() -> None: ...
+def nonl() -> None: ...
+def noqiflush() -> None: ...
+def noraw() -> None: ...
+def pair_content(pair_number: int) -> Tuple[int, int]: ...
+def pair_number(attr: int) -> int: ...
+def putp(string: bytes) -> None: ...
+def qiflush(flag: bool = ...) -> None: ...
+def raw(flag: bool = ...) -> None: ...
+def reset_prog_mode() -> None: ...
+def reset_shell_mode() -> None: ...
+def resetty() -> None: ...
+def resize_term(nlines: int, ncols: int) -> None: ...
+def resizeterm(nlines: int, ncols: int) -> None: ...
+def savetty() -> None: ...
+def setsyx(y: int, x: int) -> None: ...
+def setupterm(termstr: str = ..., fd: int = ...) -> None: ...
+def start_color() -> None: ...
+def termattrs() -> int: ...
+def termname() -> bytes: ...
+def tigetflag(capname: str) -> int: ...
+def tigetnum(capname: str) -> int: ...
+def tigetstr(capname: str) -> bytes: ...
+def tparm(fmt: str, i1: int = ..., i2: int = ..., i3: int = ..., i4: int = ..., i5: int = ..., i6: int = ..., i7: int = ..., i8: int = ..., i9: int = ...) -> str: ...
+def typeahead(fd: int) -> None: ...
+def unctrl(ch: chtype) -> bytes: ...
+def unget_wch(ch: chtype) -> None: ...
+def ungetch(ch: chtype) -> None: ...
+def ungetmouse(id: int, x: int, y: int, z: int, bstate: int) -> None: ...
+def update_lines_cols() -> int: ...
+def use_default_colors() -> None: ...
+def use_env(flag: bool) -> None: ...
+
+class error(Exception): ...
diff --git a/typeshed/stdlib/3/_dummy_thread.pyi b/typeshed/stdlib/3/_dummy_thread.pyi
new file mode 100644
index 0000000..a4ff81c
--- /dev/null
+++ b/typeshed/stdlib/3/_dummy_thread.pyi
@@ -0,0 +1,11 @@
+# Stubs for _dummy_thread
+
+# NOTE: These are incomplete!
+
+from typing import Any
+
+class LockType:
+ def acquire(self) -> None: ...
+ def release(self) -> None: ...
+
+def allocate_lock() -> LockType: ...
diff --git a/typeshed/stdlib/3/_importlib_modulespec.pyi b/typeshed/stdlib/3/_importlib_modulespec.pyi
new file mode 100644
index 0000000..1acd9f1
--- /dev/null
+++ b/typeshed/stdlib/3/_importlib_modulespec.pyi
@@ -0,0 +1,43 @@
+# ModuleSpec, ModuleType, Loader are part of a dependency cycle.
+# They are officially defined/exported in other places:
+#
+# - ModuleType in types
+# - Loader in importlib.abc
+# - ModuleSpec in importlib.machinery (3.4 and later only)
+
+from abc import ABCMeta
+import sys
+from typing import Any, Optional
+
+if sys.version_info >= (3, 4):
+ class ModuleSpec:
+ def __init__(self, name: str, loader: Optional['Loader'], *,
+ origin: str = None, loader_state: Any = None,
+ is_package: bool = None) -> None: ...
+ name = ... # type: str
+ loader = ... # type: Optional[Loader]
+ origin = ... # type: Optional[str]
+ submodule_search_locations = ... # type: Optional[List[str]]
+ loader_state = ... # type: Any
+ cached = ... # type: Optional[str]
+ parent = ... # type: Optional[str]
+ has_location = ... # type: bool
+
+class ModuleType:
+ __name__ = ... # type: str
+ __file__ = ... # type: str
+ if sys.version_info >= (3, 4):
+ __loader__ = ... # type: Optional[Loader]
+ __package__ = ... # type: Optional[str]
+ __spec__ = ... # type: Optional[ModuleSpec]
+ def __init__(self, name: str, doc: str) -> None: ...
+
+class Loader(metaclass=ABCMeta):
+ def load_module(self, fullname: str) -> ModuleType: ...
+ if sys.version_info >= (3, 3):
+ def module_repr(self, module: ModuleType) -> str: ...
+ if sys.version_info >= (3, 4):
+ def create_module(self, spec: ModuleSpec) -> Optional[ModuleType]: ...
+ # Not defined on the actual class for backwards-compatibility reasons,
+ # but expected in new code.
+ def exec_module(self, module: ModuleType) -> None: ...
diff --git a/typeshed/stdlib/3/_json.pyi b/typeshed/stdlib/3/_json.pyi
new file mode 100644
index 0000000..ce9483a
--- /dev/null
+++ b/typeshed/stdlib/3/_json.pyi
@@ -0,0 +1,30 @@
+"""Stub file for the '_json' module."""
+
+from typing import Any, Tuple
+
+class make_encoder:
+ sort_keys = ... # type: Any
+ skipkeys = ... # type: Any
+ key_separator = ... # type: Any
+ indent = ... # type: Any
+ markers = ... # type: Any
+ default = ... # type: Any
+ encoder = ... # type: Any
+ item_separator = ... # type: Any
+ def __init__(self, markers, default, encoder, indent, key_separator,
+ item_separator, sort_keys, skipkeys, allow_nan) -> None: ...
+ def __call__(self, *args, **kwargs) -> Any: ...
+
+class make_scanner:
+ object_hook = ... # type: Any
+ object_pairs_hook = ... # type: Any
+ parse_int = ... # type: Any
+ parse_constant = ... # type: Any
+ parse_float = ... # type: Any
+ strict = ... # type: bool
+ # TODO: 'context' needs the attrs above (ducktype), but not __call__.
+ def __init__(self, context: "make_scanner") -> None: ...
+ def __call__(self, string: str, index: int) -> Tuple[Any, int]: ...
+
+def encode_basestring_ascii(s: str) -> str: ...
+def scanstring(string: str, end: int, strict: bool = ...) -> Tuple[str, int]: ...
diff --git a/typeshed/stdlib/3/_markupbase.pyi b/typeshed/stdlib/3/_markupbase.pyi
new file mode 100644
index 0000000..129b49b
--- /dev/null
+++ b/typeshed/stdlib/3/_markupbase.pyi
@@ -0,0 +1,9 @@
+from typing import Tuple
+
+class ParserBase(object):
+ def __init__(self) -> None: ...
+ def error(self, message: str) -> None: ...
+ def reset(self) -> None: ...
+ def getpos(self) -> Tuple[int, int]: ...
+
+ def unkown_decl(self, data: str) -> None: ...
diff --git a/typeshed/stdlib/3/_operator.pyi b/typeshed/stdlib/3/_operator.pyi
new file mode 100644
index 0000000..0f64f95
--- /dev/null
+++ b/typeshed/stdlib/3/_operator.pyi
@@ -0,0 +1,71 @@
+# Stubs for _operator (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+def _compare_digest(*args, **kwargs): ...
+def abs(a): ...
+def add(a, b): ...
+def and_(a, b): ...
+def concat(a, b): ...
+def contains(a, b): ...
+def countOf(a, b): ...
+def delitem(a, b): ...
+def eq(a, b): ...
+def floordiv(a, b): ...
+def ge(a, b): ...
+def getitem(a, b): ...
+def gt(a, b): ...
+def iadd(*args, **kwargs): ...
+def iand(*args, **kwargs): ...
+def iconcat(*args, **kwargs): ...
+def ifloordiv(*args, **kwargs): ...
+def ilshift(*args, **kwargs): ...
+def imatmul(*args, **kwargs): ...
+def imod(*args, **kwargs): ...
+def imul(*args, **kwargs): ...
+def index(a): ...
+def indexOf(a, b): ...
+def inv(a): ...
+def invert(a): ...
+def ior(*args, **kwargs): ...
+def ipow(*args, **kwargs): ...
+def irshift(*args, **kwargs): ...
+def is_(a, b): ...
+def is_not(a, b): ...
+def isub(*args, **kwargs): ...
+def itruediv(*args, **kwargs): ...
+def ixor(*args, **kwargs): ...
+def le(a, b): ...
+def length_hint(obj, default=0): ...
+def lshift(a, b): ...
+def lt(a, b): ...
+def matmul(a, b): ...
+def mod(a, b): ...
+def mul(a, b): ...
+def ne(a, b): ...
+def neg(a): ...
+def not_(a): ...
+def or_(a, b): ...
+def pos(a): ...
+def pow(a, b): ...
+def rshift(a, b): ...
+def setitem(a, b, c): ...
+def sub(a, b): ...
+def truediv(a, b): ...
+def truth(a): ...
+def xor(a, b): ...
+
+class attrgetter:
+ def __init__(self, *args, **kwargs): ...
+ def __call__(self, *args, **kwargs): ...
+ def __reduce__(self): ...
+
+class itemgetter:
+ def __init__(self, *args, **kwargs): ...
+ def __call__(self, *args, **kwargs): ...
+ def __reduce__(self): ...
+
+class methodcaller:
+ def __init__(self, *args, **kwargs): ...
+ def __call__(self, *args, **kwargs): ...
+ def __reduce__(self): ...
diff --git a/typeshed/stdlib/3/_posixsubprocess.pyi b/typeshed/stdlib/3/_posixsubprocess.pyi
new file mode 100644
index 0000000..a048a10
--- /dev/null
+++ b/typeshed/stdlib/3/_posixsubprocess.pyi
@@ -0,0 +1,13 @@
+# Stubs for _posixsubprocess
+
+# NOTE: These are incomplete!
+
+from typing import Tuple, Sequence
+
+def cloexec_pipe() -> Tuple[int, int]: ...
+def fork_exec(args: Sequence[str],
+ executable_list, close_fds, fds_to_keep, cwd: str, env_list,
+ p2cread: int, p2cwrite: int, c2pred: int, c2pwrite: int,
+ errread: int, errwrite: int, errpipe_read: int,
+ errpipe_write: int, restore_signals, start_new_session,
+ preexec_fn) -> int: ...
diff --git a/typeshed/stdlib/3/_random.pyi b/typeshed/stdlib/3/_random.pyi
new file mode 100644
index 0000000..b3fcdb4
--- /dev/null
+++ b/typeshed/stdlib/3/_random.pyi
@@ -0,0 +1,12 @@
+# Stubs for _random
+
+# NOTE: These are incomplete!
+
+from typing import Any
+
+class Random:
+ def seed(self, x: Any = ...) -> None: ...
+ def getstate(self) -> tuple: ...
+ def setstate(self, state: tuple) -> None: ...
+ def random(self) -> float: ...
+ def getrandbits(self, k: int) -> int: ...
diff --git a/typeshed/stdlib/3/_subprocess.pyi b/typeshed/stdlib/3/_subprocess.pyi
new file mode 100644
index 0000000..76967b9
--- /dev/null
+++ b/typeshed/stdlib/3/_subprocess.pyi
@@ -0,0 +1,38 @@
+# Stubs for _subprocess
+
+# NOTE: These are incomplete!
+
+from typing import Mapping, Any, Tuple
+
+CREATE_NEW_CONSOLE = 0
+CREATE_NEW_PROCESS_GROUP = 0
+STD_INPUT_HANDLE = 0
+STD_OUTPUT_HANDLE = 0
+STD_ERROR_HANDLE = 0
+SW_HIDE = 0
+STARTF_USESTDHANDLES = 0
+STARTF_USESHOWWINDOW = 0
+INFINITE = 0
+DUPLICATE_SAME_ACCESS = 0
+WAIT_OBJECT_0 = 0
+
+# TODO not exported by the Python module
+class Handle:
+ def Close(self) -> None: ...
+
+def GetVersion() -> int: ...
+def GetExitCodeProcess(handle: Handle) -> int: ...
+def WaitForSingleObject(handle: Handle, timeout: int) -> int: ...
+def CreateProcess(executable: str, cmd_line: str,
+ proc_attrs, thread_attrs,
+ inherit: int, flags: int,
+ env_mapping: Mapping[str, str],
+ curdir: str,
+ startupinfo: Any) -> Tuple[Any, Handle, int, int]: ...
+def GetModuleFileName(module: int) -> str: ...
+def GetCurrentProcess() -> Handle: ...
+def DuplicateHandle(source_proc: Handle, source: Handle, target_proc: Handle,
+ target: Any, access: int, inherit: int) -> int: ...
+def CreatePipe(pipe_attrs, size: int) -> Tuple[Handle, Handle]: ...
+def GetStdHandle(arg: int) -> int: ...
+def TerminateProcess(handle: Handle, exit_code: int) -> None: ...
diff --git a/typeshed/stdlib/3/_thread.pyi b/typeshed/stdlib/3/_thread.pyi
new file mode 100644
index 0000000..a8e38a9
--- /dev/null
+++ b/typeshed/stdlib/3/_thread.pyi
@@ -0,0 +1,15 @@
+# Stubs for _thread
+
+# NOTE: These are incomplete!
+
+from typing import Any
+
+def _count() -> int: ...
+_dangling = ... # type: Any
+
+class LockType:
+ def acquire(self) -> None: ...
+ def release(self) -> None: ...
+
+def allocate_lock() -> LockType: ...
+def get_ident() -> int: ...
diff --git a/typeshed/stdlib/3/_warnings.pyi b/typeshed/stdlib/3/_warnings.pyi
new file mode 100644
index 0000000..b1f0431
--- /dev/null
+++ b/typeshed/stdlib/3/_warnings.pyi
@@ -0,0 +1,11 @@
+from typing import Any, List
+
+_defaultaction = ... # type: str
+_onceregistry = ... # type: dict
+filters = ... # type: List[tuple]
+
+def warn(message: Warning, category: type = ..., stacklevel: int = ...) -> None: ...
+def warn_explicit(message: Warning, category: type,
+ filename: str, lineno: int,
+ module: Any = ..., registry: dict = ...,
+ module_globals: dict = ...) -> None: ...
diff --git a/typeshed/stdlib/3/abc.pyi b/typeshed/stdlib/3/abc.pyi
new file mode 100644
index 0000000..80287e1
--- /dev/null
+++ b/typeshed/stdlib/3/abc.pyi
@@ -0,0 +1,13 @@
+from typing import Any
+import sys
+# Stubs for abc.
+
+# Thesee definitions have special processing in type checker.
+class ABCMeta(type):
+ def register(cls: "ABCMeta", subclass: Any) -> None: ...
+abstractmethod = object()
+abstractproperty = object()
+
+if sys.version_info >= (3, 4):
+ class ABC(metaclass=ABCMeta):
+ pass
diff --git a/typeshed/stdlib/3/array.pyi b/typeshed/stdlib/3/array.pyi
new file mode 100644
index 0000000..77ed052
--- /dev/null
+++ b/typeshed/stdlib/3/array.pyi
@@ -0,0 +1,49 @@
+# Stubs for array
+
+# Based on http://docs.python.org/3.2/library/array.html
+
+from typing import Any, Iterable, Tuple, List, Iterator, BinaryIO, overload
+
+typecodes = ... # type: str
+
+class array:
+ typecode = ... # type: str
+ itemsize = ... # type: int
+ def __init__(self, typecode: str,
+ initializer: Iterable[Any] = ...) -> None: ...
+ def append(self, x: Any) -> None: ...
+ def buffer_info(self) -> Tuple[int, int]: ...
+ def byteswap(self) -> None: ...
+ def count(self, x: Any) -> int: ...
+ def extend(self, iterable: Iterable[Any]) -> None: ...
+ def frombytes(self, s: bytes) -> None: ...
+ def fromfile(self, f: BinaryIO, n: int) -> None: ...
+ def fromlist(self, list: List[Any]) -> None: ...
+ def fromstring(self, s: bytes) -> None: ...
+ def fromunicode(self, s: str) -> None: ...
+ def index(self, x: Any) -> int: ...
+ def insert(self, i: int, x: Any) -> None: ...
+ def pop(self, i: int = ...) -> Any: ...
+ def remove(self, x: Any) -> None: ...
+ def reverse(self) -> None: ...
+ def tobytes(self) -> bytes: ...
+ def tofile(self, f: BinaryIO) -> None: ...
+ def tolist(self) -> List[Any]: ...
+ def tostring(self) -> bytes: ...
+ def tounicode(self) -> str: ...
+
+ def __len__(self) -> int: ...
+ def __iter__(self) -> Iterator[Any]: ...
+ def __str__(self) -> str: ...
+ def __hash__(self) -> int: ...
+
+ @overload
+ def __getitem__(self, i: int) -> Any: ...
+ @overload
+ def __getitem__(self, s: slice) -> 'array': ...
+
+ def __setitem__(self, i: int, o: Any) -> None: ...
+ def __delitem__(self, i: int) -> None: ...
+ def __add__(self, x: 'array') -> 'array': ...
+ def __mul__(self, n: int) -> 'array': ...
+ def __contains__(self, o: object) -> bool: ...
diff --git a/typeshed/stdlib/3/ast.pyi b/typeshed/stdlib/3/ast.pyi
new file mode 100644
index 0000000..f9488c9
--- /dev/null
+++ b/typeshed/stdlib/3/ast.pyi
@@ -0,0 +1,39 @@
+# Python 3.5 ast
+
+import typing
+from typing import Any, Union, Iterator
+
+from _ast import (
+ Add, alias, And, arg, arguments, Assert, Assign, AST, AsyncFor,
+ AsyncFunctionDef, AsyncWith, Attribute, AugAssign, AugLoad, AugStore,
+ Await, BinOp, BitAnd, BitOr, BitXor, BoolOp, boolop, Break, Bytes, Call,
+ ClassDef, cmpop, Compare, comprehension, Continue, Del, Delete, Dict,
+ DictComp, Div, Ellipsis, Eq, ExceptHandler, Expr, expr, Expression,
+ expr_context, ExtSlice, FloorDiv, For, FunctionDef, GeneratorExp, Global,
+ Gt, GtE, If, IfExp, Import, ImportFrom, In, Index, Interactive, Invert, Is,
+ IsNot, keyword, Lambda, List, ListComp, Load, LShift, Lt, LtE, MatMult,
+ Mod, mod, Module, Mult, Name, NameConstant, Nonlocal, Not, NotEq, NotIn,
+ Num, operator, Or, Param, Pass, Pow, Raise, Return, RShift, Set, SetComp,
+ Slice, slice, Starred, stmt, Store, Str, Sub, Subscript, Suite, Try, Tuple,
+ UAdd, UnaryOp, unaryop, USub, While, With, withitem, Yield, YieldFrom
+)
+
+class NodeVisitor():
+ def visit(self, node: AST) -> Any: ...
+ def generic_visit(self, node: AST) -> None: ...
+
+class NodeTransformer(NodeVisitor):
+ def generic_visit(self, node: AST) -> None: ...
+
+def parse(source: Union[str, bytes], filename: Union[str, bytes] = ..., mode: str = ...) -> AST: ...
+def copy_location(new_node: AST, old_node: AST) -> AST: ...
+def dump(node: AST, annotate_fields: bool = ..., include_attributes: bool = ...) -> str: ...
+def fix_missing_locations(node: AST) -> AST: ...
+def get_docstring(node: AST, clean: bool = ...) -> str: ...
+def increment_lineno(node: AST, n: int = ...) -> AST: ...
+def iter_child_nodes(node: AST) -> Iterator[AST]: ...
+def iter_fields(node: AST) -> Iterator[typing.Tuple[str, Any]]: ...
+def literal_eval(node_or_string: Union[str, AST]) -> Any: ...
+def walk(node: AST) -> Iterator[AST]: ...
+
+PyCF_ONLY_AST = ... # type: int
diff --git a/typeshed/stdlib/3/atexit.pyi b/typeshed/stdlib/3/atexit.pyi
new file mode 100644
index 0000000..24f9389
--- /dev/null
+++ b/typeshed/stdlib/3/atexit.pyi
@@ -0,0 +1,9 @@
+"""Stub file for the 'atexit' module."""
+
+from typing import Any, Callable
+
+def _clear() -> None: ...
+def _ncallbacks() -> int: ...
+def _run_exitfuncs() -> None: ...
+def register(func: Callable[..., Any], *args: Any, **kwargs: Any) -> Callable[..., Any]: ...
+def unregister(func: Callable[..., Any]) -> None: ...
diff --git a/typeshed/stdlib/3/base64.pyi b/typeshed/stdlib/3/base64.pyi
new file mode 100644
index 0000000..4e76ebb
--- /dev/null
+++ b/typeshed/stdlib/3/base64.pyi
@@ -0,0 +1,42 @@
+# Stubs for base64
+
+from typing import IO, Union
+import sys
+
+
+if sys.version_info <= (3, 2):
+ _encodable = bytes
+ _decodable = bytes
+elif sys.version_info[:2] == (3, 3):
+ _encodable = bytes
+ _decodable = Union[bytes, str]
+elif sys.version_info >= (3, 4):
+ _encodable = Union[bytes, bytearray, memoryview]
+ _decodable = Union[bytes, bytearray, memoryview, str]
+
+def b64encode(s: _encodable, altchars: bytes = ...) -> bytes: ...
+def b64decode(s: _decodable, altchars: bytes = ...,
+ validate: bool = ...) -> bytes: ...
+def standard_b64encode(s: _encodable) -> bytes: ...
+def standard_b64decode(s: _decodable) -> bytes: ...
+def urlsafe_b64encode(s: _encodable) -> bytes: ...
+def urlsafe_b64decode(s: _decodable) -> bytes: ...
+def b32encode(s: _encodable) -> bytes: ...
+def b32decode(s: _decodable, casefold: bool = ...,
+ map01: bytes = ...) -> bytes: ...
+def b16encode(s: _encodable) -> bytes: ...
+def b16decode(s: _decodable, casefold: bool = ...) -> bytes: ...
+if sys.version_info >= (3, 4):
+ def a85encode(b: _encodable, *, foldspaces: bool = ..., wrapcol: int = ...,
+ pad: bool = ..., adobe: bool = ...) -> bytes: ...
+ def a85decode(b: _decodable, *, foldspaces: bool = ...,
+ adobe: bool = ..., ignorechars: Union[str, bytes] = ...) -> bytes: ...
+ def b85encode(b: _encodable, pad: bool = ...) -> bytes: ...
+ def b85decode(b: _decodable) -> bytes: ...
+
+def decode(input: IO[bytes], output: IO[bytes]) -> None: ...
+def decodebytes(s: bytes) -> bytes: ...
+def decodestring(s: bytes) -> bytes: ...
+def encode(input: IO[bytes], output: IO[bytes]) -> None: ...
+def encodebytes(s: bytes) -> bytes: ...
+def encodestring(s: bytes) -> bytes: ...
diff --git a/typeshed/stdlib/3/binascii.pyi b/typeshed/stdlib/3/binascii.pyi
new file mode 100644
index 0000000..edbd970
--- /dev/null
+++ b/typeshed/stdlib/3/binascii.pyi
@@ -0,0 +1,26 @@
+# Stubs for binascii
+
+# Based on http://docs.python.org/3.2/library/binascii.html
+
+from typing import Union
+
+def a2b_uu(string: Union[str, bytes]) -> bytes: ...
+def b2a_uu(data: bytes) -> bytes: ...
+def a2b_base64(string: Union[str, bytes]) -> bytes: ...
+def b2a_base64(data: bytes) -> bytes: ...
+def a2b_qp(string: Union[str, bytes], header: bool = ...) -> bytes: ...
+def b2a_qp(data: bytes, quotetabs: bool = ..., istext: bool = ...,
+ header: bool = ...) -> bytes: ...
+def a2b_hqx(string: Union[str, bytes]) -> bytes: ...
+def rledecode_hqx(data: bytes) -> bytes: ...
+def rlecode_hqx(data: bytes) -> bytes: ...
+def b2a_hqx(data: bytes) -> bytes: ...
+def crc_hqx(data: bytes, crc: int) -> int: ...
+def crc32(data: bytes, crc: int = ...) -> int: ...
+def b2a_hex(data: bytes) -> bytes: ...
+def hexlify(data: bytes) -> bytes: ...
+def a2b_hex(hexstr: Union[str, bytes]) -> bytes: ...
+def unhexlify(hexlify: Union[str, bytes]) -> bytes: ...
+
+class Error(Exception): ...
+class Incomplete(Exception): ...
diff --git a/typeshed/stdlib/3/builtins.pyi b/typeshed/stdlib/3/builtins.pyi
new file mode 100644
index 0000000..7000ad5
--- /dev/null
+++ b/typeshed/stdlib/3/builtins.pyi
@@ -0,0 +1,908 @@
+# Stubs for builtins (Python 3)
+
+from typing import (
+ TypeVar, Iterator, Iterable, overload, Container,
+ Sequence, MutableSequence, Mapping, MutableMapping, Tuple, List, Any, Dict, Callable, Generic,
+ Set, AbstractSet, FrozenSet, MutableSet, Sized, Reversible, SupportsInt, SupportsFloat,
+ SupportsBytes, SupportsAbs, SupportsRound, IO, Union, ItemsView, KeysView, ValuesView,
+ ByteString, Optional
+)
+from abc import abstractmethod, ABCMeta
+from types import TracebackType
+import sys
+from mypy_extensions import NoReturn
+
+# Note that names imported above are not automatically made visible via the
+# implicit builtins import.
+
+_T = TypeVar('_T')
+_T_co = TypeVar('_T_co', covariant=True)
+_KT = TypeVar('_KT')
+_VT = TypeVar('_VT')
+_S = TypeVar('_S')
+_T1 = TypeVar('_T1')
+_T2 = TypeVar('_T2')
+_T3 = TypeVar('_T3')
+_T4 = TypeVar('_T4')
+_TT = TypeVar('_TT', bound='type')
+
+class staticmethod: pass # Special, only valid as a decorator.
+class classmethod: pass # Special, only valid as a decorator.
+
+class object:
+ __doc__ = ... # type: Optional[str]
+ __class__ = ... # type: type
+ __dict__ = ... # type: Dict[str, Any]
+ __slots__ = ... # type: Optional[Union[str, Iterable[str]]]
+
+ def __init__(self) -> None: ...
+ def __new__(cls) -> Any: ...
+ def __setattr__(self, name: str, value: Any) -> None: ...
+ def __eq__(self, o: object) -> bool: ...
+ def __ne__(self, o: object) -> bool: ...
+ def __str__(self) -> str: ...
+ def __repr__(self) -> str: ...
+ def __hash__(self) -> int: ...
+ def __format__(self, format_spec: str) -> str: ...
+ def __getattribute__(self, name: str) -> Any: ...
+ def __delattr__(self, name: str) -> None: ...
+
+ if sys.version_info >= (3, 6):
+ def __init_subclass__(cls) -> None: ...
+
+class type:
+ __bases__ = ... # type: Tuple[type, ...]
+ __name__ = ... # type: str
+ __qualname__ = ... # type: str
+ __module__ = ... # type: str
+ __dict__ = ... # type: Dict[str, Any]
+ __mro__ = ... # type: Tuple[type, ...]
+
+ @overload
+ def __init__(self, o: object) -> None: ...
+ @overload
+ def __init__(self, name: str, bases: Tuple[type, ...], dict: Dict[str, Any]) -> None: ...
+ @overload
+ def __new__(cls, o: object) -> type: ...
+ @overload
+ def __new__(cls, name: str, bases: Tuple[type, ...], namespace: Dict[str, Any]) -> type: ...
+ def __call__(self, *args: Any, **kwds: Any) -> Any: ...
+ def __subclasses__(self: _TT) -> List[_TT]: ...
+ # Note: the documentation doesnt specify what the return type is, the standard
+ # implementation seems to be returning a list.
+ def mro(self) -> List[type]: ...
+
+class int(SupportsInt, SupportsFloat, SupportsAbs[int]):
+ def __init__(self, x: Union[SupportsInt, str, bytes] = ..., base: int = ...) -> None: ...
+ def bit_length(self) -> int: ...
+ def to_bytes(self, length: int, byteorder: str, *, signed: bool = ...) -> bytes: ...
+ @classmethod
+ def from_bytes(cls, bytes: Sequence[int], byteorder: str, *,
+ signed: bool = ...) -> int: ... # TODO buffer object argument
+
+ def __add__(self, x: int) -> int: ...
+ def __sub__(self, x: int) -> int: ...
+ def __mul__(self, x: int) -> int: ...
+ def __floordiv__(self, x: int) -> int: ...
+ def __truediv__(self, x: int) -> float: ...
+ def __mod__(self, x: int) -> int: ...
+ def __radd__(self, x: int) -> int: ...
+ def __rsub__(self, x: int) -> int: ...
+ def __rmul__(self, x: int) -> int: ...
+ def __rfloordiv__(self, x: int) -> int: ...
+ def __rtruediv__(self, x: int) -> float: ...
+ def __rmod__(self, x: int) -> int: ...
+ def __pow__(self, x: int) -> Any: ... # Return type can be int or float, depending on x.
+ def __rpow__(self, x: int) -> Any: ...
+ def __and__(self, n: int) -> int: ...
+ def __or__(self, n: int) -> int: ...
+ def __xor__(self, n: int) -> int: ...
+ def __lshift__(self, n: int) -> int: ...
+ def __rshift__(self, n: int) -> int: ...
+ def __rand__(self, n: int) -> int: ...
+ def __ror__(self, n: int) -> int: ...
+ def __rxor__(self, n: int) -> int: ...
+ def __rlshift__(self, n: int) -> int: ...
+ def __rrshift__(self, n: int) -> int: ...
+ def __neg__(self) -> int: ...
+ def __pos__(self) -> int: ...
+ def __invert__(self) -> int: ...
+
+ def __eq__(self, x: object) -> bool: ...
+ def __ne__(self, x: object) -> bool: ...
+ def __lt__(self, x: int) -> bool: ...
+ def __le__(self, x: int) -> bool: ...
+ def __gt__(self, x: int) -> bool: ...
+ def __ge__(self, x: int) -> bool: ...
+
+ def __str__(self) -> str: ...
+ def __float__(self) -> float: ...
+ def __int__(self) -> int: return self
+ def __abs__(self) -> int: ...
+ def __hash__(self) -> int: ...
+
+class float(SupportsFloat, SupportsInt, SupportsAbs[float]):
+ def __init__(self, x: Union[SupportsFloat, str, bytes] = ...) -> None: ...
+ def as_integer_ratio(self) -> Tuple[int, int]: ...
+ def hex(self) -> str: ...
+ def is_integer(self) -> bool: ...
+ @classmethod
+ def fromhex(cls, s: str) -> float: ...
+
+ def __add__(self, x: float) -> float: ...
+ def __sub__(self, x: float) -> float: ...
+ def __mul__(self, x: float) -> float: ...
+ def __floordiv__(self, x: float) -> float: ...
+ def __truediv__(self, x: float) -> float: ...
+ def __mod__(self, x: float) -> float: ...
+ def __pow__(self, x: float) -> float: ...
+ def __radd__(self, x: float) -> float: ...
+ def __rsub__(self, x: float) -> float: ...
+ def __rmul__(self, x: float) -> float: ...
+ def __rfloordiv__(self, x: float) -> float: ...
+ def __rtruediv__(self, x: float) -> float: ...
+ def __rmod__(self, x: float) -> float: ...
+ def __rpow__(self, x: float) -> float: ...
+
+ def __eq__(self, x: object) -> bool: ...
+ def __ne__(self, x: object) -> bool: ...
+ def __lt__(self, x: float) -> bool: ...
+ def __le__(self, x: float) -> bool: ...
+ def __gt__(self, x: float) -> bool: ...
+ def __ge__(self, x: float) -> bool: ...
+ def __neg__(self) -> float: ...
+ def __pos__(self) -> float: ...
+
+ def __str__(self) -> str: ...
+ def __int__(self) -> int: ...
+ def __float__(self) -> float: ...
+ def __abs__(self) -> float: ...
+ def __hash__(self) -> int: ...
+
+class complex(SupportsAbs[float]):
+ @overload
+ def __init__(self, re: float = 0.0, im: float = 0.0) -> None: ...
+ @overload
+ def __init__(self, s: str) -> None: ...
+
+ @property
+ def real(self) -> float: ...
+ @property
+ def imag(self) -> float: ...
+
+ def conjugate(self) -> complex: ...
+
+ def __add__(self, x: complex) -> complex: ...
+ def __sub__(self, x: complex) -> complex: ...
+ def __mul__(self, x: complex) -> complex: ...
+ def __pow__(self, x: complex) -> complex: ...
+ def __truediv__(self, x: complex) -> complex: ...
+ def __radd__(self, x: complex) -> complex: ...
+ def __rsub__(self, x: complex) -> complex: ...
+ def __rmul__(self, x: complex) -> complex: ...
+ def __rpow__(self, x: complex) -> complex: ...
+ def __rtruediv__(self, x: complex) -> complex: ...
+
+ def __eq__(self, x: object) -> bool: ...
+ def __ne__(self, x: object) -> bool: ...
+ def __neg__(self) -> complex: ...
+ def __pos__(self) -> complex: ...
+
+ def __str__(self) -> str: ...
+ def __abs__(self) -> float: ...
+ def __hash__(self) -> int: ...
+
+class str(Sequence[str]):
+ @overload
+ def __init__(self) -> None: ...
+ @overload
+ def __init__(self, o: object) -> None: ...
+ @overload
+ def __init__(self, o: bytes, encoding: str = ..., errors: str = 'strict') -> None: ...
+ def capitalize(self) -> str: ...
+ def center(self, width: int, fillchar: str = ' ') -> str: ...
+ def count(self, x: str) -> int: ...
+ def encode(self, encoding: str = 'utf-8', errors: str = 'strict') -> bytes: ...
+ def endswith(self, suffix: Union[str, Tuple[str, ...]], start: int = None,
+ end: int = None) -> bool: ...
+ def expandtabs(self, tabsize: int = 8) -> str: ...
+ def find(self, sub: str, start: int = 0, end: int = 0) -> int: ...
+ def format(self, *args: Any, **kwargs: Any) -> str: ...
+ def format_map(self, map: Mapping[str, Any]) -> str: ...
+ def index(self, sub: str, start: int = 0, end: int = 0) -> int: ...
+ def isalnum(self) -> bool: ...
+ def isalpha(self) -> bool: ...
+ def isdecimal(self) -> bool: ...
+ def isdigit(self) -> bool: ...
+ def isidentifier(self) -> bool: ...
+ def islower(self) -> bool: ...
+ def isnumeric(self) -> bool: ...
+ def isprintable(self) -> bool: ...
+ def isspace(self) -> bool: ...
+ def istitle(self) -> bool: ...
+ def isupper(self) -> bool: ...
+ def join(self, iterable: Iterable[str]) -> str: ...
+ def ljust(self, width: int, fillchar: str = ' ') -> str: ...
+ def lower(self) -> str: ...
+ def lstrip(self, chars: str = None) -> str: ...
+ def partition(self, sep: str) -> Tuple[str, str, str]: ...
+ def replace(self, old: str, new: str, count: int = -1) -> str: ...
+ def rfind(self, sub: str, start: int = 0, end: int = 0) -> int: ...
+ def rindex(self, sub: str, start: int = 0, end: int = 0) -> int: ...
+ def rjust(self, width: int, fillchar: str = ' ') -> str: ...
+ def rpartition(self, sep: str) -> Tuple[str, str, str]: ...
+ def rsplit(self, sep: str = None, maxsplit: int = -1) -> List[str]: ...
+ def rstrip(self, chars: str = None) -> str: ...
+ def split(self, sep: str = None, maxsplit: int = -1) -> List[str]: ...
+ def splitlines(self, keepends: bool = ...) -> List[str]: ...
+ def startswith(self, prefix: Union[str, Tuple[str, ...]], start: int = None,
+ end: int = None) -> bool: ...
+ def strip(self, chars: str = None) -> str: ...
+ def swapcase(self) -> str: ...
+ def title(self) -> str: ...
+ def translate(self, table: Dict[int, Any]) -> str: ...
+ def upper(self) -> str: ...
+ def zfill(self, width: int) -> str: ...
+ @staticmethod
+ @overload
+ def maketrans(x: Union[Dict[int, Any], Dict[str, Any]]) -> Dict[int, Any]: ...
+ @staticmethod
+ @overload
+ def maketrans(x: str, y: str, z: str = ...) -> Dict[int, Any]: ...
+
+ def __getitem__(self, i: Union[int, slice]) -> str: ...
+ def __add__(self, s: str) -> str: ...
+ def __mul__(self, n: int) -> str: ...
+ def __rmul__(self, n: int) -> str: ...
+ def __mod__(self, *args: Any) -> str: ...
+ def __eq__(self, x: object) -> bool: ...
+ def __ne__(self, x: object) -> bool: ...
+ def __lt__(self, x: str) -> bool: ...
+ def __le__(self, x: str) -> bool: ...
+ def __gt__(self, x: str) -> bool: ...
+ def __ge__(self, x: str) -> bool: ...
+
+ def __len__(self) -> int: ...
+ def __contains__(self, s: object) -> bool: ...
+ def __iter__(self) -> Iterator[str]: ...
+ def __str__(self) -> str: return self
+ def __repr__(self) -> str: ...
+ def __int__(self) -> int: ...
+ def __float__(self) -> float: ...
+ def __hash__(self) -> int: ...
+
+class bytes(ByteString):
+ @overload
+ def __init__(self, ints: Iterable[int]) -> None: ...
+ @overload
+ def __init__(self, string: str, encoding: str,
+ errors: str = 'strict') -> None: ...
+ @overload
+ def __init__(self, length: int) -> None: ...
+ @overload
+ def __init__(self) -> None: ...
+ @overload
+ def __init__(self, o: SupportsBytes) -> None: ...
+ def capitalize(self) -> bytes: ...
+ def center(self, width: int, fillchar: bytes = ...) -> bytes: ...
+ def count(self, x: bytes) -> int: ...
+ def decode(self, encoding: str = 'utf-8', errors: str = 'strict') -> str: ...
+ def endswith(self, suffix: Union[bytes, Tuple[bytes, ...]]) -> bool: ...
+ def expandtabs(self, tabsize: int = 8) -> bytes: ...
+ def find(self, sub: bytes, start: int = 0, end: int = 0) -> int: ...
+ if sys.version_info >= (3, 5):
+ def hex(self) -> str: ...
+ def index(self, sub: bytes, start: int = 0, end: int = 0) -> int: ...
+ def isalnum(self) -> bool: ...
+ def isalpha(self) -> bool: ...
+ def isdigit(self) -> bool: ...
+ def islower(self) -> bool: ...
+ def isspace(self) -> bool: ...
+ def istitle(self) -> bool: ...
+ def isupper(self) -> bool: ...
+ def join(self, iterable: Iterable[bytes]) -> bytes: ...
+ def ljust(self, width: int, fillchar: bytes = ...) -> bytes: ...
+ def lower(self) -> bytes: ...
+ def lstrip(self, chars: bytes = None) -> bytes: ...
+ def partition(self, sep: bytes) -> Tuple[bytes, bytes, bytes]: ...
+ def replace(self, old: bytes, new: bytes, count: int = -1) -> bytes: ...
+ def rfind(self, sub: bytes, start: int = 0, end: int = 0) -> int: ...
+ def rindex(self, sub: bytes, start: int = 0, end: int = 0) -> int: ...
+ def rjust(self, width: int, fillchar: bytes = ...) -> bytes: ...
+ def rpartition(self, sep: bytes) -> Tuple[bytes, bytes, bytes]: ...
+ def rsplit(self, sep: bytes = None, maxsplit: int = -1) -> List[bytes]: ...
+ def rstrip(self, chars: bytes = None) -> bytes: ...
+ def split(self, sep: bytes = None, maxsplit: int = -1) -> List[bytes]: ...
+ def splitlines(self, keepends: bool = ...) -> List[bytes]: ...
+ def startswith(self, prefix: Union[bytes, Tuple[bytes, ...]]) -> bool: ...
+ def strip(self, chars: bytes = None) -> bytes: ...
+ def swapcase(self) -> bytes: ...
+ def title(self) -> bytes: ...
+ def translate(self, table: Optional[bytes], delete: bytes = ...) -> bytes: ...
+ def upper(self) -> bytes: ...
+ def zfill(self, width: int) -> bytes: ...
+ @classmethod
+ def fromhex(cls, s: str) -> bytes: ...
+ @classmethod
+ def maketrans(cls, frm: bytes, to: bytes) -> bytes: ...
+
+ def __len__(self) -> int: ...
+ def __iter__(self) -> Iterator[int]: ...
+ def __str__(self) -> str: ...
+ def __repr__(self) -> str: ...
+ def __int__(self) -> int: ...
+ def __float__(self) -> float: ...
+ def __hash__(self) -> int: ...
+ @overload
+ def __getitem__(self, i: int) -> int: ...
+ @overload
+ def __getitem__(self, s: slice) -> bytes: ...
+ def __add__(self, s: bytes) -> bytes: ...
+ def __mul__(self, n: int) -> bytes: ...
+ def __rmul__(self, n: int) -> bytes: ...
+ def __contains__(self, o: object) -> bool: ...
+ def __eq__(self, x: object) -> bool: ...
+ def __ne__(self, x: object) -> bool: ...
+ def __lt__(self, x: bytes) -> bool: ...
+ def __le__(self, x: bytes) -> bool: ...
+ def __gt__(self, x: bytes) -> bool: ...
+ def __ge__(self, x: bytes) -> bool: ...
+
+class bytearray(MutableSequence[int], ByteString):
+ @overload
+ def __init__(self, ints: Iterable[int]) -> None: ...
+ @overload
+ def __init__(self, string: str, encoding: str, errors: str = 'strict') -> None: ...
+ @overload
+ def __init__(self, length: int) -> None: ...
+ @overload
+ def __init__(self) -> None: ...
+ def capitalize(self) -> bytearray: ...
+ def center(self, width: int, fillchar: bytes = ...) -> bytearray: ...
+ def count(self, x: bytes) -> int: ...
+ def decode(self, encoding: str = 'utf-8', errors: str = 'strict') -> str: ...
+ def endswith(self, suffix: bytes) -> bool: ...
+ def expandtabs(self, tabsize: int = 8) -> bytearray: ...
+ def find(self, sub: bytes, start: int = 0, end: int = 0) -> int: ...
+ if sys.version_info >= (3, 5):
+ def hex(self) -> str: ...
+ def index(self, sub: bytes, start: int = 0, end: int = 0) -> int: ...
+ def insert(self, index: int, object: int) -> None: ...
+ def isalnum(self) -> bool: ...
+ def isalpha(self) -> bool: ...
+ def isdigit(self) -> bool: ...
+ def islower(self) -> bool: ...
+ def isspace(self) -> bool: ...
+ def istitle(self) -> bool: ...
+ def isupper(self) -> bool: ...
+ def join(self, iterable: Iterable[bytes]) -> bytearray: ...
+ def ljust(self, width: int, fillchar: bytes = ...) -> bytearray: ...
+ def lower(self) -> bytearray: ...
+ def lstrip(self, chars: bytes = None) -> bytearray: ...
+ def partition(self, sep: bytes) -> Tuple[bytearray, bytearray, bytearray]: ...
+ def replace(self, old: bytes, new: bytes, count: int = -1) -> bytearray: ...
+ def rfind(self, sub: bytes, start: int = 0, end: int = 0) -> int: ...
+ def rindex(self, sub: bytes, start: int = 0, end: int = 0) -> int: ...
+ def rjust(self, width: int, fillchar: bytes = ...) -> bytearray: ...
+ def rpartition(self, sep: bytes) -> Tuple[bytearray, bytearray, bytearray]: ...
+ def rsplit(self, sep: bytes = None, maxsplit: int = -1) -> List[bytearray]: ...
+ def rstrip(self, chars: bytes = None) -> bytearray: ...
+ def split(self, sep: bytes = None, maxsplit: int = -1) -> List[bytearray]: ...
+ def splitlines(self, keepends: bool = ...) -> List[bytearray]: ...
+ def startswith(self, prefix: bytes) -> bool: ...
+ def strip(self, chars: bytes = None) -> bytearray: ...
+ def swapcase(self) -> bytearray: ...
+ def title(self) -> bytearray: ...
+ def translate(self, table: Optional[bytes], delete: bytes = ...) -> bytearray: ...
+ def upper(self) -> bytearray: ...
+ def zfill(self, width: int) -> bytearray: ...
+ @classmethod
+ def fromhex(cls, s: str) -> bytearray: ...
+ @classmethod
+ def maketrans(cls, frm: bytes, to: bytes) -> bytes: ...
+
+ def __len__(self) -> int: ...
+ def __iter__(self) -> Iterator[int]: ...
+ def __str__(self) -> str: ...
+ def __repr__(self) -> str: ...
+ def __int__(self) -> int: ...
+ def __float__(self) -> float: ...
+ def __hash__(self) -> int: ...
+ @overload
+ def __getitem__(self, i: int) -> int: ...
+ @overload
+ def __getitem__(self, s: slice) -> bytearray: ...
+ @overload
+ def __setitem__(self, i: int, x: int) -> None: ...
+ @overload
+ def __setitem__(self, s: slice, x: Union[Iterable[int], bytes]) -> None: ...
+ def __delitem__(self, i: Union[int, slice]) -> None: ...
+ def __add__(self, s: bytes) -> bytearray: ...
+ def __iadd__(self, s: Iterable[int]) -> bytearray: ...
+ def __mul__(self, n: int) -> bytearray: ...
+ def __rmul__(self, n: int) -> bytearray: ...
+ def __imul__(self, n: int) -> bytearray: ...
+ def __contains__(self, o: object) -> bool: ...
+ def __eq__(self, x: object) -> bool: ...
+ def __ne__(self, x: object) -> bool: ...
+ def __lt__(self, x: bytes) -> bool: ...
+ def __le__(self, x: bytes) -> bool: ...
+ def __gt__(self, x: bytes) -> bool: ...
+ def __ge__(self, x: bytes) -> bool: ...
+
+
+class memoryview(Sized, Container[bytes]):
+ format = ... # type: str
+ itemsize = ... # type: int
+ shape = ... # type: Optional[Tuple[int, ...]]
+ strides = ... # type: Optional[Tuple[int, ...]]
+ suboffsets = ... # type: Optional[Tuple[int, ...]]
+ readonly = ... # type: bool
+ ndim = ... # type: int
+
+ def __init__(self, obj: Union[str, bytes, bytearray, memoryview]) -> None: ...
+
+ @overload
+ def __getitem__(self, i: int) -> int: ...
+ @overload
+ def __getitem__(self, s: slice) -> memoryview: ...
+
+ def __contains__(self, x: object) -> bool: ...
+ def __iter__(self) -> Iterator[bytes]: ...
+ def __len__(self) -> int: ...
+
+ @overload
+ def __setitem__(self, i: int, o: bytes) -> None: ...
+ @overload
+ def __setitem__(self, s: slice, o: Sequence[bytes]) -> None: ...
+ @overload
+ def __setitem__(self, s: slice, o: memoryview) -> None: ...
+
+ def tobytes(self) -> bytes: ...
+ def tolist(self) -> List[int]: ...
+
+ if sys.version_info >= (3, 5):
+ def hex(self) -> str: ...
+
+
+class bool(int, SupportsInt, SupportsFloat):
+ def __init__(self, o: object = ...) -> None: ...
+
+class slice:
+ start = 0
+ step = 0
+ stop = 0
+ def __init__(self, start: int, stop: int = 0, step: int = 0) -> None: ...
+
+class tuple(Sequence[_T_co], Generic[_T_co]):
+ def __init__(self, iterable: Iterable[_T_co] = ...) -> None: ...
+ def __len__(self) -> int: ...
+ def __contains__(self, x: object) -> bool: ...
+ @overload
+ def __getitem__(self, x: int) -> _T_co: ...
+ @overload
+ def __getitem__(self, x: slice) -> Tuple[_T_co, ...]: ...
+ def __iter__(self) -> Iterator[_T_co]: ...
+ def __lt__(self, x: Tuple[_T_co, ...]) -> bool: ...
+ def __le__(self, x: Tuple[_T_co, ...]) -> bool: ...
+ def __gt__(self, x: Tuple[_T_co, ...]) -> bool: ...
+ def __ge__(self, x: Tuple[_T_co, ...]) -> bool: ...
+ def __add__(self, x: Tuple[_T_co, ...]) -> Tuple[_T_co, ...]: ...
+ def __mul__(self, n: int) -> Tuple[_T_co, ...]: ...
+ def __rmul__(self, n: int) -> Tuple[_T_co, ...]: ...
+ def count(self, x: Any) -> int: ...
+ if sys.version_info >= (3, 5):
+ def index(self, x: Any, start: int = 0, end: int = 0) -> int: ...
+ else:
+ def index(self, x: Any) -> int: ...
+
+class function:
+ # TODO not defined in builtins!
+ __name__ = ... # type: str
+ __qualname__ = ... # type: str
+ __module__ = ... # type: str
+ __code__ = ... # type: Any
+
+class list(MutableSequence[_T], Generic[_T]):
+ @overload
+ def __init__(self) -> None: ...
+ @overload
+ def __init__(self, iterable: Iterable[_T]) -> None: ...
+ def clear(self) -> None: ...
+ def copy(self) -> List[_T]: ...
+ def append(self, object: _T) -> None: ...
+ def extend(self, iterable: Iterable[_T]) -> None: ...
+ def pop(self, index: int = -1) -> _T: ...
+ def index(self, object: _T, start: int = 0, stop: int = ...) -> int: ...
+ def count(self, object: _T) -> int: ...
+ def insert(self, index: int, object: _T) -> None: ...
+ def remove(self, object: _T) -> None: ...
+ def reverse(self) -> None: ...
+ def sort(self, *, key: Callable[[_T], Any] = None, reverse: bool = ...) -> None: ...
+
+ def __len__(self) -> int: ...
+ def __iter__(self) -> Iterator[_T]: ...
+ def __str__(self) -> str: ...
+ def __hash__(self) -> int: ...
+ @overload
+ def __getitem__(self, i: int) -> _T: ...
+ @overload
+ def __getitem__(self, s: slice) -> List[_T]: ...
+ @overload
+ def __setitem__(self, i: int, o: _T) -> None: ...
+ @overload
+ def __setitem__(self, s: slice, o: Iterable[_T]) -> None: ...
+ def __delitem__(self, i: Union[int, slice]) -> None: ...
+ def __add__(self, x: List[_T]) -> List[_T]: ...
+ def __iadd__(self, x: Iterable[_T]) -> List[_T]: ...
+ def __mul__(self, n: int) -> List[_T]: ...
+ def __rmul__(self, n: int) -> List[_T]: ...
+ def __imul__(self, n: int) -> List[_T]: ...
+ def __contains__(self, o: object) -> bool: ...
+ def __reversed__(self) -> Iterator[_T]: ...
+ def __gt__(self, x: List[_T]) -> bool: ...
+ def __ge__(self, x: List[_T]) -> bool: ...
+ def __lt__(self, x: List[_T]) -> bool: ...
+ def __le__(self, x: List[_T]) -> bool: ...
+
+class dict(MutableMapping[_KT, _VT], Generic[_KT, _VT]):
+ # NOTE: Keyword arguments are special. If they are used, _KT must include
+ # str, but we have no way of enforcing it here.
+ @overload
+ def __init__(self, **kwargs: _VT) -> None: ...
+ @overload
+ def __init__(self, map: Mapping[_KT, _VT], **kwargs: _VT) -> None: ...
+ @overload
+ def __init__(self, iterable: Iterable[Tuple[_KT, _VT]], **kwargs: _VT) -> None: ...
+ def clear(self) -> None: ...
+ def copy(self) -> Dict[_KT, _VT]: ...
+ def get(self, k: _KT, default: _VT = None) -> _VT: ...
+ def pop(self, k: _KT, default: _VT = None) -> _VT: ...
+ def popitem(self) -> Tuple[_KT, _VT]: ...
+ def setdefault(self, k: _KT, default: _VT = None) -> _VT: ...
+ @overload
+ def update(self, m: Mapping[_KT, _VT]) -> None: ...
+ @overload
+ def update(self, m: Iterable[Tuple[_KT, _VT]]) -> None: ...
+ def keys(self) -> KeysView[_KT]: ...
+ def values(self) -> ValuesView[_VT]: ...
+ def items(self) -> ItemsView[_KT, _VT]: ...
+ @staticmethod
+ @overload
+ def fromkeys(seq: Sequence[_T]) -> Dict[_T, Any]: ... # TODO: Actually a class method (mypy/issues#328)
+ @staticmethod
+ @overload
+ def fromkeys(seq: Sequence[_T], value: _S) -> Dict[_T, _S]: ...
+ def __len__(self) -> int: ...
+ def __getitem__(self, k: _KT) -> _VT: ...
+ def __setitem__(self, k: _KT, v: _VT) -> None: ...
+ def __delitem__(self, v: _KT) -> None: ...
+ def __contains__(self, o: object) -> bool: ...
+ def __iter__(self) -> Iterator[_KT]: ...
+ def __str__(self) -> str: ...
+
+class set(MutableSet[_T], Generic[_T]):
+ def __init__(self, iterable: Iterable[_T] = ...) -> None: ...
+ def add(self, element: _T) -> None: ...
+ def clear(self) -> None: ...
+ def copy(self) -> set[_T]: ...
+ def difference(self, *s: Iterable[Any]) -> set[_T]: ...
+ def difference_update(self, *s: Iterable[Any]) -> None: ...
+ def discard(self, element: _T) -> None: ...
+ def intersection(self, *s: Iterable[Any]) -> set[_T]: ...
+ def intersection_update(self, *s: Iterable[Any]) -> None: ...
+ def isdisjoint(self, s: Iterable[Any]) -> bool: ...
+ def issubset(self, s: Iterable[Any]) -> bool: ...
+ def issuperset(self, s: Iterable[Any]) -> bool: ...
+ def pop(self) -> _T: ...
+ def remove(self, element: _T) -> None: ...
+ def symmetric_difference(self, s: Iterable[_T]) -> set[_T]: ...
+ def symmetric_difference_update(self, s: Iterable[_T]) -> None: ...
+ def union(self, *s: Iterable[_T]) -> set[_T]: ...
+ def update(self, *s: Iterable[_T]) -> None: ...
+ def __len__(self) -> int: ...
+ def __contains__(self, o: object) -> bool: ...
+ def __iter__(self) -> Iterator[_T]: ...
+ def __str__(self) -> str: ...
+ def __and__(self, s: AbstractSet[Any]) -> set[_T]: ...
+ def __iand__(self, s: AbstractSet[Any]) -> set[_T]: ...
+ def __or__(self, s: AbstractSet[_S]) -> set[Union[_T, _S]]: ...
+ def __ior__(self, s: AbstractSet[_S]) -> set[Union[_T, _S]]: ...
+ def __sub__(self, s: AbstractSet[Any]) -> set[_T]: ...
+ def __isub__(self, s: AbstractSet[Any]) -> set[_T]: ...
+ def __xor__(self, s: AbstractSet[_S]) -> set[Union[_T, _S]]: ...
+ def __ixor__(self, s: AbstractSet[_S]) -> set[Union[_T, _S]]: ...
+ def __le__(self, s: AbstractSet[Any]) -> bool: ...
+ def __lt__(self, s: AbstractSet[Any]) -> bool: ...
+ def __ge__(self, s: AbstractSet[Any]) -> bool: ...
+ def __gt__(self, s: AbstractSet[Any]) -> bool: ...
+ # TODO more set operations
+
+class frozenset(FrozenSet[_T], Generic[_T]):
+ def __init__(self, iterable: Iterable[_T] = ...) -> None: ...
+ def copy(self) -> frozenset[_T]: ...
+ def difference(self, *s: Iterable[Any]) -> frozenset[_T]: ...
+ def intersection(self, *s: Iterable[Any]) -> frozenset[_T]: ...
+ def isdisjoint(self, s: Iterable[_T]) -> bool: ...
+ def issubset(self, s: Iterable[Any]) -> bool: ...
+ def issuperset(self, s: Iterable[Any]) -> bool: ...
+ def symmetric_difference(self, s: Iterable[_T]) -> frozenset[_T]: ...
+ def union(self, *s: Iterable[_T]) -> frozenset[_T]: ...
+ def __len__(self) -> int: ...
+ def __contains__(self, o: object) -> bool: ...
+ def __iter__(self) -> Iterator[_T]: ...
+ def __str__(self) -> str: ...
+ def __and__(self, s: AbstractSet[_T]) -> frozenset[_T]: ...
+ def __or__(self, s: AbstractSet[_S]) -> frozenset[Union[_T, _S]]: ...
+ def __sub__(self, s: AbstractSet[_T]) -> frozenset[_T]: ...
+ def __xor__(self, s: AbstractSet[_S]) -> frozenset[Union[_T, _S]]: ...
+ def __le__(self, s: AbstractSet[Any]) -> bool: ...
+ def __lt__(self, s: AbstractSet[Any]) -> bool: ...
+ def __ge__(self, s: AbstractSet[Any]) -> bool: ...
+ def __gt__(self, s: AbstractSet[Any]) -> bool: ...
+
+class enumerate(Iterator[Tuple[int, _T]], Generic[_T]):
+ def __init__(self, iterable: Iterable[_T], start: int = 0) -> None: ...
+ def __iter__(self) -> Iterator[Tuple[int, _T]]: ...
+ def __next__(self) -> Tuple[int, _T]: ...
+
+class range(Sequence[int]):
+ @overload
+ def __init__(self, stop: int) -> None: ...
+ @overload
+ def __init__(self, start: int, stop: int, step: int = 1) -> None: ...
+ def count(self, value: int) -> int: ...
+ def index(self, value: int, start: int = 0, stop: int = None) -> int: ...
+ def __len__(self) -> int: ...
+ def __contains__(self, o: object) -> bool: ...
+ def __iter__(self) -> Iterator[int]: ...
+ @overload
+ def __getitem__(self, i: int) -> int: ...
+ @overload
+ def __getitem__(self, s: slice) -> range: ...
+ def __repr__(self) -> str: ...
+ def __reversed__(self) -> Iterator[int]: ...
+
+class module:
+ # TODO not defined in builtins!
+ __name__ = ... # type: str
+ __file__ = ... # type: str
+ __dict__ = ... # type: Dict[str, Any]
+
+class property:
+ def __init__(self, fget: Callable[[Any], Any] = None,
+ fset: Callable[[Any, Any], None] = None,
+ fdel: Callable[[Any], None] = None, doc: str = None) -> None: ...
+ def getter(self, fget: Callable[[Any], Any]) -> property: ...
+ def setter(self, fset: Callable[[Any, Any], None]) -> property: ...
+ def deleter(self, fdel: Callable[[Any], None]) -> property: ...
+ def __get__(self, obj: Any, type: type=None) -> Any: ...
+ def __set__(self, obj: Any, value: Any) -> None: ...
+ def __delete__(self, obj: Any) -> None: ...
+
+NotImplemented = ... # type: Any
+
+def abs(n: SupportsAbs[_T]) -> _T: ...
+def all(i: Iterable) -> bool: ...
+def any(i: Iterable) -> bool: ...
+def ascii(o: object) -> str: ...
+def bin(number: int) -> str: ...
+def callable(o: object) -> bool: ...
+def chr(code: int) -> str: ...
+def compile(source: Any, filename: Union[str, bytes], mode: str, flags: int = 0,
+ dont_inherit: int = 0) -> Any: ...
+def copyright() -> None: ...
+def credits() -> None: ...
+def delattr(o: Any, name: str) -> None: ...
+def dir(o: object = ...) -> List[str]: ...
+_N = TypeVar('_N', int, float)
+def divmod(a: _N, b: _N) -> Tuple[_N, _N]: ...
+def eval(source: str, globals: Dict[str, Any] = None,
+ locals: Mapping[str, Any] = None) -> Any: ... # TODO code object as source
+def exec(object: str, globals: Dict[str, Any] = None,
+ locals: Mapping[str, Any] = None) -> Any: ... # TODO code object as source
+def exit(code: int = None) -> NoReturn: ...
+ at overload
+def filter(function: Callable[[_T], Any], iterable: Iterable[_T]) -> Iterator[_T]: ...
+ at overload
+def filter(function: None, iterable: Iterable[Optional[_T]]) -> Iterator[_T]: ...
+def format(o: object, format_spec: str = '') -> str: ...
+def getattr(o: Any, name: str, default: Any = ...) -> Any: ...
+def globals() -> Dict[str, Any]: ...
+def hasattr(o: Any, name: str) -> bool: ...
+def hash(o: object) -> int: ...
+def help(*args: Any, **kwds: Any) -> None: ...
+def hex(i: int) -> str: ... # TODO __index__
+def id(o: object) -> int: ...
+def input(prompt: str = None) -> str: ...
+ at overload
+def iter(iterable: Iterable[_T]) -> Iterator[_T]: ...
+ at overload
+def iter(function: Callable[[], _T], sentinel: _T) -> Iterator[_T]: ...
+def isinstance(o: object, t: Union[type, Tuple[type, ...]]) -> bool: ...
+def issubclass(cls: type, classinfo: Union[type, Tuple[type, ...]]) -> bool: ...
+def len(o: Sized) -> int: ...
+def license() -> None: ...
+def locals() -> Dict[str, Any]: ...
+ at overload
+def map(func: Callable[[_T1], _S], iter1: Iterable[_T1]) -> Iterator[_S]: ...
+ at overload
+def map(func: Callable[[_T1, _T2], _S], iter1: Iterable[_T1],
+ iter2: Iterable[_T2]) -> Iterator[_S]: ... # TODO more than two iterables
+ at overload
+def max(arg1: _T, arg2: _T, *args: _T, key: Callable[[_T], Any] = ...) -> _T: ...
+ at overload
+def max(iterable: Iterable[_T], key: Callable[[_T], Any] = ..., default: _T = ...) -> _T: ...
+ at overload
+def min(arg1: _T, arg2: _T, *args: _T, key: Callable[[_T], Any] = ...) -> _T: ...
+ at overload
+def min(iterable: Iterable[_T], key: Callable[[_T], Any] = ..., default: _T = ...) -> _T: ...
+ at overload
+def next(i: Iterator[_T]) -> _T: ...
+ at overload
+def next(i: Iterator[_T], default: _T) -> _T: ...
+def oct(i: int) -> str: ... # TODO __index__
+
+if sys.version_info >= (3, 6):
+ from pathlib import Path
+ def open(file: Union[str, bytes, int, Path], mode: str = 'r', buffering: int = -1, encoding: str = None,
+ errors: str = None, newline: str = None, closefd: bool = ...) -> IO[Any]: ...
+else:
+ def open(file: Union[str, bytes, int], mode: str = 'r', buffering: int = -1, encoding: str = None,
+ errors: str = None, newline: str = None, closefd: bool = ...) -> IO[Any]: ...
+
+def ord(c: Union[str, bytes, bytearray]) -> int: ...
+# TODO: in Python 3.2, print() does not support flush
+def print(*values: Any, sep: str = ' ', end: str = '\n', file: IO[str] = None, flush: bool = False) -> None: ...
+ at overload
+def pow(x: int, y: int) -> Any: ... # The return type can be int or float, depending on y
+ at overload
+def pow(x: int, y: int, z: int) -> Any: ...
+ at overload
+def pow(x: float, y: float) -> float: ...
+ at overload
+def pow(x: float, y: float, z: float) -> float: ...
+def quit(code: int = None) -> None: ...
+ at overload
+def reversed(object: Reversible[_T]) -> Iterator[_T]: ...
+ at overload
+def reversed(object: Sequence[_T]) -> Iterator[_T]: ...
+def repr(o: object) -> str: ...
+ at overload
+def round(number: float) -> int: ...
+ at overload
+def round(number: float, ndigits: int) -> float: ... # Always return a float if given ndigits.
+ at overload
+def round(number: SupportsRound[_T]) -> _T: ...
+ at overload
+def round(number: SupportsRound[_T], ndigits: int) -> _T: ...
+def setattr(object: Any, name: str, value: Any) -> None: ...
+def sorted(iterable: Iterable[_T], *, key: Callable[[_T], Any] = None,
+ reverse: bool = False) -> List[_T]: ...
+def sum(iterable: Iterable[_T], start: _T = ...) -> _T: ...
+def vars(object: Any = ...) -> Dict[str, Any]: ...
+ at overload
+def zip(iter1: Iterable[_T1]) -> Iterator[Tuple[_T1]]: ...
+ at overload
+def zip(iter1: Iterable[_T1], iter2: Iterable[_T2]) -> Iterator[Tuple[_T1, _T2]]: ...
+ at overload
+def zip(iter1: Iterable[_T1], iter2: Iterable[_T2],
+ iter3: Iterable[_T3]) -> Iterator[Tuple[_T1, _T2, _T3]]: ...
+ at overload
+def zip(iter1: Iterable[_T1], iter2: Iterable[_T2], iter3: Iterable[_T3],
+ iter4: Iterable[_T4]) -> Iterator[Tuple[_T1, _T2,
+ _T3, _T4]]: ... # TODO more than four iterables
+def __import__(name: str, globals: Dict[str, Any] = ..., locals: Dict[str, Any] = ...,
+ fromlist: List[str] = ..., level: int = -1) -> Any: ...
+
+# Ellipsis
+
+# Actually the type of Ellipsis is <type 'ellipsis'>, but since it's
+# not exposed anywhere under that name, we make it private here.
+class ellipsis: ...
+Ellipsis = ... # type: ellipsis
+
+# Exceptions
+
+class BaseException:
+ args = ... # type: Tuple[Any, ...]
+ __cause__ = ... # type: BaseException
+ __context__ = ... # type: BaseException
+ __traceback__ = ... # type: TracebackType
+ def __init__(self, *args: Any) -> None: ...
+ def with_traceback(self, tb: Any) -> BaseException: ...
+
+class GeneratorExit(BaseException): ...
+class KeyboardInterrupt(BaseException): ...
+class SystemExit(BaseException):
+ code = 0
+class Exception(BaseException): ...
+class ArithmeticError(Exception): ...
+class EnvironmentError(Exception):
+ errno = 0
+ strerror = ... # type: str
+ # TODO can this be bytes?
+ filename = ... # type: str
+class LookupError(Exception): ...
+class RuntimeError(Exception): ...
+class ValueError(Exception): ...
+class AssertionError(Exception): ...
+class AttributeError(Exception): ...
+class BufferError(Exception): ...
+class EOFError(Exception): ...
+class FloatingPointError(ArithmeticError): ...
+class IOError(EnvironmentError): ...
+class ImportError(Exception): ...
+class IndexError(LookupError): ...
+class KeyError(LookupError): ...
+class MemoryError(Exception): ...
+class NameError(Exception): ...
+class NotImplementedError(RuntimeError): ...
+class OSError(EnvironmentError): ...
+class BlockingIOError(OSError):
+ characters_written = 0
+class ChildProcessError(OSError): ...
+class ConnectionError(OSError): ...
+class BrokenPipeError(ConnectionError): ...
+class ConnectionAbortedError(ConnectionError): ...
+class ConnectionRefusedError(ConnectionError): ...
+class ConnectionResetError(ConnectionError): ...
+class FileExistsError(OSError): ...
+class FileNotFoundError(OSError): ...
+class InterruptedError(OSError): ...
+class IsADirectoryError(OSError): ...
+class NotADirectoryError(OSError): ...
+class PermissionError(OSError): ...
+class ProcessLookupError(OSError): ...
+class TimeoutError(OSError): ...
+class WindowsError(OSError):
+ winerror = ... # type: int
+class OverflowError(ArithmeticError): ...
+class ReferenceError(Exception): ...
+class StopIteration(Exception):
+ value = ... # type: Any
+if sys.version_info >= (3, 5):
+ class StopAsyncIteration(Exception):
+ value = ... # type: Any
+ class RecursionError(RuntimeError): ...
+class SyntaxError(Exception):
+ msg = ... # type: str
+ lineno = ... # type: int
+ offset = ... # type: int
+ text = ... # type: str
+class IndentationError(SyntaxError): ...
+class TabError(IndentationError): ...
+class SystemError(Exception): ...
+class TypeError(Exception): ...
+class UnboundLocalError(NameError): ...
+class UnicodeError(ValueError): ...
+class UnicodeDecodeError(UnicodeError):
+ encoding = ... # type: str
+ object = ... # type: bytes
+ start = ... # type: int
+ end = ... # type: int
+ reason = ... # type: str
+ def __init__(self, __encoding: str, __object: bytes, __start: int, __end: int,
+ __reason: str) -> None: ...
+class UnicodeEncodeError(UnicodeError):
+ encoding = ... # type: str
+ object = ... # type: str
+ start = ... # type: int
+ end = ... # type: int
+ reason = ... # type: str
+ def __init__(self, __encoding: str, __object: str, __start: int, __end: int,
+ __reason: str) -> None: ...
+class UnicodeTranslateError(UnicodeError): ...
+class ZeroDivisionError(ArithmeticError): ...
+
+class Warning(Exception): ...
+class UserWarning(Warning): ...
+class DeprecationWarning(Warning): ...
+class SyntaxWarning(Warning): ...
+class RuntimeWarning(Warning): ...
+class FutureWarning(Warning): ...
+class PendingDeprecationWarning(Warning): ...
+class ImportWarning(Warning): ...
+class UnicodeWarning(Warning): ...
+class BytesWarning(Warning): ...
+class ResourceWarning(Warning): ...
diff --git a/typeshed/stdlib/3/calendar.pyi b/typeshed/stdlib/3/calendar.pyi
new file mode 100644
index 0000000..80848fd
--- /dev/null
+++ b/typeshed/stdlib/3/calendar.pyi
@@ -0,0 +1,92 @@
+from typing import Any, Iterable, List, Optional, Tuple, Sequence
+import datetime
+
+LocaleType = Tuple[Optional[str], Optional[str]]
+
+class IllegalMonthError(ValueError):
+ def __init__(self, month: int) -> None: ...
+ def __str__(self) -> str: ...
+
+class IllegalWeekdayError(ValueError):
+ def __init__(self, weekday: int) -> None: ...
+ def __str__(self) -> str: ...
+
+def isleap(year: int) -> bool: ...
+def leapdays(y1: int, y2: int) -> int: ...
+def weekday(year: int, month: int, day: int) -> int: ...
+def monthrange(year: int, month: int) -> Tuple[int, int]: ...
+
+class Calendar(object):
+ def __init__(self, firstweekday: int = 0) -> None: ...
+ def getfirstweekday(self) -> int: ...
+ def setfirstweekday(self, firstweekday: int) -> None: ...
+ def iterweekdays(self) -> Iterable[int]: ...
+ def itermonthdates(self, year: int, month: int) -> Iterable[datetime.date]: ...
+ def itermonthdays2(self, year: int, month: int) -> Iterable[Tuple[int, int]]: ...
+ def itermonthdays(self, year: int, month: int) -> Iterable[int]: ...
+ def monthdatescalendar(self, year: int, month: int) -> List[List[datetime.date]]: ...
+ def monthdays2calendar(self, year: int, month: int) -> List[List[Tuple[int, int]]]: ...
+ def monthdayscalendar(self, year: int, month: int) -> List[List[int]]: ...
+ def yeardatescalendar(self, year: int, width: int = 3) -> List[List[int]]: ...
+ def yeardays2calendar(self, year: int, width: int = 3) -> List[List[Tuple[int, int]]]: ...
+ def yeardayscalendar(self, year: int, width: int = 3) -> List[List[int]]: ...
+
+class TextCalendar(Calendar):
+ def prweek(self, theweek: int, width: int) -> None: ...
+ def formatday(self, day: int, weekday: int, width: int) -> str: ...
+ def formatweek(self, theweek: int, width: int) -> str: ...
+ def formatweekday(self, day: int, width: int) -> str: ...
+ def formatweekheader(self, width: int) -> str: ...
+ def formatmonthname(self, theyear: int, themonth: int, width: int, withyear: bool = ...) -> str: ...
+ def prmonth(self, theyear: int, themonth: int, w: Any=0, l: Any = 0) -> None: ...
+ def formatmonth(self, theyear: int, themonth: int, w: int = 0, l: int = 0) -> str: ...
+ def formatyear(self, theyear: int, w: int = 2, l: int = 1, c: int = 6, m: int = 3) -> str: ...
+ def pryear(self, theyear: int, w: Any = 0, l: Any = 0, c: Any = 6, m: Any = 3) -> None: ...
+
+class HTMLCalendar(Calendar):
+ def formatday(self, day: int, weekday: int) -> str: ...
+ def formatweek(self, theweek: int) -> str: ...
+ def formatweekday(self, day: int) -> str: ...
+ def formatweekheader(self) -> str: ...
+ def formatmonthname(self, theyear: int, themonth: int, withyear: bool = ...) -> str: ...
+ def formatmonth(self, theyear: int, themonth: int, withyear: bool = ...) -> str: ...
+ def formatyear(self, theyear: int, width: int = 3) -> str: ...
+ def formatyearpage(self, theyear: int, width: int = 3, css: Optional[str] = 'calendar.css', encoding: Optional[str] = ...) -> str: ...
+
+class different_locale:
+ def __init__(self, locale: LocaleType) -> None: ...
+ def __enter__(self) -> LocaleType: ...
+ def __exit__(self, *args) -> None: ...
+
+class LocaleTextCalendar(TextCalendar):
+ def __init__(self, firstweekday: int = 0, locale: Optional[LocaleType] = ...) -> None: ...
+ def formatweekday(self, day: int, width: int) -> str: ...
+ def formatmonthname(self, theyear: int, themonth: int, width: int, withyear: bool = ...) -> str: ...
+
+class LocaleHTMLCalendar(HTMLCalendar):
+ def __init__(self, firstweekday: int = 0, locale: Optional[LocaleType] = ...) -> None: ...
+ def formatweekday(self, day: int) -> str: ...
+ def formatmonthname(self, theyear: int, themonth: int, withyear: bool = ...) -> str: ...
+
+c = ... # type: TextCalendar
+def setfirstweekday(firstweekday: int) -> None: ...
+def format(cols: int, colwidth: int = ..., spacing: int = ...) -> str: ...
+def formatstring(cols: int, colwidth: int = ..., spacing: int = ...) -> str: ...
+def timegm(tuple: Tuple[int, ...]) -> int: ...
+
+# Data attributes
+day_name = ... # type: Sequence[str]
+day_abbr = ... # type: Sequence[str]
+month_name = ... # type: Sequence[str]
+month_abbr = ... # type: Sequence[str]
+
+# Below constants are not in docs or __all__, but enough people have used them
+# they are now effectively public.
+
+MONDAY = ... # type: int
+TUESDAY = ... # type: int
+WEDNESDAY = ... # type: int
+THURSDAY = ... # type: int
+FRIDAY = ... # type: int
+SATURDAY = ... # type: int
+SUNDAY = ... # type: int
diff --git a/typeshed/stdlib/3/cgi.pyi b/typeshed/stdlib/3/cgi.pyi
new file mode 100644
index 0000000..16f5598
--- /dev/null
+++ b/typeshed/stdlib/3/cgi.pyi
@@ -0,0 +1,4 @@
+from typing import Dict, Tuple
+
+def escape(s: str, quote: bool = ...) -> str: ...
+def parse_header(s: str) -> Tuple[str, Dict[str, str]]: ...
diff --git a/typeshed/stdlib/3/codecs.pyi b/typeshed/stdlib/3/codecs.pyi
new file mode 100644
index 0000000..287b7de
--- /dev/null
+++ b/typeshed/stdlib/3/codecs.pyi
@@ -0,0 +1,194 @@
+# Better codecs stubs hand-written by o11c.
+# https://docs.python.org/3/library/codecs.html
+from typing import (
+ BinaryIO,
+ Callable,
+ Iterable,
+ Iterator,
+ List,
+ Tuple,
+ Union,
+)
+
+from abc import abstractmethod
+
+
+# TODO: this only satisfies the most common interface, where
+# bytes is the raw form and str is the cooked form.
+# In the long run, both should become template parameters maybe?
+# There *are* bytes->bytes and str->str encodings in the standard library.
+# Python 3.5 supposedly might change something there.
+
+_decoded = str
+_encoded = bytes
+
+# TODO: It is not possible to specify these signatures correctly, because
+# they have an optional positional or keyword argument for errors=.
+_encode_type = Callable[[_decoded], _encoded] # signature of Codec().encode
+_decode_type = Callable[[_encoded], _decoded] # signature of Codec().decode
+_stream_reader_type = Callable[[BinaryIO], 'StreamReader'] # signature of StreamReader __init__
+_stream_writer_type = Callable[[BinaryIO], 'StreamWriter'] # signature of StreamWriter __init__
+_incremental_encoder_type = Callable[[], 'IncrementalEncoder'] # signature of IncrementalEncoder __init__
+_incremental_decode_type = Callable[[], 'IncrementalDecoder'] # signature of IncrementalDecoder __init__
+
+
+def encode(obj: _decoded, encoding: str = ..., errors: str = ...) -> _encoded:
+ ...
+def decode(obj: _encoded, encoding: str = ..., errors: str = ...) -> _decoded:
+ ...
+
+def lookup(encoding: str) -> 'CodecInfo':
+ ...
+class CodecInfo(Tuple[_encode_type, _decode_type, _stream_reader_type, _stream_writer_type]):
+ def __init__(self, encode: _encode_type, decode: _decode_type, streamreader: _stream_reader_type = ..., streamwriter: _stream_writer_type = ..., incrementalencoder: _incremental_encoder_type = ..., incrementaldecoder: _incremental_decode_type = ..., name: str = ...) -> None:
+ self.encode = encode
+ self.decode = decode
+ self.streamreader = streamreader
+ self.streamwriter = streamwriter
+ self.incrementalencoder = incrementalencoder
+ self.incrementaldecoder = incrementaldecoder
+ self.name = name
+
+def getencoder(encoding: str) -> _encode_type:
+ ...
+def getdecoder(encoding: str) -> _encode_type:
+ ...
+def getincrementalencoder(encoding: str) -> _incremental_encoder_type:
+ ...
+def getincrementaldecoder(encoding: str) -> _incremental_encoder_type:
+ ...
+def getreader(encoding: str) -> _stream_reader_type:
+ ...
+def getwriter(encoding: str) -> _stream_writer_type:
+ ...
+
+def register(search_function: Callable[[str], CodecInfo]) -> None:
+ ...
+
+def open(filename: str, mode: str = ..., encoding: str = ..., errors: str = ..., buffering: int = ...) -> StreamReaderWriter:
+ ...
+
+def EncodedFile(file: BinaryIO, data_encoding: str, file_encoding: str = ..., errors: str = ...) -> 'StreamRecoder':
+ ...
+
+def iterencode(iterator: Iterable[_decoded], encoding: str, errors: str = ...) -> Iterator[_encoded]:
+ ...
+def iterdecode(iterator: Iterable[_encoded], encoding: str, errors: str = ...) -> Iterator[_decoded]:
+ ...
+
+BOM = b''
+BOM_BE = b''
+BOM_LE = b''
+BOM_UTF8 = b''
+BOM_UTF16 = b''
+BOM_UTF16_BE = b''
+BOM_UTF16_LE = b''
+BOM_UTF32 = b''
+BOM_UTF32_BE = b''
+BOM_UTF32_LE = b''
+
+# It is expected that different actions be taken depending on which of the
+# three subclasses of `UnicodeError` is actually ...ed. However, the Union
+# is still needed for at least one of the cases.
+def register_error(name: str, error_handler: Callable[[UnicodeError], Tuple[Union[str, bytes], int]]) -> None:
+ ...
+def lookup_error(name: str) -> Callable[[UnicodeError], Tuple[Union[str, bytes], int]]:
+ ...
+
+def strict_errors(exception: UnicodeError) -> Tuple[Union[str, bytes], int]:
+ ...
+def replace_errors(exception: UnicodeError) -> Tuple[Union[str, bytes], int]:
+ ...
+def ignore_errors(exception: UnicodeError) -> Tuple[Union[str, bytes], int]:
+ ...
+def xmlcharrefreplace_errors(exception: UnicodeError) -> Tuple[Union[str, bytes], int]:
+ ...
+def backslashreplace_errors(exception: UnicodeError) -> Tuple[Union[str, bytes], int]:
+ ...
+
+class Codec:
+ # These are sort of @abstractmethod but sort of not.
+ # The StreamReader and StreamWriter subclasses only implement one.
+ def encode(self, input: _decoded, errors: str = ...) -> Tuple[_encoded, int]:
+ ...
+ def decode(self, input: _encoded, errors: str = ...) -> Tuple[_decoded, int]:
+ ...
+
+class IncrementalEncoder:
+ def __init__(self, errors: str = ...) -> None:
+ self.errors = errors
+ @abstractmethod
+ def encode(self, object: _decoded, final: bool = ...) -> _encoded:
+ ...
+ def reset(self) -> None:
+ ...
+ # documentation says int but str is needed for the subclass.
+ def getstate(self) -> Union[int, _decoded]:
+ ...
+ def setstate(self, state: Union[int, _decoded]) -> None:
+ ...
+
+class IncrementalDecoder:
+ def __init__(self, errors: str = ...) -> None:
+ self.errors = errors
+ @abstractmethod
+ def decode(self, object: _encoded, final: bool = ...) -> _decoded:
+ ...
+ def reset(self) -> None:
+ ...
+ def getstate(self) -> Tuple[_encoded, int]:
+ ...
+ def setstate(self, state: Tuple[_encoded, int]) -> None:
+ ...
+
+# These are not documented but used in encodings/*.py implementations.
+class BufferedIncrementalEncoder(IncrementalEncoder):
+ def __init__(self, errors: str = ...) -> None:
+ IncrementalEncoder.__init__(self, errors)
+ self.buffer = ''
+ @abstractmethod
+ def _buffer_encode(self, input: _decoded, errors: str, final: bool) -> _encoded:
+ ...
+ def encode(self, input: _decoded, final: bool = ...) -> _encoded:
+ ...
+class BufferedIncrementalDecoder(IncrementalDecoder):
+ def __init__(self, errors: str = ...) -> None:
+ IncrementalDecoder.__init__(self, errors)
+ self.buffer = b''
+ @abstractmethod
+ def _buffer_decode(self, input: _encoded, errors: str, final: bool) -> Tuple[_decoded, int]:
+ ...
+ def decode(self, object: _encoded, final: bool = ...) -> _decoded:
+ ...
+
+# TODO: it is not possible to specify the requirement that all other
+# attributes and methods are passed-through from the stream.
+class StreamWriter(Codec):
+ def __init__(self, stream: BinaryIO, errors: str = ...) -> None:
+ self.errors = errors
+ def write(self, obj: _decoded) -> None:
+ ...
+ def writelines(self, list: List[str]) -> None:
+ ...
+ def reset(self) -> None:
+ ...
+
+class StreamReader(Codec):
+ def __init__(self, stream: BinaryIO, errors: str = ...) -> None:
+ self.errors = errors
+ def read(self, size: int = ..., chars: int = ..., firstline: bool = ...) -> _decoded:
+ ...
+ def readline(self, size: int = ..., keepends: bool = ...) -> _decoded:
+ ...
+ def readlines(self, sizehint: int = ..., keepends: bool = ...) -> List[_decoded]:
+ ...
+ def reset(self) -> None:
+ ...
+
+class StreamReaderWriter:
+ def __init__(self, stream: BinaryIO, Reader: _stream_reader_type, Writer: _stream_writer_type, errors: str = ...) -> None:
+ ...
+
+class StreamRecoder(BinaryIO):
+ def __init__(self, stream: BinaryIO, encode: _encode_type, decode: _decode_type, Reader: _stream_reader_type, Writer: _stream_writer_type, errors: str = ...) -> None:
+ ...
diff --git a/typeshed/stdlib/3/collections/__init__.pyi b/typeshed/stdlib/3/collections/__init__.pyi
new file mode 100644
index 0000000..00f463b
--- /dev/null
+++ b/typeshed/stdlib/3/collections/__init__.pyi
@@ -0,0 +1,178 @@
+# Stubs for collections
+
+# Based on http://docs.python.org/3.2/library/collections.html
+
+# TODO more abstract base classes (interfaces in mypy)
+
+# These are not exported.
+from typing import (
+ TypeVar, Generic, Dict, overload, List, Tuple,
+ Callable, Any, Type, Optional, Union
+)
+# These are exported.
+# TODO reexport more.
+from typing import (
+ Container as Container,
+ Hashable as Hashable,
+ Iterable as Iterable,
+ Iterator as Iterator,
+ Sized as Sized,
+ Generator as Generator,
+ ByteString as ByteString,
+ Awaitable as Awaitable,
+ Coroutine as Coroutine,
+ AsyncIterable as AsyncIterable,
+ AsyncIterator as AsyncIterator,
+ Reversible as Reversible,
+ Mapping as Mapping,
+ MappingView as MappingView,
+ ItemsView as ItemsView,
+ KeysView as KeysView,
+ ValuesView as ValuesView,
+ MutableMapping as MutableMapping,
+ Sequence as Sequence,
+ MutableSequence as MutableSequence,
+ MutableSet as MutableSet,
+ AbstractSet as Set,
+)
+
+_T = TypeVar('_T')
+_KT = TypeVar('_KT')
+_VT = TypeVar('_VT')
+
+
+# namedtuple is special-cased in the type checker; the initializer is ignored.
+def namedtuple(typename: str, field_names: Union[str, Iterable[Any]], *,
+ verbose: bool = ..., rename: bool = ..., module: str = None) -> Type[tuple]: ...
+
+class UserDict(MutableMapping): ...
+class UserList(MutableSequence): ...
+class UserString(Sequence): ...
+class MutableString(UserString, MutableSequence): ...
+
+# Technically, deque only derives from MutableSequence in 3.5.
+# But in practice it's not worth losing sleep over.
+class deque(MutableSequence[_T], Generic[_T]):
+ maxlen = ... # type: Optional[int] # TODO readonly
+ def __init__(self, iterable: Iterable[_T] = ...,
+ maxlen: int = ...) -> None: ...
+ def append(self, x: _T) -> None: ...
+ def appendleft(self, x: _T) -> None: ...
+ def insert(self, i: int, x: _T) -> None: ...
+ def clear(self) -> None: ...
+ def count(self, x: _T) -> int: ...
+ def extend(self, iterable: Iterable[_T]) -> None: ...
+ def extendleft(self, iterable: Iterable[_T]) -> None: ...
+ def pop(self, i: int = ...) -> _T: ...
+ def popleft(self) -> _T: ...
+ def remove(self, value: _T) -> None: ...
+ def reverse(self) -> None: ...
+ def rotate(self, n: int) -> None: ...
+
+ def __len__(self) -> int: ...
+ def __iter__(self) -> Iterator[_T]: ...
+ def __str__(self) -> str: ...
+ def __hash__(self) -> int: ...
+
+ # These methods of deque don't really take slices, but we need to
+ # define them as taking a slice to satisfy MutableSequence.
+ @overload
+ def __getitem__(self, index: int) -> _T: ...
+ @overload
+ def __getitem__(self, s: slice) -> Sequence[_T]: raise TypeError
+ @overload
+ def __setitem__(self, i: int, x: _T) -> None: ...
+ @overload
+ def __setitem__(self, s: slice, o: Iterable[_T]) -> None: raise TypeError
+ @overload
+ def __delitem__(self, i: int) -> None: ...
+ @overload
+ def __delitem__(self, s: slice) -> None: raise TypeError
+
+ def __contains__(self, o: object) -> bool: ...
+
+ # TODO __reversed__
+
+
+class Counter(Dict[_T, int], Generic[_T]):
+ @overload
+ def __init__(self) -> None: ...
+ @overload
+ def __init__(self, Mapping: Mapping[_T, int]) -> None: ...
+ @overload
+ def __init__(self, iterable: Iterable[_T]) -> None: ...
+ # TODO keyword arguments
+
+ def elements(self) -> Iterator[_T]: ...
+
+ @overload
+ def most_common(self) -> List[_T]: ...
+ @overload
+ def most_common(self, n: int) -> List[_T]: ...
+
+ @overload
+ def subtract(self, Mapping: Mapping[_T, int]) -> None: ...
+ @overload
+ def subtract(self, iterable: Iterable[_T]) -> None: ...
+
+ # The Iterable[Tuple[...]] argument type is not actually desirable
+ # (the tuples will be added as keys, breaking type safety) but
+ # it's included so that the signature is compatible with
+ # Dict.update. Not sure if we should use '# type: ignore' instead
+ # and omit the type from the union.
+ @overload
+ def update(self, m: Mapping[_T, int]) -> None: ...
+ @overload
+ def update(self, m: Union[Iterable[_T], Iterable[Tuple[_T, int]]]) -> None: ...
+
+ def __add__(self, other: Counter[_T]) -> Counter[_T]: ...
+ def __sub__(self, other: Counter[_T]) -> Counter[_T]: ...
+ def __and__(self, other: Counter[_T]) -> Counter[_T]: ...
+ def __or__(self, other: Counter[_T]) -> Counter[_T]: ...
+ def __pos__(self) -> Counter[_T]: ...
+ def __neg__(self) -> Counter[_T]: ...
+ def __iadd__(self, other: Counter[_T]) -> Counter[_T]: ...
+ def __isub__(self, other: Counter[_T]) -> Counter[_T]: ...
+ def __iand__(self, other: Counter[_T]) -> Counter[_T]: ...
+ def __ior__(self, other: Counter[_T]) -> Counter[_T]: ...
+
+class OrderedDict(Dict[_KT, _VT], Generic[_KT, _VT]):
+ def popitem(self, last: bool = ...) -> Tuple[_KT, _VT]: ...
+ def move_to_end(self, key: _KT, last: bool = ...) -> None: ...
+
+
+class defaultdict(Dict[_KT, _VT], Generic[_KT, _VT]):
+ default_factory = ... # type: Callable[[], _VT]
+
+ @overload
+ def __init__(self) -> None: ...
+ @overload
+ def __init__(self, map: Mapping[_KT, _VT]) -> None: ...
+ @overload
+ def __init__(self, iterable: Iterable[Tuple[_KT, _VT]]) -> None: ...
+ @overload
+ def __init__(self, default_factory: Callable[[], _VT]) -> None: ...
+ @overload
+ def __init__(self, default_factory: Callable[[], _VT],
+ map: Mapping[_KT, _VT]) -> None: ...
+ @overload
+ def __init__(self, default_factory: Callable[[], _VT],
+ iterable: Iterable[Tuple[_KT, _VT]]) -> None: ...
+ # TODO __init__ keyword args
+
+ def __missing__(self, key: _KT) -> _VT: ...
+ # TODO __reversed__
+
+class ChainMap(Dict[_KT, _VT], Generic[_KT, _VT]):
+ @overload
+ def __init__(self) -> None: ...
+ @overload
+ def __init__(self, *maps: Mapping[_KT, _VT]) -> None: ...
+
+ @property
+ def maps(self) -> List[Mapping[_KT, _VT]]: ...
+
+ def new_child(self, m: Mapping[_KT, _VT] = ...) -> ChainMap[_KT, _VT]: ...
+
+ @property
+ def parents(self) -> ChainMap[_KT, _VT]: ...
diff --git a/typeshed/stdlib/3/collections/abc.pyi b/typeshed/stdlib/3/collections/abc.pyi
new file mode 100644
index 0000000..f7d3ae4
--- /dev/null
+++ b/typeshed/stdlib/3/collections/abc.pyi
@@ -0,0 +1,38 @@
+# Stubs for collections.abc (introduced from Python 3.3)
+#
+# https://docs.python.org/3.3/whatsnew/3.3.html#collections
+import sys
+
+if sys.version_info >= (3, 3):
+ from . import (
+ Container as Container,
+ Hashable as Hashable,
+ Iterable as Iterable,
+ Iterator as Iterator,
+ Sized as Sized,
+ Mapping as Mapping,
+ MutableMapping as MutableMapping,
+ Sequence as Sequence,
+ MutableSequence as MutableSequence,
+ Set as Set,
+ MutableSet as MutableSet,
+ MappingView as MappingView,
+ ItemsView as ItemsView,
+ KeysView as KeysView,
+ ValuesView as ValuesView,
+ )
+
+if sys.version_info >= (3, 5):
+ from . import (
+ Generator as Generator,
+ ByteString as ByteString,
+ Awaitable as Awaitable,
+ Coroutine as Coroutine,
+ AsyncIterable as AsyncIterable,
+ AsyncIterator as AsyncIterator,
+ )
+
+if sys.version_info >= (3, 6):
+ from . import (
+ Reversible as Reversible,
+ )
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/3/concurrent/__init__.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/3/concurrent/__init__.pyi
diff --git a/typeshed/stdlib/3/concurrent/futures/__init__.pyi b/typeshed/stdlib/3/concurrent/futures/__init__.pyi
new file mode 100644
index 0000000..4439dca
--- /dev/null
+++ b/typeshed/stdlib/3/concurrent/futures/__init__.pyi
@@ -0,0 +1,3 @@
+from ._base import * # noqa: F403
+from .thread import * # noqa: F403
+from .process import * # noqa: F403
diff --git a/typeshed/stdlib/3/concurrent/futures/_base.pyi b/typeshed/stdlib/3/concurrent/futures/_base.pyi
new file mode 100644
index 0000000..27c2711
--- /dev/null
+++ b/typeshed/stdlib/3/concurrent/futures/_base.pyi
@@ -0,0 +1,44 @@
+from typing import TypeVar, Generic, Any, Iterable, Iterator, Callable, Tuple, Optional, Set
+from collections import namedtuple
+
+FIRST_COMPLETED = ... # type: Any
+FIRST_EXCEPTION = ... # type: Any
+ALL_COMPLETED = ... # type: Any
+PENDING = ... # type: Any
+RUNNING = ... # type: Any
+CANCELLED = ... # type: Any
+CANCELLED_AND_NOTIFIED = ... # type: Any
+FINISHED = ... # type: Any
+LOGGER = ... # type: Any
+
+class Error(Exception): ...
+class CancelledError(Error): ...
+class TimeoutError(Error): ...
+
+DoneAndNotDoneFutures = namedtuple('DoneAndNotDoneFutures', 'done not_done')
+
+_T = TypeVar('_T')
+
+class Future(Generic[_T]):
+ def __init__(self) -> None: ...
+ def cancel(self) -> bool: ...
+ def cancelled(self) -> bool: ...
+ def running(self) -> bool: ...
+ def done(self) -> bool: ...
+ def add_done_callback(self, fn: Callable[[Future], Any]) -> None: ...
+ def result(self, timeout: Optional[float] = ...) -> _T: ...
+ def exception(self, timeout: Optional[float] = ...) -> Exception: ...
+ def set_running_or_notify_cancel(self) -> None: ...
+ def set_result(self, result: _T) -> None: ...
+ def set_exception(self, exception: Exception) -> None: ...
+
+class Executor:
+ def submit(self, fn: Callable[..., _T], *args: Any, **kwargs: Any) -> Future[_T]: ...
+ def map(self, func: Callable[..., _T], *iterables: Any, timeout: Optional[float] = ..., chunksize: int = ...) -> Iterable[_T]: ...
+ def shutdown(self, wait: bool = ...) -> None: ...
+ def __enter__(self) -> Executor: ...
+ def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> bool: ...
+
+def as_completed(fs: Iterable[Future], timeout: Optional[float] = ...) -> Iterator[Future]: ...
+
+def wait(fs: Iterable[Future], timeout: Optional[float] = ..., return_when: str = ...) -> Tuple[Set[Future], Set[Future]]: ...
diff --git a/typeshed/stdlib/3/concurrent/futures/process.pyi b/typeshed/stdlib/3/concurrent/futures/process.pyi
new file mode 100644
index 0000000..b157d2b
--- /dev/null
+++ b/typeshed/stdlib/3/concurrent/futures/process.pyi
@@ -0,0 +1,14 @@
+from typing import Any, Callable, TypeVar, Iterable, Optional
+from ._base import Future, Executor
+
+EXTRA_QUEUED_CALLS = ... # type: Any
+
+class BrokenProcessPool(RuntimeError): ...
+
+_T = TypeVar('_T')
+
+class ProcessPoolExecutor(Executor):
+ def __init__(self, max_workers: Optional[int] = ...) -> None: ...
+ def submit(self, fn: Callable[..., _T], *args: Any, **kwargs: Any) -> Future[_T]: ...
+ def map(self, func: Callable[..., _T], *iterables: Any, timeout: Optional[float] = ..., chunksize: int = ...) -> Iterable[_T]: ...
+ def shutdown(self, wait: bool = ...) -> None: ...
diff --git a/typeshed/stdlib/3/concurrent/futures/thread.pyi b/typeshed/stdlib/3/concurrent/futures/thread.pyi
new file mode 100644
index 0000000..e366d4d
--- /dev/null
+++ b/typeshed/stdlib/3/concurrent/futures/thread.pyi
@@ -0,0 +1,10 @@
+from typing import Any, TypeVar, Callable, Iterable, Optional
+from ._base import Executor, Future
+
+_T = TypeVar('_T')
+
+class ThreadPoolExecutor(Executor):
+ def __init__(self, max_workers: Optional[int] = ...) -> None: ...
+ def submit(self, fn: Callable[..., _T], *args: Any, **kwargs: Any) -> Future[_T]: ...
+ def map(self, func: Callable[..., _T], *iterables: Any, timeout: Optional[float] = ..., chunksize: int = ...) -> Iterable[_T]: ...
+ def shutdown(self, wait: bool = ...) -> None: ...
diff --git a/typeshed/stdlib/3/configparser.pyi b/typeshed/stdlib/3/configparser.pyi
new file mode 100644
index 0000000..22a42a1
--- /dev/null
+++ b/typeshed/stdlib/3/configparser.pyi
@@ -0,0 +1,188 @@
+# Stubs for configparser
+
+# Based on http://docs.python.org/3.5/library/configparser.html and on
+# reading configparser.py.
+
+from typing import (MutableMapping, Mapping, Dict, Sequence, List, Union,
+ Iterable, Iterator, Callable, Any, IO, overload, Optional)
+# Types only used in type comments only
+from typing import Optional, Tuple # noqa
+
+# Internal type aliases
+_section = Dict[str, str]
+_parser = MutableMapping[str, _section]
+_converters = Dict[str, Callable[[str], Any]]
+
+
+DEFAULTSECT = ... # type: str
+
+
+class Interpolation:
+ def before_get(self, parser: _parser,
+ section: str,
+ option: str,
+ value: str,
+ defaults: _section) -> str: ...
+
+ def before_set(self, parser: _parser,
+ section: str,
+ option: str,
+ value: str) -> str: ...
+
+ def before_read(self, parser: _parser,
+ section: str,
+ option: str,
+ value: str) -> str: ...
+
+ def before_write(self, parser: _parser,
+ section: str,
+ option: str,
+ value: str) -> str: ...
+
+
+class BasicInterpolation(Interpolation):
+ pass
+
+
+class ExtendedInterpolation(Interpolation):
+ pass
+
+
+class RawConfigParser(_parser):
+ def __init__(self,
+ defaults: _section = None,
+ dict_type: Mapping[str, str] = ...,
+ allow_no_value: bool = ...,
+ *,
+ delimiters: Sequence[str] = ...,
+ comment_prefixes: Sequence[str] = ...,
+ inline_comment_prefixes: Sequence[str] = None,
+ strict: bool = ...,
+ empty_lines_in_values: bool = ...,
+ default_section: str = ...,
+ interpolation: Interpolation = None) -> None: ...
+
+ def __len__(self) -> int: ...
+
+ def __getitem__(self, section: str) -> _section: ...
+
+ def __setitem__(self, section: str, options: _section) -> None: ...
+
+ def __delitem__(self, section: str) -> None: ...
+
+ def __iter__(self) -> Iterator[str]: ...
+
+ def defaults(self) -> _section: ...
+
+ def sections(self) -> List[str]: ...
+
+ def add_section(self, section: str) -> None: ...
+
+ def has_section(self, section: str) -> bool: ...
+
+ def options(self, section: str) -> List[str]: ...
+
+ def has_option(self, section: str, option: str) -> bool: ...
+
+ def read(self, filenames: Union[str, Sequence[str]],
+ encoding: str = None) -> List[str]: ...
+
+ def read_file(self, f: Iterable[str], source: str = None) -> None: ...
+
+ def read_string(self, string: str, source: str = ...) -> None: ...
+
+ def read_dict(self, dictionary: Mapping[str, Mapping[str, Any]],
+ source: str = ...) -> None: ...
+
+ def getint(self, section: str, option: str, *, raw: bool = ..., vars: _section = ..., fallback: int = ...) -> int: ...
+
+ def getfloat(self, section: str, option: str, *, raw: bool = ..., vars: _section = ..., fallback: float = ...) -> float: ...
+
+ def getboolean(self, section: str, option: str, *, raw: bool = ..., vars: _section = ..., fallback: bool = ...) -> bool: ...
+
+ # This is incompatible with MutableMapping so we ignore the type
+ def get(self, section: str, option: str, *, raw: bool = ..., vars: _section = ..., fallback: str = ...) -> str: # type: ignore
+ ...
+
+ # This is incompatible with Mapping so we ignore the type.
+ def items(self, section: str = ..., raw: bool = ..., vars: _section = ...) -> Iterable[Tuple[str, _section]]: ... # type: ignore
+
+ def set(self, section: str, option: str, value: str) -> None: ...
+
+ def write(self,
+ fileobject: IO[str],
+ space_around_delimiters: bool = True) -> None: ...
+
+ def remove_option(self, section: str, option: str) -> bool: ...
+
+ def remove_section(self, section: str) -> bool: ...
+
+ def optionxform(self, option: str) -> str: ...
+
+
+class ConfigParser(RawConfigParser):
+ def __init__(self,
+ defaults: _section = None,
+ dict_type: Mapping[str, str] = ...,
+ allow_no_value: bool = ...,
+ delimiters: Sequence[str] = ...,
+ comment_prefixes: Sequence[str] = ...,
+ inline_comment_prefixes: Sequence[str] = None,
+ strict: bool = ...,
+ empty_lines_in_values: bool = ...,
+ default_section: str = ...,
+ interpolation: Interpolation = None,
+ converters: _converters = ...) -> None: ...
+
+
+class Error(Exception):
+ pass
+
+
+class NoSectionError(Error):
+ pass
+
+
+class DuplicateSectionError(Error):
+ section = ... # type: str
+ source = ... # type: Optional[str]
+ lineno = ... # type: Optional[int]
+
+
+class DuplicateOptionError(Error):
+ section = ... # type: str
+ option = ... # type: str
+ source = ... # type: Optional[str]
+ lineno = ... # type: Optional[int]
+
+
+class NoOptionError(Error):
+ section = ... # type: str
+ option = ... # type: str
+
+
+class InterpolationError(Error):
+ section = ... # type: str
+ option = ... # type: str
+
+
+class InterpolationDepthError(InterpolationError):
+ pass
+
+
+class InterpolationMissingOptionError(InterpolationError):
+ reference = ... # type: str
+
+
+class InterpolationSyntaxError(InterpolationError):
+ pass
+
+
+class ParsingError:
+ source = ... # type: str
+ errors = ... # type: Sequence[Tuple[int, str]]
+
+
+class MissingSectionHeaderError(ParsingError):
+ lineno = ... # type: int
+ line = ... # type: str
diff --git a/typeshed/stdlib/3/copy.pyi b/typeshed/stdlib/3/copy.pyi
new file mode 100644
index 0000000..0661cb7
--- /dev/null
+++ b/typeshed/stdlib/3/copy.pyi
@@ -0,0 +1,10 @@
+# Stubs for copy
+
+# NOTE: These are incomplete!
+
+from typing import TypeVar, Dict, Any
+
+_T = TypeVar('_T')
+
+def deepcopy(x: _T, memo: Dict[Any, Any] = ...) -> _T: ...
+def copy(x: _T) -> _T: ...
diff --git a/typeshed/stdlib/3/csv.pyi b/typeshed/stdlib/3/csv.pyi
new file mode 100644
index 0000000..7b41cc8
--- /dev/null
+++ b/typeshed/stdlib/3/csv.pyi
@@ -0,0 +1,77 @@
+# Stubs for csv (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Iterable
+
+QUOTE_ALL = ... # type: int
+QUOTE_MINIMAL = ... # type: int
+QUOTE_NONE = ... # type: int
+QUOTE_NONNUMERIC = ... # type: int
+
+class Error(Exception): ...
+
+def writer(csvfile, dialect=..., **fmtparams): ...
+def reader(csvfile, dialect=..., **fmtparams): ...
+def register_dialect(name, dialect=..., **fmtparams): ...
+def unregister_dialect(name): ...
+def get_dialect(name): ...
+def list_dialects(): ...
+def field_size_limit(new_limit=...): ...
+
+class Dialect:
+ delimiter = ... # type: Any
+ quotechar = ... # type: Any
+ escapechar = ... # type: Any
+ doublequote = ... # type: Any
+ skipinitialspace = ... # type: Any
+ lineterminator = ... # type: Any
+ quoting = ... # type: Any
+ def __init__(self) -> None: ...
+
+class excel(Dialect):
+ delimiter = ... # type: Any
+ quotechar = ... # type: Any
+ doublequote = ... # type: Any
+ skipinitialspace = ... # type: Any
+ lineterminator = ... # type: Any
+ quoting = ... # type: Any
+
+class excel_tab(excel):
+ delimiter = ... # type: Any
+
+class unix_dialect(Dialect):
+ delimiter = ... # type: Any
+ quotechar = ... # type: Any
+ doublequote = ... # type: Any
+ skipinitialspace = ... # type: Any
+ lineterminator = ... # type: Any
+ quoting = ... # type: Any
+
+class DictReader(Iterable):
+ restkey = ... # type: Any
+ restval = ... # type: Any
+ reader = ... # type: Any
+ dialect = ... # type: Any
+ line_num = ... # type: Any
+ fieldnames = ... # type: Any # Actually a property
+ def __init__(self, f, fieldnames=..., restkey=..., restval=..., dialect=...,
+ *args, **kwds): ...
+ def __iter__(self): ...
+ def __next__(self): ...
+
+class DictWriter:
+ fieldnames = ... # type: Any
+ restval = ... # type: Any
+ extrasaction = ... # type: Any
+ writer = ... # type: Any
+ def __init__(self, f, fieldnames, restval=..., extrasaction=..., dialect=..., *args, **kwds) -> None: ...
+ def writeheader(self): ...
+ def writerow(self, rowdict): ...
+ def writerows(self, rowdicts): ...
+
+class Sniffer:
+ preferred = ... # type: Any
+ def __init__(self) -> None: ...
+ def sniff(self, sample, delimiters=...): ...
+ def has_header(self, sample): ...
diff --git a/typeshed/stdlib/3/curses/__init__.pyi b/typeshed/stdlib/3/curses/__init__.pyi
new file mode 100644
index 0000000..63a4bd9
--- /dev/null
+++ b/typeshed/stdlib/3/curses/__init__.pyi
@@ -0,0 +1,12 @@
+# Stubs for curses (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from _curses import * # noqa: F403
+# Stubgen imports a python version of has_key only if it's not present
+# in _curses (which it is in this stub)
+# from .has_key import has_key as has_key
+
+def initscr(): ...
+def start_color(): ...
+def wrapper(func, *args, **kwds): ...
diff --git a/typeshed/stdlib/3/datetime.pyi b/typeshed/stdlib/3/datetime.pyi
new file mode 100644
index 0000000..7925226
--- /dev/null
+++ b/typeshed/stdlib/3/datetime.pyi
@@ -0,0 +1,223 @@
+# Stubs for datetime
+
+# NOTE: These are incomplete!
+
+from typing import Optional, SupportsAbs, Tuple, overload
+
+MINYEAR = 0
+MAXYEAR = 0
+
+TimeTuple = Tuple[int, int, int, int, int, int, int, int, int]
+
+class tzinfo:
+ def tzname(self, dt: Optional[datetime]) -> str: ...
+ def utcoffset(self, dt: Optional[datetime]) -> Optional[timedelta]: ...
+ def dst(self, dt: Optional[datetime]) -> Optional[timedelta]: ...
+ def fromutc(self, dt: datetime) -> datetime: ...
+
+class timezone(tzinfo):
+ utc = ... # type: timezone
+ min = ... # type: timezone
+ max = ... # type: timezone
+
+ def __init__(self, offset: timedelta, name: str = ...) -> None: ...
+ def __hash__(self) -> int: ...
+
+_tzinfo = tzinfo
+_timezone = timezone
+
+class date:
+ min = ... # type: date
+ max = ... # type: date
+ resolution = ... # type: timedelta
+
+ def __init__(self, year: int, month: int = ..., day: int = ...) -> None: ...
+
+ @classmethod
+ def fromtimestamp(cls, t: float) -> date: ...
+ @classmethod
+ def today(cls) -> date: ...
+ @classmethod
+ def fromordinal(cls, n: int) -> date: ...
+
+ @property
+ def year(self) -> int: ...
+ @property
+ def month(self) -> int: ...
+ @property
+ def day(self) -> int: ...
+
+ def ctime(self) -> str: ...
+ def strftime(self, fmt: str) -> str: ...
+ def __format__(self, fmt: str) -> str: ...
+ def isoformat(self) -> str: ...
+ def timetuple(self) -> tuple: ... # TODO return type
+ def toordinal(self) -> int: ...
+ def replace(self, year: int = ..., month: int = ..., day: int = ...) -> date: ...
+ def __le__(self, other: date) -> bool: ...
+ def __lt__(self, other: date) -> bool: ...
+ def __ge__(self, other: date) -> bool: ...
+ def __gt__(self, other: date) -> bool: ...
+ def __add__(self, other: timedelta) -> date: ...
+ @overload
+ def __sub__(self, other: timedelta) -> date: ...
+ @overload
+ def __sub__(self, other: date) -> timedelta: ...
+ def __hash__(self) -> int: ...
+ def weekday(self) -> int: ...
+ def isoweekday(self) -> int: ...
+ def isocalendar(self) -> Tuple[int, int, int]: ...
+
+class time:
+ min = ... # type: time
+ max = ... # type: time
+ resolution = ... # type: timedelta
+
+ def __init__(self, hour: int = ..., minute: int = ..., second: int = ..., microsecond: int = ...,
+ tzinfo: Optional[tzinfo] = ...) -> None: ...
+
+ @property
+ def hour(self) -> int: ...
+ @property
+ def minute(self) -> int: ...
+ @property
+ def second(self) -> int: ...
+ @property
+ def microsecond(self) -> int: ...
+ @property
+ def tzinfo(self) -> Optional[_tzinfo]: ...
+
+ def __le__(self, other: time) -> bool: ...
+ def __lt__(self, other: time) -> bool: ...
+ def __ge__(self, other: time) -> bool: ...
+ def __gt__(self, other: time) -> bool: ...
+ def __hash__(self) -> int: ...
+ def isoformat(self) -> str: ...
+ def strftime(self, fmt: str) -> str: ...
+ def __format__(self, fmt: str) -> str: ...
+ def utcoffset(self) -> Optional[timedelta]: ...
+ def tzname(self) -> Optional[str]: ...
+ def dst(self) -> Optional[int]: ...
+ def replace(self, hour: int = ..., minute: int = ..., second: int = ...,
+ microsecond: int = ..., tzinfo: Optional[_tzinfo] = None) -> time: ...
+
+_date = date
+_time = time
+
+class timedelta(SupportsAbs[timedelta]):
+ min = ... # type: timedelta
+ max = ... # type: timedelta
+ resolution = ... # type: timedelta
+
+ def __init__(self, days: float = ..., seconds: float = ..., microseconds: float = ...,
+ milliseconds: float = ..., minutes: float = ..., hours: float = ...,
+ weeks: float = ...) -> None: ...
+
+ @property
+ def days(self) -> int: ...
+ @property
+ def seconds(self) -> int: ...
+ @property
+ def microseconds(self) -> int: ...
+
+ def total_seconds(self) -> float: ...
+ def __add__(self, other: timedelta) -> timedelta: ...
+ def __radd__(self, other: timedelta) -> timedelta: ...
+ def __sub__(self, other: timedelta) -> timedelta: ...
+ def __rsub(self, other: timedelta) -> timedelta: ...
+ def __neg__(self) -> timedelta: ...
+ def __pos__(self) -> timedelta: ...
+ def __abs__(self) -> timedelta: ...
+ def __mul__(self, other: float) -> timedelta: ...
+ def __rmul__(self, other: float) -> timedelta: ...
+ @overload
+ def __floordiv__(self, other: timedelta) -> int: ...
+ @overload
+ def __floordiv__(self, other: int) -> timedelta: ...
+ @overload
+ def __truediv__(self, other: timedelta) -> float: ...
+ @overload
+ def __truediv__(self, other: float) -> timedelta: ...
+ def __mod__(self, other: timedelta) -> timedelta: ...
+ def __divmod__(self, other: timedelta) -> Tuple[int, timedelta]: ...
+ def __le__(self, other: timedelta) -> bool: ...
+ def __lt__(self, other: timedelta) -> bool: ...
+ def __ge__(self, other: timedelta) -> bool: ...
+ def __gt__(self, other: timedelta) -> bool: ...
+ def __hash__(self) -> int: ...
+
+
+class datetime:
+ # TODO: Is a subclass of date, but this would make some types incompatible.
+ min = ... # type: datetime
+ max = ... # type: datetime
+ resolution = ... # type: timedelta
+
+ def __init__(self, year: int, month: int = ..., day: int = ..., hour: int = ...,
+ minute: int = ..., second: int = ..., microsecond: int = ...,
+ tzinfo: Optional[tzinfo] = ...) -> None: ...
+
+ @property
+ def year(self) -> int: ...
+ @property
+ def month(self) -> int: ...
+ @property
+ def day(self) -> int: ...
+ @property
+ def hour(self) -> int: ...
+ @property
+ def minute(self) -> int: ...
+ @property
+ def second(self) -> int: ...
+ @property
+ def microsecond(self) -> int: ...
+ @property
+ def tzinfo(self) -> Optional[_tzinfo]: ...
+
+ @classmethod
+ def fromtimestamp(cls, t: float, tz: Optional[_tzinfo] = ...) -> datetime: ...
+ @classmethod
+ def utcfromtimestamp(cls, t: float) -> datetime: ...
+ @classmethod
+ def today(cls) -> datetime: ...
+ @classmethod
+ def fromordinal(cls, n: int) -> datetime: ...
+ @classmethod
+ def now(cls, tz: Optional[_tzinfo] = ...) -> datetime: ...
+ @classmethod
+ def utcnow(cls) -> datetime: ...
+ @classmethod
+ def combine(cls, date: date, time: time) -> datetime: ...
+ def strftime(self, fmt: str) -> str: ...
+ def __format__(self, fmt: str) -> str: ...
+ def toordinal(self) -> int: ...
+ def timetuple(self) -> TimeTuple: ... # TODO return type
+ def timestamp(self) -> float: ...
+ def utctimetuple(self) -> TimeTuple: ... # TODO return type
+ def date(self) -> _date: ...
+ def time(self) -> _time: ...
+ def timetz(self) -> _time: ...
+ def replace(self, year: int = ..., month: int = ..., day: int = ..., hour: int = ...,
+ minute: int = ..., second: int = ..., microsecond: int = ..., tzinfo:
+ Optional[_tzinfo] = None) -> datetime: ...
+ def astimezone(self, tz: Optional[_tzinfo] = ...) -> datetime: ...
+ def ctime(self) -> str: ...
+ def isoformat(self, sep: str = ...) -> str: ...
+ @classmethod
+ def strptime(cls, date_string: str, format: str) -> datetime: ...
+ def utcoffset(self) -> Optional[timedelta]: ...
+ def tzname(self) -> Optional[str]: ...
+ def dst(self) -> Optional[int]: ...
+ def __le__(self, other: datetime) -> bool: ...
+ def __lt__(self, other: datetime) -> bool: ...
+ def __ge__(self, other: datetime) -> bool: ...
+ def __gt__(self, other: datetime) -> bool: ...
+ def __add__(self, other: timedelta) -> datetime: ...
+ @overload
+ def __sub__(self, other: datetime) -> timedelta: ...
+ @overload
+ def __sub__(self, other: timedelta) -> datetime: ...
+ def __hash__(self) -> int: ...
+ def weekday(self) -> int: ...
+ def isoweekday(self) -> int: ...
+ def isocalendar(self) -> Tuple[int, int, int]: ...
diff --git a/typeshed/stdlib/3/decimal.pyi b/typeshed/stdlib/3/decimal.pyi
new file mode 100644
index 0000000..5106e46
--- /dev/null
+++ b/typeshed/stdlib/3/decimal.pyi
@@ -0,0 +1,256 @@
+# Stubs for decimal (Python 3.4)
+
+from typing import (
+ Any, Union, SupportsInt, SupportsFloat, SupportsAbs, SupportsRound, Sequence,
+ Tuple, NamedTuple, Dict
+)
+
+_Decimal = Union[Decimal, int]
+_ComparableNum = Union[Decimal, int, float]
+
+BasicContext = ... # type: Context
+DefaultContext = ... # type: Context
+ExtendedContext = ... # type: Context
+HAVE_THREADS = ... # type: bool
+MAX_EMAX = ... # type: int
+MAX_PREC = ... # type: int
+MIN_EMIN = ... # type: int
+MIN_ETINY = ... # type: int
+ROUND_05UP = ... # type: str
+ROUND_CEILING = ... # type: str
+ROUND_DOWN = ... # type: str
+ROUND_FLOOR = ... # type: str
+ROUND_HALF_DOWN = ... # type: str
+ROUND_HALF_EVEN = ... # type: str
+ROUND_HALF_UP = ... # type: str
+ROUND_UP = ... # type: str
+
+def getcontext() -> Context: ...
+def localcontext(ctx: Context = ...) -> _ContextManager: ...
+def setcontext(c: Context) -> None: ...
+
+DecimalTuple = NamedTuple('DecimalTuple',
+ [('sign', int),
+ ('digits', Sequence[int]), # TODO: Use Tuple[int, ...]
+ ('exponent', int)])
+
+class _ContextManager:
+ def __enter__(self) -> Context: ...
+ def __exit__(self, t, v, tb) -> None: ...
+
+class Context:
+ Emax = ... # type: int
+ Emin = ... # type: int
+ capitals = ... # type: int
+ clamp = ... # type: int
+ prec = ... # type: int
+ rounding = ... # type: str
+ traps = ... # type: Dict[type, bool]
+ def __init__(self, prec: int = ..., rounding: str = ..., Emin: int = ..., Emax: int = ...,
+ capitals: int = ..., clamp: int = ..., flags=..., traps=...,
+ _ignored_flags=...) -> None: ...
+ def Etiny(self): ...
+ def Etop(self): ...
+ def abs(self, x: _Decimal) -> Decimal: ...
+ def add(self, x: _Decimal, y: _Decimal) -> Decimal: ...
+ def canonical(self, x): ...
+ def clear_flags(self): ...
+ def clear_traps(self): ...
+ def compare(self, x, y): ...
+ def compare_signal(self, x, y): ...
+ def compare_total(self, x, y): ...
+ def compare_total_mag(self, x, y): ...
+ def copy(self): ...
+ def copy_abs(self, x): ...
+ def copy_decimal(self, x): ...
+ def copy_negate(self, x): ...
+ def copy_sign(self, x, y): ...
+ def create_decimal(self, x): ...
+ def create_decimal_from_float(self, f): ...
+ def divide(self, x, y): ...
+ def divide_int(self, x, y): ...
+ def divmod(self, x, y): ...
+ def exp(self, x): ...
+ def fma(self, x, y, z): ...
+ def is_canonical(self, x): ...
+ def is_finite(self, x): ...
+ def is_infinite(self, x): ...
+ def is_nan(self, x): ...
+ def is_normal(self, x): ...
+ def is_qnan(self, x): ...
+ def is_signed(self, x): ...
+ def is_snan(self): ...
+ def is_subnormal(self, x): ...
+ def is_zero(self, x): ...
+ def ln(self, x): ...
+ def log10(self, x): ...
+ def logb(self, x): ...
+ def logical_and(self, x, y): ...
+ def logical_invert(self, x): ...
+ def logical_or(self, x, y): ...
+ def logical_xor(self, x, y): ...
+ def max(self, x, y): ...
+ def max_mag(self, x, y): ...
+ def min(self, x, y): ...
+ def min_mag(self, x, y): ...
+ def minus(self, x): ...
+ def multiply(self, x, y): ...
+ def next_minus(self, x): ...
+ def next_plus(self, x): ...
+ def next_toward(self, x): ...
+ def normalize(self, x): ...
+ def number_class(self, x): ...
+ def plus(self, x): ...
+ def power(self, x, y): ...
+ def quantize(self, x, y): ...
+ def radix(self): ...
+ def remainder(self, x, y): ...
+ def remainder_near(self, x, y): ...
+ def rotate(self, x, y): ...
+ def same_quantum(self, x, y): ...
+ def scaleb(self, x, y): ...
+ def shift(self, x, y): ...
+ def sqrt(self, x): ...
+ def subtract(self, x, y): ...
+ def to_eng_string(self, x): ...
+ def to_integral(self, x): ...
+ def to_integral_exact(self, x): ...
+ def to_integral_value(self, x): ...
+ def to_sci_string(self, x): ...
+ def __copy__(self) -> Context: ...
+ def __delattr__(self, name): ...
+ def __reduce__(self): ...
+
+class ConversionSyntax(InvalidOperation): ...
+
+class Decimal(SupportsInt, SupportsFloat, SupportsAbs[Decimal], SupportsRound[int]):
+ # TODO: SupportsCeil, SupportsFloor, SupportsTrunc?
+
+ def __init__(cls, value: Union[_Decimal, float, str,
+ Tuple[int, Sequence[int], int]] = ...,
+ context: Context = ...) -> None: ...
+
+ @property
+ def imag(self) -> Decimal: ...
+ @property
+ def real(self) -> Decimal: ...
+
+ def adjusted(self) -> int: ...
+ def as_tuple(self) -> DecimalTuple: ...
+ def canonical(self) -> Decimal: ...
+ def compare(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+ def compare_signal(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+ def compare_total(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+ def compare_total_mag(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+ def conjugate(self) -> Decimal: ...
+ def copy_abs(self) -> Decimal: ...
+ def copy_negate(self) -> Decimal: ...
+ def copy_sign(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+ def exp(self, context: Context = ...) -> Decimal: ...
+ def fma(self, other: _Decimal, third: _Decimal, context: Context = ...) -> Decimal: ...
+ @classmethod
+ def from_float(cls, f: float) -> Decimal: ...
+ def is_canonical(self) -> bool: ...
+ def is_finite(self) -> bool: ...
+ def is_infinite(self) -> bool: ...
+ def is_nan(self) -> bool: ...
+ def is_normal(self, context: Context = ...) -> bool: ...
+ def is_qnan(self) -> bool: ...
+ def is_signed(self) -> bool: ...
+ def is_snan(self) -> bool: ...
+ def is_subnormal(self, context: Context = ...) -> bool: ...
+ def is_zero(self) -> bool: ...
+ def ln(self, context: Context = ...) -> Decimal: ...
+ def log10(self, context: Context = ...) -> Decimal: ...
+ def logb(self, context: Context = ...) -> Decimal: ...
+ def logical_and(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+ def logical_invert(self, context: Context = ...) -> Decimal: ...
+ def logical_or(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+ def logical_xor(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+ def max(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+ def max_mag(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+ def min(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+ def min_mag(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+ def next_minus(self, context: Context = ...) -> Decimal: ...
+ def next_plus(self, context: Context = ...) -> Decimal: ...
+ def next_toward(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+ def normalize(self, context: Context = ...) -> Decimal: ...
+ def number_class(self, context: Context = ...) -> str: ...
+ def quantize(self, exp: _Decimal, rounding: str = ...,
+ context: Context = ...) -> Decimal: ...
+ def radix(self) -> Decimal: ...
+ def remainder_near(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+ def rotate(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+ def same_quantum(self, other: _Decimal, context: Context = ...) -> bool: ...
+ def scaleb(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+ def shift(self, other: _Decimal, context: Context = ...) -> Decimal: ...
+ def sqrt(self, context: Context = ...) -> Decimal: ...
+ def to_eng_string(self, context: Context = ...) -> str: ...
+ def to_integral(self, rounding: str = ..., context: Context = ...) -> Decimal: ...
+ def to_integral_exact(self, rounding: str = ..., context: Context = ...) -> Decimal: ...
+ def to_integral_value(self, rounding: str = ..., context: Context = ...) -> Decimal: ...
+ def __abs__(self) -> Decimal: ...
+ def __add__(self, other: _Decimal) -> Decimal: ...
+ def __bool__(self) -> bool: ...
+ def __ceil__(self) -> int: ...
+ def __complex__(self) -> complex: ...
+ def __copy__(self) -> Decimal: ...
+ def __deepcopy__(self) -> Decimal: ...
+ def __divmod__(self, other: _Decimal) -> Tuple[Decimal, Decimal]: ...
+ def __eq__(self, other: object) -> bool: ...
+ def __float__(self) -> float: ...
+ def __floor__(self) -> int: ...
+ def __floordiv__(self, other: _Decimal) -> Decimal: ...
+ def __format__(self, specifier, context=..., _localeconv=...) -> str: ...
+ def __ge__(self, other: _ComparableNum) -> bool: ...
+ def __gt__(self, other: _ComparableNum) -> bool: ...
+ def __hash__(self) -> int: ...
+ def __int__(self) -> int: ...
+ def __le__(self, other: _ComparableNum) -> bool: ...
+ def __lt__(self, other: _ComparableNum) -> bool: ...
+ def __mod__(self, other: _Decimal) -> Decimal: ...
+ def __mul__(self, other: _Decimal) -> Decimal: ...
+ def __ne__(self, other: object) -> bool: ...
+ def __neg__(self) -> Decimal: ...
+ def __pos__(self) -> Decimal: ...
+ def __pow__(self, other: _Decimal) -> Decimal: ...
+ def __radd__(self, other: int) -> Decimal: ...
+ def __rdivmod__(self, other: int) -> Tuple[Decimal, Decimal]: ...
+ def __reduce__(self): ...
+ def __rfloordiv__(self, other: int) -> Decimal: ...
+ def __rmod__(self, other: int) -> Decimal: ...
+ def __rmul__(self, other: int) -> Decimal: ...
+ def __round__(self, n=...) -> int: ...
+ def __rpow__(self, other: int) -> Decimal: ...
+ def __rsub__(self, other: int) -> Decimal: ...
+ def __rtruediv__(self, other: int) -> Decimal: ...
+ def __sizeof__(self) -> int: ...
+ def __sub__(self, other: _Decimal) -> Decimal: ...
+ def __truediv__(self, other: _Decimal) -> Decimal: ...
+ def __trunc__(self) -> int: ...
+
+class DecimalException(ArithmeticError): ...
+
+class Clamped(DecimalException): ...
+
+class DivisionByZero(DecimalException, ZeroDivisionError): ...
+
+class DivisionImpossible(InvalidOperation): ...
+
+class DivisionUndefined(InvalidOperation, ZeroDivisionError): ...
+
+class FloatOperation(DecimalException, TypeError): ...
+
+class Inexact(DecimalException): ...
+
+class InvalidContext(InvalidOperation): ...
+
+class InvalidOperation(DecimalException): ...
+
+class Overflow(Inexact, Rounded): ...
+
+class Rounded(DecimalException): ...
+
+class Subnormal(DecimalException): ...
+
+class Underflow(Inexact, Rounded, Subnormal): ...
diff --git a/typeshed/stdlib/3/difflib.pyi b/typeshed/stdlib/3/difflib.pyi
new file mode 100644
index 0000000..eaf068e
--- /dev/null
+++ b/typeshed/stdlib/3/difflib.pyi
@@ -0,0 +1,62 @@
+# Stubs for difflib
+
+# Based on https://docs.python.org/3.2/library/difflib.html
+
+from typing import (
+ TypeVar, Callable, Iterable, Iterator, List, NamedTuple, Sequence, Tuple,
+ Generic, Optional
+)
+
+_T = TypeVar('_T')
+
+class SequenceMatcher(Generic[_T]):
+ def __init__(self, isjunk: Optional[Callable[[_T], bool]] = ...,
+ a: Sequence[_T] = ..., b: Sequence[_T] = ...,
+ autojunk: bool = ...) -> None: ...
+ def set_seqs(self, a: Sequence[_T], b: Sequence[_T]) -> None: ...
+ def set_seq1(self, a: Sequence[_T]) -> None: ...
+ def set_seq2(self, b: Sequence[_T]) -> None: ...
+ def find_longest_match(self, alo: int, ahi: int, blo: int,
+ bhi: int) -> Tuple[int, int, int]: ...
+ def get_matching_blocks(self) -> List[Tuple[int, int, int]]: ...
+ def get_opcodes(self) -> List[Tuple[str, int, int, int, int]]: ...
+ def get_grouped_opcodes(self, n: int = ...
+ ) -> Iterable[Tuple[str, int, int, int, int]]: ...
+ def ratio(self) -> float: ...
+ def quick_ratio(self) -> float: ...
+ def real_quick_ratio(self) -> float: ...
+
+def get_close_matches(word: Sequence[_T], possibilities: List[Sequence[_T]],
+ n: int = ..., cutoff: float = ...) -> List[Sequence[_T]]: ...
+
+class Differ:
+ def __init__(self, linejunk: Callable[[str], bool] = ...,
+ charjunk: Callable[[str], bool] = ...) -> None: ...
+ def compare(self, a: Sequence[str], b: Sequence[str]) -> Iterator[str]: ...
+
+def IS_LINE_JUNK(str) -> bool: ...
+def IS_CHARACTER_JUNK(str) -> bool: ...
+def unified_diff(a: Sequence[str], b: Sequence[str], fromfile: str = ...,
+ tofile: str = ..., fromfiledate: str = ..., tofiledate: str = ...,
+ n: int = ..., lineterm: str = ...) -> Iterator[str]: ...
+def context_diff(a: Sequence[str], b: Sequence[str], fromfile: str=...,
+ tofile: str = ..., fromfiledate: str = ..., tofiledate: str = ...,
+ n: int = ..., lineterm: str = ...) -> Iterator[str]: ...
+def ndiff(a: Sequence[str], b: Sequence[str],
+ linejunk: Callable[[str], bool] = ...,
+ charjunk: Callable[[str], bool] = ...
+ ) -> Iterator[str]: ...
+
+class HtmlDiff(object):
+ def __init__(self, tabsize: int = ..., wrapcolumn: int = ...,
+ linejunk: Callable[[str], bool] = ...,
+ charjunk: Callable[[str], bool] = ...
+ ) -> None: ...
+ def make_file(self, fromlines: Sequence[str], tolines: Sequence[str],
+ fromdesc: str = ..., todesc: str = ..., context: bool = ...,
+ numlines: int = ...) -> str: ...
+ def make_table(self, fromlines: Sequence[str], tolines: Sequence[str],
+ fromdesc: str = ..., todesc: str = ..., context: bool = ...,
+ numlines: int = ...) -> str: ...
+
+def restore(delta: Iterable[str], which: int) -> Iterator[int]: ...
diff --git a/typeshed/stdlib/3/dis.pyi b/typeshed/stdlib/3/dis.pyi
new file mode 100644
index 0000000..c26afc1
--- /dev/null
+++ b/typeshed/stdlib/3/dis.pyi
@@ -0,0 +1,63 @@
+from typing import List, Union, Iterator, Tuple, Optional, Any, IO, NamedTuple
+
+from opcode import (hasconst, hasname, hasjrel, hasjabs, haslocal, hascompare,
+ hasfree, hasnargs, cmp_op, opname, opmap, HAVE_ARGUMENT,
+ EXTENDED_ARG, stack_effect)
+
+import types
+
+_have_code = Union[types.MethodType, types.FunctionType, types.CodeType, type]
+_have_code_or_string = Union[_have_code, str, bytes]
+
+
+Instruction = NamedTuple(
+ "Instruction",
+ [
+ ('opname', str),
+ ('opcode', int),
+ ('arg', Optional[int]),
+ ('argval', Any),
+ ('argrepr', str),
+ ('offset', int),
+ ('starts_line', Optional[int]),
+ ('is_jump_target', bool)
+ ]
+)
+
+
+# if sys.version_info >= (3, 4):
+class Bytecode:
+ codeobj = ... # type: types.CodeType
+ first_line = ... # type: int
+ def __init__(self, x: _have_code_or_string, *, first_line: int=...,
+ current_offset: int=...) -> None: ...
+ def __iter__(self) -> Iterator[Instruction]: ...
+ def __repr__(self) -> str: ...
+ def info(self) -> str: ...
+ def dis(self) -> str: ...
+
+ @classmethod
+ def from_traceback(cls, tb: types.TracebackType) -> Bytecode: ...
+
+
+COMPILER_FLAG_NAMES = ... # type: Dict[int, str]
+
+
+def pretty_flags(flags: int) -> str: ...
+def findlabels(code: _have_code) -> List[int]: ...
+def findlinestarts(code: _have_code) -> Iterator[Tuple[int, int]]: ...
+
+# Signature changes are not allowed by mypy
+# 'All conditional function variants must have identical signatures'
+# TODO: mypy issue #698
+
+# if sys.version_info >= (3, 2):
+def code_info(x: _have_code_or_string) -> str: ...
+
+# `file` parameter requires sys.version_info >= (3, 4):
+def dis(x: _have_code_or_string = ..., *, file: IO[str] = None) -> None: ...
+def distb(tb: types.TracebackType = ..., *, file: IO[str] = None) -> None: ...
+def disassemble(co: _have_code, lasti: int = ..., *, file: IO[str] = None) -> None: ...
+def show_code(co: _have_code, *, file: IO[str] = None) -> None: ...
+
+def get_instructions(x: _have_code, *, first_line: int = ...) -> Iterator[Instruction]: ...
diff --git a/typeshed/stdlib/3/doctest.pyi b/typeshed/stdlib/3/doctest.pyi
new file mode 100644
index 0000000..5cbdc1f
--- /dev/null
+++ b/typeshed/stdlib/3/doctest.pyi
@@ -0,0 +1,9 @@
+# Stubs for doctest
+
+# NOTE: These are incomplete!
+
+from typing import Any, Tuple
+
+# TODO arguments missing
+def testmod(module: Any = ..., *, name: str = ..., globs: Any = ...,
+ verbose: bool = ...) -> Tuple[int, int]: ...
diff --git a/typeshed/stdlib/3/email/__init__.pyi b/typeshed/stdlib/3/email/__init__.pyi
new file mode 100644
index 0000000..d42a901
--- /dev/null
+++ b/typeshed/stdlib/3/email/__init__.pyi
@@ -0,0 +1,46 @@
+# Stubs for email (Python 3.4)
+
+from typing import Callable, Optional, IO
+import sys
+from email.message import Message
+if sys.version_info >= (3, 3):
+ from email.policy import Policy
+
+if sys.version_info >= (3, 3):
+ def message_from_string(s: str, _class: Callable[[], Message] = ..., *,
+ policy: Policy = ...) -> Message: ...
+ def message_from_bytes(s: bytes, _class: Callable[[], Message] = ..., *,
+ policy: Policy = ...) -> Message: ...
+ def message_from_file(fp: IO[str], _class: Callable[[], Message] = ..., *,
+ policy: Policy = ...) -> Message: ...
+ def message_from_binary_file(fp: IO[bytes],
+ _class: Callable[[], Message] = ..., *,
+ policy: Policy = ...) -> Message: ...
+elif sys.version_info >= (3, 2):
+ def message_from_string(s: str,
+ _class: Callable[[], Message] = ..., *,
+ strict: Optional[bool] = ...) -> Message: ...
+ def message_from_bytes(s: bytes,
+ _class: Callable[[], Message] = ..., *,
+ strict: Optional[bool] = ...) -> Message: ...
+ def message_from_file(fp: IO[str],
+ _class: Callable[[], Message] = ..., *,
+ strict: Optional[bool] = ...) -> Message: ...
+ def message_from_binary_file(fp: IO[bytes],
+ _class: Callable[[], Message] = ..., *,
+ strict: Optional[bool] = ...) -> Message: ...
+
+# Names in __all__ with no definition:
+# base64mime
+# charset
+# encoders
+# errors
+# feedparser
+# generator
+# header
+# iterators
+# message
+# mime
+# parser
+# quoprimime
+# utils
diff --git a/typeshed/stdlib/3/email/charset.pyi b/typeshed/stdlib/3/email/charset.pyi
new file mode 100644
index 0000000..5c674e4
--- /dev/null
+++ b/typeshed/stdlib/3/email/charset.pyi
@@ -0,0 +1,27 @@
+# Stubs for email.charset (Python 3.4)
+
+from typing import List, Optional, Iterator, Any
+
+class Charset:
+ input_charset = ... # type: str
+ header_encoding = ... # type: int
+ body_encoding = ... # type: int
+ output_charset = ... # type: Optional[str]
+ input_codec = ... # type: Optional[str]
+ output_codec = ... # type: Optional[str]
+ def __init__(self, input_charset: str = ...) -> None: ...
+ def get_body_encoding(self) -> str: ...
+ def get_output_charset(self) -> Optional[str]: ...
+ def header_encode(self, string: str) -> str: ...
+ def header_encode_lines(self, string: str,
+ maxlengths: Iterator[int]) -> List[str]: ...
+ def body_encode(self, string: str) -> str: ...
+ def __str__(self) -> str: ...
+ def __eq__(self, other: Any) -> bool: ...
+ def __ne__(self, other: Any) -> bool: ...
+
+def add_charset(charset: Charset, header_enc: Optional[int] = ...,
+ body_enc: Optional[int] = ...,
+ output_charset: Optional[str] = ...) -> None: ...
+def add_alias(alias: str, canonical: str) -> None: ...
+def add_codec(charset: str, codecname: str) -> None: ...
diff --git a/typeshed/stdlib/3/email/contentmanager.pyi b/typeshed/stdlib/3/email/contentmanager.pyi
new file mode 100644
index 0000000..6f37fba
--- /dev/null
+++ b/typeshed/stdlib/3/email/contentmanager.pyi
@@ -0,0 +1,22 @@
+# Stubs for email.contentmanager (Python 3.4)
+
+from typing import Any, Callable
+import sys
+import email.message
+from email.message import Message
+
+if sys.version_info >= (3, 4):
+
+ EmailMessage = email.message.EmailMessage
+ MIMEPart = email.message.MIMEPart
+
+ class ContentManager:
+ def __init__(self) -> None: ...
+ def get_content(self, msg: Message, *args: Any, **kw: Any) -> Any: ...
+ def set_content(self, msg: Message, obj: Any, *args: Any,
+ **kw: Any) -> Any: ...
+ def add_get_handler(self, key: str, handler: Callable[..., Any]) -> None: ...
+ def add_set_handler(self, typekey: type,
+ handler: Callable[..., Any]) -> None: ...
+
+ raw_data_manager = ... # type: ContentManager
diff --git a/typeshed/stdlib/3/email/encoders.pyi b/typeshed/stdlib/3/email/encoders.pyi
new file mode 100644
index 0000000..bb5c84c
--- /dev/null
+++ b/typeshed/stdlib/3/email/encoders.pyi
@@ -0,0 +1,8 @@
+# Stubs for email.encoders (Python 3.4)
+
+from email.message import Message
+
+def encode_base64(msg: Message) -> None: ...
+def encode_quopri(msg: Message) -> None: ...
+def encode_7or8bit(msg: Message) -> None: ...
+def encode_noop(msg: Message) -> None: ...
diff --git a/typeshed/stdlib/3/email/errors.pyi b/typeshed/stdlib/3/email/errors.pyi
new file mode 100644
index 0000000..b51d7d3
--- /dev/null
+++ b/typeshed/stdlib/3/email/errors.pyi
@@ -0,0 +1,22 @@
+# Stubs for email.errors (Python 3.4)
+
+import sys
+
+class MessageError(Exception): ...
+class MessageParseError(MessageError): ...
+class HeaderParseError(MessageParseError): ...
+class BoundaryError(MessageParseError): ...
+class MultipartConversionError(MessageError, TypeError): ...
+
+class MessageDefect(ValueError): ...
+class NoBoundaryInMultipartDefect(MessageDefect): ...
+class StartBoundaryNotFoundDefect(MessageDefect): ...
+class FirstHeaderLineIsContinuationDefect(MessageDefect): ...
+class MisplacedEnvelopeHeaderDefect(MessageDefect): ...
+class MalformedHeaderDefect(MessageDefect): ...
+class MultipartInvariantViolationDefect(MessageDefect): ...
+class InvalidBase64PaddingDefect(MessageDefect): ...
+class InvalidBase64CharactersDefect(MessageDefect): ...
+if sys.version_info >= (3, 3):
+ class CloseBoundaryNotFoundDefect(MessageDefect): ...
+ class MissingHeaderBodySeparatorDefect(MessageDefect): ...
diff --git a/typeshed/stdlib/3/email/feedparser.pyi b/typeshed/stdlib/3/email/feedparser.pyi
new file mode 100644
index 0000000..a86032d
--- /dev/null
+++ b/typeshed/stdlib/3/email/feedparser.pyi
@@ -0,0 +1,28 @@
+# Stubs for email.feedparser (Python 3.4)
+
+from typing import Callable
+import sys
+from email.message import Message
+if sys.version_info >= (3, 3):
+ from email.policy import Policy
+
+class FeedParser:
+ if sys.version_info >= (3, 3):
+ def __init__(self, _factory: Callable[[], Message] = ..., *,
+ policy: Policy = ...) -> None: ...
+ else:
+ def __init__(self,
+ _factory: Callable[[], Message] = ...) -> None: ...
+ def feed(self, data: str) -> None: ...
+ def close(self) -> Message: ...
+
+if sys.version_info >= (3, 2):
+ class BytesFeedParser:
+ if sys.version_info >= (3, 3):
+ def __init__(self, _factory: Callable[[], Message] = ..., *,
+ policy: Policy = ...) -> None: ...
+ else:
+ def __init__(self,
+ _factory: Callable[[], Message] = ...) -> None: ...
+ def feed(self, data: str) -> None: ...
+ def close(self) -> Message: ...
diff --git a/typeshed/stdlib/3/email/generator.pyi b/typeshed/stdlib/3/email/generator.pyi
new file mode 100644
index 0000000..4be36d1
--- /dev/null
+++ b/typeshed/stdlib/3/email/generator.pyi
@@ -0,0 +1,45 @@
+# Stubs for email.generator (Python 3.4)
+
+from typing import TextIO, Optional
+import sys
+from email.message import Message
+if sys.version_info >= (3, 3):
+ from email.policy import Policy
+
+class Generator:
+ def clone(self, fp: TextIO) -> 'Generator': ...
+ def write(self, s: str) -> None: ...
+ if sys.version_info >= (3, 3):
+ def __init__(self, outfp: TextIO, mangle_from_: bool = ...,
+ maxheaderlen: int = ..., *,
+ policy: Policy = ...) -> None: ...
+ else:
+ def __init__(self, outfp: TextIO,
+ mangle_from_: bool = ...,
+ maxheaderlen: int = ...) -> None: ...
+ if sys.version_info >= (3, 2):
+ def flatten(self, msg: Message, unixfrom: bool = ...,
+ linesep: Optional[str] =...) -> None: ...
+ else:
+ def flatten(self, msg: Message,
+ unixfrom: bool = ...) -> None: ...
+
+if sys.version_info >= (3, 2):
+ class BytesGenerator:
+ def clone(self, fp: TextIO) -> 'Generator': ...
+ def write(self, s: str) -> None: ...
+ if sys.version_info >= (3, 3):
+ def __init__(self, outfp: TextIO, mangle_from_: bool = ...,
+ maxheaderlen: int = ..., *,
+ policy: Policy = ...) -> None: ...
+ else:
+ def __init__(self, outfp: TextIO,
+ mangle_from_: bool = ...,
+ maxheaderlen: int = ...) -> None: ...
+ def flatten(self, msg: Message, unixfrom: bool = ...,
+ linesep: Optional[str] =...) -> None: ...
+
+class DecodedGenerator(Generator):
+ # TODO `fmt` is positional
+ def __init__(self, outfp: TextIO, mangle_from_: bool = ...,
+ maxheaderlen: int = ..., *, fmt: Optional[str]) -> None: ...
diff --git a/typeshed/stdlib/3/email/header.pyi b/typeshed/stdlib/3/email/header.pyi
new file mode 100644
index 0000000..f446d4a
--- /dev/null
+++ b/typeshed/stdlib/3/email/header.pyi
@@ -0,0 +1,25 @@
+# Stubs for email.header (Python 3.4)
+
+from typing import Union, Optional, Any, List, Tuple
+from email.charset import Charset
+
+class Header:
+ def __init__(self, s: Union[bytes, str, None] = ...,
+ charset: Union[Charset, str, None] = ...,
+ maxlinelen: Optional[int] = ...,
+ header_name: Optional[str] = ..., continuation_ws: str = ...,
+ errors: str = ...) -> None: ...
+ def append(self, s: Union[bytes, str],
+ charset: Union[Charset, str, None] = ...,
+ errors: str = ...) -> None: ...
+ def encode(self, splitchars: str = ..., maxlinelen: Optional[int] = ...,
+ linesep: str = ...) -> str: ...
+ def __str__(self) -> str: ...
+ def __eq__(self, other: Any) -> bool: ...
+ def __ne__(self, other: Any) -> bool: ...
+
+def decode_header(header: Union[Header, str]) -> List[Tuple[bytes, Optional[str]]]: ...
+def make_header(decoded_seq: List[Tuple[bytes, Optional[str]]],
+ maxlinelen: Optional[int] =...,
+ header_name: Optional[str] = ...,
+ continuation_ws: str = ...) -> Header: ...
diff --git a/typeshed/stdlib/3/email/headerregistry.pyi b/typeshed/stdlib/3/email/headerregistry.pyi
new file mode 100644
index 0000000..a39f0e2
--- /dev/null
+++ b/typeshed/stdlib/3/email/headerregistry.pyi
@@ -0,0 +1,102 @@
+# Stubs for email.headerregistry (Python 3.4)
+
+import datetime as dt
+import sys
+from typing import Dict, Tuple, Optional, Any, Union, Mapping
+from email.errors import MessageDefect
+if sys.version_info >= (3, 3):
+ from email.policy import Policy
+
+if sys.version_info >= (3, 3):
+
+ class BaseHeader(str):
+ @property
+ def name(self) -> str: ...
+ @property
+ def defects(self) -> Tuple[MessageDefect, ...]: ...
+ @property
+ def max_count(self) -> Optional[int]: ...
+ def __new__(cls, name: str, value: Any) -> 'BaseHeader': ...
+ def init(self, *args: Any, **kw: Any) -> None: ...
+ def fold(self, *, policy: Policy) -> str: ...
+
+ class UnstructuredHeader:
+ @classmethod
+ def parse(cls, string: str, kwds: Dict[str, Any]) -> None: ...
+
+ class UniqueUnstructuredHeader(UnstructuredHeader): ...
+
+ class DateHeader:
+ datetime = ... # type: dt.datetime
+ @classmethod
+ def parse(cls, string: Union[str, dt.datetime],
+ kwds: Dict[str, Any]) -> None: ...
+
+ class UniqueDateHeader(DateHeader): ...
+
+ class AddressHeader:
+ groups = ... # type: Tuple[Group, ...]
+ addresses = ... # type: Tuple[Address, ...]
+ @classmethod
+ def parse(cls, string: str, kwds: Dict[str, Any]) -> None: ...
+
+ class UniqueAddressHeader(AddressHeader): ...
+
+ class SingleAddressHeader(AddressHeader):
+ @property
+ def address(self) -> Address: ...
+
+ class UniqueSingleAddressHeader(SingleAddressHeader): ...
+
+ class MIMEVersionHeader:
+ version = ... # type: Optional[str]
+ major = ... # type: Optional[int]
+ minor = ... # type: Optional[int]
+ @classmethod
+ def parse(cls, string: str, kwds: Dict[str, Any]) -> None: ...
+
+ class ParameterizedMIMEHeader:
+ params = ... # type: Mapping[str, Any]
+ @classmethod
+ def parse(cls, string: str, kwds: Dict[str, Any]) -> None: ...
+
+ class ContentTypeHeader(ParameterizedMIMEHeader):
+ content_type = ... # type: str
+ maintype = ... # type: str
+ subtype = ... # type: str
+
+ class ContentDispositionHeader(ParameterizedMIMEHeader):
+ content_disposition = ... # type: str
+
+ class ContentTransferEncoding:
+ cte = ... # type: str
+ @classmethod
+ def parse(cls, string: str, kwds: Dict[str, Any]) -> None: ...
+
+ class HeaderRegistry:
+ def __init__(self, base_class: BaseHeader = ...,
+ default_class: BaseHeader = ...,
+ use_default_map: bool = ...) -> None: ...
+ def map_to_type(self, name: str, cls: BaseHeader) -> None: ...
+ def __getitem__(self, name: str) -> BaseHeader: ...
+ def __call__(self, name: str, value: Any) -> BaseHeader: ...
+
+ class Address:
+ display_name = ... # type: str
+ username = ... # type: str
+ domain = ... # type: str
+ @property
+ def addr_spec(self) -> str: ...
+ def __init__(self, display_name: str = ...,
+ username: Optional[str] = ...,
+ domain: Optional[str] = ...,
+ addr_spec: Optional[str]=...) -> None: ...
+ def __str__(self) -> str: ...
+
+ class Group:
+ display_name = ... # type: Optional[str]
+ addresses = ... # type: Tuple[Address, ...]
+ def __init__(self, display_name: Optional[str] = ...,
+ addresses: Optional[Tuple[Address, ...]] = ...) \
+ -> None: ...
+ def __str__(self) -> str: ...
diff --git a/typeshed/stdlib/3/email/iterators.pyi b/typeshed/stdlib/3/email/iterators.pyi
new file mode 100644
index 0000000..6a69f39
--- /dev/null
+++ b/typeshed/stdlib/3/email/iterators.pyi
@@ -0,0 +1,8 @@
+# Stubs for email.iterators (Python 3.4)
+
+from typing import Iterator, Optional
+from email.message import Message
+
+def body_line_iterator(msg: Message, decode: bool = ...) -> Iterator[str]: ...
+def typed_subpart_iterator(msg: Message, maintype: str = ...,
+ subtype: Optional[str] = ...) -> Iterator[str]: ...
diff --git a/typeshed/stdlib/3/email/message.pyi b/typeshed/stdlib/3/email/message.pyi
new file mode 100644
index 0000000..d2068f6
--- /dev/null
+++ b/typeshed/stdlib/3/email/message.pyi
@@ -0,0 +1,130 @@
+# Stubs for email.message (Python 3.4)
+
+from typing import (
+ List, Optional, Union, Tuple, TypeVar, Generator, Sequence, Iterator, Any
+)
+import sys
+from email.charset import Charset
+from email.errors import MessageDefect
+if sys.version_info >= (3, 3):
+ from email.policy import Policy
+if sys.version_info >= (3, 4):
+ from email.contentmanager import ContentManager
+else:
+ ContentManager = object # Hack so we can reference it in argument types.
+
+_T = TypeVar('_T')
+
+_PayloadType = Union[List[Message], str, bytes]
+_CharsetType = Union[Charset, str, None]
+_ParamsType = Union[str, None, Tuple[str, Optional[str], str]]
+_ParamType = Union[str, Tuple[Optional[str], Optional[str], str]]
+
+class Message:
+ preamble = ... # type: Optional[str]
+ epilogue = ... # type: Optional[str]
+ defects = ... # type: List[MessageDefect]
+ def __str__(self) -> str: ...
+ def is_multipart(self) -> bool: ...
+ def set_unixfrom(self, unixfrom: str) -> None: ...
+ def get_unixfrom(self) -> Optional[str]: ...
+ def attach(self, payload: 'Message') -> None: ...
+ def get_payload(self, i: int = ..., decode: bool = ...) \
+ -> Optional[_PayloadType]: ...
+ def set_payload(self, payload: _PayloadType,
+ charset: _CharsetType = ...) -> None: ...
+ def set_charset(self, charset: _CharsetType) -> None: ...
+ def get_charset(self) -> _CharsetType: ...
+ def __len__(self) -> int: ...
+ def __contains__(self, name: str) -> bool: ...
+ def __getitem__(self, name: str) -> Optional[str]: ...
+ def __setitem__(self, name: str, val: str) -> None: ...
+ def __delitem__(self, name: str) -> None: ...
+ def keys(self) -> List[str]: ...
+ def values(self) -> List[str]: ...
+ def items(self) -> List[Tuple[str, str]]: ...
+ def get(self, name: str, failobj: _T = ...) -> Union[str, _T]: ...
+ def get_all(self, name: str, failobj: _T = ...) -> Union[List[str], _T]: ...
+ def add_header(self, _name: str, _value: str, **_params: _ParamsType) \
+ -> None: ...
+ def replace_header(self, _name: str, _value: str) -> None: ...
+ def get_content_type(self) -> str: ...
+ def get_content_maintype(self) -> str: ...
+ def get_content_subtype(self) -> str: ...
+ def get_default_type(self) -> str: ...
+ def set_default_type(self, ctype: str) -> None: ...
+ def get_params(self, failobj: _T = ..., header: str = ...,
+ unquote: bool = ...) -> Union[List[Tuple[str, str]], _T]: ...
+ def get_param(self, param: str, failobj: _T = ..., header: str = ...,
+ unquote: bool = ...) -> Union[_T, _ParamType]: ...
+ def del_param(self, param: str, header: str = ...,
+ requote: bool = ...) -> None: ...
+ def set_type(self, type: str, header: str = ...,
+ requote: bool = ...) -> None: ...
+ def get_filename(self, failobj: _T = ...) -> Union[_T, str]: ...
+ def get_boundary(self, failobj: _T = ...) -> Union[_T, str]: ...
+ def set_boundary(self, boundary: str) -> None: ...
+ def get_content_charset(self, failobj: _T = ...) -> Union[_T, str]: ...
+ def get_charsets(self, failobj: _T = ...) -> Union[_T, List[str]]: ...
+ def walk(self) -> Generator['Message', None, None]: ...
+ if sys.version_info >= (3, 5):
+ def get_content_disposition(self) -> Optional[str]: ...
+ if sys.version_info >= (3, 4):
+ def as_string(self, unixfrom: bool = ..., maxheaderlen: int = ...,
+ policy: Optional[Policy] = ...) -> str: ...
+ def as_bytes(self, unixfrom: bool = ...,
+ policy: Optional[Policy] = ...) -> bytes: ...
+ def __bytes__(self) -> bytes: ...
+ def set_param(self, param: str, value: str, header: str = ...,
+ requote: bool = ..., charset: str = ...,
+ language: str = ..., replace: bool = ...) -> None: ...
+ else:
+ def as_string(self, unixfrom: bool = ...,
+ maxheaderlen: int = ...) -> str: ...
+ def set_param(self, param: str, value: str,
+ header: str = ..., requote: bool = ...,
+ charset: str = ..., language: str = ...) -> None: ...
+ if sys.version_info >= (3, 3):
+ def __init__(self, policy: Policy = ...) -> None: ...
+ else:
+ def __init__(self) -> None: ...
+
+class MIMEPart:
+ if sys.version_info >= (3, 3):
+ def __init__(self, policy: Policy = ...) -> None: ...
+ else:
+ def __init__(self) -> None: ...
+ def get_body(self,
+ preferencelist: Sequence[str] = ...) -> Optional[Message]: ...
+ def iter_attachments(self) -> Iterator[Message]: ...
+ def iter_parts(self) -> Iterator[Message]: ...
+ def get_content(self, *args: Any,
+ content_manager: Optional[ContentManager] = ...,
+ **kw: Any) -> Any: ...
+ def set_content(self, *args: Any,
+ content_manager: Optional[ContentManager] = ...,
+ **kw: Any) -> None: ...
+ def make_related(self, boundary: Optional[str] = ...) -> None: ...
+ def make_alternative(self, boundary: Optional[str] = ...) -> None: ...
+ def make_mixed(self, boundary: Optional[str] = ...) -> None: ...
+ def add_related(self, *args: Any,
+ content_manager: Optional[ContentManager] = ...,
+ **kw: Any) -> None: ...
+ def add_alternative(self, *args: Any,
+ content_manager: Optional[ContentManager] = ...,
+ **kw: Any) -> None: ...
+ def add_attachement(self, *args: Any,
+ content_manager: Optional[ContentManager] = ...,
+ **kw: Any) -> None: ...
+ def clear(self) -> None: ...
+ def clear_content(self) -> None: ...
+ if sys.version_info >= (3, 4, 2):
+ def is_attachment(self) -> bool: ...
+ else:
+ @property
+ def is_attachment(self) -> bool: ...
+
+class EmailMessage(MIMEPart):
+ def set_content(self, *args: Any,
+ content_manager: Optional[ContentManager] = ...,
+ **kw: Any) -> None: ...
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/3/email/mime/__init__.py
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/3/email/mime/__init__.py
diff --git a/typeshed/stdlib/3/email/mime/application.pyi b/typeshed/stdlib/3/email/mime/application.pyi
new file mode 100644
index 0000000..1aa0580
--- /dev/null
+++ b/typeshed/stdlib/3/email/mime/application.pyi
@@ -0,0 +1,11 @@
+# Stubs for email.mime.application (Python 3.4)
+
+from typing import Callable, Optional, Tuple, Union
+from email.mime.nonmultipart import MIMENonMultipart
+
+_ParamsType = Union[str, None, Tuple[str, Optional[str], str]]
+
+class MIMEApplication(MIMENonMultipart):
+ def __init__(self, _data: bytes, _subtype: str = ...,
+ _encoder: Callable[[MIMEApplication], None] = ...,
+ **_params: _ParamsType) -> None: ...
diff --git a/typeshed/stdlib/3/email/mime/audio.pyi b/typeshed/stdlib/3/email/mime/audio.pyi
new file mode 100644
index 0000000..2d2c90c
--- /dev/null
+++ b/typeshed/stdlib/3/email/mime/audio.pyi
@@ -0,0 +1,11 @@
+# Stubs for email.mime.audio (Python 3.4)
+
+from typing import Callable, Optional, Tuple, Union
+from email.mime.nonmultipart import MIMENonMultipart
+
+_ParamsType = Union[str, None, Tuple[str, Optional[str], str]]
+
+class MIMEAudio(MIMENonMultipart):
+ def __init__(self, _audiodata: bytes, _subtype: Optional[str] = ...,
+ _encoder: Callable[[MIMEAudio], None] = ...,
+ **_params: _ParamsType) -> None: ...
diff --git a/typeshed/stdlib/3/email/mime/base.pyi b/typeshed/stdlib/3/email/mime/base.pyi
new file mode 100644
index 0000000..448d34b
--- /dev/null
+++ b/typeshed/stdlib/3/email/mime/base.pyi
@@ -0,0 +1,10 @@
+# Stubs for email.mime.base (Python 3.4)
+
+from typing import Optional, Tuple, Union
+import email.message
+
+_ParamsType = Union[str, None, Tuple[str, Optional[str], str]]
+
+class MIMEBase(email.message.Message):
+ def __init__(self, _maintype: str, _subtype: str,
+ **_params: _ParamsType) -> None: ...
diff --git a/typeshed/stdlib/3/email/mime/image.pyi b/typeshed/stdlib/3/email/mime/image.pyi
new file mode 100644
index 0000000..9ec5deb
--- /dev/null
+++ b/typeshed/stdlib/3/email/mime/image.pyi
@@ -0,0 +1,11 @@
+# Stubs for email.mime.image (Python 3.4)
+
+from typing import Callable, Optional, Tuple, Union
+from email.mime.nonmultipart import MIMENonMultipart
+
+_ParamsType = Union[str, None, Tuple[str, Optional[str], str]]
+
+class MIMEImage(MIMENonMultipart):
+ def __init__(self, _imagedata: bytes, _subtype: Optional[str] = ...,
+ _encoder: Callable[[MIMEImage], None] = ...,
+ **_params: _ParamsType) -> None: ...
diff --git a/typeshed/stdlib/3/email/mime/message.pyi b/typeshed/stdlib/3/email/mime/message.pyi
new file mode 100644
index 0000000..561e8c3
--- /dev/null
+++ b/typeshed/stdlib/3/email/mime/message.pyi
@@ -0,0 +1,7 @@
+# Stubs for email.mime.message (Python 3.4)
+
+from email.message import Message
+from email.mime.nonmultipart import MIMENonMultipart
+
+class MIMEMessage(MIMENonMultipart):
+ def __init__(self, _msg: Message, _subtype: str = ...) -> None: ...
diff --git a/typeshed/stdlib/3/email/mime/multipart.pyi b/typeshed/stdlib/3/email/mime/multipart.pyi
new file mode 100644
index 0000000..ea5eba1
--- /dev/null
+++ b/typeshed/stdlib/3/email/mime/multipart.pyi
@@ -0,0 +1,12 @@
+# Stubs for email.mime.multipart (Python 3.4)
+
+from typing import Optional, Sequence, Tuple, Union
+from email.message import Message
+from email.mime.base import MIMEBase
+
+_ParamsType = Union[str, None, Tuple[str, Optional[str], str]]
+
+class MIMEMultipart(MIMEBase):
+ def __init__(self, _subtype: str = ..., boundary: Optional[str] = ...,
+ _subparts: Optional[Sequence[Message]] = ...,
+ **_params: _ParamsType) -> None: ...
diff --git a/typeshed/stdlib/3/email/mime/nonmultipart.pyi b/typeshed/stdlib/3/email/mime/nonmultipart.pyi
new file mode 100644
index 0000000..1fd3ea9
--- /dev/null
+++ b/typeshed/stdlib/3/email/mime/nonmultipart.pyi
@@ -0,0 +1,5 @@
+# Stubs for email.mime.nonmultipart (Python 3.4)
+
+from email.mime.base import MIMEBase
+
+class MIMENonMultipart(MIMEBase): ...
diff --git a/typeshed/stdlib/3/email/mime/text.pyi b/typeshed/stdlib/3/email/mime/text.pyi
new file mode 100644
index 0000000..73adaf5
--- /dev/null
+++ b/typeshed/stdlib/3/email/mime/text.pyi
@@ -0,0 +1,8 @@
+# Stubs for email.mime.text (Python 3.4)
+
+from typing import Optional
+from email.mime.nonmultipart import MIMENonMultipart
+
+class MIMEText(MIMENonMultipart):
+ def __init__(self, _text: str, _subtype: str = ...,
+ _charset: Optional[str] = ...) -> None: ...
diff --git a/typeshed/stdlib/3/email/parser.pyi b/typeshed/stdlib/3/email/parser.pyi
new file mode 100644
index 0000000..d0da73f
--- /dev/null
+++ b/typeshed/stdlib/3/email/parser.pyi
@@ -0,0 +1,61 @@
+# Stubs for email.parser (Python 3.4)
+
+import email.feedparser
+from email.message import Message
+import sys
+from typing import Callable, Optional, TextIO, BinaryIO
+if sys.version_info >= (3, 3):
+ from email.policy import Policy
+
+FeedParser = email.feedparser.FeedParser
+BytesFeedParser = email.feedparser.BytesFeedParser
+
+class Parser:
+ if sys.version_info >= (3, 3):
+ def __init__(self, _class: Callable[[], Message] = ..., *,
+ policy: Policy = ...) -> None: ...
+ else:
+ # TODO `strict` is positional
+ def __init__(self,
+ _class: Callable[[], Message] = ..., *,
+ strict: Optional[bool]) -> None: ...
+ def parse(self, fp: TextIO, headersonly: bool = ...) -> Message: ...
+ def parsestr(self, text: str, headersonly: bool = ...) -> Message: ...
+
+class HeaderParser(Parser):
+ if sys.version_info >= (3, 3):
+ def __init__(self, _class: Callable[[], Message] = ..., *,
+ policy: Policy = ...) -> None: ...
+ else:
+ # TODO `strict` is positional
+ def __init__(self,
+ _class: Callable[[], Message] = ..., *,
+ strict: Optional[bool]) -> None: ...
+ def parse(self, fp: TextIO, headersonly: bool = ...) -> Message: ...
+ def parsestr(self, text: str, headersonly: bool = ...) -> Message: ...
+
+if sys.version_info >= (3, 3):
+ class BytesHeaderParser(BytesParser):
+ if sys.version_info >= (3, 3):
+ def __init__(self, _class: Callable[[], Message] = ..., *,
+ policy: Policy = ...) -> None: ...
+ else:
+ # TODO `strict` is positional
+ def __init__(self,
+ _class: Callable[[], Message] = ..., *,
+ strict: Optional[bool]) -> None: ...
+ def parse(self, fp: BinaryIO, headersonly: bool = ...) -> Message: ...
+ def parsestr(self, text: str, headersonly: bool = ...) -> Message: ...
+
+if sys.version_info >= (3, 2):
+ class BytesParser:
+ if sys.version_info >= (3, 3):
+ def __init__(self, _class: Callable[[], Message] = ..., *,
+ policy: Policy = ...) -> None: ...
+ else:
+ # TODO `strict` is positional
+ def __init__(self,
+ _class: Callable[[], Message] = ..., *,
+ strict: Optional[bool]) -> None: ...
+ def parse(self, fp: BinaryIO, headersonly: bool = ...) -> Message: ...
+ def parsestr(self, text: str, headersonly: bool = ...) -> Message: ...
diff --git a/typeshed/stdlib/3/email/policy.pyi b/typeshed/stdlib/3/email/policy.pyi
new file mode 100644
index 0000000..97f0c51
--- /dev/null
+++ b/typeshed/stdlib/3/email/policy.pyi
@@ -0,0 +1,69 @@
+# Stubs for email.policy (Python 3.4)
+
+from abc import abstractmethod
+from typing import Any, List, Optional, Tuple, Union, Callable
+import sys
+from email.message import Message
+from email.errors import MessageDefect
+from email.header import Header
+if sys.version_info >= (3, 4):
+ from email.contentmanager import ContentManager
+
+if sys.version_info >= (3, 3):
+
+ class Policy:
+ max_line_length = ... # type: Optional[int]
+ linesep = ... # type: str
+ cte_type = ... # type: str
+ raise_on_defect = ... # type: bool
+ if sys.version_info >= (3, 5):
+ mange_from = ... # type: bool
+ def __init__(**kw: Any) -> None: ...
+ def clone(**kw: Any) -> 'Policy': ...
+ def handle_defect(self, obj: Message,
+ defect: MessageDefect) -> None: ...
+ def register_defect(self, obj: Message,
+ defect: MessageDefect) -> None: ...
+ def header_max_count(self, name: str) -> Optional[int]: ...
+ @abstractmethod
+ def header_source_parse(self, sourcelines: List[str]) -> str: ...
+ @abstractmethod
+ def header_store_parse(self, name: str,
+ value: str) -> Tuple[str, str]: ...
+ @abstractmethod
+ def header_fetch_parse(self, name: str,
+ value: str) -> str: ...
+ @abstractmethod
+ def fold(self, name: str, value: str) -> str: ...
+ @abstractmethod
+ def fold_binary(self, name: str, value: str) -> bytes: ...
+
+ class Compat32(Policy):
+ def header_source_parse(self, sourcelines: List[str]) -> str: ...
+ def header_store_parse(self, name: str,
+ value: str) -> Tuple[str, str]: ...
+ def header_fetch_parse(self, name: str, # type: ignore
+ value: str) -> Union[str, Header]: ...
+ def fold(self, name: str, value: str) -> str: ...
+ def fold_binary(self, name: str, value: str) -> bytes: ...
+
+ compat32 = ... # type: Compat32
+
+ class EmailPolicy(Policy):
+ utf8 = ... # type: bool
+ refold_source = ... # type: str
+ header_factory = ... # type: Callable[[str, str], str]
+ if sys.version_info >= (3, 4):
+ content_manager = ... # type: ContentManager
+ def header_source_parse(self, sourcelines: List[str]) -> str: ...
+ def header_store_parse(self, name: str,
+ value: str) -> Tuple[str, str]: ...
+ def header_fetch_parse(self, name: str, value: str) -> str: ...
+ def fold(self, name: str, value: str) -> str: ...
+ def fold_binary(self, name: str, value: str) -> bytes: ...
+
+ default = ... # type: EmailPolicy
+ SMTP = ... # type: EmailPolicy
+ SMTPUTF8 = ... # type: EmailPolicy
+ HTTP = ... # type: EmailPolicy
+ strict = ... # type: EmailPolicy
diff --git a/typeshed/stdlib/3/email/utils.pyi b/typeshed/stdlib/3/email/utils.pyi
new file mode 100644
index 0000000..efc93c1
--- /dev/null
+++ b/typeshed/stdlib/3/email/utils.pyi
@@ -0,0 +1,33 @@
+# Stubs for email.utils (Python 3.4)
+
+from typing import List, Optional, Tuple, Union
+from email.charset import Charset
+import datetime
+
+_ParamType = Union[str, Tuple[Optional[str], Optional[str], str]]
+_PDTZ = Tuple[int, int, int, int, int, int, int, int, int, Optional[int]]
+
+def quote(str: str) -> str: ...
+def unquote(str: str) -> str: ...
+def parseaddr(address: str) -> Tuple[str, str]: ...
+def formataddr(pair: Tuple[str, str],
+ charset: Union[str, Charset] = ...) -> str: ...
+def getaddresses(fieldvalues: List[str]) -> List[Tuple[str, str]]: ...
+def parsedate(date: str) -> Optional[Tuple[int, int, int, int, int, int, int, int, int]]: ...
+def parsedate_tz(date: str) -> Optional[_PDTZ]: ...
+def parsedate_to_datetime(date: str) -> datetime.datetime: ...
+def mktime_tz(tuple: _PDTZ) -> int: ...
+def formatdate(timeval: Optional[float] = ..., localtime: bool = ...,
+ usegmt: bool = ...) -> str: ...
+def format_datetime(dt: datetime.datetime, usegmt: bool = ...) -> str: ...
+def localtime(dt: Optional[datetime.datetime] = ...) -> datetime.datetime: ...
+def make_msgid(idstring: Optional[str] = ...,
+ domain: Optional[str] = ...) -> str: ...
+def decode_rfc2231(s: str) -> Tuple[Optional[str], Optional[str], str]: ...
+def encode_rfc2231(s: str, charset: Optional[str] = ...,
+ language: Optional[str] = ...) -> str: ...
+def collapse_rfc2231_value(value: _ParamType, errors: str = ...,
+ fallback_charset: str = ...) -> str: ...
+def decode_params(
+ params: List[Tuple[str, str]]
+) -> List[Tuple[str, _ParamType]]: ...
diff --git a/typeshed/stdlib/3/encodings/__init__.pyi b/typeshed/stdlib/3/encodings/__init__.pyi
new file mode 100644
index 0000000..2ae6c0a
--- /dev/null
+++ b/typeshed/stdlib/3/encodings/__init__.pyi
@@ -0,0 +1,6 @@
+import codecs
+
+import typing
+
+def search_function(encoding: str) -> codecs.CodecInfo:
+ ...
diff --git a/typeshed/stdlib/3/encodings/utf_8.pyi b/typeshed/stdlib/3/encodings/utf_8.pyi
new file mode 100644
index 0000000..3be496a
--- /dev/null
+++ b/typeshed/stdlib/3/encodings/utf_8.pyi
@@ -0,0 +1,14 @@
+import codecs
+
+class IncrementalEncoder(codecs.IncrementalEncoder):
+ pass
+class IncrementalDecoder(codecs.BufferedIncrementalDecoder):
+ pass
+class StreamWriter(codecs.StreamWriter):
+ pass
+class StreamReader(codecs.StreamReader):
+ pass
+
+def getregentry() -> codecs.CodecInfo: pass
+def encode(input: str, errors: str = ...) -> bytes: pass
+def decode(input: bytes, errors: str = ...) -> str: pass
diff --git a/typeshed/stdlib/3/fcntl.pyi b/typeshed/stdlib/3/fcntl.pyi
new file mode 100644
index 0000000..a50fa0d
--- /dev/null
+++ b/typeshed/stdlib/3/fcntl.pyi
@@ -0,0 +1,96 @@
+# Stubs for fcntl
+from typing import Any, IO, Union
+import typing
+
+FASYNC = ... # type: int
+FD_CLOEXEC = ... # type: int
+DN_ACCESS = ... # type: int
+DN_ATTRIB = ... # type: int
+DN_CREATE = ... # type: int
+DN_DELETE = ... # type: int
+DN_MODIFY = ... # type: int
+DN_MULTISHOT = ... # type: int
+DN_RENAME = ... # type: int
+F_DUPFD = ... # type: int
+F_DUPFD_CLOEXEC = ... # type: int
+F_FULLFSYNC = ... # type: int
+F_EXLCK = ... # type: int
+F_GETFD = ... # type: int
+F_GETFL = ... # type: int
+F_GETLEASE = ... # type: int
+F_GETLK = ... # type: int
+F_GETLK64 = ... # type: int
+F_GETOWN = ... # type: int
+F_NOCACHE = ... # type: int
+F_GETSIG = ... # type: int
+F_NOTIFY = ... # type: int
+F_RDLCK = ... # type: int
+F_SETFD = ... # type: int
+F_SETFL = ... # type: int
+F_SETLEASE = ... # type: int
+F_SETLK = ... # type: int
+F_SETLK64 = ... # type: int
+F_SETLKW = ... # type: int
+F_SETLKW64 = ... # type: int
+F_SETOWN = ... # type: int
+F_SETSIG = ... # type: int
+F_SHLCK = ... # type: int
+F_UNLCK = ... # type: int
+F_WRLCK = ... # type: int
+I_ATMARK = ... # type: int
+I_CANPUT = ... # type: int
+I_CKBAND = ... # type: int
+I_FDINSERT = ... # type: int
+I_FIND = ... # type: int
+I_FLUSH = ... # type: int
+I_FLUSHBAND = ... # type: int
+I_GETBAND = ... # type: int
+I_GETCLTIME = ... # type: int
+I_GETSIG = ... # type: int
+I_GRDOPT = ... # type: int
+I_GWROPT = ... # type: int
+I_LINK = ... # type: int
+I_LIST = ... # type: int
+I_LOOK = ... # type: int
+I_NREAD = ... # type: int
+I_PEEK = ... # type: int
+I_PLINK = ... # type: int
+I_POP = ... # type: int
+I_PUNLINK = ... # type: int
+I_PUSH = ... # type: int
+I_RECVFD = ... # type: int
+I_SENDFD = ... # type: int
+I_SETCLTIME = ... # type: int
+I_SETSIG = ... # type: int
+I_SRDOPT = ... # type: int
+I_STR = ... # type: int
+I_SWROPT = ... # type: int
+I_UNLINK = ... # type: int
+LOCK_EX = ... # type: int
+LOCK_MAND = ... # type: int
+LOCK_NB = ... # type: int
+LOCK_READ = ... # type: int
+LOCK_RW = ... # type: int
+LOCK_SH = ... # type: int
+LOCK_UN = ... # type: int
+LOCK_WRITE = ... # type: int
+
+_AnyFile = Union[int, IO[Any]]
+
+# TODO All these return either int or bytes depending on the value of
+# cmd (not on the type of arg).
+def fcntl(fd: _AnyFile,
+ cmd: int,
+ arg: Union[int, bytes] = ...) -> Any: ...
+# TODO This function accepts any object supporting a buffer interface,
+# as arg, is there a better way to express this than bytes?
+def ioctl(fd: _AnyFile,
+ request: int,
+ arg: Union[int, bytes] = ...,
+ mutate_flag: bool = ...) -> Any: ...
+def flock(fd: _AnyFile, operation: int) -> None: ...
+def lockf(fd: _AnyFile,
+ cmd: int,
+ len: int = ...,
+ start: int = ...,
+ whence: int = ...) -> Any: ...
diff --git a/typeshed/stdlib/3/fileinput.pyi b/typeshed/stdlib/3/fileinput.pyi
new file mode 100644
index 0000000..dead939
--- /dev/null
+++ b/typeshed/stdlib/3/fileinput.pyi
@@ -0,0 +1,48 @@
+from typing import Iterable, Callable, IO, AnyStr, Generic, Any, Union, Iterator
+
+
+def input(
+ files: Union[str, Iterable[str]]=None,
+ inplace: bool=...,
+ backup: str=...,
+ bufsize: int=...,
+ mode: str=...,
+ openhook: Callable[[str, str], IO[AnyStr]]=...) -> Iterable[AnyStr]: ...
+
+
+def close() -> None: ...
+def nextfile() -> None: ...
+def filename() -> str: ...
+def lineno() -> int: ...
+def isfirstline() -> bool: ...
+def isstdin() -> bool: ...
+
+class FileInput(Iterable[AnyStr], Generic[AnyStr]):
+ def __init__(
+ self,
+ files: Union[str, Iterable[str]]=None,
+ inplace: bool=...,
+ backup: str=...,
+ bufsize: int=...,
+ mode: str=...,
+ openhook: Callable[[str, str], IO[AnyStr]]=...
+ ) -> None: ...
+
+ def __del__(self) -> None: ...
+ def close(self) -> None: ...
+ def __enter__(self) -> 'FileInput[AnyStr]': ...
+ def __exit__(self, type: Any, value: Any, traceback: Any) -> None: ...
+ def __iter__(self) -> Iterator[AnyStr]: ...
+ def __next__(self) -> AnyStr: ...
+ def __getitem__(self, i) -> AnyStr: ...
+ def nextfile(self) -> None: ...
+ def readline(self) -> AnyStr: ...
+ def filename(self) -> str: ...
+ def lineno(self) -> int: ...
+ def filelineno(self) -> int: ...
+ def fileno(self) -> int: ...
+ def isfirstline(self) -> bool: ...
+ def isstdin(self) -> bool: ...
+
+def hook_compressed(filename: str, mode: str) -> IO[AnyStr]: ...
+def hook_encoded(encoding: str) -> IO[AnyStr]: ...
diff --git a/typeshed/stdlib/3/fnmatch.pyi b/typeshed/stdlib/3/fnmatch.pyi
new file mode 100644
index 0000000..4f99b4a
--- /dev/null
+++ b/typeshed/stdlib/3/fnmatch.pyi
@@ -0,0 +1,11 @@
+# Stubs for fnmatch
+
+# Based on http://docs.python.org/3.2/library/fnmatch.html and
+# python-lib/fnmatch.py
+
+from typing import Iterable, List, AnyStr
+
+def fnmatch(name: AnyStr, pat: AnyStr) -> bool: ...
+def fnmatchcase(name: AnyStr, pat: AnyStr) -> bool: ...
+def filter(names: Iterable[AnyStr], pat: AnyStr) -> List[AnyStr]: ...
+def translate(pat: str) -> str: ...
diff --git a/typeshed/stdlib/3/functools.pyi b/typeshed/stdlib/3/functools.pyi
new file mode 100644
index 0000000..b4295c4
--- /dev/null
+++ b/typeshed/stdlib/3/functools.pyi
@@ -0,0 +1,64 @@
+# Stubs for functools (Python 3)
+
+# NOTE: These are incomplete!
+
+from abc import ABCMeta, abstractmethod
+import sys
+from typing import Any, Callable, Generic, Dict, Iterable, Mapping, Optional, Sequence, Tuple, TypeVar, NamedTuple, overload
+from collections import namedtuple
+
+_AnyCallable = Callable[..., Any]
+
+_T = TypeVar("_T")
+_S = TypeVar("_S")
+ at overload
+def reduce(function: Callable[[_T, _S], _T],
+ sequence: Iterable[_S], initial: _T) -> _T: ...
+ at overload
+def reduce(function: Callable[[_T, _T], _T],
+ sequence: Iterable[_T]) -> _T: ...
+
+
+class CacheInfo(NamedTuple('CacheInfo', [
+ ('hits', int), ('misses', int), ('maxsize', int), ('currsize', int)])
+):
+ ...
+
+class _lru_cache_wrapper(Generic[_T]):
+ __wrapped__ = ... # type: Callable[..., _T]
+ def __call__(self, *args: Any, **kwargs: Any) -> _T: ...
+ def cache_info(self) -> CacheInfo: ...
+
+class lru_cache():
+ def __init__(self, maxsize: Optional[int] = ..., typed: bool = ...) -> None: ...
+ def __call__(self, f: Callable[..., _T]) -> _lru_cache_wrapper[_T]: ...
+
+
+WRAPPER_ASSIGNMENTS = ... # type: Sequence[str]
+WRAPPER_UPDATES = ... # type: Sequence[str]
+
+def update_wrapper(wrapper: _AnyCallable, wrapped: _AnyCallable, assigned: Sequence[str] = ...,
+ updated: Sequence[str] = ...) -> None: ...
+def wraps(wrapped: _AnyCallable, assigned: Sequence[str] = ..., updated: Sequence[str] = ...) -> Callable[[_AnyCallable], _AnyCallable]: ...
+def total_ordering(cls: type) -> type: ...
+def cmp_to_key(mycmp: Callable[[_T, _T], int]) -> Callable[[_T], Any]: ...
+
+class partial(Generic[_T]):
+ func = ... # type: Callable[..., _T]
+ args = ... # type: Tuple[Any, ...]
+ keywords = ... # type: Dict[str, Any]
+ def __init__(self, func: Callable[..., _T], *args: Any, **kwargs: Any) -> None: ...
+ def __call__(self, *args: Any, **kwargs: Any) -> _T: ...
+
+if sys.version_info >= (3, 4):
+ class _SingleDispatchCallable(Generic[_T]):
+ registry = ... # type: Mapping[Any, Callable[..., _T]]
+ def dispatch(self, cls: Any) -> Callable[..., _T]: ...
+ @overload
+ def register(self, cls: Any) -> Callable[[Callable[..., _T]], Callable[..., _T]]: ...
+ @overload
+ def register(self, cls: Any, func: Callable[..., _T]) -> Callable[..., _T]: ...
+ def _clear_cache(self) -> None: ...
+ def __call__(self, *args: Any, **kwargs: Any) -> _T: ...
+
+ def singledispatch(func: Callable[..., _T]) -> _SingleDispatchCallable[_T]: ...
diff --git a/typeshed/stdlib/3/gc.pyi b/typeshed/stdlib/3/gc.pyi
new file mode 100644
index 0000000..ec94f29
--- /dev/null
+++ b/typeshed/stdlib/3/gc.pyi
@@ -0,0 +1,28 @@
+# Stubs for gc
+
+from typing import Any, Dict, List, Tuple
+
+
+DEBUG_COLLECTABLE = ... # type: int
+DEBUG_LEAK = ... # type: int
+DEBUG_SAVEALL = ... # type: int
+DEBUG_STATS = ... # type: int
+DEBUG_UNCOLLECTABLE = ... # type: int
+callbacks = ... # type: List[Any]
+garbage = ... # type: List[Any]
+
+def collect(generations: int = ...) -> int: ...
+def disable() -> None: ...
+def enable() -> None: ...
+def get_count() -> Tuple[int, int, int]: ...
+def get_debug() -> int: ...
+def get_objects() -> List[Any]: ...
+def get_referents(*objs: Any) -> List[Any]: ...
+def get_referrers(*objs: Any) -> List[Any]: ...
+def get_stats() -> List[Dict[str, Any]]: ...
+def get_threshold() -> Tuple[int, int, int]: ...
+def is_tracked(obj: Any) -> bool: ...
+def isenabled() -> bool: ...
+def set_debug(flags: int) -> None: ...
+def set_threshold(threshold0: int, threshold1: int = ...,
+ threshold2: int = ...) -> None: ...
diff --git a/typeshed/stdlib/3/getopt.pyi b/typeshed/stdlib/3/getopt.pyi
new file mode 100644
index 0000000..dc75699
--- /dev/null
+++ b/typeshed/stdlib/3/getopt.pyi
@@ -0,0 +1,19 @@
+# Stubs for getopt
+
+# Based on http://docs.python.org/3.2/library/getopt.html
+
+from typing import List, Tuple
+
+def getopt(args: List[str], shortopts: str,
+ longopts: List[str]=...) -> Tuple[List[Tuple[str, str]],
+ List[str]]: ...
+
+def gnu_getopt(args: List[str], shortopts: str,
+ longopts: List[str]=...) -> Tuple[List[Tuple[str, str]],
+ List[str]]: ...
+
+class GetoptError(Exception):
+ msg = ... # type: str
+ opt = ... # type: str
+
+error = GetoptError
diff --git a/typeshed/stdlib/3/getpass.pyi b/typeshed/stdlib/3/getpass.pyi
new file mode 100644
index 0000000..73c0cb9
--- /dev/null
+++ b/typeshed/stdlib/3/getpass.pyi
@@ -0,0 +1,13 @@
+# Stubs for getpass
+
+from typing import TextIO
+
+
+def getpass(prompt: str = ..., stream: TextIO = None) -> str: ...
+
+
+def getuser() -> str: ...
+
+
+class GetPassWarning(UserWarning):
+ pass
diff --git a/typeshed/stdlib/3/gettext.pyi b/typeshed/stdlib/3/gettext.pyi
new file mode 100644
index 0000000..04bf34a
--- /dev/null
+++ b/typeshed/stdlib/3/gettext.pyi
@@ -0,0 +1,44 @@
+# Stubs for gettext (Python 3.4)
+
+from typing import Any, IO, List, Optional, Union, Callable
+
+class NullTranslations:
+ def __init__(self, fp: IO[str] = ...) -> None: ...
+ def add_fallback(self, fallback: NullTranslations) -> None: ...
+ def gettext(self, message: str) -> str: ...
+ def lgettext(self, message: str) -> str: ...
+ def ngettext(self, singular: str, plural: str, n: int) -> str: ...
+ def lngettext(self, singular: str, plural: str, n: int) -> str: ...
+ def info(self) -> Any: ...
+ def charset(self) -> Any: ...
+ def output_charset(self) -> Any: ...
+ def set_output_charset(self, charset: Any) -> None: ...
+ def install(self, names: List[str] = ...) -> None: ...
+
+class GNUTranslations(NullTranslations):
+ LE_MAGIC = ... # type: int
+ BE_MAGIC = ... # type: int
+
+def find(domain: str, localedir: str = ..., languages: List[str] = ...,
+ all: bool = ...): ...
+
+def translation(domain: str, localedir: str = ..., languages: List[str] = ...,
+ class_: Callable[[IO[str]], NullTranslations] = ...,
+ fallback: bool =..., codeset: Any = ...) -> NullTranslations: ...
+
+def install(domain: str, localedir: str = ..., codeset: Any = ...,
+ names: List[str] = ...): ...
+
+def textdomain(domain: str = ...) -> str: ...
+def bindtextdomain(domain: str, localedir: str = ...) -> str: ...
+def bind_textdomain_codeset(domain: str, codeset: str = ...) -> str: ...
+def dgettext(domain: str, message: str) -> str: ...
+def ldgettext(domain: str, message: str) -> str: ...
+def dngettext(domain: str, singular: str, plural: str, n: int) -> str: ...
+def ldngettext(domain: str, singular: str, plural: str, n: int) -> str: ...
+def gettext(message: str) -> str: ...
+def lgettext(message: str) -> str: ...
+def ngettext(singular: str, plural: str, n: int) -> str: ...
+def lngettext(singular: str, plural: str, n: int) -> str: ...
+
+Catalog = translation
diff --git a/typeshed/stdlib/3/glob.pyi b/typeshed/stdlib/3/glob.pyi
new file mode 100644
index 0000000..ab58e9a
--- /dev/null
+++ b/typeshed/stdlib/3/glob.pyi
@@ -0,0 +1,15 @@
+# Stubs for glob
+# Based on http://docs.python.org/3/library/glob.html
+
+from typing import List, Iterator, AnyStr
+import sys
+
+if sys.version_info >= (3, 5):
+ def glob(pathname: AnyStr, *, recursive: bool = ...) -> List[AnyStr]: ...
+ def iglob(pathname: AnyStr, *, recursive: bool = ...) -> Iterator[AnyStr]: ...
+else:
+ def glob(pathname: AnyStr) -> List[AnyStr]: ...
+ def iglob(pathname: AnyStr) -> Iterator[AnyStr]: ...
+
+if sys.version_info >= (3, 4):
+ def escape(pathname: AnyStr) -> AnyStr: ...
diff --git a/typeshed/stdlib/3/grp.pyi b/typeshed/stdlib/3/grp.pyi
new file mode 100644
index 0000000..ad14951
--- /dev/null
+++ b/typeshed/stdlib/3/grp.pyi
@@ -0,0 +1,13 @@
+from typing import List
+
+# TODO group database entry object type
+
+class struct_group:
+ gr_name = ... # type: str
+ gr_passwd = ... # type: str
+ gr_gid = 0
+ gr_mem = ... # type: List[str]
+
+def getgrgid(gid: int) -> struct_group: ...
+def getgrnam(name: str) -> struct_group: ...
+def getgrall() -> List[struct_group]: ...
diff --git a/typeshed/stdlib/3/gzip.pyi b/typeshed/stdlib/3/gzip.pyi
new file mode 100644
index 0000000..44d8064
--- /dev/null
+++ b/typeshed/stdlib/3/gzip.pyi
@@ -0,0 +1,51 @@
+# Stubs for gzip (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+import _compression
+
+def open(filename, mode='', compresslevel=9, encoding=None, errors=None, newline=None): ...
+
+class _PaddedFile:
+ file = ... # type: Any
+ def __init__(self, f, prepend=b''): ...
+ def read(self, size): ...
+ def prepend(self, prepend=b''): ...
+ def seek(self, off): ...
+ def seekable(self): ...
+
+class GzipFile(_compression.BaseStream):
+ myfileobj = ... # type: Any
+ mode = ... # type: Any
+ name = ... # type: Any
+ compress = ... # type: Any
+ fileobj = ... # type: Any
+ def __init__(self, filename=None, mode=None, compresslevel=9, fileobj=None, mtime=None): ...
+ @property
+ def filename(self): ...
+ @property
+ def mtime(self): ...
+ crc = ... # type: Any
+ def write(self, data): ...
+ def read(self, size=-1): ...
+ def read1(self, size=-1): ...
+ def peek(self, n): ...
+ @property
+ def closed(self): ...
+ def close(self): ...
+ def flush(self, zlib_mode=...): ...
+ def fileno(self): ...
+ def rewind(self): ...
+ def readable(self): ...
+ def writable(self): ...
+ def seekable(self): ...
+ def seek(self, offset, whence=...): ...
+ def readline(self, size=-1): ...
+
+class _GzipReader(_compression.DecompressReader):
+ def __init__(self, fp): ...
+ def read(self, size=-1): ...
+
+def compress(data, compresslevel=9): ...
+def decompress(data): ...
diff --git a/typeshed/stdlib/3/hashlib.pyi b/typeshed/stdlib/3/hashlib.pyi
new file mode 100644
index 0000000..4d3709b
--- /dev/null
+++ b/typeshed/stdlib/3/hashlib.pyi
@@ -0,0 +1,40 @@
+# Stubs for hashlib
+
+from abc import abstractmethod, ABCMeta
+from typing import AbstractSet
+
+class Hash(metaclass=ABCMeta):
+ digest_size = ... # type: int
+ block_size = ... # type: int
+
+ # [Python documentation note] Changed in version 3.4: The name attribute has
+ # been present in CPython since its inception, but until Python 3.4 was not
+ # formally specified, so may not exist on some platforms
+ name = ... # type: str
+
+ @abstractmethod
+ def update(self, arg: bytes) -> None: ...
+ @abstractmethod
+ def digest(self) -> bytes: ...
+ @abstractmethod
+ def hexdigest(self) -> str: ...
+ @abstractmethod
+ def copy(self) -> 'Hash': ...
+
+def md5(arg: bytes = ...) -> Hash: ...
+def sha1(arg: bytes = ...) -> Hash: ...
+def sha224(arg: bytes = ...) -> Hash: ...
+def sha256(arg: bytes = ...) -> Hash: ...
+def sha384(arg: bytes = ...) -> Hash: ...
+def sha512(arg: bytes = ...) -> Hash: ...
+
+def new(name: str, data: bytes = ...) -> Hash: ...
+
+# New in version 3.2
+algorithms_guaranteed = ... # type: AbstractSet[str]
+algorithms_available = ... # type: AbstractSet[str]
+
+# New in version 3.4
+# TODO The documentation says "password and salt are interpreted as buffers of
+# bytes", should we declare something other than bytes here?
+def pbkdf2_hmac(name: str, password: bytes, salt: bytes, rounds: int, dklen: int = ...) -> bytes: ...
diff --git a/typeshed/stdlib/3/heapq.pyi b/typeshed/stdlib/3/heapq.pyi
new file mode 100644
index 0000000..f56ae72
--- /dev/null
+++ b/typeshed/stdlib/3/heapq.pyi
@@ -0,0 +1,23 @@
+# Stubs for heapq
+
+# Based on http://docs.python.org/3.2/library/heapq.html
+
+import sys
+from typing import TypeVar, List, Iterable, Any, Callable
+
+_T = TypeVar('_T')
+
+def heappush(heap: List[_T], item: _T) -> None: ...
+def heappop(heap: List[_T]) -> _T: ...
+def heappushpop(heap: List[_T], item: _T) -> _T: ...
+def heapify(x: List[_T]) -> None: ...
+def heapreplace(heap: List[_T], item: _T) -> _T: ...
+if sys.version_info >= (3, 5):
+ def merge(*iterables: Iterable[_T], key: Callable[[_T], Any] = ...,
+ reverse: bool = ...) -> Iterable[_T]: ...
+else:
+ def merge(*iterables: Iterable[_T]) -> Iterable[_T]: ...
+def nlargest(n: int, iterable: Iterable[_T],
+ key: Callable[[_T], Any] = ...) -> List[_T]: ...
+def nsmallest(n: int, iterable: Iterable[_T],
+ key: Callable[[_T], Any] = ...) -> List[_T]: ...
diff --git a/typeshed/stdlib/3/html/__init__.pyi b/typeshed/stdlib/3/html/__init__.pyi
new file mode 100644
index 0000000..af2a800
--- /dev/null
+++ b/typeshed/stdlib/3/html/__init__.pyi
@@ -0,0 +1,4 @@
+from typing import AnyStr
+
+def escape(s: AnyStr, quote: bool = ...) -> AnyStr: ...
+def unescape(s: AnyStr) -> AnyStr: ...
diff --git a/typeshed/stdlib/3/html/entities.pyi b/typeshed/stdlib/3/html/entities.pyi
new file mode 100644
index 0000000..b3fa66b
--- /dev/null
+++ b/typeshed/stdlib/3/html/entities.pyi
@@ -0,0 +1,10 @@
+# Stubs for html.entities (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+name2codepoint = ... # type: Any
+html5 = ... # type: Any
+codepoint2name = ... # type: Any
+entitydefs = ... # type: Any
diff --git a/typeshed/stdlib/3/html/parser.pyi b/typeshed/stdlib/3/html/parser.pyi
new file mode 100644
index 0000000..a72d194
--- /dev/null
+++ b/typeshed/stdlib/3/html/parser.pyi
@@ -0,0 +1,33 @@
+from typing import List, Tuple
+from _markupbase import ParserBase
+import sys
+
+class HTMLParser(ParserBase):
+ if sys.version_info >= (3, 5):
+ def __init__(self, *, convert_charrefs: bool = ...) -> None: ...
+ elif sys.version_info >= (3, 4):
+ def __init__(self, strict: bool = ..., *,
+ convert_charrefs: bool = ...) -> None: ...
+ else:
+ def __init__(self, strict: bool = ...) -> None: ...
+ def feed(self, feed: str) -> None: ...
+ def close(self) -> None: ...
+ def reset(self) -> None: ...
+ def getpos(self) -> Tuple[int, int]: ...
+ def get_starttag_text(self) -> str: ...
+
+ def handle_starttag(self, tag: str,
+ attrs: List[Tuple[str, str]]) -> None: ...
+ def handle_endtag(self, tag: str) -> None: ...
+ def handle_startendtag(self, tag: str,
+ attrs: List[Tuple[str, str]]) -> None: ...
+ def handle_data(self, data: str) -> None: ...
+ def handle_entityref(self, name: str) -> None: ...
+ def handle_charref(self, name: str) -> None: ...
+ def handle_comment(self, data: str) -> None: ...
+ def handle_decl(self, decl: str) -> None: ...
+ def handle_pi(self, data: str) -> None: ...
+ def unknown_decl(self, data: str) -> None: ...
+
+if sys.version_info < (3, 5):
+ class HTMLParseError(Exception): ...
diff --git a/typeshed/stdlib/3/http/__init__.pyi b/typeshed/stdlib/3/http/__init__.pyi
new file mode 100644
index 0000000..a9a77da
--- /dev/null
+++ b/typeshed/stdlib/3/http/__init__.pyi
@@ -0,0 +1,68 @@
+import sys
+
+from enum import IntEnum
+
+if sys.version_info >= (3, 5):
+ class HTTPStatus(IntEnum):
+
+ def __init__(self, *a) -> None:
+ self.phrase = ... # type: str
+ self.description = ... # type: str
+
+ CONTINUE = ... # type: object
+ SWITCHING_PROTOCOLS = ... # type: object
+ PROCESSING = ... # type: object
+ OK = ... # type: object
+ CREATED = ... # type: object
+ ACCEPTED = ... # type: object
+ NON_AUTHORITATIVE_INFORMATION = ... # type: object
+ NO_CONTENT = ... # type: object
+ RESET_CONTENT = ... # type: object
+ PARTIAL_CONTENT = ... # type: object
+ MULTI_STATUS = ... # type: object
+ ALREADY_REPORTED = ... # type: object
+ IM_USED = ... # type: object
+ MULTIPLE_CHOICES = ... # type: object
+ MOVED_PERMANENTLY = ... # type: object
+ FOUND = ... # type: object
+ SEE_OTHER = ... # type: object
+ NOT_MODIFIED = ... # type: object
+ USE_PROXY = ... # type: object
+ TEMPORARY_REDIRECT = ... # type: object
+ PERMANENT_REDIRECT = ... # type: object
+ BAD_REQUEST = ... # type: object
+ UNAUTHORIZED = ... # type: object
+ PAYMENT_REQUIRED = ... # type: object
+ FORBIDDEN = ... # type: object
+ NOT_FOUND = ... # type: object
+ METHOD_NOT_ALLOWED = ... # type: object
+ NOT_ACCEPTABLE = ... # type: object
+ PROXY_AUTHENTICATION_REQUIRED = ... # type: object
+ REQUEST_TIMEOUT = ... # type: object
+ CONFLICT = ... # type: object
+ GONE = ... # type: object
+ LENGTH_REQUIRED = ... # type: object
+ PRECONDITION_FAILED = ... # type: object
+ REQUEST_ENTITY_TOO_LARGE = ... # type: object
+ REQUEST_URI_TOO_LONG = ... # type: object
+ UNSUPPORTED_MEDIA_TYPE = ... # type: object
+ REQUESTED_RANGE_NOT_SATISFIABLE = ... # type: object
+ EXPECTATION_FAILED = ... # type: object
+ UNPROCESSABLE_ENTITY = ... # type: object
+ LOCKED = ... # type: object
+ FAILED_DEPENDENCY = ... # type: object
+ UPGRADE_REQUIRED = ... # type: object
+ PRECONDITION_REQUIRED = ... # type: object
+ TOO_MANY_REQUESTS = ... # type: object
+ REQUEST_HEADER_FIELDS_TOO_LARGE = ... # type: object
+ INTERNAL_SERVER_ERROR = ... # type: object
+ NOT_IMPLEMENTED = ... # type: object
+ BAD_GATEWAY = ... # type: object
+ SERVICE_UNAVAILABLE = ... # type: object
+ GATEWAY_TIMEOUT = ... # type: object
+ HTTP_VERSION_NOT_SUPPORTED = ... # type: object
+ VARIANT_ALSO_NEGOTIATES = ... # type: object
+ INSUFFICIENT_STORAGE = ... # type: object
+ LOOP_DETECTED = ... # type: object
+ NOT_EXTENDED = ... # type: object
+ NETWORK_AUTHENTICATION_REQUIRED = ... # type: object
diff --git a/typeshed/stdlib/3/http/client.pyi b/typeshed/stdlib/3/http/client.pyi
new file mode 100644
index 0000000..6a55f5c
--- /dev/null
+++ b/typeshed/stdlib/3/http/client.pyi
@@ -0,0 +1,194 @@
+# Stubs for http.client (Python 3.4)
+
+from typing import (
+ Any, Dict, IO, Iterable, List, Iterator, Mapping, Optional, Tuple, TypeVar,
+ Union,
+ overload,
+)
+import email.message
+import io
+import sys
+import ssl
+import types
+
+_DataType = Union[bytes, IO[Any], Iterable[bytes], str]
+_T = TypeVar('_T')
+
+HTTP_PORT = ... # type: int
+HTTPS_PORT = ... # type: int
+
+CONTINUE = ... # type: int
+SWITCHING_PROTOCOLS = ... # type: int
+PROCESSING = ... # type: int
+
+OK = ... # type: int
+CREATED = ... # type: int
+ACCEPTED = ... # type: int
+NON_AUTHORITATIVE_INFORMATION = ... # type: int
+NO_CONTENT = ... # type: int
+RESET_CONTENT = ... # type: int
+PARTIAL_CONTENT = ... # type: int
+MULTI_STATUS = ... # type: int
+IM_USED = ... # type: int
+
+MULTIPLE_CHOICES = ... # type: int
+MOVED_PERMANENTLY = ... # type: int
+FOUND = ... # type: int
+SEE_OTHER = ... # type: int
+NOT_MODIFIED = ... # type: int
+USE_PROXY = ... # type: int
+TEMPORARY_REDIRECT = ... # type: int
+
+BAD_REQUEST = ... # type: int
+UNAUTHORIZED = ... # type: int
+PAYMENT_REQUIRED = ... # type: int
+FORBIDDEN = ... # type: int
+NOT_FOUND = ... # type: int
+METHOD_NOT_ALLOWED = ... # type: int
+NOT_ACCEPTABLE = ... # type: int
+PROXY_AUTHENTICATION_REQUIRED = ... # type: int
+REQUEST_TIMEOUT = ... # type: int
+CONFLICT = ... # type: int
+GONE = ... # type: int
+LENGTH_REQUIRED = ... # type: int
+PRECONDITION_FAILED = ... # type: int
+REQUEST_ENTITY_TOO_LARGE = ... # type: int
+REQUEST_URI_TOO_LONG = ... # type: int
+UNSUPPORTED_MEDIA_TYPE = ... # type: int
+REQUESTED_RANGE_NOT_SATISFIABLE = ... # type: int
+EXPECTATION_FAILED = ... # type: int
+UNPROCESSABLE_ENTITY = ... # type: int
+LOCKED = ... # type: int
+FAILED_DEPENDENCY = ... # type: int
+UPGRADE_REQUIRED = ... # type: int
+PRECONDITION_REQUIRED = ... # type: int
+TOO_MANY_REQUESTS = ... # type: int
+REQUEST_HEADER_FIELDS_TOO_LARGE = ... # type: int
+
+INTERNAL_SERVER_ERROR = ... # type: int
+NOT_IMPLEMENTED = ... # type: int
+BAD_GATEWAY = ... # type: int
+SERVICE_UNAVAILABLE = ... # type: int
+GATEWAY_TIMEOUT = ... # type: int
+HTTP_VERSION_NOT_SUPPORTED = ... # type: int
+INSUFFICIENT_STORAGE = ... # type: int
+NOT_EXTENDED = ... # type: int
+NETWORK_AUTHENTICATION_REQUIRED = ... # type: int
+
+responses = ... # type: Dict[int, str]
+
+class HTTPMessage(email.message.Message): ...
+
+if sys.version_info >= (3, 5):
+ class HTTPResponse(io.BufferedIOBase):
+ msg = ... # type: HTTPMessage
+ version = ... # type: int
+ debuglevel = ... # type: int
+ closed = ... # type: bool
+ status = ... # type: int
+ reason = ... # type: str
+ def read(self, amt: Optional[int] = ...) -> bytes: ...
+ def readinto(self, b: bytearray) -> int: ...
+ @overload
+ def getheader(self, name: str) -> Optional[str]: ...
+ @overload
+ def getheader(self, name: str, default: _T) -> Union[str, _T]: ...
+ def getheaders(self) -> List[Tuple[str, str]]: ...
+ def fileno(self) -> int: ...
+ def __iter__(self) -> Iterator[bytes]: ...
+ def __enter__(self) -> 'HTTPResponse': ...
+ def __exit__(self, exc_type: Optional[type],
+ exc_val: Optional[Exception],
+ exc_tb: Optional[types.TracebackType]) -> bool: ...
+else:
+ class HTTPResponse:
+ msg = ... # type: HTTPMessage
+ version = ... # type: int
+ debuglevel = ... # type: int
+ closed = ... # type: bool
+ status = ... # type: int
+ reason = ... # type: str
+ def read(self, amt: Optional[int] = ...) -> bytes: ...
+ if sys.version_info >= (3, 3):
+ def readinto(self, b: bytearray) -> int: ...
+ @overload
+ def getheader(self, name: str) -> Optional[str]: ...
+ @overload
+ def getheader(self, name: str, default: _T) -> Union[str, _T]: ...
+ def getheaders(self) -> List[Tuple[str, str]]: ...
+ def fileno(self) -> int: ...
+ def __iter__(self) -> Iterator[bytes]: ...
+ def __enter__(self) -> 'HTTPResponse': ...
+ def __exit__(self, exc_type: Optional[type],
+ exc_val: Optional[Exception],
+ exc_tb: Optional[types.TracebackType]) -> bool: ...
+
+class HTTPConnection:
+ if sys.version_info >= (3, 4):
+ def __init__(
+ self,
+ host: str, port: Optional[int] = ...,
+ timeout: int = ...,
+ source_address: Optional[Tuple[str, int]] = ...
+ ) -> None: ...
+ else:
+ def __init__(
+ self,
+ host: str, port: Optional[int] = ...,
+ strict: bool = ..., timeout: int = ...,
+ source_address: Optional[Tuple[str, int]] = ...
+ )-> None: ...
+ def request(self, method: str, url: str,
+ body: Optional[_DataType] = ...,
+ headers: Mapping[str, str] = ...) -> None: ...
+ def getresponse(self) -> HTTPResponse: ...
+ def set_debuglevel(self, level: int) -> None: ...
+ def set_tunnel(self, host: str, port: Optional[int] = ...,
+ headers: Optional[Mapping[str, str]] = ...) -> None: ...
+ def connect(self) -> None: ...
+ def close(self) -> None: ...
+ def putrequest(self, request: str, selector: str, skip_host: bool = ...,
+ skip_accept_encoding: bool = ...) -> None: ...
+ def putheader(self, header: str, *argument: str) -> None: ...
+ def endheaders(self, message_body: Optional[_DataType] = ...) -> None: ...
+ def send(self, data: _DataType) -> None: ...
+
+class HTTPSConnection(HTTPConnection):
+ if sys.version_info >= (3, 4):
+ def __init__(self,
+ host: str, port: Optional[int] = ...,
+ key_file: Optional[str] = ...,
+ cert_file: Optional[str] = ...,
+ timeout: int = ...,
+ source_address: Optional[Tuple[str, int]] = ...,
+ *, context: Optional[ssl.SSLContext] = ...,
+ check_hostname: Optional[bool] = ...) -> None: ...
+ else:
+ def __init__(self,
+ host: str, port: Optional[int] = ...,
+ key_file: Optional[str] = ...,
+ cert_file: Optional[str] = ...,
+ strict: bool = ..., timeout: int = ...,
+ source_address: Optional[Tuple[str, int]] = ...,
+ *, context: Optional[ssl.SSLContext] = ...,
+ check_hostname: Optional[bool] = ...) -> None: ...
+
+class HTTPException(Exception): ...
+
+class NotConnected(HTTPException): ...
+class InvalidURL(HTTPException): ...
+class UnknownProtocol(HTTPException): ...
+class UnknownTransferEncoding(HTTPException): ...
+class UnimplementedFileMode(HTTPException): ...
+class IncompleteRead(HTTPException): ...
+
+class ImproperConnectionState(HTTPException): ...
+class CannotSendRequest(ImproperConnectionState): ...
+class CannotSendHeader(ImproperConnectionState): ...
+class ResponseNotReady(ImproperConnectionState): ...
+
+class BadStatusLine(HTTPException): ...
+class LineTooLong(HTTPException): ...
+
+if sys.version_info >= (3, 5):
+ class RemoteDisconnected(ConnectionResetError, BadStatusLine): ...
diff --git a/typeshed/stdlib/3/http/cookiejar.pyi b/typeshed/stdlib/3/http/cookiejar.pyi
new file mode 100644
index 0000000..38de5a3
--- /dev/null
+++ b/typeshed/stdlib/3/http/cookiejar.pyi
@@ -0,0 +1,112 @@
+# Stubs for http.cookiejar (Python 3.4)
+
+from typing import Iterable, Iterator, Optional, Sequence, Tuple, TypeVar, Union, overload
+from http.client import HTTPResponse
+import sys
+from urllib.request import Request
+
+_T = TypeVar('_T')
+
+if sys.version_info >= (3, 3):
+ class LoadError(OSError): ...
+else:
+ class LoadError(IOError): ...
+
+
+class CookieJar(Iterable['Cookie']):
+ def __init__(self, policy: Optional['CookiePolicy'] = ...) -> None: ...
+ def add_cookie_header(self, request: Request) -> None: ...
+ def extract_cookies(self, response: HTTPResponse,
+ request: Request) -> None: ...
+ def set_policy(self, policy: 'CookiePolicy') -> None: ...
+ def make_cookies(self, response: HTTPResponse,
+ request: Request) -> Sequence['Cookie']: ...
+ def set_cookie(self, cookie: 'Cookie') -> None: ...
+ def set_cookie_if_ok(self, cookie: 'Cookie',
+ request: Request) -> None: ...
+ def clear(self, domain: str = ..., path: str = ...,
+ name: str = ...) -> None: ...
+ def clear_session_cookies(self) -> None: ...
+ def __iter__(self) -> Iterator['Cookie']: ...
+
+class FileCookieJar(CookieJar):
+ filename = ... # type: str
+ delayload = ... # type: bool
+ def __init__(self, filename: str = ..., delayload: bool = ...,
+ policy: Optional['CookiePolicy'] = ...) -> None: ...
+ def save(self, filename: Optional[str] = ..., ignore_discard: bool = ...,
+ ignore_expires: bool = ...) -> None: ...
+ def load(self, filename: Optional[str] = ..., ignore_discard: bool = ...,
+ ignore_expires: bool = ...) -> None: ...
+ def revert(self, filename: Optional[str] = ..., ignore_discard: bool = ...,
+ ignore_expires: bool = ...) -> None: ...
+
+class MozillaCookieJar(FileCookieJar): ...
+class LWPCookieJar(FileCookieJar): ...
+
+
+class CookiePolicy:
+ netscape = ... # type: bool
+ rfc2965 = ... # type: bool
+ hide_cookie2 = ... # type: bool
+ def set_ok(self, cookie: 'Cookie', request: Request) -> bool: ...
+ def return_ok(self, cookie: 'Cookie', request: Request) -> bool: ...
+ def domain_return_ok(self, domain: str, request: Request) -> bool: ...
+ def path_return_ok(self, path: str, request: Request) -> bool: ...
+
+
+class DefaultCookiePolicy(CookiePolicy):
+ rfc2109_as_netscape = ... # type: bool
+ strict_domain = ... # type: bool
+ strict_rfc2965_unverifiable = ... # type: bool
+ strict_ns_unverifiable = ... # type: bool
+ strict_ns_domain = ... # type: int
+ strict_ns_set_initial_dollar = ... # type: bool
+ strict_ns_set_path = ... # type: bool
+ DomainStrictNoDots = ... # type: int
+ DomainStrictNonDomain = ... # type: int
+ DomainRFC2965Match = ... # type: int
+ DomainLiberal = ... # type: int
+ DomainStrict = ... # type: int
+ def __init__(self, blocked_domains: Optional[Sequence[str]] = ...,
+ allowed_domains: Optional[Sequence[str]] = ...,
+ netscape: bool = ...,
+ rfc2965: bool = ...,
+ rfc2109_as_netscape: Optional[bool] = ...,
+ hide_cookie2: bool = ..., strict_domain: bool = ...,
+ strict_rfc2965_unverifiable: bool =...,
+ strict_ns_unverifiable: bool = ...,
+ strict_ns_domain: int = ...,
+ strict_ns_set_initial_dollar: bool = ...,
+ strict_ns_set_path: bool = ...) -> None: ...
+ def blocked_domains(self) -> Tuple[str, ...]: ...
+ def set_blocked_domains(self, blocked_domains: Sequence[str]) -> None: ...
+ def is_blocked(self, domain: str) -> bool: ...
+ def allowed_domains(self) -> Optional[Tuple[str, ...]]: ...
+ def set_allowed_domains(self, allowed_domains: Optional[Sequence[str]]) \
+ -> None: ...
+ def is_not_allowed(self, domain: str) -> bool: ...
+
+
+class Cookie:
+ version = ... # type: Optional[int]
+ name = ... # type: str
+ value = ... # type: Optional[str]
+ port = ... # type: Optional[str]
+ path = ... # type: str
+ secure = ... # type: bool
+ expires = ... # type: Optional[int]
+ discard = ... # type: bool
+ comment = ... # type: Optional[str]
+ comment_url = ... # type: Optional[str]
+ rfc2109 = ... # type: bool
+ port_specified = ... # type: bool
+ domain_specified = ... # type: bool
+ domain_initial_dot = ... # type: bool
+ def has_nonstandard_attr(self, name: str) -> bool: ...
+ @overload
+ def get_nonstandard_attr(self, name: str) -> Optional[str]: ...
+ @overload
+ def get_nonstandard_attr(self, name: str, default: _T = ...) -> Union[str, _T]: ...
+ def set_nonstandard_attr(self, name: str, value: str) -> None: ...
+ def is_expired(self, now: int = ...) -> bool: ...
diff --git a/typeshed/stdlib/3/http/cookies.pyi b/typeshed/stdlib/3/http/cookies.pyi
new file mode 100644
index 0000000..b693aa7
--- /dev/null
+++ b/typeshed/stdlib/3/http/cookies.pyi
@@ -0,0 +1,31 @@
+# Stubs for http.cookies (Python 3.5)
+
+from typing import Generic, Dict, List, Mapping, MutableMapping, Optional, TypeVar, Union
+
+_DataType = Union[str, Mapping[str, Union[str, 'Morsel']]]
+_T = TypeVar('_T')
+
+class CookieError(Exception): ...
+
+class Morsel(Dict[str, str], Generic[_T]):
+ value = ... # type: str
+ coded_value = ... # type: _T
+ key = ... # type: str
+ def set(self, key: str, val: str, coded_val: _T) -> None: ...
+ def isReservedKey(self, K: str) -> bool: ...
+ def output(self, attrs: Optional[List[str]] = ...,
+ header: str = ...) -> str: ...
+ def js_output(self, attrs: Optional[List[str]] = ...) -> str: ...
+ def OutputString(self, attrs: Optional[List[str]] = ...) -> str: ...
+
+class BaseCookie(MutableMapping[str, Morsel], Generic[_T]):
+ def __init__(self, input: Optional[_DataType] = ...) -> None: ...
+ def value_decode(self, val: str) -> _T: ...
+ def value_encode(self, val: _T) -> str: ...
+ def output(self, attrs: Optional[List[str]] = ..., header: str = ...,
+ sep: str = ...) -> str: ...
+ def js_output(self, attrs: Optional[List[str]] = ...) -> str: ...
+ def load(self, rawdata: _DataType) -> None: ...
+ def __setitem__(self, key: str, value: Union[str, Morsel]) -> None: ...
+
+class SimpleCookie(BaseCookie): ...
diff --git a/typeshed/stdlib/3/http/server.pyi b/typeshed/stdlib/3/http/server.pyi
new file mode 100644
index 0000000..2f1d0c2
--- /dev/null
+++ b/typeshed/stdlib/3/http/server.pyi
@@ -0,0 +1,63 @@
+# Stubs for http.server (Python 3.4)
+
+from typing import Any, BinaryIO, Dict, List, Mapping, Optional, Tuple, Union
+import socketserver
+import email.message
+
+class HTTPServer(socketserver.TCPServer):
+ server_name = ... # type: str
+ server_port = ... # type: int
+ def __init__(self, server_address: Tuple[str, int],
+ RequestHandlerClass: type) -> None: ...
+
+class BaseHTTPRequestHandler:
+ client_address = ... # type: Tuple[str, int]
+ server = ... # type: socketserver.BaseServer
+ close_connection = ... # type: bool
+ requestline = ... # type: str
+ command = ... # type: str
+ path = ... # type: str
+ request_version = ... # type: str
+ headers = ... # type: email.message.Message
+ rfile = ... # type: BinaryIO
+ wfile = ... # type: BinaryIO
+ server_version = ... # type: str
+ sys_version = ... # type: str
+ error_message_format = ... # type: str
+ error_content_type = ... # type: str
+ protocol_version = ... # type: str
+ MessageClass = ... # type: type
+ responses = ... # type: Mapping[int, Tuple[str, str]]
+ def __init__(self, request: bytes, client_address: Tuple[str, int],
+ server: socketserver.BaseServer) -> None: ...
+ def handle(self) -> None: ...
+ def handle_one_request(self) -> None: ...
+ def handle_expect_100(self) -> bool: ...
+ def send_error(self, code: int, message: Optional[str] = ...,
+ explain: Optional[str] = ...) -> None: ...
+ def send_response(self, code: int,
+ message: Optional[str] = ...) -> None: ...
+ def send_header(self, keyword: str, value: str) -> None: ...
+ def send_response_only(self, code: int,
+ message: Optional[str] = ...) -> None: ...
+ def end_headers(self) -> None: ...
+ def flush_headers(self) -> None: ...
+ def log_request(self, code: Union[int, str] = ...,
+ size: Union[int, str] = ...) -> None: ...
+ def log_error(self, format: str, *args: Any) -> None: ...
+ def log_message(self, format: str, *args: Any) -> None: ...
+ def version_string(self) -> str: ...
+ def date_time_string(self, timestamp: Optional[int] = ...) -> str: ...
+ def log_date_time_string(self) -> str: ...
+ def address_string(self) -> str: ...
+
+class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
+ extensions_map = ... # type: Dict[str, str]
+ def __init__(self, request: bytes, client_address: Tuple[str, int],
+ server: socketserver.BaseServer) -> None: ...
+ def do_GET(self) -> None: ...
+ def do_HEAD(self) -> None: ...
+
+class CGIHTTPRequestHandler(SimpleHTTPRequestHandler):
+ cgi_directories = ... # type: List[str]
+ def do_POST(self) -> None: ...
diff --git a/typeshed/stdlib/3/imp.pyi b/typeshed/stdlib/3/imp.pyi
new file mode 100644
index 0000000..3abe628
--- /dev/null
+++ b/typeshed/stdlib/3/imp.pyi
@@ -0,0 +1,10 @@
+# Stubs for imp
+
+# NOTE: These are incomplete!
+
+from typing import TypeVar
+
+_T = TypeVar('_T')
+
+def cache_from_source(path: str, debug_override: bool = ...) -> str: ...
+def reload(module: _T) -> _T: ... # TODO imprecise signature
diff --git a/typeshed/stdlib/3/importlib/__init__.pyi b/typeshed/stdlib/3/importlib/__init__.pyi
new file mode 100644
index 0000000..7969a3c
--- /dev/null
+++ b/typeshed/stdlib/3/importlib/__init__.pyi
@@ -0,0 +1,18 @@
+from importlib.abc import Loader
+import sys
+import types
+from typing import Any, Mapping, Optional, Sequence
+
+def __import__(name: str, globals: Mapping[str, Any] = None,
+ locals: Mapping[str, Any] = None, fromlist: Sequence[str] = (),
+ level: int = 0) -> types.ModuleType: ...
+
+def import_module(name: str, package: str = None) -> types.ModuleType: ...
+
+if sys.version_info >= (3, 3):
+ def find_loader(name: str, path: str = None) -> Optional[Loader]: ...
+
+ def invalidate_caches() -> None: ...
+
+if sys.version_info >= (3, 4):
+ def reload(module: types.ModuleType) -> types.ModuleType: ...
diff --git a/typeshed/stdlib/3/importlib/abc.pyi b/typeshed/stdlib/3/importlib/abc.pyi
new file mode 100644
index 0000000..6ae74d6
--- /dev/null
+++ b/typeshed/stdlib/3/importlib/abc.pyi
@@ -0,0 +1,89 @@
+from abc import ABCMeta, abstractmethod
+import sys
+import types
+from typing import Any, Mapping, Optional, Sequence, Tuple, Union
+
+# Loader is exported from this module, but for circular import reasons
+# exists in its own stub file (with ModuleSpec and ModuleType).
+from _importlib_modulespec import Loader as Loader # Exported
+
+if sys.version_info >= (3, 4):
+ from _importlib_modulespec import ModuleSpec
+
+_Path = Union[bytes, str]
+
+class Finder(metaclass=ABCMeta):
+ ...
+ # Technically this class defines the following method, but its subclasses
+ # in this module violate its signature. Since this class is deprecated, it's
+ # easier to simply ignore that this method exists.
+ # @abstractmethod
+ # def find_module(self, fullname: str,
+ # path: Sequence[_Path] = None) -> Optional[Loader]: ...
+
+class ResourceLoader(Loader):
+ @abstractmethod
+ def get_data(self, path: _Path) -> bytes: ...
+
+class InspectLoader(Loader):
+ def is_package(self, fullname: str) -> bool: ...
+ def get_code(self, fullname: str) -> Optional[types.CodeType]: ...
+ def load_module(self, fullname: str) -> types.ModuleType: ...
+ @abstractmethod
+ def get_source(self, fullname: str) -> Optional[str]: ...
+ if sys.version_info >= (3, 4):
+ def exec_module(self, module: types.ModuleType) -> None: ...
+ if sys.version_info[:2] == (3, 4):
+ def source_to_code(self, data: Union[bytes, str],
+ path: str = '<string>') -> types.CodeType: ...
+ elif sys.version_info >= (3, 5):
+ @staticmethod
+ def source_to_code(data: Union[bytes, str],
+ path: str = '<string>') -> types.CodeType: ...
+
+class ExecutionLoader(InspectLoader):
+ @abstractmethod
+ def get_filename(self, fullname: str) -> _Path: ...
+ def get_code(self, fullname: str) -> Optional[types.CodeType]: ...
+
+class SourceLoader(ResourceLoader, ExecutionLoader):
+ def path_mtime(self, path: _Path) -> Union[int, float]: ...
+ def set_data(self, path: _Path, data: bytes) -> None: ...
+ def get_source(self, fullname: str) -> Optional[str]: ...
+ if sys.version_info >= (3, 3):
+ def path_stats(self, path: _Path) -> Mapping[str, Any]: ...
+
+
+if sys.version_info >= (3, 3):
+ class MetaPathFinder(Finder):
+ def find_module(self, fullname: str,
+ path: Optional[Sequence[_Path]]) -> Optional[Loader]:
+ ...
+ def invalidate_caches(self) -> None: ...
+ if sys.version_info >= (3, 4):
+ # Not defined on the actual class, but expected to exist.
+ def find_spec(
+ self, fullname: str, path: Optional[Sequence[_Path]],
+ target: types.ModuleType = None
+ ) -> Optional[ModuleSpec]:
+ ...
+
+ class PathEntryFinder(Finder):
+ def find_module(self, fullname: str) -> Optional[Loader]: ...
+ def find_loader(
+ self, fullname: str
+ ) -> Tuple[Optional[Loader], Sequence[_Path]]: ...
+ def invalidate_caches(self) -> None: ...
+ if sys.version_info >= (3, 4):
+ # Not defined on the actual class, but expected to exist.
+ def find_spec(
+ self, fullname: str,
+ target: types.ModuleType = None
+ ) -> Optional[ModuleSpec]: ...
+
+ class FileLoader(ResourceLoader, ExecutionLoader):
+ name = ... # type: str
+ path = ... # type: _Path
+ def __init__(self, fullname: str, path: _Path) -> None: ...
+ def get_data(self, path: _Path) -> bytes: ...
+ def get_filename(self, fullname: str) -> _Path: ...
diff --git a/typeshed/stdlib/3/importlib/machinery.pyi b/typeshed/stdlib/3/importlib/machinery.pyi
new file mode 100644
index 0000000..78aaf80
--- /dev/null
+++ b/typeshed/stdlib/3/importlib/machinery.pyi
@@ -0,0 +1,185 @@
+import importlib.abc
+import sys
+import types
+from typing import Any, Callable, List, Optional, Sequence, Tuple, Union
+
+# ModuleSpec is exported from this module, but for circular import
+# reasons exists in its own stub file (with Loader and ModuleType).
+if sys.version_info >= (3, 4):
+ from _importlib_modulespec import ModuleSpec as ModuleSpec # Exported
+
+if sys.version_info >= (3, 3):
+ class BuiltinImporter(importlib.abc.MetaPathFinder,
+ importlib.abc.InspectLoader):
+ # MetaPathFinder
+ @classmethod
+ def find_module(
+ cls, fullname: str,
+ path: Optional[Sequence[importlib.abc._Path]]
+ ) -> Optional[importlib.abc.Loader]:
+ ...
+ if sys.version_info >= (3, 4):
+ @classmethod
+ def find_spec(cls, fullname: str,
+ path: Optional[Sequence[importlib.abc._Path]],
+ target: types.ModuleType = None) -> Optional[ModuleSpec]:
+ ...
+ # InspectLoader
+ @classmethod
+ def is_package(cls, fullname: str) -> bool: ...
+ @classmethod
+ def load_module(cls, fullname: str) -> types.ModuleType: ...
+ @classmethod
+ def get_code(cls, fullname: str) -> None: ... # type: ignore
+ @classmethod
+ def get_source(cls, fullname: str) -> None: ... # type: ignore
+ # Loader
+ @classmethod
+ def load_module(cls, fullname: str) -> types.ModuleType: ...
+ if sys.version_info >= (3, 3):
+ @staticmethod
+ def module_repr(module: types.ModuleType) -> str: ... # type: ignore
+ if sys.version_info >= (3, 4):
+ @classmethod
+ def create_module(cls, spec: ModuleSpec) -> Optional[types.ModuleType]: ...
+ @classmethod
+ def exec_module(cls, module: types.ModuleType) -> None: ...
+else:
+ class BuiltinImporter(importlib.abc.InspectLoader):
+ # MetaPathFinder
+ @classmethod
+ def find_module(
+ cls, fullname: str,
+ path: Optional[Sequence[importlib.abc._Path]]
+ ) -> Optional[importlib.abc.Loader]:
+ ...
+ # InspectLoader
+ @classmethod
+ def is_package(cls, fullname: str) -> bool: ...
+ @classmethod
+ def load_module(cls, fullname: str) -> types.ModuleType: ...
+ @classmethod
+ def get_code(cls, fullname: str) -> None: ... # type: ignore
+ @classmethod
+ def get_source(cls, fullname: str) -> None: ... # type: ignore
+ # Loader
+ @classmethod
+ def load_module(cls, fullname: str) -> types.ModuleType: ...
+
+if sys.version_info >= (3, 3):
+ class FrozenImporter(importlib.abc.MetaPathFinder, importlib.abc.InspectLoader):
+ # MetaPathFinder
+ @classmethod
+ def find_module(
+ cls, fullname: str,
+ path: Optional[Sequence[importlib.abc._Path]]
+ ) -> Optional[importlib.abc.Loader]:
+ ...
+ if sys.version_info >= (3, 4):
+ @classmethod
+ def find_spec(cls, fullname: str,
+ path: Optional[Sequence[importlib.abc._Path]],
+ target: types.ModuleType = None) -> Optional[ModuleSpec]:
+ ...
+ # InspectLoader
+ @classmethod
+ def is_package(cls, fullname: str) -> bool: ...
+ @classmethod
+ def load_module(cls, fullname: str) -> types.ModuleType: ...
+ @classmethod
+ def get_code(cls, fullname: str) -> None: ... # type: ignore
+ @classmethod
+ def get_source(cls, fullname: str) -> None: ... # type: ignore
+ # Loader
+ @classmethod
+ def load_module(cls, fullname: str) -> types.ModuleType: ...
+ if sys.version_info >= (3, 3):
+ @staticmethod
+ def module_repr(module: types.ModuleType) -> str: ... # type: ignore
+ if sys.version_info >= (3, 4):
+ @classmethod
+ def create_module(cls, spec: ModuleSpec) -> Optional[types.ModuleType]:
+ ...
+ @staticmethod
+ def exec_module(module: types.ModuleType) -> None: ... # type: ignore
+else:
+ class FrozenImporter(importlib.abc.InspectLoader):
+ # MetaPathFinder
+ @classmethod
+ def find_module(
+ cls, fullname: str,
+ path: Optional[Sequence[importlib.abc._Path]]
+ ) -> Optional[importlib.abc.Loader]:
+ ...
+ # InspectLoader
+ @classmethod
+ def is_package(cls, fullname: str) -> bool: ...
+ @classmethod
+ def load_module(cls, fullname: str) -> types.ModuleType: ...
+ @classmethod
+ def get_code(cls, fullname: str) -> None: ... # type: ignore
+ @classmethod
+ def get_source(cls, fullname: str) -> None: ... # type: ignore
+ # Loader
+ @classmethod
+ def load_module(cls, fullname: str) -> types.ModuleType: ...
+
+if sys.version_info >= (3, 3):
+ class WindowsRegisteryFinder(importlib.abc.MetaPathFinder):
+ @classmethod
+ def find_module(
+ cls, fullname: str,
+ path: Optional[Sequence[importlib.abc._Path]]
+ ) -> Optional[importlib.abc.Loader]:
+ ...
+ if sys.version_info >= (3, 4):
+ @classmethod
+ def find_spec(cls, fullname: str,
+ path: Optional[Sequence[importlib.abc._Path]],
+ target: types.ModuleType = None) -> Optional[ModuleSpec]:
+ ...
+else:
+ class WindowsRegisteryFinder:
+ @classmethod
+ def find_module(
+ cls, fullname: str,
+ path: Optional[Sequence[importlib.abc._Path]]
+ ) -> Optional[importlib.abc.Loader]:
+ ...
+
+if sys.version_info >= (3, 3):
+ class PathFinder(importlib.abc.MetaPathFinder): ...
+else:
+ class PathFinder: ...
+
+if sys.version_info >= (3, 3):
+ SOURCE_SUFFIXES = ... # type: List[str]
+ DEBUG_BYTECODE_SUFFIXES = ... # type: List[str]
+ OPTIMIZED_BYTECODE_SUFFIXES = ... # type: List[str]
+ BYTECODE_SUFFIXES = ... # type: List[str]
+ EXTENSION_SUFFIXES = ... # type: List[str]
+
+ def all_suffixes() -> List[str]: ...
+
+ class FileFinder(importlib.abc.PathEntryFinder):
+ path = ... # type: str
+ def __init__(
+ self, path: str,
+ *loader_details: Tuple[importlib.abc.Loader, List[str]]
+ ) -> None: ...
+ @classmethod
+ def path_hook(
+ *loader_details: Tuple[importlib.abc.Loader, List[str]]
+ ) -> Callable[[str], importlib.abc.PathEntryFinder]: ...
+
+ class SourceFileLoader(importlib.abc.FileLoader,
+ importlib.abc.SourceLoader):
+ ...
+
+ class SourcelessFileLoader(importlib.abc.FileLoader,
+ importlib.abc.SourceLoader):
+ ...
+
+ class ExtensionFileLoader(importlib.abc.ExecutionLoader):
+ def get_filename(self, fullname: str) -> importlib.abc._Path: ...
+ def get_source(self, fullname: str) -> None: ... # type: ignore
diff --git a/typeshed/stdlib/3/importlib/util.pyi b/typeshed/stdlib/3/importlib/util.pyi
new file mode 100644
index 0000000..6f0232b
--- /dev/null
+++ b/typeshed/stdlib/3/importlib/util.pyi
@@ -0,0 +1,55 @@
+import importlib.abc
+import importlib.machinery
+import sys
+import types
+from typing import Any, Callable, List, Optional
+
+def module_for_loader(
+ fxn: Callable[..., types.ModuleType]
+) -> Callable[..., types.ModuleType]: ...
+def set_loader(
+ fxn: Callable[..., types.ModuleType]
+) -> Callable[..., types.ModuleType]: ...
+def set_package(
+ fxn: Callable[..., types.ModuleType]
+) -> Callable[..., types.ModuleType]: ...
+
+if sys.version_info >= (3, 3):
+ def resolve_name(name: str, package: str) -> str: ...
+
+if sys.version_info >= (3, 4):
+ MAGIC_NUMBER = ... # type: bytes
+
+ def cache_from_source(path: str, debug_override: bool = None, *,
+ optimization: Any = None) -> str: ...
+ def source_from_cache(path: str) -> str: ...
+ def decode_source(source_bytes: bytes) -> str: ...
+ def find_spec(
+ name: str, package: str = None
+ ) -> importlib.machinery.ModuleSpec: ...
+ def spec_from_loader(
+ name: str, loader: Optional[importlib.abc.Loader], *,
+ origin: str = None, loader_state: Any = None,
+ is_package: bool = None
+ ) -> importlib.machinery.ModuleSpec: ...
+ def spec_from_file_location(
+ name: str, location: str, *,
+ loader: importlib.abc.Loader = None,
+ submodule_search_locations: List[str]=None
+ ) -> importlib.machinery.ModuleSpec: ...
+
+if sys.version_info >= (3, 5):
+ def module_from_spec(
+ spec: importlib.machinery.ModuleSpec
+ ) -> types.ModuleType: ...
+
+ class LazyLoader(importlib.abc.Loader):
+ def __init__(self, loader: importlib.abc.Loader) -> None: ...
+ @classmethod
+ def factory(
+ cls, loader: importlib.abc.Loader
+ ) -> Callable[..., 'LazyLoader']: ...
+ def create_module(
+ self, spec: importlib.machinery.ModuleSpec
+ ) -> Optional[types.ModuleType]: ...
+ def exec_module(self, module: types.ModuleType) -> None: ...
diff --git a/typeshed/stdlib/3/inspect.pyi b/typeshed/stdlib/3/inspect.pyi
new file mode 100644
index 0000000..5fc5b19
--- /dev/null
+++ b/typeshed/stdlib/3/inspect.pyi
@@ -0,0 +1,289 @@
+# Stubs for inspect
+
+from typing import (AbstractSet, Any, Tuple, List, Dict, Callable, Generator,
+ Mapping, MutableMapping, NamedTuple, Optional, Sequence, Union,
+ )
+from types import FrameType, ModuleType, TracebackType
+
+#
+# Types and members
+#
+ModuleInfo = NamedTuple('ModuleInfo', [('name', str),
+ ('suffix', str),
+ ('mode', str),
+ ('module_type', int),
+ ])
+def getmembers(object: object,
+ predicate: Callable[[Any], bool] = ...,
+ ) -> List[Tuple[str, Any]]: ...
+def getmoduleinfo(path: str) -> Optional[ModuleInfo]: ...
+def getmodulename(path: str) -> Optional[str]: ...
+
+def ismodule(object: object) -> bool: ...
+def isclass(object: object) -> bool: ...
+def ismethod(object: object) -> bool: ...
+def isfunction(object: object) -> bool: ...
+def isgeneratorfunction(object: object) -> bool: ...
+def isgenerator(object: object) -> bool: ...
+
+# Python 3.5+
+def iscoroutinefunction(object: object) -> bool: ...
+def iscoroutine(object: object) -> bool: ...
+def isawaitable(object: object) -> bool: ...
+
+def istraceback(object: object) -> bool: ...
+def isframe(object: object) -> bool: ...
+def iscode(object: object) -> bool: ...
+def isbuiltin(object: object) -> bool: ...
+def isroutine(object: object) -> bool: ...
+def isabstract(object: object) -> bool: ...
+def ismethoddescriptor(object: object) -> bool: ...
+def isdatadescriptor(object: object) -> bool: ...
+def isgetsetdescriptor(object: object) -> bool: ...
+def ismemberdescriptor(object: object) -> bool: ...
+
+
+#
+# Retrieving source code
+#
+def getdoc(object: object) -> str: ...
+def getcomments(object: object) -> str: ...
+def getfile(object: object) -> str: ...
+def getmodule(object: object) -> ModuleType: ...
+def getsourcefile(object: object) -> str: ...
+# TODO restrict to "module, class, method, function, traceback, frame,
+# or code object"
+def getsourcelines(object: object) -> Tuple[List[str], int]: ...
+# TODO restrict to "a module, class, method, function, traceback, frame,
+# or code object"
+def getsource(object: object) -> str: ...
+def cleandoc(doc: str) -> str: ...
+
+
+#
+# Introspecting callables with the Signature object (Python 3.3+)
+#
+def signature(callable: Callable[..., Any],
+ *,
+ follow_wrapped: bool = True) -> 'Signature': ...
+
+class Signature:
+ def __init__(self,
+ parameters: Optional[Sequence['Parameter']] = ...,
+ *,
+ return_annotation: Any = ...) -> None: ...
+ # TODO: can we be more specific here?
+ empty = ... # type: object
+
+ parameters = ... # type: Mapping[str, 'Parameter']
+
+ # TODO: can we be more specific here?
+ return_annotation = ... # type: Any
+
+ def bind(self, *args: Any, **kwargs: Any) -> 'BoundArguments': ...
+ def bind_partial(self, *args: Any, **kwargs: Any) -> 'BoundArguments': ...
+ def replace(self,
+ *,
+ parameters: Optional[Sequence['Parameter']] = ...,
+ return_annotation: Any = ...) -> 'Signature': ...
+
+ # Python 3.5+
+ @classmethod
+ def from_callable(cls,
+ obj: Callable[..., Any],
+ *,
+ follow_wrapped: bool = True) -> 'Signature': ...
+
+# The name is the same as the enum's name in CPython
+class _ParameterKind: pass
+
+class Parameter:
+ def __init__(self,
+ name: str,
+ kind: _ParameterKind,
+ *,
+ default: Any = ...,
+ annotation: Any = ...) -> None: ...
+ empty = ... # type: Any
+ name = ... # type: str
+ default = ... # type: Any
+ annotation = ... # type: Any
+
+ kind = ... # type: _ParameterKind
+ POSITIONAL_ONLY = ... # type: _ParameterKind
+ POSITIONAL_OR_KEYWORD = ... # type: _ParameterKind
+ VAR_POSITIONAL = ... # type: _ParameterKind
+ KEYWORD_ONLY = ... # type: _ParameterKind
+ VAR_KEYWORD = ... # type: _ParameterKind
+
+ def replace(self,
+ *,
+ name: Optional[str] = ...,
+ kind: Optional[_ParameterKind] = ...,
+ default: Any = ...,
+ annotation: Any = ...) -> 'Parameter': ...
+
+class BoundArguments:
+ arguments = ... # type: MutableMapping[str, Any]
+ args = ... # Tuple[Any, ...]
+ kwargs = ... # Dict[str, Any]
+ signature = ... # type: Signature
+
+ # Python 3.5+
+ def apply_defaults(self) -> None: ...
+
+
+#
+# Classes and functions
+#
+
+# TODO: The actual return type should be List[_ClassTreeItem] but mypy doesn't
+# seem to be supporting this at the moment:
+# _ClassTreeItem = Union[List['_ClassTreeItem'], Tuple[type, Tuple[type, ...]]]
+def getclasstree(classes: List[type], unique: bool = ...) -> Any: ...
+
+ArgSpec = NamedTuple('ArgSpec', [('args', List[str]),
+ ('varargs', str),
+ ('keywords', str),
+ ('defaults', tuple),
+ ])
+
+def getargspec(func: object) -> ArgSpec: ...
+
+FullArgSpec = NamedTuple('FullArgSpec', [('args', List[str]),
+ ('varargs', str),
+ ('varkw', str),
+ ('defaults', tuple),
+ ('kwonlyargs', List[str]),
+ ('kwonlydefaults', Dict[str, Any]),
+ ('annotations', Dict[str, Any]),
+ ])
+
+def getfullargspec(func: object) -> FullArgSpec: ...
+
+# TODO make the field types more specific here
+ArgInfo = NamedTuple('ArgInfo', [('args', List[str]),
+ ('varargs', Optional[str]),
+ ('keywords', Optional[str]),
+ ('locals', Dict[str, Any]),
+ ])
+
+def getargvalues(frame: FrameType) -> ArgInfo: ...
+def formatargspec(args: List[str],
+ varargs: Optional[str] = ...,
+ varkw: Optional[str] = ...,
+ defaults: Optional[Tuple[Any]] = ...,
+ kwonlyargs: Optional[List[str]] = ...,
+ kwonlydefaults: Optional[Dict[str, Any]] = ...,
+ annotations: Optional[Dict[str, Any]] = ...,
+ formatarg: Optional[Callable[[str], str]] = ...,
+ formatvarargs: Optional[Callable[[str], str]] = ...,
+ formatvarkw: Optional[Callable[[str], str]] = ...,
+ formatvalue: Optional[Callable[[Any], str]] = ...,
+ formatreturns: Optional[Callable[[Any], str]] = ...,
+ formatannotations: Optional[Callable[[Any], str]] = ...,
+ ) -> str: ...
+def formatargvalues(args: List[str],
+ varargs: Optional[str] = ...,
+ varkw: Optional[str] = ...,
+ locals: Optional[Dict[str, Any]] = ...,
+ formatarg: Optional[Callable[[str], str]] = ...,
+ formatvarargs: Optional[Callable[[str], str]] = ...,
+ formatvarkw: Optional[Callable[[str], str]] = ...,
+ formatvalue: Optional[Callable[[Any], str]] = ...,
+ ) -> str: ...
+def getmro(cls: type) -> Tuple[type, ...]: ...
+
+# Python 3.2+
+def getcallargs(func: Callable[..., Any],
+ *args: Any,
+ **kwds: Any) -> Dict[str, Any]: ...
+
+
+# Python 3.3+
+ClosureVars = NamedTuple('ClosureVars', [('nonlocals', Mapping[str, Any]),
+ ('globals', Mapping[str, Any]),
+ ('builtins', Mapping[str, Any]),
+ ('unbound', AbstractSet[str]),
+ ])
+def getclosurevars(func: Callable[..., Any]) -> ClosureVars: ...
+
+# Python 3.4+
+def unwrap(func: Callable[..., Any],
+ *,
+ stop: Callable[[Any], Any]) -> Any: ...
+
+
+#
+# The interpreter stack
+#
+
+# Python 3.5+ (functions returning it used to return regular tuples)
+FrameInfo = NamedTuple('FrameInfo', [('frame', FrameType),
+ ('filename', str),
+ ('lineno', int),
+ ('function', str),
+ ('code_context', List[str]),
+ ('index', int),
+ ])
+
+# TODO make the frame type more specific
+def getframeinfo(frame: Any, context: int = 1) -> FrameInfo: ...
+def getouterframes(frame: Any, context: int = 1) -> List[FrameInfo]: ...
+def getinnerframes(traceback: TracebackType, context: int = 1) -> List[FrameInfo]:
+ ...
+def currentframe() -> Optional[FrameType]: ...
+def stack(context: int = 1) -> List[FrameInfo]: ...
+def trace(context: int = 1) -> List[FrameInfo]: ...
+
+#
+# Fetching attributes statically
+#
+
+# Python 3.2+
+def getattr_static(obj: object, attr: str, default: Optional[Any] = ...) -> Any: ...
+
+
+#
+# Current State of Generators and Coroutines
+#
+
+# TODO In the next two blocks of code, can we be more specific regarding the
+# type of the "enums"?
+
+# Python 3.2+
+GEN_CREATED = ... # type: str
+GEN_RUNNING = ... # type: str
+GEN_SUSPENDED = ... # type: str
+GEN_CLOSED = ... # type: str
+def getgeneratorstate(generator: Generator[Any, Any, Any]) -> str: ...
+
+# Python 3.5+
+CORO_CREATED = ... # type: str
+CORO_RUNNING = ... # type: str
+CORO_SUSPENDED = ... # type: str
+CORO_CLOSED = ... # type: str
+# TODO can we be more specific than "object"?
+def getcoroutinestate(coroutine: object) -> str: ...
+
+# Python 3.3+
+def getgeneratorlocals(generator: Generator[Any, Any, Any]) -> Dict[str, Any]: ...
+
+# Python 3.5+
+# TODO can we be more specific than "object"?
+def getcoroutinelocals(coroutine: object) -> Dict[str, Any]: ...
+
+
+#
+# The following seems undocumented but it was already present in this file
+#
+_object = object
+
+# namedtuple('Attribute', 'name kind defining_class object')
+class Attribute(tuple):
+ name = ... # type: str
+ kind = ... # type: str
+ defining_class = ... # type: type
+ object = ... # type: _object
+
+def classify_class_attrs(cls: type) -> List[Attribute]: ...
diff --git a/typeshed/stdlib/3/io.pyi b/typeshed/stdlib/3/io.pyi
new file mode 100644
index 0000000..be70e54
--- /dev/null
+++ b/typeshed/stdlib/3/io.pyi
@@ -0,0 +1,259 @@
+# Stubs for io
+
+from typing import (
+ List, BinaryIO, TextIO, Iterator, Union, Optional, Callable, Tuple, Any, IO
+)
+import builtins
+import codecs
+import sys
+from types import TracebackType
+
+DEFAULT_BUFFER_SIZE = ... # type: int
+
+SEEK_SET = ... # type: int
+SEEK_CUR = ... # type: int
+SEEK_END = ... # type: int
+
+open = builtins.open
+
+# FIXME when mypy handle condtional, we can uncomment the next block and remove
+# the temporary fix
+# if sys.version_info >= (3, 3):
+# BlockingIOError = BlockingIOError
+# class UnsupportedOperation(OSError, ValueError): ...
+# else:
+# class BlockingIOError(IOError):
+# characters_written = ... # type: int
+# class UnsupportedOperation(IOError, ValueError): ...
+class BlockingIOError(OSError):
+ characters_written = ... # type: int
+class UnsupportedOperation(OSError, ValueError): ...
+
+
+class IOBase:
+ def __iter__(self) -> Iterator[bytes]: ...
+ def __next__(self) -> bytes: ...
+ def __enter__(self) -> 'IOBase': ...
+ def __exit__(self, exc_type: Optional[type], exc_val: Optional[Exception],
+ exc_tb: Optional[TracebackType]) -> bool: ...
+ def close(self) -> None: ...
+ def fileno(self) -> int: ...
+ def flush(self) -> None: ...
+ def isatty(self) -> bool: ...
+ def readable(self) -> bool: ...
+ def readlines(self, hint: int = ...) -> List[bytes]: ...
+ def seek(self, offset: int, whence: int = ...) -> int: ...
+ def seekable(self) -> bool: ...
+ def tell(self) -> int: ...
+ def truncate(self, size: Optional[int] = ...) -> int: ...
+ def writable(self) -> bool: ...
+ def writelines(self, lines: List[Union[bytes, bytearray]]) -> None: ...
+ if sys.version_info >= (3, 4):
+ def readline(self, size: int = ...) -> bytes: ...
+ def __del__(self) -> None: ...
+ else:
+ def readline(self, limit: int = ...) -> bytes: ...
+ if sys.version_info >= (3, 2):
+ closed = ... # type: bool
+ else:
+ def closed(self) -> bool: ...
+
+class RawIOBase(IOBase):
+ def readall(self) -> bytes: ...
+ def readinto(self, b: bytearray) -> Optional[int]: ...
+ def write(self, b: Union[bytes, bytearray]) -> Optional[int]: ...
+ if sys.version_info >= (3, 4):
+ def read(self, size: int = ...) -> Optional[bytes]: ...
+ else:
+ def read(self, n: int = ...) -> Optional[bytes]: ...
+
+class BufferedIOBase(IOBase):
+ def detach(self) -> RawIOBase: ...
+ def readinto(self, b: bytearray) -> int: ...
+ def write(self, b: Union[bytes, bytearray]) -> int: ...
+ if sys.version_info >= (3, 5):
+ def readinto1(self, b: bytearray) -> int: ...
+ if sys.version_info >= (3, 4):
+ def read(self, size: Optional[int] = ...) -> bytes: ...
+ def read1(self, size: int = ...) -> bytes: ...
+ else:
+ def read(self, n: Optional[int] = ...) -> bytes: ...
+ def read1(self, n: int = ...) -> bytes: ...
+
+
+class FileIO(RawIOBase):
+ mode = ... # type: str
+ name = ... # type: Union[int, str]
+ if sys.version_info >= (3, 3):
+ def __init__(
+ self,
+ name: Union[str, bytes, int],
+ mode: str = ...,
+ closefd: bool = ...,
+ opener: Optional[Callable[[Union[int, str], str], int]] = ...
+ ) -> None: ...
+ else:
+ def __init__(self, name: Union[str, bytes, int],
+ mode: str = ..., closefd: bool = ...) -> None: ...
+
+# TODO should extend from BufferedIOBase
+class BytesIO(BinaryIO):
+ def __init__(self, initial_bytes: bytes = ...) -> None: ...
+ def getvalue(self) -> bytes: ...
+ if sys.version_info >= (3, 2):
+ def getbuffer(self) -> memoryview: ...
+ # copied from IOBase
+ def __iter__(self) -> Iterator[bytes]: ...
+ def __next__(self) -> bytes: ...
+ def __enter__(self) -> 'BytesIO': ...
+ def __exit__(self, t: type = None, value: BaseException = None,
+ traceback: Any = None) -> bool: ...
+ def close(self) -> None: ...
+ def fileno(self) -> int: ...
+ def flush(self) -> None: ...
+ def isatty(self) -> bool: ...
+ def readable(self) -> bool: ...
+ def readlines(self, hint: int = ...) -> List[bytes]: ...
+ def seek(self, offset: int, whence: int = ...) -> int: ...
+ def seekable(self) -> bool: ...
+ def tell(self) -> int: ...
+ def truncate(self, size: Optional[int] = ...) -> int: ...
+ def writable(self) -> bool: ...
+ # TODO should be the next line instead
+ # def writelines(self, lines: List[Union[bytes, bytearray]]) -> None: ...
+ def writelines(self, lines: Any) -> None: ...
+ if sys.version_info >= (3, 4):
+ def readline(self, size: int = ...) -> bytes: ...
+ def __del__(self) -> None: ...
+ else:
+ def readline(self, limit: int = ...): ...
+ if sys.version_info >= (3, 2):
+ closed = ... # type: bool
+ else:
+ def closed(self) -> bool: ...
+ # copied from BufferedIOBase
+ def detach(self) -> RawIOBase: ...
+ def readinto(self, b: bytearray) -> int: ...
+ def write(self, b: Union[bytes, bytearray]) -> int: ...
+ if sys.version_info >= (3, 5):
+ def readinto1(self, b: bytearray) -> int: ...
+ if sys.version_info >= (3, 4):
+ def read(self, size: Optional[int] = ...) -> bytes: ...
+ def read1(self, size: int = ...) -> bytes: ...
+ else:
+ def read(self, n: Optional[int] = ...) -> bytes: ...
+ def read1(self, n: int = ...) -> bytes: ...
+
+class BufferedReader(BufferedIOBase):
+ def __init__(self, raw: RawIOBase, buffer_size: int = ...) -> None: ...
+ if sys.version_info >= (3, 4):
+ def peek(self, size: int = ...) -> bytes: ...
+ else:
+ def peek(self, n: int = ...) -> bytes: ...
+
+class BufferedWriter(BufferedIOBase):
+ def __init__(self, raw: RawIOBase, buffer_size: int = ...) -> None: ...
+ def flush(self) -> None: ...
+ def write(self, b: Union[bytes, bytearray]) -> int: ...
+
+class BufferedRandom(BufferedReader, BufferedWriter):
+ def __init__(self, raw: RawIOBase, buffer_size: int = ...) -> None: ...
+ def seek(self, offset: int, whence: int = ...) -> int: ...
+ def tell(self) -> int: ...
+
+class BufferedRWPair(BufferedIOBase):
+ def __init__(self, reader: RawIOBase, writer: RawIOBase,
+ buffer_size: int = ...) -> None: ...
+
+
+class TextIOBase(IOBase):
+ encoding = ... # type: str
+ errors = ... # type: Optional[str]
+ newlines = ... # type: Union[str, Tuple[str, ...], None]
+ def __iter__(self) -> Iterator[str]: ... # type: ignore
+ def __next__(self) -> str: ... # type: ignore
+ def __enter__(self) -> 'TextIOBase': ...
+ def detach(self) -> IOBase: ...
+ def write(self, s: str) -> int: ...
+ if sys.version_info >= (3, 4):
+ def readline(self, size: int = ...) -> str: ... # type: ignore
+ def read(self, size: Optional[int] = ...) -> str: ...
+ elif sys.version_info >= (3, 2):
+ def readline(self, limit: int = ...) -> str: ... # type: ignore
+ else:
+ def readline(self) -> str: ...
+ if sys.version_info >= (3, 2):
+ def seek(self, offset: int, whence: int = ...) -> int: ...
+ def tell(self) -> int: ...
+
+# TODO should extend from TextIOBase
+class TextIOWrapper(TextIO):
+ line_buffering = ... # type: bool
+ # TODO uncomment after fixing mypy about using write_through
+ # if sys.version_info >= (3, 3):
+ # def __init__(self, buffer: IO[bytes], encoding: str = ...,
+ # errors: Optional[str] = ..., newline: Optional[str] = ...,
+ # line_buffering: bool = ..., write_through: bool = ...) \
+ # -> None: ...
+ # else:
+ # def __init__(self, buffer: IO[bytes],
+ # encoding: str = ..., errors: Optional[str] = ...,
+ # newline: Optional[str] = ..., line_buffering: bool = ...) \
+ # -> None: ...
+ def __init__(
+ self,
+ buffer: IO[bytes],
+ encoding: str = ...,
+ errors: Optional[str] = ...,
+ newline: Optional[str] = ...,
+ line_buffering: bool = ...,
+ write_through: bool = ...
+ ) -> None: ...
+ # copied from IOBase
+ def __exit__(self, t: type = None, value: BaseException = None,
+ traceback: Any = None) -> bool: ...
+ def close(self) -> None: ...
+ def fileno(self) -> int: ...
+ def flush(self) -> None: ...
+ def isatty(self) -> bool: ...
+ def readable(self) -> bool: ...
+ def readlines(self, hint: int = ...) -> List[str]: ...
+ def seekable(self) -> bool: ...
+ def truncate(self, size: Optional[int] = ...) -> int: ...
+ def writable(self) -> bool: ...
+ # TODO should be the next line instead
+ # def writelines(self, lines: List[str]) -> None: ...
+ def writelines(self, lines: Any) -> None: ...
+ if sys.version_info >= (3, 4):
+ def __del__(self) -> None: ...
+ if sys.version_info >= (3, 2):
+ closed = ... # type: bool
+ else:
+ def closed(self) -> bool: ...
+ # copied from TextIOBase
+ encoding = ... # type: str
+ errors = ... # type: Optional[str]
+ newlines = ... # type: Union[str, Tuple[str, ...], None]
+ def __iter__(self) -> Iterator[str]: ...
+ def __next__(self) -> str: ...
+ def __enter__(self) -> 'TextIO': ...
+ def detach(self) -> IOBase: ...
+ def write(self, s: str) -> int: ...
+ if sys.version_info >= (3, 4):
+ def readline(self, size: int = ...) -> str: ...
+ def read(self, size: Optional[int] = ...) -> str: ...
+ elif sys.version_info >= (3, 2):
+ def readline(self, limit: int = ...) -> str: ...
+ else:
+ def readline(self) -> str: ...
+ if sys.version_info >= (3, 2):
+ def seek(self, offset: int, whence: int = ...) -> int: ...
+ def tell(self) -> int: ...
+
+class StringIO(TextIOWrapper):
+ def __init__(self, initial_value: str = ...,
+ newline: Optional[str] = ...) -> None: ...
+ name = ... # type: str
+ def getvalue(self) -> str: ...
+
+class IncrementalNewlineDecoder(codecs.IncrementalDecoder): ...
diff --git a/typeshed/stdlib/3/itertools.pyi b/typeshed/stdlib/3/itertools.pyi
new file mode 100644
index 0000000..8296d62
--- /dev/null
+++ b/typeshed/stdlib/3/itertools.pyi
@@ -0,0 +1,63 @@
+# Stubs for itertools
+
+# Based on http://docs.python.org/3.2/library/itertools.html
+
+from typing import (Iterator, TypeVar, Iterable, overload, Any, Callable, Tuple,
+ Union, Sequence, Generic, Optional)
+
+_T = TypeVar('_T')
+_S = TypeVar('_S')
+
+def count(start: int = ...,
+ step: int = ...) -> Iterator[int]: ... # more general types?
+def cycle(iterable: Iterable[_T]) -> Iterator[_T]: ...
+
+ at overload
+def repeat(object: _T) -> Iterator[_T]: ...
+ at overload
+def repeat(object: _T, times: int) -> Iterator[_T]: ...
+
+def accumulate(iterable: Iterable[_T]) -> Iterator[_T]: ...
+
+class chain(Iterator[_T], Generic[_T]):
+ def __init__(self, *iterables: Iterable[_T]) -> None: ...
+ def __next__(self) -> _T: ...
+ def __iter__(self) -> Iterator[_T]: ...
+ @staticmethod
+ def from_iterable(iterable: Iterable[Iterable[_S]]) -> Iterator[_S]: ...
+
+def compress(data: Iterable[_T], selectors: Iterable[Any]) -> Iterator[_T]: ...
+def dropwhile(predicate: Callable[[_T], Any],
+ iterable: Iterable[_T]) -> Iterator[_T]: ...
+def filterfalse(predicate: Callable[[_T], Any],
+ iterable: Iterable[_T]) -> Iterator[_T]: ...
+
+ at overload
+def groupby(iterable: Iterable[_T]) -> Iterator[Tuple[_T, Iterator[_T]]]: ...
+ at overload
+def groupby(iterable: Iterable[_T],
+ key: Callable[[_T], _S]) -> Iterator[Tuple[_S, Iterator[_T]]]: ...
+
+ at overload
+def islice(iterable: Iterable[_T], stop: int) -> Iterator[_T]: ...
+ at overload
+def islice(iterable: Iterable[_T], start: int, stop: Optional[int],
+ step: int = ...) -> Iterator[_T]: ...
+
+def starmap(func: Any, iterable: Iterable[Any]) -> Iterator[Any]: ...
+def takewhile(predicate: Callable[[_T], Any],
+ iterable: Iterable[_T]) -> Iterator[_T]: ...
+def tee(iterable: Iterable[Any], n: int = ...) -> Iterator[Any]: ...
+def zip_longest(*p: Iterable[Any],
+ fillvalue: Any = ...) -> Iterator[Any]: ...
+
+# TODO: Return type should be Iterator[Tuple[..]], but unknown tuple shape.
+# Iterator[Sequence[_T]] loses this type information.
+def product(*p: Iterable[_T], repeat: int = ...) -> Iterator[Sequence[_T]]: ...
+
+def permutations(iterable: Iterable[_T],
+ r: Union[int, None] = ...) -> Iterator[Sequence[_T]]: ...
+def combinations(iterable: Iterable[_T],
+ r: int) -> Iterable[Sequence[_T]]: ...
+def combinations_with_replacement(iterable: Iterable[_T],
+ r: int) -> Iterable[Sequence[_T]]: ...
diff --git a/typeshed/stdlib/3/json.pyi b/typeshed/stdlib/3/json.pyi
new file mode 100644
index 0000000..368cae4
--- /dev/null
+++ b/typeshed/stdlib/3/json.pyi
@@ -0,0 +1,88 @@
+from typing import Any, IO, Iterator, Optional, Tuple, Callable, Dict, List, Union
+
+class JSONDecodeError(ValueError):
+ def dumps(self, obj: Any) -> str: ...
+ def dump(self, obj: Any, fp: IO[str], *args: Any, **kwds: Any) -> None: ...
+ def loads(self, s: str) -> Any: ...
+ def load(self, fp: IO[str]) -> Any: ...
+
+def dumps(obj: Any,
+ skipkeys: bool = ...,
+ ensure_ascii: bool = ...,
+ check_circular: bool = ...,
+ allow_nan: bool = ...,
+ cls: Any = ...,
+ indent: Union[None, int, str] = ...,
+ separators: Optional[Tuple[str, str]] = ...,
+ default: Optional[Callable[[Any], Any]] = ...,
+ sort_keys: bool = ...,
+ **kwds: Any) -> str: ...
+
+def dump(obj: Any,
+ fp: IO[str],
+ skipkeys: bool = ...,
+ ensure_ascii: bool = ...,
+ check_circular: bool = ...,
+ allow_nan: bool = ...,
+ cls: Any = ...,
+ indent: Union[None, int, str] = ...,
+ separators: Optional[Tuple[str, str]] = ...,
+ default: Optional[Callable[[Any], Any]] = ...,
+ sort_keys: bool = ...,
+ **kwds: Any) -> None: ...
+
+def loads(s: str,
+ encoding: Any = ..., # ignored and deprecated
+ cls: Any = ...,
+ object_hook: Optional[Callable[[Dict], Any]] = ...,
+ parse_float: Optional[Callable[[str], Any]] = ...,
+ parse_int: Optional[Callable[[str], Any]] = ...,
+ parse_constant: Optional[Callable[[str], Any]] = ...,
+ object_pairs_hook: Optional[Callable[[List[Tuple[Any, Any]]], Any]] = ...,
+ **kwds: Any) -> Any: ...
+
+def load(fp: IO[str],
+ cls: Any = ...,
+ object_hook: Optional[Callable[[Dict], Any]] = ...,
+ parse_float: Optional[Callable[[str], Any]] = ...,
+ parse_int: Optional[Callable[[str], Any]] = ...,
+ parse_constant: Optional[Callable[[str], Any]] = ...,
+ object_pairs_hook: Optional[Callable[[List[Tuple[Any, Any]]], Any]] = ...,
+ **kwds: Any) -> Any: ...
+
+class JSONEncoder(object):
+ item_separator = ... # type: str
+ key_separator = ... # type: str
+
+ skipkeys = ... # type: bool
+ ensure_ascii = ... # type: bool
+ check_circular = ... # type: bool
+ allow_nan = ... # type: bool
+ sort_keys = ... # type: bool
+ indent = None # type: int
+
+ def __init__(self, skipkeys: bool=..., ensure_ascii: bool=...,
+ check_circular: bool=..., allow_nan: bool=..., sort_keys: bool=...,
+ indent: int=None, separators: Tuple[str, str]=None, default: Callable=None) -> None: ...
+
+ def default(self, o: Any) -> Any: ...
+ def encode(self, o: Any) -> str: ...
+ def iterencode(self, o: Any, _one_shot: bool=False) -> Iterator[str]: ...
+
+class JSONDecoder(object):
+
+ object_hook = None # type: Callable[[Dict[str, Any]], Any]
+ parse_float = ... # Callable[[str], Any]
+ parse_int = ... # Callable[[str], Any]
+ parse_constant = ... # Callable[[str], Any]
+ strict = ... # type: bool
+ object_pairs_hook = None # type: Callable[[List[Tuple[str, Any]]], Any]
+
+ def __init__(self, object_hook: Callable[[Dict[str, Any]], Any]=None,
+ parse_float: Callable[[str], Any]=None,
+ parse_int: Callable[[str], Any]=None,
+ parse_constant: Callable[[str], Any]=None,
+ strict: bool=True,
+ object_pairs_hook: Callable[[List[Tuple[str, Any]]], Any]=None) -> None: ...
+ def decode(self, s: str) -> Any: ...
+ def raw_decode(self, s: str, idx: int=...) -> Tuple[Any, int]: ...
diff --git a/typeshed/stdlib/3/linecache.pyi b/typeshed/stdlib/3/linecache.pyi
new file mode 100644
index 0000000..a77de88
--- /dev/null
+++ b/typeshed/stdlib/3/linecache.pyi
@@ -0,0 +1,5 @@
+from typing import Any
+
+def getline(filename: str, lineno: int, module_globals: Any=...) -> str: pass
+def clearcache() -> None: pass
+def getlines(filename: str, module_globals: Any=...) -> None: pass
diff --git a/typeshed/stdlib/3/msvcrt.pyi b/typeshed/stdlib/3/msvcrt.pyi
new file mode 100644
index 0000000..bcab64c
--- /dev/null
+++ b/typeshed/stdlib/3/msvcrt.pyi
@@ -0,0 +1,8 @@
+# Stubs for msvcrt
+
+# NOTE: These are incomplete!
+
+from typing import overload, BinaryIO, TextIO
+
+def get_osfhandle(file: int) -> int: ...
+def open_osfhandle(handle: int, flags: int) -> int: ...
diff --git a/typeshed/stdlib/3/multiprocessing/__init__.pyi b/typeshed/stdlib/3/multiprocessing/__init__.pyi
new file mode 100644
index 0000000..8ab505e
--- /dev/null
+++ b/typeshed/stdlib/3/multiprocessing/__init__.pyi
@@ -0,0 +1,99 @@
+# Stubs for multiprocessing
+
+from typing import Any, Callable, Iterable, Mapping, Optional, Dict, List
+
+from multiprocessing.process import current_process as current_process
+
+class Lock():
+ def acquire(self, block: bool = ..., timeout: int = ...) -> None: ...
+ def release(self) -> None: ...
+
+class AsyncResult():
+ def get(self, timeout: float = -1) -> Any: ...
+ def wait(self, timeout: float = -1) -> None: ...
+ def ready(self) -> bool: ...
+ def successful(self) -> bool: ...
+
+class Pool():
+ def __init__(self, processes: Optional[int] = None,
+ initializer: Optional[Callable[..., None]] = None,
+ initargs: Iterable[Any] = (),
+ maxtasksperchild: Optional[int] = None,
+ context: Any = None) -> None: ...
+ def apply(self,
+ func: Callable[..., Any],
+ args: Iterable[Any]=(),
+ kwds: Dict[str, Any]=...) -> Any: ...
+ def apply_async(self,
+ func: Callable[..., Any],
+ args: Iterable[Any]=(),
+ kwds: Dict[str, Any]=...,
+ callback: Callable[..., None] = None,
+ error_callback: Callable[[BaseException], None] = None) -> AsyncResult: ...
+ def map(self,
+ func: Callable[..., Any],
+ iterable: Iterable[Any]=(),
+ chunksize: Optional[int] = None) -> List[Any]: ...
+ def map_async(self, func: Callable[..., Any],
+ iterable: Iterable[Any] = (),
+ chunksize: Optional[int] = None,
+ callback: Callable[..., None] = None,
+ error_callback: Callable[[BaseException], None] = None) -> AsyncResult: ...
+ def imap(self,
+ func: Callable[..., Any],
+ iterable: Iterable[Any]=(),
+ chunksize: Optional[int] = None) -> Iterable[Any]: ...
+ def imap_unordered(self,
+ func: Callable[..., Any],
+ iterable: Iterable[Any]=(),
+ chunksize: Optional[int] = None) -> Iterable[Any]: ...
+ def starmap(self,
+ func: Callable[..., Any],
+ iterable: Iterable[Iterable[Any]]=(),
+ chunksize: Optional[int] = None) -> List[Any]: ...
+ def starmap_async(self,
+ func: Callable[..., Any],
+ iterable: Iterable[Iterable[Any]] = (),
+ chunksize: Optional[int] = None,
+ callback: Callable[..., None] = None,
+ error_callback: Callable[[BaseException], None] = None) -> AsyncResult: ...
+ def close(self) -> None: ...
+ def terminate(self) -> None: ...
+ def join(self) -> None: ...
+ def __enter__(self) -> 'Pool': ...
+ def __exit__(self, exc_type, exc_val, exc_tb) -> None: ...
+
+class Process():
+ # TODO: set type of group to None
+ def __init__(self,
+ group: Any = ...,
+ target: Callable = ...,
+ name: str = ...,
+ args: Iterable[Any] = ...,
+ kwargs: Mapping[Any, Any] = ...,
+ daemon: bool = ...) -> None: ...
+ def start(self) -> None: ...
+ def run(self) -> None: ...
+ def terminate(self) -> None: ...
+ def is_alive(self) -> bool: ...
+ def join(self, timeout: float = ...) -> None: ...
+
+class Queue():
+ def __init__(self, maxsize: int = ...) -> None: ...
+ def get(self, block: bool = ..., timeout: float = ...) -> Any: ...
+ def put(self, item: Any, block: bool = ..., timeout: float = ...) -> None: ...
+ def qsize(self) -> int: ...
+ def empty(self) -> bool: ...
+ def full(self) -> bool: ...
+ def put_nowait(self, item: Any) -> None: ...
+ def get_nowait(self) -> Any: ...
+ def close(self) -> None: ...
+ def join_thread(self) -> None: ...
+ def cancel_join_thread(self) -> None: ...
+
+class Value():
+ def __init__(self, typecode_or_type: str, *args: Any, lock: bool = ...) -> None: ...
+
+# ----- multiprocessing function stubs -----
+def cpu_count() -> int: ...
+def freeze_support() -> None: ...
diff --git a/typeshed/stdlib/3/multiprocessing/managers.pyi b/typeshed/stdlib/3/multiprocessing/managers.pyi
new file mode 100644
index 0000000..c5d053e
--- /dev/null
+++ b/typeshed/stdlib/3/multiprocessing/managers.pyi
@@ -0,0 +1,10 @@
+# Stubs for multiprocessing.managers
+
+# NOTE: These are incomplete!
+
+from typing import Any
+
+class BaseManager:
+ def register(self, typeid: str, callable: Any = ...) -> None: ...
+
+class RemoteError(Exception): ...
diff --git a/typeshed/stdlib/3/multiprocessing/pool.pyi b/typeshed/stdlib/3/multiprocessing/pool.pyi
new file mode 100644
index 0000000..ed91749
--- /dev/null
+++ b/typeshed/stdlib/3/multiprocessing/pool.pyi
@@ -0,0 +1,58 @@
+# Stubs for multiprocessing.pool
+
+# NOTE: These are incomplete!
+
+from typing import Any, Callable, Iterable, Mapping, Optional, Dict, List
+
+class AsyncResult():
+ def get(self, timeout: float = -1) -> Any: ...
+ def wait(self, timeout: float = -1) -> None: ...
+ def ready(self) -> bool: ...
+ def successful(self) -> bool: ...
+
+class ThreadPool():
+ def __init__(self, processes: Optional[int] = None,
+ initializer: Optional[Callable[..., None]] = None,
+ initargs: Iterable[Any] = ()) -> None: ...
+ def apply(self,
+ func: Callable[..., Any],
+ args: Iterable[Any]=(),
+ kwds: Dict[str, Any]=...) -> Any: ...
+ def apply_async(self,
+ func: Callable[..., Any],
+ args: Iterable[Any]=(),
+ kwds: Dict[str, Any]=...,
+ callback: Callable[..., None] = None,
+ error_callback: Callable[[BaseException], None] = None) -> AsyncResult: ...
+ def map(self,
+ func: Callable[..., Any],
+ iterable: Iterable[Any]=(),
+ chunksize: Optional[int] = None) -> List[Any]: ...
+ def map_async(self, func: Callable[..., Any],
+ iterable: Iterable[Any] = (),
+ chunksize: Optional[int] = None,
+ callback: Callable[..., None] = None,
+ error_callback: Callable[[BaseException], None] = None) -> AsyncResult: ...
+ def imap(self,
+ func: Callable[..., Any],
+ iterable: Iterable[Any]=(),
+ chunksize: Optional[int] = None) -> Iterable[Any]: ...
+ def imap_unordered(self,
+ func: Callable[..., Any],
+ iterable: Iterable[Any]=(),
+ chunksize: Optional[int] = None) -> Iterable[Any]: ...
+ def starmap(self,
+ func: Callable[..., Any],
+ iterable: Iterable[Iterable[Any]]=(),
+ chunksize: Optional[int] = None) -> List[Any]: ...
+ def starmap_async(self,
+ func: Callable[..., Any],
+ iterable: Iterable[Iterable[Any]] = (),
+ chunksize: Optional[int] = None,
+ callback: Callable[..., None] = None,
+ error_callback: Callable[[BaseException], None] = None) -> AsyncResult: ...
+ def close(self) -> None: ...
+ def terminate(self) -> None: ...
+ def join(self) -> None: ...
+ def __enter__(self) -> 'ThreadPool': ...
+ def __exit__(self, exc_type, exc_val, exc_tb) -> None: ...
diff --git a/typeshed/stdlib/3/multiprocessing/process.pyi b/typeshed/stdlib/3/multiprocessing/process.pyi
new file mode 100644
index 0000000..df8ea93
--- /dev/null
+++ b/typeshed/stdlib/3/multiprocessing/process.pyi
@@ -0,0 +1,5 @@
+from typing import List
+from multiprocessing import Process
+
+def current_process() -> Process: ...
+def active_children() -> List[Process]: ...
diff --git a/typeshed/stdlib/3/opcode.pyi b/typeshed/stdlib/3/opcode.pyi
new file mode 100644
index 0000000..e577a9f
--- /dev/null
+++ b/typeshed/stdlib/3/opcode.pyi
@@ -0,0 +1,18 @@
+from typing import List, Dict, Sequence
+
+cmp_op = ... # type: Sequence[str]
+hasconst = ... # type: List[int]
+hasname = ... # type: List[int]
+hasjrel = ... # type: List[int]
+hasjabs = ... # type: List[int]
+haslocal = ... # type: List[int]
+hascompare = ... # type: List[int]
+hasfree = ... # type: List[int]
+opname = ... # type: List[str]
+
+opmap = ... # Dict[str, int]
+HAVE_ARGUMENT = ... # type: int
+EXTENDED_ARG = ... # type: int
+hasnargs = ... # type: List[int]
+
+def stack_effect(opcode: int, oparg: int = ...) -> int: ...
diff --git a/typeshed/stdlib/3/os/__init__.pyi b/typeshed/stdlib/3/os/__init__.pyi
new file mode 100644
index 0000000..4f5deea
--- /dev/null
+++ b/typeshed/stdlib/3/os/__init__.pyi
@@ -0,0 +1,386 @@
+# Stubs for os
+# Ron Murawski <ron at horizonchess.com>
+
+# based on http: //docs.python.org/3.2/library/os.html
+
+from builtins import OSError as error
+from io import TextIOWrapper as _TextIOWrapper
+import sys
+from typing import (
+ Mapping, MutableMapping, Dict, List, Any, Tuple, Iterator, overload, Union, AnyStr,
+ Optional, Generic, Set, Callable
+)
+from . import path
+from mypy_extensions import NoReturn
+
+# ----- os variables -----
+
+supports_bytes_environ = False # TODO: True when bytes implemented?
+
+SEEK_SET = 0
+SEEK_CUR = 0
+SEEK_END = 0
+
+O_RDONLY = 0
+O_WRONLY = 0
+O_RDWR = 0
+O_APPEND = 0
+O_CREAT = 0
+O_EXCL = 0
+O_TRUNC = 0
+O_DSYNC = 0 # Unix only
+O_RSYNC = 0 # Unix only
+O_SYNC = 0 # Unix only
+O_NDELAY = 0 # Unix only
+O_NONBLOCK = 0 # Unix only
+O_NOCTTY = 0 # Unix only
+O_SHLOCK = 0 # Unix only
+O_EXLOCK = 0 # Unix only
+O_BINARY = 0 # Windows only
+O_NOINHERIT = 0 # Windows only
+O_SHORT_LIVED = 0 # Windows only
+O_TEMPORARY = 0 # Windows only
+O_RANDOM = 0 # Windows only
+O_SEQUENTIAL = 0 # Windows only
+O_TEXT = 0 # Windows only
+O_ASYNC = 0 # Gnu extension if in C library
+O_DIRECT = 0 # Gnu extension if in C library
+O_DIRECTORY = 0 # Gnu extension if in C library
+O_NOFOLLOW = 0 # Gnu extension if in C library
+O_NOATIME = 0 # Gnu extension if in C library
+
+curdir = ... # type: str
+pardir = ... # type: str
+sep = ... # type: str
+altsep = ... # type: str
+extsep = ... # type: str
+pathsep = ... # type: str
+defpath = ... # type: str
+linesep = ... # type: str
+devnull = ... # type: str
+name = ... # type: str
+
+F_OK = 0
+R_OK = 0
+W_OK = 0
+X_OK = 0
+
+class _Environ(MutableMapping[AnyStr, AnyStr], Generic[AnyStr]):
+ def copy(self) -> Dict[AnyStr, AnyStr]: ...
+
+environ = ... # type: _Environ[str]
+environb = ... # type: _Environ[bytes]
+
+confstr_names = ... # type: Dict[str, int] # Unix only
+pathconf_names = ... # type: Dict[str, int] # Unix only
+sysconf_names = ... # type: Dict[str, int] # Unix only
+
+EX_OK = 0 # Unix only
+EX_USAGE = 0 # Unix only
+EX_DATAERR = 0 # Unix only
+EX_NOINPUT = 0 # Unix only
+EX_NOUSER = 0 # Unix only
+EX_NOHOST = 0 # Unix only
+EX_UNAVAILABLE = 0 # Unix only
+EX_SOFTWARE = 0 # Unix only
+EX_OSERR = 0 # Unix only
+EX_OSFILE = 0 # Unix only
+EX_CANTCREAT = 0 # Unix only
+EX_IOERR = 0 # Unix only
+EX_TEMPFAIL = 0 # Unix only
+EX_PROTOCOL = 0 # Unix only
+EX_NOPERM = 0 # Unix only
+EX_CONFIG = 0 # Unix only
+EX_NOTFOUND = 0 # Unix only
+
+P_NOWAIT = 0
+P_NOWAITO = 0
+P_WAIT = 0
+# P_DETACH = 0 # Windows only
+# P_OVERLAY = 0 # Windows only
+
+# wait()/waitpid() options
+WNOHANG = 0 # Unix only
+# WCONTINUED = 0 # some Unix systems
+# WUNTRACED = 0 # Unix only
+
+TMP_MAX = 0 # Undocumented, but used by tempfile
+
+# ----- os classes (structures) -----
+if sys.version_info >= (3, 6):
+ class PathLike:
+ def __fspath__(self) -> AnyStr: ...
+
+
+if sys.version_info >= (3, 5):
+ class DirEntry:
+ # This is what the scandir interator yields
+ # The constructor is hidden
+
+ name = ''
+ path = ''
+ def inode(self) -> int: ...
+ def is_dir(self, follow_symlinks: bool = ...) -> bool: ...
+ def is_file(self, follow_symlinks: bool = ...) -> bool: ...
+ def is_symlink(self) -> bool: ...
+ def stat(self) -> stat_result: ...
+
+
+class stat_result:
+ # For backward compatibility, the return value of stat() is also
+ # accessible as a tuple of at least 10 integers giving the most important
+ # (and portable) members of the stat structure, in the order st_mode,
+ # st_ino, st_dev, st_nlink, st_uid, st_gid, st_size, st_atime, st_mtime,
+ # st_ctime. More items may be added at the end by some implementations.
+
+ st_mode = 0 # protection bits,
+ st_ino = 0 # inode number,
+ st_dev = 0 # device,
+ st_nlink = 0 # number of hard links,
+ st_uid = 0 # user id of owner,
+ st_gid = 0 # group id of owner,
+ st_size = 0 # size of file, in bytes,
+ st_atime = 0.0 # time of most recent access,
+ st_mtime = 0.0 # time of most recent content modification,
+ st_ctime = 0.0 # platform dependent (time of most recent metadata change on Unix, or the time of creation on Windows)
+
+ if sys.version_info >= (3, 3):
+ st_atime_ns = 0 # time of most recent access, in nanoseconds
+ st_mtime_ns = 0 # time of most recent content modification in nanoseconds
+ st_ctime_ns = 0 # platform dependent (time of most recent metadata change on Unix, or the time of creation on Windows) in nanoseconds
+
+ # not documented
+ def __init__(self, tuple: Tuple[int, ...]) -> None: ...
+
+ # On some Unix systems (such as Linux), the following attributes may also
+ # be available:
+ st_blocks = 0 # number of blocks allocated for file
+ st_blksize = 0 # filesystem blocksize
+ st_rdev = 0 # type of device if an inode device
+ st_flags = 0 # user defined flags for file
+
+ # On other Unix systems (such as FreeBSD), the following attributes may be
+ # available (but may be only filled out if root tries to use them):
+ st_gen = 0 # file generation number
+ st_birthtime = 0 # time of file creation
+
+ # On Mac OS systems, the following attributes may also be available:
+ st_rsize = 0
+ st_creator = 0
+ st_type = 0
+
+class statvfs_result: # Unix only
+ f_bsize = 0
+ f_frsize = 0
+ f_blocks = 0
+ f_bfree = 0
+ f_bavail = 0
+ f_files = 0
+ f_ffree = 0
+ f_favail = 0
+ f_flag = 0
+ f_namemax = 0
+
+# ----- os function stubs -----
+def fsencode(filename: str) -> bytes: ...
+def fsdecode(filename: bytes) -> str: ...
+def get_exec_path(env: Optional[Mapping[str, str]] = ...) -> List[str]: ...
+# NOTE: get_exec_path(): returns List[bytes] when env not None
+def ctermid() -> str: ... # Unix only
+def getegid() -> int: ... # Unix only
+def geteuid() -> int: ... # Unix only
+def getgid() -> int: ... # Unix only
+def getgroups() -> List[int]: ... # Unix only, behaves differently on Mac
+def initgroups(username: str, gid: int) -> None: ... # Unix only
+def getlogin() -> str: ...
+def getpgid(pid: int) -> int: ... # Unix only
+def getpgrp() -> int: ... # Unix only
+def getpid() -> int: ...
+def getppid() -> int: ...
+def getresuid() -> Tuple[int, int, int]: ... # Unix only
+def getresgid() -> Tuple[int, int, int]: ... # Unix only
+def getuid() -> int: ... # Unix only
+def getenv(key: str, default: str = ...) -> str: ...
+def getenvb(key: bytes, default: bytes = ...) -> bytes: ...
+# TODO mixed str/bytes putenv arguments
+def putenv(key: AnyStr, value: AnyStr) -> None: ...
+def setegid(egid: int) -> None: ... # Unix only
+def seteuid(euid: int) -> None: ... # Unix only
+def setgid(gid: int) -> None: ... # Unix only
+def setgroups(groups: List[int]) -> None: ... # Unix only
+def setpgrp() -> int: ... # Unix only
+def setpgid(pid: int, pgrp: int) -> int: ... # Unix only
+def setregid(rgid: int, egid: int) -> None: ... # Unix only
+def setresgid(rgid: int, egid: int, sgid: int) -> None: ... # Unix only
+def setresuid(ruid: int, euid: int, suid: int) -> None: ... # Unix only
+def setreuid(ruid: int, euid: int) -> None: ... # Unix only
+def getsid(pid: int) -> int: ... # Unix only
+def setsid() -> int: ... # Unix only
+def setuid(uid: int) -> None: ... # Unix only
+def strerror(code: int) -> str: ...
+def umask(mask: int) -> int: ...
+def uname() -> Tuple[str, str, str, str, str]: ... # Unix only
+def unsetenv(key: AnyStr) -> None: ...
+# Return IO or TextIO
+def fdopen(fd: int, mode: str = ..., buffering: int = ..., encoding: str = ...,
+ errors: str = ..., newline: str = ..., closefd: bool = ...) -> Any: ...
+def close(fd: int) -> None: ...
+def closerange(fd_low: int, fd_high: int) -> None: ...
+def device_encoding(fd: int) -> Optional[str]: ...
+def dup(fd: int) -> int: ...
+def dup2(fd: int, fd2: int) -> None: ...
+def fchmod(fd: int, mode: int) -> None: ... # Unix only
+def fchown(fd: int, uid: int, gid: int) -> None: ... # Unix only
+def fdatasync(fd: int) -> None: ... # Unix only, not Mac
+def fpathconf(fd: int, name: str) -> int: ... # Unix only
+def fstat(fd: int) -> stat_result: ...
+def fstatvfs(fd: int) -> statvfs_result: ... # Unix only
+def fsync(fd: int) -> None: ...
+def ftruncate(fd: int, length: int) -> None: ... # Unix only
+def isatty(fd: int) -> bool: ... # Unix only
+def lseek(fd: int, pos: int, how: int) -> int: ...
+def open(file: AnyStr, flags: int, mode: int = ...) -> int: ...
+def openpty() -> Tuple[int, int]: ... # some flavors of Unix
+def pipe() -> Tuple[int, int]: ...
+def read(fd: int, n: int) -> bytes: ...
+def tcgetpgrp(fd: int) -> int: ... # Unix only
+def tcsetpgrp(fd: int, pg: int) -> None: ... # Unix only
+def ttyname(fd: int) -> str: ... # Unix only
+def write(fd: int, string: bytes) -> int: ...
+def access(path: AnyStr, mode: int) -> bool: ...
+def chdir(path: AnyStr) -> None: ...
+def fchdir(fd: int) -> None: ...
+def getcwd() -> str: ...
+def getcwdb() -> bytes: ...
+def chflags(path: str, flags: int) -> None: ... # Unix only
+def chroot(path: str) -> None: ... # Unix only
+def chmod(path: AnyStr, mode: int) -> None: ...
+def chown(path: AnyStr, uid: int, gid: int) -> None: ... # Unix only
+def lchflags(path: str, flags: int) -> None: ... # Unix only
+def lchmod(path: str, mode: int) -> None: ... # Unix only
+def lchown(path: str, uid: int, gid: int) -> None: ... # Unix only
+def link(src: AnyStr, link_name: AnyStr) -> None: ...
+
+ at overload
+def listdir(path: str = ...) -> List[str]: ...
+ at overload
+def listdir(path: bytes) -> List[bytes]: ...
+
+def lstat(path: AnyStr) -> stat_result: ...
+def mkfifo(path: str, mode: int = ...) -> None: ... # Unix only
+def mknod(filename: AnyStr, mode: int = ..., device: int = ...) -> None: ...
+def major(device: int) -> int: ...
+def minor(device: int) -> int: ...
+def makedev(major: int, minor: int) -> int: ...
+def mkdir(path: AnyStr, mode: int = ...) -> None: ...
+def makedirs(path: AnyStr, mode: int = ...,
+ exist_ok: bool = ...) -> None: ...
+def pathconf(path: str, name: str) -> int: ... # Unix only
+def readlink(path: AnyStr) -> AnyStr: ...
+def remove(path: AnyStr) -> None: ...
+def removedirs(path: AnyStr) -> None: ...
+def rename(src: AnyStr, dst: AnyStr) -> None: ...
+def renames(old: AnyStr, new: AnyStr) -> None: ...
+if sys.version_info >= (3, 3):
+ def replace(src: AnyStr, dst: AnyStr) -> None: ...
+def rmdir(path: AnyStr) -> None: ...
+if sys.version_info >= (3, 5):
+ @overload
+ def scandir(path: str = ...) -> Iterator[DirEntry]: ...
+ @overload
+ def scandir(path: bytes) -> Iterator[DirEntry]: ...
+def stat(path: AnyStr) -> stat_result: ...
+def stat_float_times(newvalue: Union[bool, None] = ...) -> bool: ...
+def statvfs(path: str) -> statvfs_result: ... # Unix only
+def symlink(source: AnyStr, link_name: AnyStr,
+ target_is_directory: bool = ...) -> None:
+ ... # final argument in Windows only
+def unlink(path: AnyStr) -> None: ...
+def utime(path: AnyStr, times: Union[Tuple[int, int], Tuple[float, float]] = ...) -> None: ...
+
+# TODO onerror: function from OSError to void
+def walk(top: AnyStr, topdown: bool = ..., onerror: Any = ...,
+ followlinks: bool = ...) -> Iterator[Tuple[AnyStr, List[AnyStr],
+ List[AnyStr]]]: ...
+
+def abort() -> 'None': ...
+def execl(path: AnyStr, arg0: AnyStr, *args: AnyStr) -> None: ...
+def execle(path: AnyStr, arg0: AnyStr,
+ *args: Any) -> None: ... # Imprecise signature
+def execlp(path: AnyStr, arg0: AnyStr, *args: AnyStr) -> None: ...
+def execlpe(path: AnyStr, arg0: AnyStr,
+ *args: Any) -> None: ... # Imprecise signature
+def execv(path: AnyStr, args: Union[Tuple[AnyStr], List[AnyStr]]) -> None: ...
+def execve(path: AnyStr, args: Union[Tuple[AnyStr], List[AnyStr]], env: Mapping[AnyStr, AnyStr]) -> None: ...
+def execvp(file: AnyStr, args: Union[Tuple[AnyStr], List[AnyStr]]) -> None: ...
+def execvpe(file: AnyStr, args: Union[Tuple[AnyStr], List[AnyStr]],
+ env: Mapping[str, str]) -> None: ...
+def _exit(n: int) -> NoReturn: ...
+def fork() -> int: ... # Unix only
+def forkpty() -> Tuple[int, int]: ... # some flavors of Unix
+def kill(pid: int, sig: int) -> None: ...
+def killpg(pgid: int, sig: int) -> None: ... # Unix only
+def nice(increment: int) -> int: ... # Unix only
+def plock(op: int) -> None: ... # Unix only ???op is int?
+
+class popen(_TextIOWrapper):
+ # TODO 'b' modes or bytes command not accepted?
+ def __init__(self, command: str, mode: str = ...,
+ bufsize: int = ...) -> None: ...
+ def close(self) -> Any: ... # may return int
+
+def spawnl(mode: int, path: AnyStr, arg0: AnyStr, *args: AnyStr) -> int: ...
+def spawnle(mode: int, path: AnyStr, arg0: AnyStr,
+ *args: Any) -> int: ... # Imprecise sig
+def spawnlp(mode: int, file: AnyStr, arg0: AnyStr,
+ *args: AnyStr) -> int: ... # Unix only TODO
+def spawnlpe(mode: int, file: AnyStr, arg0: AnyStr, *args: Any) -> int:
+ ... # Imprecise signature; Unix only TODO
+def spawnv(mode: int, path: AnyStr, args: List[AnyStr]) -> int: ...
+def spawnve(mode: int, path: AnyStr, args: List[AnyStr],
+ env: Mapping[str, str]) -> int: ...
+def spawnvp(mode: int, file: AnyStr, args: List[AnyStr]) -> int: ... # Unix only
+def spawnvpe(mode: int, file: AnyStr, args: List[AnyStr],
+ env: Mapping[str, str]) -> int:
+ ... # Unix only
+def startfile(path: str, operation: Union[str, None] = ...) -> None: ... # Windows only
+def system(command: AnyStr) -> int: ...
+def times() -> Tuple[float, float, float, float, float]: ...
+def wait() -> Tuple[int, int]: ... # Unix only
+def waitpid(pid: int, options: int) -> Tuple[int, int]: ...
+def wait3(options: Union[int, None] = ...) -> Tuple[int, int, Any]: ... # Unix only
+def wait4(pid: int, options: int) -> Tuple[int, int, Any]:
+ ... # Unix only
+def WCOREDUMP(status: int) -> bool: ... # Unix only
+def WIFCONTINUED(status: int) -> bool: ... # Unix only
+def WIFSTOPPED(status: int) -> bool: ... # Unix only
+def WIFSIGNALED(status: int) -> bool: ... # Unix only
+def WIFEXITED(status: int) -> bool: ... # Unix only
+def WEXITSTATUS(status: int) -> bool: ... # Unix only
+def WSTOPSIG(status: int) -> bool: ... # Unix only
+def WTERMSIG(status: int) -> bool: ... # Unix only
+def confstr(name: str) -> str: ... # Unix only
+def getloadavg() -> Tuple[float, float, float]: ... # Unix only
+def sysconf(name: str) -> int: ... # Unix only
+def urandom(n: int) -> bytes: ...
+
+def sched_getaffinity(id: int) -> Set[int]: ...
+class waitresult:
+ si_pid = 0
+def waitid(idtype: int, id: int, options: int) -> waitresult: ...
+P_ALL = 0
+WEXITED = 0
+WNOWAIT = 0
+
+if sys.version_info >= (3, 3):
+ def sync() -> None: ... # Unix only
+
+ def truncate(path: Union[AnyStr, int], length: int) -> None: ... # Unix only up to version 3.4
+
+ def fwalk(top: AnyStr = ..., topdown: bool = ...,
+ onerror: Callable = ..., *, follow_symlinks: bool = ...,
+ dir_fd: int = ...) -> Iterator[Tuple[AnyStr, List[AnyStr],
+ List[AnyStr], int]]: ... # Unix only
+
+if sys.version_info >= (3, 4):
+ def cpu_count() -> Optional[int]: ...
diff --git a/typeshed/stdlib/3/os/path.pyi b/typeshed/stdlib/3/os/path.pyi
new file mode 100644
index 0000000..c695c57
--- /dev/null
+++ b/typeshed/stdlib/3/os/path.pyi
@@ -0,0 +1,65 @@
+# Stubs for os.path
+# Ron Murawski <ron at horizonchess.com>
+
+# based on http://docs.python.org/3.2/library/os.path.html
+
+import sys
+from typing import overload, List, Any, AnyStr, Sequence, Tuple, BinaryIO, TextIO
+
+# ----- os.path variables -----
+supports_unicode_filenames = False
+# aliases (also in os)
+curdir = ... # type: str
+pardir = ... # type: str
+sep = ... # type: str
+altsep = ... # type: str
+extsep = ... # type: str
+pathsep = ... # type: str
+defpath = ... # type: str
+devnull = ... # type: str
+
+# ----- os.path function stubs -----
+def abspath(path: AnyStr) -> AnyStr: ...
+def basename(path: AnyStr) -> AnyStr: ...
+
+if sys.version_info >= (3, 5):
+ def commonpath(paths: Sequence[AnyStr]) -> AnyStr: ...
+
+# NOTE: Empty List[bytes] results in '' (str) => fall back to Any return type.
+def commonprefix(list: List[AnyStr]) -> Any: ...
+def dirname(path: AnyStr) -> AnyStr: ...
+def exists(path: AnyStr) -> bool: ...
+def lexists(path: AnyStr) -> bool: ...
+def expanduser(path: AnyStr) -> AnyStr: ...
+def expandvars(path: AnyStr) -> AnyStr: ...
+
+
+# These return float if os.stat_float_times() == True
+def getatime(path: AnyStr) -> Any: ...
+def getmtime(path: AnyStr) -> Any: ...
+def getctime(path: AnyStr) -> Any: ...
+
+def getsize(path: AnyStr) -> int: ...
+def isabs(path: AnyStr) -> bool: ...
+def isfile(path: AnyStr) -> bool: ...
+def isdir(path: AnyStr) -> bool: ...
+def islink(path: AnyStr) -> bool: ...
+def ismount(path: AnyStr) -> bool: ...
+
+def join(path: AnyStr, *paths: AnyStr) -> AnyStr: ...
+
+def normcase(path: AnyStr) -> AnyStr: ...
+def normpath(path: AnyStr) -> AnyStr: ...
+def realpath(path: AnyStr) -> AnyStr: ...
+def relpath(path: AnyStr, start: AnyStr = ...) -> AnyStr: ...
+
+def samefile(path1: AnyStr, path2: AnyStr) -> bool: ...
+def sameopenfile(fp1: int, fp2: int) -> bool: ...
+# def samestat(stat1: stat_result,
+# stat2: stat_result) -> bool: ... # Unix only
+
+def split(path: AnyStr) -> Tuple[AnyStr, AnyStr]: ...
+def splitdrive(path: AnyStr) -> Tuple[AnyStr, AnyStr]: ...
+def splitext(path: AnyStr) -> Tuple[AnyStr, AnyStr]: ...
+
+# def splitunc(path: str) -> Tuple[str, str]: ... # Windows only, deprecated
diff --git a/typeshed/stdlib/3/pdb.pyi b/typeshed/stdlib/3/pdb.pyi
new file mode 100644
index 0000000..1c375fe
--- /dev/null
+++ b/typeshed/stdlib/3/pdb.pyi
@@ -0,0 +1,30 @@
+# Stub for pdb (incomplete, only some global functions)
+
+from typing import Any, Dict
+
+def run(statement: str,
+ globals: Dict[str, Any] = None,
+ locals: Dict[str, Any] = None) -> None:
+ ...
+
+def runeval(expression: str,
+ globals: Dict[str, Any] = None,
+ locals: Dict[str, Any] = None) -> Any:
+ ...
+
+def runctx(statement: str,
+ globals: Dict[str, Any],
+ locals: Dict[str, Any]) -> None:
+ ...
+
+def runcall(*args: Any, **kwds: Any) -> Any:
+ ...
+
+def set_trace() -> None:
+ ...
+
+def post_mortem(t: Any = None) -> None:
+ ...
+
+def pm() -> None:
+ ...
diff --git a/typeshed/stdlib/3/pickle.pyi b/typeshed/stdlib/3/pickle.pyi
new file mode 100644
index 0000000..e6a14b2
--- /dev/null
+++ b/typeshed/stdlib/3/pickle.pyi
@@ -0,0 +1,67 @@
+# Stubs for pickle
+
+from typing import Any, IO, Union, Tuple, Callable, Optional, Iterator
+# Imports used in type comments only.
+from typing import Mapping # noqa
+
+HIGHEST_PROTOCOL = ... # type: int
+DEFAULT_PROTOCOL = ... # type: int
+
+
+def dump(obj: Any, file: IO[bytes], protocol: int = None, *,
+ fix_imports: bool = ...) -> None: ...
+
+
+def dumps(obj: Any, protocol: int = ..., *,
+ fix_imports: bool = ...) -> bytes: ...
+
+
+def loads(bytes_object: bytes, *, fix_imports: bool = ...,
+ encoding: str = ..., errors: str = ...) -> Any: ...
+
+
+def load(file: IO[bytes], *, fix_imports: bool = ..., encoding: str = ...,
+ errors: str = ...) -> Any: ...
+
+
+class PickleError(Exception):
+ pass
+
+
+class PicklingError(PickleError):
+ pass
+
+
+class UnpicklingError(PickleError):
+ pass
+
+
+_reducedtype = Union[str,
+ Tuple[Callable[..., Any], Tuple],
+ Tuple[Callable[..., Any], Tuple, Any],
+ Tuple[Callable[..., Any], Tuple, Any,
+ Optional[Iterator]],
+ Tuple[Callable[..., Any], Tuple, Any,
+ Optional[Iterator], Optional[Iterator]]]
+
+
+class Pickler:
+ dispatch_table = ... # type: Mapping[type, Callable[[Any], _reducedtype]]
+
+ def __init__(self, file: IO[bytes], protocol: int = None, *,
+ fix_imports: bool = ...) -> None: ...
+
+ def dump(self, obj: Any) -> None: ...
+
+ def persistent_id(self, obj: Any) -> Any: ...
+
+
+class Unpickler:
+ def __init__(self, file: IO[bytes], *, fix_imports: bool = ...,
+ encoding: str = ..., errors: str = ...) -> None: ...
+
+ def load(self) -> Any: ...
+
+ def persistent_load(self, pid: Any) -> Any: ...
+
+ def find_class(self, module: str, name: str) -> Any: ...
diff --git a/typeshed/stdlib/3/pipes.pyi b/typeshed/stdlib/3/pipes.pyi
new file mode 100644
index 0000000..62163d6
--- /dev/null
+++ b/typeshed/stdlib/3/pipes.pyi
@@ -0,0 +1,19 @@
+# Stubs for pipes
+
+# Based on http://docs.python.org/3.5/library/pipes.html
+
+import os
+
+class Template:
+ def __init__(self) -> None: ...
+ def reset(self) -> None: ...
+ def clone(self) -> 'Template': ...
+ def debug(self, flag: bool) -> None: ...
+ def append(self, cmd: str, kind: str) -> None: ...
+ def prepend(self, cmd: str, kind: str) -> None: ...
+ def open(self, file: str, rw: str) -> os.popen: ...
+ def copy(self, file: str, rw: str) -> os.popen: ...
+
+# Not documented, but widely used.
+# Documented as shlex.quote since 3.3.
+def quote(s: str) -> str: ...
diff --git a/typeshed/stdlib/3/platform.pyi b/typeshed/stdlib/3/platform.pyi
new file mode 100644
index 0000000..728e259
--- /dev/null
+++ b/typeshed/stdlib/3/platform.pyi
@@ -0,0 +1,34 @@
+# Stubs for platform (Python 3.5)
+
+from os import devnull as DEV_NULL
+from os import popen
+from typing import Tuple, NamedTuple
+
+def libc_ver(executable: str = ..., lib: str = ..., version: str = ..., chunksize: int = ...) -> Tuple[str, str]: ...
+def linux_distribution(distname: str = ..., version: str = ..., id: str = ..., supported_dists: Tuple[str, ...] = ..., full_distribution_name: bool = ...) -> Tuple[str, str, str]: ...
+def dist(distname: str = ..., version: str = ..., id: str = ..., supported_dists: Tuple[str, ...] = ...) -> Tuple[str, str, str]: ...
+def win32_ver(release: str = ..., version: str = ..., csd: str = ..., ptype: str = ...) -> Tuple[str, str, str, str]: ...
+def mac_ver(release: str = ..., versioninfo: Tuple[str, str, str] = ..., machine: str = ...) -> Tuple[str, Tuple[str, str, str], str]: ...
+def java_ver(release: str = ..., vendor: str = ..., vminfo: Tuple[str, str, str] = ..., osinfo: Tuple[str, str, str] = ...) -> Tuple[str, str, Tuple[str, str, str], Tuple[str, str, str]]: ...
+def system_alias(system: str, release: str, version: str) -> Tuple[str, str, str]: ...
+def architecture(executable: str = ..., bits: str = ..., linkage: str = ...) -> Tuple[str, str]: ...
+
+uname_result = NamedTuple('uname_result', [('system', str), ('node', str), ('release', str), ('version', str), ('machine', str), ('processor', str)])
+
+def uname() -> uname_result: ...
+def system() -> str: ...
+def node() -> str: ...
+def release() -> str: ...
+def version() -> str: ...
+def machine() -> str: ...
+def processor() -> str: ...
+
+def python_implementation() -> str: ...
+def python_version() -> str: ...
+def python_version_tuple() -> Tuple[str, str, str]: ...
+def python_branch() -> str: ...
+def python_revision() -> str: ...
+def python_build() -> Tuple[str, str]: ...
+def python_compiler() -> str: ...
+
+def platform(aliased: bool = ..., terse: bool = ...) -> str: ...
diff --git a/typeshed/stdlib/3/posix.pyi b/typeshed/stdlib/3/posix.pyi
new file mode 100644
index 0000000..03e4523
--- /dev/null
+++ b/typeshed/stdlib/3/posix.pyi
@@ -0,0 +1,6 @@
+# Stubs for posix
+
+# NOTE: These are incomplete!
+
+import typing
+from os import stat_result
diff --git a/typeshed/stdlib/3/posixpath.pyi b/typeshed/stdlib/3/posixpath.pyi
new file mode 100644
index 0000000..7d8bb09
--- /dev/null
+++ b/typeshed/stdlib/3/posixpath.pyi
@@ -0,0 +1,46 @@
+# Stubs for os.path
+# Ron Murawski <ron at horizonchess.com>
+
+# based on http://docs.python.org/3.2/library/os.path.html
+
+from typing import Any, List, Tuple, IO
+
+# ----- os.path variables -----
+supports_unicode_filenames = False
+
+# ----- os.path function stubs -----
+def abspath(path: str) -> str: ...
+def basename(path) -> str: ...
+def commonprefix(list: List[str]) -> str: ...
+def dirname(path: str) -> str: ...
+def exists(path: str) -> bool: ...
+def lexists(path: str) -> bool: ...
+def expanduser(path: str) -> str: ...
+def expandvars(path: str) -> str: ...
+def getatime(path: str) -> int:
+ ... # return float if os.stat_float_times() returns True
+def getmtime(path: str) -> int:
+ ... # return float if os.stat_float_times() returns True
+def getctime(path: str) -> int:
+ ... # return float if os.stat_float_times() returns True
+def getsize(path: str) -> int: ...
+def isabs(path: str) -> bool: ...
+def isfile(path: str) -> bool: ...
+def isdir(path: str) -> bool: ...
+def islink(path: str) -> bool: ...
+def ismount(path: str) -> bool: ...
+def join(path: str, *paths: str) -> str: ...
+def normcase(path: str) -> str: ...
+def normpath(path: str) -> str: ...
+def realpath(path: str) -> str: ...
+def relpath(path: str, start: str = ...) -> str: ...
+def samefile(path1: str, path2: str) -> bool: ...
+
+def sameopenfile(fp1: IO[Any], fp2: IO[Any]) -> bool: ...
+
+# def samestat(stat1: stat_result, stat2: stat_result) -> bool:
+# ... # Unix only
+def split(path: str) -> Tuple[str, str]: ...
+def splitdrive(path: str) -> Tuple[str, str]: ...
+def splitext(path: str) -> Tuple[str, str]: ...
+# def splitunc(path: str) -> Tuple[str, str] : ... # Windows only, deprecated
diff --git a/typeshed/stdlib/3/pprint.pyi b/typeshed/stdlib/3/pprint.pyi
new file mode 100644
index 0000000..b846ff9
--- /dev/null
+++ b/typeshed/stdlib/3/pprint.pyi
@@ -0,0 +1,23 @@
+# Stubs for pprint
+
+# Based on http://docs.python.org/3.2/library/pprint.html
+
+from typing import Any, Dict, Tuple, IO
+
+def pformat(o: object, indent: int = ..., width: int = ...,
+ depth: int = ...) -> str: ...
+def pprint(o: object, stream: IO[str] = ..., indent: int = ..., width: int = ...,
+ depth: int = ...) -> None: ...
+def isreadable(o: object) -> bool: ...
+def isrecursive(o: object) -> bool: ...
+def saferepr(o: object) -> str: ...
+
+class PrettyPrinter:
+ def __init__(self, indent: int = ..., width: int = ..., depth: int = ...,
+ stream: IO[str] = ...) -> None: ...
+ def pformat(self, o: object) -> str: ...
+ def pprint(self, o: object) -> None: ...
+ def isreadable(self, o: object) -> bool: ...
+ def isrecursive(self, o: object) -> bool: ...
+ def format(self, o: object, context: Dict[int, Any], maxlevels: int,
+ level: int) -> Tuple[str, bool, bool]: ...
diff --git a/typeshed/stdlib/3/pwd.pyi b/typeshed/stdlib/3/pwd.pyi
new file mode 100644
index 0000000..a5a8171
--- /dev/null
+++ b/typeshed/stdlib/3/pwd.pyi
@@ -0,0 +1,18 @@
+# Stubs for pwd
+
+# NOTE: These are incomplete!
+
+import typing
+
+class struct_passwd:
+ # TODO use namedtuple
+ pw_name = ... # type: str
+ pw_passwd = ... # type: str
+ pw_uid = 0
+ pw_gid = 0
+ pw_gecos = ... # type: str
+ pw_dir = ... # type: str
+ pw_shell = ... # type: str
+
+def getpwuid(uid: int) -> struct_passwd: ...
+def getpwnam(name: str) -> struct_passwd: ...
diff --git a/typeshed/stdlib/3/pyclbr.pyi b/typeshed/stdlib/3/pyclbr.pyi
new file mode 100644
index 0000000..03c83f9
--- /dev/null
+++ b/typeshed/stdlib/3/pyclbr.pyi
@@ -0,0 +1,40 @@
+from typing import List, Union, Sequence, Optional, Dict
+
+
+class Class:
+ module = ... # type: str
+ name = ... # type: str
+ super = Optional[List[Union["Class", str]]]
+ methods = ... # type: Dict[str, int]
+ file = ... # type: int
+ lineno = ... # type: int
+
+ def __init__(self,
+ module: str,
+ name: str,
+ super: Optional[List[Union["Class", str]]],
+ file: str,
+ lineno: int) -> None: ...
+
+
+class Function:
+ module = ... # type: str
+ name = ... # type: str
+ file = ... # type: int
+ lineno = ... # type: int
+
+ def __init__(self,
+ module: str,
+ name: str,
+ file: str,
+ lineno: int) -> None: ...
+
+
+def readmodule(module: str,
+ path: Optional[Sequence[str]] = ...
+ ) -> Dict[str, Class]: ...
+
+
+def readmodule_ex(module: str,
+ path: Optional[Sequence[str]] = ...
+ ) -> Dict[str, Union[Class, Function, List[str]]]: ...
diff --git a/typeshed/stdlib/3/queue.pyi b/typeshed/stdlib/3/queue.pyi
new file mode 100644
index 0000000..f85490d
--- /dev/null
+++ b/typeshed/stdlib/3/queue.pyi
@@ -0,0 +1,24 @@
+# Stubs for queue
+
+# NOTE: These are incomplete!
+
+from typing import Any, TypeVar, Generic, Optional
+
+_T = TypeVar('_T')
+
+class Empty(Exception): ...
+class Full(Exception): ...
+
+class Queue(Generic[_T]):
+ def __init__(self, maxsize: int = ...) -> None: ...
+ def full(self) -> bool: ...
+ def get(self, block: bool = ..., timeout: Optional[float] = ...) -> _T: ...
+ def get_nowait(self) -> _T: ...
+ def put(self, item: _T, block: bool = ..., timeout: Optional[float] = ...) -> None: ...
+ def put_nowait(self, item: _T) -> None: ...
+ def join(self) -> None: ...
+ def qsize(self) -> int: ...
+ def task_done(self) -> None: pass
+
+class PriorityQueue(Queue): ...
+class LifoQueue(Queue): ...
diff --git a/typeshed/stdlib/3/random.pyi b/typeshed/stdlib/3/random.pyi
new file mode 100644
index 0000000..f40d973
--- /dev/null
+++ b/typeshed/stdlib/3/random.pyi
@@ -0,0 +1,67 @@
+# Stubs for random
+# Ron Murawski <ron at horizonchess.com>
+# Updated by Jukka Lehtosalo
+
+# based on http://docs.python.org/3.2/library/random.html
+
+# ----- random classes -----
+
+import _random
+from typing import (
+ Any, TypeVar, Sequence, List, Callable, AbstractSet, Union
+)
+
+_T = TypeVar('_T')
+
+class Random(_random.Random):
+ def __init__(self, x: Any = ...) -> None: ...
+ def seed(self, a: Any = ..., version: int = ...) -> None: ...
+ def getstate(self) -> tuple: ...
+ def setstate(self, state: tuple) -> None: ...
+ def getrandbits(self, k: int) -> int: ...
+ def randrange(self, start: int, stop: Union[int, None] = ..., step: int = ...) -> int: ...
+ def randint(self, a: int, b: int) -> int: ...
+ def choice(self, seq: Sequence[_T]) -> _T: ...
+ def shuffle(self, x: List[Any], random: Union[Callable[[], float], None] = ...) -> None: ...
+ def sample(self, population: Union[Sequence[_T], AbstractSet[_T]], k: int) -> List[_T]: ...
+ def random(self) -> float: ...
+ def uniform(self, a: float, b: float) -> float: ...
+ def triangular(self, low: float = ..., high: float = ...,
+ mode: float = ...) -> float: ...
+ def betavariate(self, alpha: float, beta: float) -> float: ...
+ def expovariate(self, lambd: float) -> float: ...
+ def gammavariate(self, alpha: float, beta: float) -> float: ...
+ def gauss(self, mu: float, sigma: float) -> float: ...
+ def lognormvariate(self, mu: float, sigma: float) -> float: ...
+ def normalvariate(self, mu: float, sigma: float) -> float: ...
+ def vonmisesvariate(self, mu: float, kappa: float) -> float: ...
+ def paretovariate(self, alpha: float) -> float: ...
+ def weibullvariate(self, alpha: float, beta: float) -> float: ...
+
+# SystemRandom is not implemented for all OS's; good on Windows & Linux
+class SystemRandom(Random):
+ ...
+
+# ----- random function stubs -----
+def seed(a: Any = ..., version: int = ...) -> None: ...
+def getstate() -> object: ...
+def setstate(state: object) -> None: ...
+def getrandbits(k: int) -> int: ...
+def randrange(start: int, stop: Union[None, int] = ..., step: int = ...) -> int: ...
+def randint(a: int, b: int) -> int: ...
+def choice(seq: Sequence[_T]) -> _T: ...
+def shuffle(x: List[Any], random: Union[Callable[[], float], None] = ...) -> None: ...
+def sample(population: Union[Sequence[_T], AbstractSet[_T]], k: int) -> List[_T]: ...
+def random() -> float: ...
+def uniform(a: float, b: float) -> float: ...
+def triangular(low: float = ..., high: float = ...,
+ mode: float = ...) -> float: ...
+def betavariate(alpha: float, beta: float) -> float: ...
+def expovariate(lambd: float) -> float: ...
+def gammavariate(alpha: float, beta: float) -> float: ...
+def gauss(mu: float, sigma: float) -> float: ...
+def lognormvariate(mu: float, sigma: float) -> float: ...
+def normalvariate(mu: float, sigma: float) -> float: ...
+def vonmisesvariate(mu: float, kappa: float) -> float: ...
+def paretovariate(alpha: float) -> float: ...
+def weibullvariate(alpha: float, beta: float) -> float: ...
diff --git a/typeshed/stdlib/3/re.pyi b/typeshed/stdlib/3/re.pyi
new file mode 100644
index 0000000..5bdd083
--- /dev/null
+++ b/typeshed/stdlib/3/re.pyi
@@ -0,0 +1,106 @@
+# Stubs for re
+# Ron Murawski <ron at horizonchess.com>
+# 'bytes' support added by Jukka Lehtosalo
+
+# based on: http://docs.python.org/3.2/library/re.html
+# and http://hg.python.org/cpython/file/618ea5612e83/Lib/re.py
+
+from typing import (
+ List, Iterator, overload, Callable, Tuple, Sequence, Dict,
+ Generic, AnyStr, Match, Pattern, Any, Optional
+)
+
+# ----- re variables and constants -----
+A = 0
+ASCII = 0
+DEBUG = 0
+I = 0
+IGNORECASE = 0
+L = 0
+LOCALE = 0
+M = 0
+MULTILINE = 0
+S = 0
+DOTALL = 0
+X = 0
+VERBOSE = 0
+U = 0
+UNICODE = 0
+
+class error(Exception): ...
+
+ at overload
+def compile(pattern: AnyStr, flags: int = ...) -> Pattern[AnyStr]: ...
+ at overload
+def compile(pattern: Pattern[AnyStr], flags: int = ...) -> Pattern[AnyStr]: ...
+
+ at overload
+def search(pattern: AnyStr, string: AnyStr, flags: int = ...) -> Match[AnyStr]: ...
+ at overload
+def search(pattern: Pattern[AnyStr], string: AnyStr, flags: int = ...) -> Match[AnyStr]: ...
+
+ at overload
+def match(pattern: AnyStr, string: AnyStr, flags: int = ...) -> Match[AnyStr]: ...
+ at overload
+def match(pattern: Pattern[AnyStr], string: AnyStr, flags: int = ...) -> Match[AnyStr]: ...
+
+# New in Python 3.4
+ at overload
+def fullmatch(pattern: AnyStr, string: AnyStr, flags: int = ...) -> Optional[Match[AnyStr]]: ...
+ at overload
+def fullmatch(pattern: Pattern[AnyStr], string: AnyStr, flags: int = ...) -> Optional[Match[AnyStr]]: ...
+
+ at overload
+def split(pattern: AnyStr, string: AnyStr,
+ maxsplit: int = ..., flags: int = ...) -> List[AnyStr]: ...
+ at overload
+def split(pattern: Pattern[AnyStr], string: AnyStr,
+ maxsplit: int = ..., flags: int = ...) -> List[AnyStr]: ...
+
+ at overload
+def findall(pattern: AnyStr, string: AnyStr, flags: int = ...) -> List[Any]: ...
+ at overload
+def findall(pattern: Pattern[AnyStr], string: AnyStr, flags: int = ...) -> List[Any]: ...
+
+# Return an iterator yielding match objects over all non-overlapping matches
+# for the RE pattern in string. The string is scanned left-to-right, and
+# matches are returned in the order found. Empty matches are included in the
+# result unless they touch the beginning of another match.
+ at overload
+def finditer(pattern: AnyStr, string: AnyStr,
+ flags: int = ...) -> Iterator[Match[AnyStr]]: ...
+ at overload
+def finditer(pattern: Pattern[AnyStr], string: AnyStr,
+ flags: int = ...) -> Iterator[Match[AnyStr]]: ...
+
+ at overload
+def sub(pattern: AnyStr, repl: AnyStr, string: AnyStr, count: int = ...,
+ flags: int = ...) -> AnyStr: ...
+ at overload
+def sub(pattern: AnyStr, repl: Callable[[Match[AnyStr]], AnyStr],
+ string: AnyStr, count: int = ..., flags: int = ...) -> AnyStr: ...
+ at overload
+def sub(pattern: Pattern[AnyStr], repl: AnyStr, string: AnyStr, count: int = ...,
+ flags: int = ...) -> AnyStr: ...
+ at overload
+def sub(pattern: Pattern[AnyStr], repl: Callable[[Match[AnyStr]], AnyStr],
+ string: AnyStr, count: int = ..., flags: int = ...) -> AnyStr: ...
+
+ at overload
+def subn(pattern: AnyStr, repl: AnyStr, string: AnyStr, count: int = ...,
+ flags: int = ...) -> Tuple[AnyStr, int]: ...
+ at overload
+def subn(pattern: AnyStr, repl: Callable[[Match[AnyStr]], AnyStr],
+ string: AnyStr, count: int = ...,
+ flags: int = ...) -> Tuple[AnyStr, int]: ...
+ at overload
+def subn(pattern: Pattern[AnyStr], repl: AnyStr, string: AnyStr, count: int = ...,
+ flags: int = ...) -> Tuple[AnyStr, int]: ...
+ at overload
+def subn(pattern: Pattern[AnyStr], repl: Callable[[Match[AnyStr]], AnyStr],
+ string: AnyStr, count: int = ...,
+ flags: int = ...) -> Tuple[AnyStr, int]: ...
+
+def escape(string: AnyStr) -> AnyStr: ...
+
+def purge() -> None: ...
diff --git a/typeshed/stdlib/3/resource.pyi b/typeshed/stdlib/3/resource.pyi
new file mode 100644
index 0000000..2dcb913
--- /dev/null
+++ b/typeshed/stdlib/3/resource.pyi
@@ -0,0 +1,32 @@
+# Stubs for resource
+
+# NOTE: These are incomplete!
+
+from typing import Tuple
+
+RLIMIT_AS = ... # type: int
+RLIMIT_CORE = ... # type: int
+RLIMIT_CPU = ... # type: int
+RLIMIT_DATA = ... # type: int
+RLIMIT_FSIZE = ... # type: int
+RLIMIT_MEMLOCK = ... # type: int
+RLIMIT_MSGQUEUE = ... # type: int
+RLIMIT_NICE = ... # type: int
+RLIMIT_NOFILE = ... # type: int
+RLIMIT_NPROC = ... # type: int
+RLIMIT_OFILE = ... # type: int
+RLIMIT_RSS = ... # type: int
+RLIMIT_RTPRIO = ... # type: int
+RLIMIT_RTTIME = ... # type: int
+RLIMIT_SIGPENDING = ... # type: int
+RLIMIT_STACK = ... # type: int
+RLIM_INFINITY = ... # type: int
+RUSAGE_CHILDREN = ... # type: int
+RUSAGE_SELF = ... # type: int
+RUSAGE_THREAD = ... # type: int
+
+def getrlimit(resource: int) -> Tuple[int, int]: ...
+def setrlimit(resource: int, limits: Tuple[int, int]) -> None: ...
+
+# NOTE: This is an alias of OSError in Python 3.3.
+class error(Exception): ...
diff --git a/typeshed/stdlib/3/runpy.pyi b/typeshed/stdlib/3/runpy.pyi
new file mode 100644
index 0000000..5768a4c
--- /dev/null
+++ b/typeshed/stdlib/3/runpy.pyi
@@ -0,0 +1,21 @@
+# Stubs for runpy (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class _TempModule:
+ mod_name = ... # type: Any
+ module = ... # type: Any
+ def __init__(self, mod_name): ...
+ def __enter__(self): ...
+ def __exit__(self, *args): ...
+
+class _ModifiedArgv0:
+ value = ... # type: Any
+ def __init__(self, value): ...
+ def __enter__(self): ...
+ def __exit__(self, *args): ...
+
+def run_module(mod_name, init_globals=None, run_name=None, alter_sys=False): ...
+def run_path(path_name, init_globals=None, run_name=None): ...
diff --git a/typeshed/stdlib/3/select.pyi b/typeshed/stdlib/3/select.pyi
new file mode 100644
index 0000000..83446f0
--- /dev/null
+++ b/typeshed/stdlib/3/select.pyi
@@ -0,0 +1,27 @@
+# Stubs for select
+
+# NOTE: These are incomplete!
+
+from typing import Any, Tuple, List, Sequence
+
+class error(Exception): ...
+
+POLLIN = 0
+POLLPRI = 0
+POLLOUT = 0
+POLLERR = 0
+POLLHUP = 0
+POLLNVAL = 0
+
+class poll:
+ def __init__(self) -> None: ...
+ def register(self, fd: Any,
+ eventmask: int = ...) -> None: ...
+ def modify(self, fd: Any, eventmask: int) -> None: ...
+ def unregister(self, fd: Any) -> None: ...
+ def poll(self, timeout: int = ...) -> List[Tuple[int, int]]: ...
+
+def select(rlist: Sequence, wlist: Sequence, xlist: Sequence,
+ timeout: float = ...) -> Tuple[List[Any],
+ List[Any],
+ List[Any]]: ...
diff --git a/typeshed/stdlib/3/shelve.pyi b/typeshed/stdlib/3/shelve.pyi
new file mode 100644
index 0000000..ab6b2d9
--- /dev/null
+++ b/typeshed/stdlib/3/shelve.pyi
@@ -0,0 +1,31 @@
+from typing import Any, Dict, Iterator, Optional, Tuple
+import collections
+
+
+class Shelf(collections.MutableMapping):
+ def __init__(self, dict: Dict[bytes, Any], protocol: Optional[int] = None, writeback: bool = ..., keyencoding: str = 'utf-8') -> None: ...
+ def __iter__(self) -> Iterator[str]: ...
+ def __len__(self) -> int: ...
+ def __contains__(self, key: Any) -> bool: ... # key should be str, but it would conflict with superclass's type signature
+ def get(self, key: str, default: Any = None) -> Any: ...
+ def __getitem__(self, key: str) -> Any: ...
+ def __setitem__(self, key: str, value: Any) -> None: ...
+ def __delitem__(self, key: str) -> None: ...
+ def __enter__(self) -> Shelf: ...
+ def __exit__(self, type: Any, value: Any, traceback: Any) -> None: ...
+ def close(self) -> None: ...
+ def __del__(self) -> None: ...
+ def sync(self) -> None: ...
+
+class BsdDbShelf(Shelf):
+ def __init__(self, dict: Dict[bytes, Any], protocol: Optional[int] = None, writeback: bool = ..., keyencoding: str = 'utf-8') -> None: ...
+ def set_location(self, key: Any) -> Tuple[str, Any]: ...
+ def next(self) -> Tuple[str, Any]: ...
+ def previous(self) -> Tuple[str, Any]: ...
+ def first(self) -> Tuple[str, Any]: ...
+ def last(self) -> Tuple[str, Any]: ...
+
+class DbfilenameShelf(Shelf):
+ def __init__(self, filename: str, flag: str = 'c', protocol: Optional[int] = None, writeback: bool = ...) -> None: ...
+
+def open(filename: str, flag: str = 'c', protocol: Optional[int] = None, writeback: bool = ...) -> DbfilenameShelf: ...
diff --git a/typeshed/stdlib/3/shlex.pyi b/typeshed/stdlib/3/shlex.pyi
new file mode 100644
index 0000000..db99fc6
--- /dev/null
+++ b/typeshed/stdlib/3/shlex.pyi
@@ -0,0 +1,39 @@
+# Stubs for shlex
+
+# Based on http://docs.python.org/3.2/library/shlex.html
+
+from typing import List, Tuple, Any, TextIO
+
+def split(s: str, comments: bool = ...,
+ posix: bool = ...) -> List[str]: ...
+
+# Added in 3.3, use (undocumented) pipes.quote in previous versions.
+def quote(s: str) -> str: ...
+
+class shlex:
+ commenters = ... # type: str
+ wordchars = ... # type: str
+ whitespace = ... # type: str
+ escape = ... # type: str
+ quotes = ... # type: str
+ escapedquotes = ... # type: str
+ whitespace_split = ... # type: bool
+ infile = ... # type: str
+ instream = ... # type: TextIO
+ source = ... # type: str
+ debug = 0
+ lineno = 0
+ token = ... # type: str
+ eof = ... # type: str
+
+ def __init__(self, instream=..., infile=...,
+ posix: bool = ...) -> None: ...
+ def get_token(self) -> str: ...
+ def push_token(self, tok: str) -> None: ...
+ def read_token(self) -> str: ...
+ def sourcehook(self, filename: str) -> Tuple[str, TextIO]: ...
+ # TODO argument types
+ def push_source(self, newstream: Any, newfile: Any = ...) -> None: ...
+ def pop_source(self) -> None: ...
+ def error_leader(self, infile: str = ...,
+ lineno: int = ...) -> None: ...
diff --git a/typeshed/stdlib/3/shutil.pyi b/typeshed/stdlib/3/shutil.pyi
new file mode 100644
index 0000000..1b917e6
--- /dev/null
+++ b/typeshed/stdlib/3/shutil.pyi
@@ -0,0 +1,51 @@
+# Stubs for shutil
+import sys
+
+# Based on http://docs.python.org/3.2/library/shutil.html
+
+# 'bytes' paths are not properly supported: they don't work with all functions,
+# sometimes they only work partially (broken exception messages), and the test
+# cases don't use them.
+
+from typing import List, Iterable, Callable, Any, Tuple, Sequence, IO, AnyStr, Optional
+
+def copyfileobj(fsrc: IO[AnyStr], fdst: IO[AnyStr],
+ length: int = ...) -> None: ...
+
+def copyfile(src: str, dst: str) -> None: ...
+def copymode(src: str, dst: str) -> None: ...
+def copystat(src: str, dst: str) -> None: ...
+def copy(src: str, dst: str) -> None: ...
+def copy2(src: str, dst: str) -> None: ...
+def ignore_patterns(*patterns: str) -> Callable[[str, List[str]],
+ Iterable[str]]: ...
+def copytree(src: str, dst: str, symlinks: bool = ...,
+ ignore: Optional[Callable[[str, List[str]], Iterable[str]]] = ...,
+ copy_function: Callable[[str, str], None] = ...,
+ ignore_dangling_symlinks: bool = ...) -> None: ...
+def rmtree(path: str, ignore_errors: bool = ...,
+ onerror: Callable[[Any, str, Any], None] = ...) -> None: ...
+def move(src: str, dst: str) -> None: ...
+
+class Error(Exception): ...
+if sys.version_info >= (3, 4):
+ class SameFileError(Error): ...
+
+def make_archive(base_name: str, format: str, root_dir: str = ...,
+ base_dir: str = ..., verbose: bool = ...,
+ dry_run: bool = ..., owner: str = ..., group: str = ...,
+ logger: Any = ...) -> str: ...
+def get_archive_formats() -> List[Tuple[str, str]]: ...
+def register_archive_format(name: str, function: Any,
+ extra_args: Sequence[Tuple[str, Any]] = ...,
+ description: str = ...) -> None: ...
+def unregister_archive_format(name: str) -> None: ...
+def unpack_archive(filename: str, extract_dir: str = ...,
+ format: str = ...) -> None: ...
+def register_unpack_format(name: str, extensions: List[str], function: Any,
+ extra_args: Sequence[Tuple[str, Any]] = ...,
+ description: str = ...) -> None: ...
+def unregister_unpack_format(name: str) -> None: ...
+def get_unpack_formats() -> List[Tuple[str, List[str], str]]: ...
+
+def which(cmd: str, mode: int = ..., path: str = ...) -> Optional[str]: ...
diff --git a/typeshed/stdlib/3/signal.pyi b/typeshed/stdlib/3/signal.pyi
new file mode 100644
index 0000000..41bbd11
--- /dev/null
+++ b/typeshed/stdlib/3/signal.pyi
@@ -0,0 +1,180 @@
+"""Stub file for the 'signal' module."""
+
+import sys
+from enum import IntEnum
+from typing import Any, Callable, List, Tuple, Dict, Generic, Union, Optional, Iterable, Set
+from types import FrameType
+
+class ItimerError(IOError): ...
+
+ITIMER_PROF = ... # type: int
+ITIMER_REAL = ... # type: int
+ITIMER_VIRTUAL = ... # type: int
+
+NSIG = ... # type: int
+
+if sys.version_info >= (3, 5):
+ class Signals(IntEnum):
+ SIGABRT = ...
+ SIGALRM = ...
+ SIGBUS = ...
+ SIGCHLD = ...
+ SIGCLD = ...
+ SIGCONT = ...
+ SIGFPE = ...
+ SIGHUP = ...
+ SIGILL = ...
+ SIGINT = ...
+ SIGIO = ...
+ SIGIOT = ...
+ SIGKILL = ...
+ SIGPIPE = ...
+ SIGPOLL = ...
+ SIGPROF = ...
+ SIGPWR = ...
+ SIGQUIT = ...
+ SIGRTMAX = ...
+ SIGRTMIN = ...
+ SIGSEGV = ...
+ SIGSTOP = ...
+ SIGSYS = ...
+ SIGTERM = ...
+ SIGTRAP = ...
+ SIGTSTP = ...
+ SIGTTIN = ...
+ SIGTTOU = ...
+ SIGURG = ...
+ SIGUSR1 = ...
+ SIGUSR2 = ...
+ SIGVTALRM = ...
+ SIGWINCH = ...
+ SIGXCPU = ...
+ SIGXFSZ = ...
+
+ class Handlers(IntEnum):
+ SIG_DFL = ...
+ SIG_IGN = ...
+
+ SIG_DFL = Handlers.SIG_DFL
+ SIG_IGN = Handlers.SIG_IGN
+
+ class Sigmasks(IntEnum):
+ SIG_BLOCK = ...
+ SIG_UNBLOCK = ...
+ SIG_SETMASK = ...
+
+ SIG_BLOCK = Sigmasks.SIG_BLOCK
+ SIG_UNBLOCK = Sigmasks.SIG_UNBLOCK
+ SIG_SETMASK = Sigmasks.SIG_SETMASK
+
+ _SIG = Signals
+ _SIGNUM = Union[int, Signals]
+ _HANDLER = Union[Callable[[Signals, FrameType], None], int, Handlers, None]
+else:
+ SIG_DFL = ... # type: int
+ SIG_IGN = ... # type: int
+
+ SIG_BLOCK = ... # type: int
+ SIG_UNBLOCK = ... # type: int
+ SIG_SETMASK = ... # type: int
+
+ _SIG = int
+ _SIGNUM = int
+ _HANDLER = Union[Callable[[int, FrameType], None], int, None]
+
+SIGABRT = ... # type: _SIG
+SIGALRM = ... # type: _SIG
+SIGBUS = ... # type: _SIG
+SIGCHLD = ... # type: _SIG
+SIGCLD = ... # type: _SIG
+SIGCONT = ... # type: _SIG
+SIGFPE = ... # type: _SIG
+SIGHUP = ... # type: _SIG
+SIGILL = ... # type: _SIG
+SIGINT = ... # type: _SIG
+SIGIO = ... # type: _SIG
+SIGIOT = ... # type: _SIG
+SIGKILL = ... # type: _SIG
+SIGPIPE = ... # type: _SIG
+SIGPOLL = ... # type: _SIG
+SIGPROF = ... # type: _SIG
+SIGPWR = ... # type: _SIG
+SIGQUIT = ... # type: _SIG
+SIGRTMAX = ... # type: _SIG
+SIGRTMIN = ... # type: _SIG
+SIGSEGV = ... # type: _SIG
+SIGSTOP = ... # type: _SIG
+SIGSYS = ... # type: _SIG
+SIGTERM = ... # type: _SIG
+SIGTRAP = ... # type: _SIG
+SIGTSTP = ... # type: _SIG
+SIGTTIN = ... # type: _SIG
+SIGTTOU = ... # type: _SIG
+SIGURG = ... # type: _SIG
+SIGUSR1 = ... # type: _SIG
+SIGUSR2 = ... # type: _SIG
+SIGVTALRM = ... # type: _SIG
+SIGWINCH = ... # type: _SIG
+SIGXCPU = ... # type: _SIG
+SIGXFSZ = ... # type: _SIG
+
+CTRL_C_EVENT = 0 # Windows
+CTRL_BREAK_EVENT = 0 # Windows
+
+class struct_siginfo(Tuple[int, int, int, int, int, int, int]):
+ def __init__(self, sequence: Iterable[int]) -> None: ...
+ @property
+ def si_signo(self) -> int: ...
+ @property
+ def si_code(self) -> int: ...
+ @property
+ def si_errno(self) -> int: ...
+ @property
+ def si_pid(self) -> int: ...
+ @property
+ def si_uid(self) -> int: ...
+ @property
+ def si_status(self) -> int: ...
+ @property
+ def si_band(self) -> int: ...
+
+def alarm(time: int) -> int: ...
+
+def default_int_handler(signum: int, frame: FrameType) -> None:
+ raise KeyboardInterrupt()
+
+def getitimer(which: int) -> Tuple[float, float]: ...
+
+def getsignal(signalnum: _SIGNUM) -> _HANDLER:
+ raise ValueError()
+
+def pause() -> None: ...
+
+def pthread_kill(thread_id: int, signum: int) -> None:
+ raise OSError()
+
+def pthread_sigmask(how: int, mask: Iterable[int]) -> Set[_SIGNUM]:
+ raise OSError()
+
+def set_wakeup_fd(fd: int) -> int: ...
+
+def setitimer(which: int, seconds: float, interval: float = ...) -> Tuple[float, float]: ...
+
+def siginterrupt(signalnum: int, flag: bool) -> None:
+ raise OSError()
+
+def signal(signalnum: _SIGNUM, handler: _HANDLER) -> _HANDLER:
+ raise OSError()
+
+def sigpending() -> Any:
+ raise OSError()
+
+def sigtimedwait(sigset: Iterable[int], timeout: float) -> Optional[struct_siginfo]:
+ raise OSError()
+ raise ValueError()
+
+def sigwait(sigset: Iterable[int]) -> _SIGNUM:
+ raise OSError()
+
+def sigwaitinfo(sigset: Iterable[int]) -> struct_siginfo:
+ raise OSError()
diff --git a/typeshed/stdlib/3/smtplib.pyi b/typeshed/stdlib/3/smtplib.pyi
new file mode 100644
index 0000000..56a4729
--- /dev/null
+++ b/typeshed/stdlib/3/smtplib.pyi
@@ -0,0 +1,94 @@
+# Stubs for smtplib (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class SMTPException(OSError): ...
+class SMTPServerDisconnected(SMTPException): ...
+
+class SMTPResponseException(SMTPException):
+ smtp_code = ... # type: Any
+ smtp_error = ... # type: Any
+ args = ... # type: Any
+ def __init__(self, code, msg) -> None: ...
+
+class SMTPSenderRefused(SMTPResponseException):
+ smtp_code = ... # type: Any
+ smtp_error = ... # type: Any
+ sender = ... # type: Any
+ args = ... # type: Any
+ def __init__(self, code, msg, sender) -> None: ...
+
+class SMTPRecipientsRefused(SMTPException):
+ recipients = ... # type: Any
+ args = ... # type: Any
+ def __init__(self, recipients) -> None: ...
+
+class SMTPDataError(SMTPResponseException): ...
+class SMTPConnectError(SMTPResponseException): ...
+class SMTPHeloError(SMTPResponseException): ...
+class SMTPAuthenticationError(SMTPResponseException): ...
+
+def quoteaddr(addrstring): ...
+def quotedata(data): ...
+
+class SMTP:
+ debuglevel = ... # type: Any
+ file = ... # type: Any
+ helo_resp = ... # type: Any
+ ehlo_msg = ... # type: Any
+ ehlo_resp = ... # type: Any
+ does_esmtp = ... # type: Any
+ default_port = ... # type: Any
+ timeout = ... # type: Any
+ esmtp_features = ... # type: Any
+ source_address = ... # type: Any
+ local_hostname = ... # type: Any
+ def __init__(self, host=..., port=..., local_hostname=..., timeout=...,
+ source_address=...): ...
+ def __enter__(self): ...
+ def __exit__(self, *args): ...
+ def set_debuglevel(self, debuglevel): ...
+ sock = ... # type: Any
+ def connect(self, host=..., port=..., source_address=...): ...
+ def send(self, s): ...
+ def putcmd(self, cmd, args=...): ...
+ def getreply(self): ...
+ def docmd(self, cmd, args=...): ...
+ def helo(self, name=...): ...
+ def ehlo(self, name=...): ...
+ def has_extn(self, opt): ...
+ def help(self, args=...): ...
+ def rset(self): ...
+ def noop(self): ...
+ def mail(self, sender, options=...): ...
+ def rcpt(self, recip, options=...): ...
+ def data(self, msg): ...
+ def verify(self, address): ...
+ vrfy = ... # type: Any
+ def expn(self, address): ...
+ def ehlo_or_helo_if_needed(self): ...
+ def login(self, user, password): ...
+ def starttls(self, keyfile=..., certfile=..., context=...): ...
+ def sendmail(self, from_addr, to_addrs, msg, mail_options=...,
+ rcpt_options=...): ...
+ def send_message(self, msg, from_addr=..., to_addrs=..., mail_options=...,
+ rcpt_options=...): ...
+ def close(self): ...
+ def quit(self): ...
+
+class SMTP_SSL(SMTP):
+ default_port = ... # type: Any
+ keyfile = ... # type: Any
+ certfile = ... # type: Any
+ context = ... # type: Any
+ def __init__(self, host=..., port=..., local_hostname=..., keyfile=..., certfile=...,
+ timeout=..., source_address=..., context=...): ...
+
+class LMTP(SMTP):
+ ehlo_msg = ... # type: Any
+ def __init__(self, host=..., port=..., local_hostname=..., source_address=...) -> None: ...
+ sock = ... # type: Any
+ file = ... # type: Any
+ def connect(self, host=..., port=..., source_address=...): ...
diff --git a/typeshed/stdlib/3/socket.pyi b/typeshed/stdlib/3/socket.pyi
new file mode 100644
index 0000000..4915d8a
--- /dev/null
+++ b/typeshed/stdlib/3/socket.pyi
@@ -0,0 +1,361 @@
+# Stubs for socket
+# Ron Murawski <ron at horizonchess.com>
+
+# based on: http://docs.python.org/3.2/library/socket.html
+# see: http://hg.python.org/cpython/file/3d0686d90f55/Lib/socket.py
+# see: http://nullege.com/codes/search/socket
+
+from typing import Any, Tuple, List, Optional, Union, overload
+
+# ----- variables and constants -----
+
+AF_UNIX = 0
+AF_INET = 0
+AF_INET6 = 0
+SOCK_STREAM = 0
+SOCK_DGRAM = 0
+SOCK_RAW = 0
+SOCK_RDM = 0
+SOCK_SEQPACKET = 0
+SOCK_CLOEXEC = 0
+SOCK_NONBLOCK = 0
+SOMAXCONN = 0
+has_ipv6 = False
+_GLOBAL_DEFAULT_TIMEOUT = 0.0
+SocketType = ... # type: Any
+SocketIO = ... # type: Any
+
+
+# the following constants are included with Python 3.2.3 (Ubuntu)
+# some of the constants may be Linux-only
+# all Windows/Mac-specific constants are absent
+AF_APPLETALK = 0
+AF_ASH = 0
+AF_ATMPVC = 0
+AF_ATMSVC = 0
+AF_AX25 = 0
+AF_BLUETOOTH = 0
+AF_BRIDGE = 0
+AF_DECnet = 0
+AF_ECONET = 0
+AF_IPX = 0
+AF_IRDA = 0
+AF_KEY = 0
+AF_LLC = 0
+AF_NETBEUI = 0
+AF_NETLINK = 0
+AF_NETROM = 0
+AF_PACKET = 0
+AF_PPPOX = 0
+AF_ROSE = 0
+AF_ROUTE = 0
+AF_SECURITY = 0
+AF_SNA = 0
+AF_TIPC = 0
+AF_UNSPEC = 0
+AF_WANPIPE = 0
+AF_X25 = 0
+AI_ADDRCONFIG = 0
+AI_ALL = 0
+AI_CANONNAME = 0
+AI_NUMERICHOST = 0
+AI_NUMERICSERV = 0
+AI_PASSIVE = 0
+AI_V4MAPPED = 0
+BDADDR_ANY = 0
+BDADDR_LOCAL = 0
+BTPROTO_HCI = 0
+BTPROTO_L2CAP = 0
+BTPROTO_RFCOMM = 0
+BTPROTO_SCO = 0
+CAPI = 0
+EAGAIN = 0
+EAI_ADDRFAMILY = 0
+EAI_AGAIN = 0
+EAI_BADFLAGS = 0
+EAI_FAIL = 0
+EAI_FAMILY = 0
+EAI_MEMORY = 0
+EAI_NODATA = 0
+EAI_NONAME = 0
+EAI_OVERFLOW = 0
+EAI_SERVICE = 0
+EAI_SOCKTYPE = 0
+EAI_SYSTEM = 0
+EBADF = 0
+EINTR = 0
+EWOULDBLOCK = 0
+HCI_DATA_DIR = 0
+HCI_FILTER = 0
+HCI_TIME_STAMP = 0
+INADDR_ALLHOSTS_GROUP = 0
+INADDR_ANY = 0
+INADDR_BROADCAST = 0
+INADDR_LOOPBACK = 0
+INADDR_MAX_LOCAL_GROUP = 0
+INADDR_NONE = 0
+INADDR_UNSPEC_GROUP = 0
+IPPORT_RESERVED = 0
+IPPORT_USERRESERVED = 0
+IPPROTO_AH = 0
+IPPROTO_DSTOPTS = 0
+IPPROTO_EGP = 0
+IPPROTO_ESP = 0
+IPPROTO_FRAGMENT = 0
+IPPROTO_GRE = 0
+IPPROTO_HOPOPTS = 0
+IPPROTO_ICMP = 0
+IPPROTO_ICMPV6 = 0
+IPPROTO_IDP = 0
+IPPROTO_IGMP = 0
+IPPROTO_IP = 0
+IPPROTO_IPIP = 0
+IPPROTO_IPV6 = 0
+IPPROTO_NONE = 0
+IPPROTO_PIM = 0
+IPPROTO_PUP = 0
+IPPROTO_RAW = 0
+IPPROTO_ROUTING = 0
+IPPROTO_RSVP = 0
+IPPROTO_TCP = 0
+IPPROTO_TP = 0
+IPPROTO_UDP = 0
+IPV6_CHECKSUM = 0
+IPV6_DSTOPTS = 0
+IPV6_HOPLIMIT = 0
+IPV6_HOPOPTS = 0
+IPV6_JOIN_GROUP = 0
+IPV6_LEAVE_GROUP = 0
+IPV6_MULTICAST_HOPS = 0
+IPV6_MULTICAST_IF = 0
+IPV6_MULTICAST_LOOP = 0
+IPV6_NEXTHOP = 0
+IPV6_PKTINFO = 0
+IPV6_RECVDSTOPTS = 0
+IPV6_RECVHOPLIMIT = 0
+IPV6_RECVHOPOPTS = 0
+IPV6_RECVPKTINFO = 0
+IPV6_RECVRTHDR = 0
+IPV6_RECVTCLASS = 0
+IPV6_RTHDR = 0
+IPV6_RTHDRDSTOPTS = 0
+IPV6_RTHDR_TYPE_0 = 0
+IPV6_TCLASS = 0
+IPV6_UNICAST_HOPS = 0
+IPV6_V6ONLY = 0
+IP_ADD_MEMBERSHIP = 0
+IP_DEFAULT_MULTICAST_LOOP = 0
+IP_DEFAULT_MULTICAST_TTL = 0
+IP_DROP_MEMBERSHIP = 0
+IP_HDRINCL = 0
+IP_MAX_MEMBERSHIPS = 0
+IP_MULTICAST_IF = 0
+IP_MULTICAST_LOOP = 0
+IP_MULTICAST_TTL = 0
+IP_OPTIONS = 0
+IP_RECVOPTS = 0
+IP_RECVRETOPTS = 0
+IP_RETOPTS = 0
+IP_TOS = 0
+IP_TTL = 0
+MSG_CTRUNC = 0
+MSG_DONTROUTE = 0
+MSG_DONTWAIT = 0
+MSG_EOR = 0
+MSG_OOB = 0
+MSG_PEEK = 0
+MSG_TRUNC = 0
+MSG_WAITALL = 0
+NETLINK_DNRTMSG = 0
+NETLINK_FIREWALL = 0
+NETLINK_IP6_FW = 0
+NETLINK_NFLOG = 0
+NETLINK_ROUTE = 0
+NETLINK_USERSOCK = 0
+NETLINK_XFRM = 0
+NI_DGRAM = 0
+NI_MAXHOST = 0
+NI_MAXSERV = 0
+NI_NAMEREQD = 0
+NI_NOFQDN = 0
+NI_NUMERICHOST = 0
+NI_NUMERICSERV = 0
+PACKET_BROADCAST = 0
+PACKET_FASTROUTE = 0
+PACKET_HOST = 0
+PACKET_LOOPBACK = 0
+PACKET_MULTICAST = 0
+PACKET_OTHERHOST = 0
+PACKET_OUTGOING = 0
+PF_PACKET = 0
+SHUT_RD = 0
+SHUT_RDWR = 0
+SHUT_WR = 0
+SOL_HCI = 0
+SOL_IP = 0
+SOL_SOCKET = 0
+SOL_TCP = 0
+SOL_TIPC = 0
+SOL_UDP = 0
+SO_ACCEPTCONN = 0
+SO_BROADCAST = 0
+SO_DEBUG = 0
+SO_DONTROUTE = 0
+SO_ERROR = 0
+SO_KEEPALIVE = 0
+SO_LINGER = 0
+SO_OOBINLINE = 0
+SO_RCVBUF = 0
+SO_RCVLOWAT = 0
+SO_RCVTIMEO = 0
+SO_REUSEADDR = 0
+SO_SNDBUF = 0
+SO_SNDLOWAT = 0
+SO_SNDTIMEO = 0
+SO_TYPE = 0
+TCP_CORK = 0
+TCP_DEFER_ACCEPT = 0
+TCP_INFO = 0
+TCP_KEEPCNT = 0
+TCP_KEEPIDLE = 0
+TCP_KEEPINTVL = 0
+TCP_LINGER2 = 0
+TCP_MAXSEG = 0
+TCP_NODELAY = 0
+TCP_QUICKACK = 0
+TCP_SYNCNT = 0
+TCP_WINDOW_CLAMP = 0
+TIPC_ADDR_ID = 0
+TIPC_ADDR_NAME = 0
+TIPC_ADDR_NAMESEQ = 0
+TIPC_CFG_SRV = 0
+TIPC_CLUSTER_SCOPE = 0
+TIPC_CONN_TIMEOUT = 0
+TIPC_CRITICAL_IMPORTANCE = 0
+TIPC_DEST_DROPPABLE = 0
+TIPC_HIGH_IMPORTANCE = 0
+TIPC_IMPORTANCE = 0
+TIPC_LOW_IMPORTANCE = 0
+TIPC_MEDIUM_IMPORTANCE = 0
+TIPC_NODE_SCOPE = 0
+TIPC_PUBLISHED = 0
+TIPC_SRC_DROPPABLE = 0
+TIPC_SUBSCR_TIMEOUT = 0
+TIPC_SUB_CANCEL = 0
+TIPC_SUB_PORTS = 0
+TIPC_SUB_SERVICE = 0
+TIPC_TOP_SRV = 0
+TIPC_WAIT_FOREVER = 0
+TIPC_WITHDRAWN = 0
+TIPC_ZONE_SCOPE = 0
+
+
+# ----- exceptions -----
+class error(IOError):
+ ...
+
+class herror(error):
+ def __init__(self, herror: int, string: str) -> None: ...
+
+class gaierror(error):
+ def __init__(self, error: int, string: str) -> None: ...
+
+class timeout(error):
+ ...
+
+
+# Addresses can be either tuples of varying lengths (AF_INET, AF_INET6,
+# AF_NETLINK, AF_TIPC) or strings (AF_UNIX).
+
+# TODO AF_PACKET and AF_BLUETOOTH address objects
+
+
+# ----- classes -----
+class socket:
+ family = 0
+ type = 0
+ proto = 0
+
+ def __init__(self, family: int = ..., type: int = ...,
+ proto: int = ..., fileno: Optional[int] = ...) -> None: ...
+
+ # --- methods ---
+ # second tuple item is an address
+ def accept(self) -> Tuple['socket', Any]: ...
+ def bind(self, address: Union[tuple, str]) -> None: ...
+ def close(self) -> None: ...
+ def connect(self, address: Union[tuple, str]) -> None: ...
+ def connect_ex(self, address: Union[tuple, str]) -> int: ...
+ def detach(self) -> int: ...
+ def fileno(self) -> int: ...
+
+ # return value is an address
+ def getpeername(self) -> Any: ...
+ def getsockname(self) -> Any: ...
+
+ @overload
+ def getsockopt(self, level: int, optname: int) -> int: ...
+ @overload
+ def getsockopt(self, level: int, optname: int, buflen: int) -> bytes: ...
+
+ def gettimeout(self) -> float: ...
+ def ioctl(self, control: object,
+ option: Tuple[int, int, int]) -> None: ...
+ def listen(self, backlog: int) -> None: ...
+ # TODO the return value may be BinaryIO or TextIO, depending on mode
+ def makefile(self, mode: str = ..., buffering: int = ...,
+ encoding: str = ..., errors: str = ...,
+ newline: str = ...) -> Any:
+ ...
+ def recv(self, bufsize: int, flags: int = ...) -> bytes: ...
+
+ # return type is an address
+ def recvfrom(self, bufsize: int, flags: int = ...) -> Any: ...
+ def recvfrom_into(self, buffer: bytes, nbytes: int,
+ flags: int = ...) -> Any: ...
+ def recv_into(self, buffer: bytes, nbytes: int,
+ flags: int = ...) -> Any: ...
+ def send(self, data: bytes, flags: int = ...) -> int: ...
+ def sendall(self, data: bytes, flags: int =...) -> None:
+ ... # return type: None on success
+ def sendto(self, data: bytes, address: Union[tuple, str], flags: int = ...) -> int: ...
+ def setblocking(self, flag: bool) -> None: ...
+ def settimeout(self, value: Union[float, None]) -> None: ...
+ def setsockopt(self, level: int, optname: int, value: Union[int, bytes]) -> None: ...
+ def shutdown(self, how: int) -> None: ...
+
+
+# ----- functions -----
+def create_connection(address: Tuple[str, int],
+ timeout: float = ...,
+ source_address: Tuple[str, int] = ...) -> socket: ...
+
+# the 5th tuple item is an address
+def getaddrinfo(
+ host: str, port: int, family: int = ..., type: int = ..., proto: int = ...,
+ flags: int = ...) -> List[Tuple[int, int, int, str, tuple]]:
+ ...
+
+def getfqdn(name: str = ...) -> str: ...
+def gethostbyname(hostname: str) -> str: ...
+def gethostbyname_ex(hostname: str) -> Tuple[str, List[str], List[str]]: ...
+def gethostname() -> str: ...
+def gethostbyaddr(ip_address: str) -> Tuple[str, List[str], List[str]]: ...
+def getnameinfo(sockaddr: tuple, flags: int) -> Tuple[str, int]: ...
+def getprotobyname(protocolname: str) -> int: ...
+def getservbyname(servicename: str, protocolname: str = ...) -> int: ...
+def getservbyport(port: int, protocolname: str = ...) -> str: ...
+def socketpair(family: int = ...,
+ type: int = ...,
+ proto: int = ...) -> Tuple[socket, socket]: ...
+def fromfd(fd: int, family: int, type: int, proto: int = ...) -> socket: ...
+def ntohl(x: int) -> int: ... # param & ret val are 32-bit ints
+def ntohs(x: int) -> int: ... # param & ret val are 16-bit ints
+def htonl(x: int) -> int: ... # param & ret val are 32-bit ints
+def htons(x: int) -> int: ... # param & ret val are 16-bit ints
+def inet_aton(ip_string: str) -> bytes: ... # ret val 4 bytes in length
+def inet_ntoa(packed_ip: bytes) -> str: ...
+def inet_pton(address_family: int, ip_string: str) -> bytes: ...
+def inet_ntop(address_family: int, packed_ip: bytes) -> str: ...
+def getdefaulttimeout() -> Union[float, None]: ...
+def setdefaulttimeout(timeout: float) -> None: ...
diff --git a/typeshed/stdlib/3/socketserver.pyi b/typeshed/stdlib/3/socketserver.pyi
new file mode 100644
index 0000000..14a739b
--- /dev/null
+++ b/typeshed/stdlib/3/socketserver.pyi
@@ -0,0 +1,93 @@
+# Stubs for socketserver
+
+from typing import Any, BinaryIO, Optional, Tuple
+from socket import SocketType
+import sys
+import types
+
+class BaseServer:
+ address_family = ... # type: int
+ RequestHandlerClass = ... # type: type
+ server_address = ... # type: Tuple[str, int]
+ socket = ... # type: SocketType
+ allow_reuse_address = ... # type: bool
+ request_queue_size = ... # type: int
+ socket_type = ... # type: int
+ timeout = ... # type: Optional[float]
+ def __init__(self, server_address: Tuple[str, int],
+ RequestHandlerClass: type) -> None: ...
+ def fileno(self) -> int: ...
+ def handle_request(self) -> None: ...
+ def serve_forever(self, poll_interval: float = ...) -> None: ...
+ def shutdown(self) -> None: ...
+ def server_close(self) -> None: ...
+ def finish_request(self) -> None: ...
+ def get_request(self) -> None: ...
+ def handle_error(self, request: bytes,
+ client_address: Tuple[str, int]) -> None: ...
+ def handle_timeout(self) -> None: ...
+ def process_request(self, request: bytes,
+ client_address: Tuple[str, int]) -> None: ...
+ def server_activate(self) -> None: ...
+ def server_bind(self) -> None: ...
+ def verify_request(self, request: bytes,
+ client_address: Tuple[str, int]) -> bool: ...
+ if sys.version_info >= (3, 6):
+ def __enter__(self) -> 'BaseServer': ...
+ def __exit__(self, exc_type: Optional[type],
+ exc_val: Optional[Exception],
+ exc_tb: Optional[types.TracebackType]) -> bool: ...
+ if sys.version_info >= (3, 3):
+ def service_actions(self) -> None: ...
+
+class TCPServer(BaseServer):
+ def __init__(self, server_address: Tuple[str, int],
+ RequestHandlerClass: type,
+ bind_and_activate: bool = ...) -> None: ...
+
+class UDPServer(BaseServer):
+ def __init__(self, server_address: Tuple[str, int],
+ RequestHandlerClass: type,
+ bind_and_activate: bool = ...) -> None: ...
+
+class UnixStreamServer(BaseServer):
+ def __init__(self, server_address: Tuple[str, int],
+ RequestHandlerClass: type,
+ bind_and_activate: bool = ...) -> None: ...
+
+class UnixDatagramServer(BaseServer):
+ def __init__(self, server_address: Tuple[str, int],
+ RequestHandlerClass: type,
+ bind_and_activate: bool = ...) -> None: ...
+
+class ForkingMixIn: ...
+class ThreadingMixIn: ...
+
+class ForkingTCPServer(ForkingMixIn, TCPServer): ...
+class ForkingUDPServer(ForkingMixIn, UDPServer): ...
+class ThreadingTCPServer(ThreadingMixIn, TCPServer): ...
+class ThreadingUDPServer(ThreadingMixIn, UDPServer): ...
+
+
+class BaseRequestHandler:
+ # Those are technically of types, respectively:
+ # * Union[SocketType, Tuple[bytes, SocketType]]
+ # * Union[Tuple[str, int], str]
+ # But there are some concerns that having unions here would cause
+ # too much inconvenience to people using it (see
+ # https://github.com/python/typeshed/pull/384#issuecomment-234649696)
+ request = ... # type: Any
+ client_address = ... # type: Any
+
+ server = ... # type: BaseServer
+ def setup(self) -> None: ...
+ def handle(self) -> None: ...
+ def finish(self) -> None: ...
+
+class StreamRequestHandler(BaseRequestHandler):
+ rfile = ... # type: BinaryIO
+ wfile = ... # type: BinaryIO
+
+class DatagramRequestHandler(BaseRequestHandler):
+ rfile = ... # type: BinaryIO
+ wfile = ... # type: BinaryIO
diff --git a/typeshed/stdlib/3/sqlite3/__init__.pyi b/typeshed/stdlib/3/sqlite3/__init__.pyi
new file mode 100644
index 0000000..fc22e5d
--- /dev/null
+++ b/typeshed/stdlib/3/sqlite3/__init__.pyi
@@ -0,0 +1,5 @@
+# Stubs for sqlite3 (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from sqlite3.dbapi2 import * # noqa: F403
diff --git a/typeshed/stdlib/3/sqlite3/dbapi2.pyi b/typeshed/stdlib/3/sqlite3/dbapi2.pyi
new file mode 100644
index 0000000..dcc2026
--- /dev/null
+++ b/typeshed/stdlib/3/sqlite3/dbapi2.pyi
@@ -0,0 +1,256 @@
+# Filip Hron <filip.hron at gmail.com>
+# based heavily on Andrey Vlasovskikh's python-skeletons https://github.com/JetBrains/python-skeletons/blob/master/sqlite3.py
+
+from typing import Any, Union, List, AnyStr, Iterator, Optional
+from numbers import Integral
+from datetime import time, datetime
+from collections import Iterable
+
+paramstyle = ... # type: str
+threadsafety = ... # type: int
+apilevel = ... # type: str
+Date = ... # type: datetime
+Time = ... # type: time
+Timestamp = ... # type: datetime
+
+def DateFromTicks(ticks): ...
+def TimeFromTicks(ticks): ...
+def TimestampFromTicks(ticks): ...
+
+version_info = ... # type: Any
+sqlite_version_info = ... # type: Any
+Binary = ... # type: Any
+
+def register_adapters_and_converters(): ...
+
+# The remaining definitions are imported from _sqlite3.
+
+PARSE_COLNAMES = ... # type: int
+PARSE_DECLTYPES = ... # type: int
+SQLITE_ALTER_TABLE = ... # type: int
+SQLITE_ANALYZE = ... # type: int
+SQLITE_ATTACH = ... # type: int
+SQLITE_CREATE_INDEX = ... # type: int
+SQLITE_CREATE_TABLE = ... # type: int
+SQLITE_CREATE_TEMP_INDEX = ... # type: int
+SQLITE_CREATE_TEMP_TABLE = ... # type: int
+SQLITE_CREATE_TEMP_TRIGGER = ... # type: int
+SQLITE_CREATE_TEMP_VIEW = ... # type: int
+SQLITE_CREATE_TRIGGER = ... # type: int
+SQLITE_CREATE_VIEW = ... # type: int
+SQLITE_DELETE = ... # type: int
+SQLITE_DENY = ... # type: int
+SQLITE_DETACH = ... # type: int
+SQLITE_DROP_INDEX = ... # type: int
+SQLITE_DROP_TABLE = ... # type: int
+SQLITE_DROP_TEMP_INDEX = ... # type: int
+SQLITE_DROP_TEMP_TABLE = ... # type: int
+SQLITE_DROP_TEMP_TRIGGER = ... # type: int
+SQLITE_DROP_TEMP_VIEW = ... # type: int
+SQLITE_DROP_TRIGGER = ... # type: int
+SQLITE_DROP_VIEW = ... # type: int
+SQLITE_IGNORE = ... # type: int
+SQLITE_INSERT = ... # type: int
+SQLITE_OK = ... # type: int
+SQLITE_PRAGMA = ... # type: int
+SQLITE_READ = ... # type: int
+SQLITE_REINDEX = ... # type: int
+SQLITE_SELECT = ... # type: int
+SQLITE_TRANSACTION = ... # type: int
+SQLITE_UPDATE = ... # type: int
+adapters = ... # type: Any
+converters = ... # type: Any
+sqlite_version = ... # type: str
+version = ... # type: str
+
+# TODO: adapt needs to get probed
+def adapt(obj, protocol, alternate): ...
+def complete_statement(sql: str) -> bool: ...
+def connect(database: Union[bytes, AnyStr],
+ timeout: float = ...,
+ detect_types: int = ...,
+ isolation_level: Union[str, None] = ...,
+ check_same_thread: bool = ...,
+ factory: Union[Connection, None] = ...,
+ cached_statements: int = ...) -> Connection: ...
+def enable_callback_tracebacks(flag: bool) -> None: ...
+def enable_shared_cache(do_enable: int) -> None: ...
+def register_adapter(type: type, callable: Any) -> None: ...
+# TODO: sqlite3.register_converter.__doc__ specifies callable as unknown
+def register_converter(typename: str, callable: bytes) -> None: ...
+
+class Cache:
+ def __init__(self, *args, **kwargs) -> None: ...
+ def display(self, *args, **kwargs) -> None: ...
+ def get(self, *args, **kwargs) -> None: ...
+
+class Connection:
+ DataError = ... # type: Any
+ DatabaseError = ... # type: Any
+ Error = ... # type: Any
+ IntegrityError = ... # type: Any
+ InterfaceError = ... # type: Any
+ InternalError = ... # type: Any
+ NotSupportedError = ... # type: Any
+ OperationalError = ... # type: Any
+ ProgrammingError = ... # type: Any
+ Warning = ... # type: Any
+ in_transaction = ... # type: Any
+ isolation_level = ... # type: Any
+ row_factory = ... # type: Any
+ text_factory = ... # type: Any
+ total_changes = ... # type: Any
+ def __init__(self, *args, **kwargs): ...
+ def close(self) -> None: ...
+ def commit(self) -> None: ...
+ def create_aggregate(self, name: str, num_params: int, aggregate_class: type) -> None: ...
+ def create_collation(self, name: str, callable: Any) -> None: ...
+ def create_function(self, name: str, num_params: int, func: Any) -> None: ...
+ def cursor(self, cursorClass: Optional[type] = ...) -> Cursor: ...
+ def execute(self, sql: str, parameters: Iterable = ...) -> Cursor: ...
+ # TODO: please check in executemany() if seq_of_parameters type is possible like this
+ def executemany(self, sql: str, seq_of_parameters: Iterable[Iterable]) -> Cursor: ...
+ def executescript(self, sql_script: Union[bytes, AnyStr]) -> Cursor: ...
+ def interrupt(self, *args, **kwargs) -> None: ...
+ def iterdump(self, *args, **kwargs) -> None: ...
+ def rollback(self, *args, **kwargs) -> None: ...
+ # TODO: set_authorizer(authorzer_callback)
+ # see https://docs.python.org/2/library/sqlite3.html#sqlite3.Connection.set_authorizer
+ # returns [SQLITE_OK, SQLITE_DENY, SQLITE_IGNORE] so perhaps int
+ def set_authorizer(self, *args, **kwargs) -> None: ...
+ # set_progress_handler(handler, n) -> see https://docs.python.org/2/library/sqlite3.html#sqlite3.Connection.set_progress_handler
+ def set_progress_handler(self, *args, **kwargs) -> None: ...
+ def set_trace_callback(self, *args, **kwargs): ...
+ def __call__(self, *args, **kwargs): ...
+ def __enter__(self, *args, **kwargs): ...
+ def __exit__(self, *args, **kwargs): ...
+
+class Cursor(Iterator[Any]):
+ arraysize = ... # type: Any
+ connection = ... # type: Any
+ description = ... # type: Any
+ lastrowid = ... # type: Any
+ row_factory = ... # type: Any
+ rowcount = ... # type: Any
+ # TODO: Cursor class accepts exactly 1 argument
+ # required type is sqlite3.Connection (which is imported as _Connection)
+ # however, the name of the __init__ variable is unknown
+ def __init__(self, *args, **kwargs): ...
+ def close(self, *args, **kwargs): ...
+ def execute(self, sql: str, parameters: Iterable = ...) -> Cursor: ...
+ def executemany(self, sql: str, seq_of_parameters: Iterable[Iterable]): ...
+ def executescript(self, sql_script: Union[bytes, AnyStr]) -> Cursor: ...
+ def fetchall(self) -> List[Any]: ...
+ def fetchmany(self, size: Integral = ...) -> List[Any]: ...
+ def fetchone(self) -> Any: ...
+ def setinputsizes(self, *args, **kwargs): ...
+ def setoutputsize(self, *args, **kwargs): ...
+ def __iter__(self) -> Cursor: ...
+ def __next__(self) -> Any: ...
+
+
+class DataError(DatabaseError): ...
+
+class DatabaseError(Error): ...
+
+class Error(Exception): ...
+
+class IntegrityError(DatabaseError): ...
+
+class InterfaceError(Error): ...
+
+class InternalError(DatabaseError): ...
+
+class NotSupportedError(DatabaseError): ...
+
+class OperationalError(DatabaseError): ...
+
+class OptimizedUnicode:
+ maketrans = ... # type: Any
+ def __init__(self, *args, **kwargs): ...
+ def capitalize(self, *args, **kwargs): ...
+ def casefold(self, *args, **kwargs): ...
+ def center(self, *args, **kwargs): ...
+ def count(self, *args, **kwargs): ...
+ def encode(self, *args, **kwargs): ...
+ def endswith(self, *args, **kwargs): ...
+ def expandtabs(self, *args, **kwargs): ...
+ def find(self, *args, **kwargs): ...
+ def format(self, *args, **kwargs): ...
+ def format_map(self, *args, **kwargs): ...
+ def index(self, *args, **kwargs): ...
+ def isalnum(self, *args, **kwargs): ...
+ def isalpha(self, *args, **kwargs): ...
+ def isdecimal(self, *args, **kwargs): ...
+ def isdigit(self, *args, **kwargs): ...
+ def isidentifier(self, *args, **kwargs): ...
+ def islower(self, *args, **kwargs): ...
+ def isnumeric(self, *args, **kwargs): ...
+ def isprintable(self, *args, **kwargs): ...
+ def isspace(self, *args, **kwargs): ...
+ def istitle(self, *args, **kwargs): ...
+ def isupper(self, *args, **kwargs): ...
+ def join(self, *args, **kwargs): ...
+ def ljust(self, *args, **kwargs): ...
+ def lower(self, *args, **kwargs): ...
+ def lstrip(self, *args, **kwargs): ...
+ def partition(self, *args, **kwargs): ...
+ def replace(self, *args, **kwargs): ...
+ def rfind(self, *args, **kwargs): ...
+ def rindex(self, *args, **kwargs): ...
+ def rjust(self, *args, **kwargs): ...
+ def rpartition(self, *args, **kwargs): ...
+ def rsplit(self, *args, **kwargs): ...
+ def rstrip(self, *args, **kwargs): ...
+ def split(self, *args, **kwargs): ...
+ def splitlines(self, *args, **kwargs): ...
+ def startswith(self, *args, **kwargs): ...
+ def strip(self, *args, **kwargs): ...
+ def swapcase(self, *args, **kwargs): ...
+ def title(self, *args, **kwargs): ...
+ def translate(self, *args, **kwargs): ...
+ def upper(self, *args, **kwargs): ...
+ def zfill(self, *args, **kwargs): ...
+ def __add__(self, other): ...
+ def __contains__(self, *args, **kwargs): ...
+ def __eq__(self, other): ...
+ def __format__(self, *args, **kwargs): ...
+ def __ge__(self, other): ...
+ def __getitem__(self, index): ...
+ def __getnewargs__(self, *args, **kwargs): ...
+ def __gt__(self, other): ...
+ def __hash__(self): ...
+ def __iter__(self): ...
+ def __le__(self, other): ...
+ def __len__(self, *args, **kwargs): ...
+ def __lt__(self, other): ...
+ def __mod__(self, other): ...
+ def __mul__(self, other): ...
+ def __ne__(self, other): ...
+ def __rmod__(self, other): ...
+ def __rmul__(self, other): ...
+ def __sizeof__(self): ...
+
+class PrepareProtocol:
+ def __init__(self, *args, **kwargs): ...
+
+class ProgrammingError(DatabaseError): ...
+
+class Row:
+ def __init__(self, *args, **kwargs): ...
+ def keys(self, *args, **kwargs): ...
+ def __eq__(self, other): ...
+ def __ge__(self, other): ...
+ def __getitem__(self, index): ...
+ def __gt__(self, other): ...
+ def __hash__(self): ...
+ def __iter__(self): ...
+ def __le__(self, other): ...
+ def __len__(self, *args, **kwargs): ...
+ def __lt__(self, other): ...
+ def __ne__(self, other): ...
+
+class Statement:
+ def __init__(self, *args, **kwargs): ...
+
+class Warning(Exception): ...
diff --git a/typeshed/stdlib/3/ssl.pyi b/typeshed/stdlib/3/ssl.pyi
new file mode 100644
index 0000000..250034e
--- /dev/null
+++ b/typeshed/stdlib/3/ssl.pyi
@@ -0,0 +1,285 @@
+# Stubs for ssl (Python 3.4)
+
+from typing import (
+ Any, Dict, Callable, List, NamedTuple, Optional, Set, Tuple, Union,
+)
+import socket
+import sys
+
+_PCTRTT = Tuple[Tuple[str, str], ...]
+_PCTRTTT = Tuple[_PCTRTT, ...]
+_PeerCertRetDictType = Dict[str, Union[str, _PCTRTTT, _PCTRTT]]
+_PeerCertRetType = Union[_PeerCertRetDictType, bytes, None]
+_EnumRetType = List[Tuple[bytes, str, Union[Set[str], bool]]]
+_PasswordType = Union[Callable[[], Union[str, bytes]], str, bytes]
+
+
+if sys.version_info >= (3, 5):
+ _SC1ArgT = Union[SSLSocket, SSLObject]
+else:
+ _SC1ArgT = SSLSocket
+_SrvnmeCbType = Callable[[_SC1ArgT, Optional[str], 'SSLSocket'], Optional[int]]
+
+class SSLError(OSError):
+ library = ... # type: str
+ reason = ... # type: str
+class SSLZeroReturnError(SSLError): ...
+class SSLWantReadError(SSLError): ...
+class SSLWantWriteError(SSLError): ...
+class SSLSyscallError(SSLError): ...
+class SSLEOFError(SSLError): ...
+class CertificateError(Exception): ...
+
+
+def wrap_socket(sock: socket.socket, keyfile: Optional[str] = ...,
+ certfile: Optional[str] = ..., server_side: bool = ...,
+ cert_reqs: int = ..., ssl_version: int = ...,
+ ca_certs: Optional[str] = ...,
+ do_handshake_on_connect: bool = ...,
+ suppress_ragged_eofs: bool = ...,
+ ciphers: Optional[str] = ...) -> 'SSLSocket': ...
+
+
+if sys.version_info >= (3, 4):
+ def create_default_context(purpose: Any = ..., *,
+ cafile: Optional[str] = ...,
+ capath: Optional[str] = ...,
+ cadata: Optional[str] = ...) -> 'SSLContext': ...
+
+if sys.version_info >= (3, 4, 3):
+ def _create_unverified_context(protocol: int = ..., *,
+ cert_reqs: int = ...,
+ check_hostname: bool = ...,
+ purpose: Any = ...,
+ certfile: Optional[str] = ...,
+ keyfile: Optional[str] = ...,
+ cafile: Optional[str] = ...,
+ capath: Optional[str] = ...,
+ cadata: Optional[str] = ...) -> 'SSLContext': ...
+ _create_default_https_context = ... # type: Callable[..., 'SSLContext']
+
+def RAND_bytes(num: int) -> bytes: ...
+def RAND_pseudo_bytes(num: int) -> Tuple[bytes, bool]: ...
+def RAND_status() -> bool: ...
+def RAND_egd(path: str) -> None: ...
+def RAND_add(bytes: bytes, entropy: float) -> None: ...
+
+
+def match_hostname(cert: _PeerCertRetType, hostname: str) -> None: ...
+def cert_time_to_seconds(cert_time: str) -> int: ...
+def get_server_certificate(addr: Tuple[str, int], ssl_version: int = ...,
+ ca_certs: Optional[str] = ...) -> str: ...
+def DER_cert_to_PEM_cert(der_cert_bytes: bytes) -> str: ...
+def PEM_cert_to_DER_cert(pem_cert_string: str) -> bytes: ...
+if sys.version_info >= (3, 4):
+ DefaultVerifyPaths = NamedTuple('DefaultVerifyPaths',
+ [('cafile', str), ('capath', str),
+ ('openssl_cafile_env', str),
+ ('openssl_cafile', str),
+ ('openssl_capath_env', str),
+ ('openssl_capath', str)])
+ def get_default_verify_paths() -> DefaultVerifyPaths: ...
+
+if sys.version_info >= (3, 4) and sys.platform == 'win32':
+ def enum_certificates(store_name: str) -> _EnumRetType: ...
+ def enum_crls(store_name: str) -> _EnumRetType: ...
+
+
+CERT_NONE = ... # type: int
+CERT_OPTIONAL = ... # type: int
+CERT_REQUIRED = ... # type: int
+
+if sys.version_info >= (3, 4):
+ VERIFY_DEFAULT = ... # type: int
+ VERIFY_CRL_CHECK_LEAF = ... # type: int
+ VERIFY_CRL_CHECK_CHAIN = ... # type: int
+ VERIFY_X509_STRICT = ... # type: int
+if sys.version_info >= (3, 4, 4):
+ VERIFY_X509_TRUSTED_FIRST = ... # type: int
+
+PROTOCOL_SSLv23 = ... # type: int
+PROTOCOL_SSLv2 = ... # type: int
+PROTOCOL_SSLv3 = ... # type: int
+PROTOCOL_TLSv1 = ... # type: int
+if sys.version_info >= (3, 4):
+ PROTOCOL_TLSv1_1 = ... # type: int
+ PROTOCOL_TLSv1_2 = ... # type: int
+
+OP_ALL = ... # type: int
+OP_NO_SSLv2 = ... # type: int
+OP_NO_SSLv3 = ... # type: int
+OP_NO_TLSv1 = ... # type: int
+if sys.version_info >= (3, 4):
+ OP_NO_TLSv1_1 = ... # type: int
+ OP_NO_TLSv1_2 = ... # type: int
+OP_CIPHER_SERVER_PREFERENCE = ... # type: int
+OP_SINGLE_DH_USE = ... # type: int
+OP_SINGLE_ECDH_USE = ... # type: int
+OP_NO_COMPRESSION = ... # type: int
+
+if sys.version_info >= (3, 5):
+ HAS_ALPN = ... # type: int
+HAS_ECDH = ... # type: bool
+HAS_SNI = ... # type: bool
+HAS_NPN = ... # type: bool
+CHANNEL_BINDING_TYPES = ... # type: List[str]
+
+OPENSSL_VERSION = ... # type: str
+OPENSSL_VERSION_INFO = ... # type: Tuple[int, int, int, int, int]
+OPENSSL_VERSION_NUMBER = ... # type: int
+
+if sys.version_info >= (3, 4):
+ ALERT_DESCRIPTION_HANDSHAKE_FAILURE = ... # type: int
+ ALERT_DESCRIPTION_INTERNAL_ERROR = ... # type: int
+ ALERT_DESCRIPTION_ACCESS_DENIED = ... # type: int
+ ALERT_DESCRIPTION_BAD_CERTIFICATE = ... # type: int
+ ALERT_DESCRIPTION_BAD_CERTIFICATE_HASH_VALUE = ... # type: int
+ ALERT_DESCRIPTION_BAD_CERTIFICATE_STATUS_RESPONSE = ... # type: int
+ ALERT_DESCRIPTION_BAD_RECORD_MAC = ... # type: int
+ ALERT_DESCRIPTION_CERTIFICATE_EXPIRED = ... # type: int
+ ALERT_DESCRIPTION_CERTIFICATE_REVOKED = ... # type: int
+ ALERT_DESCRIPTION_CERTIFICATE_UNKNOWN = ... # type: int
+ ALERT_DESCRIPTION_CERTIFICATE_UNOBTAINABLE = ... # type: int
+ ALERT_DESCRIPTION_CLOSE_NOTIFY = ... # type: int
+ ALERT_DESCRIPTION_DECODE_ERROR = ... # type: int
+ ALERT_DESCRIPTION_DECOMPRESSION_FAILURE = ... # type: int
+ ALERT_DESCRIPTION_DECRYPT_ERROR = ... # type: int
+ ALERT_DESCRIPTION_ILLEGAL_PARAMETER = ... # type: int
+ ALERT_DESCRIPTION_INSUFFICIENT_SECURITY = ... # type: int
+ ALERT_DESCRIPTION_NO_RENEGOTIATION = ... # type: int
+ ALERT_DESCRIPTION_PROTOCOL_VERSION = ... # type: int
+ ALERT_DESCRIPTION_RECORD_OVERFLOW = ... # type: int
+ ALERT_DESCRIPTION_UNEXPECTED_MESSAGE = ... # type: int
+ ALERT_DESCRIPTION_UNKNOWN_CA = ... # type: int
+ ALERT_DESCRIPTION_UNKNOWN_PSK_IDENTITY = ... # type: int
+ ALERT_DESCRIPTION_UNRECOGNIZED_NAME = ... # type: int
+ ALERT_DESCRIPTION_UNSUPPORTED_CERTIFICATE = ... # type: int
+ ALERT_DESCRIPTION_UNSUPPORTED_EXTENSION = ... # type: int
+ ALERT_DESCRIPTION_USER_CANCELLED = ... # type: int
+
+if sys.version_info >= (3, 4):
+ _PurposeType = NamedTuple('_PurposeType',
+ [('nid', int), ('shortname', str),
+ ('longname', str), ('oid', str)])
+ class Purpose:
+ SERVER_AUTH = ... # type: _PurposeType
+ CLIENT_AUTH = ... # type: _PurposeType
+
+
+class SSLSocket(socket.socket):
+ context = ... # type: SSLContext
+ server_side = ... # type: bool
+ server_hostname = ... # type: Optional[str]
+ def read(self, len: int = ...,
+ buffer: Optional[bytearray] = ...) -> bytes: ...
+ def write(self, buf: bytes) -> int: ...
+ def do_handshake(self) -> None: ...
+ def getpeercert(self, binary_form: bool = ...) -> _PeerCertRetType: ...
+ def cipher(self) -> Tuple[str, int, int]: ...
+ if sys.version_info >= (3, 5):
+ def shared_cipher(self) -> Optional[List[Tuple[str, int, int]]]: ...
+ def compression(self) -> Optional[str]: ...
+ def get_channel_binding(self, cb_type: str = ...) -> Optional[bytes]: ...
+ if sys.version_info >= (3, 5):
+ def selected_alpn_protocol(self) -> Optional[str]: ...
+ def selected_npn_protocol(self) -> Optional[str]: ...
+ def unwrap(self) -> socket.socket: ...
+ if sys.version_info >= (3, 5):
+ def version(self) -> Optional[str]: ...
+ def pending(self) -> int: ...
+
+
+class SSLContext:
+ if sys.version_info >= (3, 4):
+ check_hostname = ... # type: bool
+ options = ... # type: int
+ @property
+ def protocol(self) -> int: ...
+ if sys.version_info >= (3, 4):
+ verify_flags = ... # type: int
+ verify_mode = ... # type: int
+ def __init__(self, protocol: int) -> None: ...
+ if sys.version_info >= (3, 4):
+ def cert_store_stats(self) -> Dict[str, int]: ...
+ def load_cert_chain(self, certfile: str, keyfile: Optional[str] = ...,
+ password: _PasswordType = ...) -> None: ...
+ if sys.version_info >= (3, 4):
+ def load_default_certs(self, purpose: _PurposeType = ...) -> None: ...
+ def load_verify_locations(self, cafile: Optional[str] = ...,
+ capath: Optional[str] = ...,
+ cadata: Union[str, bytes, None] = ...) \
+ -> None: ...
+ def get_ca_certs(self,
+ binary_form: bool = ...) \
+ -> Union[List[_PeerCertRetDictType], List[bytes]]: ...
+ else:
+ def load_verify_locations(self,
+ cafile: Optional[str] = ...,
+ capath: Optional[str] = ...) -> None: ...
+ def set_default_verify_paths(self) -> None: ...
+ def set_ciphers(self, ciphers: str) -> None: ...
+ if sys.version_info >= (3, 5):
+ def set_alpn_protocols(self, protocols: List[str]) -> None: ...
+ def set_npn_protocols(self, protocols: List[str]) -> None: ...
+ def set_servername_callback(self,
+ server_name_callback: Optional[_SrvnmeCbType]) \
+ -> None: ...
+ def load_dh_params(self, dhfile: str) -> None: ...
+ def set_ecdh_curve(self, curve_name: str) -> None: ...
+ def wrap_socket(self, sock: socket.socket, server_side: bool = ...,
+ do_handshake_on_connect: bool = ...,
+ suppress_ragged_eofs: bool = ...,
+ server_hostname: Optional[str] = ...) -> 'SSLContext': ...
+ if sys.version_info >= (3, 5):
+ def wrap_bio(self, incoming: 'MemoryBIO', outgoing: 'MemoryBIO',
+ server_side: bool = ...,
+ server_hostname: Optional[str] = ...) -> 'SSLObject': ...
+ def session_stats(self) -> Dict[str, int]: ...
+
+
+if sys.version_info >= (3, 5):
+ class SSLObject:
+ context = ... # type: SSLContext
+ server_side = ... # type: bool
+ server_hostname = ... # type: Optional[str]
+ def read(self, len: int = ...,
+ buffer: Optional[bytearray] = ...) -> bytes: ...
+ def write(self, buf: bytes) -> int: ...
+ def getpeercert(self, binary_form: bool = ...) -> _PeerCertRetType: ...
+ def selected_npn_protocol(self) -> Optional[str]: ...
+ def cipher(self) -> Tuple[str, int, int]: ...
+ def shared_cipher(self) -> Optional[List[Tuple[str, int, int]]]: ...
+ def compression(self) -> Optional[str]: ...
+ def pending(self) -> int: ...
+ def do_handshake(self) -> None: ...
+ def unwrap(self) -> None: ...
+ def get_channel_binding(self, cb_type: str = ...) -> Optional[bytes]: ...
+
+ class MemoryBIO:
+ pending = ... # type: int
+ eof = ... # type: bool
+ def read(self, n: int = ...) -> bytes: ...
+ def write(self, buf: bytes) -> int: ...
+ def write_eof(self) -> None: ...
+
+
+# TODO below documented in cpython but not in docs.python.org
+# taken from python 3.4
+SSL_ERROR_EOF = ... # type: int
+SSL_ERROR_INVALID_ERROR_CODE = ... # type: int
+SSL_ERROR_SSL = ... # type: int
+SSL_ERROR_SYSCALL = ... # type: int
+SSL_ERROR_WANT_CONNECT = ... # type: int
+SSL_ERROR_WANT_READ = ... # type: int
+SSL_ERROR_WANT_WRITE = ... # type: int
+SSL_ERROR_WANT_X509_LOOKUP = ... # type: int
+SSL_ERROR_ZERO_RETURN = ... # type: int
+
+def get_protocol_name(protocol_code: int) -> str: ...
+
+AF_INET = ... # type: int
+PEM_FOOTER = ... # type: str
+PEM_HEADER = ... # type: str
+SOCK_STREAM = ... # type: int
+SOL_SOCKET = ... # type: int
+SO_TYPE = ... # type: int
diff --git a/typeshed/stdlib/3/stat.pyi b/typeshed/stdlib/3/stat.pyi
new file mode 100644
index 0000000..92e640f
--- /dev/null
+++ b/typeshed/stdlib/3/stat.pyi
@@ -0,0 +1,73 @@
+# Stubs for stat
+
+# Based on http://docs.python.org/3.2/library/stat.html
+
+import sys
+import typing
+
+def S_ISDIR(mode: int) -> bool: ...
+def S_ISCHR(mode: int) -> bool: ...
+def S_ISBLK(mode: int) -> bool: ...
+def S_ISREG(mode: int) -> bool: ...
+def S_ISFIFO(mode: int) -> bool: ...
+def S_ISLNK(mode: int) -> bool: ...
+def S_ISSOCK(mode: int) -> bool: ...
+
+def S_IMODE(mode: int) -> int: ...
+def S_IFMT(mode: int) -> int: ...
+
+ST_MODE = 0
+ST_INO = 0
+ST_DEV = 0
+ST_NLINK = 0
+ST_UID = 0
+ST_GID = 0
+ST_SIZE = 0
+ST_ATIME = 0
+ST_MTIME = 0
+ST_CTIME = 0
+
+S_IFSOCK = 0
+S_IFLNK = 0
+S_IFREG = 0
+S_IFBLK = 0
+S_IFDIR = 0
+S_IFCHR = 0
+S_IFIFO = 0
+S_ISUID = 0
+S_ISGID = 0
+S_ISVTX = 0
+
+S_IRWXU = 0
+S_IRUSR = 0
+S_IWUSR = 0
+S_IXUSR = 0
+
+S_IRWXG = 0
+S_IRGRP = 0
+S_IWGRP = 0
+S_IXGRP = 0
+
+S_IRWXO = 0
+S_IROTH = 0
+S_IWOTH = 0
+S_IXOTH = 0
+
+S_ENFMT = 0
+S_IREAD = 0
+S_IWRITE = 0
+S_IEXEC = 0
+
+UF_NODUMP = 0
+UF_IMMUTABLE = 0
+UF_APPEND = 0
+UF_OPAQUE = 0
+UF_NOUNLINK = 0
+if sys.platform == 'darwin':
+ UF_COMPRESSED = 0 # OS X 10.6+ only
+ UF_HIDDEN = 0 # OX X 10.5+ only
+SF_ARCHIVED = 0
+SF_IMMUTABLE = 0
+SF_APPEND = 0
+SF_NOUNLINK = 0
+SF_SNAPSHOT = 0
diff --git a/typeshed/stdlib/3/string.pyi b/typeshed/stdlib/3/string.pyi
new file mode 100644
index 0000000..365449e
--- /dev/null
+++ b/typeshed/stdlib/3/string.pyi
@@ -0,0 +1,42 @@
+# Stubs for string
+
+# Based on http://docs.python.org/3.2/library/string.html
+
+from typing import Mapping, Sequence, Any, Optional, Union, List, Tuple, Iterable, AnyStr
+
+ascii_letters = ... # type: str
+ascii_lowercase = ... # type: str
+ascii_uppercase = ... # type: str
+digits = ... # type: str
+hexdigits = ... # type: str
+octdigits = ... # type: str
+punctuation = ... # type: str
+printable = ... # type: str
+whitespace = ... # type: str
+
+def capwords(s: str, sep: str = ...) -> str: ...
+
+class Template:
+ template = ... # type: str
+
+ def __init__(self, template: str) -> None: ...
+ def substitute(self, mapping: Mapping[str, str] = ..., **kwds: str) -> str: ...
+ def safe_substitute(self, mapping: Mapping[str, str] = ...,
+ **kwds: str) -> str: ...
+
+# TODO(MichalPokorny): This is probably badly and/or loosely typed.
+class Formatter(object):
+ def format(self, format_string: str, *args, **kwargs) -> str: ...
+ def vformat(self, format_string: str, args: Sequence[Any],
+ kwargs: Mapping[str, Any]) -> str: ...
+ def parse(self, format_string: str) -> Iterable[Tuple[str, Optional[str], Optional[str], Optional[str]]]: ...
+ def get_field(self, field_name: str, args: Sequence[Any],
+ kwargs: Mapping[str, Any]) -> Any: ...
+ def get_value(self, key: Union[int, str], args: Sequence[Any],
+ kwargs: Mapping[str, Any]) -> Any:
+ raise IndexError()
+ raise KeyError()
+ def check_unused_args(self, used_args: Sequence[Union[int, str]], args: Sequence[Any],
+ kwargs: Mapping[str, Any]) -> None: ...
+ def format_field(self, value: Any, format_spec: str) -> Any: ...
+ def convert_field(self, value: Any, conversion: str) -> Any: ...
diff --git a/typeshed/stdlib/3/struct.pyi b/typeshed/stdlib/3/struct.pyi
new file mode 100644
index 0000000..f539610
--- /dev/null
+++ b/typeshed/stdlib/3/struct.pyi
@@ -0,0 +1,30 @@
+# Stubs for struct
+
+# Based on http://docs.python.org/3.2/library/struct.html
+
+from typing import overload, Any, Tuple
+
+class error(Exception): ...
+
+def pack(fmt: str, *v: Any) -> bytes: ...
+# TODO buffer type
+def pack_into(fmt: str, buffer: Any, offset: int, *v: Any) -> None: ...
+
+# TODO buffer type
+def unpack(fmt: str, buffer: Any) -> Tuple[Any, ...]: ...
+def unpack_from(fmt: str, buffer: Any, offset: int = ...) -> Tuple[Any, ...]: ...
+
+def calcsize(fmt: str) -> int: ...
+
+class Struct:
+ format = b''
+ size = 0
+
+ def __init__(self, format: str) -> None: ...
+
+ def pack(self, *v: Any) -> bytes: ...
+ # TODO buffer type
+ def pack_into(self, buffer: Any, offset: int, *v: Any) -> None: ...
+ # TODO buffer type
+ def unpack(self, buffer: Any) -> Tuple[Any, ...]: ...
+ def unpack_from(self, buffer: Any, offset: int = ...) -> Tuple[Any, ...]: ...
diff --git a/typeshed/stdlib/3/subprocess.pyi b/typeshed/stdlib/3/subprocess.pyi
new file mode 100644
index 0000000..c22ba00
--- /dev/null
+++ b/typeshed/stdlib/3/subprocess.pyi
@@ -0,0 +1,249 @@
+# Stubs for subprocess
+
+# Based on http://docs.python.org/3.5/library/subprocess.html
+import sys
+from typing import Sequence, Any, AnyStr, Mapping, Callable, Tuple, IO, Optional, Union, List, Type
+from types import TracebackType
+
+
+if sys.version_info >= (3, 5):
+ class CompletedProcess:
+ args = ... # type: Union[List, str]
+ returncode = ... # type: int
+ stdout = ... # type: Any
+ stderr = ... # type: Any
+ def __init__(self, args: Union[List, str],
+ returncode: int,
+ stdout: Union[str, bytes],
+ stderr: Union[str, bytes]) -> None: ...
+ def check_returncode(self) -> None: ...
+
+ # Nearly same args as Popen.__init__ except for timeout, input, and check
+ def run(args: Union[str, Sequence[str]],
+ timeout: float = ...,
+ input: Union[str, bytes] = ...,
+ check: bool = ...,
+ bufsize: int = ...,
+ executable: str = ...,
+ stdin: Any = ...,
+ stdout: Any = ...,
+ stderr: Any = ...,
+ preexec_fn: Callable[[], Any] = ...,
+ close_fds: bool = ...,
+ shell: bool = ...,
+ cwd: str = ...,
+ env: Mapping[str, str] = ...,
+ universal_newlines: bool = ...,
+ startupinfo: Any = ...,
+ creationflags: int = ...,
+ restore_signals: bool = ...,
+ start_new_session: bool = ...,
+ pass_fds: Any = ...) -> CompletedProcess: ...
+
+# Same args as Popen.__init__
+if sys.version_info >= (3, 3):
+ # 3.3 added timeout
+ def call(args: Union[str, Sequence[str]],
+ bufsize: int = ...,
+ executable: str = ...,
+ stdin: Any = ...,
+ stdout: Any = ...,
+ stderr: Any = ...,
+ preexec_fn: Callable[[], Any] = ...,
+ close_fds: bool = ...,
+ shell: bool = ...,
+ cwd: str = ...,
+ env: Mapping[str, str] = ...,
+ universal_newlines: bool = ...,
+ startupinfo: Any = ...,
+ creationflags: int = ...,
+ restore_signals: bool = ...,
+ start_new_session: bool = ...,
+ pass_fds: Any = ...,
+ timeout: float = ...) -> int: ...
+else:
+ def call(args: Union[str, Sequence[str]],
+ bufsize: int = ...,
+ executable: str = ...,
+ stdin: Any = ...,
+ stdout: Any = ...,
+ stderr: Any = ...,
+ preexec_fn: Callable[[], Any] = ...,
+ close_fds: bool = ...,
+ shell: bool = ...,
+ cwd: str = ...,
+ env: Mapping[str, str] = ...,
+ universal_newlines: bool = ...,
+ startupinfo: Any = ...,
+ creationflags: int = ...,
+ restore_signals: bool = ...,
+ start_new_session: bool = ...,
+ pass_fds: Any = ...) -> int: ...
+
+# Same args as Popen.__init__
+if sys.version_info >= (3, 3):
+ # 3.3 added timeout
+ def check_call(args: Union[str, Sequence[str]],
+ bufsize: int = ...,
+ executable: str = ...,
+ stdin: Any = ...,
+ stdout: Any = ...,
+ stderr: Any = ...,
+ preexec_fn: Callable[[], Any] = ...,
+ close_fds: bool = ...,
+ shell: bool = ...,
+ cwd: str = ...,
+ env: Mapping[str, str] = ...,
+ universal_newlines: bool = ...,
+ startupinfo: Any = ...,
+ creationflags: int = ...,
+ restore_signals: bool = ...,
+ start_new_session: bool = ...,
+ pass_fds: Any = ...,
+ timeout: float = ...) -> int: ...
+else:
+ def check_call(args: Union[str, Sequence[str]],
+ bufsize: int = ...,
+ executable: str = ...,
+ stdin: Any = ...,
+ stdout: Any = ...,
+ stderr: Any = ...,
+ preexec_fn: Callable[[], Any] = ...,
+ close_fds: bool = ...,
+ shell: bool = ...,
+ cwd: str = ...,
+ env: Mapping[str, str] = ...,
+ universal_newlines: bool = ...,
+ startupinfo: Any = ...,
+ creationflags: int = ...,
+ restore_signals: bool = ...,
+ start_new_session: bool = ...,
+ pass_fds: Any = ...) -> int: ...
+
+if sys.version_info >= (3, 4):
+ # 3.4 added input
+ def check_output(args: Union[str, Sequence[str]],
+ bufsize: int = ...,
+ executable: str = ...,
+ stdin: Any = ...,
+ stderr: Any = ...,
+ preexec_fn: Callable[[], Any] = ...,
+ close_fds: bool = ...,
+ shell: bool = ...,
+ cwd: str = ...,
+ env: Mapping[str, str] = ...,
+ universal_newlines: bool = ...,
+ startupinfo: Any = ...,
+ creationflags: int = ...,
+ restore_signals: bool = ...,
+ start_new_session: bool = ...,
+ pass_fds: Any = ...,
+ timeout: float = ...,
+ input: Union[str, bytes] = ...) -> Any: ...
+elif sys.version_info >= (3, 3):
+ # 3.3 added timeout
+ def check_output(args: Union[str, Sequence[str]],
+ bufsize: int = ...,
+ executable: str = ...,
+ stdin: Any = ...,
+ stderr: Any = ...,
+ preexec_fn: Callable[[], Any] = ...,
+ close_fds: bool = ...,
+ shell: bool = ...,
+ cwd: str = ...,
+ env: Mapping[str, str] = ...,
+ universal_newlines: bool = ...,
+ startupinfo: Any = ...,
+ creationflags: int = ...,
+ restore_signals: bool = ...,
+ start_new_session: bool = ...,
+ pass_fds: Any = ...,
+ timeout: float = ...) -> Any: ...
+else:
+ # Same args as Popen.__init__, except for stdout
+ def check_output(args: Union[str, Sequence[str]],
+ bufsize: int = ...,
+ executable: str = ...,
+ stdin: Any = ...,
+ stderr: Any = ...,
+ preexec_fn: Callable[[], Any] = ...,
+ close_fds: bool = ...,
+ shell: bool = ...,
+ cwd: str = ...,
+ env: Mapping[str, str] = ...,
+ universal_newlines: bool = ...,
+ startupinfo: Any = ...,
+ creationflags: int = ...,
+ restore_signals: bool = ...,
+ start_new_session: bool = ...,
+ pass_fds: Any = ...) -> Any: ...
+
+
+# TODO types
+PIPE = ... # type: Any
+STDOUT = ... # type: Any
+if sys.version_info >= (3, 3):
+ DEVNULL = ... # type: Any
+ class SubprocessError(Exception): ...
+ class TimeoutExpired(SubprocessError): ...
+
+
+class CalledProcessError(Exception):
+ returncode = 0
+ cmd = ... # type: str
+ output = b'' # May be None
+
+ if sys.version_info >= (3, 5):
+ stdout = b''
+ stderr = b''
+
+ def __init__(self, returncode: int, cmd: str, output: Optional[str] = ...,
+ stderr: Optional[str] = ...) -> None: ...
+
+class Popen:
+ stdin = ... # type: IO[Any]
+ stdout = ... # type: IO[Any]
+ stderr = ... # type: IO[Any]
+ pid = 0
+ returncode = 0
+
+ def __init__(self,
+ args: Union[str, Sequence[str]],
+ bufsize: int = ...,
+ executable: Optional[str] = ...,
+ stdin: Optional[Any] = ...,
+ stdout: Optional[Any] = ...,
+ stderr: Optional[Any] = ...,
+ preexec_fn: Optional[Callable[[], Any]] = ...,
+ close_fds: bool = ...,
+ shell: bool = ...,
+ cwd: Optional[str] = ...,
+ env: Optional[Mapping[str, str]] = ...,
+ universal_newlines: bool = ...,
+ startupinfo: Optional[Any] = ...,
+ creationflags: int = ...,
+ restore_signals: bool = ...,
+ start_new_session: bool = ...,
+ pass_fds: Any = ...) -> None: ...
+
+ def poll(self) -> int: ...
+ if sys.version_info >= (3, 3):
+ # 3.3 added timeout
+ def wait(self, timeout: Optional[float] = ...) -> int: ...
+ else:
+ def wait(self) ->int: ...
+ # Return str/bytes
+ if sys.version_info >= (3, 3):
+ def communicate(self, input: Optional[AnyStr] = ..., timeout: Optional[float] = ...) -> Tuple[Any, Any]: ...
+ else:
+ def communicate(self, input: Optional[AnyStr] = ...) -> Tuple[Any, Any]: ...
+ def send_signal(self, signal: int) -> None: ...
+ def terminate(self) -> None: ...
+ def kill(self) -> None: ...
+ def __enter__(self) -> 'Popen': ...
+ def __exit__(self, type: Optional[Type[BaseException]], value: Optional[BaseException], traceback: Optional[TracebackType]) -> bool: ...
+
+def getstatusoutput(cmd: str) -> Tuple[int, str]: ...
+def getoutput(cmd: str) -> str: ...
+
+# Windows-only: STARTUPINFO etc.
diff --git a/typeshed/stdlib/3/sys.pyi b/typeshed/stdlib/3/sys.pyi
new file mode 100644
index 0000000..042fcf1
--- /dev/null
+++ b/typeshed/stdlib/3/sys.pyi
@@ -0,0 +1,161 @@
+# Stubs for sys
+# Ron Murawski <ron at horizonchess.com>
+
+# based on http://docs.python.org/3.2/library/sys.html
+
+from typing import (
+ List, Sequence, Any, Dict, Tuple, TextIO, overload, Optional, Union,
+ TypeVar, Callable, Type,
+)
+from types import TracebackType
+from mypy_extensions import NoReturn
+
+_T = TypeVar('_T')
+
+# ----- sys variables -----
+abiflags = ... # type: str
+argv = ... # type: List[str]
+byteorder = ... # type: str
+builtin_module_names = ... # type: Sequence[str] # actually a tuple of strings
+copyright = ... # type: str
+# dllhandle = 0 # Windows only
+dont_write_bytecode = False
+__displayhook__ = ... # type: Any # contains the original value of displayhook
+__excepthook__ = ... # type: Any # contains the original value of excepthook
+exec_prefix = ... # type: str
+executable = ... # type: str
+float_repr_style = ... # type: str
+hexversion = 0 # this is a 32-bit int
+last_type = ... # type: Any
+last_value = ... # type: Any
+last_traceback = ... # type: Any
+maxsize = 0
+maxunicode = 0
+meta_path = ... # type: List[Any]
+modules = ... # type: Dict[str, Any]
+path = ... # type: List[str]
+path_hooks = ... # type: List[Any] # TODO precise type; function, path to finder
+path_importer_cache = ... # type: Dict[str, Any] # TODO precise type
+platform = ... # type: str
+prefix = ... # type: str
+ps1 = ... # type: str
+ps2 = ... # type: str
+stdin = ... # type: TextIO
+stdout = ... # type: TextIO
+stderr = ... # type: TextIO
+__stdin__ = ... # type: TextIO
+__stdout__ = ... # type: TextIO
+__stderr__ = ... # type: TextIO
+# deprecated and removed in Python 3.3:
+subversion = ... # type: Tuple[str, str, str]
+tracebacklimit = 0
+version = ... # type: str
+api_version = 0
+warnoptions = ... # type: Any
+# Each entry is a tuple of the form (action, message, category, module,
+# lineno)
+# winver = '' # Windows only
+_xoptions = ... # type: Dict[Any, Any]
+
+flags = ... # type: _flags
+class _flags:
+ debug = 0
+ division_warning = 0
+ inspect = 0
+ interactive = 0
+ optimize = 0
+ dont_write_bytecode = 0
+ no_user_site = 0
+ no_site = 0
+ ignore_environment = 0
+ verbose = 0
+ bytes_warning = 0
+ quiet = 0
+ hash_randomization = 0
+
+float_info = ... # type: _float_info
+class _float_info:
+ epsilon = 0.0 # DBL_EPSILON
+ dig = 0 # DBL_DIG
+ mant_dig = 0 # DBL_MANT_DIG
+ max = 0.0 # DBL_MAX
+ max_exp = 0 # DBL_MAX_EXP
+ max_10_exp = 0 # DBL_MAX_10_EXP
+ min = 0.0 # DBL_MIN
+ min_exp = 0 # DBL_MIN_EXP
+ min_10_exp = 0 # DBL_MIN_10_EXP
+ radix = 0 # FLT_RADIX
+ rounds = 0 # FLT_ROUNDS
+
+hash_info = ... # type: _hash_info
+class _hash_info:
+ width = 0 # width in bits used for hash values
+ modulus = 0 # prime modulus P used for numeric hash scheme
+ inf = 0 # hash value returned for a positive infinity
+ nan = 0 # hash value returned for a nan
+ imag = 0 # multiplier used for the imaginary part of a complex number
+
+int_info = ... # type: _int_info
+class _int_info:
+ bits_per_digit = 0 # number of bits held in each digit. Python integers are stored internally in base 2**int_info.bits_per_digit
+ sizeof_digit = 0 # size in bytes of C type used to represent a digit
+
+class _version_info(Tuple[int, int, int, str, int]):
+ major = 0
+ minor = 0
+ micro = 0
+ releaselevel = ... # type: str
+ serial = 0
+version_info = ... # type: _version_info
+
+
+# ----- sys function stubs -----
+def call_tracing(fn: Callable[..., _T], args: Any) -> _T: ...
+def _clear_type_cache() -> None: ...
+def _current_frames() -> Dict[int, Any]: ...
+def displayhook(value: Optional[int]) -> None: ...
+def excepthook(type_: Type[BaseException], value: BaseException,
+ traceback: TracebackType) -> None: ...
+# TODO should be a union of tuple, see mypy#1178
+def exc_info() -> Tuple[Optional[Type[BaseException]],
+ Optional[BaseException],
+ Optional[TracebackType]]: ...
+# sys.exit() accepts an optional argument of anything printable
+def exit(arg: Any = ...) -> NoReturn:
+ raise SystemExit()
+def getcheckinterval() -> int: ... # deprecated
+def getdefaultencoding() -> str: ...
+def getdlopenflags() -> int: ... # Unix only
+def getfilesystemencoding() -> str: ... # cannot return None
+def getrefcount(arg: Any) -> int: ...
+def getrecursionlimit() -> int: ...
+
+ at overload
+def getsizeof(obj: object) -> int: ...
+ at overload
+def getsizeof(obj: object, default: int) -> int: ...
+
+def getswitchinterval() -> float: ...
+
+ at overload
+def _getframe() -> Any: ...
+ at overload
+def _getframe(depth: int) -> Any: ...
+
+def getprofile() -> Any: ... # TODO return type
+def gettrace() -> Any: ... # TODO return
+def getwindowsversion() -> Any: ... # Windows only, TODO return type
+def intern(string: str) -> str: ...
+def setcheckinterval(interval: int) -> None: ... # deprecated
+def setdlopenflags(n: int) -> None: ... # Linux only
+def setprofile(profilefunc: Any) -> None: ... # TODO type
+def setrecursionlimit(limit: int) -> None: ...
+def setswitchinterval(interval: float) -> None: ...
+def settrace(tracefunc: Any) -> None: ... # TODO type
+# Trace functions should have three arguments: frame, event, and arg. frame
+# is the current stack frame. event is a string: 'call', 'line', 'return',
+# 'exception', 'c_call', 'c_return', or 'c_exception'. arg depends on the
+# event type.
+def settscdump(on_flag: bool) -> None: ...
+
+def gettotalrefcount() -> int: ... # Debug builds only
diff --git a/typeshed/stdlib/3/sysconfig.pyi b/typeshed/stdlib/3/sysconfig.pyi
new file mode 100644
index 0000000..8d7ab2c
--- /dev/null
+++ b/typeshed/stdlib/3/sysconfig.pyi
@@ -0,0 +1,8 @@
+# Stubs for sysconfig
+
+# NOTE: These are incomplete!
+
+import typing
+
+def get_config_var(name: str) -> str: ...
+def is_python_build() -> bool: ...
diff --git a/typeshed/stdlib/3/tempfile.pyi b/typeshed/stdlib/3/tempfile.pyi
new file mode 100644
index 0000000..ea5207a
--- /dev/null
+++ b/typeshed/stdlib/3/tempfile.pyi
@@ -0,0 +1,51 @@
+# Stubs for tempfile
+# Ron Murawski <ron at horizonchess.com>
+
+# based on http://docs.python.org/3.3/library/tempfile.html
+
+from types import TracebackType
+from typing import BinaryIO, Optional, Tuple, Type
+
+# global variables
+tempdir = ... # type: str
+template = ... # type: str
+
+# TODO text files
+
+# function stubs
+def TemporaryFile(
+ mode: str = ..., buffering: int = ..., encoding: str = ...,
+ newline: str = ..., suffix: str = ..., prefix: str = ...,
+ dir: str = ...
+) -> BinaryIO:
+ ...
+def NamedTemporaryFile(
+ mode: str = ..., buffering: int = ..., encoding: str = ...,
+ newline: str = ..., suffix: str = ..., prefix: str = ...,
+ dir: str = ..., delete: bool =...
+) -> BinaryIO:
+ ...
+def SpooledTemporaryFile(
+ max_size: int = ..., mode: str = ..., buffering: int = ...,
+ encoding: str = ..., newline: str = ..., suffix: str = ...,
+ prefix: str = ..., dir: str = ...
+) -> BinaryIO:
+ ...
+
+class TemporaryDirectory:
+ name = ... # type: str
+ def __init__(self, suffix: str = ..., prefix: str = ...,
+ dir: str = ...) -> None: ...
+ def cleanup(self) -> None: ...
+ def __enter__(self) -> str: ...
+ def __exit__(self, exc_type: Optional[Type[BaseException]],
+ exc_val: Optional[Exception],
+ exc_tb: Optional[TracebackType]) -> bool: ...
+
+def mkstemp(suffix: str = ..., prefix: str = ..., dir: str = ...,
+ text: bool = ...) -> Tuple[int, str]: ...
+def mkdtemp(suffix: str = ..., prefix: str = ...,
+ dir: str = ...) -> str: ...
+def mktemp(suffix: str = ..., prefix: str = ..., dir: str = ...) -> str: ...
+def gettempdir() -> str: ...
+def gettempprefix() -> str: ...
diff --git a/typeshed/stdlib/3/textwrap.pyi b/typeshed/stdlib/3/textwrap.pyi
new file mode 100644
index 0000000..319297b
--- /dev/null
+++ b/typeshed/stdlib/3/textwrap.pyi
@@ -0,0 +1,122 @@
+# Better textwrap stubs hand-written by o11c.
+# https://docs.python.org/3/library/textwrap.html
+from typing import (
+ Callable,
+ List,
+)
+
+class TextWrapper:
+ def __init__(
+ self,
+ width: int = ...,
+ *,
+ initial_indent: str = ...,
+ subsequent_indent: str = ...,
+ expand_tabs: bool = ...,
+ tabsize: int = ...,
+ replace_whitespace: bool = ...,
+ fix_sentence_endings: bool = ...,
+ break_long_words: bool = ...,
+ break_on_hyphens: bool = ...,
+ drop_whitespace: bool = ...,
+ max_lines: int = ...,
+ placeholder: str = ...
+ ) -> None:
+ self.width = width
+ self.initial_indent = initial_indent
+ self.subsequent_indent = subsequent_indent
+ self.expand_tabs = expand_tabs
+ self.tabsize = tabsize
+ self.replace_whitespace = replace_whitespace
+ self.fix_sentence_endings = fix_sentence_endings
+ self.break_long_words = break_long_words
+ self.break_on_hyphens = break_on_hyphens
+ self.drop_whitespace = drop_whitespace
+ self.max_lines = max_lines
+ self.placeholder = placeholder
+
+ # Private methods *are* part of the documented API for subclasses.
+ def _munge_whitespace(self, text: str) -> str:
+ ...
+
+ def _split(self, text: str) -> List[str]:
+ ...
+
+ def _fix_sentence_endings(self, chunks: List[str]) -> None:
+ ...
+
+ def _handle_long_word(self, reversed_chunks: List[str], cur_line: List[str], cur_len: int, width: int) -> None:
+ ...
+
+ def _wrap_chunks(self, chunks: List[str]) -> List[str]:
+ ...
+
+ def _split_chunks(self, text: str) -> List[str]:
+ ...
+
+ def wrap(self, text: str) -> List[str]:
+ ...
+
+ def fill(self, text: str) -> str:
+ ...
+
+
+def wrap(
+ text: str = ...,
+ width: int = ...,
+ *,
+ initial_indent: str = ...,
+ subsequent_indent: str = ...,
+ expand_tabs: bool = ...,
+ tabsize: int = ...,
+ replace_whitespace: bool = ...,
+ fix_sentence_endings: bool = ...,
+ break_long_words: bool = ...,
+ break_on_hyphens: bool = ...,
+ drop_whitespace: bool = ...,
+ max_lines: int = ...,
+ placeholder: str = ...
+) -> List[str]:
+ ...
+
+def fill(
+ text: str,
+ width: int = ...,
+ *,
+ initial_indent: str = ...,
+ subsequent_indent: str = ...,
+ expand_tabs: bool = ...,
+ tabsize: int = ...,
+ replace_whitespace: bool = ...,
+ fix_sentence_endings: bool = ...,
+ break_long_words: bool = ...,
+ break_on_hyphens: bool = ...,
+ drop_whitespace: bool = ...,
+ max_lines: int = ...,
+ placeholder: str = ...
+):
+ ...
+
+def shorten(
+ text: str,
+ width: int,
+ *,
+ initial_indent: str = ...,
+ subsequent_indent: str = ...,
+ expand_tabs: bool = ...,
+ tabsize: int = ...,
+ replace_whitespace: bool = ...,
+ fix_sentence_endings: bool = ...,
+ break_long_words: bool = ...,
+ break_on_hyphens: bool = ...,
+ drop_whitespace: bool = ...,
+ # Omit `max_lines: int = None`, it is forced to 1 here.
+ placeholder: str = ...
+):
+ ...
+
+def dedent(text: str) -> str:
+ ...
+
+def indent(text: str, prefix: str, predicate: Callable[[str], bool] = ...) -> str:
+ ...
diff --git a/typeshed/stdlib/3/time.pyi b/typeshed/stdlib/3/time.pyi
new file mode 100644
index 0000000..edcb9d6
--- /dev/null
+++ b/typeshed/stdlib/3/time.pyi
@@ -0,0 +1,84 @@
+# Stubs for time
+# Ron Murawski <ron at horizonchess.com>
+
+# based on: http://docs.python.org/3.3/library/time.html#module-time
+# see: http://nullege.com/codes/search?cq=time
+
+import sys
+from typing import Any, NamedTuple, Tuple, Union
+from types import SimpleNamespace
+
+TimeTuple = Tuple[int, int, int, int, int, int, int, int, int]
+
+# ----- variables and constants -----
+accept2dyear = False
+altzone = 0
+daylight = 0
+timezone = 0
+tzname = ... # type: Tuple[str, str]
+
+if sys.version_info >= (3, 3) and sys.platform != 'win32':
+ CLOCK_HIGHRES = 0 # Solaris only
+ CLOCK_MONOTONIC = 0 # Unix only
+ CLOCK_MONOTONIC_RAW = 0 # Linux 2.6.28 or later
+ CLOCK_PROCESS_CPUTIME_ID = 0 # Unix only
+ CLOCK_REALTIME = 0 # Unix only
+ CLOCK_THREAD_CPUTIME_ID = 0 # Unix only
+
+
+if sys.version_info >= (3, 3):
+ class struct_time(
+ NamedTuple(
+ '_struct_time',
+ [('tm_year', int), ('tm_mon', int), ('tm_mday', int),
+ ('tm_hour', int), ('tm_min', int), ('tm_sec', int),
+ ('tm_wday', int), ('tm_yday', int), ('tm_isdst', int),
+ ('tm_zone', str), ('tm_gmtoff', int)]
+ )
+ ):
+ def __init__(
+ self,
+ o: Union[
+ Tuple[int, int, int, int, int, int, int, int, int],
+ Tuple[int, int, int, int, int, int, int, int, int, str],
+ Tuple[int, int, int, int, int, int, int, int, int, str, int]
+ ],
+ _arg: Any = ...,
+ ) -> None: ...
+else:
+ class struct_time(
+ NamedTuple(
+ '_struct_time',
+ [('tm_year', int), ('tm_mon', int), ('tm_mday', int),
+ ('tm_hour', int), ('tm_min', int), ('tm_sec', int),
+ ('tm_wday', int), ('tm_yday', int), ('tm_isdst', int)]
+ )
+ ):
+ def __init__(self, o: TimeTuple, _arg: Any = ...) -> None: ...
+
+
+# ----- functions -----
+def asctime(t: Union[TimeTuple, struct_time, None] = ...) -> str: ... # return current time
+def clock() -> float: ...
+def ctime(secs: Union[float, None] = ...) -> str: ... # return current time
+def gmtime(secs: Union[float, None] = ...) -> struct_time: ... # return current time
+def localtime(secs: Union[float, None] = ...) -> struct_time: ... # return current time
+def mktime(t: Union[TimeTuple, struct_time]) -> float: ...
+def sleep(secs: Union[int, float]) -> None: ...
+def strftime(format: str,
+ t: Union[TimeTuple, struct_time, None] = ...) -> str: ... # return current time
+def strptime(string: str,
+ format: str = ...) -> struct_time: ...
+def time() -> float: ...
+if sys.platform != 'win32':
+ def tzset() -> None: ... # Unix only
+
+if sys.version_info >= (3, 3):
+ def get_clock_info(str) -> SimpleNamespace: ...
+ def monotonic() -> float: ...
+ def perf_counter() -> float: ...
+ def process_time() -> float: ...
+ if sys.platform != 'win32':
+ def clock_getres(int) -> float: ... # Unix only
+ def clock_gettime(int) -> float: ... # Unix only
+ def clock_settime(int, struct_time) -> float: ... # Unix only
diff --git a/typeshed/stdlib/3/tkinter/__init__.pyi b/typeshed/stdlib/3/tkinter/__init__.pyi
new file mode 100644
index 0000000..ec61243
--- /dev/null
+++ b/typeshed/stdlib/3/tkinter/__init__.pyi
@@ -0,0 +1,660 @@
+# Stubs for tkinter (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from tkinter.constants import * # noqa: F403
+
+TclError = ... # type: Any
+wantobjects = ... # type: Any
+TkVersion = ... # type: Any
+TclVersion = ... # type: Any
+READABLE = ... # type: Any
+WRITABLE = ... # type: Any
+EXCEPTION = ... # type: Any
+
+class Event: ...
+
+def NoDefaultRoot(): ...
+
+class Variable:
+ def __init__(self, master=None, value=None, name=None): ...
+ def __del__(self): ...
+ def set(self, value): ...
+ initialize = ... # type: Any
+ def get(self): ...
+ def trace_variable(self, mode, callback): ...
+ trace = ... # type: Any
+ def trace_vdelete(self, mode, cbname): ...
+ def trace_vinfo(self): ...
+ def __eq__(self, other): ...
+
+class StringVar(Variable):
+ def __init__(self, master=None, value=None, name=None): ...
+ def get(self): ...
+
+class IntVar(Variable):
+ def __init__(self, master=None, value=None, name=None): ...
+ def get(self): ...
+
+class DoubleVar(Variable):
+ def __init__(self, master=None, value=None, name=None): ...
+ def get(self): ...
+
+class BooleanVar(Variable):
+ def __init__(self, master=None, value=None, name=None): ...
+ def set(self, value): ...
+ initialize = ... # type: Any
+ def get(self): ...
+
+def mainloop(n=0): ...
+
+getint = ... # type: Any
+getdouble = ... # type: Any
+
+def getboolean(s): ...
+
+class Misc:
+ def destroy(self): ...
+ def deletecommand(self, name): ...
+ def tk_strictMotif(self, boolean=None): ...
+ def tk_bisque(self): ...
+ def tk_setPalette(self, *args, **kw): ...
+ def tk_menuBar(self, *args): ...
+ def wait_variable(self, name=''): ...
+ waitvar = ... # type: Any
+ def wait_window(self, window=None): ...
+ def wait_visibility(self, window=None): ...
+ def setvar(self, name='', value=''): ...
+ def getvar(self, name=''): ...
+ def getint(self, s): ...
+ def getdouble(self, s): ...
+ def getboolean(self, s): ...
+ def focus_set(self): ...
+ focus = ... # type: Any
+ def focus_force(self): ...
+ def focus_get(self): ...
+ def focus_displayof(self): ...
+ def focus_lastfor(self): ...
+ def tk_focusFollowsMouse(self): ...
+ def tk_focusNext(self): ...
+ def tk_focusPrev(self): ...
+ def after(self, ms, func=None, *args): ...
+ def after_idle(self, func, *args): ...
+ def after_cancel(self, id): ...
+ def bell(self, displayof=0): ...
+ def clipboard_get(self, **kw): ...
+ def clipboard_clear(self, **kw): ...
+ def clipboard_append(self, string, **kw): ...
+ def grab_current(self): ...
+ def grab_release(self): ...
+ def grab_set(self): ...
+ def grab_set_global(self): ...
+ def grab_status(self): ...
+ def option_add(self, pattern, value, priority=None): ...
+ def option_clear(self): ...
+ def option_get(self, name, className): ...
+ def option_readfile(self, fileName, priority=None): ...
+ def selection_clear(self, **kw): ...
+ def selection_get(self, **kw): ...
+ def selection_handle(self, command, **kw): ...
+ def selection_own(self, **kw): ...
+ def selection_own_get(self, **kw): ...
+ def send(self, interp, cmd, *args): ...
+ def lower(self, belowThis=None): ...
+ def tkraise(self, aboveThis=None): ...
+ lift = ... # type: Any
+ def winfo_atom(self, name, displayof=0): ...
+ def winfo_atomname(self, id, displayof=0): ...
+ def winfo_cells(self): ...
+ def winfo_children(self): ...
+ def winfo_class(self): ...
+ def winfo_colormapfull(self): ...
+ def winfo_containing(self, rootX, rootY, displayof=0): ...
+ def winfo_depth(self): ...
+ def winfo_exists(self): ...
+ def winfo_fpixels(self, number): ...
+ def winfo_geometry(self): ...
+ def winfo_height(self): ...
+ def winfo_id(self): ...
+ def winfo_interps(self, displayof=0): ...
+ def winfo_ismapped(self): ...
+ def winfo_manager(self): ...
+ def winfo_name(self): ...
+ def winfo_parent(self): ...
+ def winfo_pathname(self, id, displayof=0): ...
+ def winfo_pixels(self, number): ...
+ def winfo_pointerx(self): ...
+ def winfo_pointerxy(self): ...
+ def winfo_pointery(self): ...
+ def winfo_reqheight(self): ...
+ def winfo_reqwidth(self): ...
+ def winfo_rgb(self, color): ...
+ def winfo_rootx(self): ...
+ def winfo_rooty(self): ...
+ def winfo_screen(self): ...
+ def winfo_screencells(self): ...
+ def winfo_screendepth(self): ...
+ def winfo_screenheight(self): ...
+ def winfo_screenmmheight(self): ...
+ def winfo_screenmmwidth(self): ...
+ def winfo_screenvisual(self): ...
+ def winfo_screenwidth(self): ...
+ def winfo_server(self): ...
+ def winfo_toplevel(self): ...
+ def winfo_viewable(self): ...
+ def winfo_visual(self): ...
+ def winfo_visualid(self): ...
+ def winfo_visualsavailable(self, includeids=0): ...
+ def winfo_vrootheight(self): ...
+ def winfo_vrootwidth(self): ...
+ def winfo_vrootx(self): ...
+ def winfo_vrooty(self): ...
+ def winfo_width(self): ...
+ def winfo_x(self): ...
+ def winfo_y(self): ...
+ def update(self): ...
+ def update_idletasks(self): ...
+ def bindtags(self, tagList=None): ...
+ def bind(self, sequence=None, func=None, add=None): ...
+ def unbind(self, sequence, funcid=None): ...
+ def bind_all(self, sequence=None, func=None, add=None): ...
+ def unbind_all(self, sequence): ...
+ def bind_class(self, className, sequence=None, func=None, add=None): ...
+ def unbind_class(self, className, sequence): ...
+ def mainloop(self, n=0): ...
+ def quit(self): ...
+ def nametowidget(self, name): ...
+ register = ... # type: Any
+ def configure(self, cnf=None, **kw): ...
+ config = ... # type: Any
+ def cget(self, key): ...
+ __getitem__ = ... # type: Any
+ def __setitem__(self, key, value): ...
+ def keys(self): ...
+ def pack_propagate(self, flag=...): ...
+ propagate = ... # type: Any
+ def pack_slaves(self): ...
+ slaves = ... # type: Any
+ def place_slaves(self): ...
+ def grid_anchor(self, anchor=None): ...
+ anchor = ... # type: Any
+ def grid_bbox(self, column=None, row=None, col2=None, row2=None): ...
+ bbox = ... # type: Any
+ def grid_columnconfigure(self, index, cnf=..., **kw): ...
+ columnconfigure = ... # type: Any
+ def grid_location(self, x, y): ...
+ def grid_propagate(self, flag=...): ...
+ def grid_rowconfigure(self, index, cnf=..., **kw): ...
+ rowconfigure = ... # type: Any
+ def grid_size(self): ...
+ size = ... # type: Any
+ def grid_slaves(self, row=None, column=None): ...
+ def event_add(self, virtual, *sequences): ...
+ def event_delete(self, virtual, *sequences): ...
+ def event_generate(self, sequence, **kw): ...
+ def event_info(self, virtual=None): ...
+ def image_names(self): ...
+ def image_types(self): ...
+
+class CallWrapper:
+ func = ... # type: Any
+ subst = ... # type: Any
+ widget = ... # type: Any
+ def __init__(self, func, subst, widget): ...
+ def __call__(self, *args): ...
+
+class XView:
+ def xview(self, *args): ...
+ def xview_moveto(self, fraction): ...
+ def xview_scroll(self, number, what): ...
+
+class YView:
+ def yview(self, *args): ...
+ def yview_moveto(self, fraction): ...
+ def yview_scroll(self, number, what): ...
+
+class Wm:
+ def wm_aspect(self, minNumer=None, minDenom=None, maxNumer=None, maxDenom=None): ...
+ aspect = ... # type: Any
+ def wm_attributes(self, *args): ...
+ attributes = ... # type: Any
+ def wm_client(self, name=None): ...
+ client = ... # type: Any
+ def wm_colormapwindows(self, *wlist): ...
+ colormapwindows = ... # type: Any
+ def wm_command(self, value=None): ...
+ command = ... # type: Any
+ def wm_deiconify(self): ...
+ deiconify = ... # type: Any
+ def wm_focusmodel(self, model=None): ...
+ focusmodel = ... # type: Any
+ def wm_forget(self, window): ...
+ forget = ... # type: Any
+ def wm_frame(self): ...
+ frame = ... # type: Any
+ def wm_geometry(self, newGeometry=None): ...
+ geometry = ... # type: Any
+ def wm_grid(self, baseWidth=None, baseHeight=None, widthInc=None, heightInc=None): ...
+ grid = ... # type: Any
+ def wm_group(self, pathName=None): ...
+ group = ... # type: Any
+ def wm_iconbitmap(self, bitmap=None, default=None): ...
+ iconbitmap = ... # type: Any
+ def wm_iconify(self): ...
+ iconify = ... # type: Any
+ def wm_iconmask(self, bitmap=None): ...
+ iconmask = ... # type: Any
+ def wm_iconname(self, newName=None): ...
+ iconname = ... # type: Any
+ def wm_iconphoto(self, default=False, *args): ...
+ iconphoto = ... # type: Any
+ def wm_iconposition(self, x=None, y=None): ...
+ iconposition = ... # type: Any
+ def wm_iconwindow(self, pathName=None): ...
+ iconwindow = ... # type: Any
+ def wm_manage(self, widget): ...
+ manage = ... # type: Any
+ def wm_maxsize(self, width=None, height=None): ...
+ maxsize = ... # type: Any
+ def wm_minsize(self, width=None, height=None): ...
+ minsize = ... # type: Any
+ def wm_overrideredirect(self, boolean=None): ...
+ overrideredirect = ... # type: Any
+ def wm_positionfrom(self, who=None): ...
+ positionfrom = ... # type: Any
+ def wm_protocol(self, name=None, func=None): ...
+ protocol = ... # type: Any
+ def wm_resizable(self, width=None, height=None): ...
+ resizable = ... # type: Any
+ def wm_sizefrom(self, who=None): ...
+ sizefrom = ... # type: Any
+ def wm_state(self, newstate=None): ...
+ state = ... # type: Any
+ def wm_title(self, string=None): ...
+ title = ... # type: Any
+ def wm_transient(self, master=None): ...
+ transient = ... # type: Any
+ def wm_withdraw(self): ...
+ withdraw = ... # type: Any
+
+class Tk(Misc, Wm):
+ master = ... # type: Any
+ children = ... # type: Any
+ tk = ... # type: Any
+ def __init__(self, screenName=None, baseName=None, className='', useTk=1, sync=0, use=None): ...
+ def loadtk(self): ...
+ def destroy(self): ...
+ def readprofile(self, baseName, className): ...
+ def report_callback_exception(self, exc, val, tb): ...
+ def __getattr__(self, attr): ...
+
+def Tcl(screenName=None, baseName=None, className='', useTk=0): ...
+
+class Pack:
+ def pack_configure(self, cnf=..., **kw): ...
+ pack = ... # type: Any
+ def pack_forget(self): ...
+ forget = ... # type: Any
+ def pack_info(self): ...
+ info = ... # type: Any
+ propagate = ... # type: Any
+ slaves = ... # type: Any
+
+class Place:
+ def place_configure(self, cnf=..., **kw): ...
+ place = ... # type: Any
+ def place_forget(self): ...
+ forget = ... # type: Any
+ def place_info(self): ...
+ info = ... # type: Any
+ slaves = ... # type: Any
+
+class Grid:
+ def grid_configure(self, cnf=..., **kw): ...
+ grid = ... # type: Any
+ bbox = ... # type: Any
+ columnconfigure = ... # type: Any
+ def grid_forget(self): ...
+ forget = ... # type: Any
+ def grid_remove(self): ...
+ def grid_info(self): ...
+ info = ... # type: Any
+ location = ... # type: Any
+ propagate = ... # type: Any
+ rowconfigure = ... # type: Any
+ size = ... # type: Any
+ slaves = ... # type: Any
+
+class BaseWidget(Misc):
+ widgetName = ... # type: Any
+ def __init__(self, master, widgetName, cnf=..., kw=..., extra=...): ...
+ def destroy(self): ...
+
+class Widget(BaseWidget, Pack, Place, Grid): ...
+
+class Toplevel(BaseWidget, Wm):
+ def __init__(self, master=None, cnf=..., **kw): ...
+
+class Button(Widget):
+ def __init__(self, master=None, cnf=..., **kw): ...
+ def flash(self): ...
+ def invoke(self): ...
+
+class Canvas(Widget, XView, YView):
+ def __init__(self, master=None, cnf=..., **kw): ...
+ def addtag(self, *args): ...
+ def addtag_above(self, newtag, tagOrId): ...
+ def addtag_all(self, newtag): ...
+ def addtag_below(self, newtag, tagOrId): ...
+ def addtag_closest(self, newtag, x, y, halo=None, start=None): ...
+ def addtag_enclosed(self, newtag, x1, y1, x2, y2): ...
+ def addtag_overlapping(self, newtag, x1, y1, x2, y2): ...
+ def addtag_withtag(self, newtag, tagOrId): ...
+ def bbox(self, *args): ...
+ def tag_unbind(self, tagOrId, sequence, funcid=None): ...
+ def tag_bind(self, tagOrId, sequence=None, func=None, add=None): ...
+ def canvasx(self, screenx, gridspacing=None): ...
+ def canvasy(self, screeny, gridspacing=None): ...
+ def coords(self, *args): ...
+ def create_arc(self, *args, **kw): ...
+ def create_bitmap(self, *args, **kw): ...
+ def create_image(self, *args, **kw): ...
+ def create_line(self, *args, **kw): ...
+ def create_oval(self, *args, **kw): ...
+ def create_polygon(self, *args, **kw): ...
+ def create_rectangle(self, *args, **kw): ...
+ def create_text(self, *args, **kw): ...
+ def create_window(self, *args, **kw): ...
+ def dchars(self, *args): ...
+ def delete(self, *args): ...
+ def dtag(self, *args): ...
+ def find(self, *args): ...
+ def find_above(self, tagOrId): ...
+ def find_all(self): ...
+ def find_below(self, tagOrId): ...
+ def find_closest(self, x, y, halo=None, start=None): ...
+ def find_enclosed(self, x1, y1, x2, y2): ...
+ def find_overlapping(self, x1, y1, x2, y2): ...
+ def find_withtag(self, tagOrId): ...
+ def focus(self, *args): ...
+ def gettags(self, *args): ...
+ def icursor(self, *args): ...
+ def index(self, *args): ...
+ def insert(self, *args): ...
+ def itemcget(self, tagOrId, option): ...
+ def itemconfigure(self, tagOrId, cnf=None, **kw): ...
+ itemconfig = ... # type: Any
+ def tag_lower(self, *args): ...
+ lower = ... # type: Any
+ def move(self, *args): ...
+ def postscript(self, cnf=..., **kw): ...
+ def tag_raise(self, *args): ...
+ lift = ... # type: Any
+ def scale(self, *args): ...
+ def scan_mark(self, x, y): ...
+ def scan_dragto(self, x, y, gain=10): ...
+ def select_adjust(self, tagOrId, index): ...
+ def select_clear(self): ...
+ def select_from(self, tagOrId, index): ...
+ def select_item(self): ...
+ def select_to(self, tagOrId, index): ...
+ def type(self, tagOrId): ...
+
+class Checkbutton(Widget):
+ def __init__(self, master=None, cnf=..., **kw): ...
+ def deselect(self): ...
+ def flash(self): ...
+ def invoke(self): ...
+ def select(self): ...
+ def toggle(self): ...
+
+class Entry(Widget, XView):
+ def __init__(self, master=None, cnf=..., **kw): ...
+ def delete(self, first, last=None): ...
+ def get(self): ...
+ def icursor(self, index): ...
+ def index(self, index): ...
+ def insert(self, index, string): ...
+ def scan_mark(self, x): ...
+ def scan_dragto(self, x): ...
+ def selection_adjust(self, index): ...
+ select_adjust = ... # type: Any
+ def selection_clear(self): ...
+ select_clear = ... # type: Any
+ def selection_from(self, index): ...
+ select_from = ... # type: Any
+ def selection_present(self): ...
+ select_present = ... # type: Any
+ def selection_range(self, start, end): ...
+ select_range = ... # type: Any
+ def selection_to(self, index): ...
+ select_to = ... # type: Any
+
+class Frame(Widget):
+ def __init__(self, master=None, cnf=..., **kw): ...
+
+class Label(Widget):
+ def __init__(self, master=None, cnf=..., **kw): ...
+
+class Listbox(Widget, XView, YView):
+ def __init__(self, master=None, cnf=..., **kw): ...
+ def activate(self, index): ...
+ def bbox(self, index): ...
+ def curselection(self): ...
+ def delete(self, first, last=None): ...
+ def get(self, first, last=None): ...
+ def index(self, index): ...
+ def insert(self, index, *elements): ...
+ def nearest(self, y): ...
+ def scan_mark(self, x, y): ...
+ def scan_dragto(self, x, y): ...
+ def see(self, index): ...
+ def selection_anchor(self, index): ...
+ select_anchor = ... # type: Any
+ def selection_clear(self, first, last=None): ...
+ select_clear = ... # type: Any
+ def selection_includes(self, index): ...
+ select_includes = ... # type: Any
+ def selection_set(self, first, last=None): ...
+ select_set = ... # type: Any
+ def size(self): ...
+ def itemcget(self, index, option): ...
+ def itemconfigure(self, index, cnf=None, **kw): ...
+ itemconfig = ... # type: Any
+
+class Menu(Widget):
+ def __init__(self, master=None, cnf=..., **kw): ...
+ def tk_popup(self, x, y, entry=''): ...
+ def tk_bindForTraversal(self): ...
+ def activate(self, index): ...
+ def add(self, itemType, cnf=..., **kw): ...
+ def add_cascade(self, cnf=..., **kw): ...
+ def add_checkbutton(self, cnf=..., **kw): ...
+ def add_command(self, cnf=..., **kw): ...
+ def add_radiobutton(self, cnf=..., **kw): ...
+ def add_separator(self, cnf=..., **kw): ...
+ def insert(self, index, itemType, cnf=..., **kw): ...
+ def insert_cascade(self, index, cnf=..., **kw): ...
+ def insert_checkbutton(self, index, cnf=..., **kw): ...
+ def insert_command(self, index, cnf=..., **kw): ...
+ def insert_radiobutton(self, index, cnf=..., **kw): ...
+ def insert_separator(self, index, cnf=..., **kw): ...
+ def delete(self, index1, index2=None): ...
+ def entrycget(self, index, option): ...
+ def entryconfigure(self, index, cnf=None, **kw): ...
+ entryconfig = ... # type: Any
+ def index(self, index): ...
+ def invoke(self, index): ...
+ def post(self, x, y): ...
+ def type(self, index): ...
+ def unpost(self): ...
+ def xposition(self, index): ...
+ def yposition(self, index): ...
+
+class Menubutton(Widget):
+ def __init__(self, master=None, cnf=..., **kw): ...
+
+class Message(Widget):
+ def __init__(self, master=None, cnf=..., **kw): ...
+
+class Radiobutton(Widget):
+ def __init__(self, master=None, cnf=..., **kw): ...
+ def deselect(self): ...
+ def flash(self): ...
+ def invoke(self): ...
+ def select(self): ...
+
+class Scale(Widget):
+ def __init__(self, master=None, cnf=..., **kw): ...
+ def get(self): ...
+ def set(self, value): ...
+ def coords(self, value=None): ...
+ def identify(self, x, y): ...
+
+class Scrollbar(Widget):
+ def __init__(self, master=None, cnf=..., **kw): ...
+ def activate(self, index=None): ...
+ def delta(self, deltax, deltay): ...
+ def fraction(self, x, y): ...
+ def identify(self, x, y): ...
+ def get(self): ...
+ def set(self, first, last): ...
+
+class Text(Widget, XView, YView):
+ def __init__(self, master=None, cnf=..., **kw): ...
+ def bbox(self, index): ...
+ def compare(self, index1, op, index2): ...
+ def count(self, index1, index2, *args): ...
+ def debug(self, boolean=None): ...
+ def delete(self, index1, index2=None): ...
+ def dlineinfo(self, index): ...
+ def dump(self, index1, index2=None, command=None, **kw): ...
+ def edit(self, *args): ...
+ def edit_modified(self, arg=None): ...
+ def edit_redo(self): ...
+ def edit_reset(self): ...
+ def edit_separator(self): ...
+ def edit_undo(self): ...
+ def get(self, index1, index2=None): ...
+ def image_cget(self, index, option): ...
+ def image_configure(self, index, cnf=None, **kw): ...
+ def image_create(self, index, cnf=..., **kw): ...
+ def image_names(self): ...
+ def index(self, index): ...
+ def insert(self, index, chars, *args): ...
+ def mark_gravity(self, markName, direction=None): ...
+ def mark_names(self): ...
+ def mark_set(self, markName, index): ...
+ def mark_unset(self, *markNames): ...
+ def mark_next(self, index): ...
+ def mark_previous(self, index): ...
+ def peer_create(self, newPathName, cnf=..., **kw): ...
+ def peer_names(self): ...
+ def replace(self, index1, index2, chars, *args): ...
+ def scan_mark(self, x, y): ...
+ def scan_dragto(self, x, y): ...
+ def search(self, pattern, index, stopindex=None, forwards=None, backwards=None, exact=None, regexp=None, nocase=None, count=None, elide=None): ...
+ def see(self, index): ...
+ def tag_add(self, tagName, index1, *args): ...
+ def tag_unbind(self, tagName, sequence, funcid=None): ...
+ def tag_bind(self, tagName, sequence, func, add=None): ...
+ def tag_cget(self, tagName, option): ...
+ def tag_configure(self, tagName, cnf=None, **kw): ...
+ tag_config = ... # type: Any
+ def tag_delete(self, *tagNames): ...
+ def tag_lower(self, tagName, belowThis=None): ...
+ def tag_names(self, index=None): ...
+ def tag_nextrange(self, tagName, index1, index2=None): ...
+ def tag_prevrange(self, tagName, index1, index2=None): ...
+ def tag_raise(self, tagName, aboveThis=None): ...
+ def tag_ranges(self, tagName): ...
+ def tag_remove(self, tagName, index1, index2=None): ...
+ def window_cget(self, index, option): ...
+ def window_configure(self, index, cnf=None, **kw): ...
+ window_config = ... # type: Any
+ def window_create(self, index, cnf=..., **kw): ...
+ def window_names(self): ...
+ def yview_pickplace(self, *what): ...
+
+class _setit:
+ def __init__(self, var, value, callback=None): ...
+ def __call__(self, *args): ...
+
+class OptionMenu(Menubutton):
+ widgetName = ... # type: Any
+ menuname = ... # type: Any
+ def __init__(self, master, variable, value, *values, **kwargs): ...
+ def __getitem__(self, name): ...
+ def destroy(self): ...
+
+class Image:
+ name = ... # type: Any
+ tk = ... # type: Any
+ def __init__(self, imgtype, name=None, cnf=..., master=None, **kw): ...
+ def __del__(self): ...
+ def __setitem__(self, key, value): ...
+ def __getitem__(self, key): ...
+ def configure(self, **kw): ...
+ config = ... # type: Any
+ def height(self): ...
+ def type(self): ...
+ def width(self): ...
+
+class PhotoImage(Image):
+ def __init__(self, name=None, cnf=..., master=None, **kw): ...
+ def blank(self): ...
+ def cget(self, option): ...
+ def __getitem__(self, key): ...
+ def copy(self): ...
+ def zoom(self, x, y=''): ...
+ def subsample(self, x, y=''): ...
+ def get(self, x, y): ...
+ def put(self, data, to=None): ...
+ def write(self, filename, format=None, from_coords=None): ...
+
+class BitmapImage(Image):
+ def __init__(self, name=None, cnf=..., master=None, **kw): ...
+
+def image_names(): ...
+def image_types(): ...
+
+class Spinbox(Widget, XView):
+ def __init__(self, master=None, cnf=..., **kw): ...
+ def bbox(self, index): ...
+ def delete(self, first, last=None): ...
+ def get(self): ...
+ def icursor(self, index): ...
+ def identify(self, x, y): ...
+ def index(self, index): ...
+ def insert(self, index, s): ...
+ def invoke(self, element): ...
+ def scan(self, *args): ...
+ def scan_mark(self, x): ...
+ def scan_dragto(self, x): ...
+ def selection(self, *args): ...
+ def selection_adjust(self, index): ...
+ def selection_clear(self): ...
+ def selection_element(self, element=None): ...
+
+class LabelFrame(Widget):
+ def __init__(self, master=None, cnf=..., **kw): ...
+
+class PanedWindow(Widget):
+ def __init__(self, master=None, cnf=..., **kw): ...
+ def add(self, child, **kw): ...
+ def remove(self, child): ...
+ forget = ... # type: Any
+ def identify(self, x, y): ...
+ def proxy(self, *args): ...
+ def proxy_coord(self): ...
+ def proxy_forget(self): ...
+ def proxy_place(self, x, y): ...
+ def sash(self, *args): ...
+ def sash_coord(self, index): ...
+ def sash_mark(self, index): ...
+ def sash_place(self, index, x, y): ...
+ def panecget(self, child, option): ...
+ def paneconfigure(self, tagOrId, cnf=None, **kw): ...
+ paneconfig = ... # type: Any
+ def panes(self): ...
diff --git a/typeshed/stdlib/3/tkinter/constants.pyi b/typeshed/stdlib/3/tkinter/constants.pyi
new file mode 100644
index 0000000..77645ef
--- /dev/null
+++ b/typeshed/stdlib/3/tkinter/constants.pyi
@@ -0,0 +1,83 @@
+# Stubs for tkinter.constants (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+NO = ... # type: Any
+YES = ... # type: Any
+TRUE = ... # type: Any
+FALSE = ... # type: Any
+ON = ... # type: Any
+OFF = ... # type: Any
+N = ... # type: Any
+S = ... # type: Any
+W = ... # type: Any
+E = ... # type: Any
+NW = ... # type: Any
+SW = ... # type: Any
+NE = ... # type: Any
+SE = ... # type: Any
+NS = ... # type: Any
+EW = ... # type: Any
+NSEW = ... # type: Any
+CENTER = ... # type: Any
+NONE = ... # type: Any
+X = ... # type: Any
+Y = ... # type: Any
+BOTH = ... # type: Any
+LEFT = ... # type: Any
+TOP = ... # type: Any
+RIGHT = ... # type: Any
+BOTTOM = ... # type: Any
+RAISED = ... # type: Any
+SUNKEN = ... # type: Any
+FLAT = ... # type: Any
+RIDGE = ... # type: Any
+GROOVE = ... # type: Any
+SOLID = ... # type: Any
+HORIZONTAL = ... # type: Any
+VERTICAL = ... # type: Any
+NUMERIC = ... # type: Any
+CHAR = ... # type: Any
+WORD = ... # type: Any
+BASELINE = ... # type: Any
+INSIDE = ... # type: Any
+OUTSIDE = ... # type: Any
+SEL = ... # type: Any
+SEL_FIRST = ... # type: Any
+SEL_LAST = ... # type: Any
+END = ... # type: Any
+INSERT = ... # type: Any
+CURRENT = ... # type: Any
+ANCHOR = ... # type: Any
+ALL = ... # type: Any
+NORMAL = ... # type: Any
+DISABLED = ... # type: Any
+ACTIVE = ... # type: Any
+HIDDEN = ... # type: Any
+CASCADE = ... # type: Any
+CHECKBUTTON = ... # type: Any
+COMMAND = ... # type: Any
+RADIOBUTTON = ... # type: Any
+SEPARATOR = ... # type: Any
+SINGLE = ... # type: Any
+BROWSE = ... # type: Any
+MULTIPLE = ... # type: Any
+EXTENDED = ... # type: Any
+DOTBOX = ... # type: Any
+UNDERLINE = ... # type: Any
+PIESLICE = ... # type: Any
+CHORD = ... # type: Any
+ARC = ... # type: Any
+FIRST = ... # type: Any
+LAST = ... # type: Any
+BUTT = ... # type: Any
+PROJECTING = ... # type: Any
+ROUND = ... # type: Any
+BEVEL = ... # type: Any
+MITER = ... # type: Any
+MOVETO = ... # type: Any
+SCROLL = ... # type: Any
+UNITS = ... # type: Any
+PAGES = ... # type: Any
diff --git a/typeshed/stdlib/3/tkinter/ttk.pyi b/typeshed/stdlib/3/tkinter/ttk.pyi
new file mode 100644
index 0000000..099f308
--- /dev/null
+++ b/typeshed/stdlib/3/tkinter/ttk.pyi
@@ -0,0 +1,158 @@
+# Stubs for tkinter.ttk (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+import tkinter
+
+def tclobjs_to_py(adict): ...
+def setup_master(master=None): ...
+
+class Style:
+ master = ... # type: Any
+ tk = ... # type: Any
+ def __init__(self, master=None): ...
+ def configure(self, style, query_opt=None, **kw): ...
+ def map(self, style, query_opt=None, **kw): ...
+ def lookup(self, style, option, state=None, default=None): ...
+ def layout(self, style, layoutspec=None): ...
+ def element_create(self, elementname, etype, *args, **kw): ...
+ def element_names(self): ...
+ def element_options(self, elementname): ...
+ def theme_create(self, themename, parent=None, settings=None): ...
+ def theme_settings(self, themename, settings): ...
+ def theme_names(self): ...
+ def theme_use(self, themename=None): ...
+
+class Widget(tkinter.Widget):
+ def __init__(self, master, widgetname, kw=None): ...
+ def identify(self, x, y): ...
+ def instate(self, statespec, callback=None, *args, **kw): ...
+ def state(self, statespec=None): ...
+
+class Button(Widget):
+ def __init__(self, master=None, **kw): ...
+ def invoke(self): ...
+
+class Checkbutton(Widget):
+ def __init__(self, master=None, **kw): ...
+ def invoke(self): ...
+
+class Entry(Widget, tkinter.Entry):
+ def __init__(self, master=None, widget=None, **kw): ...
+ def bbox(self, index): ...
+ def identify(self, x, y): ...
+ def validate(self): ...
+
+class Combobox(Entry):
+ def __init__(self, master=None, **kw): ...
+ def current(self, newindex=None): ...
+ def set(self, value): ...
+
+class Frame(Widget):
+ def __init__(self, master=None, **kw): ...
+
+class Label(Widget):
+ def __init__(self, master=None, **kw): ...
+
+class Labelframe(Widget):
+ def __init__(self, master=None, **kw): ...
+
+LabelFrame = ... # type: Any
+
+class Menubutton(Widget):
+ def __init__(self, master=None, **kw): ...
+
+class Notebook(Widget):
+ def __init__(self, master=None, **kw): ...
+ def add(self, child, **kw): ...
+ def forget(self, tab_id): ...
+ def hide(self, tab_id): ...
+ def identify(self, x, y): ...
+ def index(self, tab_id): ...
+ def insert(self, pos, child, **kw): ...
+ def select(self, tab_id=None): ...
+ def tab(self, tab_id, option=None, **kw): ...
+ def tabs(self): ...
+ def enable_traversal(self): ...
+
+class Panedwindow(Widget, tkinter.PanedWindow):
+ def __init__(self, master=None, **kw): ...
+ forget = ... # type: Any
+ def insert(self, pos, child, **kw): ...
+ def pane(self, pane, option=None, **kw): ...
+ def sashpos(self, index, newpos=None): ...
+
+PanedWindow = ... # type: Any
+
+class Progressbar(Widget):
+ def __init__(self, master=None, **kw): ...
+ def start(self, interval=None): ...
+ def step(self, amount=None): ...
+ def stop(self): ...
+
+class Radiobutton(Widget):
+ def __init__(self, master=None, **kw): ...
+ def invoke(self): ...
+
+class Scale(Widget, tkinter.Scale):
+ def __init__(self, master=None, **kw): ...
+ def configure(self, cnf=None, **kw): ...
+ def get(self, x=None, y=None): ...
+
+class Scrollbar(Widget, tkinter.Scrollbar):
+ def __init__(self, master=None, **kw): ...
+
+class Separator(Widget):
+ def __init__(self, master=None, **kw): ...
+
+class Sizegrip(Widget):
+ def __init__(self, master=None, **kw): ...
+
+class Treeview(Widget, tkinter.XView, tkinter.YView):
+ def __init__(self, master=None, **kw): ...
+ def bbox(self, item, column=None): ...
+ def get_children(self, item=None): ...
+ def set_children(self, item, *newchildren): ...
+ def column(self, column, option=None, **kw): ...
+ def delete(self, *items): ...
+ def detach(self, *items): ...
+ def exists(self, item): ...
+ def focus(self, item=None): ...
+ def heading(self, column, option=None, **kw): ...
+ def identify(self, component, x, y): ...
+ def identify_row(self, y): ...
+ def identify_column(self, x): ...
+ def identify_region(self, x, y): ...
+ def identify_element(self, x, y): ...
+ def index(self, item): ...
+ def insert(self, parent, index, iid=None, **kw): ...
+ def item(self, item, option=None, **kw): ...
+ def move(self, item, parent, index): ...
+ reattach = ... # type: Any
+ def next(self, item): ...
+ def parent(self, item): ...
+ def prev(self, item): ...
+ def see(self, item): ...
+ def selection(self, selop=None, items=None): ...
+ def selection_set(self, items): ...
+ def selection_add(self, items): ...
+ def selection_remove(self, items): ...
+ def selection_toggle(self, items): ...
+ def set(self, item, column=None, value=None): ...
+ def tag_bind(self, tagname, sequence=None, callback=None): ...
+ def tag_configure(self, tagname, option=None, **kw): ...
+ def tag_has(self, tagname, item=None): ...
+
+class LabeledScale(Frame):
+ label = ... # type: Any
+ scale = ... # type: Any
+ def __init__(self, master=None, variable=None, from_=0, to=10, **kw): ...
+ def destroy(self): ...
+ value = ... # type: Any
+
+class OptionMenu(Menubutton):
+ def __init__(self, master, variable, default=None, *values, **kwargs): ...
+ def __getitem__(self, item): ...
+ def set_menu(self, default=None, *values): ...
+ def destroy(self): ...
diff --git a/typeshed/stdlib/3/token.pyi b/typeshed/stdlib/3/token.pyi
new file mode 100644
index 0000000..24e6ea3
--- /dev/null
+++ b/typeshed/stdlib/3/token.pyi
@@ -0,0 +1,63 @@
+from typing import Dict
+
+ENDMARKER = 0
+NAME = 0
+NUMBER = 0
+STRING = 0
+NEWLINE = 0
+INDENT = 0
+DEDENT = 0
+LPAR = 0
+RPAR = 0
+LSQB = 0
+RSQB = 0
+COLON = 0
+COMMA = 0
+SEMI = 0
+PLUS = 0
+MINUS = 0
+STAR = 0
+SLASH = 0
+VBAR = 0
+AMPER = 0
+LESS = 0
+GREATER = 0
+EQUAL = 0
+DOT = 0
+PERCENT = 0
+LBRACE = 0
+RBRACE = 0
+EQEQUAL = 0
+NOTEQUAL = 0
+LESSEQUAL = 0
+GREATEREQUAL = 0
+TILDE = 0
+CIRCUMFLEX = 0
+LEFTSHIFT = 0
+RIGHTSHIFT = 0
+DOUBLESTAR = 0
+PLUSEQUAL = 0
+MINEQUAL = 0
+STAREQUAL = 0
+SLASHEQUAL = 0
+PERCENTEQUAL = 0
+AMPEREQUAL = 0
+VBAREQUAL = 0
+CIRCUMFLEXEQUAL = 0
+LEFTSHIFTEQUAL = 0
+RIGHTSHIFTEQUAL = 0
+DOUBLESTAREQUAL = 0
+DOUBLESLASH = 0
+DOUBLESLASHEQUAL = 0
+AT = 0
+RARROW = 0
+ELLIPSIS = 0
+OP = 0
+ERRORTOKEN = 0
+N_TOKENS = 0
+NT_OFFSET = 0
+tok_name = ... # type: Dict[int, str]
+
+def ISTERMINAL(x: int) -> bool: pass
+def ISNONTERMINAL(x: int) -> bool: pass
+def ISEOF(x: int) -> bool: pass
diff --git a/typeshed/stdlib/3/tokenize.pyi b/typeshed/stdlib/3/tokenize.pyi
new file mode 100644
index 0000000..9849f68
--- /dev/null
+++ b/typeshed/stdlib/3/tokenize.pyi
@@ -0,0 +1,99 @@
+# Stubs for tokenize (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Union, TextIO
+from builtins import open as _builtin_open
+from token import * # noqa: F403
+
+COMMENT = ... # type: Any
+NL = ... # type: Any
+ENCODING = ... # type: Any
+
+class TokenInfo:
+ @property
+ def exact_type(self): ...
+
+class TokenError(Exception): ...
+class StopTokenizing(Exception): ...
+
+class Untokenizer:
+ tokens = ... # type: Any
+ prev_row = ... # type: Any
+ prev_col = ... # type: Any
+ encoding = ... # type: Any
+ def __init__(self): ...
+ def add_whitespace(self, start): ...
+ def untokenize(self, iterable): ...
+ def compat(self, token, iterable): ...
+
+def untokenize(iterable): ...
+def detect_encoding(readline): ...
+def tokenize(readline): ...
+
+def open(filename: Union[str, bytes, int]) -> TextIO: ...
+
+# Names in __all__ with no definition:
+# AMPER
+# AMPEREQUAL
+# ASYNC
+# AT
+# ATEQUAL
+# AWAIT
+# CIRCUMFLEX
+# CIRCUMFLEXEQUAL
+# COLON
+# COMMA
+# DEDENT
+# DOT
+# DOUBLESLASH
+# DOUBLESLASHEQUAL
+# DOUBLESTAR
+# DOUBLESTAREQUAL
+# ELLIPSIS
+# ENDMARKER
+# EQEQUAL
+# EQUAL
+# ERRORTOKEN
+# GREATER
+# GREATEREQUAL
+# INDENT
+# ISEOF
+# ISNONTERMINAL
+# ISTERMINAL
+# LBRACE
+# LEFTSHIFT
+# LEFTSHIFTEQUAL
+# LESS
+# LESSEQUAL
+# LPAR
+# LSQB
+# MINEQUAL
+# MINUS
+# NAME
+# NEWLINE
+# NOTEQUAL
+# NT_OFFSET
+# NUMBER
+# N_TOKENS
+# OP
+# PERCENT
+# PERCENTEQUAL
+# PLUS
+# PLUSEQUAL
+# RARROW
+# RBRACE
+# RIGHTSHIFT
+# RIGHTSHIFTEQUAL
+# RPAR
+# RSQB
+# SEMI
+# SLASH
+# SLASHEQUAL
+# STAR
+# STAREQUAL
+# STRING
+# TILDE
+# VBAR
+# VBAREQUAL
+# tok_name
diff --git a/typeshed/stdlib/3/types.pyi b/typeshed/stdlib/3/types.pyi
new file mode 100644
index 0000000..17e3347
--- /dev/null
+++ b/typeshed/stdlib/3/types.pyi
@@ -0,0 +1,151 @@
+# Stubs for types
+# Note, all classes "defined" here require special handling.
+
+# TODO parts of this should be conditional on version
+
+import sys
+from typing import (
+ Any, Callable, Dict, Generic, Iterator, Mapping, Optional, Tuple, TypeVar,
+ Union, overload
+)
+
+# ModuleType is exported from this module, but for circular import
+# reasons exists in its own stub file (with ModuleSpec and Loader).
+from _importlib_modulespec import ModuleType as ModuleType # Exported
+
+_T = TypeVar('_T')
+_KT = TypeVar('_KT')
+_VT = TypeVar('_VT')
+
+class _Cell:
+ cell_contents = ... # type: Any
+
+class FunctionType:
+ __closure__ = ... # type: Optional[Tuple[_Cell, ...]]
+ __code__ = ... # type: CodeType
+ __defaults__ = ... # type: Optional[Tuple[Any, ...]]
+ __dict__ = ... # type: Dict[str, Any]
+ __globals__ = ... # type: Dict[str, Any]
+ __name__ = ... # type: str
+ def __call__(self, *args: Any, **kwargs: Any) -> Any: ...
+ def __get__(self, obj: Optional[object], type: Optional[type]) -> 'MethodType': ...
+LambdaType = FunctionType
+
+class CodeType:
+ """Create a code object. Not for the faint of heart."""
+ co_argcount = ... # type: int
+ co_kwonlyargcount = ... # type: int
+ co_nlocals = ... # type: int
+ co_stacksize = ... # type: int
+ co_flags = ... # type: int
+ co_code = ... # type: bytes
+ co_consts = ... # type: Tuple[Any, ...]
+ co_names = ... # type: Tuple[str, ...]
+ co_varnames = ... # type: Tuple[str, ...]
+ co_filename = ... # type: Optional[str]
+ co_name = ... # type: str
+ co_firstlineno = ... # type: int
+ co_lnotab = ... # type: bytes
+ co_freevars = ... # type: Tuple[str, ...]
+ co_cellvars = ... # type: Tuple[str, ...]
+ def __init__(
+ self,
+ argcount: int,
+ kwonlyargcount: int,
+ nlocals: int,
+ stacksize: int,
+ flags: int,
+ codestring: bytes,
+ constants: Tuple[Any, ...],
+ names: Tuple[str, ...],
+ varnames: Tuple[str, ...],
+ filename: str,
+ name: str,
+ firstlineno: int,
+ lnotab: bytes,
+ freevars: Tuple[str, ...] = ...,
+ cellvars: Tuple[str, ...] = ...,
+ ) -> None: ...
+
+class MappingProxyType(Mapping[_KT, _VT], Generic[_KT, _VT]):
+ def __init__(self, mapping: Mapping[_KT, _VT]) -> None: ...
+ def __getitem__(self, k: _KT) -> _VT: ...
+ def __iter__(self) -> Iterator[_KT]: ...
+ def __len__(self) -> int: ...
+
+# TODO: use __getattr__ and __setattr__ instead of inheriting from Any, pending mypy#521.
+class SimpleNamespace(Any): ... # type: ignore
+
+class GeneratorType:
+ gi_code = ... # type: CodeType
+ gi_frame = ... # type: FrameType
+ gi_running = ... # type: bool
+ gi_yieldfrom = ... # type: Optional[GeneratorType]
+ def __iter__(self) -> 'GeneratorType': ...
+ def __next__(self) -> Any: ...
+ def close(self) -> None: ...
+ def send(self, arg: Any) -> Any: ...
+ @overload
+ def throw(self, val: BaseException) -> Any: ...
+ @overload
+ def throw(self, typ: type, val: BaseException = ..., tb: 'TracebackType' = ...) -> Any: ...
+
+class CoroutineType:
+ cr_await = ... # type: Optional[Any]
+ cr_code = ... # type: CodeType
+ cr_frame = ... # type: FrameType
+ cr_running = ... # type: bool
+ def close(self) -> None: ...
+ def send(self, arg: Any) -> Any: ...
+ @overload
+ def throw(self, val: BaseException) -> Any: ...
+ @overload
+ def throw(self, typ: type, val: BaseException = ..., tb: 'TracebackType' = ...) -> Any: ...
+
+class MethodType:
+ __func__ = ... # type: FunctionType
+ __self__ = ... # type: object
+ def __call__(self, *args: Any, **kwargs: Any) -> Any: ...
+class BuiltinFunctionType:
+ __self__ = ... # type: Union[object, ModuleType]
+ def __call__(self, *args: Any, **kwargs: Any) -> Any: ...
+BuiltinMethodType = BuiltinFunctionType
+
+class TracebackType:
+ tb_frame = ... # type: FrameType
+ tb_lasti = ... # type: int
+ tb_lineno = ... # type: int
+ tb_next = ... # type: TracebackType
+
+class FrameType:
+ f_back = ... # type: FrameType
+ f_builtins = ... # type: Dict[str, Any]
+ f_code = ... # type: CodeType
+ f_globals = ... # type: Dict[str, Any]
+ f_lasti = ... # type: int
+ f_lineno = ... # type: int
+ f_locals = ... # type: Dict[str, Any]
+ f_trace = ... # type: Callable[[], None]
+
+ def clear(self) -> None: pass
+
+class GetSetDescriptorType:
+ __name__ = ... # type: str
+ __objclass__ = ... # type: type
+ def __get__(self, obj: Any, type: type = ...) -> Any: ...
+ def __set__(self, obj: Any) -> None: ...
+ def __delete__(self, obj: Any) -> None: ...
+class MemberDescriptorType:
+ __name__ = ... # type: str
+ __objclass__ = ... # type: type
+ def __get__(self, obj: Any, type: type = ...) -> Any: ...
+ def __set__(self, obj: Any) -> None: ...
+ def __delete__(self, obj: Any) -> None: ...
+
+def new_class(name: str, bases: Tuple[type, ...] = ..., kwds: Dict[str, Any] = ..., exec_body: Callable[[Dict[str, Any]], None] = ...) -> type: ...
+def prepare_class(name: str, bases: Tuple[type, ...] = ..., kwds: Dict[str, Any] = ...) -> Tuple[type, Dict[str, Any], Dict[str, Any]]: ...
+
+# Actually a different type, but `property` is special and we want that too.
+DynamicClassAttribute = property
+
+def coroutine(f: Callable[..., Any]) -> CoroutineType: ...
diff --git a/typeshed/stdlib/3/typing.pyi b/typeshed/stdlib/3/typing.pyi
new file mode 100644
index 0000000..099f925
--- /dev/null
+++ b/typeshed/stdlib/3/typing.pyi
@@ -0,0 +1,449 @@
+# Stubs for typing
+
+import sys
+from abc import abstractmethod, ABCMeta
+
+# Definitions of special type checking related constructs. Their definition
+# are not used, so their value does not matter.
+
+overload = object()
+Any = object()
+TypeVar = object()
+Generic = object()
+Tuple = object()
+Callable = object()
+Type = object()
+_promote = object()
+no_type_check = object()
+
+class GenericMeta(type): ...
+
+# Type aliases and type constructors
+
+class TypeAlias:
+ # Class for defining generic aliases for library types.
+ def __init__(self, target_type: type) -> None: ...
+ def __getitem__(self, typeargs: Any) -> Any: ...
+
+Union = TypeAlias(object)
+Optional = TypeAlias(object)
+List = TypeAlias(object)
+Dict = TypeAlias(object)
+DefaultDict = TypeAlias(object)
+Set = TypeAlias(object)
+
+# Predefined type variables.
+AnyStr = TypeVar('AnyStr', str, bytes)
+
+# Abstract base classes.
+
+# These type variables are used by the container types.
+_T = TypeVar('_T')
+_S = TypeVar('_S')
+_KT = TypeVar('_KT') # Key type.
+_VT = TypeVar('_VT') # Value type.
+_T_co = TypeVar('_T_co', covariant=True) # Any type covariant containers.
+_V_co = TypeVar('_V_co', covariant=True) # Any type covariant containers.
+_KT_co = TypeVar('_KT_co', covariant=True) # Key type covariant containers.
+_VT_co = TypeVar('_VT_co', covariant=True) # Value type covariant containers.
+_T_contra = TypeVar('_T_contra', contravariant=True) # Ditto contravariant.
+
+class SupportsInt(metaclass=ABCMeta):
+ @abstractmethod
+ def __int__(self) -> int: ...
+
+class SupportsFloat(metaclass=ABCMeta):
+ @abstractmethod
+ def __float__(self) -> float: ...
+
+class SupportsComplex(metaclass=ABCMeta):
+ @abstractmethod
+ def __complex__(self) -> complex: pass
+
+class SupportsBytes(metaclass=ABCMeta):
+ @abstractmethod
+ def __bytes__(self) -> bytes: pass
+
+class SupportsAbs(Generic[_T]):
+ @abstractmethod
+ def __abs__(self) -> _T: ...
+
+class SupportsRound(Generic[_T]):
+ @abstractmethod
+ def __round__(self, ndigits: int = ...) -> _T: ...
+
+class Reversible(Generic[_T_co]):
+ @abstractmethod
+ def __reversed__(self) -> Iterator[_T_co]: ...
+
+class Sized(metaclass=ABCMeta):
+ @abstractmethod
+ def __len__(self) -> int: ...
+
+class Hashable(metaclass=ABCMeta):
+ # TODO: This is special, in that a subclass of a hashable class may not be hashable
+ # (for example, list vs. object). It's not obvious how to represent this. This class
+ # is currently mostly useless for static checking.
+ @abstractmethod
+ def __hash__(self) -> int: ...
+
+class Iterable(Generic[_T_co]):
+ @abstractmethod
+ def __iter__(self) -> Iterator[_T_co]: ...
+
+class Iterator(Iterable[_T_co], Generic[_T_co]):
+ @abstractmethod
+ def __next__(self) -> _T_co: ...
+ def __iter__(self) -> 'Iterator[_T_co]': ...
+
+class Generator(Iterator[_T_co], Generic[_T_co, _T_contra, _V_co]):
+ @abstractmethod
+ def __next__(self) -> _T_co: ...
+
+ @abstractmethod
+ def send(self, value: _T_contra) -> _T_co: ...
+
+ @abstractmethod
+ def throw(self, typ: Type[BaseException], val: Optional[BaseException] = None,
+ # TODO: tb should be TracebackType but that's defined in types
+ tb: Any = None) -> None: ...
+
+ @abstractmethod
+ def close(self) -> None: ...
+
+ @abstractmethod
+ def __iter__(self) -> 'Generator[_T_co, _T_contra, _V_co]': ...
+
+# TODO: Several types should only be defined if sys.python_version >= (3, 5):
+# Awaitable, AsyncIterator, AsyncIterable, Coroutine, Collection, ContextManager.
+# See https: //github.com/python/typeshed/issues/655 for why this is not easy.
+
+class Awaitable(Generic[_T_co]):
+ @abstractmethod
+ def __await__(self) -> Generator[Any, None, _T_co]: ...
+
+class Coroutine(Awaitable[_V_co], Generic[_T_co, _T_contra, _V_co]):
+ @abstractmethod
+ def send(self, value: _T_contra) -> _T_co: ...
+
+ @abstractmethod
+ def throw(self, typ: Type[BaseException], val: Optional[BaseException] = None,
+ # TODO: tb should be TracebackType but that's defined in types
+ tb: Any = None) -> None: ...
+
+ @abstractmethod
+ def close(self) -> None: ...
+
+
+# NOTE: This type does not exist in typing.py or PEP 484.
+# The parameters corrrespond to Generator, but the 4th is the original type.
+class AwaitableGenerator(Generator[_T_co, _T_contra, _V_co], Awaitable[_V_co],
+ Generic[_T_co, _T_contra, _V_co, _S]):
+ pass
+
+class AsyncIterable(Generic[_T_co]):
+ @abstractmethod
+ def __anext__(self) -> Awaitable[_T_co]: ...
+
+class AsyncIterator(AsyncIterable[_T_co],
+ Generic[_T_co]):
+ @abstractmethod
+ def __anext__(self) -> Awaitable[_T_co]: ...
+ def __aiter__(self) -> 'AsyncIterator[_T_co]': ...
+
+class Container(Generic[_T_co]):
+ @abstractmethod
+ def __contains__(self, x: object) -> bool: ...
+
+class Sequence(Iterable[_T_co], Container[_T_co], Sized, Reversible[_T_co], Generic[_T_co]):
+ @overload
+ @abstractmethod
+ def __getitem__(self, i: int) -> _T_co: ...
+ @overload
+ @abstractmethod
+ def __getitem__(self, s: slice) -> Sequence[_T_co]: ...
+ # Mixin methods
+ if sys.version_info >= (3, 5):
+ def index(self, x: Any, start: int = 0, end: int = 0) -> int: ...
+ else:
+ def index(self, x: Any) -> int: ...
+ def count(self, x: Any) -> int: ...
+ def __contains__(self, x: object) -> bool: ...
+ def __iter__(self) -> Iterator[_T_co]: ...
+ def __reversed__(self) -> Iterator[_T_co]: ...
+
+class MutableSequence(Sequence[_T], Generic[_T]):
+ @abstractmethod
+ def insert(self, index: int, object: _T) -> None: ...
+ @overload
+ @abstractmethod
+ def __setitem__(self, i: int, o: _T) -> None: ...
+ @overload
+ @abstractmethod
+ def __setitem__(self, s: slice, o: Iterable[_T]) -> None: ...
+ @overload
+ @abstractmethod
+ def __delitem__(self, i: int) -> None: ...
+ @overload
+ @abstractmethod
+ def __delitem__(self, i: slice) -> None: ...
+ # Mixin methods
+ def append(self, object: _T) -> None: ...
+ def extend(self, iterable: Iterable[_T]) -> None: ...
+ def reverse(self) -> None: ...
+ def pop(self, index: int = ...) -> _T: ...
+ def remove(self, object: _T) -> None: ...
+ def __iadd__(self, x: Iterable[_T]) -> MutableSequence[_T]: ...
+
+class AbstractSet(Iterable[_T_co], Container[_T_co], Sized, Generic[_T_co]):
+ @abstractmethod
+ def __contains__(self, x: object) -> bool: ...
+ # Mixin methods
+ def __le__(self, s: AbstractSet[Any]) -> bool: ...
+ def __lt__(self, s: AbstractSet[Any]) -> bool: ...
+ def __gt__(self, s: AbstractSet[Any]) -> bool: ...
+ def __ge__(self, s: AbstractSet[Any]) -> bool: ...
+ def __and__(self, s: AbstractSet[Any]) -> AbstractSet[_T_co]: ...
+ def __or__(self, s: AbstractSet[_T]) -> AbstractSet[Union[_T_co, _T]]: ...
+ def __sub__(self, s: AbstractSet[Any]) -> AbstractSet[_T_co]: ...
+ def __xor__(self, s: AbstractSet[_T]) -> AbstractSet[Union[_T_co, _T]]: ...
+ # TODO: Argument can be a more general ABC?
+ def isdisjoint(self, s: AbstractSet[Any]) -> bool: ...
+
+class FrozenSet(AbstractSet[_T_co], Generic[_T_co]): ...
+
+class MutableSet(AbstractSet[_T], Generic[_T]):
+ @abstractmethod
+ def add(self, x: _T) -> None: ...
+ @abstractmethod
+ def discard(self, x: _T) -> None: ...
+ # Mixin methods
+ def clear(self) -> None: ...
+ def pop(self) -> _T: ...
+ def remove(self, element: _T) -> None: ...
+ def __ior__(self, s: AbstractSet[_S]) -> MutableSet[Union[_T, _S]]: ...
+ def __iand__(self, s: AbstractSet[Any]) -> MutableSet[_T]: ...
+ def __ixor__(self, s: AbstractSet[_S]) -> MutableSet[Union[_T, _S]]: ...
+ def __isub__(self, s: AbstractSet[Any]) -> MutableSet[_T]: ...
+
+class MappingView(Sized):
+ def __len__(self) -> int: ...
+
+class ItemsView(AbstractSet[Tuple[_KT_co, _VT_co]], MappingView, Generic[_KT_co, _VT_co]):
+ def __contains__(self, o: object) -> bool: ...
+ def __iter__(self) -> Iterator[Tuple[_KT_co, _VT_co]]: ...
+
+class KeysView(AbstractSet[_KT_co], MappingView, Generic[_KT_co]):
+ def __contains__(self, o: object) -> bool: ...
+ def __iter__(self) -> Iterator[_KT_co]: ...
+
+class ValuesView(MappingView, Iterable[_VT_co], Generic[_VT_co]):
+ def __contains__(self, o: object) -> bool: ...
+ def __iter__(self) -> Iterator[_VT_co]: ...
+
+# TODO: ContextManager (only if contextlib.AbstractContextManager exists)
+
+class Mapping(Iterable[_KT], Container[_KT], Sized, Generic[_KT, _VT_co]):
+ # TODO: We wish the key type could also be covariant, but that doesn't work,
+ # see discussion in https: //github.com/python/typing/pull/273.
+ @abstractmethod
+ def __getitem__(self, k: _KT) -> _VT_co:
+ ...
+ # Mixin methods
+ def get(self, k: _KT, default: _VT_co = ...) -> _VT_co: # type: ignore
+ ...
+ def items(self) -> AbstractSet[Tuple[_KT, _VT_co]]: ...
+ def keys(self) -> AbstractSet[_KT]: ...
+ def values(self) -> ValuesView[_VT_co]: ...
+ def __contains__(self, o: object) -> bool: ...
+
+class MutableMapping(Mapping[_KT, _VT], Generic[_KT, _VT]):
+ @abstractmethod
+ def __setitem__(self, k: _KT, v: _VT) -> None: ...
+ @abstractmethod
+ def __delitem__(self, v: _KT) -> None: ...
+
+ def clear(self) -> None: ...
+ def pop(self, k: _KT, default: _VT = ...) -> _VT: ...
+ def popitem(self) -> Tuple[_KT, _VT]: ...
+ def setdefault(self, k: _KT, default: _VT = ...) -> _VT: ...
+ # 'update' used to take a Union, but using overloading is better.
+ # The second overloaded type here is a bit too general, because
+ # Mapping[Tuple[_KT, _VT], W] is a subclass of Iterable[Tuple[_KT, _VT]],
+ # but will always have the behavior of the first overloaded type
+ # at runtime, leading to keys of a mix of types _KT and Tuple[_KT, _VT].
+ # We don't currently have any way of forcing all Mappings to use
+ # the first overload, but by using overloading rather than a Union,
+ # mypy will commit to using the first overload when the argument is
+ # known to be a Mapping with unknown type parameters, which is closer
+ # to the behavior we want. See mypy issue #1430.
+ @overload
+ def update(self, m: Mapping[_KT, _VT]) -> None: ...
+ @overload
+ def update(self, m: Iterable[Tuple[_KT, _VT]]) -> None: ...
+
+Text = str
+
+TYPE_CHECKING = True
+
+class IO(Iterator[AnyStr], Generic[AnyStr]):
+ # TODO detach
+ # TODO use abstract properties
+ @property
+ def mode(self) -> str: ...
+ @property
+ def name(self) -> str: ...
+ @abstractmethod
+ def close(self) -> None: ...
+ @property
+ def closed(self) -> bool: ...
+ @abstractmethod
+ def fileno(self) -> int: ...
+ @abstractmethod
+ def flush(self) -> None: ...
+ @abstractmethod
+ def isatty(self) -> bool: ...
+ # TODO what if n is None?
+ @abstractmethod
+ def read(self, n: int = ...) -> AnyStr: ...
+ @abstractmethod
+ def readable(self) -> bool: ...
+ @abstractmethod
+ def readline(self, limit: int = ...) -> AnyStr: ...
+ @abstractmethod
+ def readlines(self, hint: int = ...) -> list[AnyStr]: ...
+ @abstractmethod
+ def seek(self, offset: int, whence: int = ...) -> int: ...
+ @abstractmethod
+ def seekable(self) -> bool: ...
+ @abstractmethod
+ def tell(self) -> int: ...
+ # TODO None should not be compatible with int
+ @abstractmethod
+ def truncate(self, size: int = ...) -> int: ...
+ @abstractmethod
+ def writable(self) -> bool: ...
+ # TODO buffer objects
+ @abstractmethod
+ def write(self, s: AnyStr) -> int: ...
+ @abstractmethod
+ def writelines(self, lines: Iterable[AnyStr]) -> None: ...
+
+ @abstractmethod
+ def __next__(self) -> AnyStr: ...
+ @abstractmethod
+ def __iter__(self) -> Iterator[AnyStr]: ...
+ @abstractmethod
+ def __enter__(self) -> 'IO[AnyStr]': ...
+ @abstractmethod
+ def __exit__(self, t: Optional[Type[BaseException]], value: Optional[BaseException],
+ # TODO: traceback should be TracebackType but that's defined in types
+ traceback: Optional[Any]) -> bool: ...
+
+class BinaryIO(IO[bytes]):
+ # TODO readinto
+ # TODO read1?
+ # TODO peek?
+ @overload
+ @abstractmethod
+ def write(self, s: bytes) -> int: ...
+ @overload
+ @abstractmethod
+ def write(self, s: bytearray) -> int: ...
+
+ @abstractmethod
+ def __enter__(self) -> BinaryIO: ...
+
+class TextIO(IO[str]):
+ # TODO use abstractproperty
+ @property
+ def buffer(self) -> BinaryIO: ...
+ @property
+ def encoding(self) -> str: ...
+ @property
+ def errors(self) -> Optional[str]: ...
+ @property
+ def line_buffering(self) -> int: ... # int on PyPy, bool on CPython
+ @property
+ def newlines(self) -> Any: ... # None, str or tuple
+ @abstractmethod
+ def __enter__(self) -> TextIO: ...
+
+class ByteString(Sequence[int]): ...
+
+class Match(Generic[AnyStr]):
+ pos = 0
+ endpos = 0
+ lastindex = 0
+ lastgroup = ... # type: AnyStr
+ string = ... # type: AnyStr
+
+ # The regular expression object whose match() or search() method produced
+ # this match instance.
+ re = ... # type: 'Pattern[AnyStr]'
+
+ def expand(self, template: AnyStr) -> AnyStr: ...
+
+ @overload
+ def group(self, group1: int = ...) -> AnyStr: ...
+ @overload
+ def group(self, group1: str) -> AnyStr: ...
+ @overload
+ def group(self, group1: int, group2: int,
+ *groups: int) -> Sequence[AnyStr]: ...
+ @overload
+ def group(self, group1: str, group2: str,
+ *groups: str) -> Sequence[AnyStr]: ...
+
+ def groups(self, default: AnyStr = ...) -> Sequence[AnyStr]: ...
+ def groupdict(self, default: AnyStr = ...) -> dict[str, AnyStr]: ...
+ def start(self, group: Union[int, str] = ...) -> int: ...
+ def end(self, group: Union[int, str] = ...) -> int: ...
+ def span(self, group: Union[int, str] = ...) -> Tuple[int, int]: ...
+
+class Pattern(Generic[AnyStr]):
+ flags = 0
+ groupindex = 0
+ groups = 0
+ pattern = ... # type: AnyStr
+
+ def search(self, string: AnyStr, pos: int = ...,
+ endpos: int = ...) -> Match[AnyStr]: ...
+ def match(self, string: AnyStr, pos: int = ...,
+ endpos: int = ...) -> Match[AnyStr]: ...
+ # New in Python 3.4
+ def fullmatch(self, string: AnyStr, pos: int = ...,
+ endpos: int = ...) -> Optional[Match[AnyStr]]: ...
+ def split(self, string: AnyStr, maxsplit: int = ...) -> list[AnyStr]: ...
+ def findall(self, string: AnyStr, pos: int = ...,
+ endpos: int = ...) -> list[Any]: ...
+ def finditer(self, string: AnyStr, pos: int = ...,
+ endpos: int = ...) -> Iterator[Match[AnyStr]]: ...
+
+ @overload
+ def sub(self, repl: AnyStr, string: AnyStr,
+ count: int = ...) -> AnyStr: ...
+ @overload
+ def sub(self, repl: Callable[[Match[AnyStr]], AnyStr], string: AnyStr,
+ count: int = ...) -> AnyStr: ...
+
+ @overload
+ def subn(self, repl: AnyStr, string: AnyStr,
+ count: int = ...) -> Tuple[AnyStr, int]: ...
+ @overload
+ def subn(self, repl: Callable[[Match[AnyStr]], AnyStr], string: AnyStr,
+ count: int = ...) -> Tuple[AnyStr, int]: ...
+
+# Functions
+
+def get_type_hints(obj: Callable) -> dict[str, Any]: ...
+
+def cast(tp: Type[_T], obj: Any) -> _T: ...
+
+# Type constructors
+
+# NamedTuple is special-cased in the type checker; the initializer is ignored.
+def NamedTuple(typename: str, fields: Iterable[Tuple[str, Any]], *,
+ verbose: bool = ..., rename: bool = ..., module: str = None) -> Type[tuple]: ...
+
+def NewType(name: str, tp: Type[_T]) -> Type[_T]: ...
diff --git a/typeshed/stdlib/3/unicodedata.pyi b/typeshed/stdlib/3/unicodedata.pyi
new file mode 100644
index 0000000..07b5c47
--- /dev/null
+++ b/typeshed/stdlib/3/unicodedata.pyi
@@ -0,0 +1,37 @@
+# Stubs for unicodedata (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+ucd_3_2_0 = ... # type: Any
+ucnhash_CAPI = ... # type: Any
+unidata_version = ... # type: str
+
+def bidirectional(unichr): ...
+def category(unichr): ...
+def combining(unichr): ...
+def decimal(chr, default=...): ...
+def decomposition(unichr): ...
+def digit(chr, default=...): ...
+def east_asian_width(unichr): ...
+def lookup(name): ...
+def mirrored(unichr): ...
+def name(chr, default=...): ...
+def normalize(form, unistr): ...
+def numeric(chr, default=...): ...
+
+class UCD:
+ unidata_version = ... # type: Any
+ def bidirectional(self, unichr): ...
+ def category(self, unichr): ...
+ def combining(self, unichr): ...
+ def decimal(self, chr, default=...): ...
+ def decomposition(self, unichr): ...
+ def digit(self, chr, default=...): ...
+ def east_asian_width(self, unichr): ...
+ def lookup(self, name): ...
+ def mirrored(self, unichr): ...
+ def name(self, chr, default=...): ...
+ def normalize(self, form, unistr): ...
+ def numeric(self, chr, default=...): ...
diff --git a/typeshed/stdlib/3/unittest/__init__.pyi b/typeshed/stdlib/3/unittest/__init__.pyi
new file mode 100644
index 0000000..15ebff6
--- /dev/null
+++ b/typeshed/stdlib/3/unittest/__init__.pyi
@@ -0,0 +1,333 @@
+# Stubs for unittest
+
+from typing import (
+ Any, Callable, Dict, Iterable, Iterator, List, Optional, Pattern, Sequence,
+ Set, TextIO, Tuple, Type, TypeVar, Union,
+ overload,
+)
+import logging
+import sys
+from types import ModuleType, TracebackType
+from contextlib import ContextManager
+
+
+_T = TypeVar('_T')
+_FT = TypeVar('_FT', Callable[[Any], Any])
+
+
+def skip(reason: str) -> Callable[[_FT], _FT]: ...
+def skipIf(condition: object, reason: str) -> Callable[[_FT], _FT]: ...
+def skipUnless(condition: object, reason: str) -> Callable[[_FT], _FT]: ...
+def expectedFailure(func: _FT) -> _FT: ...
+
+class SkipTest(Exception):
+ def __init__(self, reason: str) -> None: ...
+
+
+class TestCase:
+ failureException = ... # type: Type[BaseException]
+ longMessage = ... # type: bool
+ maxDiff = ... # type: Optional[int]
+ def __init__(self, methodName: str = ...) -> None: ...
+ def setUp(self) -> None: ...
+ def tearDown(self) -> None: ...
+ @classmethod
+ def setUpClass(cls) -> None: ...
+ @classmethod
+ def tearDownClass(cls) -> None: ...
+ def run(self, result: Optional[TestResult] = ...) -> TestCase: ...
+ def skipTest(self, reason: Any) -> None: ...
+ if sys.version_info >= (3, 4):
+ def subTest(self, msg: Any = ..., **params: Any) -> ContextManager[None]: ...
+ def debug(self) -> None: ...
+ def assertEqual(self, first: Any, second: Any, msg: Any = ...) -> None: ...
+ def assertNotEqual(self, first: Any, second: Any,
+ msg: Any = ...) -> None: ...
+ def assertTrue(self, expr: Any, msg: Any = ...) -> None: ...
+ def assertFalse(self, expr: Any, msg: Any = ...) -> None: ...
+ def assertIs(self, first: Any, second: Any, msg: Any = ...) -> None: ...
+ def assertIsNot(self, first: Any, second: Any,
+ msg: Any = ...) -> None: ...
+ def assertIsNone(self, expr: Any, msg: Any = ...) -> None: ...
+ def assertIsNotNone(self, expr: Any, msg: Any = ...) -> None: ...
+ def assertIn(self, first: _T, second: Iterable[_T],
+ msg: Any = ...) -> None: ...
+ def assertNotIn(self, first: _T, second: Iterable[_T],
+ msg: Any = ...) -> None: ...
+ def assertIsInstance(self, obj: Any,
+ cls: Union[type, Tuple[type, ...]],
+ msg: Any = ...) -> None: ...
+ def assertNotIsInstance(self, obj: Any,
+ cls: Union[type, Tuple[type, ...]],
+ msg: Any = ...) -> None: ...
+ def assertGreater(self, first: Any, second: Any,
+ msg: Any = ...) -> None: ...
+ def assertGreaterEqual(self, first: Any, second: Any,
+ msg: Any = ...) -> None: ...
+ def assertLess(self, first: Any, second: Any, msg: Any = ...) -> None: ...
+ def assertLessEqual(self, first: Any, second: Any,
+ msg: Any = ...) -> None: ...
+ @overload
+ def assertRaises(self, # type: ignore
+ exception: Union[Type[BaseException], Tuple[Type[BaseException], ...]],
+ callable: Callable[..., Any] = ...,
+ *args: Any, **kwargs: Any) -> None: ...
+ @overload
+ def assertRaises(self,
+ exception: Union[Type[BaseException], Tuple[Type[BaseException], ...]],
+ msg: Any = ...) -> _AssertRaisesContext: ...
+ @overload
+ def assertRaisesRegex(self, # type: ignore
+ exception: Union[Type[BaseException], Tuple[Type[BaseException], ...]],
+ callable: Callable[..., Any] = ...,
+ *args: Any, **kwargs: Any) -> None: ...
+ @overload
+ def assertRaisesRegex(self,
+ exception: Union[Type[BaseException], Tuple[Type[BaseException], ...]],
+ msg: Any = ...) -> _AssertRaisesContext: ...
+ @overload
+ def assertWarns(self, # type: ignore
+ exception: Union[Type[Warning], Tuple[Type[Warning], ...]],
+ callable: Callable[..., Any] = ...,
+ *args: Any, **kwargs: Any) -> None: ...
+ @overload
+ def assertWarns(self,
+ exception: Union[Type[Warning], Tuple[Type[Warning], ...]],
+ msg: Any = ...) -> _AssertWarnsContext: ...
+ @overload
+ def assertWarnsRegex(self, # type: ignore
+ exception: Union[Type[Warning], Tuple[Type[Warning], ...]],
+ callable: Callable[..., Any] = ...,
+ *args: Any, **kwargs: Any) -> None: ...
+ @overload
+ def assertWarnsRegex(self,
+ exception: Union[Type[Warning], Tuple[Type[Warning], ...]],
+ msg: Any = ...) -> _AssertWarnsContext: ...
+ if sys.version_info >= (3, 4):
+ def assertLogs(
+ self, logger: Optional[logging.Logger] = ...,
+ level: Union[int, str, None] = ...
+ ) -> _AssertLogsContext: ...
+ def assertAlmostEqual(self, first: float, second: float, places: int = ...,
+ msg: Any = ..., delta: float = ...) -> None: ...
+ def assertNotAlmostEqual(self, first: float, second: float,
+ places: int = ..., msg: Any = ...,
+ delta: float = ...) -> None: ...
+ def assertRegex(self, text: str, regex: Union[str, Pattern[str]],
+ msg: Any = ...) -> None: ...
+ def assertNotRegex(self, text: str, regex: Union[str, Pattern[str]],
+ msg: Any = ...) -> None: ...
+ def assertCountEqual(self, first: Sequence[Any], second: Sequence[Any],
+ msg: Any = ...) -> None: ...
+ def addTypeEqualityFunc(self, typeobj: Type[Any],
+ function: Callable[..., None]) -> None: ...
+ def assertMultiLineEqual(self, first: str, second: str,
+ msg: Any = ...) -> None: ...
+ def assertSequenceEqual(self, first: Sequence[Any], second: Sequence[Any],
+ msg: Any = ...,
+ seq_type: Type[Sequence[Any]] = ...) -> None: ...
+ def assertListEqual(self, first: List[Any], second: List[Any],
+ msg: Any = ...) -> None: ...
+ def assertTupleEqual(self, first: Tuple[Any, ...], second: Tuple[Any, ...],
+ msg: Any = ...) -> None: ...
+ def assertSetEqual(self, first: Set[Any], second: Set[Any],
+ msg: Any = ...) -> None: ...
+ def assertDictEqual(self, first: Dict[Any, Any], second: Dict[Any, Any],
+ msg: Any = ...) -> None: ...
+ def fail(self, msg: Any = ...) -> None: ...
+ def countTestCases(self) -> int: ...
+ def defaultTestResult(self) -> TestResult: ...
+ def id(self) -> str: ...
+ def shortDescription(self) -> Optional[str]: ...
+ def addCleanup(self, function: Callable[..., Any], *args: Any,
+ **kwargs: Any) -> None: ...
+ def doCleanups(self) -> None: ...
+ # below is deprecated
+ def failUnlessEqual(self, first: Any, second: Any,
+ msg: Any = ...) -> None: ...
+ def assertEquals(self, first: Any, second: Any, msg: Any = ...) -> None: ...
+ def failIfEqual(self, first: Any, second: Any, msg: Any = ...) -> None: ...
+ def assertNotEquals(self, first: Any, second: Any,
+ msg: Any = ...) -> None: ...
+ def failUnless(self, expr: bool, msg: Any = ...) -> None: ...
+ def assert_(self, expr: bool, msg: Any = ...) -> None: ...
+ def failIf(self, expr: bool, msg: Any = ...) -> None: ...
+ @overload
+ def failUnlessRaises(self, # type: ignore
+ exception: Union[Type[BaseException], Tuple[Type[BaseException], ...]],
+ callable: Callable[..., Any] = ...,
+ *args: Any, **kwargs: Any) -> None: ...
+ @overload
+ def failUnlessRaises(self,
+ exception: Union[Type[BaseException], Tuple[Type[BaseException], ...]],
+ msg: Any = ...) -> _AssertRaisesContext: ...
+ def failUnlessAlmostEqual(self, first: float, second: float,
+ places: int = ..., msg: Any = ...) -> None: ...
+ def assertAlmostEquals(self, first: float, second: float, places: int = ...,
+ msg: Any = ..., delta: float = ...) -> None: ...
+ def failIfAlmostEqual(self, first: float, second: float, places: int = ...,
+ msg: Any = ...) -> None: ...
+ def assertNotAlmostEquals(self, first: float, second: float,
+ places: int = ..., msg: Any = ...,
+ delta: float = ...) -> None: ...
+ def assertRegexpMatches(self, text: str, regex: Union[str, Pattern[str]],
+ msg: Any = ...) -> None: ...
+ @overload
+ def assertRaisesRegexp(self, # type: ignore
+ exception: Union[Type[BaseException], Tuple[Type[BaseException], ...]],
+ callable: Callable[..., Any] = ...,
+ *args: Any, **kwargs: Any) -> None: ...
+ @overload
+ def assertRaisesRegexp(self,
+ exception: Union[Type[BaseException], Tuple[Type[BaseException], ...]],
+ msg: Any = ...) -> _AssertRaisesContext: ...
+
+class FunctionTestCase(TestCase):
+ def __init__(self, testFunc: Callable[[], None],
+ setUp: Optional[Callable[[], None]] = ...,
+ tearDown: Optional[Callable[[], None]] = ...,
+ description: Optional[str] = ...) -> None: ...
+
+class _AssertRaisesContext:
+ exception = ... # type: Exception
+ def __enter__(self) -> _AssertRaisesContext: ...
+ def __exit__(self, exc_type: Optional[type], exc_val: Optional[Exception],
+ exc_tb: Optional[TracebackType]) -> bool: ...
+
+class _AssertWarnsContext:
+ warning = ... # type: Warning
+ filename = ... # type: str
+ lineno = ... # type: int
+ def __enter__(self) -> _AssertWarnsContext: ...
+ def __exit__(self, exc_type: Optional[type], exc_val: Optional[Exception],
+ exc_tb: Optional[TracebackType]) -> bool: ...
+
+class _AssertLogsContext:
+ records = ... # type: List[logging.LogRecord]
+ output = ... # type: List[str]
+ def __enter__(self) -> _AssertLogsContext: ...
+ def __exit__(self, exc_type: Optional[type], exc_val: Optional[Exception],
+ exc_tb: Optional[TracebackType]) -> bool: ...
+
+
+_TestType = Union[TestCase, TestSuite]
+
+class TestSuite(Iterable[_TestType]):
+ def __init__(self, tests: Iterable[_TestType] = ...) -> None: ...
+ def addTest(self, test: _TestType) -> None: ...
+ def addTests(self, tests: Iterable[_TestType]) -> None: ...
+ def run(self, result: TestResult) -> TestResult: ...
+ def debug(self) -> None: ...
+ def countTestCases(self) -> int: ...
+ def __iter__(self) -> Iterator[_TestType]: ...
+
+
+class TestLoader:
+ if sys.version_info >= (3, 5):
+ errors = ... # type: List[Type[BaseException]]
+ testMethodPrefix = ... # type: str
+ sortTestMethodsUsing = ... # type: Callable[[str, str], bool]
+ suiteClass = ... # type: Callable[[List[TestCase]], TestSuite]
+ def loadTestsFromTestCase(self,
+ testCaseClass: Type[TestCase]) -> TestSuite: ...
+ if sys.version_info >= (3, 5):
+ def loadTestsFromModule(self, module: ModuleType,
+ *, pattern: Any = ...) -> TestSuite: ...
+ else:
+ def loadTestsFromModule(self,
+ module: ModuleType) -> TestSuite: ...
+ def loadTestsFromName(self, name: str,
+ module: Optional[ModuleType] = ...) -> TestSuite: ...
+ def loadTestsFromNames(self, names: Sequence[str],
+ module: Optional[ModuleType] = ...) -> TestSuite: ...
+ def getTestCaseNames(self,
+ testCaseClass: Type[TestCase]) -> Sequence[str]: ...
+ def discover(self, start_dir: str, pattern: str = ...,
+ top_level_dir: Optional[str] = ...) -> TestSuite: ...
+
+_SysExcInfoType = Tuple[Optional[Type[BaseException]],
+ Optional[BaseException],
+ Optional[TracebackType]]
+
+class TestResult:
+ errors = ... # type: List[Tuple[TestCase, str]]
+ failures = ... # type: List[Tuple[TestCase, str]]
+ skipped = ... # type: List[Tuple[TestCase, str]]
+ expectedFailures = ... # type: List[Tuple[TestCase, str]]
+ unexpectedSuccesses = ... # type: List[TestCase]
+ shouldStop = ... # type: bool
+ testsRun = ... # type: int
+ buffer = ... # type: bool
+ failfast = ... # type: bool
+ tb_locals = ... # type: bool
+ def wasSuccessful(self) -> bool: ...
+ def stop(self) -> None: ...
+ def startTest(self, test: TestCase) -> None: ...
+ def stopTest(self, test: TestCase) -> None: ...
+ def startTestRun(self) -> None: ...
+ def stopTestRun(self) -> None: ...
+ def addError(self, test: TestCase, err: _SysExcInfoType) -> None: ...
+ def addFailure(self, test: TestCase, err: _SysExcInfoType) -> None: ...
+ def addSuccess(self, test: TestCase) -> None: ...
+ def addSkip(self, test: TestCase, reason: str) -> None: ...
+ def addExpectedFailure(self, test: TestCase,
+ err: _SysExcInfoType) -> None: ...
+ def addUnexpectedSuccess(self, test: TestCase) -> None: ...
+ if sys.version_info >= (3, 4):
+ def addSubTest(self, test: TestCase, subtest: TestCase,
+ outcome: Optional[_SysExcInfoType]) -> None: ...
+
+class TextTestResult(TestResult):
+ def __init__(self, stream: TextIO = ..., descriptions: bool = ...,
+ verbosity: int = ...) -> None: ...
+_TextTestResult = TextTestResult
+
+defaultTestLoader = ... # type: TestLoader
+
+_ResultClassType = Callable[[TextIO, bool, int], TestResult]
+
+class TestRunner:
+ def run(self, test: Union[TestSuite, TestCase]) -> TestResult: ...
+
+class TextTestRunner(TestRunner):
+ if sys.version_info >= (3, 5):
+ def __init__(self, stream: Optional[TextIO] = ...,
+ descriptions: bool = ..., verbosity: int = ...,
+ failfast: bool = ..., buffer: bool = ...,
+ resultclass: Optional[_ResultClassType] = ...,
+ warnings: Optional[Type[Warning]] = ...,
+ *, tb_locals: bool = ...) -> None: ...
+ else:
+ def __init__(self,
+ stream: Optional[TextIO] = ...,
+ descriptions: bool = ..., verbosity: int = ...,
+ failfast: bool = ..., buffer: bool = ...,
+ resultclass: Optional[_ResultClassType] = ...,
+ warnings: Optional[Type[Warning]] = ...) -> None: ...
+ def _makeResult(self) -> TestResult: ...
+
+if sys.version_info >= (3, 4):
+ _DefaultTestType = Union[str, Iterable[str], None]
+else:
+ _DefaultTestType = Union[str, None]
+
+# not really documented
+class TestProgram:
+ result = ... # type: TestResult
+
+def main(module: str = ..., defaultTest: _DefaultTestType = ...,
+ argv: Optional[List[str]] = ...,
+ testRunner: Union[Type[TestRunner], TestRunner, None] = ...,
+ testLoader: TestLoader = ..., exit: bool = ..., verbosity: int = ...,
+ failfast: Optional[bool] = ..., catchbreak: Optional[bool] = ...,
+ buffer: Optional[bool] = ...,
+ warnings: Optional[str] = ...) -> TestProgram: ...
+
+
+def installHandler() -> None: ...
+def registerResult(result: TestResult) -> None: ...
+def removeResult(result: TestResult) -> None: ...
+ at overload
+def removeHandler() -> None: ...
+ at overload
+def removeHandler(function: _FT) -> _FT: ...
diff --git a/typeshed/stdlib/3/unittest/mock.pyi b/typeshed/stdlib/3/unittest/mock.pyi
new file mode 100644
index 0000000..3d54fe9
--- /dev/null
+++ b/typeshed/stdlib/3/unittest/mock.pyi
@@ -0,0 +1,163 @@
+# Stubs for unittest.mock
+
+import sys
+from typing import Any
+
+if sys.version_info >= (3, 3):
+ FILTER_DIR = ... # type: Any
+
+ class _slotted: ...
+
+ class _SentinelObject:
+ name = ... # type: Any
+ def __init__(self, name): ...
+
+ class _Sentinel:
+ def __init__(self): ...
+ def __getattr__(self, name): ...
+
+ sentinel = ... # type: Any
+ DEFAULT = ... # type: Any
+
+ class _CallList(list):
+ def __contains__(self, value): ...
+
+ class _MockIter:
+ obj = ... # type: Any
+ def __init__(self, obj): ...
+ def __iter__(self): ...
+ def __next__(self): ...
+
+ class Base:
+ def __init__(self, *args, **kwargs): ...
+
+ class NonCallableMock(Base):
+ def __new__(cls, *args, **kw): ...
+ def __init__(self, spec=None, wraps=None, name=None, spec_set=None, parent=None, _spec_state=None, _new_name='', _new_parent=None, _spec_as_instance=False, _eat_self=None, unsafe=False, **kwargs): ...
+ def attach_mock(self, mock, attribute): ...
+ def mock_add_spec(self, spec, spec_set=False): ...
+ return_value = ... # type: Any
+ @property
+ def __class__(self): ...
+ called = ... # type: Any
+ call_count = ... # type: Any
+ call_args = ... # type: Any
+ call_args_list = ... # type: Any
+ mock_calls = ... # type: Any
+ side_effect = ... # type: Any
+ method_calls = ... # type: Any
+ def reset_mock(self, visited=None): ...
+ def configure_mock(self, **kwargs): ...
+ def __getattr__(self, name): ...
+ def __dir__(self): ...
+ def __setattr__(self, name, value): ...
+ def __delattr__(self, name): ...
+ def assert_not_called(_mock_self): ...
+ def assert_called_with(_mock_self, *args, **kwargs): ...
+ def assert_called_once_with(_mock_self, *args, **kwargs): ...
+ def assert_has_calls(self, calls, any_order=False): ...
+ def assert_any_call(self, *args, **kwargs): ...
+
+ class CallableMixin(Base):
+ side_effect = ... # type: Any
+ def __init__(self, spec=None, side_effect=None, return_value=..., wraps=None, name=None, spec_set=None, parent=None, _spec_state=None, _new_name='', _new_parent=None, **kwargs): ...
+ def __call__(_mock_self, *args, **kwargs): ...
+
+ class Mock(CallableMixin, NonCallableMock): ...
+
+ class _patch:
+ attribute_name = ... # type: Any
+ getter = ... # type: Any
+ attribute = ... # type: Any
+ new = ... # type: Any
+ new_callable = ... # type: Any
+ spec = ... # type: Any
+ create = ... # type: Any
+ has_local = ... # type: Any
+ spec_set = ... # type: Any
+ autospec = ... # type: Any
+ kwargs = ... # type: Any
+ additional_patchers = ... # type: Any
+ def __init__(self, getter, attribute, new, spec, create, spec_set, autospec, new_callable, kwargs): ...
+ def copy(self): ...
+ def __call__(self, func): ...
+ def decorate_class(self, klass): ...
+ def decorate_callable(self, func): ...
+ def get_original(self): ...
+ target = ... # type: Any
+ temp_original = ... # type: Any
+ is_local = ... # type: Any
+ def __enter__(self): ...
+ def __exit__(self, *exc_info): ...
+ def start(self): ...
+ def stop(self): ...
+
+ def patch(target, new=..., spec=None, create=False, spec_set=None, autospec=None, new_callable=None, **kwargs): ...
+
+ class _patch_dict:
+ in_dict = ... # type: Any
+ values = ... # type: Any
+ clear = ... # type: Any
+ def __init__(self, in_dict, values=..., clear=False, **kwargs): ...
+ def __call__(self, f): ...
+ def decorate_class(self, klass): ...
+ def __enter__(self): ...
+ def __exit__(self, *args): ...
+ start = ... # type: Any
+ stop = ... # type: Any
+
+ class MagicMixin:
+ def __init__(self, *args, **kw): ...
+
+ class NonCallableMagicMock(MagicMixin, NonCallableMock):
+ def mock_add_spec(self, spec, spec_set=False): ...
+
+ class MagicMock(MagicMixin, Mock):
+ def mock_add_spec(self, spec, spec_set=False): ...
+
+ class MagicProxy:
+ name = ... # type: Any
+ parent = ... # type: Any
+ def __init__(self, name, parent): ...
+ def __call__(self, *args, **kwargs): ...
+ def create_mock(self): ...
+ def __get__(self, obj, _type=None): ...
+
+ class _ANY:
+ def __eq__(self, other): ...
+ def __ne__(self, other): ...
+
+ ANY = ... # type: Any
+
+ class _Call(tuple):
+ def __new__(cls, value=..., name=None, parent=None, two=False, from_kall=True): ...
+ name = ... # type: Any
+ parent = ... # type: Any
+ from_kall = ... # type: Any
+ def __init__(self, value=..., name=None, parent=None, two=False, from_kall=True): ...
+ def __eq__(self, other): ...
+ __ne__ = ... # type: Any
+ def __call__(self, *args, **kwargs): ...
+ def __getattr__(self, attr): ...
+ def count(self, *args, **kwargs): ...
+ def index(self, *args, **kwargs): ...
+ def call_list(self): ...
+
+ call = ... # type: Any
+
+ def create_autospec(spec, spec_set=False, instance=False, _parent=None, _name=None, **kwargs): ...
+
+ class _SpecState:
+ spec = ... # type: Any
+ ids = ... # type: Any
+ spec_set = ... # type: Any
+ parent = ... # type: Any
+ instance = ... # type: Any
+ name = ... # type: Any
+ def __init__(self, spec, spec_set=False, parent=None, name=None, ids=None, instance=False): ...
+
+ def mock_open(mock=None, read_data=''): ...
+
+ class PropertyMock(Mock):
+ def __get__(self, obj, obj_type): ...
+ def __set__(self, obj, val): ...
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/3/urllib/__init__.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/3/urllib/__init__.pyi
diff --git a/typeshed/stdlib/3/urllib/error.pyi b/typeshed/stdlib/3/urllib/error.pyi
new file mode 100644
index 0000000..fe4dbb1
--- /dev/null
+++ b/typeshed/stdlib/3/urllib/error.pyi
@@ -0,0 +1,11 @@
+from typing import Any, Dict, Union
+from urllib.response import addinfourl
+
+# Stubs for urllib.error
+
+class URLError(IOError):
+ reason = ... # type: Union[str, BaseException]
+class HTTPError(URLError, addinfourl):
+ code = ... # type: int
+ headers = ... # type: Dict[str, str]
+class ContentTooShortError(URLError): ...
diff --git a/typeshed/stdlib/3/urllib/parse.pyi b/typeshed/stdlib/3/urllib/parse.pyi
new file mode 100644
index 0000000..d427e40
--- /dev/null
+++ b/typeshed/stdlib/3/urllib/parse.pyi
@@ -0,0 +1,152 @@
+# Stubs for urllib.parse
+from typing import Any, List, Dict, Tuple, AnyStr, Generic, overload, Sequence, Mapping, Union, NamedTuple
+
+__all__ = (
+ 'urlparse',
+ 'urlunparse',
+ 'urljoin',
+ 'urldefrag',
+ 'urlsplit',
+ 'urlunsplit',
+ 'urlencode',
+ 'parse_qs',
+ 'parse_qsl',
+ 'quote',
+ 'quote_plus',
+ 'quote_from_bytes',
+ 'unquote',
+ 'unquote_plus',
+ 'unquote_to_bytes'
+)
+
+uses_relative = ... # type: List[str]
+uses_netloc = ... # type: List[str]
+uses_params = ... # type: List[str]
+non_hierarchical = ... # type: List[str]
+uses_query = ... # type: List[str]
+uses_fragment = ... # type: List[str]
+scheme_chars = ... # type: str
+MAX_CACHE_SIZE = 0
+
+class _ResultMixinBase(Generic[AnyStr]):
+ def geturl(self) -> AnyStr: ...
+
+class _ResultMixinStr(_ResultMixinBase[str]):
+ def encode(self, encoding: str = ..., errors: str = ...) -> '_ResultMixinBytes': ...
+
+
+class _ResultMixinBytes(_ResultMixinBase[str]):
+ def decode(self, encoding: str = ..., errors: str = ...) -> '_ResultMixinStr': ...
+
+
+class _NetlocResultMixinBase(Generic[AnyStr]):
+ username = ... # type: AnyStr
+ password = ... # type: AnyStr
+ hostname = ... # type: AnyStr
+ port = ... # type: int
+
+class _NetlocResultMixinStr(_NetlocResultMixinBase[str], _ResultMixinStr): ...
+
+
+class _NetlocResultMixinBytes(_NetlocResultMixinBase[str], _ResultMixinBytes): ...
+
+class _DefragResultBase(tuple, Generic[AnyStr]):
+ url = ... # type: AnyStr
+ fragment = ... # type: AnyStr
+
+
+_SplitResultBase = NamedTuple(
+ '_SplitResultBase',
+ [
+ ('scheme', str), ('netloc', str), ('path', str), ('query', str), ('fragment', str)
+ ]
+)
+_SplitResultBytesBase = NamedTuple(
+ '_SplitResultBytesBase',
+ [
+ ('scheme', bytes), ('netloc', bytes), ('path', bytes), ('query', bytes), ('fragment', bytes)
+ ]
+)
+
+_ParseResultBase = NamedTuple(
+ '_ParseResultBase',
+ [
+ ('scheme', str), ('netloc', str), ('path', str), ('params', str), ('query', str), ('fragment', str)
+ ]
+)
+_ParseResultBytesBase = NamedTuple(
+ '_ParseResultBytesBase',
+ [
+ ('scheme', bytes), ('netloc', bytes), ('path', bytes), ('params', bytes), ('query', bytes), ('fragment', bytes)
+ ]
+)
+
+# Structured result objects for string data
+class DefragResult(_DefragResultBase[str], _ResultMixinStr): ...
+
+class SplitResult(_SplitResultBase, _NetlocResultMixinStr): ...
+
+class ParseResult(_ParseResultBase, _NetlocResultMixinStr): ...
+
+# Structured result objects for bytes data
+class DefragResultBytes(_DefragResultBase[bytes], _ResultMixinBytes): ...
+
+class SplitResultBytes(_SplitResultBytesBase, _NetlocResultMixinBytes): ...
+
+class ParseResultBytes(_ParseResultBytesBase, _NetlocResultMixinBytes): ...
+
+
+def parse_qs(qs: str, keep_blank_values: bool = ..., strict_parsing: bool = ..., encoding: str = ..., errors: str = ...) -> Dict[str, List[str]]: ...
+
+def parse_qsl(qs: str, keep_blank_values: bool = ..., strict_parsing: bool = ..., encoding: str = ..., errors: str = ...) -> List[Tuple[str, str]]: ...
+
+ at overload
+def quote(string: str, safe: AnyStr = ..., encoding: str = ..., errors: str = ...) -> str: ...
+ at overload
+def quote(string: bytes, safe: AnyStr = ...) -> str: ...
+
+def quote_from_bytes(bs: bytes, safe: AnyStr = ...) -> str: ...
+
+ at overload
+def quote_plus(string: str, safe: AnyStr = ..., encoding: str = ..., errors: str = ...) -> str: ...
+ at overload
+def quote_plus(string: bytes, safe: AnyStr = ...) -> str: ...
+
+def unquote(string: str, encoding: str = ..., errors: str = ...) -> str: ...
+
+def unquote_to_bytes(string: AnyStr) -> bytes: ...
+
+def unquote_plus(string: str, encoding: str = ..., errors: str = ...) -> str: ...
+
+ at overload
+def urldefrag(url: str) -> DefragResult: ...
+ at overload
+def urldefrag(url: bytes) -> DefragResultBytes: ...
+
+def urlencode(query: Union[Mapping[Any, Any],
+ Mapping[Any, Sequence[Any]],
+ Sequence[Tuple[Any, Any]],
+ Sequence[Tuple[Any, Sequence[Any]]]],
+ doseq: bool = ..., safe: AnyStr = ..., encoding: str = ..., errors: str = ...) -> str: ...
+
+def urljoin(base: AnyStr, url: AnyStr, allow_fragments: bool = ...) -> AnyStr: ...
+
+ at overload
+def urlparse(url: str, scheme: str = ..., allow_fragments: bool = ...) -> ParseResult: ...
+ at overload
+def urlparse(url: bytes, scheme: bytes = ..., allow_fragments: bool = ...) -> ParseResultBytes: ...
+
+ at overload
+def urlsplit(url: str, scheme: str = ..., allow_fragments: bool = ...) -> SplitResult: ...
+ at overload
+def urlsplit(url: bytes, scheme: bytes = ..., allow_fragments: bool = ...) -> SplitResultBytes: ...
+
+ at overload
+def urlunparse(components: Sequence[AnyStr]) -> AnyStr: ...
+ at overload
+def urlunparse(components: Tuple[AnyStr, AnyStr, AnyStr, AnyStr, AnyStr, AnyStr]) -> AnyStr: ...
+
+ at overload
+def urlunsplit(components: Sequence[AnyStr]) -> AnyStr: ...
+ at overload
+def urlunsplit(components: Tuple[AnyStr, AnyStr, AnyStr, AnyStr, AnyStr]) -> AnyStr: ...
diff --git a/typeshed/stdlib/3/urllib/request.pyi b/typeshed/stdlib/3/urllib/request.pyi
new file mode 100644
index 0000000..b8d2190
--- /dev/null
+++ b/typeshed/stdlib/3/urllib/request.pyi
@@ -0,0 +1,201 @@
+# Stubs for urllib.request (Python 3.4)
+
+from typing import (
+ Any, Callable, Dict, List, IO, Mapping, Optional, Sequence, Tuple, TypeVar,
+ Union, overload,
+)
+from http.client import HTTPResponse, HTTPMessage
+from http.cookiejar import CookieJar
+from email.message import Message
+from urllib.response import addinfourl
+import ssl
+import sys
+
+
+_T = TypeVar('_T')
+_UrlopenRet = Union[HTTPResponse, addinfourl]
+
+
+def urlopen(
+ url: Union[str, 'Request'], data: Optional[bytes] = ...,
+ timeout: float = ..., *, cafile: Optional[str] = ...,
+ capath: Optional[str] = ..., cadefault: bool = ...,
+ context: Optional[ssl.SSLContext] = ...
+) -> _UrlopenRet: ...
+def install_opener(opener: OpenerDirector) -> None: ...
+def build_opener(
+ *handlers: Union[BaseHandler, Callable[[], BaseHandler]]
+) -> OpenerDirector: ...
+def url2pathname(path: str) -> str: ...
+def pathname2url(path: str) -> str: ...
+def getproxies() -> Dict[str, str]: ...
+def parse_http_list(s: str) -> List[str]: ...
+
+class Request:
+ if sys.version_info >= (3, 4):
+ @property
+ def full_url(self) -> str: ...
+ @full_url.setter
+ def full_url(self, value: str) -> None: ...
+ @full_url.deleter
+ def full_url(self) -> None: ...
+ else:
+ full_url = ... # type: str
+ type = ... # type: str
+ host = ... # type: str
+ origin_req_host = ... # type: str
+ selector = ... # type: str
+ data = ... # type: Optional[bytes]
+ unverifiable = ... # type: bool
+ method = ... # type: Optional[str]
+ def __init__(self, url: str, data: Optional[bytes] = ...,
+ headers: Dict[str, str] =..., origin_req_host: Optional[str] = ...,
+ unverifiable: bool = ..., method: Optional[str] = ...) -> None: ...
+ def get_method(self) -> str: ...
+ def add_header(self, key: str, val: str) -> None: ...
+ def add_unredirected_header(self, key: str, val: str) -> None: ...
+ def has_header(self, header_name: str) -> bool: ...
+ if sys.version_info >= (3, 4):
+ def remove_header(self, header_name: str) -> None: ...
+ def get_full_url(self) -> str: ...
+ def set_proxy(self, host: str, type: str) -> None: ...
+ @overload
+ def get_header(self, header_name: str) -> Optional[str]: ...
+ @overload
+ def get_header(self, header_name: str, default: _T) -> Union[str, _T]: ...
+ def header_items(self) -> List[Tuple[str, str]]: ...
+
+class OpenerDirector:
+ def add_handler(self, handler: BaseHandler) -> None: ...
+ def open(self, url: Union[str, Request], data: Optional[bytes] = None,
+ timeout: float = ...) -> _UrlopenRet: ...
+ def error(self, proto: str, *args: Any) -> _UrlopenRet: ...
+
+
+class BaseHandler:
+ parent = ... # type: OpenerDirector
+ def add_parent(self, parent: OpenerDirector) -> None: ...
+ def close(self) -> None: ...
+ def http_error_nnn(self, req: Request, fp: IO[str], code: int, msg: int,
+ hdrs: Mapping[str, str]) -> _UrlopenRet: ...
+
+class HTTPDefaultErrorHandler(BaseHandler): ...
+
+class HTTPRedirectHandler(BaseHandler):
+ def redirect_request(self, req: Request, fp: IO[str], code: int, msg: int,
+ hdrs: Mapping[str, str],
+ newurl: str) -> Optional[Request]: ...
+ def http_error_301(self, req: Request, fp: IO[str], code: int, msg: int,
+ hdrs: Mapping[str, str]) -> Optional[_UrlopenRet]: ...
+ def http_error_302(self, req: Request, fp: IO[str], code: int, msg: int,
+ hdrs: Mapping[str, str]) -> Optional[_UrlopenRet]: ...
+ def http_error_303(self, req: Request, fp: IO[str], code: int, msg: int,
+ hdrs: Mapping[str, str]) -> Optional[_UrlopenRet]: ...
+ def http_error_307(self, req: Request, fp: IO[str], code: int, msg: int,
+ hdrs: Mapping[str, str]) -> Optional[_UrlopenRet]: ...
+
+class HTTPCookieProcessor(BaseHandler):
+ cookiejar = ... # type: CookieJar
+ def __init__(self, cookiejar: Optional[CookieJar] = ...) -> None: ...
+
+class ProxyHandler(BaseHandler):
+ def __init__(self, proxies: Optional[Dict[str, str]] = ...) -> None: ...
+ # TODO add a method for every (common) proxy protocol
+
+class HTTPPasswordMgr:
+ def add_password(self, realm: str, uri: Union[str, Sequence[str]],
+ user: str, passwd: str) -> None: ...
+ def find_user_password(self, realm: str, authuri: str) \
+ -> Tuple[Optional[str], Optional[str]]: ...
+
+class HTTPPasswordMgrWithDefaultRealm:
+ def add_password(self, realm: str, uri: Union[str, Sequence[str]],
+ user: str, passwd: str) -> None: ...
+ def find_user_password(self, realm: str, authuri: str) \
+ -> Tuple[Optional[str], Optional[str]]: ...
+
+if sys.version_info >= (3, 5):
+ class HTTPPasswordMgrWithPriorAuth(HTTPPasswordMgrWithDefaultRealm):
+ def add_password(self, realm: str, uri: Union[str, Sequence[str]],
+ user: str, passwd: str,
+ is_authenticated: bool = ...) -> None: ...
+ def update_authenticated(self, uri: Union[str, Sequence[str]],
+ is_authenticated: bool = ...) -> None: ...
+ def is_authenticated(self, authuri: str) -> bool: ...
+
+class AbstractBasicAuthHandler:
+ def __init__(self,
+ password_mgr: Optional[HTTPPasswordMgr] = ...) -> None: ...
+ def http_error_auth_reqed(self, authreq: str, host: str, req: Request,
+ headers: Mapping[str, str]) -> None: ...
+
+class HTTPBasicAuthHandler(AbstractBasicAuthHandler, BaseHandler):
+ def http_error_401(self, req: Request, fp: IO[str], code: int, msg: int,
+ hdrs: Mapping[str, str]) -> Optional[_UrlopenRet]: ...
+
+class ProxyBasicAuthHandler(AbstractBasicAuthHandler, BaseHandler):
+ def http_error_407(self, req: Request, fp: IO[str], code: int, msg: int,
+ hdrs: Mapping[str, str]) -> Optional[_UrlopenRet]: ...
+
+class AbstractDigestAuthHandler:
+ def __init__(self,
+ password_mgr: Optional[HTTPPasswordMgr] = ...) -> None: ...
+ def http_error_auth_reqed(self, auth_header: str, host: str, req: Request,
+ headers: Mapping[str, str]) -> None: ...
+
+class HTTPDigestAuthHandler(BaseHandler, AbstractDigestAuthHandler):
+ def http_error_401(self, req: Request, fp: IO[str], code: int, msg: int,
+ hdrs: Mapping[str, str]) -> Optional[_UrlopenRet]: ...
+
+class ProxyDigestAuthHandler(BaseHandler, AbstractDigestAuthHandler):
+ def http_error_407(self, req: Request, fp: IO[str], code: int, msg: int,
+ hdrs: Mapping[str, str]) -> Optional[_UrlopenRet]: ...
+
+class HTTPHandler(BaseHandler):
+ def http_open(self, req: Request) -> _UrlopenRet: ...
+
+class HTTPSHandler(BaseHandler):
+ def __init__(self, debuglevel: int = 0,
+ context: Optional[ssl.SSLContext] = ...,
+ check_hostname: bool = ...) -> None: ...
+ def https_open(self, req: Request) -> _UrlopenRet: ...
+
+class FileHandler(BaseHandler):
+ def file_open(self, req: Request) -> _UrlopenRet: ...
+
+class DataHandler(BaseHandler):
+ def data_open(self, req: Request) -> _UrlopenRet: ...
+
+class FTPHandler(BaseHandler):
+ def ftp_open(self, req: Request) -> _UrlopenRet: ...
+
+class CacheFTPHandler(FTPHandler):
+ def setTimeout(self, t: float) -> None: ...
+ def setMaxConns(self, m: int) -> None: ...
+
+class UnknownHandler(BaseHandler):
+ def unknown_open(self, req: Request) -> _UrlopenRet: ...
+
+class HTTPErrorProcessor(BaseHandler):
+ def http_response(self) -> _UrlopenRet: ...
+ def https_response(self) -> _UrlopenRet: ...
+
+
+def urlretrieve(url: str, filename: Optional[str] = ...,
+ reporthook: Optional[Callable[[int, int, int], None]] = ...,
+ data: Optional[bytes] = ...) -> Tuple[str, HTTPMessage]: ...
+def urlcleanup() -> None: ...
+
+class URLopener:
+ version = ... # type: str
+ def __init__(self, proxies: Optional[Dict[str, str]] = ...,
+ **x509: str) -> None: ...
+ def open(self, fullurl: str, data: Optional[bytes] = ...) -> _UrlopenRet: ...
+ def open_unknown(self, fullurl: str,
+ data: Optional[bytes] = ...) -> _UrlopenRet: ...
+ def retrieve(self, url: str, filename: Optional[str] = ...,
+ reporthook: Optional[Callable[[int, int, int], None]] = ...,
+ data: Optional[bytes] = ...) -> Tuple[str, Optional[Message]]: ...
+
+class FancyURLopener(URLopener):
+ def prompt_user_passwd(self, host: str, realm: str) -> Tuple[str, str]: ...
diff --git a/typeshed/stdlib/3/urllib/response.pyi b/typeshed/stdlib/3/urllib/response.pyi
new file mode 100644
index 0000000..033bbaa
--- /dev/null
+++ b/typeshed/stdlib/3/urllib/response.pyi
@@ -0,0 +1,8 @@
+# private module, we only expose what's needed
+
+from typing import BinaryIO, Mapping, Optional
+from types import TracebackType
+
+class addinfourl(BinaryIO):
+ def info(self) -> Mapping[str, str]: ...
+ def geturl(self) -> str: ...
diff --git a/typeshed/stdlib/3/urllib/robotparser.pyi b/typeshed/stdlib/3/urllib/robotparser.pyi
new file mode 100644
index 0000000..36150ab
--- /dev/null
+++ b/typeshed/stdlib/3/urllib/robotparser.pyi
@@ -0,0 +1,18 @@
+# Stubs for urllib.robotparser (Python 3.4)
+
+from typing import Iterable, NamedTuple, Optional
+import sys
+
+_RequestRate = NamedTuple('_RequestRate', [('requests', int), ('seconds', int)])
+
+class RobotFileParser:
+ def __init__(self, url: str = ...) -> None: ...
+ def set_url(self, url: str) -> None: ...
+ def read(self) -> None: ...
+ def parse(self, lines: Iterable[str]) -> None: ...
+ def can_fetch(self, user_agent: str, url: str) -> bool: ...
+ def mtime(self) -> int: ...
+ def modified(self) -> None: ...
+ if sys.version_info >= (3, 6):
+ def crawl_delay(self, useragent: str) -> Optional[str]: ...
+ def request_rate(self, useragent: str) -> Optional[_RequestRate]: ...
diff --git a/typeshed/stdlib/3/uuid.pyi b/typeshed/stdlib/3/uuid.pyi
new file mode 100644
index 0000000..efd48e5
--- /dev/null
+++ b/typeshed/stdlib/3/uuid.pyi
@@ -0,0 +1,73 @@
+# Stubs for uuid
+
+from typing import Tuple
+
+Int = __builtins__.int
+Bytes = __builtins__.bytes
+FieldsType = Tuple[Int, Int, Int, Int, Int, Int]
+
+class UUID:
+ def __init__(self, hex: str=..., bytes: Bytes=..., bytes_le: Bytes=..., fields: FieldsType=..., int: Int=..., version: Int=...) -> None: ...
+
+ @property
+ def bytes(self) -> Bytes: ...
+
+ @property
+ def bytes_le(self) -> Bytes: ...
+
+ @property
+ def clock_seq(self) -> Int: ...
+
+ @property
+ def clock_seq_hi_variant(self) -> Int: ...
+
+ @property
+ def clock_seq_low(self) -> Int: ...
+
+ @property
+ def fields(self) -> FieldsType: ...
+
+ @property
+ def hex(self) -> str: ...
+
+ @property
+ def int(self) -> Int: ...
+
+ @property
+ def node(self) -> Int: ...
+
+ @property
+ def time(self) -> Int: ...
+
+ @property
+ def time_hi_version(self) -> Int: ...
+
+ @property
+ def time_low(self) -> Int: ...
+
+ @property
+ def time_mid(self) -> Int: ...
+
+ @property
+ def urn(self) -> str: ...
+
+ @property
+ def variant(self) -> str: ...
+
+ @property
+ def version(self) -> str: ...
+
+def getnode() -> Int: ...
+def uuid1(node: Int=..., clock_seq: Int=...) -> UUID: ...
+def uuid3(namespace: UUID, name: str) -> UUID: ...
+def uuid4() -> UUID: ...
+def uuid5(namespace: UUID, name: str) -> UUID: ...
+
+NAMESPACE_DNS = ... # type: UUID
+NAMESPACE_URL = ... # type: UUID
+NAMESPACE_OID = ... # type: UUID
+NAMESPACE_X500 = ... # type: UUID
+RESERVED_NCS = ... # type: str
+RFC_4122 = ... # type: str
+RESERVED_MICROSOFT = ... # type: str
+RESERVED_FUTURE = ... # type: str
diff --git a/typeshed/stdlib/3/weakref.pyi b/typeshed/stdlib/3/weakref.pyi
new file mode 100644
index 0000000..6c4981a
--- /dev/null
+++ b/typeshed/stdlib/3/weakref.pyi
@@ -0,0 +1,120 @@
+# Stubs for weakref
+
+# NOTE: These are incomplete!
+
+from typing import (
+ TypeVar, Generic, Any, Callable, overload, Mapping, Iterator, Dict, Tuple,
+ Iterable, Optional
+)
+
+_T = TypeVar('_T')
+_KT = TypeVar('_KT')
+_VT = TypeVar('_VT')
+
+class ReferenceType(Generic[_T]):
+ # TODO rest of members
+ def __init__(self, o: _T, callback: Callable[[ReferenceType[_T]],
+ Any] = ...) -> None: ...
+ def __call__(self) -> Optional[_T]: ...
+
+ref = ReferenceType
+
+# TODO callback
+def proxy(object: _T) -> _T: ...
+
+class WeakValueDictionary(Generic[_KT, _VT]):
+ # TODO tuple iterable argument?
+ @overload
+ def __init__(self) -> None: ...
+ @overload
+ def __init__(self, map: Mapping[_KT, _VT]) -> None: ...
+
+ def __len__(self) -> int: ...
+ def __getitem__(self, k: _KT) -> _VT: ...
+ def __setitem__(self, k: _KT, v: _VT) -> None: ...
+ def __delitem__(self, v: _KT) -> None: ...
+ def __contains__(self, o: object) -> bool: ...
+ def __iter__(self) -> Iterator[_KT]: ...
+ def __str__(self) -> str: ...
+
+ def clear(self) -> None: ...
+ def copy(self) -> Dict[_KT, _VT]: ...
+
+ @overload
+ def get(self, k: _KT) -> _VT: ...
+ @overload
+ def get(self, k: _KT, default: _VT) -> _VT: ...
+
+ @overload
+ def pop(self, k: _KT) -> _VT: ...
+ @overload
+ def pop(self, k: _KT, default: _VT) -> _VT: ...
+
+ def popitem(self) -> Tuple[_KT, _VT]: ...
+
+ @overload
+ def setdefault(self, k: _KT) -> _VT: ...
+ @overload
+ def setdefault(self, k: _KT, default: _VT) -> _VT: ...
+
+ @overload
+ def update(self, m: Mapping[_KT, _VT]) -> None: ...
+ @overload
+ def update(self, m: Iterable[Tuple[_KT, _VT]]) -> None: ...
+
+ # NOTE: incompatible with Mapping
+ def keys(self) -> Iterator[_KT]: ...
+ def values(self) -> Iterator[_VT]: ...
+ def items(self) -> Iterator[Tuple[_KT, _VT]]: ...
+
+ # TODO return type
+ def valuerefs(self) -> Iterable[Any]: ...
+
+
+class WeakKeyDictionary(Generic[_KT, _VT]):
+ # TODO tuple iterable argument?
+ @overload
+ def __init__(self) -> None: ...
+ @overload
+ def __init__(self, map: Mapping[_KT, _VT]) -> None: ...
+
+ def __len__(self) -> int: ...
+ def __getitem__(self, k: _KT) -> _VT: ...
+ def __setitem__(self, k: _KT, v: _VT) -> None: ...
+ def __delitem__(self, v: _KT) -> None: ...
+ def __contains__(self, o: object) -> bool: ...
+ def __iter__(self) -> Iterator[_KT]: ...
+ def __str__(self) -> str: ...
+
+ def clear(self) -> None: ...
+ def copy(self) -> Dict[_KT, _VT]: ...
+
+ @overload
+ def get(self, k: _KT) -> _VT: ...
+ @overload
+ def get(self, k: _KT, default: _VT) -> _VT: ...
+
+ @overload
+ def pop(self, k: _KT) -> _VT: ...
+ @overload
+ def pop(self, k: _KT, default: _VT) -> _VT: ...
+
+ def popitem(self) -> Tuple[_KT, _VT]: ...
+
+ @overload
+ def setdefault(self, k: _KT) -> _VT: ...
+ @overload
+ def setdefault(self, k: _KT, default: _VT) -> _VT: ...
+
+ @overload
+ def update(self, m: Mapping[_KT, _VT]) -> None: ...
+ @overload
+ def update(self, m: Iterable[Tuple[_KT, _VT]]) -> None: ...
+
+ # NOTE: incompatible with Mapping
+ def keys(self) -> Iterator[_KT]: ...
+ def values(self) -> Iterator[_VT]: ...
+ def items(self) -> Iterator[Tuple[_KT, _VT]]: ...
+
+ # TODO return type
+ def valuerefs(self) -> Iterable[Any]: ...
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/3/wsgiref/__init__.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/3/wsgiref/__init__.pyi
diff --git a/typeshed/stdlib/3/wsgiref/validate.pyi b/typeshed/stdlib/3/wsgiref/validate.pyi
new file mode 100644
index 0000000..bd7fd16
--- /dev/null
+++ b/typeshed/stdlib/3/wsgiref/validate.pyi
@@ -0,0 +1,47 @@
+# Stubs for wsgiref.validate (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class WSGIWarning(Warning): ...
+
+def validator(application): ...
+
+class InputWrapper:
+ input = ... # type: Any
+ def __init__(self, wsgi_input): ...
+ def read(self, *args): ...
+ def readline(self, *args): ...
+ def readlines(self, *args): ...
+ def __iter__(self): ...
+ def close(self): ...
+
+class ErrorWrapper:
+ errors = ... # type: Any
+ def __init__(self, wsgi_errors): ...
+ def write(self, s): ...
+ def flush(self): ...
+ def writelines(self, seq): ...
+ def close(self): ...
+
+class WriteWrapper:
+ writer = ... # type: Any
+ def __init__(self, wsgi_writer): ...
+ def __call__(self, s): ...
+
+class PartialIteratorWrapper:
+ iterator = ... # type: Any
+ def __init__(self, wsgi_iterator): ...
+ def __iter__(self): ...
+
+class IteratorWrapper:
+ original_iterator = ... # type: Any
+ iterator = ... # type: Any
+ closed = ... # type: Any
+ check_start_response = ... # type: Any
+ def __init__(self, wsgi_iterator, check_start_response): ...
+ def __iter__(self): ...
+ def __next__(self): ...
+ def close(self): ...
+ def __del__(self): ...
diff --git a/typeshed/stdlib/3/xml/etree/ElementInclude.pyi b/typeshed/stdlib/3/xml/etree/ElementInclude.pyi
new file mode 100644
index 0000000..ef1a591
--- /dev/null
+++ b/typeshed/stdlib/3/xml/etree/ElementInclude.pyi
@@ -0,0 +1,19 @@
+# Stubs for xml.etree.ElementInclude (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Union, Optional, Callable
+from .ElementTree import _ElementInterface
+
+XINCLUDE = ... # type: str
+XINCLUDE_INCLUDE = ... # type: str
+XINCLUDE_FALLBACK = ... # type: str
+
+class FatalIncludeError(SyntaxError): ...
+
+def default_loader(href: Union[str, bytes, int], parse: str, encoding: Optional[str]=...) -> Union[str, _ElementInterface]: ...
+
+# TODO: loader is of type default_loader ie it takes a callable that has the
+# same signature as default_loader. But default_loader has a keyword argument
+# Which can't be represented using Callable...
+def include(elem: _ElementInterface, loader: Callable[..., Union[str, _ElementInterface]]=...) -> None: ...
diff --git a/typeshed/stdlib/3/xml/etree/ElementPath.pyi b/typeshed/stdlib/3/xml/etree/ElementPath.pyi
new file mode 100644
index 0000000..db0aa36
--- /dev/null
+++ b/typeshed/stdlib/3/xml/etree/ElementPath.pyi
@@ -0,0 +1,25 @@
+# Stubs for xml.etree.ElementPath (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Tuple, List, Union, TypeVar, Callable, Optional
+from .ElementTree import _ElementInterface
+
+xpath_tokenizer_re = ... # type: Callable[..., List[Tuple[str, str]]]
+
+
+class xpath_descendant_or_self: ...
+
+_T = TypeVar('_T')
+
+class Path:
+ def __init__(self, path: str) -> None: ...
+ def find(self, element: _ElementInterface) -> Optional[_ElementInterface]: ...
+ def findtext(self, element: _ElementInterface, default: _T=...) -> Union[str, _T]: ...
+ def findall(self, element: _ElementInterface) -> List[_ElementInterface]: ...
+
+def find(element: _ElementInterface, path: str) -> Optional[_ElementInterface]: ...
+
+def findtext(element: _ElementInterface, path: str, default: _T=...) -> Union[str, _T]: ...
+
+def findall(element: _ElementInterface, path: str) -> List[_ElementInterface]: ...
diff --git a/typeshed/stdlib/3/xml/etree/ElementTree.pyi b/typeshed/stdlib/3/xml/etree/ElementTree.pyi
new file mode 100644
index 0000000..6f26818
--- /dev/null
+++ b/typeshed/stdlib/3/xml/etree/ElementTree.pyi
@@ -0,0 +1,98 @@
+# Stubs for xml.etree.ElementTree (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, AnyStr, Union, IO, Callable, Dict, List, Tuple, Sequence, Iterator, TypeVar, Optional, KeysView, ItemsView, Generator
+import io
+
+VERSION = ... # type: str
+
+_Ss = TypeVar('_Ss', str, bytes)
+_T = TypeVar('_T')
+_str_or_bytes = Union[str, bytes]
+
+class _ElementInterface(Sequence['_ElementInterface']):
+ tag = ... # type: _str_or_bytes
+ attrib = ... # type: Dict[_str_or_bytes, _str_or_bytes]
+ text = ... # type: Optional[_str_or_bytes]
+ tail = ... # type: Optional[_str_or_bytes]
+ def __init__(self, tag: Union[AnyStr, Callable[..., '_ElementInterface']], attrib: Dict[AnyStr, AnyStr]) -> None: ...
+ def makeelement(self, tag: _Ss, attrib: Dict[_Ss, _Ss]) -> '_ElementInterface': ...
+ def __len__(self) -> int: ...
+ def __getitem__(self, index: int) -> '_ElementInterface': ...
+ def __setitem__(self, index: int, element: '_ElementInterface') -> None: ...
+ def __delitem__(self, index: int) -> None: ...
+ def __getslice__(self, start: int, stop: int) -> Sequence['_ElementInterface']: ...
+ def __setslice__(self, start: int, stop: int, elements: Sequence['_ElementInterface']) -> None: ...
+ def __delslice__(self, start: int, stop: int) -> None: ...
+ def append(self, element: '_ElementInterface') -> None: ...
+ def insert(self, index: int, element: '_ElementInterface') -> None: ...
+ def remove(self, element: '_ElementInterface') -> None: ...
+ def getchildren(self) -> List['_ElementInterface']: ...
+ def find(self, path: str) -> Optional['_ElementInterface']: ...
+ def findtext(self, path: str, default: _T=...) -> Union[str, _T]: ...
+ def findall(self, path: str) -> List['_ElementInterface']: ...
+ def clear(self) -> None: ...
+ def get(self, key: AnyStr, default: _T=...) -> Union[AnyStr, _T]: ...
+ def set(self, key: AnyStr, value: AnyStr) -> None: ...
+ def keys(self) -> KeysView[AnyStr]: ...
+ def items(self) -> ItemsView[AnyStr, AnyStr]: ...
+ def getiterator(self, tag: Union[str, AnyStr]=...) -> List['_ElementInterface']: ...
+
+def Element(tag: Union[AnyStr, Callable[..., _ElementInterface]], attrib: Dict[AnyStr, AnyStr]=..., **extra: AnyStr) -> _ElementInterface: ...
+def SubElement(parent: _ElementInterface, tag: AnyStr, attrib: Dict[AnyStr, AnyStr]=..., **extra: AnyStr) -> _ElementInterface: ...
+def Comment(text: _str_or_bytes=...) -> _ElementInterface: ...
+def ProcessingInstruction(target: str, text: str=...) -> _ElementInterface: ...
+
+PI = ... # type: Callable[..., _ElementInterface]
+
+class QName:
+ text = ... # type: str
+ def __init__(self, text_or_uri: str, tag: str=...) -> None: ...
+
+
+_file_or_filename = Union[str, bytes, int, IO[Any]]
+
+class ElementTree:
+ def __init__(self, element: _ElementInterface=..., file: _file_or_filename=...) -> None: ...
+ def getroot(self) -> _ElementInterface: ...
+ def parse(self, source: _file_or_filename, parser: 'XMLTreeBuilder'=...) -> _ElementInterface: ...
+ def getiterator(self, tag: Union[str, AnyStr]=...) -> List[_ElementInterface]: ...
+ def find(self, path: str) -> Optional[_ElementInterface]: ...
+ def findtext(self, path: str, default: _T=...) -> Union[_T, str]: ...
+ def findall(self, path: str) -> List[_ElementInterface]: ...
+ def write(self, file_or_filename: _file_or_filename, encoding: str=...) -> None: ...
+
+def iselement(element: _ElementInterface) -> bool: ...
+def dump(elem: _ElementInterface) -> None: ...
+def fixtag(tag: Union[str, QName], namespaces: Dict[str, str]) -> Tuple[str, Optional[str]]: ...
+def parse(source: _file_or_filename, parser: 'XMLTreeBuilder'=...) -> ElementTree: ...
+
+
+class iterparse:
+ def __init__(self, source: _file_or_filename, events: Sequence[str]=...) -> None: ...
+ # TODO-figure out this type...
+ def __next__(self) -> Tuple[str, _ElementInterface]: ...
+
+def XML(text: AnyStr) -> _ElementInterface: ...
+def XMLID(text: AnyStr) -> Tuple[_ElementInterface, Dict[str, _ElementInterface]]: ...
+
+# TODO-improve this type
+fromstring = ... # type: Callable[..., _ElementInterface]
+
+def tostring(element: _ElementInterface, encoding: str=...) -> AnyStr: ...
+
+class TreeBuilder:
+ def __init__(self, element_factory: Callable[[AnyStr, Dict[AnyStr, AnyStr]], _ElementInterface]=...) -> None: ...
+ def close(self) -> _ElementInterface: ...
+ def data(self, data: AnyStr) -> None: ...
+ def start(self, tag: AnyStr, attrs: Dict[AnyStr, AnyStr]) -> _ElementInterface: ...
+ def end(self, tag: AnyStr) -> _ElementInterface: ...
+
+class XMLTreeBuilder:
+ # TODO-what is entity used for???
+ entity = ... # type: Any
+ def __init__(self, html: int=..., target: TreeBuilder=...) -> None: ...
+ def doctype(self, name: str, pubid: str, system: str) -> None: ...
+ def close(self) -> Any: ... # TODO-most of the time, this will be Element, but it can be anything target.close() returns
+ def feed(self, data: AnyStr)-> None: ...
diff --git a/mypy/test/__init__.py b/typeshed/stdlib/3/xml/etree/__init__.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/stdlib/3/xml/etree/__init__.pyi
diff --git a/typeshed/stdlib/3/xml/etree/cElementTree.pyi b/typeshed/stdlib/3/xml/etree/cElementTree.pyi
new file mode 100644
index 0000000..8f689de
--- /dev/null
+++ b/typeshed/stdlib/3/xml/etree/cElementTree.pyi
@@ -0,0 +1,5 @@
+# Stubs for xml.etree.cElementTree (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from xml.etree.ElementTree import * # noqa: F403
diff --git a/typeshed/stdlib/3/zlib.pyi b/typeshed/stdlib/3/zlib.pyi
new file mode 100644
index 0000000..39db843
--- /dev/null
+++ b/typeshed/stdlib/3/zlib.pyi
@@ -0,0 +1,46 @@
+# Stubs for zlib
+
+DEFLATED = ... # type: int
+DEF_BUF_SIZE = ... # type: int
+DEF_MEM_LEVEL = ... # type: int
+MAX_WBITS = ... # type: int
+ZLIB_RUNTIME_VERSION = ... # type: str
+ZLIB_VERSION = ... # type: str
+Z_BEST_COMPRESSION = ... # type: int
+Z_BEST_SPEED = ... # type: int
+Z_DEFAULT_COMPRESSION = ... # type: int
+Z_DEFAULT_STRATEGY = ... # type: int
+Z_FILTERED = ... # type: int
+Z_FINISH = ... # type: int
+Z_FULL_FLUSH = ... # type: int
+Z_HUFFMAN_ONLY = ... # type: int
+Z_NO_FLUSH = ... # type: int
+Z_SYNC_FLUSH = ... # type: int
+
+
+class error(Exception): ...
+
+
+class Compress:
+ def compress(self, data: bytes) -> bytes: ...
+ def flush(self, mode: int = ...) -> bytes: ...
+ def copy(self) -> "Compress": ...
+
+
+class Decompress:
+ unused_data = ... # type: bytes
+ unconsumed_tail = ... # type: bytes
+ eof = ... # type: bool
+ def decompress(self, data: bytes, max_length: int = ...) -> bytes: ...
+ def flush(self, length: int = ...) -> bytes: ...
+ def copy(self) -> "Decompress": ...
+
+
+def adler32(data: bytes, value: int = ...) -> int: ...
+def compress(data: bytes, level: int = ...) -> bytes: ...
+def compressobj(level: int = ..., method: int = ..., wbits: int = ...,
+ memlevel: int = ..., strategy: int = ...,
+ zdict: bytes = ...) -> Compress: ...
+def crc32(data: bytes, value: int = ...) -> int: ...
+def decompress(data: bytes, wbits: int = ..., bufsize: int = ...) -> bytes: ...
+def decompressobj(wbits: int = ..., zdict: bytes = ...) -> Decompress: ...
diff --git a/typeshed/tests/mypy_test.py b/typeshed/tests/mypy_test.py
new file mode 100755
index 0000000..d474009
--- /dev/null
+++ b/typeshed/tests/mypy_test.py
@@ -0,0 +1,149 @@
+#!/usr/bin/env python3
+"""Test runner for typeshed.
+
+Depends on mypy being installed.
+
+Approach:
+
+1. Parse sys.argv
+2. Compute appropriate arguments for mypy
+3. Stuff those arguments into sys.argv
+4. Run mypy.main('')
+5. Repeat steps 2-4 for other mypy runs (e.g. --py2)
+"""
+
+import os
+import re
+import sys
+import argparse
+
+parser = argparse.ArgumentParser(description="Test runner for typeshed. "
+ "Patterns are unanchored regexps on the full path.")
+parser.add_argument('-v', '--verbose', action='count', default=0, help="More output")
+parser.add_argument('-n', '--dry-run', action='store_true', help="Don't actually run mypy")
+parser.add_argument('-x', '--exclude', type=str, nargs='*', help="Exclude pattern")
+parser.add_argument('-p', '--python-version', type=str, nargs='*',
+ help="These versions only (major[.minor])")
+parser.add_argument('filter', type=str, nargs='*', help="Include pattern (default all)")
+
+
+def log(args, *varargs):
+ if args.verbose >= 2:
+ print(*varargs)
+
+
+def match(fn, args, blacklist):
+ if blacklist.match(fn):
+ log(args, fn, 'exluded by blacklist')
+ return False
+ if not args.filter and not args.exclude:
+ log(args, fn, 'accept by default')
+ return True
+ if args.exclude:
+ for f in args.exclude:
+ if re.search(f, fn):
+ log(args, fn, 'excluded by pattern', f)
+ return False
+ if args.filter:
+ for f in args.filter:
+ if re.search(f, fn):
+ log(args, fn, 'accepted by pattern', f)
+ return True
+ if args.filter:
+ log(args, fn, 'rejected (no pattern matches)')
+ return False
+ log(args, fn, 'accepted (no exclude pattern matches)')
+ return True
+
+
+def libpath(major, minor):
+ versions = ['%d.%d' % (major, minor)
+ for minor in reversed(range(minor + 1))]
+ versions.append(str(major))
+ versions.append('2and3')
+ paths = []
+ for v in versions:
+ for top in ['stdlib', 'third_party']:
+ p = os.path.join(top, v)
+ if os.path.isdir(p):
+ paths.append(p)
+ return paths
+
+
+def main():
+ args = parser.parse_args()
+
+ with open(os.path.join(os.path.dirname(__file__), "mypy_blacklist.txt")) as f:
+ blacklist = re.compile("(%s)$" % "|".join(
+ re.findall(r"^\s*([^\s#]+)\s*(?:#.*)?$", f.read(), flags=re.M)))
+
+ try:
+ from mypy.main import main as mypy_main
+ except ImportError:
+ print("Cannot import mypy. Did you install it?")
+ sys.exit(1)
+
+ versions = [(3, 6), (3, 5), (3, 4), (3, 3), (3, 2), (2, 7)]
+ if args.python_version:
+ versions = [v for v in versions
+ if any(('%d.%d' % v).startswith(av) for av in args.python_version)]
+ if not versions:
+ print("--- no versions selected ---")
+ sys.exit(1)
+
+ code = 0
+ runs = 0
+ for major, minor in versions:
+ roots = libpath(major, minor)
+ files = []
+ seen = {'__builtin__', 'builtins', 'typing'} # Always ignore these.
+ for root in roots:
+ names = os.listdir(root)
+ for name in names:
+ full = os.path.join(root, name)
+ mod, ext = os.path.splitext(name)
+ if mod in seen or mod.startswith('.'):
+ continue
+ if ext in ['.pyi', '.py']:
+ if match(full, args, blacklist):
+ seen.add(mod)
+ files.append(full)
+ elif (os.path.isfile(os.path.join(full, '__init__.pyi')) or
+ os.path.isfile(os.path.join(full, '__init__.py'))):
+ for r, ds, fs in os.walk(full):
+ ds.sort()
+ fs.sort()
+ for f in fs:
+ m, x = os.path.splitext(f)
+ if x in ['.pyi', '.py']:
+ fn = os.path.join(r, f)
+ if match(fn, args, blacklist):
+ seen.add(mod)
+ files.append(fn)
+ if files:
+ runs += 1
+ flags = ['--python-version', '%d.%d' % (major, minor)]
+ flags.append('--strict-optional')
+ if (major, minor) >= (3, 6):
+ flags.append('--fast-parser')
+ # flags.append('--warn-unused-ignores') # Fast parser and regular parser disagree.
+ sys.argv = ['mypy'] + flags + files
+ if args.verbose:
+ print("running", ' '.join(sys.argv))
+ else:
+ print("running mypy", ' '.join(flags), "# with", len(files), "files")
+ try:
+ if not args.dry_run:
+ mypy_main('')
+ except SystemExit as err:
+ code = max(code, err.code)
+ if code:
+ print("--- exit status", code, "---")
+ sys.exit(code)
+ if not runs:
+ print("--- nothing to do; exit 1 ---")
+ sys.exit(1)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/typeshed/tests/pytype_test.py b/typeshed/tests/pytype_test.py
new file mode 100755
index 0000000..e7475c0
--- /dev/null
+++ b/typeshed/tests/pytype_test.py
@@ -0,0 +1,109 @@
+#!/usr/bin/env python
+"""Test runner for typeshed.
+
+Depends on mypy and pytype being installed.
+
+If pytype is installed:
+ 1. For every pyi, run "pytd <foo.pyi>" in a separate process
+"""
+
+import os
+import re
+import sys
+import argparse
+import subprocess
+import collections
+
+parser = argparse.ArgumentParser(description="Pytype tests.")
+parser.add_argument('-n', '--dry-run', action='store_true', help="Don't actually run tests")
+parser.add_argument('--num-parallel', type=int, default=1,
+ help="Number of test processes to spawn")
+
+
+def main():
+ args = parser.parse_args()
+ code, runs = pytype_test(args)
+
+ if code:
+ print("--- exit status %d ---" % code)
+ sys.exit(code)
+ if not runs:
+ print("--- nothing to do; exit 1 ---")
+ sys.exit(1)
+
+
+def load_blacklist():
+ filename = os.path.join(os.path.dirname(__file__), "pytype_blacklist.txt")
+ regex = r"^\s*([^\s#]+)\s*(?:#.*)?$"
+
+ with open(filename) as f:
+ return re.findall(regex, f.read(), flags=re.M)
+
+
+class PytdRun(object):
+ def __init__(self, args, dry_run=False):
+ self.args = args
+ self.dry_run = dry_run
+ self.results = None
+
+ if dry_run:
+ self.results = (0, "", "")
+ else:
+ self.proc = subprocess.Popen(
+ ["pytd"] + args,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE)
+
+ def communicate(self):
+ if self.results:
+ return self.results
+
+ stdout, stderr = self.proc.communicate()
+ self.results = self.proc.returncode, stdout, stderr
+ return self.results
+
+
+def pytype_test(args):
+ try:
+ PytdRun(["-h"]).communicate()
+ except OSError:
+ print("Cannot run pytd. Did you install pytype?")
+ return 0, 0
+
+ wanted = re.compile(r"stdlib/(2|2\.7|2and3)/.*\.pyi$")
+ skipped = re.compile("(%s)$" % "|".join(load_blacklist()))
+ files = []
+
+ for root, _, filenames in os.walk("stdlib"):
+ for f in sorted(filenames):
+ f = os.path.join(root, f)
+ if wanted.search(f) and not skipped.search(f):
+ files.append(f)
+
+ running_tests = collections.deque()
+ max_code, runs, errors = 0, 0, 0
+ print("Running pytype tests...")
+ while 1:
+ while files and len(running_tests) < args.num_parallel:
+ test_run = PytdRun([files.pop()], dry_run=args.dry_run)
+ running_tests.append(test_run)
+
+ if not running_tests:
+ break
+
+ test_run = running_tests.popleft()
+ code, stdout, stderr = test_run.communicate()
+ max_code = max(max_code, code)
+ runs += 1
+
+ if code:
+ print("pytd error processing \"%s\":" % test_run.args[0])
+ print(stderr)
+ errors += 1
+
+ print("Ran pytype with %d pyis, got %d errors." % (runs, errors))
+ return max_code, runs
+
+
+if __name__ == '__main__':
+ main()
diff --git a/mypy/test/__init__.py b/typeshed/third_party/2/OpenSSL/__init__.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/third_party/2/OpenSSL/__init__.pyi
diff --git a/typeshed/third_party/2/OpenSSL/crypto.pyi b/typeshed/third_party/2/OpenSSL/crypto.pyi
new file mode 100644
index 0000000..ef352ac
--- /dev/null
+++ b/typeshed/third_party/2/OpenSSL/crypto.pyi
@@ -0,0 +1,6 @@
+class X509:
+ ...
+
+def sign(key: str, data: str, digest: str) -> str: ...
+def verify(certificate: X509, signature: str, data: str, digest: str) -> None:
+ raise Exception()
diff --git a/mypy/test/__init__.py b/typeshed/third_party/2/concurrent/__init__.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/third_party/2/concurrent/__init__.pyi
diff --git a/typeshed/third_party/2/concurrent/futures/__init__.pyi b/typeshed/third_party/2/concurrent/futures/__init__.pyi
new file mode 100644
index 0000000..8e915ae
--- /dev/null
+++ b/typeshed/third_party/2/concurrent/futures/__init__.pyi
@@ -0,0 +1,37 @@
+from typing import TypeVar, Generic, Any, Iterable, Iterator, Callable, Tuple, Union
+
+_T = TypeVar('_T')
+
+class Future(Generic[_T]):
+ def cancel(self) -> bool: ...
+ def cancelled(self) -> bool: ...
+ def running(self) -> bool: ...
+ def done(self) -> bool: ...
+ def result(self, timeout: float = ...) -> _T: ...
+ def exception(self, timeout: float = ...) -> Exception: ...
+ def add_done_callback(self, fn: Callable[[Future], Any]) -> None: ...
+
+ def set_running_or_notify_cancel(self) -> None: ...
+ def set_result(self, result: _T) -> None: ...
+ def set_exception(self, exception: Exception) -> None: ...
+
+class Executor:
+ def submit(self, fn: Callable[..., _T], *args: Any, **kwargs: Any) -> Future[_T]: ...
+ def map(self, func: Callable[..., _T], *iterables: Any, timeout: float = ...) -> Iterable[_T]: ...
+ def shutdown(self, wait: bool = ...) -> None: ...
+ def __enter__(self) -> Executor: ...
+ def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> bool: ...
+
+class ThreadPoolExecutor(Executor):
+ def __init__(self, max_workers: int) -> None: ...
+
+class ProcessPoolExecutor(Executor):
+ def __init__(self, max_workers: Union[int, None] = ...) -> None: ...
+
+def wait(fs: Iterable[Future], timeout: float = ..., return_when: str = ...) -> Tuple[Iterable[Future], Iterable[Future]]: ...
+
+FIRST_COMPLETED = ... # type: str
+FIRST_EXCEPTION = ... # type: str
+ALL_COMPLETED = ... # type: str
+
+def as_completed(fs: Iterable[Future], timeout: float = ...) -> Iterator[Future]: ...
diff --git a/typeshed/third_party/2/croniter.pyi b/typeshed/third_party/2/croniter.pyi
new file mode 100644
index 0000000..2495495
--- /dev/null
+++ b/typeshed/third_party/2/croniter.pyi
@@ -0,0 +1,27 @@
+# Stubs for croniter.croniter (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class croniter:
+ MONTHS_IN_YEAR = ... # type: Any
+ RANGES = ... # type: Any
+ DAYS = ... # type: Any
+ ALPHACONV = ... # type: Any
+ LOWMAP = ... # type: Any
+ bad_length = ... # type: Any
+ tzinfo = ... # type: Any
+ cur = ... # type: Any
+ exprs = ... # type: Any
+ expanded = ... # type: Any
+ def __init__(self, expr_format, start_time=..., ret_type=...) -> None: ...
+ def get_next(self, ret_type=...): ...
+ def get_prev(self, ret_type=...): ...
+ def get_current(self, ret_type=...): ...
+ def __iter__(self): ...
+ __next__ = ... # type: Any
+ def all_next(self, ret_type=...): ...
+ def all_prev(self, ret_type=...): ...
+ iter = ... # type: Any
+ def is_leap(self, year): ...
diff --git a/mypy/test/__init__.py b/typeshed/third_party/2/dateutil/__init__.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/third_party/2/dateutil/__init__.pyi
diff --git a/typeshed/third_party/2/dateutil/parser.pyi b/typeshed/third_party/2/dateutil/parser.pyi
new file mode 100644
index 0000000..d2927e8
--- /dev/null
+++ b/typeshed/third_party/2/dateutil/parser.pyi
@@ -0,0 +1,39 @@
+from typing import List, Tuple, Optional, Callable, Union, IO, Any, Dict
+from datetime import datetime, tzinfo
+
+__all__ = ... # type: List[str]
+
+
+class parserinfo(object):
+ JUMP = ... # type: List[str]
+ WEEKDAYS = ... # type: List[Tuple[str, str]]
+ MONTHS = ... # type: List[Tuple[str, str]]
+ HMS = ... # type: List[Tuple[str, str, str]]
+ AMPM = ... # type: List[Tuple[str, str]]
+ UTCZONE = ... # type: List[str]
+ PERTAIN = ... # type: List[str]
+ TZOFFSET = ... # type: Dict[str, int]
+
+ def __init__(self, dayfirst: bool=..., yearfirst: bool=...) -> None: ...
+ def jump(self, name: unicode) -> bool: ...
+ def weekday(self, name: unicode) -> Union[int, None]: ...
+ def month(self, name: unicode) -> Union[int, None]: ...
+ def hms(self, name: unicode) -> Union[int, None]: ...
+ def ampm(self, name: unicode) -> Union[int, None]: ...
+ def pertain(self, name: unicode) -> bool: ...
+ def utczone(self, name: unicode) -> bool: ...
+ def tzoffset(self, name: unicode) -> Union[int, None]: ...
+ def convertyear(self, year: int) -> int: ...
+ def validate(self, res: datetime) -> bool: ...
+
+class parser(object):
+ def __init__(self, info: parserinfo = None) -> None: ...
+ def parse(self, timestr: Union[str, unicode, IO[unicode]],
+ default: datetime = None,
+ ignoretz: bool = ..., tzinfos: Dict[Union[str, unicode], tzinfo] = None,
+ **kwargs: Any) -> datetime: ...
+
+DEFAULTPARSER = ... # type: parser
+def parse(timestr: Union[str, unicode, IO[unicode]],
+ parserinfo: parserinfo = None,
+ **kwargs: Any) -> datetime: ...
diff --git a/typeshed/third_party/2/dateutil/relativedelta.pyi b/typeshed/third_party/2/dateutil/relativedelta.pyi
new file mode 100644
index 0000000..3a99eaf
--- /dev/null
+++ b/typeshed/third_party/2/dateutil/relativedelta.pyi
@@ -0,0 +1,86 @@
+from typing import Any, Optional, Union
+from datetime import date, datetime, timedelta
+
+__all__ = ... # type: List[str]
+
+
+class weekday(object):
+ def __init__(self, weekday: int, n: Optional[int]=...) -> None: ...
+
+ def __call__(self, n: int) -> 'weekday': ...
+
+ def __eq__(self, other) -> bool: ...
+
+ def __repr__(self) -> str: ...
+
+ weekday = ... # type: int
+ n = ... # type: int
+
+MO = ... # type: weekday
+TU = ... # type: weekday
+WE = ... # type: weekday
+TH = ... # type: weekday
+FR = ... # type: weekday
+SA = ... # type: weekday
+SU = ... # type: weekday
+
+
+class relativedelta(object):
+ def __init__(self,
+ dt1: Optional[date]=...,
+ dt2: Optional[date]=...,
+ years: Optional[int]=..., months: Optional[int]=...,
+ days: Optional[int]=..., leapdays: Optional[int]=...,
+ weeks: Optional[int]=...,
+ hours: Optional[int]=..., minutes: Optional[int]=...,
+ seconds: Optional[int]=..., microseconds: Optional[int]=...,
+ year: Optional[int]=..., month: Optional[int]=...,
+ day: Optional[int]=...,
+ weekday: Optional[Union[int, weekday]]=...,
+ yearday: Optional[int]=...,
+ nlyearday: Optional[int]=...,
+ hour: Optional[int]=..., minute: Optional[int]=...,
+ second: Optional[int]=...,
+ microsecond: Optional[int]=...) -> None: ...
+
+ @property
+ def weeks(self) -> int: ...
+
+ @weeks.setter
+ def weeks(self, value: int) -> None: ...
+
+ def normalized(self) -> 'relativedelta': ...
+
+ def __add__(
+ self,
+ other: Union['relativedelta', timedelta, date, datetime]) -> 'relativedelta': ...
+
+ def __radd__(
+ self,
+ other: Any) -> 'relativedelta': ...
+
+ def __rsub__(
+ self,
+ other: Any) -> 'relativedelta': ...
+
+ def __sub__(self, other: 'relativedelta') -> 'relativedelta': ...
+
+ def __neg__(self) -> 'relativedelta': ...
+
+ def __bool__(self) -> bool: ...
+
+ def __nonzero__(self) -> bool: ...
+
+ def __mul__(self, other: float) -> 'relativedelta': ...
+
+ def __rmul__(self, other: float) -> 'relativedelta': ...
+
+ def __eq__(self, other) -> bool: ...
+
+ def __ne__(self, other: object) -> bool: ...
+
+ def __div__(self, other: float) -> 'relativedelta': ...
+
+ def __truediv__(self, other: float) -> 'relativedelta': ...
+
+ def __repr__(self) -> str: ...
diff --git a/typeshed/third_party/2/enum.pyi b/typeshed/third_party/2/enum.pyi
new file mode 100644
index 0000000..4032e81
--- /dev/null
+++ b/typeshed/third_party/2/enum.pyi
@@ -0,0 +1,19 @@
+from typing import List, Any, TypeVar
+
+class Enum:
+ def __new__(cls, value: Any) -> None: ...
+ def __repr__(self) -> str: ...
+ def __str__(self) -> str: ...
+ def __dir__(self) -> List[str]: ...
+ def __format__(self, format_spec: str) -> str: ...
+ def __hash__(self) -> Any: ...
+ def __reduce_ex__(self, proto: Any) -> Any: ...
+
+ name = ... # type: str
+ value = ... # type: Any
+
+class IntEnum(int, Enum): ...
+
+_T = TypeVar('_T')
+
+def unique(enumeration: _T) -> _T: ...
diff --git a/typeshed/third_party/2/fb303/FacebookService.pyi b/typeshed/third_party/2/fb303/FacebookService.pyi
new file mode 100644
index 0000000..09c6ef1
--- /dev/null
+++ b/typeshed/third_party/2/fb303/FacebookService.pyi
@@ -0,0 +1,301 @@
+# Stubs for fb303.FacebookService (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from thrift.Thrift import TProcessor
+
+fastbinary = ... # type: Any
+
+class Iface:
+ def getName(self): ...
+ def getVersion(self): ...
+ def getStatus(self): ...
+ def getStatusDetails(self): ...
+ def getCounters(self): ...
+ def getCounter(self, key): ...
+ def setOption(self, key, value): ...
+ def getOption(self, key): ...
+ def getOptions(self): ...
+ def getCpuProfile(self, profileDurationInSec): ...
+ def aliveSince(self): ...
+ def reinitialize(self): ...
+ def shutdown(self): ...
+
+class Client(Iface):
+ def __init__(self, iprot, oprot=...) -> None: ...
+ def getName(self): ...
+ def send_getName(self): ...
+ def recv_getName(self): ...
+ def getVersion(self): ...
+ def send_getVersion(self): ...
+ def recv_getVersion(self): ...
+ def getStatus(self): ...
+ def send_getStatus(self): ...
+ def recv_getStatus(self): ...
+ def getStatusDetails(self): ...
+ def send_getStatusDetails(self): ...
+ def recv_getStatusDetails(self): ...
+ def getCounters(self): ...
+ def send_getCounters(self): ...
+ def recv_getCounters(self): ...
+ def getCounter(self, key): ...
+ def send_getCounter(self, key): ...
+ def recv_getCounter(self): ...
+ def setOption(self, key, value): ...
+ def send_setOption(self, key, value): ...
+ def recv_setOption(self): ...
+ def getOption(self, key): ...
+ def send_getOption(self, key): ...
+ def recv_getOption(self): ...
+ def getOptions(self): ...
+ def send_getOptions(self): ...
+ def recv_getOptions(self): ...
+ def getCpuProfile(self, profileDurationInSec): ...
+ def send_getCpuProfile(self, profileDurationInSec): ...
+ def recv_getCpuProfile(self): ...
+ def aliveSince(self): ...
+ def send_aliveSince(self): ...
+ def recv_aliveSince(self): ...
+ def reinitialize(self): ...
+ def send_reinitialize(self): ...
+ def shutdown(self): ...
+ def send_shutdown(self): ...
+
+class Processor(Iface, TProcessor):
+ def __init__(self, handler) -> None: ...
+ def process(self, iprot, oprot): ...
+ def process_getName(self, seqid, iprot, oprot): ...
+ def process_getVersion(self, seqid, iprot, oprot): ...
+ def process_getStatus(self, seqid, iprot, oprot): ...
+ def process_getStatusDetails(self, seqid, iprot, oprot): ...
+ def process_getCounters(self, seqid, iprot, oprot): ...
+ def process_getCounter(self, seqid, iprot, oprot): ...
+ def process_setOption(self, seqid, iprot, oprot): ...
+ def process_getOption(self, seqid, iprot, oprot): ...
+ def process_getOptions(self, seqid, iprot, oprot): ...
+ def process_getCpuProfile(self, seqid, iprot, oprot): ...
+ def process_aliveSince(self, seqid, iprot, oprot): ...
+ def process_reinitialize(self, seqid, iprot, oprot): ...
+ def process_shutdown(self, seqid, iprot, oprot): ...
+
+class getName_args:
+ thrift_spec = ... # type: Any
+ def read(self, iprot): ...
+ def write(self, oprot): ...
+ def validate(self): ...
+ def __eq__(self, other): ...
+ def __ne__(self, other): ...
+
+class getName_result:
+ thrift_spec = ... # type: Any
+ success = ... # type: Any
+ def __init__(self, success=...) -> None: ...
+ def read(self, iprot): ...
+ def write(self, oprot): ...
+ def validate(self): ...
+ def __eq__(self, other): ...
+ def __ne__(self, other): ...
+
+class getVersion_args:
+ thrift_spec = ... # type: Any
+ def read(self, iprot): ...
+ def write(self, oprot): ...
+ def validate(self): ...
+ def __eq__(self, other): ...
+ def __ne__(self, other): ...
+
+class getVersion_result:
+ thrift_spec = ... # type: Any
+ success = ... # type: Any
+ def __init__(self, success=...) -> None: ...
+ def read(self, iprot): ...
+ def write(self, oprot): ...
+ def validate(self): ...
+ def __eq__(self, other): ...
+ def __ne__(self, other): ...
+
+class getStatus_args:
+ thrift_spec = ... # type: Any
+ def read(self, iprot): ...
+ def write(self, oprot): ...
+ def validate(self): ...
+ def __eq__(self, other): ...
+ def __ne__(self, other): ...
+
+class getStatus_result:
+ thrift_spec = ... # type: Any
+ success = ... # type: Any
+ def __init__(self, success=...) -> None: ...
+ def read(self, iprot): ...
+ def write(self, oprot): ...
+ def validate(self): ...
+ def __eq__(self, other): ...
+ def __ne__(self, other): ...
+
+class getStatusDetails_args:
+ thrift_spec = ... # type: Any
+ def read(self, iprot): ...
+ def write(self, oprot): ...
+ def validate(self): ...
+ def __eq__(self, other): ...
+ def __ne__(self, other): ...
+
+class getStatusDetails_result:
+ thrift_spec = ... # type: Any
+ success = ... # type: Any
+ def __init__(self, success=...) -> None: ...
+ def read(self, iprot): ...
+ def write(self, oprot): ...
+ def validate(self): ...
+ def __eq__(self, other): ...
+ def __ne__(self, other): ...
+
+class getCounters_args:
+ thrift_spec = ... # type: Any
+ def read(self, iprot): ...
+ def write(self, oprot): ...
+ def validate(self): ...
+ def __eq__(self, other): ...
+ def __ne__(self, other): ...
+
+class getCounters_result:
+ thrift_spec = ... # type: Any
+ success = ... # type: Any
+ def __init__(self, success=...) -> None: ...
+ def read(self, iprot): ...
+ def write(self, oprot): ...
+ def validate(self): ...
+ def __eq__(self, other): ...
+ def __ne__(self, other): ...
+
+class getCounter_args:
+ thrift_spec = ... # type: Any
+ key = ... # type: Any
+ def __init__(self, key=...) -> None: ...
+ def read(self, iprot): ...
+ def write(self, oprot): ...
+ def validate(self): ...
+ def __eq__(self, other): ...
+ def __ne__(self, other): ...
+
+class getCounter_result:
+ thrift_spec = ... # type: Any
+ success = ... # type: Any
+ def __init__(self, success=...) -> None: ...
+ def read(self, iprot): ...
+ def write(self, oprot): ...
+ def validate(self): ...
+ def __eq__(self, other): ...
+ def __ne__(self, other): ...
+
+class setOption_args:
+ thrift_spec = ... # type: Any
+ key = ... # type: Any
+ value = ... # type: Any
+ def __init__(self, key=..., value=...) -> None: ...
+ def read(self, iprot): ...
+ def write(self, oprot): ...
+ def validate(self): ...
+ def __eq__(self, other): ...
+ def __ne__(self, other): ...
+
+class setOption_result:
+ thrift_spec = ... # type: Any
+ def read(self, iprot): ...
+ def write(self, oprot): ...
+ def validate(self): ...
+ def __eq__(self, other): ...
+ def __ne__(self, other): ...
+
+class getOption_args:
+ thrift_spec = ... # type: Any
+ key = ... # type: Any
+ def __init__(self, key=...) -> None: ...
+ def read(self, iprot): ...
+ def write(self, oprot): ...
+ def validate(self): ...
+ def __eq__(self, other): ...
+ def __ne__(self, other): ...
+
+class getOption_result:
+ thrift_spec = ... # type: Any
+ success = ... # type: Any
+ def __init__(self, success=...) -> None: ...
+ def read(self, iprot): ...
+ def write(self, oprot): ...
+ def validate(self): ...
+ def __eq__(self, other): ...
+ def __ne__(self, other): ...
+
+class getOptions_args:
+ thrift_spec = ... # type: Any
+ def read(self, iprot): ...
+ def write(self, oprot): ...
+ def validate(self): ...
+ def __eq__(self, other): ...
+ def __ne__(self, other): ...
+
+class getOptions_result:
+ thrift_spec = ... # type: Any
+ success = ... # type: Any
+ def __init__(self, success=...) -> None: ...
+ def read(self, iprot): ...
+ def write(self, oprot): ...
+ def validate(self): ...
+ def __eq__(self, other): ...
+ def __ne__(self, other): ...
+
+class getCpuProfile_args:
+ thrift_spec = ... # type: Any
+ profileDurationInSec = ... # type: Any
+ def __init__(self, profileDurationInSec=...) -> None: ...
+ def read(self, iprot): ...
+ def write(self, oprot): ...
+ def validate(self): ...
+ def __eq__(self, other): ...
+ def __ne__(self, other): ...
+
+class getCpuProfile_result:
+ thrift_spec = ... # type: Any
+ success = ... # type: Any
+ def __init__(self, success=...) -> None: ...
+ def read(self, iprot): ...
+ def write(self, oprot): ...
+ def validate(self): ...
+ def __eq__(self, other): ...
+ def __ne__(self, other): ...
+
+class aliveSince_args:
+ thrift_spec = ... # type: Any
+ def read(self, iprot): ...
+ def write(self, oprot): ...
+ def validate(self): ...
+ def __eq__(self, other): ...
+ def __ne__(self, other): ...
+
+class aliveSince_result:
+ thrift_spec = ... # type: Any
+ success = ... # type: Any
+ def __init__(self, success=...) -> None: ...
+ def read(self, iprot): ...
+ def write(self, oprot): ...
+ def validate(self): ...
+ def __eq__(self, other): ...
+ def __ne__(self, other): ...
+
+class reinitialize_args:
+ thrift_spec = ... # type: Any
+ def read(self, iprot): ...
+ def write(self, oprot): ...
+ def validate(self): ...
+ def __eq__(self, other): ...
+ def __ne__(self, other): ...
+
+class shutdown_args:
+ thrift_spec = ... # type: Any
+ def read(self, iprot): ...
+ def write(self, oprot): ...
+ def validate(self): ...
+ def __eq__(self, other): ...
+ def __ne__(self, other): ...
diff --git a/mypy/test/__init__.py b/typeshed/third_party/2/fb303/__init__.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/third_party/2/fb303/__init__.pyi
diff --git a/typeshed/third_party/2/gflags.pyi b/typeshed/third_party/2/gflags.pyi
new file mode 100644
index 0000000..cdec93a
--- /dev/null
+++ b/typeshed/third_party/2/gflags.pyi
@@ -0,0 +1,214 @@
+from typing import Any, Callable, Dict, Iterable, IO, List, Union
+from types import ModuleType
+
+class FlagsError(Exception): ...
+
+class DuplicateFlag(FlagsError): ...
+
+class CantOpenFlagFileError(FlagsError): ...
+
+class DuplicateFlagCannotPropagateNoneToSwig(DuplicateFlag): ...
+
+class DuplicateFlagError(DuplicateFlag):
+ def __init__(self, flagname: str, flag_values: FlagValues, other_flag_values: FlagValues = ...) -> None: ...
+
+class IllegalFlagValue(FlagsError): ...
+
+class UnrecognizedFlag(FlagsError): ...
+
+class UnrecognizedFlagError(UnrecognizedFlag):
+ def __init__(self, flagname: str, flagvalue: str = ...) -> None: ...
+
+def GetHelpWidth() -> int: ...
+def CutCommonSpacePrefix(text) -> str: ...
+def TextWrap(text: str, length: int = ..., indent: str = ..., firstline_indent: str = ..., tabs: str = ...) -> str: ...
+def DocToHelp(doc: str) -> str: ...
+
+class FlagValues:
+ def __init__(self) -> None: ...
+ def UseGnuGetOpt(self, use_gnu_getopt: bool = ...) -> None: ...
+ def IsGnuGetOpt(self) -> bool: ...
+# TODO dict type
+ def FlagDict(self) -> dict: ...
+ def FlagsByModuleDict(self) -> Dict[str, List[Flag]]: ...
+ def FlagsByModuleIdDict(self) -> Dict[int, List[Flag]]: ...
+ def KeyFlagsByModuleDict(self) -> Dict[str, List[Flag]]: ...
+ def FindModuleDefiningFlag(self, flagname: str, default: str = ...) -> str: ...
+ def FindModuleIdDefiningFlag(self, flagname: str, default: int = ...) -> int: ...
+ def AppendFlagValues(self, flag_values: FlagValues) -> None: ...
+ def RemoveFlagValues(self, flag_values: FlagValues) -> None: ...
+ def __setitem__(self, name: str, flag: Flag) -> None: ...
+ def __getitem__(self, name: str) -> Flag: ...
+ def __getattr__(self, name: str) -> Any: ...
+ def __setattr__(self, name: str, value: Any): ...
+ def __delattr__(self, flag_name: str) -> None: ...
+ def SetDefault(self, name: str, value: Any) -> None: ...
+ def __contains__(self, name: str) -> bool: ...
+ has_key = __contains__
+ def __iter__(self) -> Iterable[str]: ...
+ def __call__(self, argv: List[str]) -> List[str]: ...
+ def Reset(self) -> None: ...
+ def RegisteredFlags(self) -> List[str]: ...
+ def FlagValuesDict(self) -> Dict[str, Any]: ...
+ def __str__(self) -> str: ...
+ def GetHelp(self, prefix: str = ...) -> str: ...
+ def ModuleHelp(self, module: Union[ModuleType, str]) -> str: ...
+ def MainModuleHelp(self) -> str: ...
+ def get(self, name: str, default: Any) -> Any: ...
+ def ShortestUniquePrefixes(self, fl: Dict[str, Flag]) -> Dict[str, str]: ...
+ def ExtractFilename(self, flagfile_str: str) -> str: ...
+ def ReadFlagsFromFiles(self, argv: List[str], force_gnu: bool = ...) -> List[str]: ...
+ def FlagsIntoString(self) -> str: ...
+ def AppendFlagsIntoFile(self, filename: str) -> None: ...
+ def WriteHelpInXMLFormat(self, outfile: IO[str] = ...) -> None: ...
+# TODO validator: gflags_validators.Validator
+ def AddValidator(self, validator: Any) -> None: ...
+
+FLAGS = ... # type: FlagValues
+
+class Flag:
+ name = ... # type: str
+ default = ... # type: Any
+ default_as_str = ... # type: str
+ value = ... # type: Any
+ help = ... # type: str
+ short_name = ... # type: str
+ boolean = False
+ present = False
+ parser = ... # type: ArgumentParser
+ serializer = ... # type: ArgumentSerializer
+ allow_override = False
+
+ def __init__(self, parser: ArgumentParser, serializer: ArgumentSerializer, name: str,
+ default: str, help_string: str, short_name: str = ..., boolean: bool = ...,
+ allow_override: bool = ...) -> None: ...
+ def Parse(self, argument: Any) -> Any: ...
+ def Unparse(self) -> None: ...
+ def Serialize(self) -> str: ...
+ def SetDefault(self, value: Any) -> None: ...
+ def Type(self) -> str: ...
+ def WriteInfoInXMLFormat(self, outfile: IO[str], module_name: str, is_key: bool = ..., indent: str = ...) -> None: ...
+
+class ArgumentParser(object):
+ syntactic_help = ... # type: str
+# TODO what is this
+ def Parse(self, argument: Any) -> Any: ...
+ def Type(self) -> str: ...
+ def WriteCustomInfoInXMLFormat(self, outfile: IO[str], indent: str) -> None: ...
+
+class ArgumentSerializer:
+ def Serialize(self, value: Any) -> unicode: ...
+
+class ListSerializer(ArgumentSerializer):
+ def __init__(self, list_sep: str) -> None: ...
+ def Serialize(self, value: List[Any]) -> str: ...
+
+def RegisterValidator(flag_name: str,
+ checker: Callable[[Any], bool],
+ message: str = ...,
+ flag_values: FlagValues = ...) -> None: ...
+def MarkFlagAsRequired(flag_name: str, flag_values: FlagValues = ...) -> None: ...
+
+def DEFINE(parser: ArgumentParser, name: str, default: Any, help: str,
+ flag_values: FlagValues = ..., serializer: ArgumentSerializer = ..., **args: Any) -> None: ...
+def DEFINE_flag(flag: Flag, flag_values: FlagValues = ...) -> None: ...
+def DECLARE_key_flag(flag_name: str, flag_values: FlagValues = ...) -> None: ...
+def ADOPT_module_key_flags(module: ModuleType, flag_values: FlagValues = ...) -> None: ...
+def DEFINE_string(name: str, default: str, help: str, flag_values: FlagValues = ..., **args: Any): ...
+
+class BooleanParser(ArgumentParser):
+ def Convert(self, argument: Any) -> bool: ...
+ def Parse(self, argument: Any) -> bool: ...
+ def Type(self) -> str: ...
+
+class BooleanFlag(Flag):
+ def __init__(self, name: str, default: bool, help: str, short_name=..., **args: Any) -> None: ...
+
+def DEFINE_boolean(name: str, default: bool, help: str, flag_values: FlagValues = ..., **args: Any) -> None: ...
+
+DEFINE_bool = DEFINE_boolean
+
+class HelpFlag(BooleanFlag):
+ def __init__(self) -> None: ...
+ def Parse(self, arg: Any) -> None: ...
+
+class HelpXMLFlag(BooleanFlag):
+ def __init__(self) -> None: ...
+ def Parse(self, arg: Any) -> None: ...
+
+class HelpshortFlag(BooleanFlag):
+ def __init__(self) -> None: ...
+ def Parse(self, arg: Any) -> None: ...
+
+class NumericParser(ArgumentParser):
+ def IsOutsideBounds(self, val: float) -> bool: ...
+ def Parse(self, argument: Any) -> float: ...
+ def WriteCustomInfoInXMLFormat(self, outfile: IO[str], indent: str) -> None: ...
+ def Convert(self, argument: Any) -> Any: ...
+
+class FloatParser(NumericParser):
+ number_article = ... # type: str
+ number_name = ... # type: str
+ syntactic_help = ... # type: str
+ def __init__(self, lower_bound: float = ..., upper_bound: float = ...) -> None: ...
+ def Convert(self, argument: Any) -> float: ...
+ def Type(self) -> str: ...
+
+def DEFINE_float(name: str, default: float, help: str, lower_bound: float = ...,
+ upper_bound: float = ..., flag_values: FlagValues = ..., **args: Any) -> None: ...
+
+class IntegerParser(NumericParser):
+ number_article = ... # type: str
+ number_name = ... # type: str
+ syntactic_help = ... # type: str
+ def __init__(self, lower_bound: int = ..., upper_bound: int = ...) -> None: ...
+ def Convert(self, argument: Any) -> int: ...
+ def Type(self) -> str: ...
+
+def DEFINE_integer(name: str, default: int, help: str, lower_bound: int = ...,
+ upper_bound: int = ..., flag_values: FlagValues = ..., **args: Any) -> None: ...
+
+class EnumParser(ArgumentParser):
+ def __init__(self, enum_values: List[str]) -> None: ...
+ def Parse(self, argument: Any) -> Any: ...
+ def Type(self) -> str: ...
+
+class EnumFlag(Flag):
+ def __init__(self, name: str, default: str, help: str, enum_values: List[str],
+ short_name: str, **args: Any) -> None: ...
+
+def DEFINE_enum(name: str, default: str, enum_values: List[str], help: str,
+ flag_values: FlagValues = ..., **args: Any) -> None: ...
+
+class BaseListParser(ArgumentParser):
+ def __init__(self, token: str = ..., name: str = ...) -> None: ...
+ def Parse(self, argument: Any) -> list: ...
+ def Type(self) -> str: ...
+
+class ListParser(BaseListParser):
+ def __init__(self) -> None: ...
+ def WriteCustomInfoInXMLFormat(self, outfile: IO[str], indent: str): ...
+
+class WhitespaceSeparatedListParser(BaseListParser):
+ def __init__(self) -> None: ...
+ def WriteCustomInfoInXMLFormat(self, outfile: IO[str], indent: str): ...
+
+def DEFINE_list(name: str, default: List[str], help: str, flag_values: FlagValues = ..., **args: Any) -> None: ...
+def DEFINE_spaceseplist(name: str, default: List[str], help: str, flag_values: FlagValues = ..., **args: Any) -> None: ...
+
+class MultiFlag(Flag):
+ def __init__(self, *args: Any, **kwargs: Any) -> None: ...
+ def Parse(self, arguments: Any) -> None: ...
+ def Serialize(self) -> str: ...
+ def Type(self) -> str: ...
+
+def DEFINE_multistring(name: str, default: Union[str, List[str]], help: str,
+ flag_values: FlagValues = ..., **args: Any) -> None: ...
+
+def DEFINE_multi_int(name: str, default: Union[int, List[int]], help: str, lower_bound: int = ...,
+ upper_bound: int = ..., flag_values: FlagValues = ..., **args: Any) -> None: ...
+
+
+def DEFINE_multi_float(name: str, default: Union[float, List[float]], help: str,
+ lower_bound: float = ..., upper_bound: float = ...,
+ flag_values: FlagValues = ..., **args: Any) -> None: ...
diff --git a/mypy/test/__init__.py b/typeshed/third_party/2/google/__init__.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/third_party/2/google/__init__.pyi
diff --git a/typeshed/third_party/2/google/protobuf/__init__.pyi b/typeshed/third_party/2/google/protobuf/__init__.pyi
new file mode 100644
index 0000000..d232164
--- /dev/null
+++ b/typeshed/third_party/2/google/protobuf/__init__.pyi
@@ -0,0 +1 @@
+__version__ = ... # type: str
diff --git a/typeshed/third_party/2/google/protobuf/descriptor.pyi b/typeshed/third_party/2/google/protobuf/descriptor.pyi
new file mode 100644
index 0000000..7e9bc67
--- /dev/null
+++ b/typeshed/third_party/2/google/protobuf/descriptor.pyi
@@ -0,0 +1,165 @@
+# Stubs for google.protobuf.descriptor (Python 2.7)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+from .message import Message
+
+class Error(Exception): ...
+class TypeTransformationError(Error): ...
+
+class DescriptorMetaclass(type):
+ def __instancecheck__(cls, obj): ...
+
+class DescriptorBase:
+ __metaclass__ = ... # type: Any
+ has_options = ... # type: Any
+ def __init__(self, options, options_class_name) -> None: ...
+ def GetOptions(self): ...
+
+class _NestedDescriptorBase(DescriptorBase):
+ name = ... # type: Any
+ full_name = ... # type: Any
+ file = ... # type: Any
+ containing_type = ... # type: Any
+ def __init__(self, options, options_class_name, name, full_name, file, containing_type, serialized_start=..., serialized_end=...) -> None: ...
+ def GetTopLevelContainingType(self): ...
+ def CopyToProto(self, proto): ...
+
+class Descriptor(_NestedDescriptorBase):
+ def __new__(cls, name, full_name, filename, containing_type, fields, nested_types, enum_types, extensions, options=..., is_extendable=..., extension_ranges=..., oneofs=..., file=..., serialized_start=..., serialized_end=..., syntax=...): ...
+ fields = ... # type: Any
+ fields_by_number = ... # type: Any
+ fields_by_name = ... # type: Any
+ nested_types = ... # type: Any
+ nested_types_by_name = ... # type: Any
+ enum_types = ... # type: Any
+ enum_types_by_name = ... # type: Any
+ enum_values_by_name = ... # type: Any
+ extensions = ... # type: Any
+ extensions_by_name = ... # type: Any
+ is_extendable = ... # type: Any
+ extension_ranges = ... # type: Any
+ oneofs = ... # type: Any
+ oneofs_by_name = ... # type: Any
+ syntax = ... # type: Any
+ def __init__(self, name, full_name, filename, containing_type, fields, nested_types, enum_types, extensions, options=..., is_extendable=..., extension_ranges=..., oneofs=..., file=..., serialized_start=..., serialized_end=..., syntax=...) -> None: ...
+ def EnumValueName(self, enum, value): ...
+ def CopyToProto(self, proto): ...
+
+class FieldDescriptor(DescriptorBase):
+ TYPE_DOUBLE = ... # type: Any
+ TYPE_FLOAT = ... # type: Any
+ TYPE_INT64 = ... # type: Any
+ TYPE_UINT64 = ... # type: Any
+ TYPE_INT32 = ... # type: Any
+ TYPE_FIXED64 = ... # type: Any
+ TYPE_FIXED32 = ... # type: Any
+ TYPE_BOOL = ... # type: Any
+ TYPE_STRING = ... # type: Any
+ TYPE_GROUP = ... # type: Any
+ TYPE_MESSAGE = ... # type: Any
+ TYPE_BYTES = ... # type: Any
+ TYPE_UINT32 = ... # type: Any
+ TYPE_ENUM = ... # type: Any
+ TYPE_SFIXED32 = ... # type: Any
+ TYPE_SFIXED64 = ... # type: Any
+ TYPE_SINT32 = ... # type: Any
+ TYPE_SINT64 = ... # type: Any
+ MAX_TYPE = ... # type: Any
+ CPPTYPE_INT32 = ... # type: Any
+ CPPTYPE_INT64 = ... # type: Any
+ CPPTYPE_UINT32 = ... # type: Any
+ CPPTYPE_UINT64 = ... # type: Any
+ CPPTYPE_DOUBLE = ... # type: Any
+ CPPTYPE_FLOAT = ... # type: Any
+ CPPTYPE_BOOL = ... # type: Any
+ CPPTYPE_ENUM = ... # type: Any
+ CPPTYPE_STRING = ... # type: Any
+ CPPTYPE_MESSAGE = ... # type: Any
+ MAX_CPPTYPE = ... # type: Any
+ LABEL_OPTIONAL = ... # type: Any
+ LABEL_REQUIRED = ... # type: Any
+ LABEL_REPEATED = ... # type: Any
+ MAX_LABEL = ... # type: Any
+ MAX_FIELD_NUMBER = ... # type: Any
+ FIRST_RESERVED_FIELD_NUMBER = ... # type: Any
+ LAST_RESERVED_FIELD_NUMBER = ... # type: Any
+ def __new__(cls, name, full_name, index, number, type, cpp_type, label, default_value, message_type, enum_type, containing_type, is_extension, extension_scope, options=..., has_default_value=..., containing_oneof=...): ...
+ name = ... # type: Any
+ full_name = ... # type: Any
+ index = ... # type: Any
+ number = ... # type: Any
+ type = ... # type: Any
+ cpp_type = ... # type: Any
+ label = ... # type: Any
+ has_default_value = ... # type: Any
+ default_value = ... # type: Any
+ containing_type = ... # type: Any
+ message_type = ... # type: Any
+ enum_type = ... # type: Any
+ is_extension = ... # type: Any
+ extension_scope = ... # type: Any
+ containing_oneof = ... # type: Any
+ def __init__(self, name, full_name, index, number, type, cpp_type, label, default_value, message_type, enum_type, containing_type, is_extension, extension_scope, options=..., has_default_value=..., containing_oneof=...) -> None: ...
+ @staticmethod
+ def ProtoTypeToCppProtoType(proto_type): ...
+
+class EnumDescriptor(_NestedDescriptorBase):
+ def __new__(cls, name, full_name, filename, values, containing_type=..., options=..., file=..., serialized_start=..., serialized_end=...): ...
+ values = ... # type: Any
+ values_by_name = ... # type: Any
+ values_by_number = ... # type: Any
+ def __init__(self, name, full_name, filename, values, containing_type=..., options=..., file=..., serialized_start=..., serialized_end=...) -> None: ...
+ def CopyToProto(self, proto): ...
+
+class EnumValueDescriptor(DescriptorBase):
+ def __new__(cls, name, index, number, type=..., options=...): ...
+ name = ... # type: Any
+ index = ... # type: Any
+ number = ... # type: Any
+ type = ... # type: Any
+ def __init__(self, name, index, number, type=..., options=...) -> None: ...
+
+class OneofDescriptor:
+ def __new__(cls, name, full_name, index, containing_type, fields): ...
+ name = ... # type: Any
+ full_name = ... # type: Any
+ index = ... # type: Any
+ containing_type = ... # type: Any
+ fields = ... # type: Any
+ def __init__(self, name, full_name, index, containing_type, fields) -> None: ...
+
+class ServiceDescriptor(_NestedDescriptorBase):
+ index = ... # type: Any
+ methods = ... # type: Any
+ def __init__(self, name, full_name, index, methods, options=..., file=..., serialized_start=..., serialized_end=...) -> None: ...
+ def FindMethodByName(self, name): ...
+ def CopyToProto(self, proto): ...
+
+class MethodDescriptor(DescriptorBase):
+ name = ... # type: Any
+ full_name = ... # type: Any
+ index = ... # type: Any
+ containing_service = ... # type: Any
+ input_type = ... # type: Any
+ output_type = ... # type: Any
+ def __init__(self, name, full_name, index, containing_service, input_type, output_type, options=...) -> None: ...
+
+class FileDescriptor(DescriptorBase):
+ def __new__(cls, name, package, options=..., serialized_pb=..., dependencies=..., syntax=...): ...
+ _options = ... # type: Any
+ message_types_by_name = ... # type: Any
+ name = ... # type: Any
+ package = ... # type: Any
+ syntax = ... # type: Any
+ serialized_pb = ... # type: Any
+ enum_types_by_name = ... # type: Any
+ extensions_by_name = ... # type: Any
+ dependencies = ... # type: Any
+ def __init__(self, name, package, options=..., serialized_pb=..., dependencies=..., syntax=...) -> None: ...
+ def CopyToProto(self, proto): ...
+
+def MakeDescriptor(desc_proto, package=..., build_file_if_cpp=..., syntax=...): ...
+def _ParseOptions(message: Message, string: str) -> Message: ...
diff --git a/typeshed/third_party/2/google/protobuf/descriptor_pb2.pyi b/typeshed/third_party/2/google/protobuf/descriptor_pb2.pyi
new file mode 100644
index 0000000..4ac2e4c
--- /dev/null
+++ b/typeshed/third_party/2/google/protobuf/descriptor_pb2.pyi
@@ -0,0 +1,2 @@
+class FileOptions(object): ...
+class FieldOptions(object): ...
diff --git a/typeshed/third_party/2/google/protobuf/descriptor_pool.pyi b/typeshed/third_party/2/google/protobuf/descriptor_pool.pyi
new file mode 100644
index 0000000..f22ea57
--- /dev/null
+++ b/typeshed/third_party/2/google/protobuf/descriptor_pool.pyi
@@ -0,0 +1,22 @@
+# Stubs for google.protobuf.descriptor_pool (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+class DescriptorPool:
+ def __new__(cls, descriptor_db: Optional[Any] = ...): ...
+ def __init__(self, descriptor_db: Optional[Any] = ...) -> None: ...
+ def Add(self, file_desc_proto): ...
+ def AddSerializedFile(self, serialized_file_desc_proto): ...
+ def AddDescriptor(self, desc): ...
+ def AddEnumDescriptor(self, enum_desc): ...
+ def AddFileDescriptor(self, file_desc): ...
+ def FindFileByName(self, file_name): ...
+ def FindFileContainingSymbol(self, symbol): ...
+ def FindMessageTypeByName(self, full_name): ...
+ def FindEnumTypeByName(self, full_name): ...
+ def FindFieldByName(self, full_name): ...
+ def FindExtensionByName(self, full_name): ...
+
+def Default(): ...
diff --git a/mypy/test/__init__.py b/typeshed/third_party/2/google/protobuf/internal/__init__.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/third_party/2/google/protobuf/internal/__init__.pyi
diff --git a/typeshed/third_party/2/google/protobuf/internal/decoder.pyi b/typeshed/third_party/2/google/protobuf/internal/decoder.pyi
new file mode 100644
index 0000000..e7737ee
--- /dev/null
+++ b/typeshed/third_party/2/google/protobuf/internal/decoder.pyi
@@ -0,0 +1,34 @@
+# Stubs for google.protobuf.internal.decoder (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+def ReadTag(buffer, pos): ...
+def EnumDecoder(field_number, is_repeated, is_packed, key, new_default): ...
+
+Int32Decoder = ... # type: Any
+Int64Decoder = ... # type: Any
+UInt32Decoder = ... # type: Any
+UInt64Decoder = ... # type: Any
+SInt32Decoder = ... # type: Any
+SInt64Decoder = ... # type: Any
+Fixed32Decoder = ... # type: Any
+Fixed64Decoder = ... # type: Any
+SFixed32Decoder = ... # type: Any
+SFixed64Decoder = ... # type: Any
+FloatDecoder = ... # type: Any
+DoubleDecoder = ... # type: Any
+BoolDecoder = ... # type: Any
+
+def StringDecoder(field_number, is_repeated, is_packed, key, new_default): ...
+def BytesDecoder(field_number, is_repeated, is_packed, key, new_default): ...
+def GroupDecoder(field_number, is_repeated, is_packed, key, new_default): ...
+def MessageDecoder(field_number, is_repeated, is_packed, key, new_default): ...
+
+MESSAGE_SET_ITEM_TAG = ... # type: Any
+
+def MessageSetItemDecoder(extensions_by_number): ...
+def MapDecoder(field_descriptor, new_default, is_message_map): ...
+
+SkipField = ... # type: Any
diff --git a/typeshed/third_party/2/google/protobuf/internal/encoder.pyi b/typeshed/third_party/2/google/protobuf/internal/encoder.pyi
new file mode 100644
index 0000000..c3ab6ff
--- /dev/null
+++ b/typeshed/third_party/2/google/protobuf/internal/encoder.pyi
@@ -0,0 +1,38 @@
+# Stubs for google.protobuf.internal.encoder (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+Int32Sizer = ... # type: Any
+UInt32Sizer = ... # type: Any
+SInt32Sizer = ... # type: Any
+Fixed32Sizer = ... # type: Any
+Fixed64Sizer = ... # type: Any
+BoolSizer = ... # type: Any
+
+def StringSizer(field_number, is_repeated, is_packed): ...
+def BytesSizer(field_number, is_repeated, is_packed): ...
+def GroupSizer(field_number, is_repeated, is_packed): ...
+def MessageSizer(field_number, is_repeated, is_packed): ...
+def MessageSetItemSizer(field_number): ...
+def MapSizer(field_descriptor): ...
+def TagBytes(field_number, wire_type): ...
+
+Int32Encoder = ... # type: Any
+UInt32Encoder = ... # type: Any
+SInt32Encoder = ... # type: Any
+Fixed32Encoder = ... # type: Any
+Fixed64Encoder = ... # type: Any
+SFixed32Encoder = ... # type: Any
+SFixed64Encoder = ... # type: Any
+FloatEncoder = ... # type: Any
+DoubleEncoder = ... # type: Any
+
+def BoolEncoder(field_number, is_repeated, is_packed): ...
+def StringEncoder(field_number, is_repeated, is_packed): ...
+def BytesEncoder(field_number, is_repeated, is_packed): ...
+def GroupEncoder(field_number, is_repeated, is_packed): ...
+def MessageEncoder(field_number, is_repeated, is_packed): ...
+def MessageSetItemEncoder(field_number): ...
+def MapEncoder(field_descriptor): ...
diff --git a/typeshed/third_party/2/google/protobuf/internal/enum_type_wrapper.pyi b/typeshed/third_party/2/google/protobuf/internal/enum_type_wrapper.pyi
new file mode 100644
index 0000000..ced66b8
--- /dev/null
+++ b/typeshed/third_party/2/google/protobuf/internal/enum_type_wrapper.pyi
@@ -0,0 +1,11 @@
+from typing import Any, List, Tuple
+
+class EnumTypeWrapper(object):
+ def __init__(self, enum_type: Any) -> None: ...
+ def Name(self, number: int) -> str: ...
+ def Value(self, name: str) -> int: ...
+ def keys(self) -> List[str]: ...
+ def values(self) -> List[int]: ...
+
+ @classmethod
+ def items(cls) -> List[Tuple[str, int]]: ...
diff --git a/typeshed/third_party/2/google/protobuf/internal/wire_format.pyi b/typeshed/third_party/2/google/protobuf/internal/wire_format.pyi
new file mode 100644
index 0000000..19b7c3f
--- /dev/null
+++ b/typeshed/third_party/2/google/protobuf/internal/wire_format.pyi
@@ -0,0 +1,54 @@
+# Stubs for google.protobuf.internal.wire_format (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+TAG_TYPE_BITS = ... # type: Any
+TAG_TYPE_MASK = ... # type: Any
+WIRETYPE_VARINT = ... # type: Any
+WIRETYPE_FIXED64 = ... # type: Any
+WIRETYPE_LENGTH_DELIMITED = ... # type: Any
+WIRETYPE_START_GROUP = ... # type: Any
+WIRETYPE_END_GROUP = ... # type: Any
+WIRETYPE_FIXED32 = ... # type: Any
+INT32_MAX = ... # type: Any
+INT32_MIN = ... # type: Any
+UINT32_MAX = ... # type: Any
+INT64_MAX = ... # type: Any
+INT64_MIN = ... # type: Any
+UINT64_MAX = ... # type: Any
+FORMAT_UINT32_LITTLE_ENDIAN = ... # type: Any
+FORMAT_UINT64_LITTLE_ENDIAN = ... # type: Any
+FORMAT_FLOAT_LITTLE_ENDIAN = ... # type: Any
+FORMAT_DOUBLE_LITTLE_ENDIAN = ... # type: Any
+
+def PackTag(field_number, wire_type): ...
+def UnpackTag(tag): ...
+def ZigZagEncode(value): ...
+def ZigZagDecode(value): ...
+def Int32ByteSize(field_number, int32): ...
+def Int32ByteSizeNoTag(int32): ...
+def Int64ByteSize(field_number, int64): ...
+def UInt32ByteSize(field_number, uint32): ...
+def UInt64ByteSize(field_number, uint64): ...
+def SInt32ByteSize(field_number, int32): ...
+def SInt64ByteSize(field_number, int64): ...
+def Fixed32ByteSize(field_number, fixed32): ...
+def Fixed64ByteSize(field_number, fixed64): ...
+def SFixed32ByteSize(field_number, sfixed32): ...
+def SFixed64ByteSize(field_number, sfixed64): ...
+def FloatByteSize(field_number, flt): ...
+def DoubleByteSize(field_number, double): ...
+def BoolByteSize(field_number, b): ...
+def EnumByteSize(field_number, enum): ...
+def StringByteSize(field_number, string): ...
+def BytesByteSize(field_number, b): ...
+def GroupByteSize(field_number, message): ...
+def MessageByteSize(field_number, message): ...
+def MessageSetItemByteSize(field_number, msg): ...
+def TagByteSize(field_number): ...
+
+NON_PACKABLE_TYPES = ... # type: Any
+
+def IsTypePackable(field_type): ...
diff --git a/typeshed/third_party/2/google/protobuf/message.pyi b/typeshed/third_party/2/google/protobuf/message.pyi
new file mode 100644
index 0000000..09c7716
--- /dev/null
+++ b/typeshed/third_party/2/google/protobuf/message.pyi
@@ -0,0 +1,36 @@
+# Stubs for google.protobuf.message (Python 2.7)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Sequence, Optional, Tuple
+
+from .descriptor import FieldDescriptor
+
+class Error(Exception): ...
+class DecodeError(Error): ...
+class EncodeError(Error): ...
+
+class Message:
+ DESCRIPTOR = ... # type: Any
+ def __deepcopy__(self, memo=...): ...
+ def __eq__(self, other_msg): ...
+ def __ne__(self, other_msg): ...
+ def MergeFrom(self, other_msg: Message) -> None: ...
+ def CopyFrom(self, other_msg: Message) -> None: ...
+ def Clear(self) -> None: ...
+ def SetInParent(self) -> None: ...
+ def IsInitialized(self) -> bool: ...
+ def MergeFromString(self, serialized: Any) -> int: ... # TODO: we need to be able to call buffer() on serialized
+ def ParseFromString(self, serialized: Any) -> None: ...
+ def SerializeToString(self) -> str: ...
+ def SerializePartialToString(self) -> str: ...
+ def ListFields(self) -> Sequence[Tuple[FieldDescriptor, Any]]: ...
+ def HasField(self, field_name: str) -> bool: ...
+ def ClearField(self, field_name: str) -> None: ...
+ def WhichOneof(self, oneof_group) -> Optional[str]: ...
+ def HasExtension(self, extension_handle): ...
+ def ClearExtension(self, extension_handle): ...
+ def ByteSize(self) -> int: ...
+
+ # TODO: check kwargs
+ def __init__(self, **kwargs) -> None: ...
diff --git a/typeshed/third_party/2/google/protobuf/message_factory.pyi b/typeshed/third_party/2/google/protobuf/message_factory.pyi
new file mode 100644
index 0000000..a76333d
--- /dev/null
+++ b/typeshed/third_party/2/google/protobuf/message_factory.pyi
@@ -0,0 +1,17 @@
+# Stubs for google.protobuf.message_factory (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Dict, Iterable, Optional, Type
+
+from .message import Message
+from .descriptor import Descriptor
+from .descriptor_pool import DescriptorPool
+
+class MessageFactory:
+ pool = ... # type: Any
+ def __init__(self, pool: DescriptorPool=None) -> None: ...
+ def GetPrototype(self, descriptor: Descriptor) -> Type[Message]: ...
+ def GetMessages(self, files: Iterable[str]) -> Dict[str, Type[Message]]: ...
+
+def GetMessages(file_protos: Iterable[str]) -> Dict[str, Type[Message]]: ...
diff --git a/typeshed/third_party/2/google/protobuf/reflection.pyi b/typeshed/third_party/2/google/protobuf/reflection.pyi
new file mode 100644
index 0000000..3d3e76b
--- /dev/null
+++ b/typeshed/third_party/2/google/protobuf/reflection.pyi
@@ -0,0 +1,10 @@
+# Stubs for google.protobuf.reflection (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+class GeneratedProtocolMessageType(type):
+ def __new__(cls, name, bases, dictionary): ...
+ def __init__(cls, name, bases, dictionary) -> None: ...
+
+def ParseMessage(descriptor, byte_str): ...
+def MakeClass(descriptor): ...
diff --git a/typeshed/third_party/2/google/protobuf/symbol_database.pyi b/typeshed/third_party/2/google/protobuf/symbol_database.pyi
new file mode 100644
index 0000000..e29070c
--- /dev/null
+++ b/typeshed/third_party/2/google/protobuf/symbol_database.pyi
@@ -0,0 +1,18 @@
+# Stubs for google.protobuf.symbol_database
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Dict, Iterable, Type
+
+from .descriptor import EnumDescriptor, FileDescriptor
+from .message import Message
+from .message_factory import MessageFactory
+
+class SymbolDatabase(MessageFactory):
+ def RegisterMessage(self, message: Type[Message]) -> Type[Message]: ...
+ def RegisterEnumDescriptor(self, enum_descriptor: Type[EnumDescriptor]) -> EnumDescriptor: ...
+ def RegisterFileDescriptor(self, file_descriptor: Type[FileDescriptor]) -> FileDescriptor: ...
+ def GetSymbol(self, symbol: str) -> Type[Message]: ...
+ def GetMessages(self, files: Iterable[str]) -> Dict[str, Type[Message]]: ...
+
+def Default(): ...
diff --git a/typeshed/third_party/2/itsdangerous.pyi b/typeshed/third_party/2/itsdangerous.pyi
new file mode 100644
index 0000000..0efb3d6
--- /dev/null
+++ b/typeshed/third_party/2/itsdangerous.pyi
@@ -0,0 +1,153 @@
+# Stubs for itsdangerous (Python 2.7)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from datetime import datetime
+from itertools import izip
+from typing import Any, Callable, IO, MutableMapping, Optional, Text, Tuple, Union
+
+PY2 = ... # type: bool
+text_type = unicode
+int_to_byte = chr
+number_types = (int, long, float)
+
+bytes_like = Union[bytearray, str]
+
+class _CompactJSON:
+ def loads(self, payload: Text) -> Any: ...
+ def dumps(self, obj: Any) -> Text: ...
+
+compact_json = _CompactJSON
+EPOCH = ... # type: int
+
+def want_bytes(s: str, encoding='', errors='') -> str: ...
+def is_text_serializer(serializer: Any) -> bool: ...
+def constant_time_compare(val1: bytes_like, val2: bytes_like) -> bool: ...
+
+class BadData(Exception):
+ message = ... # type: str
+ def __init__(self, message: str) -> None: ...
+
+class BadPayload(BadData):
+ original_error = ... # type: Optional[Exception]
+ def __init__(self, message: str, original_error: Optional[Exception]=None) -> None: ...
+
+class BadSignature(BadData):
+ payload = ... # type: Optional[Any]
+ def __init__(self, message: str, payload: Optional[Any]=None) -> None: ...
+
+class BadTimeSignature(BadSignature):
+ date_signed = ... # type: Optional[int]
+ def __init__(self, message, payload: Optional[Any]=None, date_signed: Optional[int]=None) -> None: ...
+
+class BadHeader(BadSignature):
+ header = ... # type: Any
+ original_error = ... # type: Any
+ def __init__(self, message, payload=None, header=None, original_error=None) -> None: ...
+
+class SignatureExpired(BadTimeSignature): ...
+
+def base64_encode(string: bytes_like) -> str: ...
+def base64_decode(string: bytes_like) -> str: ...
+def int_to_bytes(num: int) -> str: ...
+def bytes_to_int(bytestr: bytes_like) -> int: ...
+
+class SigningAlgorithm:
+ def get_signature(self, key: bytes_like, value: bytes_like) -> str: ...
+ def verify_signature(self, key: bytes_like, value: bytes_like, sig: bytes_like) -> bool: ...
+
+class NoneAlgorithm(SigningAlgorithm):
+ def get_signature(self, key: bytes_like, value: bytes_like) -> str: ...
+
+class HMACAlgorithm(SigningAlgorithm):
+ default_digest_method = ... # type: Callable
+ digest_method = ... # type: Callable
+ def __init__(self, digest_method: Optional[Callable]=None) -> None: ...
+ def get_signature(self, key: bytes_like, value: bytes_like) -> str: ...
+
+class Signer:
+ default_digest_method = ... # type: Callable
+ default_key_derivation = ... # type: str
+ secret_key = ... # type: bytes_like
+ sep = ... # type: str
+ salt = ... # type: bytes_like
+ key_derivation = ... # type: str
+ digest_method = ... # type: Callable
+ algorithm = ... # type: SigningAlgorithm
+ def __init__(self, secret_key: bytes_like, salt: Optional[bytes_like]=None, sep: Optional[str]='',
+ key_derivation: Optional[str]=None,
+ digest_method: Optional[Callable]=None,
+ algorithm: Optional[SigningAlgorithm]=None) -> None: ...
+ def derive_key(self) -> str: ...
+ def get_signature(self, value: bytes_like) -> str: ...
+ def sign(self, value: bytes_like) -> str: ...
+ def verify_signature(self, value: bytes_like, sig: bytes_like) -> bool: ...
+ def unsign(self, signed_value: str) -> str: ...
+ def validate(self, signed_value: str) -> bool: ...
+
+class TimestampSigner(Signer):
+ def get_timestamp(self) -> int: ...
+ def timestamp_to_datetime(self, ts: int) -> datetime: ...
+ def sign(self, value: bytes_like) -> str: ...
+ def unsign(self, value: str, max_age: Optional[int]=None, return_timestamp=False) -> Any: ...
+ def validate(self, signed_value: str, max_age: Optional[int]=None) -> bool: ...
+
+class Serializer:
+ default_serializer = ... # type: Any
+ default_signer = ... # type: Callable[..., Signer]
+ secret_key = ... # type: Any
+ salt = ... # type: bytes_like
+ serializer = ... # type: Any
+ is_text_serializer = ... # type: bool
+ signer = ... # type: Signer
+ signer_kwargs = ... # type: MutableMapping
+ def __init__(self, secret_key: bytes_like, salt: Optional[bytes_like]=b'', serializer=None, signer: Optional[Callable[..., Signer]]=None, signer_kwargs: Optional[MutableMapping]=None) -> None: ...
+ def load_payload(self, payload: Any, serializer=None) -> Any: ...
+ def dump_payload(self, *args, **kwargs) -> str: ...
+ def make_signer(self, salt: Optional[bytes_like]=None) -> Signer: ...
+ def dumps(self, obj: Any, salt: Optional[bytes_like]=None) -> str: ...
+ def dump(self, obj: Any, f: IO[str], salt: Optional[bytes_like]=None) -> None: ...
+ def loads(self, s: str, salt: Optional[bytes_like]=None) -> Any: ...
+ def load(self, f: IO[str], salt: Optional[bytes_like]=None): ...
+ def loads_unsafe(self, s, salt: Optional[bytes_like]=None) -> Tuple[bool, Any]: ...
+ def load_unsafe(self, f: IO[str], *args, **kwargs) -> Tuple[bool, Any]: ...
+
+class TimedSerializer(Serializer):
+ default_signer = ... # type: Callable[..., TimestampSigner]
+ def loads(self, s: str, salt: Optional[bytes_like]=None, max_age: Optional[int]=None, return_timestamp=False) -> Any: ...
+ def loads_unsafe(self, s: str, salt: Optional[bytes_like]=None, max_age: Optional[int]=None) -> Tuple[bool, Any]: ...
+
+class JSONWebSignatureSerializer(Serializer):
+ jws_algorithms = ... # type: MutableMapping[str, SigningAlgorithm]
+ default_algorithm = ... # type: str
+ default_serializer = ... # type: Any
+ algorithm_name = ... # type: str
+ algorithm = ... # type: Any
+ def __init__(self, secret_key: bytes_like, salt: Optional[bytes_like]=None, serializer=None, signer: Optional[Callable[..., Signer]]=None, signer_kwargs: Optional[MutableMapping]=None, algorithm_name: Optional[str]=None) -> None: ...
+ def load_payload(self, payload: Any, return_header=False) -> Any: ...
+ def dump_payload(self, *args, **kwargs) -> str: ...
+ def make_algorithm(self, algorithm_name: str) -> SigningAlgorithm: ...
+ def make_signer(self, salt: Optional[bytes_like]=None, algorithm_name: Optional[str]=None) -> Signer: ...
+ def make_header(self, header_fields=Optional[MutableMapping]) -> MutableMapping: ...
+ def dumps(self, obj: Any, salt: Optional[bytes_like]=None, header_fields=Optional[MutableMapping]) -> str: ...
+ def loads(self, s: str, salt: Optional[bytes_like]=None, return_header=False) -> Any: ...
+ def loads_unsafe(self, s, salt: Optional[bytes_like]=None, return_header=False) -> Tuple[bool, Any]: ...
+
+class TimedJSONWebSignatureSerializer(JSONWebSignatureSerializer):
+ DEFAULT_EXPIRES_IN = ... # type: int
+ expires_in = ... # type: int
+ def __init__(self, secret_key: bytes_like, expires_in: Optional[int]=None, **kwargs) -> None: ...
+ def make_header(self, header_fields=Optional[MutableMapping]) -> MutableMapping: ...
+ def loads(self, s: str, salt: Optional[bytes_like]=None, return_header=False) -> Any: ...
+ def get_issue_date(self, header: MutableMapping) -> Optional[datetime]: ...
+ def now(self) -> int: ...
+
+class URLSafeSerializerMixin:
+ def load_payload(self, payload: Any, serializer=None, return_header=False, **kwargs) -> Any: ... # FIXME: This is invalid but works around https://github.com/pallets/itsdangerous/issues/74
+ def dump_payload(self, *args, **kwargs) -> str: ...
+
+class URLSafeSerializer(URLSafeSerializerMixin, Serializer):
+ default_serializer = ... # type: Any
+
+class URLSafeTimedSerializer(URLSafeSerializerMixin, TimedSerializer):
+ default_serializer = ... # type: Any
diff --git a/typeshed/third_party/2/kazoo/__init__.pyi b/typeshed/third_party/2/kazoo/__init__.pyi
new file mode 100644
index 0000000..1aae9a5
--- /dev/null
+++ b/typeshed/third_party/2/kazoo/__init__.pyi
@@ -0,0 +1,3 @@
+# Stubs for kazoo (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
diff --git a/typeshed/third_party/2/kazoo/client.pyi b/typeshed/third_party/2/kazoo/client.pyi
new file mode 100644
index 0000000..8db0eda
--- /dev/null
+++ b/typeshed/third_party/2/kazoo/client.pyi
@@ -0,0 +1,100 @@
+# Stubs for kazoo.client (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+string_types = ... # type: Any
+bytes_types = ... # type: Any
+LOST_STATES = ... # type: Any
+ENVI_VERSION = ... # type: Any
+ENVI_VERSION_KEY = ... # type: Any
+log = ... # type: Any
+
+class KazooClient:
+ logger = ... # type: Any
+ handler = ... # type: Any
+ auth_data = ... # type: Any
+ default_acl = ... # type: Any
+ randomize_hosts = ... # type: Any
+ hosts = ... # type: Any
+ chroot = ... # type: Any
+ state = ... # type: Any
+ state_listeners = ... # type: Any
+ read_only = ... # type: Any
+ retry = ... # type: Any
+ Barrier = ... # type: Any
+ Counter = ... # type: Any
+ DoubleBarrier = ... # type: Any
+ ChildrenWatch = ... # type: Any
+ DataWatch = ... # type: Any
+ Election = ... # type: Any
+ NonBlockingLease = ... # type: Any
+ MultiNonBlockingLease = ... # type: Any
+ Lock = ... # type: Any
+ Party = ... # type: Any
+ Queue = ... # type: Any
+ LockingQueue = ... # type: Any
+ SetPartitioner = ... # type: Any
+ Semaphore = ... # type: Any
+ ShallowParty = ... # type: Any
+ def __init__(self, hosts=..., timeout=..., client_id=..., handler=..., default_acl=..., auth_data=..., read_only=..., randomize_hosts=..., connection_retry=..., command_retry=..., logger=..., **kwargs) -> None: ...
+ @property
+ def client_state(self): ...
+ @property
+ def client_id(self): ...
+ @property
+ def connected(self): ...
+ def set_hosts(self, hosts, randomize_hosts=...): ...
+ def add_listener(self, listener): ...
+ def remove_listener(self, listener): ...
+ def start(self, timeout=...): ...
+ def start_async(self): ...
+ def stop(self): ...
+ def restart(self): ...
+ def close(self): ...
+ def command(self, cmd=...): ...
+ def server_version(self, retries=...): ...
+ def add_auth(self, scheme, credential): ...
+ def add_auth_async(self, scheme, credential): ...
+ def unchroot(self, path): ...
+ def sync_async(self, path): ...
+ def sync(self, path): ...
+ def create(self, path, value=..., acl=..., ephemeral=..., sequence=..., makepath=...): ...
+ def create_async(self, path, value=..., acl=..., ephemeral=..., sequence=..., makepath=...): ...
+ def ensure_path(self, path, acl=...): ...
+ def ensure_path_async(self, path, acl=...): ...
+ def exists(self, path, watch=...): ...
+ def exists_async(self, path, watch=...): ...
+ def get(self, path, watch=...): ...
+ def get_async(self, path, watch=...): ...
+ def get_children(self, path, watch=..., include_data=...): ...
+ def get_children_async(self, path, watch=..., include_data=...): ...
+ def get_acls(self, path): ...
+ def get_acls_async(self, path): ...
+ def set_acls(self, path, acls, version=...): ...
+ def set_acls_async(self, path, acls, version=...): ...
+ def set(self, path, value, version=...): ...
+ def set_async(self, path, value, version=...): ...
+ def transaction(self): ...
+ def delete(self, path, version=..., recursive=...): ...
+ def delete_async(self, path, version=...): ...
+ def reconfig(self, joining, leaving, new_members, from_config=...): ...
+ def reconfig_async(self, joining, leaving, new_members, from_config): ...
+
+class TransactionRequest:
+ client = ... # type: Any
+ operations = ... # type: Any
+ committed = ... # type: Any
+ def __init__(self, client) -> None: ...
+ def create(self, path, value=..., acl=..., ephemeral=..., sequence=...): ...
+ def delete(self, path, version=...): ...
+ def set_data(self, path, value, version=...): ...
+ def check(self, path, version): ...
+ def commit_async(self): ...
+ def commit(self): ...
+ def __enter__(self): ...
+ def __exit__(self, exc_type, exc_value, exc_tb): ...
+
+class KazooState:
+ ...
diff --git a/typeshed/third_party/2/kazoo/exceptions.pyi b/typeshed/third_party/2/kazoo/exceptions.pyi
new file mode 100644
index 0000000..ed632ba
--- /dev/null
+++ b/typeshed/third_party/2/kazoo/exceptions.pyi
@@ -0,0 +1,62 @@
+# Stubs for kazoo.exceptions (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class KazooException(Exception): ...
+class ZookeeperError(KazooException): ...
+class CancelledError(KazooException): ...
+class ConfigurationError(KazooException): ...
+class ZookeeperStoppedError(KazooException): ...
+class ConnectionDropped(KazooException): ...
+class LockTimeout(KazooException): ...
+class WriterNotClosedException(KazooException): ...
+
+EXCEPTIONS = ... # type: Any
+
+class RolledBackError(ZookeeperError): ...
+class SystemZookeeperError(ZookeeperError): ...
+class RuntimeInconsistency(ZookeeperError): ...
+class DataInconsistency(ZookeeperError): ...
+class ConnectionLoss(ZookeeperError): ...
+class MarshallingError(ZookeeperError): ...
+class UnimplementedError(ZookeeperError): ...
+class OperationTimeoutError(ZookeeperError): ...
+class BadArgumentsError(ZookeeperError): ...
+class NewConfigNoQuorumError(ZookeeperError): ...
+class ReconfigInProcessError(ZookeeperError): ...
+class APIError(ZookeeperError): ...
+class NoNodeError(ZookeeperError): ...
+class NoAuthError(ZookeeperError): ...
+class BadVersionError(ZookeeperError): ...
+class NoChildrenForEphemeralsError(ZookeeperError): ...
+class NodeExistsError(ZookeeperError): ...
+class NotEmptyError(ZookeeperError): ...
+class SessionExpiredError(ZookeeperError): ...
+class InvalidCallbackError(ZookeeperError): ...
+class InvalidACLError(ZookeeperError): ...
+class AuthFailedError(ZookeeperError): ...
+class SessionMovedError(ZookeeperError): ...
+class NotReadOnlyCallError(ZookeeperError): ...
+class ConnectionClosedError(SessionExpiredError): ...
+
+ConnectionLossException = ... # type: Any
+MarshallingErrorException = ... # type: Any
+SystemErrorException = ... # type: Any
+RuntimeInconsistencyException = ... # type: Any
+DataInconsistencyException = ... # type: Any
+UnimplementedException = ... # type: Any
+OperationTimeoutException = ... # type: Any
+BadArgumentsException = ... # type: Any
+ApiErrorException = ... # type: Any
+NoNodeException = ... # type: Any
+NoAuthException = ... # type: Any
+BadVersionException = ... # type: Any
+NoChildrenForEphemeralsException = ... # type: Any
+NodeExistsException = ... # type: Any
+InvalidACLException = ... # type: Any
+AuthFailedException = ... # type: Any
+NotEmptyException = ... # type: Any
+SessionExpiredException = ... # type: Any
+InvalidCallbackException = ... # type: Any
diff --git a/typeshed/third_party/2/kazoo/recipe/__init__.pyi b/typeshed/third_party/2/kazoo/recipe/__init__.pyi
new file mode 100644
index 0000000..44bc4cb
--- /dev/null
+++ b/typeshed/third_party/2/kazoo/recipe/__init__.pyi
@@ -0,0 +1,3 @@
+# Stubs for kazoo.recipe (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
diff --git a/typeshed/third_party/2/kazoo/recipe/watchers.pyi b/typeshed/third_party/2/kazoo/recipe/watchers.pyi
new file mode 100644
index 0000000..f942163
--- /dev/null
+++ b/typeshed/third_party/2/kazoo/recipe/watchers.pyi
@@ -0,0 +1,25 @@
+# Stubs for kazoo.recipe.watchers (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+log = ... # type: Any
+
+class DataWatch:
+ def __init__(self, client, path, func=..., *args, **kwargs) -> None: ...
+ def __call__(self, func): ...
+
+class ChildrenWatch:
+ def __init__(self, client, path, func=..., allow_session_lost=..., send_event=...) -> None: ...
+ def __call__(self, func): ...
+
+class PatientChildrenWatch:
+ client = ... # type: Any
+ path = ... # type: Any
+ children = ... # type: Any
+ time_boundary = ... # type: Any
+ children_changed = ... # type: Any
+ def __init__(self, client, path, time_boundary=...) -> None: ...
+ asy = ... # type: Any
+ def start(self): ...
diff --git a/typeshed/third_party/2/pycurl.pyi b/typeshed/third_party/2/pycurl.pyi
new file mode 100644
index 0000000..85f2b13
--- /dev/null
+++ b/typeshed/third_party/2/pycurl.pyi
@@ -0,0 +1,378 @@
+# TODO(MichalPokorny): more precise types
+
+from typing import Any, Tuple, Optional
+
+GLOBAL_SSL = ... # type: int
+GLOBAL_WIN32 = ... # type: int
+GLOBAL_ALL = ... # type: int
+GLOBAL_NOTHING = ... # type: int
+GLOBAL_DEFAULT = ... # type: int
+
+def global_init(option: int) -> None: ...
+def global_cleanup() -> None: ...
+
+version = ... # type: str
+
+def version_info() -> Tuple[int, str, int, str, int, str,
+ int, str, tuple, Any, int, Any]: ...
+
+class error(Exception):
+ pass
+
+class Curl(object):
+ def close(self) -> None: ...
+ def setopt(self, option: int, value: Any) -> None: ...
+ def perform(self) -> None: ...
+ def getinfo(self, info: Any) -> Any: ...
+ def reset(self) -> None: ...
+ def unsetopt(self, option: int) -> Any: ...
+ def pause(self, bitmask: Any) -> Any: ...
+ def errstr(self) -> str: ...
+
+ # TODO(MichalPokorny): wat?
+ USERPWD = ... # type: int
+
+class CurlMulti(object):
+ def close(self) -> None: ...
+ def add_handle(self, obj: Curl) -> None: ...
+ def remove_handle(self, obj: Curl) -> None: ...
+ def perform(self) -> Tuple[Any, int]: ...
+ def fdset(self) -> tuple: ...
+ def select(self, timeout: float = ...) -> int: ...
+ def info_read(self, max_objects: int) -> tuple: ...
+
+class CurlShare(object):
+ def close(self) -> None: ...
+ def setopt(self, option: int, value: Any) -> Any: ...
+
+ADDRESS_SCOPE = ... # type: int
+APPCONNECT_TIME = ... # type: int
+AUTOREFERER = ... # type: int
+BUFFERSIZE = ... # type: int
+CAINFO = ... # type: int
+CAPATH = ... # type: int
+COMPILE_LIBCURL_VERSION_NUM = ... # type: int
+COMPILE_PY_VERSION_HEX = ... # type: int
+CONNECTTIMEOUT = ... # type: int
+CONNECTTIMEOUT_MS = ... # type: int
+CONNECT_ONLY = ... # type: int
+CONNECT_TIME = ... # type: int
+CONTENT_LENGTH_DOWNLOAD = ... # type: int
+CONTENT_LENGTH_UPLOAD = ... # type: int
+CONTENT_TYPE = ... # type: int
+COOKIE = ... # type: int
+COOKIEFILE = ... # type: int
+COOKIEJAR = ... # type: int
+COOKIELIST = ... # type: int
+COPYPOSTFIELDS = ... # type: int
+CRLF = ... # type: int
+CRLFILE = ... # type: int
+CSELECT_ERR = ... # type: int
+CSELECT_IN = ... # type: int
+CSELECT_OUT = ... # type: int
+CURL_HTTP_VERSION_1_0 = ... # type: int
+CURL_HTTP_VERSION_1_1 = ... # type: int
+CURL_HTTP_VERSION_LAST = ... # type: int
+CURL_HTTP_VERSION_NONE = ... # type: int
+CUSTOMREQUEST = ... # type: int
+DEBUGFUNCTION = ... # type: int
+DNS_CACHE_TIMEOUT = ... # type: int
+DNS_USE_GLOBAL_CACHE = ... # type: int
+EFFECTIVE_URL = ... # type: int
+EGDSOCKET = ... # type: int
+ENCODING = ... # type: int
+FAILONERROR = ... # type: int
+FILE = ... # type: int
+FOLLOWLOCATION = ... # type: int
+FORBID_REUSE = ... # type: int
+FORM_CONTENTS = ... # type: int
+FORM_CONTENTTYPE = ... # type: int
+FORM_FILE = ... # type: int
+FORM_FILENAME = ... # type: int
+FRESH_CONNECT = ... # type: int
+FTPAPPEND = ... # type: int
+FTPAUTH_DEFAULT = ... # type: int
+FTPAUTH_SSL = ... # type: int
+FTPAUTH_TLS = ... # type: int
+FTPLISTONLY = ... # type: int
+FTPMETHOD_DEFAULT = ... # type: int
+FTPMETHOD_MULTICWD = ... # type: int
+FTPMETHOD_NOCWD = ... # type: int
+FTPMETHOD_SINGLECWD = ... # type: int
+FTPPORT = ... # type: int
+FTPSSLAUTH = ... # type: int
+FTPSSL_ALL = ... # type: int
+FTPSSL_CONTROL = ... # type: int
+FTPSSL_NONE = ... # type: int
+FTPSSL_TRY = ... # type: int
+FTP_ACCOUNT = ... # type: int
+FTP_ALTERNATIVE_TO_USER = ... # type: int
+FTP_CREATE_MISSING_DIRS = ... # type: int
+FTP_ENTRY_PATH = ... # type: int
+FTP_FILEMETHOD = ... # type: int
+FTP_RESPONSE_TIMEOUT = ... # type: int
+FTP_SKIP_PASV_IP = ... # type: int
+FTP_SSL = ... # type: int
+FTP_SSL_CCC = ... # type: int
+FTP_USE_EPRT = ... # type: int
+FTP_USE_EPSV = ... # type: int
+HEADER = ... # type: int
+HEADERFUNCTION = ... # type: int
+HEADER_SIZE = ... # type: int
+HTTP200ALIASES = ... # type: int
+HTTPAUTH = ... # type: int
+HTTPAUTH_ANY = ... # type: int
+HTTPAUTH_ANYSAFE = ... # type: int
+HTTPAUTH_AVAIL = ... # type: int
+HTTPAUTH_BASIC = ... # type: int
+HTTPAUTH_DIGEST = ... # type: int
+HTTPAUTH_GSSNEGOTIATE = ... # type: int
+HTTPAUTH_NONE = ... # type: int
+HTTPAUTH_NTLM = ... # type: int
+HTTPGET = ... # type: int
+HTTPHEADER = ... # type: int
+HTTPPOST = ... # type: int
+HTTPPROXYTUNNEL = ... # type: int
+HTTP_CODE = ... # type: int
+HTTP_CONNECTCODE = ... # type: int
+HTTP_CONTENT_DECODING = ... # type: int
+HTTP_TRANSFER_DECODING = ... # type: int
+HTTP_VERSION = ... # type: int
+IGNORE_CONTENT_LENGTH = ... # type: int
+INFILE = ... # type: int
+INFILESIZE = ... # type: int
+INFILESIZE_LARGE = ... # type: int
+INFOTYPE_DATA_IN = ... # type: int
+INFOTYPE_DATA_OUT = ... # type: int
+INFOTYPE_HEADER_IN = ... # type: int
+INFOTYPE_HEADER_OUT = ... # type: int
+INFOTYPE_SSL_DATA_IN = ... # type: int
+INFOTYPE_SSL_DATA_OUT = ... # type: int
+INFOTYPE_TEXT = ... # type: int
+INFO_COOKIELIST = ... # type: int
+INFO_FILETIME = ... # type: int
+INTERFACE = ... # type: int
+IOCMD_NOP = ... # type: int
+IOCMD_RESTARTREAD = ... # type: int
+IOCTLDATA = ... # type: int
+IOCTLFUNCTION = ... # type: int
+IOE_FAILRESTART = ... # type: int
+IOE_OK = ... # type: int
+IOE_UNKNOWNCMD = ... # type: int
+IPRESOLVE = ... # type: int
+IPRESOLVE_V4 = ... # type: int
+IPRESOLVE_V6 = ... # type: int
+IPRESOLVE_WHATEVER = ... # type: int
+ISSUERCERT = ... # type: int
+KRB4LEVEL = ... # type: int
+LASTSOCKET = ... # type: int
+LOCALPORT = ... # type: int
+LOCALPORTRANGE = ... # type: int
+LOCK_DATA_COOKIE = ... # type: int
+LOCK_DATA_DNS = ... # type: int
+LOW_SPEED_LIMIT = ... # type: int
+LOW_SPEED_TIME = ... # type: int
+MAXCONNECTS = ... # type: int
+MAXFILESIZE = ... # type: int
+MAXFILESIZE_LARGE = ... # type: int
+MAXREDIRS = ... # type: int
+MAX_RECV_SPEED_LARGE = ... # type: int
+MAX_SEND_SPEED_LARGE = ... # type: int
+NAMELOOKUP_TIME = ... # type: int
+NETRC = ... # type: int
+NETRC_FILE = ... # type: int
+NETRC_IGNORED = ... # type: int
+NETRC_OPTIONAL = ... # type: int
+NETRC_REQUIRED = ... # type: int
+NEW_DIRECTORY_PERMS = ... # type: int
+NEW_FILE_PERMS = ... # type: int
+NOBODY = ... # type: int
+NOPROGRESS = ... # type: int
+NOSIGNAL = ... # type: int
+NUM_CONNECTS = ... # type: int
+OPENSOCKETFUNCTION = ... # type: int
+OPT_FILETIME = ... # type: int
+OS_ERRNO = ... # type: int
+POLL_IN = ... # type: int
+POLL_INOUT = ... # type: int
+POLL_NONE = ... # type: int
+POLL_OUT = ... # type: int
+POLL_REMOVE = ... # type: int
+PORT = ... # type: int
+POST = ... # type: int
+POST301 = ... # type: int
+POSTFIELDS = ... # type: int
+POSTFIELDSIZE = ... # type: int
+POSTFIELDSIZE_LARGE = ... # type: int
+POSTQUOTE = ... # type: int
+PREQUOTE = ... # type: int
+PRETRANSFER_TIME = ... # type: int
+PRIMARY_IP = ... # type: int
+PROGRESSFUNCTION = ... # type: int
+PROXY = ... # type: int
+PROXYAUTH = ... # type: int
+PROXYAUTH_AVAIL = ... # type: int
+PROXYPORT = ... # type: int
+PROXYTYPE = ... # type: int
+PROXYTYPE_HTTP = ... # type: int
+PROXYTYPE_SOCKS4 = ... # type: int
+PROXYTYPE_SOCKS5 = ... # type: int
+PROXYUSERPWD = ... # type: int
+PROXY_TRANSFER_MODE = ... # type: int
+PUT = ... # type: int
+QUOTE = ... # type: int
+RANDOM_FILE = ... # type: int
+RANGE = ... # type: int
+READDATA = ... # type: int
+READFUNCTION = ... # type: int
+READFUNC_ABORT = ... # type: int
+REDIRECT_COUNT = ... # type: int
+REDIRECT_TIME = ... # type: int
+REDIRECT_URL = ... # type: int
+REFERER = ... # type: int
+REQUEST_SIZE = ... # type: int
+RESPONSE_CODE = ... # type: int
+RESUME_FROM = ... # type: int
+RESUME_FROM_LARGE = ... # type: int
+SHARE = ... # type: int
+SH_SHARE = ... # type: int
+SH_UNSHARE = ... # type: int
+SIZE_DOWNLOAD = ... # type: int
+SIZE_UPLOAD = ... # type: int
+SOCKET_TIMEOUT = ... # type: int
+SPEED_DOWNLOAD = ... # type: int
+SPEED_UPLOAD = ... # type: int
+SSH_AUTH_ANY = ... # type: int
+SSH_AUTH_DEFAULT = ... # type: int
+SSH_AUTH_HOST = ... # type: int
+SSH_AUTH_KEYBOARD = ... # type: int
+SSH_AUTH_NONE = ... # type: int
+SSH_AUTH_PASSWORD = ... # type: int
+SSH_AUTH_PUBLICKEY = ... # type: int
+SSH_AUTH_TYPES = ... # type: int
+SSH_HOST_PUBLIC_KEY_MD5 = ... # type: int
+SSH_PRIVATE_KEYFILE = ... # type: int
+SSH_PUBLIC_KEYFILE = ... # type: int
+SSLCERT = ... # type: int
+SSLCERTPASSWD = ... # type: int
+SSLCERTTYPE = ... # type: int
+SSLENGINE = ... # type: int
+SSLENGINE_DEFAULT = ... # type: int
+SSLKEY = ... # type: int
+SSLKEYPASSWD = ... # type: int
+SSLKEYTYPE = ... # type: int
+SSLVERSION = ... # type: int
+SSLVERSION_DEFAULT = ... # type: int
+SSLVERSION_SSLv2 = ... # type: int
+SSLVERSION_SSLv3 = ... # type: int
+SSLVERSION_TLSv1 = ... # type: int
+SSL_CIPHER_LIST = ... # type: int
+SSL_ENGINES = ... # type: int
+SSL_SESSIONID_CACHE = ... # type: int
+SSL_VERIFYHOST = ... # type: int
+SSL_VERIFYPEER = ... # type: int
+SSL_VERIFYRESULT = ... # type: int
+STARTTRANSFER_TIME = ... # type: int
+STDERR = ... # type: int
+TCP_NODELAY = ... # type: int
+TIMECONDITION = ... # type: int
+TIMECONDITION_IFMODSINCE = ... # type: int
+TIMECONDITION_IFUNMODSINCE = ... # type: int
+TIMECONDITION_LASTMOD = ... # type: int
+TIMECONDITION_NONE = ... # type: int
+TIMEOUT = ... # type: int
+TIMEOUT_MS = ... # type: int
+TIMEVALUE = ... # type: int
+TOTAL_TIME = ... # type: int
+TRANSFERTEXT = ... # type: int
+UNRESTRICTED_AUTH = ... # type: int
+UPLOAD = ... # type: int
+URL = ... # type: int
+USERAGENT = ... # type: int
+USERPWD = ... # type: int
+VERBOSE = ... # type: int
+WRITEDATA = ... # type: int
+WRITEFUNCTION = ... # type: int
+WRITEHEADER = ... # type: int
+
+E_ABORTED_BY_CALLBACK = ... # type: int
+E_BAD_CONTENT_ENCODING = ... # type: int
+E_BAD_DOWNLOAD_RESUME = ... # type: int
+E_BAD_FUNCTION_ARGUMENT = ... # type: int
+E_CALL_MULTI_PERFORM = ... # type: int
+E_CONV_FAILED = ... # type: int
+E_CONV_REQD = ... # type: int
+E_COULDNT_CONNECT = ... # type: int
+E_COULDNT_RESOLVE_HOST = ... # type: int
+E_COULDNT_RESOLVE_PROXY = ... # type: int
+E_FAILED_INIT = ... # type: int
+E_FILESIZE_EXCEEDED = ... # type: int
+E_FILE_COULDNT_READ_FILE = ... # type: int
+E_FTP_ACCESS_DENIED = ... # type: int
+E_FTP_CANT_GET_HOST = ... # type: int
+E_FTP_CANT_RECONNECT = ... # type: int
+E_FTP_COULDNT_GET_SIZE = ... # type: int
+E_FTP_COULDNT_RETR_FILE = ... # type: int
+E_FTP_COULDNT_SET_ASCII = ... # type: int
+E_FTP_COULDNT_SET_BINARY = ... # type: int
+E_FTP_COULDNT_STOR_FILE = ... # type: int
+E_FTP_COULDNT_USE_REST = ... # type: int
+E_FTP_PORT_FAILED = ... # type: int
+E_FTP_QUOTE_ERROR = ... # type: int
+E_FTP_SSL_FAILED = ... # type: int
+E_FTP_WEIRD_227_FORMAT = ... # type: int
+E_FTP_WEIRD_PASS_REPLY = ... # type: int
+E_FTP_WEIRD_PASV_REPLY = ... # type: int
+E_FTP_WEIRD_SERVER_REPLY = ... # type: int
+E_FTP_WEIRD_USER_REPLY = ... # type: int
+E_FTP_WRITE_ERROR = ... # type: int
+E_FUNCTION_NOT_FOUND = ... # type: int
+E_GOT_NOTHING = ... # type: int
+E_HTTP_POST_ERROR = ... # type: int
+E_HTTP_RANGE_ERROR = ... # type: int
+E_HTTP_RETURNED_ERROR = ... # type: int
+E_INTERFACE_FAILED = ... # type: int
+E_LDAP_CANNOT_BIND = ... # type: int
+E_LDAP_INVALID_URL = ... # type: int
+E_LDAP_SEARCH_FAILED = ... # type: int
+E_LIBRARY_NOT_FOUND = ... # type: int
+E_LOGIN_DENIED = ... # type: int
+E_MULTI_BAD_EASY_HANDLE = ... # type: int
+E_MULTI_BAD_HANDLE = ... # type: int
+E_MULTI_INTERNAL_ERROR = ... # type: int
+E_MULTI_OK = ... # type: int
+E_MULTI_OUT_OF_MEMORY = ... # type: int
+E_OK = ... # type: int
+E_OPERATION_TIMEOUTED = ... # type: int
+E_OUT_OF_MEMORY = ... # type: int
+E_PARTIAL_FILE = ... # type: int
+E_READ_ERROR = ... # type: int
+E_RECV_ERROR = ... # type: int
+E_REMOTE_FILE_NOT_FOUND = ... # type: int
+E_SEND_ERROR = ... # type: int
+E_SEND_FAIL_REWIND = ... # type: int
+E_SHARE_IN_USE = ... # type: int
+E_SSH = ... # type: int
+E_SSL_CACERT = ... # type: int
+E_SSL_CACERT_BADFILE = ... # type: int
+E_SSL_CERTPROBLEM = ... # type: int
+E_SSL_CIPHER = ... # type: int
+E_SSL_CONNECT_ERROR = ... # type: int
+E_SSL_ENGINE_INITFAILED = ... # type: int
+E_SSL_ENGINE_NOTFOUND = ... # type: int
+E_SSL_ENGINE_SETFAILED = ... # type: int
+E_SSL_PEER_CERTIFICATE = ... # type: int
+E_SSL_SHUTDOWN_FAILED = ... # type: int
+E_TELNET_OPTION_SYNTAX = ... # type: int
+E_TFTP_DISKFULL = ... # type: int
+E_TFTP_EXISTS = ... # type: int
+E_TFTP_ILLEGAL = ... # type: int
+E_TFTP_NOSUCHUSER = ... # type: int
+E_TFTP_NOTFOUND = ... # type: int
+E_TFTP_PERM = ... # type: int
+E_TFTP_UNKNOWNID = ... # type: int
+E_TOO_MANY_REDIRECTS = ... # type: int
+E_UNKNOWN_TELNET_OPTION = ... # type: int
+E_UNSUPPORTED_PROTOCOL = ... # type: int
+E_URL_MALFORMAT = ... # type: int
+E_WRITE_ERROR = ... # type: int
diff --git a/typeshed/third_party/2/pymssql.pyi b/typeshed/third_party/2/pymssql.pyi
new file mode 100644
index 0000000..3f75b31
--- /dev/null
+++ b/typeshed/third_party/2/pymssql.pyi
@@ -0,0 +1,48 @@
+from datetime import datetime, date, time
+
+from typing import Any, Dict, Tuple, Iterable, List, Optional, Union, Sequence
+
+Scalar = Union[int, float, str, datetime, date, time]
+Result = Union[Tuple[Scalar, ...], Dict[str, Scalar]]
+
+class Connection(object):
+ def __init__(self, user, password, host, database, timeout,
+ login_timeout, charset, as_dict) -> None: ...
+ def autocommit(self, status: bool) -> None: ...
+ def close(self) -> None: ...
+ def commit(self) -> None: ...
+ def cursor(self) -> 'Cursor': ...
+ def rollback(self) -> None: ...
+
+class Cursor(object):
+ def __init__(self) -> None: ...
+ def __iter__(self): ...
+ def __next__(self) -> Any: ...
+ def callproc(self, procname: str, **kwargs) -> None: ...
+ def close(self) -> None: ...
+ def execute(self, stmt: str,
+ params: Optional[Union[Scalar, Tuple[Scalar, ...],
+ Dict[str, Scalar]]]) -> None: ...
+ def executemany(self, stmt: str,
+ params: Optional[Sequence[Tuple[Scalar, ...]]]) -> None: ...
+ def fetchall(self) -> List[Result]: ...
+ def fetchmany(self, size: Optional[Union[int, None]]) -> List[Result]: ...
+ def fetchone(self) -> Result: ...
+
+def connect(server: Optional[str],
+ user: Optional[str],
+ password: Optional[str],
+ database: Optional[str],
+ timeout: Optional[int],
+ login_timeout: Optional[int],
+ charset: Optional[str],
+ as_dict: Optional[bool],
+ host: Optional[str],
+ appname: Optional[str],
+ port: Optional[str],
+
+ conn_properties: Optional[Union[str, Sequence[str]]],
+ autocommit: Optional[bool],
+ tds_version: Optional[str]) -> Connection: ...
+def get_max_connections() -> int: ...
+def set_max_connections(n: int) -> None: ...
diff --git a/typeshed/third_party/2/redis/__init__.pyi b/typeshed/third_party/2/redis/__init__.pyi
new file mode 100644
index 0000000..53ec818
--- /dev/null
+++ b/typeshed/third_party/2/redis/__init__.pyi
@@ -0,0 +1,28 @@
+# Stubs for redis (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from . import client
+from . import connection
+from . import utils
+from . import exceptions
+
+Redis = client.Redis
+StrictRedis = client.StrictRedis
+BlockingConnectionPool = connection.BlockingConnectionPool
+ConnectionPool = connection.ConnectionPool
+Connection = connection.Connection
+SSLConnection = connection.SSLConnection
+UnixDomainSocketConnection = connection.UnixDomainSocketConnection
+from_url = utils.from_url
+AuthenticationError = exceptions.AuthenticationError
+BusyLoadingError = exceptions.BusyLoadingError
+ConnectionError = exceptions.ConnectionError
+DataError = exceptions.DataError
+InvalidResponse = exceptions.InvalidResponse
+PubSubError = exceptions.PubSubError
+ReadOnlyError = exceptions.ReadOnlyError
+RedisError = exceptions.RedisError
+ResponseError = exceptions.ResponseError
+TimeoutError = exceptions.TimeoutError
+WatchError = exceptions.WatchError
diff --git a/typeshed/third_party/2/redis/client.pyi b/typeshed/third_party/2/redis/client.pyi
new file mode 100644
index 0000000..43693ec
--- /dev/null
+++ b/typeshed/third_party/2/redis/client.pyi
@@ -0,0 +1,293 @@
+# Stubs for redis.client (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+SYM_EMPTY = ... # type: Any
+
+def list_or_args(keys, args): ...
+def timestamp_to_datetime(response): ...
+def string_keys_to_dict(key_string, callback): ...
+def dict_merge(*dicts): ...
+def parse_debug_object(response): ...
+def parse_object(response, infotype): ...
+def parse_info(response): ...
+
+SENTINEL_STATE_TYPES = ... # type: Any
+
+def parse_sentinel_state(item): ...
+def parse_sentinel_master(response): ...
+def parse_sentinel_masters(response): ...
+def parse_sentinel_slaves_and_sentinels(response): ...
+def parse_sentinel_get_master(response): ...
+def pairs_to_dict(response): ...
+def pairs_to_dict_typed(response, type_info): ...
+def zset_score_pairs(response, **options): ...
+def sort_return_tuples(response, **options): ...
+def int_or_none(response): ...
+def float_or_none(response): ...
+def bool_ok(response): ...
+def parse_client_list(response, **options): ...
+def parse_config_get(response, **options): ...
+def parse_scan(response, **options): ...
+def parse_hscan(response, **options): ...
+def parse_zscan(response, **options): ...
+def parse_slowlog_get(response, **options): ...
+
+class StrictRedis:
+ RESPONSE_CALLBACKS = ... # type: Any
+ @classmethod
+ def from_url(cls, url, db=..., **kwargs): ...
+ connection_pool = ... # type: Any
+ response_callbacks = ... # type: Any
+ def __init__(self, host=..., port=..., db=..., password=..., socket_timeout=..., socket_connect_timeout=..., socket_keepalive=..., socket_keepalive_options=..., connection_pool=..., unix_socket_path=..., encoding=..., encoding_errors=..., charset=..., errors=..., decode_responses=..., retry_on_timeout=..., ssl=..., ssl_keyfile=..., ssl_certfile=..., ssl_cert_reqs=..., ssl_ca_certs=...) -> None: ...
+ def set_response_callback(self, command, callback): ...
+ def pipeline(self, transaction=..., shard_hint=...): ...
+ def transaction(self, func, *watches, **kwargs): ...
+ def lock(self, name, timeout=..., sleep=..., blocking_timeout=..., lock_class=..., thread_local=...): ...
+ def pubsub(self, **kwargs): ...
+ def execute_command(self, *args, **options): ...
+ def parse_response(self, connection, command_name, **options): ...
+ def bgrewriteaof(self): ...
+ def bgsave(self): ...
+ def client_kill(self, address): ...
+ def client_list(self): ...
+ def client_getname(self): ...
+ def client_setname(self, name): ...
+ def config_get(self, pattern=...): ...
+ def config_set(self, name, value): ...
+ def config_resetstat(self): ...
+ def config_rewrite(self): ...
+ def dbsize(self): ...
+ def debug_object(self, key): ...
+ def echo(self, value): ...
+ def flushall(self): ...
+ def flushdb(self): ...
+ def info(self, section=...): ...
+ def lastsave(self): ...
+ def object(self, infotype, key): ...
+ def ping(self): ...
+ def save(self): ...
+ def sentinel(self, *args): ...
+ def sentinel_get_master_addr_by_name(self, service_name): ...
+ def sentinel_master(self, service_name): ...
+ def sentinel_masters(self): ...
+ def sentinel_monitor(self, name, ip, port, quorum): ...
+ def sentinel_remove(self, name): ...
+ def sentinel_sentinels(self, service_name): ...
+ def sentinel_set(self, name, option, value): ...
+ def sentinel_slaves(self, service_name): ...
+ def shutdown(self): ...
+ def slaveof(self, host=..., port=...): ...
+ def slowlog_get(self, num=...): ...
+ def slowlog_len(self): ...
+ def slowlog_reset(self): ...
+ def time(self): ...
+ def append(self, key, value): ...
+ def bitcount(self, key, start=..., end=...): ...
+ def bitop(self, operation, dest, *keys): ...
+ def bitpos(self, key, bit, start=..., end=...): ...
+ def decr(self, name, amount=...): ...
+ def delete(self, *names): ...
+ def __delitem__(self, name): ...
+ def dump(self, name): ...
+ def exists(self, name): ...
+ __contains__ = ... # type: Any
+ def expire(self, name, time): ...
+ def expireat(self, name, when): ...
+ def get(self, name): ...
+ def __getitem__(self, name): ...
+ def getbit(self, name, offset): ...
+ def getrange(self, key, start, end): ...
+ def getset(self, name, value): ...
+ def incr(self, name, amount=...): ...
+ def incrby(self, name, amount=...): ...
+ def incrbyfloat(self, name, amount=...): ...
+ def keys(self, pattern=...): ...
+ def mget(self, keys, *args): ...
+ def mset(self, *args, **kwargs): ...
+ def msetnx(self, *args, **kwargs): ...
+ def move(self, name, db): ...
+ def persist(self, name): ...
+ def pexpire(self, name, time): ...
+ def pexpireat(self, name, when): ...
+ def psetex(self, name, time_ms, value): ...
+ def pttl(self, name): ...
+ def randomkey(self): ...
+ def rename(self, src, dst): ...
+ def renamenx(self, src, dst): ...
+ def restore(self, name, ttl, value): ...
+ def set(self, name, value, ex=..., px=..., nx=..., xx=...): ...
+ def __setitem__(self, name, value): ...
+ def setbit(self, name, offset, value): ...
+ def setex(self, name, time, value): ...
+ def setnx(self, name, value): ...
+ def setrange(self, name, offset, value): ...
+ def strlen(self, name): ...
+ def substr(self, name, start, end=...): ...
+ def ttl(self, name): ...
+ def type(self, name): ...
+ def watch(self, *names): ...
+ def unwatch(self): ...
+ def blpop(self, keys, timeout=...): ...
+ def brpop(self, keys, timeout=...): ...
+ def brpoplpush(self, src, dst, timeout=...): ...
+ def lindex(self, name, index): ...
+ def linsert(self, name, where, refvalue, value): ...
+ def llen(self, name): ...
+ def lpop(self, name): ...
+ def lpush(self, name, *values): ...
+ def lpushx(self, name, value): ...
+ def lrange(self, name, start, end): ...
+ def lrem(self, name, count, value): ...
+ def lset(self, name, index, value): ...
+ def ltrim(self, name, start, end): ...
+ def rpop(self, name): ...
+ def rpoplpush(self, src, dst): ...
+ def rpush(self, name, *values): ...
+ def rpushx(self, name, value): ...
+ def sort(self, name, start=..., num=..., by=..., get=..., desc=..., alpha=..., store=..., groups=...): ...
+ def scan(self, cursor=..., match=..., count=...): ...
+ def scan_iter(self, match=..., count=...): ...
+ def sscan(self, name, cursor=..., match=..., count=...): ...
+ def sscan_iter(self, name, match=..., count=...): ...
+ def hscan(self, name, cursor=..., match=..., count=...): ...
+ def hscan_iter(self, name, match=..., count=...): ...
+ def zscan(self, name, cursor=..., match=..., count=..., score_cast_func=...): ...
+ def zscan_iter(self, name, match=..., count=..., score_cast_func=...): ...
+ def sadd(self, name, *values): ...
+ def scard(self, name): ...
+ def sdiff(self, keys, *args): ...
+ def sdiffstore(self, dest, keys, *args): ...
+ def sinter(self, keys, *args): ...
+ def sinterstore(self, dest, keys, *args): ...
+ def sismember(self, name, value): ...
+ def smembers(self, name): ...
+ def smove(self, src, dst, value): ...
+ def spop(self, name): ...
+ def srandmember(self, name, number=...): ...
+ def srem(self, name, *values): ...
+ def sunion(self, keys, *args): ...
+ def sunionstore(self, dest, keys, *args): ...
+ def zadd(self, name, *args, **kwargs): ...
+ def zcard(self, name): ...
+ def zcount(self, name, min, max): ...
+ def zincrby(self, name, value, amount=...): ...
+ def zinterstore(self, dest, keys, aggregate=...): ...
+ def zlexcount(self, name, min, max): ...
+ def zrange(self, name, start, end, desc=..., withscores=..., score_cast_func=...): ...
+ def zrangebylex(self, name, min, max, start=..., num=...): ...
+ def zrangebyscore(self, name, min, max, start=..., num=..., withscores=..., score_cast_func=...): ...
+ def zrank(self, name, value): ...
+ def zrem(self, name, *values): ...
+ def zremrangebylex(self, name, min, max): ...
+ def zremrangebyrank(self, name, min, max): ...
+ def zremrangebyscore(self, name, min, max): ...
+ def zrevrange(self, name, start, end, withscores=..., score_cast_func=...): ...
+ def zrevrangebyscore(self, name, max, min, start=..., num=..., withscores=..., score_cast_func=...): ...
+ def zrevrank(self, name, value): ...
+ def zscore(self, name, value): ...
+ def zunionstore(self, dest, keys, aggregate=...): ...
+ def pfadd(self, name, *values): ...
+ def pfcount(self, name): ...
+ def pfmerge(self, dest, *sources): ...
+ def hdel(self, name, *keys): ...
+ def hexists(self, name, key): ...
+ def hget(self, name, key): ...
+ def hgetall(self, name): ...
+ def hincrby(self, name, key, amount=...): ...
+ def hincrbyfloat(self, name, key, amount=...): ...
+ def hkeys(self, name): ...
+ def hlen(self, name): ...
+ def hset(self, name, key, value): ...
+ def hsetnx(self, name, key, value): ...
+ def hmset(self, name, mapping): ...
+ def hmget(self, name, keys, *args): ...
+ def hvals(self, name): ...
+ def publish(self, channel, message): ...
+ def eval(self, script, numkeys, *keys_and_args): ...
+ def evalsha(self, sha, numkeys, *keys_and_args): ...
+ def script_exists(self, *args): ...
+ def script_flush(self): ...
+ def script_kill(self): ...
+ def script_load(self, script): ...
+ def register_script(self, script): ...
+
+class Redis(StrictRedis):
+ RESPONSE_CALLBACKS = ... # type: Any
+ def pipeline(self, transaction=..., shard_hint=...): ...
+ def setex(self, name, value, time): ...
+ def lrem(self, name, value, num=...): ...
+ def zadd(self, name, *args, **kwargs): ...
+
+class PubSub:
+ PUBLISH_MESSAGE_TYPES = ... # type: Any
+ UNSUBSCRIBE_MESSAGE_TYPES = ... # type: Any
+ connection_pool = ... # type: Any
+ shard_hint = ... # type: Any
+ ignore_subscribe_messages = ... # type: Any
+ connection = ... # type: Any
+ encoding = ... # type: Any
+ encoding_errors = ... # type: Any
+ decode_responses = ... # type: Any
+ def __init__(self, connection_pool, shard_hint=..., ignore_subscribe_messages=...) -> None: ...
+ def __del__(self): ...
+ channels = ... # type: Any
+ patterns = ... # type: Any
+ def reset(self): ...
+ def close(self): ...
+ def on_connect(self, connection): ...
+ def encode(self, value): ...
+ @property
+ def subscribed(self): ...
+ def execute_command(self, *args, **kwargs): ...
+ def parse_response(self, block=...): ...
+ def psubscribe(self, *args, **kwargs): ...
+ def punsubscribe(self, *args): ...
+ def subscribe(self, *args, **kwargs): ...
+ def unsubscribe(self, *args): ...
+ def listen(self): ...
+ def get_message(self, ignore_subscribe_messages=...): ...
+ def handle_message(self, response, ignore_subscribe_messages=...): ...
+ def run_in_thread(self, sleep_time=...): ...
+
+class BasePipeline:
+ UNWATCH_COMMANDS = ... # type: Any
+ connection_pool = ... # type: Any
+ connection = ... # type: Any
+ response_callbacks = ... # type: Any
+ transaction = ... # type: Any
+ shard_hint = ... # type: Any
+ watching = ... # type: Any
+ def __init__(self, connection_pool, response_callbacks, transaction, shard_hint) -> None: ...
+ def __enter__(self): ...
+ def __exit__(self, exc_type, exc_value, traceback): ...
+ def __del__(self): ...
+ def __len__(self): ...
+ command_stack = ... # type: Any
+ scripts = ... # type: Any
+ explicit_transaction = ... # type: Any
+ def reset(self): ...
+ def multi(self): ...
+ def execute_command(self, *args, **kwargs): ...
+ def immediate_execute_command(self, *args, **options): ...
+ def pipeline_execute_command(self, *args, **options): ...
+ def raise_first_error(self, commands, response): ...
+ def annotate_exception(self, exception, number, command): ...
+ def parse_response(self, connection, command_name, **options): ...
+ def load_scripts(self): ...
+ def execute(self, raise_on_error=...): ...
+ def watch(self, *names): ...
+ def unwatch(self): ...
+ def script_load_for_pipeline(self, script): ...
+
+class StrictPipeline(BasePipeline, StrictRedis): ...
+class Pipeline(BasePipeline, Redis): ...
+
+class Script:
+ registered_client = ... # type: Any
+ script = ... # type: Any
+ sha = ... # type: Any
+ def __init__(self, registered_client, script) -> None: ...
+ def __call__(self, keys=..., args=..., client=...): ...
diff --git a/typeshed/third_party/2/redis/connection.pyi b/typeshed/third_party/2/redis/connection.pyi
new file mode 100644
index 0000000..214cd8d
--- /dev/null
+++ b/typeshed/third_party/2/redis/connection.pyi
@@ -0,0 +1,135 @@
+# Stubs for redis.connection (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+ssl_available = ... # type: Any
+hiredis_version = ... # type: Any
+HIREDIS_SUPPORTS_CALLABLE_ERRORS = ... # type: Any
+HIREDIS_SUPPORTS_BYTE_BUFFER = ... # type: Any
+msg = ... # type: Any
+HIREDIS_USE_BYTE_BUFFER = ... # type: Any
+SYM_STAR = ... # type: Any
+SYM_DOLLAR = ... # type: Any
+SYM_CRLF = ... # type: Any
+SYM_EMPTY = ... # type: Any
+SERVER_CLOSED_CONNECTION_ERROR = ... # type: Any
+
+class Token:
+ value = ... # type: Any
+ def __init__(self, value) -> None: ...
+
+class BaseParser:
+ EXCEPTION_CLASSES = ... # type: Any
+ def parse_error(self, response): ...
+
+class SocketBuffer:
+ socket_read_size = ... # type: Any
+ bytes_written = ... # type: Any
+ bytes_read = ... # type: Any
+ def __init__(self, socket, socket_read_size) -> None: ...
+ @property
+ def length(self): ...
+ def read(self, length): ...
+ def readline(self): ...
+ def purge(self): ...
+ def close(self): ...
+
+class PythonParser(BaseParser):
+ encoding = ... # type: Any
+ socket_read_size = ... # type: Any
+ def __init__(self, socket_read_size) -> None: ...
+ def __del__(self): ...
+ def on_connect(self, connection): ...
+ def on_disconnect(self): ...
+ def can_read(self): ...
+ def read_response(self): ...
+
+class HiredisParser(BaseParser):
+ socket_read_size = ... # type: Any
+ def __init__(self, socket_read_size) -> None: ...
+ def __del__(self): ...
+ def on_connect(self, connection): ...
+ def on_disconnect(self): ...
+ def can_read(self): ...
+ def read_response(self): ...
+
+DefaultParser = ... # type: Any
+
+class Connection:
+ description_format = ... # type: Any
+ pid = ... # type: Any
+ host = ... # type: Any
+ port = ... # type: Any
+ db = ... # type: Any
+ password = ... # type: Any
+ socket_timeout = ... # type: Any
+ socket_connect_timeout = ... # type: Any
+ socket_keepalive = ... # type: Any
+ socket_keepalive_options = ... # type: Any
+ retry_on_timeout = ... # type: Any
+ encoding = ... # type: Any
+ encoding_errors = ... # type: Any
+ decode_responses = ... # type: Any
+ def __init__(self, host=..., port=..., db=..., password=..., socket_timeout=..., socket_connect_timeout=..., socket_keepalive=..., socket_keepalive_options=..., retry_on_timeout=..., encoding=..., encoding_errors=..., decode_responses=..., parser_class=..., socket_read_size=...) -> None: ...
+ def __del__(self): ...
+ def register_connect_callback(self, callback): ...
+ def clear_connect_callbacks(self): ...
+ def connect(self): ...
+ def on_connect(self): ...
+ def disconnect(self): ...
+ def send_packed_command(self, command): ...
+ def send_command(self, *args): ...
+ def can_read(self): ...
+ def read_response(self): ...
+ def encode(self, value): ...
+ def pack_command(self, *args): ...
+ def pack_commands(self, commands): ...
+
+class SSLConnection(Connection):
+ description_format = ... # type: Any
+ keyfile = ... # type: Any
+ certfile = ... # type: Any
+ cert_reqs = ... # type: Any
+ ca_certs = ... # type: Any
+ def __init__(self, ssl_keyfile=..., ssl_certfile=..., ssl_cert_reqs=..., ssl_ca_certs=..., **kwargs) -> None: ...
+
+class UnixDomainSocketConnection(Connection):
+ description_format = ... # type: Any
+ pid = ... # type: Any
+ path = ... # type: Any
+ db = ... # type: Any
+ password = ... # type: Any
+ socket_timeout = ... # type: Any
+ retry_on_timeout = ... # type: Any
+ encoding = ... # type: Any
+ encoding_errors = ... # type: Any
+ decode_responses = ... # type: Any
+ def __init__(self, path=..., db=..., password=..., socket_timeout=..., encoding=..., encoding_errors=..., decode_responses=..., retry_on_timeout=..., parser_class=..., socket_read_size=...) -> None: ...
+
+class ConnectionPool:
+ @classmethod
+ def from_url(cls, url, db=..., **kwargs): ...
+ connection_class = ... # type: Any
+ connection_kwargs = ... # type: Any
+ max_connections = ... # type: Any
+ def __init__(self, connection_class=..., max_connections=..., **connection_kwargs) -> None: ...
+ pid = ... # type: Any
+ def reset(self): ...
+ def get_connection(self, command_name, *keys, **options): ...
+ def make_connection(self): ...
+ def release(self, connection): ...
+ def disconnect(self): ...
+
+class BlockingConnectionPool(ConnectionPool):
+ queue_class = ... # type: Any
+ timeout = ... # type: Any
+ def __init__(self, max_connections=..., timeout=..., connection_class=..., queue_class=..., **connection_kwargs) -> None: ...
+ pid = ... # type: Any
+ pool = ... # type: Any
+ def reset(self): ...
+ def make_connection(self): ...
+ def get_connection(self, command_name, *keys, **options): ...
+ def release(self, connection): ...
+ def disconnect(self): ...
diff --git a/typeshed/third_party/2/redis/exceptions.pyi b/typeshed/third_party/2/redis/exceptions.pyi
new file mode 100644
index 0000000..97a11f5
--- /dev/null
+++ b/typeshed/third_party/2/redis/exceptions.pyi
@@ -0,0 +1,21 @@
+# Stubs for redis.exceptions (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+class RedisError(Exception): ...
+
+def __unicode__(self): ...
+
+class AuthenticationError(RedisError): ...
+class ConnectionError(RedisError): ...
+class TimeoutError(RedisError): ...
+class BusyLoadingError(ConnectionError): ...
+class InvalidResponse(RedisError): ...
+class ResponseError(RedisError): ...
+class DataError(RedisError): ...
+class PubSubError(RedisError): ...
+class WatchError(RedisError): ...
+class NoScriptError(ResponseError): ...
+class ExecAbortError(ResponseError): ...
+class ReadOnlyError(ResponseError): ...
+class LockError(RedisError, ValueError): ...
diff --git a/typeshed/third_party/2/redis/utils.pyi b/typeshed/third_party/2/redis/utils.pyi
new file mode 100644
index 0000000..fe1388c
--- /dev/null
+++ b/typeshed/third_party/2/redis/utils.pyi
@@ -0,0 +1,12 @@
+# Stubs for redis.utils (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+HIREDIS_AVAILABLE = ... # type: Any
+
+def from_url(url, db=..., **kwargs): ...
+def pipeline(redis_obj): ...
+
+class dummy: ...
diff --git a/typeshed/third_party/2/requests/__init__.pyi b/typeshed/third_party/2/requests/__init__.pyi
new file mode 100644
index 0000000..51e4131
--- /dev/null
+++ b/typeshed/third_party/2/requests/__init__.pyi
@@ -0,0 +1,39 @@
+# Stubs for requests (based on version 2.6.0, Python 3)
+
+from typing import Any
+from requests import models
+from requests import api
+from requests import sessions
+from requests import status_codes
+from requests import exceptions
+import logging
+
+__title__ = ... # type: Any
+__build__ = ... # type: Any
+__license__ = ... # type: Any
+__copyright__ = ... # type: Any
+__version__ = ... # type: Any
+
+Request = models.Request
+Response = models.Response
+PreparedRequest = models.PreparedRequest
+request = api.request
+get = api.get
+head = api.head
+post = api.post
+patch = api.patch
+put = api.put
+delete = api.delete
+options = api.options
+session = sessions.session
+Session = sessions.Session
+codes = status_codes.codes
+RequestException = exceptions.RequestException
+Timeout = exceptions.Timeout
+URLRequired = exceptions.URLRequired
+TooManyRedirects = exceptions.TooManyRedirects
+HTTPError = exceptions.HTTPError
+ConnectionError = exceptions.ConnectionError
+
+class NullHandler(logging.Handler):
+ def emit(self, record): ...
diff --git a/typeshed/third_party/2/requests/adapters.pyi b/typeshed/third_party/2/requests/adapters.pyi
new file mode 100644
index 0000000..00cc000
--- /dev/null
+++ b/typeshed/third_party/2/requests/adapters.pyi
@@ -0,0 +1,72 @@
+# Stubs for requests.adapters (Python 3)
+
+from typing import Any, Container, Union, Tuple
+from . import models
+from .packages.urllib3 import poolmanager
+from .packages.urllib3 import response
+from .packages.urllib3.util import retry
+from . import compat
+from . import utils
+from . import structures
+from .packages.urllib3 import exceptions as urllib3_exceptions
+from . import cookies
+from . import exceptions
+from . import auth
+
+PreparedRequest = models.PreparedRequest
+Response = models.Response
+PoolManager = poolmanager.PoolManager
+proxy_from_url = poolmanager.proxy_from_url
+HTTPResponse = response.HTTPResponse
+Retry = retry.Retry
+DEFAULT_CA_BUNDLE_PATH = utils.DEFAULT_CA_BUNDLE_PATH
+get_encoding_from_headers = utils.get_encoding_from_headers
+prepend_scheme_if_needed = utils.prepend_scheme_if_needed
+get_auth_from_url = utils.get_auth_from_url
+urldefragauth = utils.urldefragauth
+CaseInsensitiveDict = structures.CaseInsensitiveDict
+ConnectTimeoutError = urllib3_exceptions.ConnectTimeoutError
+MaxRetryError = urllib3_exceptions.MaxRetryError
+ProtocolError = urllib3_exceptions.ProtocolError
+ReadTimeoutError = urllib3_exceptions.ReadTimeoutError
+ResponseError = urllib3_exceptions.ResponseError
+extract_cookies_to_jar = cookies.extract_cookies_to_jar
+ConnectionError = exceptions.ConnectionError
+ConnectTimeout = exceptions.ConnectTimeout
+ReadTimeout = exceptions.ReadTimeout
+SSLError = exceptions.SSLError
+ProxyError = exceptions.ProxyError
+RetryError = exceptions.RetryError
+
+DEFAULT_POOLBLOCK = ... # type: Any
+DEFAULT_POOLSIZE = ... # type: Any
+DEFAULT_RETRIES = ... # type: Any
+
+class BaseAdapter:
+ def __init__(self) -> None: ...
+ def send(self, request: PreparedRequest, stream=False,
+ timeout: Union[None, float, Tuple[float, float]]=None,
+ verify=False,
+ cert: Union[None, Union[str, unicode, bytes], Container[Union[str, unicode]]]=None) -> Response: ...
+ def close(self) -> None: ...
+
+class HTTPAdapter(BaseAdapter):
+ __attrs__ = ... # type: Any
+ max_retries = ... # type: Any
+ config = ... # type: Any
+ proxy_manager = ... # type: Any
+ def __init__(self, pool_connections=..., pool_maxsize=..., max_retries=...,
+ pool_block=...): ...
+ poolmanager = ... # type: Any
+ def init_poolmanager(self, connections, maxsize, block=..., **pool_kwargs): ...
+ def proxy_manager_for(self, proxy, **proxy_kwargs): ...
+ def cert_verify(self, conn, url, verify, cert): ...
+ def build_response(self, req, resp): ...
+ def get_connection(self, url, proxies=...): ...
+ def close(self): ...
+ def request_url(self, request, proxies): ...
+ def add_headers(self, request, **kwargs): ...
+ def proxy_headers(self, proxy): ...
+ # TODO: "request" is not actually optional, modified to please mypy.
+ def send(self, request=..., stream=..., timeout=..., verify=..., cert=...,
+ proxies=...): ...
diff --git a/typeshed/third_party/2/requests/api.pyi b/typeshed/third_party/2/requests/api.pyi
new file mode 100644
index 0000000..785439e
--- /dev/null
+++ b/typeshed/third_party/2/requests/api.pyi
@@ -0,0 +1,21 @@
+# Stubs for requests.api (Python 3)
+
+from typing import Union, Optional, AnyStr
+
+from .models import Response
+
+def request(method: str, url: str, **kwargs) -> Response: ...
+
+def get(url: Union[str, unicode],
+ params: Optional[Union[dict[Union[str, unicode],
+ Union[str, unicode]],
+ Union[str, unicode]]]=None,
+ **kwargs) -> Response: ...
+
+def options(url: Union[str, unicode], **kwargs) -> Response: ...
+def head(url: Union[str, unicode], **kwargs) -> Response: ...
+def post(url: Union[str, unicode], data=..., json=...,
+ **kwargs) -> Response: ...
+def put(url: Union[str, unicode], data=..., **kwargs) -> Response: ...
+def patch(url: Union[str, unicode], data=..., **kwargs) -> Response: ...
+def delete(url: Union[str, unicode], **kwargs) -> Response: ...
diff --git a/typeshed/third_party/2/requests/auth.pyi b/typeshed/third_party/2/requests/auth.pyi
new file mode 100644
index 0000000..8eea2b0
--- /dev/null
+++ b/typeshed/third_party/2/requests/auth.pyi
@@ -0,0 +1,41 @@
+# Stubs for requests.auth (Python 3)
+
+from typing import Any
+from . import compat
+from . import cookies
+from . import utils
+from . import status_codes
+
+extract_cookies_to_jar = cookies.extract_cookies_to_jar
+parse_dict_header = utils.parse_dict_header
+to_native_string = utils.to_native_string
+codes = status_codes.codes
+
+CONTENT_TYPE_FORM_URLENCODED = ... # type: Any
+CONTENT_TYPE_MULTI_PART = ... # type: Any
+
+class AuthBase:
+ def __call__(self, r): ...
+
+class HTTPBasicAuth(AuthBase):
+ username = ... # type: Any
+ password = ... # type: Any
+ def __init__(self, username, password) -> None: ...
+ def __call__(self, r): ...
+
+class HTTPProxyAuth(HTTPBasicAuth):
+ def __call__(self, r): ...
+
+class HTTPDigestAuth(AuthBase):
+ username = ... # type: Any
+ password = ... # type: Any
+ last_nonce = ... # type: Any
+ nonce_count = ... # type: Any
+ chal = ... # type: Any
+ pos = ... # type: Any
+ num_401_calls = ... # type: Any
+ def __init__(self, username, password) -> None: ...
+ def build_digest_header(self, method, url): ...
+ def handle_redirect(self, r, **kwargs): ...
+ def handle_401(self, r, **kwargs): ...
+ def __call__(self, r): ...
diff --git a/typeshed/third_party/2/requests/compat.pyi b/typeshed/third_party/2/requests/compat.pyi
new file mode 100644
index 0000000..63b92f6
--- /dev/null
+++ b/typeshed/third_party/2/requests/compat.pyi
@@ -0,0 +1,6 @@
+# Stubs for requests.compat (Python 3.4)
+
+from typing import Any
+import collections
+
+OrderedDict = collections.OrderedDict
diff --git a/typeshed/third_party/2/requests/cookies.pyi b/typeshed/third_party/2/requests/cookies.pyi
new file mode 100644
index 0000000..6f56c82
--- /dev/null
+++ b/typeshed/third_party/2/requests/cookies.pyi
@@ -0,0 +1,61 @@
+# Stubs for requests.cookies (Python 3)
+
+from typing import Any, MutableMapping
+import collections
+from . import compat
+
+class MockRequest:
+ type = ... # type: Any
+ def __init__(self, request) -> None: ...
+ def get_type(self): ...
+ def get_host(self): ...
+ def get_origin_req_host(self): ...
+ def get_full_url(self): ...
+ def is_unverifiable(self): ...
+ def has_header(self, name): ...
+ def get_header(self, name, default=...): ...
+ def add_header(self, key, val): ...
+ def add_unredirected_header(self, name, value): ...
+ def get_new_headers(self): ...
+ @property
+ def unverifiable(self): ...
+ @property
+ def origin_req_host(self): ...
+ @property
+ def host(self): ...
+
+class MockResponse:
+ def __init__(self, headers) -> None: ...
+ def info(self): ...
+ def getheaders(self, name): ...
+
+def extract_cookies_to_jar(jar, request, response): ...
+def get_cookie_header(jar, request): ...
+def remove_cookie_by_name(cookiejar, name, domain=..., path=...): ...
+
+class CookieConflictError(RuntimeError): ...
+
+class RequestsCookieJar(MutableMapping):
+ def get(self, name, default=..., domain=..., path=...): ...
+ def set(self, name, value, **kwargs): ...
+ def iterkeys(self): ...
+ def keys(self): ...
+ def itervalues(self): ...
+ def values(self): ...
+ def iteritems(self): ...
+ def items(self): ...
+ def list_domains(self): ...
+ def list_paths(self): ...
+ def multiple_domains(self): ...
+ def get_dict(self, domain=..., path=...): ...
+ def __getitem__(self, name): ...
+ def __setitem__(self, name, value): ...
+ def __delitem__(self, name): ...
+ def set_cookie(self, cookie, *args, **kwargs): ...
+ def update(self, other): ...
+ def copy(self): ...
+
+def create_cookie(name, value, **kwargs): ...
+def morsel_to_cookie(morsel): ...
+def cookiejar_from_dict(cookie_dict, cookiejar=..., overwrite=...): ...
+def merge_cookies(cookiejar, cookies): ...
diff --git a/typeshed/third_party/2/requests/exceptions.pyi b/typeshed/third_party/2/requests/exceptions.pyi
new file mode 100644
index 0000000..ff0c328
--- /dev/null
+++ b/typeshed/third_party/2/requests/exceptions.pyi
@@ -0,0 +1,26 @@
+# Stubs for requests.exceptions (Python 3)
+
+from typing import Any
+from .packages.urllib3.exceptions import HTTPError as BaseHTTPError
+
+class RequestException(IOError):
+ response = ... # type: Any
+ request = ... # type: Any
+ def __init__(self, *args, **kwargs) -> None: ...
+
+class HTTPError(RequestException): ...
+class ConnectionError(RequestException): ...
+class ProxyError(ConnectionError): ...
+class SSLError(ConnectionError): ...
+class Timeout(RequestException): ...
+class ConnectTimeout(ConnectionError, Timeout): ...
+class ReadTimeout(Timeout): ...
+class URLRequired(RequestException): ...
+class TooManyRedirects(RequestException): ...
+class MissingSchema(RequestException, ValueError): ...
+class InvalidSchema(RequestException, ValueError): ...
+class InvalidURL(RequestException, ValueError): ...
+class ChunkedEncodingError(RequestException): ...
+class ContentDecodingError(RequestException, BaseHTTPError): ...
+class StreamConsumedError(RequestException, TypeError): ...
+class RetryError(RequestException): ...
diff --git a/typeshed/third_party/2/requests/hooks.pyi b/typeshed/third_party/2/requests/hooks.pyi
new file mode 100644
index 0000000..3367d9a
--- /dev/null
+++ b/typeshed/third_party/2/requests/hooks.pyi
@@ -0,0 +1,8 @@
+# Stubs for requests.hooks (Python 3)
+
+from typing import Any
+
+HOOKS = ... # type: Any
+
+def default_hooks(): ...
+def dispatch_hook(key, hooks, hook_data, **kwargs): ...
diff --git a/typeshed/third_party/2/requests/models.pyi b/typeshed/third_party/2/requests/models.pyi
new file mode 100644
index 0000000..a9f2b59
--- /dev/null
+++ b/typeshed/third_party/2/requests/models.pyi
@@ -0,0 +1,135 @@
+# Stubs for requests.models (Python 3)
+
+from typing import Any, List, MutableMapping, Iterator, Dict
+import datetime
+
+from . import hooks
+from . import structures
+from . import auth
+from . import cookies
+from .cookies import RequestsCookieJar
+from .packages.urllib3 import fields
+from .packages.urllib3 import filepost
+from .packages.urllib3 import util
+from .packages.urllib3 import exceptions as urllib3_exceptions
+from . import exceptions
+from . import utils
+from . import compat
+from . import status_codes
+
+from typing import Optional, Union
+
+default_hooks = hooks.default_hooks
+CaseInsensitiveDict = structures.CaseInsensitiveDict
+HTTPBasicAuth = auth.HTTPBasicAuth
+cookiejar_from_dict = cookies.cookiejar_from_dict
+get_cookie_header = cookies.get_cookie_header
+RequestField = fields.RequestField
+encode_multipart_formdata = filepost.encode_multipart_formdata
+DecodeError = urllib3_exceptions.DecodeError
+ReadTimeoutError = urllib3_exceptions.ReadTimeoutError
+ProtocolError = urllib3_exceptions.ProtocolError
+LocationParseError = urllib3_exceptions.LocationParseError
+HTTPError = exceptions.HTTPError
+MissingSchema = exceptions.MissingSchema
+InvalidURL = exceptions.InvalidURL
+ChunkedEncodingError = exceptions.ChunkedEncodingError
+ContentDecodingError = exceptions.ContentDecodingError
+ConnectionError = exceptions.ConnectionError
+StreamConsumedError = exceptions.StreamConsumedError
+guess_filename = utils.guess_filename
+get_auth_from_url = utils.get_auth_from_url
+requote_uri = utils.requote_uri
+stream_decode_response_unicode = utils.stream_decode_response_unicode
+to_key_val_list = utils.to_key_val_list
+parse_header_links = utils.parse_header_links
+iter_slices = utils.iter_slices
+guess_json_utf = utils.guess_json_utf
+super_len = utils.super_len
+to_native_string = utils.to_native_string
+codes = status_codes.codes
+
+REDIRECT_STATI = ... # type: Any
+DEFAULT_REDIRECT_LIMIT = ... # type: Any
+CONTENT_CHUNK_SIZE = ... # type: Any
+ITER_CHUNK_SIZE = ... # type: Any
+json_dumps = ... # type: Any
+
+class RequestEncodingMixin:
+ @property
+ def path_url(self): ...
+
+class RequestHooksMixin:
+ def register_hook(self, event, hook): ...
+ def deregister_hook(self, event, hook): ...
+
+class Request(RequestHooksMixin):
+ hooks = ... # type: Any
+ method = ... # type: Any
+ url = ... # type: Any
+ headers = ... # type: Any
+ files = ... # type: Any
+ data = ... # type: Any
+ json = ... # type: Any
+ params = ... # type: Any
+ auth = ... # type: Any
+ cookies = ... # type: Any
+ def __init__(self, method=..., url=..., headers=..., files=..., data=..., params=...,
+ auth=..., cookies=..., hooks=..., json=...): ...
+ def prepare(self): ...
+
+class PreparedRequest(RequestEncodingMixin, RequestHooksMixin):
+ method = ... # type: Optional[Union[str, unicode]]
+ url = ... # type: Optional[Union[str, unicode]]
+ headers = ... # type: CaseInsensitiveDict
+ body = ... # type: Optional[Union[str, unicode]]
+ hooks = ... # type: Any
+ def __init__(self) -> None: ...
+ def prepare(self, method=..., url=..., headers=..., files=..., data=..., params=...,
+ auth=..., cookies=..., hooks=..., json=...): ...
+ def copy(self): ...
+ def prepare_method(self, method): ...
+ def prepare_url(self, url, params): ...
+ def prepare_headers(self, headers): ...
+ def prepare_body(self, data, files, json=...): ...
+ def prepare_content_length(self, body): ...
+ def prepare_auth(self, auth, url=...): ...
+ def prepare_cookies(self, cookies): ...
+ def prepare_hooks(self, hooks): ...
+
+class Response:
+ __attrs__ = ... # type: Any
+ status_code = ... # type: int
+ headers = ... # type: MutableMapping[str, str]
+ raw = ... # type: Any
+ url = ... # type: str
+ encoding = ... # type: str
+ history = ... # type: List[Response]
+ reason = ... # type: str
+ cookies = ... # type: RequestsCookieJar
+ elapsed = ... # type: datetime.timedelta
+ request = ... # type: PreparedRequest
+ def __init__(self) -> None: ...
+ def __bool__(self) -> bool: ...
+ def __nonzero__(self) -> bool: ...
+ def __iter__(self) -> Iterator[str]: ...
+ @property
+ def ok(self) -> bool: ...
+ @property
+ def is_redirect(self) -> bool: ...
+ @property
+ def is_permanent_redirect(self) -> bool: ...
+ @property
+ def apparent_encoding(self) -> str: ...
+ def iter_content(self, chunk_size: int = ...,
+ decode_unicode: bool = ...) -> Iterator[Any]: ...
+ def iter_lines(self, chunk_size=..., decode_unicode=..., delimiter=...): ...
+ @property
+ def content(self) -> str: ...
+ @property
+ def text(self) -> str: ...
+ def json(self, **kwargs) -> Any: ...
+ @property
+ def links(self) -> Dict[Any, Any]: ...
+ def raise_for_status(self) -> None: ...
+ def close(self) -> None: ...
diff --git a/typeshed/third_party/2/requests/packages/__init__.pyi b/typeshed/third_party/2/requests/packages/__init__.pyi
new file mode 100644
index 0000000..2b1bff8
--- /dev/null
+++ b/typeshed/third_party/2/requests/packages/__init__.pyi
@@ -0,0 +1,8 @@
+# Stubs for requests.packages (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+class VendorAlias:
+ def __init__(self, package_names) -> None: ...
+ def find_module(self, fullname, path=...): ...
+ def load_module(self, name): ...
diff --git a/typeshed/third_party/2/requests/packages/urllib3/__init__.pyi b/typeshed/third_party/2/requests/packages/urllib3/__init__.pyi
new file mode 100644
index 0000000..38cf672
--- /dev/null
+++ b/typeshed/third_party/2/requests/packages/urllib3/__init__.pyi
@@ -0,0 +1,12 @@
+# Stubs for requests.packages.urllib3 (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+import logging
+
+class NullHandler(logging.Handler):
+ def emit(self, record): ...
+
+def add_stderr_logger(level=...): ...
+def disable_warnings(category=...): ...
diff --git a/typeshed/third_party/2/requests/packages/urllib3/_collections.pyi b/typeshed/third_party/2/requests/packages/urllib3/_collections.pyi
new file mode 100644
index 0000000..58aa944
--- /dev/null
+++ b/typeshed/third_party/2/requests/packages/urllib3/_collections.pyi
@@ -0,0 +1,51 @@
+# Stubs for requests.packages.urllib3._collections (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from collections import MutableMapping
+
+class RLock:
+ def __enter__(self): ...
+ def __exit__(self, exc_type, exc_value, traceback): ...
+
+class RecentlyUsedContainer(MutableMapping):
+ ContainerCls = ... # type: Any
+ dispose_func = ... # type: Any
+ lock = ... # type: Any
+ def __init__(self, maxsize=..., dispose_func=...) -> None: ...
+ def __getitem__(self, key): ...
+ def __setitem__(self, key, value): ...
+ def __delitem__(self, key): ...
+ def __len__(self): ...
+ def __iter__(self): ...
+ def clear(self): ...
+ def keys(self): ...
+
+class HTTPHeaderDict(dict):
+ def __init__(self, headers=..., **kwargs) -> None: ...
+ def __setitem__(self, key, val): ...
+ def __getitem__(self, key): ...
+ def __delitem__(self, key): ...
+ def __contains__(self, key): ...
+ def __eq__(self, other): ...
+ def __ne__(self, other): ...
+ values = ... # type: Any
+ get = ... # type: Any
+ update = ... # type: Any
+ iterkeys = ... # type: Any
+ itervalues = ... # type: Any
+ def pop(self, key, default=...): ...
+ def discard(self, key): ...
+ def add(self, key, val): ...
+ def extend(*args, **kwargs): ...
+ def getlist(self, key): ...
+ getheaders = ... # type: Any
+ getallmatchingheaders = ... # type: Any
+ iget = ... # type: Any
+ def copy(self): ...
+ def iteritems(self): ...
+ def itermerged(self): ...
+ def items(self): ...
+ @classmethod
+ def from_httplib(cls, message, duplicates=...): ...
diff --git a/typeshed/third_party/2/requests/packages/urllib3/connection.pyi b/typeshed/third_party/2/requests/packages/urllib3/connection.pyi
new file mode 100644
index 0000000..289fd18
--- /dev/null
+++ b/typeshed/third_party/2/requests/packages/urllib3/connection.pyi
@@ -0,0 +1,51 @@
+# Stubs for requests.packages.urllib3.connection (Python 3.4)
+
+from typing import Any
+from httplib import HTTPException
+from . import packages
+from . import exceptions
+from . import util
+
+class DummyConnection: ...
+
+ConnectTimeoutError = exceptions.ConnectTimeoutError
+SystemTimeWarning = exceptions.SystemTimeWarning
+SecurityWarning = exceptions.SecurityWarning
+
+port_by_scheme = ... # type: Any
+RECENT_DATE = ... # type: Any
+
+class HTTPConnection(object):
+ default_port = ... # type: Any
+ default_socket_options = ... # type: Any
+ is_verified = ... # type: Any
+ source_address = ... # type: Any
+ socket_options = ... # type: Any
+ def __init__(self, *args, **kw) -> None: ...
+ def connect(self): ...
+
+class HTTPSConnection(HTTPConnection):
+ default_port = ... # type: Any
+ key_file = ... # type: Any
+ cert_file = ... # type: Any
+ def __init__(self, host, port=..., key_file=..., cert_file=..., strict=..., timeout=..., **kw) -> None: ...
+ sock = ... # type: Any
+ def connect(self): ...
+
+class VerifiedHTTPSConnection(HTTPSConnection):
+ cert_reqs = ... # type: Any
+ ca_certs = ... # type: Any
+ ssl_version = ... # type: Any
+ assert_fingerprint = ... # type: Any
+ key_file = ... # type: Any
+ cert_file = ... # type: Any
+ assert_hostname = ... # type: Any
+ def set_cert(self, key_file=..., cert_file=..., cert_reqs=..., ca_certs=..., assert_hostname=..., assert_fingerprint=...): ...
+ sock = ... # type: Any
+ auto_open = ... # type: Any
+ is_verified = ... # type: Any
+ def connect(self): ...
+
+UnverifiedHTTPSConnection = ... # type: Any
+
+class ConnectionError(Exception): pass
diff --git a/typeshed/third_party/2/requests/packages/urllib3/connectionpool.pyi b/typeshed/third_party/2/requests/packages/urllib3/connectionpool.pyi
new file mode 100644
index 0000000..03c3140
--- /dev/null
+++ b/typeshed/third_party/2/requests/packages/urllib3/connectionpool.pyi
@@ -0,0 +1,87 @@
+# Stubs for requests.packages.urllib3.connectionpool (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from ssl import SSLError as BaseSSLError
+from . import exceptions
+from .packages import ssl_match_hostname
+from . import packages
+from . import connection
+from . import request
+from . import response
+from .util import connection as _connection
+from .util import retry
+from .util import timeout
+from .util import url
+
+ClosedPoolError = exceptions.ClosedPoolError
+ProtocolError = exceptions.ProtocolError
+EmptyPoolError = exceptions.EmptyPoolError
+HostChangedError = exceptions.HostChangedError
+LocationValueError = exceptions.LocationValueError
+MaxRetryError = exceptions.MaxRetryError
+ProxyError = exceptions.ProxyError
+ReadTimeoutError = exceptions.ReadTimeoutError
+SSLError = exceptions.SSLError
+TimeoutError = exceptions.TimeoutError
+InsecureRequestWarning = exceptions.InsecureRequestWarning
+CertificateError = ssl_match_hostname.CertificateError
+port_by_scheme = connection.port_by_scheme
+DummyConnection = connection.DummyConnection
+HTTPConnection = connection.HTTPConnection
+HTTPSConnection = connection.HTTPSConnection
+VerifiedHTTPSConnection = connection.VerifiedHTTPSConnection
+HTTPException = connection.HTTPException
+ConnectionError = connection.ConnectionError
+RequestMethods = request.RequestMethods
+HTTPResponse = response.HTTPResponse
+is_connection_dropped = _connection.is_connection_dropped
+Retry = retry.Retry
+Timeout = timeout.Timeout
+get_host = url.get_host
+
+xrange = ... # type: Any
+log = ... # type: Any
+
+class ConnectionPool:
+ scheme = ... # type: Any
+ QueueCls = ... # type: Any
+ host = ... # type: Any
+ port = ... # type: Any
+ def __init__(self, host, port=...) -> None: ...
+ def __enter__(self): ...
+ def __exit__(self, exc_type, exc_val, exc_tb): ...
+ def close(self): ...
+
+class HTTPConnectionPool(ConnectionPool, RequestMethods):
+ scheme = ... # type: Any
+ ConnectionCls = ... # type: Any
+ strict = ... # type: Any
+ timeout = ... # type: Any
+ retries = ... # type: Any
+ pool = ... # type: Any
+ block = ... # type: Any
+ proxy = ... # type: Any
+ proxy_headers = ... # type: Any
+ num_connections = ... # type: Any
+ num_requests = ... # type: Any
+ conn_kw = ... # type: Any
+ def __init__(self, host, port=..., strict=..., timeout=..., maxsize=..., block=..., headers=..., retries=..., _proxy=..., _proxy_headers=..., **conn_kw) -> None: ...
+ def close(self): ...
+ def is_same_host(self, url): ...
+ def urlopen(self, method, url, body=..., headers=..., retries=..., redirect=..., assert_same_host=..., timeout=..., pool_timeout=..., release_conn=..., **response_kw): ...
+
+class HTTPSConnectionPool(HTTPConnectionPool):
+ scheme = ... # type: Any
+ ConnectionCls = ... # type: Any
+ key_file = ... # type: Any
+ cert_file = ... # type: Any
+ cert_reqs = ... # type: Any
+ ca_certs = ... # type: Any
+ ssl_version = ... # type: Any
+ assert_hostname = ... # type: Any
+ assert_fingerprint = ... # type: Any
+ def __init__(self, host, port=..., strict=..., timeout=..., maxsize=..., block=..., headers=..., retries=..., _proxy=..., _proxy_headers=..., key_file=..., cert_file=..., cert_reqs=..., ca_certs=..., ssl_version=..., assert_hostname=..., assert_fingerprint=..., **conn_kw) -> None: ...
+
+def connection_from_url(url, **kw): ...
diff --git a/typeshed/third_party/2/requests/packages/urllib3/contrib/__init__.pyi b/typeshed/third_party/2/requests/packages/urllib3/contrib/__init__.pyi
new file mode 100644
index 0000000..69e47f7
--- /dev/null
+++ b/typeshed/third_party/2/requests/packages/urllib3/contrib/__init__.pyi
@@ -0,0 +1,3 @@
+# Stubs for requests.packages.urllib3.contrib (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
diff --git a/typeshed/third_party/2/requests/packages/urllib3/exceptions.pyi b/typeshed/third_party/2/requests/packages/urllib3/exceptions.pyi
new file mode 100644
index 0000000..3e7d0f6
--- /dev/null
+++ b/typeshed/third_party/2/requests/packages/urllib3/exceptions.pyi
@@ -0,0 +1,54 @@
+# Stubs for requests.packages.urllib3.exceptions (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class HTTPError(Exception): ...
+class HTTPWarning(Warning): ...
+
+class PoolError(HTTPError):
+ pool = ... # type: Any
+ def __init__(self, pool, message) -> None: ...
+ def __reduce__(self): ...
+
+class RequestError(PoolError):
+ url = ... # type: Any
+ def __init__(self, pool, url, message) -> None: ...
+ def __reduce__(self): ...
+
+class SSLError(HTTPError): ...
+class ProxyError(HTTPError): ...
+class DecodeError(HTTPError): ...
+class ProtocolError(HTTPError): ...
+
+ConnectionError = ... # type: Any
+
+class MaxRetryError(RequestError):
+ reason = ... # type: Any
+ def __init__(self, pool, url, reason=...) -> None: ...
+
+class HostChangedError(RequestError):
+ retries = ... # type: Any
+ def __init__(self, pool, url, retries=...) -> None: ...
+
+class TimeoutStateError(HTTPError): ...
+class TimeoutError(HTTPError): ...
+class ReadTimeoutError(TimeoutError, RequestError): ...
+class ConnectTimeoutError(TimeoutError): ...
+class EmptyPoolError(PoolError): ...
+class ClosedPoolError(PoolError): ...
+class LocationValueError(ValueError, HTTPError): ...
+
+class LocationParseError(LocationValueError):
+ location = ... # type: Any
+ def __init__(self, location) -> None: ...
+
+class ResponseError(HTTPError):
+ GENERIC_ERROR = ... # type: Any
+ SPECIFIC_ERROR = ... # type: Any
+
+class SecurityWarning(HTTPWarning): ...
+class InsecureRequestWarning(SecurityWarning): ...
+class SystemTimeWarning(SecurityWarning): ...
+class InsecurePlatformWarning(SecurityWarning): ...
diff --git a/typeshed/third_party/2/requests/packages/urllib3/fields.pyi b/typeshed/third_party/2/requests/packages/urllib3/fields.pyi
new file mode 100644
index 0000000..cdc7734
--- /dev/null
+++ b/typeshed/third_party/2/requests/packages/urllib3/fields.pyi
@@ -0,0 +1,16 @@
+# Stubs for requests.packages.urllib3.fields (Python 3.4)
+
+from typing import Any
+from . import packages
+
+def guess_content_type(filename, default=...): ...
+def format_header_param(name, value): ...
+
+class RequestField:
+ data = ... # type: Any
+ headers = ... # type: Any
+ def __init__(self, name, data, filename=..., headers=...) -> None: ...
+ @classmethod
+ def from_tuples(cls, fieldname, value): ...
+ def render_headers(self): ...
+ def make_multipart(self, content_disposition=..., content_type=..., content_location=...): ...
diff --git a/typeshed/third_party/2/requests/packages/urllib3/filepost.pyi b/typeshed/third_party/2/requests/packages/urllib3/filepost.pyi
new file mode 100644
index 0000000..f1ce517
--- /dev/null
+++ b/typeshed/third_party/2/requests/packages/urllib3/filepost.pyi
@@ -0,0 +1,19 @@
+# Stubs for requests.packages.urllib3.filepost (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from . import packages
+# from .packages import six
+from . import fields
+
+# six = packages.six
+# b = six.b
+RequestField = fields.RequestField
+
+writer = ... # type: Any
+
+def choose_boundary(): ...
+def iter_field_objects(fields): ...
+def iter_fields(fields): ...
+def encode_multipart_formdata(fields, boundary=...): ...
diff --git a/typeshed/third_party/2/requests/packages/urllib3/packages/__init__.pyi b/typeshed/third_party/2/requests/packages/urllib3/packages/__init__.pyi
new file mode 100644
index 0000000..67507f9
--- /dev/null
+++ b/typeshed/third_party/2/requests/packages/urllib3/packages/__init__.pyi
@@ -0,0 +1,3 @@
+# Stubs for requests.packages.urllib3.packages (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
diff --git a/typeshed/third_party/2/requests/packages/urllib3/packages/ssl_match_hostname/__init__.pyi b/typeshed/third_party/2/requests/packages/urllib3/packages/ssl_match_hostname/__init__.pyi
new file mode 100644
index 0000000..05c03dc
--- /dev/null
+++ b/typeshed/third_party/2/requests/packages/urllib3/packages/ssl_match_hostname/__init__.pyi
@@ -0,0 +1 @@
+class CertificateError(ValueError): pass
diff --git a/typeshed/third_party/2/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.pyi b/typeshed/third_party/2/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.pyi
new file mode 100644
index 0000000..5abbc9d
--- /dev/null
+++ b/typeshed/third_party/2/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.pyi
@@ -0,0 +1,7 @@
+# Stubs for requests.packages.urllib3.packages.ssl_match_hostname._implementation (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+class CertificateError(ValueError): ...
+
+def match_hostname(cert, hostname): ...
diff --git a/typeshed/third_party/2/requests/packages/urllib3/poolmanager.pyi b/typeshed/third_party/2/requests/packages/urllib3/poolmanager.pyi
new file mode 100644
index 0000000..a65f664
--- /dev/null
+++ b/typeshed/third_party/2/requests/packages/urllib3/poolmanager.pyi
@@ -0,0 +1,31 @@
+# Stubs for requests.packages.urllib3.poolmanager (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from .request import RequestMethods
+
+class PoolManager(RequestMethods):
+ proxy = ... # type: Any
+ connection_pool_kw = ... # type: Any
+ pools = ... # type: Any
+ def __init__(self, num_pools=..., headers=..., **connection_pool_kw) -> None: ...
+ def __enter__(self): ...
+ def __exit__(self, exc_type, exc_val, exc_tb): ...
+ def clear(self): ...
+ def connection_from_host(self, host, port=..., scheme=...): ...
+ def connection_from_url(self, url): ...
+ # TODO: This was the original signature -- copied another one from base class to fix complaint.
+ # def urlopen(self, method, url, redirect=True, **kw): ...
+ def urlopen(self, method, url, body=..., headers=..., encode_multipart=..., multipart_boundary=..., **kw): ...
+
+class ProxyManager(PoolManager):
+ proxy = ... # type: Any
+ proxy_headers = ... # type: Any
+ def __init__(self, proxy_url, num_pools=..., headers=..., proxy_headers=..., **connection_pool_kw) -> None: ...
+ def connection_from_host(self, host, port=..., scheme=...): ...
+ # TODO: This was the original signature -- copied another one from base class to fix complaint.
+ # def urlopen(self, method, url, redirect=True, **kw): ...
+ def urlopen(self, method, url, body=..., headers=..., encode_multipart=..., multipart_boundary=..., **kw): ...
+
+def proxy_from_url(url, **kw): ...
diff --git a/typeshed/third_party/2/requests/packages/urllib3/request.pyi b/typeshed/third_party/2/requests/packages/urllib3/request.pyi
new file mode 100644
index 0000000..788c759
--- /dev/null
+++ b/typeshed/third_party/2/requests/packages/urllib3/request.pyi
@@ -0,0 +1,13 @@
+# Stubs for requests.packages.urllib3.request (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class RequestMethods:
+ headers = ... # type: Any
+ def __init__(self, headers=...) -> None: ...
+ def urlopen(self, method, url, body=..., headers=..., encode_multipart=..., multipart_boundary=..., **kw): ...
+ def request(self, method, url, fields=..., headers=..., **urlopen_kw): ...
+ def request_encode_url(self, method, url, fields=..., **urlopen_kw): ...
+ def request_encode_body(self, method, url, fields=..., headers=..., encode_multipart=..., multipart_boundary=..., **urlopen_kw): ...
diff --git a/typeshed/third_party/2/requests/packages/urllib3/response.pyi b/typeshed/third_party/2/requests/packages/urllib3/response.pyi
new file mode 100644
index 0000000..9e310d2
--- /dev/null
+++ b/typeshed/third_party/2/requests/packages/urllib3/response.pyi
@@ -0,0 +1,58 @@
+# Stubs for requests.packages.urllib3.response (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, IO
+import io
+from . import _collections
+from . import exceptions
+# from .packages import six
+from . import connection
+from .util import response
+
+HTTPHeaderDict = _collections.HTTPHeaderDict
+ProtocolError = exceptions.ProtocolError
+DecodeError = exceptions.DecodeError
+ReadTimeoutError = exceptions.ReadTimeoutError
+binary_type = str # six.binary_type
+PY3 = True # six.PY3
+is_fp_closed = response.is_fp_closed
+
+class DeflateDecoder:
+ def __init__(self) -> None: ...
+ def __getattr__(self, name): ...
+ def decompress(self, data): ...
+
+class GzipDecoder:
+ def __init__(self) -> None: ...
+ def __getattr__(self, name): ...
+ def decompress(self, data): ...
+
+class HTTPResponse(IO[Any]):
+ CONTENT_DECODERS = ... # type: Any
+ REDIRECT_STATUSES = ... # type: Any
+ headers = ... # type: Any
+ status = ... # type: Any
+ version = ... # type: Any
+ reason = ... # type: Any
+ strict = ... # type: Any
+ decode_content = ... # type: Any
+ def __init__(self, body=..., headers=..., status=..., version=..., reason=..., strict=..., preload_content=..., decode_content=..., original_response=..., pool=..., connection=...) -> None: ...
+ def get_redirect_location(self): ...
+ def release_conn(self): ...
+ @property
+ def data(self): ...
+ def tell(self): ...
+ def read(self, amt=..., decode_content=..., cache_content=...): ...
+ def stream(self, amt=..., decode_content=...): ...
+ @classmethod
+ def from_httplib(ResponseCls, r, **response_kw): ...
+ def getheaders(self): ...
+ def getheader(self, name, default=...): ...
+ def close(self): ...
+ @property
+ def closed(self): ...
+ def fileno(self): ...
+ def flush(self): ...
+ def readable(self): ...
+ def readinto(self, b): ...
diff --git a/typeshed/third_party/2/requests/packages/urllib3/util/__init__.pyi b/typeshed/third_party/2/requests/packages/urllib3/util/__init__.pyi
new file mode 100644
index 0000000..0a2c9ba
--- /dev/null
+++ b/typeshed/third_party/2/requests/packages/urllib3/util/__init__.pyi
@@ -0,0 +1,6 @@
+# Stubs for requests.packages.urllib3.util (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from . import connection
+from . import request
diff --git a/typeshed/third_party/2/requests/packages/urllib3/util/connection.pyi b/typeshed/third_party/2/requests/packages/urllib3/util/connection.pyi
new file mode 100644
index 0000000..cd67309
--- /dev/null
+++ b/typeshed/third_party/2/requests/packages/urllib3/util/connection.pyi
@@ -0,0 +1,11 @@
+# Stubs for requests.packages.urllib3.util.connection (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+poll = ... # type: Any
+select = ... # type: Any
+
+def is_connection_dropped(conn): ...
+def create_connection(address, timeout=..., source_address=..., socket_options=...): ...
diff --git a/typeshed/third_party/2/requests/packages/urllib3/util/request.pyi b/typeshed/third_party/2/requests/packages/urllib3/util/request.pyi
new file mode 100644
index 0000000..0be64df
--- /dev/null
+++ b/typeshed/third_party/2/requests/packages/urllib3/util/request.pyi
@@ -0,0 +1,12 @@
+# Stubs for requests.packages.urllib3.util.request (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+# from ..packages import six
+
+# b = six.b
+
+ACCEPT_ENCODING = ... # type: Any
+
+def make_headers(keep_alive=..., accept_encoding=..., user_agent=..., basic_auth=..., proxy_basic_auth=..., disable_cache=...): ...
diff --git a/typeshed/third_party/2/requests/packages/urllib3/util/response.pyi b/typeshed/third_party/2/requests/packages/urllib3/util/response.pyi
new file mode 100644
index 0000000..761a006
--- /dev/null
+++ b/typeshed/third_party/2/requests/packages/urllib3/util/response.pyi
@@ -0,0 +1,5 @@
+# Stubs for requests.packages.urllib3.util.response (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+def is_fp_closed(obj): ...
diff --git a/typeshed/third_party/2/requests/packages/urllib3/util/retry.pyi b/typeshed/third_party/2/requests/packages/urllib3/util/retry.pyi
new file mode 100644
index 0000000..e958d90
--- /dev/null
+++ b/typeshed/third_party/2/requests/packages/urllib3/util/retry.pyi
@@ -0,0 +1,36 @@
+# Stubs for requests.packages.urllib3.util.retry (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from .. import exceptions
+from .. import packages
+
+ConnectTimeoutError = exceptions.ConnectTimeoutError
+MaxRetryError = exceptions.MaxRetryError
+ProtocolError = exceptions.ProtocolError
+ReadTimeoutError = exceptions.ReadTimeoutError
+ResponseError = exceptions.ResponseError
+
+log = ... # type: Any
+
+class Retry:
+ DEFAULT_METHOD_WHITELIST = ... # type: Any
+ BACKOFF_MAX = ... # type: Any
+ total = ... # type: Any
+ connect = ... # type: Any
+ read = ... # type: Any
+ redirect = ... # type: Any
+ status_forcelist = ... # type: Any
+ method_whitelist = ... # type: Any
+ backoff_factor = ... # type: Any
+ raise_on_redirect = ... # type: Any
+ def __init__(self, total=..., connect=..., read=..., redirect=..., method_whitelist=..., status_forcelist=..., backoff_factor=..., raise_on_redirect=..., _observed_errors=...) -> None: ...
+ def new(self, **kw): ...
+ @classmethod
+ def from_int(cls, retries, redirect=..., default=...): ...
+ def get_backoff_time(self): ...
+ def sleep(self): ...
+ def is_forced_retry(self, method, status_code): ...
+ def is_exhausted(self): ...
+ def increment(self, method=..., url=..., response=..., error=..., _pool=..., _stacktrace=...): ...
diff --git a/typeshed/third_party/2/requests/packages/urllib3/util/timeout.pyi b/typeshed/third_party/2/requests/packages/urllib3/util/timeout.pyi
new file mode 100644
index 0000000..0a7653c
--- /dev/null
+++ b/typeshed/third_party/2/requests/packages/urllib3/util/timeout.pyi
@@ -0,0 +1,24 @@
+# Stubs for requests.packages.urllib3.util.timeout (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from .. import exceptions
+
+TimeoutStateError = exceptions.TimeoutStateError
+
+def current_time(): ...
+
+class Timeout:
+ DEFAULT_TIMEOUT = ... # type: Any
+ total = ... # type: Any
+ def __init__(self, total=..., connect=..., read=...) -> None: ...
+ @classmethod
+ def from_float(cls, timeout): ...
+ def clone(self): ...
+ def start_connect(self): ...
+ def get_connect_duration(self): ...
+ @property
+ def connect_timeout(self): ...
+ @property
+ def read_timeout(self): ...
diff --git a/typeshed/third_party/2/requests/packages/urllib3/util/url.pyi b/typeshed/third_party/2/requests/packages/urllib3/util/url.pyi
new file mode 100644
index 0000000..9877b4a
--- /dev/null
+++ b/typeshed/third_party/2/requests/packages/urllib3/util/url.pyi
@@ -0,0 +1,26 @@
+# Stubs for requests.packages.urllib3.util.url (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from .. import exceptions
+
+LocationParseError = exceptions.LocationParseError
+
+url_attrs = ... # type: Any
+
+class Url:
+ slots = ... # type: Any
+ def __new__(cls, scheme=..., auth=..., host=..., port=..., path=..., query=..., fragment=...): ...
+ @property
+ def hostname(self): ...
+ @property
+ def request_uri(self): ...
+ @property
+ def netloc(self): ...
+ @property
+ def url(self): ...
+
+def split_first(s, delims): ...
+def parse_url(url): ...
+def get_host(url): ...
diff --git a/typeshed/third_party/2/requests/sessions.pyi b/typeshed/third_party/2/requests/sessions.pyi
new file mode 100644
index 0000000..9cc60d2
--- /dev/null
+++ b/typeshed/third_party/2/requests/sessions.pyi
@@ -0,0 +1,106 @@
+# Stubs for requests.sessions (Python 2.7)
+
+from typing import Any, Union, MutableMapping, Text, Optional, IO, Tuple, Callable
+from . import adapters
+from . import auth
+from . import compat
+from . import cookies
+from . import models
+from .models import Response
+from . import hooks
+from . import utils
+from . import exceptions
+from .packages.urllib3 import _collections
+from . import structures
+from . import adapters
+from . import status_codes
+
+BaseAdapter = adapters.BaseAdapter
+OrderedDict = compat.OrderedDict
+cookiejar_from_dict = cookies.cookiejar_from_dict
+extract_cookies_to_jar = cookies.extract_cookies_to_jar
+RequestsCookieJar = cookies.RequestsCookieJar
+merge_cookies = cookies.merge_cookies
+Request = models.Request
+PreparedRequest = models.PreparedRequest
+DEFAULT_REDIRECT_LIMIT = models.DEFAULT_REDIRECT_LIMIT
+default_hooks = hooks.default_hooks
+dispatch_hook = hooks.dispatch_hook
+to_key_val_list = utils.to_key_val_list
+default_headers = utils.default_headers
+to_native_string = utils.to_native_string
+TooManyRedirects = exceptions.TooManyRedirects
+InvalidSchema = exceptions.InvalidSchema
+ChunkedEncodingError = exceptions.ChunkedEncodingError
+ContentDecodingError = exceptions.ContentDecodingError
+RecentlyUsedContainer = _collections.RecentlyUsedContainer
+CaseInsensitiveDict = structures.CaseInsensitiveDict
+HTTPAdapter = adapters.HTTPAdapter
+requote_uri = utils.requote_uri
+get_environ_proxies = utils.get_environ_proxies
+get_netrc_auth = utils.get_netrc_auth
+should_bypass_proxies = utils.should_bypass_proxies
+get_auth_from_url = utils.get_auth_from_url
+codes = status_codes.codes
+REDIRECT_STATI = models.REDIRECT_STATI
+
+REDIRECT_CACHE_SIZE = ... # type: Any
+
+def merge_setting(request_setting, session_setting, dict_class=...): ...
+def merge_hooks(request_hooks, session_hooks, dict_class=...): ...
+
+class SessionRedirectMixin:
+ def resolve_redirects(self, resp, req, stream=..., timeout=..., verify=..., cert=...,
+ proxies=...): ...
+ def rebuild_auth(self, prepared_request, response): ...
+ def rebuild_proxies(self, prepared_request, proxies): ...
+
+class Session(SessionRedirectMixin):
+ __attrs__ = ... # type: Any
+ headers = ... # type: Optional[MutableMapping[Text, Text]]
+ auth = ... # type: Union[None, Tuple[Text, Text], Callable[[Request], Request]]
+ proxies = ... # type: Optional[MutableMapping[Text, Text]]
+ hooks = ... # type: Optional[MutableMapping[Text, Callable[[Request], Any]]]
+ params = ... # type: Union[None, bytes, MutableMapping[Text, Text]]
+ stream = ... # type: bool
+ verify = ... # type: bool
+ cert = ... # type: Union[None, Text, Tuple[Text, Text]]
+ max_redirects = ... # type: int
+ trust_env = ... # type: bool
+ cookies = ... # type: Union[None, RequestsCookieJar, MutableMapping[Text, Text]]
+ adapters = ... # type: MutableMapping
+ redirect_cache = ... # type: RecentlyUsedContainer
+ def __init__(self) -> None: ...
+ def __enter__(self) -> 'Session': ...
+ def __exit__(self, *args) -> None: ...
+ def prepare_request(self, request): ...
+ def request(self, method: str, url: str,
+ params, # type: Union[None, bytes, MutableMapping[Text, Text]]
+ data, # type: Union[None, bytes, MutableMapping[Text, Text], IO]
+ headers, # type: Optional[MutableMapping[Text, Text]]
+ cookies, # type: Union[None, RequestsCookieJar, MutableMapping[Text, Text]]
+ files, # type: Optional[MutableMapping[Text, IO]]
+ auth, # type: Union[None, Tuple[Text, Text], Callable[[Request], Request]]
+ timeout, # type: Union[None, float, Tuple[float, float]]
+ allow_redirects, # type: Optional[bool]
+ proxies, # type: Optional[MutableMapping[Text, Text]]
+ hooks, # type: Optional[MutableMapping[Text, Callable[[Request], Any]]]
+ stream, # type: Optional[bool]
+ verify, # type: Optional[bool]
+ cert, # type: Union[Text, Tuple[Text, Text], None]
+ json # type: Optional[MutableMapping]
+ ) -> Response: ...
+ def get(self, url: str, **kwargs) -> Response: ...
+ def options(self, url: str, **kwargs) -> Response: ...
+ def head(self, url: str, **kwargs) -> Response: ...
+ def post(self, url: str, data=..., json=..., **kwargs) -> Response: ...
+ def put(self, url: str, data=..., **kwargs) -> Response: ...
+ def patch(self, url: str, data=..., **kwargs) -> Response: ...
+ def delete(self, url: str, **kwargs) -> Response: ...
+ def send(self, request, **kwargs): ...
+ def merge_environment_settings(self, url, proxies, stream, verify, cert): ...
+ def get_adapter(self, url): ...
+ def close(self) -> None: ...
+ def mount(self, prefix: str, adapter: BaseAdapter) -> None: ...
+
+def session() -> Session: ...
diff --git a/typeshed/third_party/2/requests/status_codes.pyi b/typeshed/third_party/2/requests/status_codes.pyi
new file mode 100644
index 0000000..e3035eb
--- /dev/null
+++ b/typeshed/third_party/2/requests/status_codes.pyi
@@ -0,0 +1,8 @@
+# Stubs for requests.status_codes (Python 3)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from .structures import LookupDict
+
+codes = ... # type: Any
diff --git a/typeshed/third_party/2/requests/structures.pyi b/typeshed/third_party/2/requests/structures.pyi
new file mode 100644
index 0000000..a7f77b2
--- /dev/null
+++ b/typeshed/third_party/2/requests/structures.pyi
@@ -0,0 +1,12 @@
+# Stubs for requests.structures (Python 3)
+
+from typing import Any, Iterator, MutableMapping, Tuple, Union
+
+class CaseInsensitiveDict(MutableMapping[str, Union[str, unicode]]):
+ def lower_items(self) -> Iterator[Tuple[str, Union[str, unicode]]]: ...
+
+class LookupDict(dict):
+ name = ... # type: Any
+ def __init__(self, name=...) -> None: ...
+ def __getitem__(self, key): ...
+ def get(self, key, default=...): ...
diff --git a/typeshed/third_party/2/requests/utils.pyi b/typeshed/third_party/2/requests/utils.pyi
new file mode 100644
index 0000000..945277a
--- /dev/null
+++ b/typeshed/third_party/2/requests/utils.pyi
@@ -0,0 +1,52 @@
+# Stubs for requests.utils (Python 3)
+
+from typing import Any
+from . import compat
+from . import cookies
+from . import structures
+from . import exceptions
+
+OrderedDict = compat.OrderedDict
+RequestsCookieJar = cookies.RequestsCookieJar
+cookiejar_from_dict = cookies.cookiejar_from_dict
+CaseInsensitiveDict = structures.CaseInsensitiveDict
+InvalidURL = exceptions.InvalidURL
+
+NETRC_FILES = ... # type: Any
+DEFAULT_CA_BUNDLE_PATH = ... # type: Any
+
+def dict_to_sequence(d): ...
+def super_len(o): ...
+def get_netrc_auth(url): ...
+def guess_filename(obj): ...
+def from_key_val_list(value): ...
+def to_key_val_list(value): ...
+def parse_list_header(value): ...
+def parse_dict_header(value): ...
+def unquote_header_value(value, is_filename=...): ...
+def dict_from_cookiejar(cj): ...
+def add_dict_to_cookiejar(cj, cookie_dict): ...
+def get_encodings_from_content(content): ...
+def get_encoding_from_headers(headers): ...
+def stream_decode_response_unicode(iterator, r): ...
+def iter_slices(string, slice_length): ...
+def get_unicode_from_response(r): ...
+
+UNRESERVED_SET = ... # type: Any
+
+def unquote_unreserved(uri): ...
+def requote_uri(uri): ...
+def address_in_network(ip, net): ...
+def dotted_netmask(mask): ...
+def is_ipv4_address(string_ip): ...
+def is_valid_cidr(string_network): ...
+def should_bypass_proxies(url): ...
+def get_environ_proxies(url): ...
+def default_user_agent(name=...): ...
+def default_headers(): ...
+def parse_header_links(value): ...
+def guess_json_utf(data): ...
+def prepend_scheme_if_needed(url, new_scheme): ...
+def get_auth_from_url(url): ...
+def to_native_string(string, encoding=...): ...
+def urldefragauth(url): ...
diff --git a/typeshed/third_party/2/routes/__init__.pyi b/typeshed/third_party/2/routes/__init__.pyi
new file mode 100644
index 0000000..5d7864d
--- /dev/null
+++ b/typeshed/third_party/2/routes/__init__.pyi
@@ -0,0 +1,19 @@
+# Stubs for routes (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from . import mapper
+from . import util
+
+class _RequestConfig:
+ def __getattr__(self, name): ...
+ def __setattr__(self, name, value): ...
+ def __delattr__(self, name): ...
+ def load_wsgi_environ(self, environ): ...
+
+def request_config(original=...): ...
+
+Mapper = mapper.Mapper
+redirect_to = util.redirect_to
+url_for = util.url_for
+URLGenerator = util.URLGenerator
diff --git a/typeshed/third_party/2/routes/mapper.pyi b/typeshed/third_party/2/routes/mapper.pyi
new file mode 100644
index 0000000..573a2ef
--- /dev/null
+++ b/typeshed/third_party/2/routes/mapper.pyi
@@ -0,0 +1,70 @@
+# Stubs for routes.mapper (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+COLLECTION_ACTIONS = ... # type: Any
+MEMBER_ACTIONS = ... # type: Any
+
+def strip_slashes(name): ...
+
+class SubMapperParent:
+ def submapper(self, **kargs): ...
+ def collection(self, collection_name, resource_name, path_prefix=..., member_prefix=..., controller=..., collection_actions=..., member_actions=..., member_options=..., **kwargs): ...
+
+class SubMapper(SubMapperParent):
+ kwargs = ... # type: Any
+ obj = ... # type: Any
+ collection_name = ... # type: Any
+ member = ... # type: Any
+ resource_name = ... # type: Any
+ formatted = ... # type: Any
+ def __init__(self, obj, resource_name=..., collection_name=..., actions=..., formatted=..., **kwargs) -> None: ...
+ def connect(self, *args, **kwargs): ...
+ def link(self, rel=..., name=..., action=..., method=..., formatted=..., **kwargs): ...
+ def new(self, **kwargs): ...
+ def edit(self, **kwargs): ...
+ def action(self, name=..., action=..., method=..., formatted=..., **kwargs): ...
+ def index(self, name=..., **kwargs): ...
+ def show(self, name=..., **kwargs): ...
+ def create(self, **kwargs): ...
+ def update(self, **kwargs): ...
+ def delete(self, **kwargs): ...
+ def add_actions(self, actions): ...
+ def __enter__(self): ...
+ def __exit__(self, type, value, tb): ...
+
+class Mapper(SubMapperParent):
+ matchlist = ... # type: Any
+ maxkeys = ... # type: Any
+ minkeys = ... # type: Any
+ urlcache = ... # type: Any
+ prefix = ... # type: Any
+ req_data = ... # type: Any
+ directory = ... # type: Any
+ always_scan = ... # type: Any
+ controller_scan = ... # type: Any
+ debug = ... # type: Any
+ append_slash = ... # type: Any
+ sub_domains = ... # type: Any
+ sub_domains_ignore = ... # type: Any
+ domain_match = ... # type: Any
+ explicit = ... # type: Any
+ encoding = ... # type: Any
+ decode_errors = ... # type: Any
+ hardcode_names = ... # type: Any
+ minimization = ... # type: Any
+ create_regs_lock = ... # type: Any
+ def __init__(self, controller_scan=..., directory=..., always_scan=..., register=..., explicit=...) -> None: ...
+ environ = ... # type: Any
+ def extend(self, routes, path_prefix=...): ...
+ def make_route(self, *args, **kargs): ...
+ def connect(self, *args, **kargs): ...
+ def create_regs(self, *args, **kwargs): ...
+ def match(self, url=..., environ=...): ...
+ def routematch(self, url=..., environ=...): ...
+ obj = ... # type: Any
+ def generate(self, *args, **kargs): ...
+ def resource(self, member_name, collection_name, **kwargs): ...
+ def redirect(self, match_path, destination_path, *args, **kwargs): ...
diff --git a/typeshed/third_party/2/routes/util.pyi b/typeshed/third_party/2/routes/util.pyi
new file mode 100644
index 0000000..e5210e3
--- /dev/null
+++ b/typeshed/third_party/2/routes/util.pyi
@@ -0,0 +1,24 @@
+# Stubs for routes.util (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class RoutesException(Exception): ...
+class MatchException(RoutesException): ...
+class GenerationException(RoutesException): ...
+
+def url_for(*args, **kargs): ...
+
+class URLGenerator:
+ mapper = ... # type: Any
+ environ = ... # type: Any
+ def __init__(self, mapper, environ) -> None: ...
+ def __call__(self, *args, **kargs): ...
+ def current(self, *args, **kwargs): ...
+
+def redirect_to(*args, **kargs): ...
+def cache_hostinfo(environ): ...
+def controller_scan(directory=...): ...
+def as_unicode(value, encoding, errors=...): ...
+def ascii_characters(string): ...
diff --git a/mypy/test/__init__.py b/typeshed/third_party/2/scribe/__init__.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/third_party/2/scribe/__init__.pyi
diff --git a/typeshed/third_party/2/scribe/scribe.pyi b/typeshed/third_party/2/scribe/scribe.pyi
new file mode 100644
index 0000000..ec2a71f
--- /dev/null
+++ b/typeshed/third_party/2/scribe/scribe.pyi
@@ -0,0 +1,43 @@
+# Stubs for scribe.scribe (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+import fb303.FacebookService
+from .ttypes import * # noqa: F403
+from thrift.Thrift import TProcessor
+
+class Iface(fb303.FacebookService.Iface):
+ def Log(self, messages): ...
+
+class Client(fb303.FacebookService.Client, Iface):
+ def __init__(self, iprot, oprot=...) -> None: ...
+ def Log(self, messages): ...
+ def send_Log(self, messages): ...
+ def recv_Log(self): ...
+
+class Processor(fb303.FacebookService.Processor, Iface, TProcessor):
+ def __init__(self, handler) -> None: ...
+ def process(self, iprot, oprot): ...
+ def process_Log(self, seqid, iprot, oprot): ...
+
+class Log_args:
+ thrift_spec = ... # type: Any
+ messages = ... # type: Any
+ def __init__(self, messages=...) -> None: ...
+ def read(self, iprot): ...
+ def write(self, oprot): ...
+ def validate(self): ...
+ def __eq__(self, other): ...
+ def __ne__(self, other): ...
+
+class Log_result:
+ thrift_spec = ... # type: Any
+ success = ... # type: Any
+ def __init__(self, success=...) -> None: ...
+ def read(self, iprot): ...
+ def write(self, oprot): ...
+ def validate(self): ...
+ def __eq__(self, other): ...
+ def __ne__(self, other): ...
diff --git a/typeshed/third_party/2/scribe/ttypes.pyi b/typeshed/third_party/2/scribe/ttypes.pyi
new file mode 100644
index 0000000..32f01bd
--- /dev/null
+++ b/typeshed/third_party/2/scribe/ttypes.pyi
@@ -0,0 +1,22 @@
+# Stubs for scribe.ttypes (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+fastbinary = ... # type: Any
+
+class ResultCode:
+ OK = ... # type: Any
+ TRY_LATER = ... # type: Any
+
+class LogEntry:
+ thrift_spec = ... # type: Any
+ category = ... # type: Any
+ message = ... # type: Any
+ def __init__(self, category=..., message=...) -> None: ...
+ def read(self, iprot): ...
+ def write(self, oprot): ...
+ def validate(self): ...
+ def __eq__(self, other): ...
+ def __ne__(self, other): ...
diff --git a/typeshed/third_party/2/selenium/webdriver/remote/webdriver.pyi b/typeshed/third_party/2/selenium/webdriver/remote/webdriver.pyi
new file mode 100644
index 0000000..9e0f24c
--- /dev/null
+++ b/typeshed/third_party/2/selenium/webdriver/remote/webdriver.pyi
@@ -0,0 +1,111 @@
+# Stubs for selenium.webdriver.remote.webdriver (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Dict, List, Optional
+from .mobile import Mobile as Mobile
+from selenium.webdriver.remote.webelement import WebElement
+from selenium.webdriver.remote.errorhandler import ErrorHandler
+from selenium.webdriver.remote.file_detector import FileDetector
+
+Capabilities = Dict[basestring, Any]
+ExecuteResult = Dict[basestring, Any] # containing 'success', 'value', 'sessionId'
+
+class WebDriver:
+ command_executor = ... # type: basestring
+ session_id = ... # type: Any
+ capabilities = ... # type: Capabilities
+ error_handler = ... # type: ErrorHandler
+ file_detector = ... # type: FileDetector
+ def __init__(self,
+ command_executor: basestring='',
+ desired_capabilities: Capabilities=None,
+ browser_profile=None,
+ proxy=None,
+ keep_alive: bool=False
+ ) -> None: ...
+ @property
+ def mobile(self) -> Mobile: ...
+ @property
+ def name(self) -> basestring: ...
+ def start_client(self): ...
+ def stop_client(self): ...
+ w3c = ... # type: Any
+ def start_session(self, desired_capabilities, browser_profile=None): ...
+ def create_web_element(self, element_id: basestring) -> WebElement: ...
+ def execute(self, driver_command: basestring, params: Optional[Dict[basestring, Any]]=None) -> ExecuteResult: ...
+ def get(self, url: basestring) -> None: ...
+ @property
+ def title(self) -> basestring: ...
+ def find_element_by_id(self, id_: basestring) -> WebElement: ...
+ def find_elements_by_id(self, id_: basestring) -> List[WebElement]: ...
+ def find_element_by_xpath(self, xpath: basestring) -> WebElement: ...
+ def find_elements_by_xpath(self, xpath: basestring) -> List[WebElement]: ...
+ def find_element_by_link_text(self, link_text: basestring) -> WebElement: ...
+ def find_elements_by_link_text(self, text: basestring) -> List[WebElement]: ...
+ def find_element_by_partial_link_text(self, link_text: basestring) -> WebElement: ...
+ def find_elements_by_partial_link_text(self, link_text: basestring) -> List[WebElement]: ...
+ def find_element_by_name(self, name: basestring) -> WebElement: ...
+ def find_elements_by_name(self, name: basestring) -> List[WebElement]: ...
+ def find_element_by_tag_name(self, name: basestring) -> WebElement: ...
+ def find_elements_by_tag_name(self, name: basestring) -> List[WebElement]: ...
+ def find_element_by_class_name(self, name: basestring) -> WebElement: ...
+ def find_elements_by_class_name(self, name: basestring) -> List[WebElement]: ...
+ def find_element_by_css_selector(self, css_selector: basestring) -> WebElement: ...
+ def find_elements_by_css_selector(self, css_selector: basestring) -> List[WebElement]: ...
+ def execute_script(self, script, *args): ...
+ def execute_async_script(self, script, *args): ...
+ @property
+ def current_url(self) -> basestring: ...
+ @property
+ def page_source(self): ...
+ def close(self): ...
+ def quit(self): ...
+ @property
+ def current_window_handle(self): ...
+ @property
+ def window_handles(self): ...
+ def maximize_window(self): ...
+ @property
+ def switch_to(self): ...
+ def switch_to_active_element(self): ...
+ def switch_to_window(self, window_name): ...
+ def switch_to_frame(self, frame_reference): ...
+ def switch_to_default_content(self): ...
+ def switch_to_alert(self): ...
+ def back(self): ...
+ def forward(self): ...
+ def refresh(self): ...
+ def get_cookies(self): ...
+ def get_cookie(self, name): ...
+ def delete_cookie(self, name): ...
+ def delete_all_cookies(self): ...
+ def add_cookie(self, cookie_dict): ...
+ def implicitly_wait(self, time_to_wait): ...
+ def set_script_timeout(self, time_to_wait): ...
+ def set_page_load_timeout(self, time_to_wait): ...
+ def find_element(self, by=..., value=None): ...
+ def find_elements(self, by=..., value=None): ...
+ @property
+ def desired_capabilities(self): ...
+ def get_screenshot_as_file(self, filename): ...
+ save_screenshot = ... # type: Any
+ def get_screenshot_as_png(self): ...
+ def get_screenshot_as_base64(self): ...
+ def set_window_size(self, width, height, windowHandle=''): ...
+ def get_window_size(self, windowHandle=''): ...
+ def set_window_position(self, x, y, windowHandle=''): ...
+ def get_window_position(self, windowHandle=''): ...
+ @property
+ def file_detector(self): ...
+ @file_detector.setter
+ def file_detector(self, detector): ...
+ @property
+ def orientation(self): ...
+ @orientation.setter
+ def orientation(self, value): ...
+ @property
+ def application_cache(self): ...
+ @property
+ def log_types(self): ...
+ def get_log(self, log_type): ...
diff --git a/typeshed/third_party/2/selenium/webdriver/remote/webelement.pyi b/typeshed/third_party/2/selenium/webdriver/remote/webelement.pyi
new file mode 100644
index 0000000..0577036
--- /dev/null
+++ b/typeshed/third_party/2/selenium/webdriver/remote/webelement.pyi
@@ -0,0 +1,65 @@
+# Stubs for selenium.webdriver.remote.webelement (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from selenium.webdriver.remote.webdriver import WebDriver
+from typing import Any, Optional, Dict, List
+
+SizeDict = Dict[str, int] # containing "height", "width"
+PointDict = Dict[str, int] # containing "x", "y"
+
+class WebElement:
+ def __init__(self, parent: WebDriver, id_: Optional[basestring], w3c: bool=False) -> None: ...
+ @property
+ def tag_name(self) -> basestring: ...
+ @property
+ def text(self) -> Optional[basestring]: ...
+ def click(self) -> None: ...
+ def submit(self) -> None: ...
+ def clear(self) -> None: ...
+ def get_attribute(self, name: basestring) -> Optional[basestring]: ...
+ def is_selected(self) -> bool: ...
+ def is_enabled(self) -> bool: ...
+
+ def find_element_by_id(self, id_: basestring) -> WebElement: ...
+ def find_elements_by_id(self, id_: basestring) -> List[WebElement]: ...
+ def find_element_by_name(self, name: basestring) -> WebElement: ...
+ def find_elements_by_name(self, name: basestring) -> List[WebElement]: ...
+ def find_element_by_link_text(self, link_text: basestring) -> WebElement: ...
+ def find_elements_by_link_text(self, link_text: basestring) -> List[WebElement]: ...
+ def find_element_by_partial_link_text(self, link_text: basestring) -> WebElement: ...
+ def find_elements_by_partial_link_text(self, link_text: basestring) -> List[WebElement]: ...
+ def find_element_by_tag_name(self, name: basestring) -> WebElement: ...
+ def find_elements_by_tag_name(self, name: basestring) -> List[WebElement]: ...
+ def find_element_by_xpath(self, xpath: basestring) -> WebElement: ...
+ def find_elements_by_xpath(self, xpath: basestring) -> List[WebElement]: ...
+ def find_element_by_class_name(self, name: basestring) -> WebElement: ...
+ def find_elements_by_class_name(self, name: basestring) -> List[WebElement]: ...
+ def find_element_by_css_selector(self, css_selector: basestring) -> WebElement: ...
+ def find_elements_by_css_selector(self, css_selector: basestring) -> List[WebElement]: ...
+
+ def send_keys(self, *value: basestring) -> None: ...
+ def is_displayed(self) -> bool: ...
+ @property
+ def location_once_scrolled_into_view(self): ...
+ @property
+ def size(self) -> SizeDict: ...
+ def value_of_css_property(self, property_name): ...
+ @property
+ def location(self) -> PointDict: ...
+ @property
+ def rect(self): ...
+ @property
+ def screenshot_as_base64(self): ...
+ @property
+ def screenshot_as_png(self): ...
+ def screenshot(self, filename: basestring): ...
+ @property
+ def parent(self) -> WebDriver: ...
+ @property
+ def id(self) -> Optional[basestring]: ...
+ def __eq__(self, element: object) -> bool: ...
+ def __ne__(self, element: object) -> bool: ...
+ def find_element(self, by: basestring=..., value: basestring=None) -> WebElement: ...
+ def find_elements(self, by: basestring=..., value: basestring=None) -> List[WebElement]: ...
+ def __hash__(self) -> int: ...
diff --git a/typeshed/third_party/2/simplejson/__init__.pyi b/typeshed/third_party/2/simplejson/__init__.pyi
new file mode 100644
index 0000000..5f94eb9
--- /dev/null
+++ b/typeshed/third_party/2/simplejson/__init__.pyi
@@ -0,0 +1,10 @@
+from typing import Any, IO
+
+from simplejson.scanner import JSONDecodeError
+from simplejson.decoder import JSONDecoder
+from simplejson.encoder import JSONEncoder, JSONEncoderForHTML
+
+def dumps(obj: Any, *args: Any, **kwds: Any) -> str: ...
+def dump(obj: Any, fp: IO[str], *args: Any, **kwds: Any) -> None: ...
+def loads(s: str, **kwds: Any) -> Any: ...
+def load(fp: IO[str]) -> Any: ...
diff --git a/typeshed/third_party/2/simplejson/decoder.pyi b/typeshed/third_party/2/simplejson/decoder.pyi
new file mode 100644
index 0000000..59111ce
--- /dev/null
+++ b/typeshed/third_party/2/simplejson/decoder.pyi
@@ -0,0 +1,6 @@
+from typing import Any, Match
+
+class JSONDecoder(object):
+ def __init__(self, **kwargs): ...
+ def decode(self, s: str, _w: Match[str], _PY3: bool): ...
+ def raw_decode(self, s: str, idx: int, _w: Match[str], _PY3: bool): ...
diff --git a/typeshed/third_party/2/simplejson/encoder.pyi b/typeshed/third_party/2/simplejson/encoder.pyi
new file mode 100644
index 0000000..0e31806
--- /dev/null
+++ b/typeshed/third_party/2/simplejson/encoder.pyi
@@ -0,0 +1,9 @@
+from typing import Any, IO
+
+class JSONEncoder(object):
+ def __init__(self, *args, **kwargs): ...
+ def encode(self, o: Any): ...
+ def default(self, o: Any): ...
+ def iterencode(self, o: Any, _one_shot: bool): ...
+
+class JSONEncoderForHTML(JSONEncoder): ...
diff --git a/typeshed/third_party/2/simplejson/scanner.pyi b/typeshed/third_party/2/simplejson/scanner.pyi
new file mode 100644
index 0000000..760b24d
--- /dev/null
+++ b/typeshed/third_party/2/simplejson/scanner.pyi
@@ -0,0 +1,7 @@
+from typing import Any, IO
+
+class JSONDecodeError(ValueError):
+ def dumps(self, obj: Any) -> str: ...
+ def dump(self, obj: Any, fp: IO[str], *args: Any, **kwds: Any) -> None: ...
+ def loads(self, s: str) -> Any: ...
+ def load(self, fp: IO[str]) -> Any: ...
diff --git a/typeshed/third_party/2/six/__init__.pyi b/typeshed/third_party/2/six/__init__.pyi
new file mode 100644
index 0000000..302c458
--- /dev/null
+++ b/typeshed/third_party/2/six/__init__.pyi
@@ -0,0 +1,91 @@
+# Stubs for six (Python 2.7)
+
+from __future__ import print_function
+
+import types
+from typing import (
+ Any, AnyStr, Callable, Dict, Iterable, Mapping, Optional,
+ Pattern, Tuple, Type, TypeVar, Union, overload, ValuesView, KeysView, ItemsView
+)
+import typing
+import unittest
+from mypy_extensions import NoReturn
+
+# Exports
+from __builtin__ import unichr as unichr
+from StringIO import StringIO as StringIO, StringIO as BytesIO
+from functools import wraps as wraps
+
+
+_T = TypeVar('_T')
+_K = TypeVar('_K')
+_V = TypeVar('_V')
+
+# TODO make constant, then move this stub to 2and3
+# https://github.com/python/typeshed/issues/17
+PY2 = True
+PY3 = False
+PY34 = False
+
+string_types = basestring,
+integer_types = (int, long)
+class_types = (type, types.ClassType)
+text_type = unicode
+binary_type = str
+
+MAXSIZE = ... # type: int
+
+# def add_move
+# def remove_move
+
+def advance_iterator(it: typing.Iterator[_T]) -> _T: ...
+next = advance_iterator
+
+def callable(obj: object) -> bool: ...
+
+def get_unbound_function(unbound: types.MethodType) -> types.FunctionType: ...
+def create_bound_method(func: types.FunctionType, obj: object) -> types.MethodType: ...
+def create_unbound_method(func: types.FunctionType, cls: Union[type, types.ClassType]) -> types.MethodType: ...
+
+class Iterator:
+ def next(self) -> Any: ...
+
+def get_method_function(meth: types.MethodType) -> types.FunctionType: ...
+def get_method_self(meth: types.MethodType) -> Optional[object]: ...
+def get_function_closure(fun: types.FunctionType) -> Optional[Tuple[types._Cell, ...]]: ...
+def get_function_code(fun: types.FunctionType) -> types.CodeType: ...
+def get_function_defaults(fun: types.FunctionType) -> Optional[Tuple[Any, ...]]: ...
+def get_function_globals(fun: types.FunctionType) -> Dict[str, Any]: ...
+
+def iterkeys(d: Mapping[_K, _V]) -> typing.Iterator[_K]: ...
+def itervalues(d: Mapping[_K, _V]) -> typing.Iterator[_V]: ...
+def iteritems(d: Mapping[_K, _V]) -> typing.Iterator[Tuple[_K, _V]]: ...
+# def iterlists
+
+def viewkeys(d: Mapping[_K, _V]) -> KeysView[_K]: ...
+def viewvalues(d: Mapping[_K, _V]) -> ValuesView[_V]: ...
+def viewitems(d: Mapping[_K, _V]) -> ItemsView[_K, _V]: ...
+
+def b(s: str) -> binary_type: ...
+def u(s: str) -> text_type: ...
+int2byte = chr
+def byte2int(bs: binary_type) -> int: ...
+def indexbytes(buf: binary_type, i: int) -> int: ...
+def iterbytes(buf: binary_type) -> typing.Iterator[int]: ...
+
+def assertCountEqual(self: unittest.TestCase, first: Iterable[_T], second: Iterable[_T], msg: str = ...) -> None: ...
+ at overload
+def assertRaisesRegex(self: unittest.TestCase, msg: str = ...) -> Any: ...
+ at overload
+def assertRaisesRegex(self: unittest.TestCase, callable_obj: Callable[..., Any], *args: Any, **kwargs: Any) -> Any: ...
+def assertRegex(self: unittest.TestCase, text: AnyStr, expected_regex: Union[AnyStr, Pattern[AnyStr]], msg: str = ...) -> None: ...
+
+def reraise(tp: Optional[Type[BaseException]], value: Optional[BaseException], tb: Optional[types.TracebackType] = ...) -> NoReturn: ...
+def exec_(_code_: Union[unicode, types.CodeType], _globs_: Dict[str, Any] = ..., _locs_: Dict[str, Any] = ...): ...
+def raise_from(value: BaseException, from_value: BaseException) -> None: ...
+
+print_ = print
+
+def with_metaclass(meta: type, *bases: type) -> type: ...
+def add_metaclass(metaclass: type) -> Callable[[_T], _T]: ...
+def python_2_unicode_compatible(klass: _T) -> _T: ...
diff --git a/typeshed/third_party/2/six/moves/__init__.pyi b/typeshed/third_party/2/six/moves/__init__.pyi
new file mode 100644
index 0000000..2e09f98
--- /dev/null
+++ b/typeshed/third_party/2/six/moves/__init__.pyi
@@ -0,0 +1,31 @@
+# Provisional stubs for six.moves (Python 2.7)
+
+import Cookie as http_cookies
+from cStringIO import StringIO as cStringIO
+from itertools import ifilter as filter
+from itertools import ifilterfalse as filterfalse
+from __builtin__ import raw_input as input
+from __builtin__ import intern as intern
+from itertools import imap as map
+from os import getcwdu as getcwd
+from os import getcwd as getcwdb
+from __builtin__ import xrange as range
+from __builtin__ import reload as reload_module
+from __builtin__ import reduce as reduce
+from pipes import quote as shlex_quote
+from StringIO import StringIO as StringIO
+from UserDict import UserDict as UserDict
+from UserList import UserList as UserList
+from UserString import UserString as UserString
+from __builtin__ import xrange as xrange
+from itertools import izip as zip
+from itertools import izip_longest as zip_longest
+import six.moves.cPickle as cPickle
+import HTMLParser as html_parser
+import htmlentitydefs as html_entities
+import httplib as http_client
+
+import six.moves.urllib_parse as urllib_parse
+import six.moves.urllib_error as urllib_error
+import six.moves.urllib as urllib
+import six.moves.urllib_robotparser as urllib_robotparser
diff --git a/typeshed/third_party/2/six/moves/cPickle.pyi b/typeshed/third_party/2/six/moves/cPickle.pyi
new file mode 100644
index 0000000..3feedc6
--- /dev/null
+++ b/typeshed/third_party/2/six/moves/cPickle.pyi
@@ -0,0 +1,6 @@
+# Generated by stubtool 0.1, DO NOT EDIT
+# See https://github.com/o11c/stubtool
+#
+# Stubs for six.moves.cPickle (Python 2.7)
+
+from cPickle import * # noqa: F403
diff --git a/typeshed/third_party/2/six/moves/urllib/__init__.pyi b/typeshed/third_party/2/six/moves/urllib/__init__.pyi
new file mode 100644
index 0000000..71523cd
--- /dev/null
+++ b/typeshed/third_party/2/six/moves/urllib/__init__.pyi
@@ -0,0 +1,10 @@
+# Generated by stubtool 0.1, DO NOT EDIT
+# See https://github.com/o11c/stubtool
+#
+# Stubs for six.moves.urllib (Python 2.7)
+
+import six.moves.urllib.error as error
+import six.moves.urllib.parse as parse
+import six.moves.urllib.request as request
+import six.moves.urllib.response as response
+import six.moves.urllib.robotparser as robotparser
diff --git a/typeshed/third_party/2/six/moves/urllib/error.pyi b/typeshed/third_party/2/six/moves/urllib/error.pyi
new file mode 100644
index 0000000..05eda84
--- /dev/null
+++ b/typeshed/third_party/2/six/moves/urllib/error.pyi
@@ -0,0 +1,8 @@
+# Generated by stubtool 0.1, DO NOT EDIT
+# See https://github.com/o11c/stubtool
+#
+# Stubs for six.moves.urllib.error (Python 2.7)
+
+from urllib2 import URLError as URLError
+from urllib2 import HTTPError as HTTPError
+from urllib import ContentTooShortError as ContentTooShortError
diff --git a/typeshed/third_party/2/six/moves/urllib/parse.pyi b/typeshed/third_party/2/six/moves/urllib/parse.pyi
new file mode 100644
index 0000000..25351fb
--- /dev/null
+++ b/typeshed/third_party/2/six/moves/urllib/parse.pyi
@@ -0,0 +1,30 @@
+# Generated by stubtool 0.1, DO NOT EDIT
+# See https://github.com/o11c/stubtool
+#
+# Stubs for six.moves.urllib.parse (Python 2.7)
+
+from six.moves.urllib_parse import (
+ ParseResult as ParseResult,
+ SplitResult as SplitResult,
+ parse_qs as parse_qs,
+ parse_qsl as parse_qsl,
+ urldefrag as urldefrag,
+ urljoin as urljoin,
+ urlparse as urlparse,
+ urlsplit as urlsplit,
+ urlunparse as urlunparse,
+ urlunsplit as urlunsplit,
+ quote as quote,
+ quote_plus as quote_plus,
+ unquote as unquote,
+ unquote_plus as unquote_plus,
+ urlencode as urlencode,
+ splitquery as splitquery,
+ splittag as splittag,
+ splituser as splituser,
+ uses_fragment as uses_fragment,
+ uses_netloc as uses_netloc,
+ uses_params as uses_params,
+ uses_query as uses_query,
+ uses_relative as uses_relative,
+)
diff --git a/typeshed/third_party/2/six/moves/urllib/request.pyi b/typeshed/third_party/2/six/moves/urllib/request.pyi
new file mode 100644
index 0000000..109cda8
--- /dev/null
+++ b/typeshed/third_party/2/six/moves/urllib/request.pyi
@@ -0,0 +1,38 @@
+# Generated by stubtool 0.1, DO NOT EDIT
+# See https://github.com/o11c/stubtool
+#
+# Stubs for six.moves.urllib.request (Python 2.7)
+
+from urllib2 import urlopen as urlopen
+from urllib2 import install_opener as install_opener
+from urllib2 import build_opener as build_opener
+from urllib import pathname2url as pathname2url
+from urllib import url2pathname as url2pathname
+from urllib import getproxies as getproxies
+from urllib2 import Request as Request
+from urllib2 import OpenerDirector as OpenerDirector
+from urllib2 import HTTPDefaultErrorHandler as HTTPDefaultErrorHandler
+from urllib2 import HTTPRedirectHandler as HTTPRedirectHandler
+from urllib2 import HTTPCookieProcessor as HTTPCookieProcessor
+from urllib2 import ProxyHandler as ProxyHandler
+from urllib2 import BaseHandler as BaseHandler
+from urllib2 import HTTPPasswordMgr as HTTPPasswordMgr
+from urllib2 import HTTPPasswordMgrWithDefaultRealm as HTTPPasswordMgrWithDefaultRealm
+from urllib2 import AbstractBasicAuthHandler as AbstractBasicAuthHandler
+from urllib2 import HTTPBasicAuthHandler as HTTPBasicAuthHandler
+from urllib2 import ProxyBasicAuthHandler as ProxyBasicAuthHandler
+from urllib2 import AbstractDigestAuthHandler as AbstractDigestAuthHandler
+from urllib2 import HTTPDigestAuthHandler as HTTPDigestAuthHandler
+from urllib2 import ProxyDigestAuthHandler as ProxyDigestAuthHandler
+from urllib2 import HTTPHandler as HTTPHandler
+from urllib2 import HTTPSHandler as HTTPSHandler
+from urllib2 import FileHandler as FileHandler
+from urllib2 import FTPHandler as FTPHandler
+from urllib2 import CacheFTPHandler as CacheFTPHandler
+from urllib2 import UnknownHandler as UnknownHandler
+from urllib2 import HTTPErrorProcessor as HTTPErrorProcessor
+from urllib import urlretrieve as urlretrieve
+from urllib import urlcleanup as urlcleanup
+from urllib import URLopener as URLopener
+from urllib import FancyURLopener as FancyURLopener
+from urllib import proxy_bypass as proxy_bypass
diff --git a/typeshed/third_party/2/six/moves/urllib/response.pyi b/typeshed/third_party/2/six/moves/urllib/response.pyi
new file mode 100644
index 0000000..d778514
--- /dev/null
+++ b/typeshed/third_party/2/six/moves/urllib/response.pyi
@@ -0,0 +1,9 @@
+# Generated by stubtool 0.1, DO NOT EDIT
+# See https://github.com/o11c/stubtool
+#
+# Stubs for six.moves.urllib.response (Python 2.7)
+
+from urllib import addbase as addbase
+from urllib import addclosehook as addclosehook
+from urllib import addinfo as addinfo
+from urllib import addinfourl as addinfourl
diff --git a/typeshed/third_party/2/six/moves/urllib/robotparser.pyi b/typeshed/third_party/2/six/moves/urllib/robotparser.pyi
new file mode 100644
index 0000000..3b33758
--- /dev/null
+++ b/typeshed/third_party/2/six/moves/urllib/robotparser.pyi
@@ -0,0 +1,6 @@
+# Generated by stubtool 0.1, DO NOT EDIT
+# See https://github.com/o11c/stubtool
+#
+# Stubs for six.moves.urllib.robotparser (Python 2.7)
+
+from robotparser import RobotFileParser as RobotFileParser
diff --git a/typeshed/third_party/2/six/moves/urllib_error.pyi b/typeshed/third_party/2/six/moves/urllib_error.pyi
new file mode 100644
index 0000000..4872659
--- /dev/null
+++ b/typeshed/third_party/2/six/moves/urllib_error.pyi
@@ -0,0 +1,10 @@
+# Generated by stubtool 0.1, DO NOT EDIT
+# See https://github.com/o11c/stubtool
+#
+# Stubs for six.moves.urllib_error (Python 2.7)
+
+from six.moves.urllib.error import (
+ URLError as URLError,
+ HTTPError as HTTPError,
+ ContentTooShortError as ContentTooShortError,
+)
diff --git a/typeshed/third_party/2/six/moves/urllib_parse.pyi b/typeshed/third_party/2/six/moves/urllib_parse.pyi
new file mode 100644
index 0000000..2416b96
--- /dev/null
+++ b/typeshed/third_party/2/six/moves/urllib_parse.pyi
@@ -0,0 +1,28 @@
+# Generated by stubtool 0.1, DO NOT EDIT
+# See https://github.com/o11c/stubtool
+#
+# Stubs for six.moves.urllib_parse (Python 2.7)
+
+from urlparse import ParseResult as ParseResult
+from urlparse import SplitResult as SplitResult
+from urlparse import parse_qs as parse_qs
+from urlparse import parse_qsl as parse_qsl
+from urlparse import urldefrag as urldefrag
+from urlparse import urljoin as urljoin
+from urlparse import urlparse as urlparse
+from urlparse import urlsplit as urlsplit
+from urlparse import urlunparse as urlunparse
+from urlparse import urlunsplit as urlunsplit
+from urllib import quote as quote
+from urllib import quote_plus as quote_plus
+from urllib import unquote as unquote
+from urllib import unquote_plus as unquote_plus
+from urllib import urlencode as urlencode
+from urllib import splitquery as splitquery
+from urllib import splittag as splittag
+from urllib import splituser as splituser
+from urlparse import uses_fragment as uses_fragment
+from urlparse import uses_netloc as uses_netloc
+from urlparse import uses_params as uses_params
+from urlparse import uses_query as uses_query
+from urlparse import uses_relative as uses_relative
diff --git a/typeshed/third_party/2/six/moves/urllib_request.pyi b/typeshed/third_party/2/six/moves/urllib_request.pyi
new file mode 100644
index 0000000..832055a
--- /dev/null
+++ b/typeshed/third_party/2/six/moves/urllib_request.pyi
@@ -0,0 +1,40 @@
+# Generated by stubtool 0.1, DO NOT EDIT
+# See https://github.com/o11c/stubtool
+#
+# Stubs for six.moves.urllib_request (Python 2.7)
+
+from six.moves.urllib.request import (
+ urlopen as urlopen,
+ install_opener as install_opener,
+ build_opener as build_opener,
+ pathname2url as pathname2url,
+ url2pathname as url2pathname,
+ getproxies as getproxies,
+ Request as Request,
+ OpenerDirector as OpenerDirector,
+ HTTPDefaultErrorHandler as HTTPDefaultErrorHandler,
+ HTTPRedirectHandler as HTTPRedirectHandler,
+ HTTPCookieProcessor as HTTPCookieProcessor,
+ ProxyHandler as ProxyHandler,
+ BaseHandler as BaseHandler,
+ HTTPPasswordMgr as HTTPPasswordMgr,
+ HTTPPasswordMgrWithDefaultRealm as HTTPPasswordMgrWithDefaultRealm,
+ AbstractBasicAuthHandler as AbstractBasicAuthHandler,
+ HTTPBasicAuthHandler as HTTPBasicAuthHandler,
+ ProxyBasicAuthHandler as ProxyBasicAuthHandler,
+ AbstractDigestAuthHandler as AbstractDigestAuthHandler,
+ HTTPDigestAuthHandler as HTTPDigestAuthHandler,
+ ProxyDigestAuthHandler as ProxyDigestAuthHandler,
+ HTTPHandler as HTTPHandler,
+ HTTPSHandler as HTTPSHandler,
+ FileHandler as FileHandler,
+ FTPHandler as FTPHandler,
+ CacheFTPHandler as CacheFTPHandler,
+ UnknownHandler as UnknownHandler,
+ HTTPErrorProcessor as HTTPErrorProcessor,
+ urlretrieve as urlretrieve,
+ urlcleanup as urlcleanup,
+ URLopener as URLopener,
+ FancyURLopener as FancyURLopener,
+ proxy_bypass as proxy_bypass,
+)
diff --git a/typeshed/third_party/2/six/moves/urllib_response.pyi b/typeshed/third_party/2/six/moves/urllib_response.pyi
new file mode 100644
index 0000000..ca00492
--- /dev/null
+++ b/typeshed/third_party/2/six/moves/urllib_response.pyi
@@ -0,0 +1,11 @@
+# Generated by stubtool 0.1, DO NOT EDIT
+# See https://github.com/o11c/stubtool
+#
+# Stubs for six.moves.urllib_response (Python 2.7)
+
+from six.moves.urllib.response import (
+ addbase as addbase,
+ addclosehook as addclosehook,
+ addinfo as addinfo,
+ addinfourl as addinfourl,
+)
diff --git a/typeshed/third_party/2/six/moves/urllib_robotparser.pyi b/typeshed/third_party/2/six/moves/urllib_robotparser.pyi
new file mode 100644
index 0000000..d990bb5
--- /dev/null
+++ b/typeshed/third_party/2/six/moves/urllib_robotparser.pyi
@@ -0,0 +1,8 @@
+# Generated by stubtool 0.1, DO NOT EDIT
+# See https://github.com/o11c/stubtool
+#
+# Stubs for six.moves.urllib_robotparser (Python 2.7)
+
+from six.moves.urllib.robotparser import (
+ RobotFileParser as RobotFileParser,
+)
diff --git a/typeshed/third_party/2/sqlalchemy/__init__.pyi b/typeshed/third_party/2/sqlalchemy/__init__.pyi
new file mode 100644
index 0000000..8d58e25
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/__init__.pyi
@@ -0,0 +1,124 @@
+# Stubs for sqlalchemy (Python 2)
+
+from .sql import (
+ alias,
+ and_,
+ asc,
+ between,
+ bindparam,
+ case,
+ cast,
+ collate,
+ column,
+ delete,
+ desc,
+ distinct,
+ except_,
+ except_all,
+ exists,
+ extract,
+ false,
+ func,
+ funcfilter,
+ insert,
+ intersect,
+ intersect_all,
+ join,
+ literal,
+ literal_column,
+ modifier,
+ not_,
+ null,
+ or_,
+ outerjoin,
+ outparam,
+ over,
+ select,
+ subquery,
+ table,
+ text,
+ true,
+ tuple_,
+ type_coerce,
+ union,
+ union_all,
+ update,
+)
+
+from .types import (
+ BIGINT,
+ BINARY,
+ BLOB,
+ BOOLEAN,
+ BigInteger,
+ Binary,
+ Boolean,
+ CHAR,
+ CLOB,
+ DATE,
+ DATETIME,
+ DECIMAL,
+ Date,
+ DateTime,
+ Enum,
+ FLOAT,
+ Float,
+ INT,
+ INTEGER,
+ Integer,
+ Interval,
+ LargeBinary,
+ NCHAR,
+ NVARCHAR,
+ NUMERIC,
+ Numeric,
+ PickleType,
+ REAL,
+ SMALLINT,
+ SmallInteger,
+ String,
+ TEXT,
+ TIME,
+ TIMESTAMP,
+ Text,
+ Time,
+ TypeDecorator,
+ Unicode,
+ UnicodeText,
+ VARBINARY,
+ VARCHAR,
+)
+
+from .schema import (
+ CheckConstraint,
+ Column,
+ ColumnDefault,
+ Constraint,
+ DefaultClause,
+ FetchedValue,
+ ForeignKey,
+ ForeignKeyConstraint,
+ Index,
+ MetaData,
+ PassiveDefault,
+ PrimaryKeyConstraint,
+ Sequence,
+ Table,
+ ThreadLocalMetaData,
+ UniqueConstraint,
+ DDL,
+)
+
+from . import sql as sql
+from . import schema as schema
+from . import types as types
+from . import exc as exc
+from . import dialects as dialects
+from . import pool as pool
+# This should re-export orm but orm is totally broken right now
+# from . import orm as orm
+
+from .inspection import inspect
+from .engine import create_engine, engine_from_config
+
+__version__ = ... # type: int
diff --git a/typeshed/third_party/2/sqlalchemy/databases/__init__.pyi b/typeshed/third_party/2/sqlalchemy/databases/__init__.pyi
new file mode 100644
index 0000000..b1ac4a4
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/databases/__init__.pyi
@@ -0,0 +1,12 @@
+# Stubs for sqlalchemy.databases (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+# Names in __all__ with no definition:
+# firebird
+# mssql
+# mysql
+# oracle
+# postgresql
+# sqlite
+# sybase
diff --git a/typeshed/third_party/2/sqlalchemy/databases/mysql.pyi b/typeshed/third_party/2/sqlalchemy/databases/mysql.pyi
new file mode 100644
index 0000000..4cda14f
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/databases/mysql.pyi
@@ -0,0 +1 @@
+from sqlalchemy.dialects.mysql.base import * # noqa: F403
diff --git a/typeshed/third_party/2/sqlalchemy/dialects/__init__.pyi b/typeshed/third_party/2/sqlalchemy/dialects/__init__.pyi
new file mode 100644
index 0000000..2d261de
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/dialects/__init__.pyi
@@ -0,0 +1,12 @@
+# Stubs for sqlalchemy.dialects (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+# Names in __all__ with no definition:
+# firebird
+# mssql
+# mysql
+# oracle
+# postgresql
+# sqlite
+# sybase
diff --git a/typeshed/third_party/2/sqlalchemy/dialects/mysql/__init__.pyi b/typeshed/third_party/2/sqlalchemy/dialects/mysql/__init__.pyi
new file mode 100644
index 0000000..5a0a4bf
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/dialects/mysql/__init__.pyi
@@ -0,0 +1,40 @@
+# Stubs for sqlalchemy.dialects.mysql (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from . import base
+
+BIGINT = base.BIGINT
+BINARY = base.BINARY
+BIT = base.BIT
+BLOB = base.BLOB
+BOOLEAN = base.BOOLEAN
+CHAR = base.CHAR
+DATE = base.DATE
+DATETIME = base.DATETIME
+DECIMAL = base.DECIMAL
+DOUBLE = base.DOUBLE
+ENUM = base.ENUM
+FLOAT = base.FLOAT
+INTEGER = base.INTEGER
+LONGBLOB = base.LONGBLOB
+LONGTEXT = base.LONGTEXT
+MEDIUMBLOB = base.MEDIUMBLOB
+MEDIUMINT = base.MEDIUMINT
+MEDIUMTEXT = base.MEDIUMTEXT
+NCHAR = base.NCHAR
+NVARCHAR = base.NVARCHAR
+NUMERIC = base.NUMERIC
+SET = base.SET
+SMALLINT = base.SMALLINT
+REAL = base.REAL
+TEXT = base.TEXT
+TIME = base.TIME
+TIMESTAMP = base.TIMESTAMP
+TINYBLOB = base.TINYBLOB
+TINYINT = base.TINYINT
+TINYTEXT = base.TINYTEXT
+VARBINARY = base.VARBINARY
+VARCHAR = base.VARCHAR
+YEAR = base.YEAR
+# dialect = base.dialect
diff --git a/typeshed/third_party/2/sqlalchemy/dialects/mysql/base.pyi b/typeshed/third_party/2/sqlalchemy/dialects/mysql/base.pyi
new file mode 100644
index 0000000..51b8b26
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/dialects/mysql/base.pyi
@@ -0,0 +1,413 @@
+# Stubs for sqlalchemy.dialects.mysql.base (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from ... import sql
+from ... import engine
+from ... import util
+from ... import types
+
+sqltypes = sql.sqltypes
+# compiler = sql.compiler
+# reflection = engine.reflection
+# default = engine.default
+# topological = util.topological
+DATE = types.DATE
+BOOLEAN = types.BOOLEAN
+BLOB = types.BLOB
+BINARY = types.BINARY
+VARBINARY = types.VARBINARY
+
+RESERVED_WORDS = ... # type: Any
+AUTOCOMMIT_RE = ... # type: Any
+SET_RE = ... # type: Any
+
+class _NumericType:
+ unsigned = ... # type: Any
+ zerofill = ... # type: Any
+ def __init__(self, unsigned=..., zerofill=..., **kw) -> None: ...
+
+class _FloatType(_NumericType,
+ # sqltypes.Float
+ ):
+ scale = ... # type: Any
+ def __init__(self, precision=..., scale=..., asdecimal=..., **kw) -> None: ...
+
+class _IntegerType(_NumericType,
+ # sqltypes.Integer
+ ):
+ display_width = ... # type: Any
+ def __init__(self, display_width=..., **kw) -> None: ...
+
+class _StringType(object,
+ # sqltypes.String
+ ):
+ charset = ... # type: Any
+ ascii = ... # type: Any
+ unicode = ... # type: Any
+ binary = ... # type: Any
+ national = ... # type: Any
+ def __init__(self, charset=..., collation=..., ascii=..., binary=..., unicode=..., national=..., **kw) -> None: ...
+
+class _MatchType(object,
+ # sqltypes.Float,
+ # sqltypes.MatchType
+ ):
+ def __init__(self, **kw) -> None: ...
+
+class NUMERIC(_NumericType,
+ # sqltypes.NUMERIC
+ ):
+ __visit_name__ = ... # type: Any
+ def __init__(self, precision=..., scale=..., asdecimal=..., **kw) -> None: ...
+
+class DECIMAL(_NumericType,
+ # sqltypes.DECIMAL
+ ):
+ __visit_name__ = ... # type: Any
+ def __init__(self, precision=..., scale=..., asdecimal=..., **kw) -> None: ...
+
+class DOUBLE(_FloatType):
+ __visit_name__ = ... # type: Any
+ def __init__(self, precision=..., scale=..., asdecimal=..., **kw) -> None: ...
+
+class REAL(_FloatType,
+ # sqltypes.REAL
+ ):
+ __visit_name__ = ... # type: Any
+ def __init__(self, precision=..., scale=..., asdecimal=..., **kw) -> None: ...
+
+class FLOAT(_FloatType,
+ # sqltypes.FLOAT
+ ):
+ __visit_name__ = ... # type: Any
+ def __init__(self, precision=..., scale=..., asdecimal=..., **kw) -> None: ...
+ def bind_processor(self, dialect): ...
+
+class INTEGER(_IntegerType,
+ # sqltypes.INTEGER
+ ):
+ __visit_name__ = ... # type: Any
+ def __init__(self, display_width=..., **kw) -> None: ...
+
+class BIGINT(_IntegerType,
+ # sqltypes.BIGINT
+ ):
+ __visit_name__ = ... # type: Any
+ def __init__(self, display_width=..., **kw) -> None: ...
+
+class MEDIUMINT(_IntegerType):
+ __visit_name__ = ... # type: Any
+ def __init__(self, display_width=..., **kw) -> None: ...
+
+class TINYINT(_IntegerType):
+ __visit_name__ = ... # type: Any
+ def __init__(self, display_width=..., **kw) -> None: ...
+
+class SMALLINT(_IntegerType,
+ # sqltypes.SMALLINT
+ ):
+ __visit_name__ = ... # type: Any
+ def __init__(self, display_width=..., **kw) -> None: ...
+
+class BIT(object,
+ # sqltypes.TypeEngine
+ ):
+ __visit_name__ = ... # type: Any
+ length = ... # type: Any
+ def __init__(self, length=...) -> None: ...
+ def result_processor(self, dialect, coltype): ...
+
+class TIME(object,
+ # sqltypes.TIME
+ ):
+ __visit_name__ = ... # type: Any
+ fsp = ... # type: Any
+ def __init__(self, timezone=..., fsp=...) -> None: ...
+ def result_processor(self, dialect, coltype): ...
+
+class TIMESTAMP(object,
+ # sqltypes.TIMESTAMP
+ ):
+ __visit_name__ = ... # type: Any
+ fsp = ... # type: Any
+ def __init__(self, timezone=..., fsp=...) -> None: ...
+
+class DATETIME(object,
+ # sqltypes.DATETIME
+ ):
+ __visit_name__ = ... # type: Any
+ fsp = ... # type: Any
+ def __init__(self, timezone=..., fsp=...) -> None: ...
+
+class YEAR(object,
+ # sqltypes.TypeEngine
+ ):
+ __visit_name__ = ... # type: Any
+ display_width = ... # type: Any
+ def __init__(self, display_width=...) -> None: ...
+
+class TEXT(_StringType,
+ # sqltypes.TEXT
+ ):
+ __visit_name__ = ... # type: Any
+ def __init__(self, length=..., **kw) -> None: ...
+
+class TINYTEXT(_StringType):
+ __visit_name__ = ... # type: Any
+ def __init__(self, **kwargs) -> None: ...
+
+class MEDIUMTEXT(_StringType):
+ __visit_name__ = ... # type: Any
+ def __init__(self, **kwargs) -> None: ...
+
+class LONGTEXT(_StringType):
+ __visit_name__ = ... # type: Any
+ def __init__(self, **kwargs) -> None: ...
+
+class VARCHAR(_StringType,
+ # sqltypes.VARCHAR
+ ):
+ __visit_name__ = ... # type: Any
+ def __init__(self, length=..., **kwargs) -> None: ...
+
+class CHAR(_StringType,
+ # sqltypes.CHAR
+ ):
+ __visit_name__ = ... # type: Any
+ def __init__(self, length=..., **kwargs) -> None: ...
+
+class NVARCHAR(_StringType,
+ # sqltypes.NVARCHAR
+ ):
+ __visit_name__ = ... # type: Any
+ def __init__(self, length=..., **kwargs) -> None: ...
+
+class NCHAR(_StringType,
+ # sqltypes.NCHAR
+ ):
+ __visit_name__ = ... # type: Any
+ def __init__(self, length=..., **kwargs) -> None: ...
+
+class TINYBLOB(object,
+ # sqltypes._Binary
+ ):
+ __visit_name__ = ... # type: Any
+
+class MEDIUMBLOB(object,
+ # sqltypes._Binary
+ ):
+ __visit_name__ = ... # type: Any
+
+class LONGBLOB(object,
+ # sqltypes._Binary
+ ):
+ __visit_name__ = ... # type: Any
+
+class _EnumeratedValues(_StringType): ...
+
+class ENUM( # sqltypes.Enum,
+ _EnumeratedValues
+):
+ __visit_name__ = ... # type: Any
+ strict = ... # type: Any
+ def __init__(self, *enums, **kw) -> None: ...
+ def bind_processor(self, dialect): ...
+ def adapt(self, cls, **kw): ...
+
+class SET(_EnumeratedValues):
+ __visit_name__ = ... # type: Any
+ retrieve_as_bitwise = ... # type: Any
+ values = ... # type: Any
+ def __init__(self, *values, **kw) -> None: ...
+ def column_expression(self, colexpr): ...
+ def result_processor(self, dialect, coltype): ...
+ def bind_processor(self, dialect): ...
+ def adapt(self, impltype, **kw): ...
+
+MSTime = ... # type: Any
+MSSet = ... # type: Any
+MSEnum = ... # type: Any
+MSLongBlob = ... # type: Any
+MSMediumBlob = ... # type: Any
+MSTinyBlob = ... # type: Any
+MSBlob = ... # type: Any
+MSBinary = ... # type: Any
+MSVarBinary = ... # type: Any
+MSNChar = ... # type: Any
+MSNVarChar = ... # type: Any
+MSChar = ... # type: Any
+MSString = ... # type: Any
+MSLongText = ... # type: Any
+MSMediumText = ... # type: Any
+MSTinyText = ... # type: Any
+MSText = ... # type: Any
+MSYear = ... # type: Any
+MSTimeStamp = ... # type: Any
+MSBit = ... # type: Any
+MSSmallInteger = ... # type: Any
+MSTinyInteger = ... # type: Any
+MSMediumInteger = ... # type: Any
+MSBigInteger = ... # type: Any
+MSNumeric = ... # type: Any
+MSDecimal = ... # type: Any
+MSDouble = ... # type: Any
+MSReal = ... # type: Any
+MSFloat = ... # type: Any
+MSInteger = ... # type: Any
+colspecs = ... # type: Any
+ischema_names = ... # type: Any
+
+class MySQLExecutionContext(object,
+ # default.DefaultExecutionContext
+ ):
+ def should_autocommit_text(self, statement): ...
+
+class MySQLCompiler(object,
+ # compiler.SQLCompiler
+ ):
+ render_table_with_column_in_update_from = ... # type: Any
+ extract_map = ... # type: Any
+ def visit_random_func(self, fn, **kw): ...
+ def visit_utc_timestamp_func(self, fn, **kw): ...
+ def visit_sysdate_func(self, fn, **kw): ...
+ def visit_concat_op_binary(self, binary, operator, **kw): ...
+ def visit_match_op_binary(self, binary, operator, **kw): ...
+ def get_from_hint_text(self, table, text): ...
+ def visit_typeclause(self, typeclause, type_=...): ...
+ def visit_cast(self, cast, **kwargs): ...
+ def render_literal_value(self, value, type_): ...
+ def visit_true(self, element, **kw): ...
+ def visit_false(self, element, **kw): ...
+ def get_select_precolumns(self, select, **kw): ...
+ def visit_join(self, join, asfrom=..., **kwargs): ...
+ def for_update_clause(self, select, **kw): ...
+ def limit_clause(self, select, **kw): ...
+ def update_limit_clause(self, update_stmt): ...
+ def update_tables_clause(self, update_stmt, from_table, extra_froms, **kw): ...
+ def update_from_clause(self, update_stmt, from_table, extra_froms, from_hints, **kw): ...
+
+class MySQLDDLCompiler(object,
+ # compiler.DDLCompiler
+ ):
+ def create_table_constraints(self, table, **kw): ...
+ def get_column_specification(self, column, **kw): ...
+ def post_create_table(self, table): ...
+ def visit_create_index(self, create): ...
+ def visit_primary_key_constraint(self, constraint): ...
+ def visit_drop_index(self, drop): ...
+ def visit_drop_constraint(self, drop): ...
+ def define_constraint_match(self, constraint): ...
+
+class MySQLTypeCompiler(object,
+ # compiler.GenericTypeCompiler
+ ):
+ def visit_NUMERIC(self, type_, **kw): ...
+ def visit_DECIMAL(self, type_, **kw): ...
+ def visit_DOUBLE(self, type_, **kw): ...
+ def visit_REAL(self, type_, **kw): ...
+ def visit_FLOAT(self, type_, **kw): ...
+ def visit_INTEGER(self, type_, **kw): ...
+ def visit_BIGINT(self, type_, **kw): ...
+ def visit_MEDIUMINT(self, type_, **kw): ...
+ def visit_TINYINT(self, type_, **kw): ...
+ def visit_SMALLINT(self, type_, **kw): ...
+ def visit_BIT(self, type_, **kw): ...
+ def visit_DATETIME(self, type_, **kw): ...
+ def visit_DATE(self, type_, **kw): ...
+ def visit_TIME(self, type_, **kw): ...
+ def visit_TIMESTAMP(self, type_, **kw): ...
+ def visit_YEAR(self, type_, **kw): ...
+ def visit_TEXT(self, type_, **kw): ...
+ def visit_TINYTEXT(self, type_, **kw): ...
+ def visit_MEDIUMTEXT(self, type_, **kw): ...
+ def visit_LONGTEXT(self, type_, **kw): ...
+ def visit_VARCHAR(self, type_, **kw): ...
+ def visit_CHAR(self, type_, **kw): ...
+ def visit_NVARCHAR(self, type_, **kw): ...
+ def visit_NCHAR(self, type_, **kw): ...
+ def visit_VARBINARY(self, type_, **kw): ...
+ def visit_large_binary(self, type_, **kw): ...
+ def visit_enum(self, type_, **kw): ...
+ def visit_BLOB(self, type_, **kw): ...
+ def visit_TINYBLOB(self, type_, **kw): ...
+ def visit_MEDIUMBLOB(self, type_, **kw): ...
+ def visit_LONGBLOB(self, type_, **kw): ...
+ def visit_ENUM(self, type_, **kw): ...
+ def visit_SET(self, type_, **kw): ...
+ def visit_BOOLEAN(self, type, **kw): ...
+
+class MySQLIdentifierPreparer(object,
+ # compiler.IdentifierPreparer
+ ):
+ reserved_words = ... # type: Any
+ def __init__(self, dialect, server_ansiquotes=..., **kw) -> None: ...
+
+class MySQLDialect(object,
+ # default.DefaultDialect
+ ):
+ name = ... # type: Any
+ supports_alter = ... # type: Any
+ supports_native_boolean = ... # type: Any
+ max_identifier_length = ... # type: Any
+ max_index_name_length = ... # type: Any
+ supports_native_enum = ... # type: Any
+ supports_sane_rowcount = ... # type: Any
+ supports_sane_multi_rowcount = ... # type: Any
+ supports_multivalues_insert = ... # type: Any
+ default_paramstyle = ... # type: Any
+ colspecs = ... # type: Any
+ statement_compiler = ... # type: Any
+ ddl_compiler = ... # type: Any
+ type_compiler = ... # type: Any
+ ischema_names = ... # type: Any
+ preparer = ... # type: Any
+ construct_arguments = ... # type: Any
+ isolation_level = ... # type: Any
+ def __init__(self, isolation_level=..., **kwargs) -> None: ...
+ def on_connect(self): ...
+ def set_isolation_level(self, connection, level): ...
+ def get_isolation_level(self, connection): ...
+ def do_commit(self, dbapi_connection): ...
+ def do_rollback(self, dbapi_connection): ...
+ def do_begin_twophase(self, connection, xid): ...
+ def do_prepare_twophase(self, connection, xid): ...
+ def do_rollback_twophase(self, connection, xid, is_prepared=..., recover=...): ...
+ def do_commit_twophase(self, connection, xid, is_prepared=..., recover=...): ...
+ def do_recover_twophase(self, connection): ...
+ def is_disconnect(self, e, connection, cursor): ...
+ def has_table(self, connection, table_name, schema=...): ...
+ identifier_preparer = ... # type: Any
+ def initialize(self, connection): ...
+ def get_schema_names(self, connection, **kw): ...
+ def get_table_names(self, connection, schema=..., **kw): ...
+ def get_view_names(self, connection, schema=..., **kw): ...
+ def get_table_options(self, connection, table_name, schema=..., **kw): ...
+ def get_columns(self, connection, table_name, schema=..., **kw): ...
+ def get_pk_constraint(self, connection, table_name, schema=..., **kw): ...
+ def get_foreign_keys(self, connection, table_name, schema=..., **kw): ...
+ def get_indexes(self, connection, table_name, schema=..., **kw): ...
+ def get_unique_constraints(self, connection, table_name, schema=..., **kw): ...
+ def get_view_definition(self, connection, view_name, schema=..., **kw): ...
+
+class ReflectedState:
+ columns = ... # type: Any
+ table_options = ... # type: Any
+ table_name = ... # type: Any
+ keys = ... # type: Any
+ constraints = ... # type: Any
+ def __init__(self) -> None: ...
+
+class MySQLTableDefinitionParser:
+ dialect = ... # type: Any
+ preparer = ... # type: Any
+ def __init__(self, dialect, preparer) -> None: ...
+ def parse(self, show_create, charset): ...
+
+class _DecodingRowProxy:
+ rowproxy = ... # type: Any
+ charset = ... # type: Any
+ def __init__(self, rowproxy, charset) -> None: ...
+ def __getitem__(self, index): ...
+ def __getattr__(self, attr): ...
diff --git a/typeshed/third_party/2/sqlalchemy/engine/__init__.pyi b/typeshed/third_party/2/sqlalchemy/engine/__init__.pyi
new file mode 100644
index 0000000..49eca6d
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/engine/__init__.pyi
@@ -0,0 +1,11 @@
+# Stubs for sqlalchemy.engine (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from .base import Connection as Connection
+from .base import Engine as Engine
+from .base import RowProxy as RowProxy
+from .base import Transaction as Transaction
+
+def create_engine(*args, **kwargs): ...
+def engine_from_config(configuration, prefix=..., **kwargs): ...
diff --git a/typeshed/third_party/2/sqlalchemy/engine/base.pyi b/typeshed/third_party/2/sqlalchemy/engine/base.pyi
new file mode 100644
index 0000000..71f6e19
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/engine/base.pyi
@@ -0,0 +1,21 @@
+from typing import Any, List, Tuple
+
+# Dummy until I figure out something better.
+class Connectable:
+ pass
+
+class Connection:
+ def begin(self): ...
+ def execute(self, object, *multiparams, **params): ...
+
+class Engine(object): ...
+
+class RowProxy:
+ def items(self) -> List[Tuple[Any, Any]]: ...
+ def keys(self) -> List[Any]: ...
+ def values(self) -> List[Any]: ...
+ def __getitem__(self, key: str): ...
+
+class Transaction:
+ def commit(self): ...
+ def rollback(self): ...
diff --git a/typeshed/third_party/2/sqlalchemy/engine/strategies.pyi b/typeshed/third_party/2/sqlalchemy/engine/strategies.pyi
new file mode 100644
index 0000000..06c2f00
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/engine/strategies.pyi
@@ -0,0 +1,39 @@
+# Stubs for sqlalchemy.engine.strategies (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+from . import base
+
+strategies = ... # type: Any
+
+class EngineStrategy:
+ def __init__(self) -> None: ...
+ def create(self, *args, **kwargs): ...
+
+class DefaultEngineStrategy(EngineStrategy):
+ def create(self, name_or_url, **kwargs): ...
+
+class PlainEngineStrategy(DefaultEngineStrategy):
+ name = ... # type: Any
+ engine_cls = ... # type: Any
+
+class ThreadLocalEngineStrategy(DefaultEngineStrategy):
+ name = ... # type: Any
+ engine_cls = ... # type: Any
+
+class MockEngineStrategy(EngineStrategy):
+ name = ... # type: Any
+ def create(self, name_or_url, executor, **kwargs): ...
+ class MockConnection(base.Connectable):
+ def __init__(self, dialect, execute) -> None: ...
+ engine = ... # type: Any
+ dialect = ... # type: Any
+ name = ... # type: Any
+ def contextual_connect(self, **kwargs): ...
+ def execution_options(self, **kw): ...
+ def compiler(self, statement, parameters, **kwargs): ...
+ def create(self, entity, **kwargs): ...
+ def drop(self, entity, **kwargs): ...
+ def execute(self, object, *multiparams, **params): ...
diff --git a/typeshed/third_party/2/sqlalchemy/engine/url.pyi b/typeshed/third_party/2/sqlalchemy/engine/url.pyi
new file mode 100644
index 0000000..76dd1ef
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/engine/url.pyi
@@ -0,0 +1,27 @@
+# Stubs for sqlalchemy.engine.url (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from .. import dialects
+
+# registry = dialects.registry
+
+class URL:
+ drivername = ... # type: Any
+ username = ... # type: Any
+ password = ... # type: Any
+ host = ... # type: Any
+ port = ... # type: Any
+ database = ... # type: Any
+ query = ... # type: Any
+ def __init__(self, drivername, username=..., password=..., host=..., port=..., database=..., query=...) -> None: ...
+ def __to_string__(self, hide_password=...): ...
+ def __hash__(self): ...
+ def __eq__(self, other): ...
+ def get_backend_name(self): ...
+ def get_driver_name(self): ...
+ def get_dialect(self): ...
+ def translate_connect_args(self, names=..., **kw): ...
+
+def make_url(name_or_url): ...
diff --git a/typeshed/third_party/2/sqlalchemy/exc.pyi b/typeshed/third_party/2/sqlalchemy/exc.pyi
new file mode 100644
index 0000000..b87b9cd
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/exc.pyi
@@ -0,0 +1,77 @@
+# Stubs for sqlalchemy.exc (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class SQLAlchemyError(Exception): ...
+class ArgumentError(SQLAlchemyError): ...
+class NoSuchModuleError(ArgumentError): ...
+class NoForeignKeysError(ArgumentError): ...
+class AmbiguousForeignKeysError(ArgumentError): ...
+
+class CircularDependencyError(SQLAlchemyError):
+ cycles = ... # type: Any
+ edges = ... # type: Any
+ def __init__(self, message, cycles, edges, msg=...) -> None: ...
+ def __reduce__(self): ...
+
+class CompileError(SQLAlchemyError): ...
+
+class UnsupportedCompilationError(CompileError):
+ def __init__(self, compiler, element_type) -> None: ...
+
+class IdentifierError(SQLAlchemyError): ...
+class DisconnectionError(SQLAlchemyError): ...
+class TimeoutError(SQLAlchemyError): ...
+class InvalidRequestError(SQLAlchemyError): ...
+class NoInspectionAvailable(InvalidRequestError): ...
+class ResourceClosedError(InvalidRequestError): ...
+class NoSuchColumnError(KeyError, InvalidRequestError): ...
+class NoReferenceError(InvalidRequestError): ...
+
+class NoReferencedTableError(NoReferenceError):
+ table_name = ... # type: Any
+ def __init__(self, message, tname) -> None: ...
+ def __reduce__(self): ...
+
+class NoReferencedColumnError(NoReferenceError):
+ table_name = ... # type: Any
+ column_name = ... # type: Any
+ def __init__(self, message, tname, cname) -> None: ...
+ def __reduce__(self): ...
+
+class NoSuchTableError(InvalidRequestError): ...
+class UnboundExecutionError(InvalidRequestError): ...
+class DontWrapMixin: ...
+
+UnmappedColumnError = ... # type: Any
+
+class StatementError(SQLAlchemyError):
+ statement = ... # type: Any
+ params = ... # type: Any
+ orig = ... # type: Any
+ detail = ... # type: Any
+ def __init__(self, message, statement, params, orig) -> None: ...
+ def add_detail(self, msg): ...
+ def __reduce__(self): ...
+ def __unicode__(self): ...
+
+class DBAPIError(StatementError):
+ @classmethod
+ def instance(cls, statement, params, orig, dbapi_base_err, connection_invalidated=..., dialect=...): ...
+ def __reduce__(self): ...
+ connection_invalidated = ... # type: Any
+ def __init__(self, statement, params, orig, connection_invalidated=...) -> None: ...
+
+class InterfaceError(DBAPIError): ...
+class DatabaseError(DBAPIError): ...
+class DataError(DatabaseError): ...
+class OperationalError(DatabaseError): ...
+class IntegrityError(DatabaseError): ...
+class InternalError(DatabaseError): ...
+class ProgrammingError(DatabaseError): ...
+class NotSupportedError(DatabaseError): ...
+class SADeprecationWarning(DeprecationWarning): ...
+class SAPendingDeprecationWarning(PendingDeprecationWarning): ...
+class SAWarning(RuntimeWarning): ...
diff --git a/typeshed/third_party/2/sqlalchemy/inspection.pyi b/typeshed/third_party/2/sqlalchemy/inspection.pyi
new file mode 100644
index 0000000..2d550cd
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/inspection.pyi
@@ -0,0 +1,5 @@
+# Stubs for sqlalchemy.inspection (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+def inspect(subject, raiseerr=...): ...
diff --git a/typeshed/third_party/2/sqlalchemy/log.pyi b/typeshed/third_party/2/sqlalchemy/log.pyi
new file mode 100644
index 0000000..9e73bd9
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/log.pyi
@@ -0,0 +1,14 @@
+import logging
+from typing import Any
+
+rootlogger = ... # type: Any
+
+class Identified(object):
+ def _should_log_debug(self) -> bool: ...
+ def _should_log_info(self) -> bool: ...
+
+class InstanceLogger(object): ...
+
+def instance_logger(instance, echoflag) -> None: ...
+
+class echo_property(object): ...
diff --git a/typeshed/third_party/2/sqlalchemy/orm/__init__.pyi b/typeshed/third_party/2/sqlalchemy/orm/__init__.pyi
new file mode 100644
index 0000000..280dd02
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/orm/__init__.pyi
@@ -0,0 +1,95 @@
+# Stubs for sqlalchemy.orm (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+# from . import mapper
+# from . import interfaces
+# from . import deprecated_interfaces
+# from . import util
+# from . import properties
+# from . import relationships
+# from . import descriptor_props
+from . import session
+# from . import scoping
+# from . import query
+from ..util import langhelpers
+# from . import strategy_options
+
+# Mapper = mapper.Mapper
+# class_mapper = mapper.class_mapper
+# configure_mappers = mapper.configure_mappers
+# reconstructor = mapper.reconstructor
+# validates = mapper.validates
+# EXT_CONTINUE = interfaces.EXT_CONTINUE
+# EXT_STOP = interfaces.EXT_STOP
+# PropComparator = interfaces.PropComparator
+# MapperExtension = deprecated_interfaces.MapperExtension
+# SessionExtension = deprecated_interfaces.SessionExtension
+# AttributeExtension = deprecated_interfaces.AttributeExtension
+# aliased = util.aliased
+# join = util.join
+# object_mapper = util.object_mapper
+# outerjoin = util.outerjoin
+# polymorphic_union = util.polymorphic_union
+# was_deleted = util.was_deleted
+# with_parent = util.with_parent
+# with_polymorphic = util.with_polymorphic
+# ColumnProperty = properties.ColumnProperty
+# RelationshipProperty = relationships.RelationshipProperty
+# ComparableProperty = descriptor_props.ComparableProperty
+# CompositeProperty = descriptor_props.CompositeProperty
+# SynonymProperty = descriptor_props.SynonymProperty
+# foreign = relationships.foreign
+# remote = relationships.remote
+Session = session.Session
+object_session = Session.object_session
+sessionmaker = session.sessionmaker
+# make_transient = session.make_transient
+# make_transient_to_detached = session.make_transient_to_detached
+# scoped_session = scoping.scoped_session
+# AliasOption = query.AliasOption
+# Query = query.Query
+# Bundle = query.Bundle
+public_factory = langhelpers.public_factory
+
+def create_session(bind=..., **kwargs): ...
+
+relationship = ... # type: Any
+
+def relation(*arg, **kw): ...
+def dynamic_loader(argument, **kw): ...
+
+column_property = ... # type: Any
+composite = ... # type: Any
+
+def backref(name, **kwargs): ...
+def deferred(*columns, **kw): ...
+
+synonym = ... # type: Any
+comparable_property = ... # type: Any
+
+def compile_mappers(): ...
+def clear_mappers(): ...
+
+joinedload = ... # type: Any
+joinedload_all = ... # type: Any
+contains_eager = ... # type: Any
+defer = ... # type: Any
+undefer = ... # type: Any
+undefer_group = ... # type: Any
+load_only = ... # type: Any
+lazyload = ... # type: Any
+lazyload_all = ... # type: Any
+subqueryload = ... # type: Any
+subqueryload_all = ... # type: Any
+immediateload = ... # type: Any
+noload = ... # type: Any
+defaultload = ... # type: Any
+
+# Load = strategy_options.Load
+
+def eagerload(*args, **kwargs): ...
+def eagerload_all(*args, **kwargs): ...
+
+contains_alias = ... # type: Any
diff --git a/typeshed/third_party/2/sqlalchemy/orm/session.pyi b/typeshed/third_party/2/sqlalchemy/orm/session.pyi
new file mode 100644
index 0000000..a53d619
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/orm/session.pyi
@@ -0,0 +1,93 @@
+# Stubs for sqlalchemy.orm.session (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class _SessionClassMethods:
+ @classmethod
+ def close_all(cls): ...
+ @classmethod
+ def identity_key(cls, orm_util, *args, **kwargs): ...
+ @classmethod
+ def object_session(cls, instance): ...
+
+class SessionTransaction:
+ session = ... # type: Any
+ nested = ... # type: Any
+ def __init__(self, session, parent=..., nested=...) -> None: ...
+ @property
+ def is_active(self): ...
+ def connection(self, bindkey, execution_options=..., **kwargs): ...
+ def prepare(self): ...
+ def commit(self): ...
+ def rollback(self, _capture_exception=...): ...
+ def close(self, invalidate=...): ...
+ def __enter__(self): ...
+ def __exit__(self, type, value, traceback): ...
+
+class Session(_SessionClassMethods):
+ public_methods = ... # type: Any
+ identity_map = ... # type: Any
+ bind = ... # type: Any
+ transaction = ... # type: Any
+ hash_key = ... # type: Any
+ autoflush = ... # type: Any
+ autocommit = ... # type: Any
+ expire_on_commit = ... # type: Any
+ twophase = ... # type: Any
+ def __init__(self, bind=..., autoflush=..., expire_on_commit=..., _enable_transaction_accounting=..., autocommit=..., twophase=..., weak_identity_map=..., binds=..., extension=..., info=..., query_cls=...) -> None: ...
+ connection_callable = ... # type: Any
+ def info(self): ...
+ def begin(self, subtransactions=..., nested=...): ...
+ def begin_nested(self): ...
+ def rollback(self): ...
+ def commit(self): ...
+ def prepare(self): ...
+ def connection(self, mapper=..., clause=..., bind=..., close_with_result=..., execution_options=..., **kw): ...
+ def execute(self, clause, params=..., mapper=..., bind=..., **kw): ...
+ def scalar(self, clause, params=..., mapper=..., bind=..., **kw): ...
+ def close(self): ...
+ def invalidate(self): ...
+ def expunge_all(self): ...
+ def bind_mapper(self, mapper, bind): ...
+ def bind_table(self, table, bind): ...
+ def get_bind(self, mapper=..., clause=...): ...
+ def query(self, *entities, **kwargs): ...
+ @property
+ def no_autoflush(self): ...
+ def refresh(self, instance, attribute_names=..., lockmode=...): ...
+ def expire_all(self): ...
+ def expire(self, instance, attribute_names=...): ...
+ def prune(self): ...
+ def expunge(self, instance): ...
+ def add(self, instance, _warn=...): ...
+ def add_all(self, instances): ...
+ def delete(self, instance): ...
+ def merge(self, instance, load=...): ...
+ def enable_relationship_loading(self, obj): ...
+ def __contains__(self, instance): ...
+ def __iter__(self): ...
+ def flush(self, objects=...): ...
+ def bulk_save_objects(self, objects, return_defaults=..., update_changed_only=...): ...
+ def bulk_insert_mappings(self, mapper, mappings, return_defaults=...): ...
+ def bulk_update_mappings(self, mapper, mappings): ...
+ def is_modified(self, instance, include_collections=..., passive=...): ...
+ @property
+ def is_active(self): ...
+ @property
+ def dirty(self): ...
+ @property
+ def deleted(self): ...
+ @property
+ def new(self): ...
+
+class sessionmaker(_SessionClassMethods):
+ kw = ... # type: Any
+ class_ = ... # type: Any
+ def __init__(self, bind=..., class_=..., autoflush=..., autocommit=..., expire_on_commit=..., info=..., **kw) -> None: ...
+ def __call__(self, **local_kw): ...
+ def configure(self, **new_kw): ...
+
+# Names in __all__ with no definition:
+# SessionExtension
diff --git a/typeshed/third_party/2/sqlalchemy/pool.pyi b/typeshed/third_party/2/sqlalchemy/pool.pyi
new file mode 100644
index 0000000..a278d6e
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/pool.pyi
@@ -0,0 +1,118 @@
+# Stubs for sqlalchemy.pool (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from . import log
+from . import util
+
+threading = util.threading
+memoized_property = util.memoized_property
+chop_traceback = util.chop_traceback
+
+proxies = ... # type: Any
+
+def manage(module, **params): ...
+def clear_managers(): ...
+
+reset_rollback = ... # type: Any
+reset_commit = ... # type: Any
+reset_none = ... # type: Any
+
+class _ConnDialect:
+ def do_rollback(self, dbapi_connection): ...
+ def do_commit(self, dbapi_connection): ...
+ def do_close(self, dbapi_connection): ...
+
+class Pool(log.Identified):
+ logging_name = ... # type: Any
+ echo = ... # type: Any
+ def __init__(self, creator, recycle=..., echo=..., use_threadlocal=..., logging_name=..., reset_on_return=..., listeners=..., events=..., _dispatch=..., _dialect=...) -> None: ...
+ def add_listener(self, listener): ...
+ def unique_connection(self): ...
+ def recreate(self): ...
+ def dispose(self): ...
+ def connect(self): ...
+ def status(self): ...
+
+ _threadconns = ... # type: Any
+ _creator = ... # type: Any
+ _recycle = ... # type: Any
+ _invalidate_time = ... # type: Any
+ dispatch = ... # type: Any
+ _dialect = ... # type: Any
+ _orig_logging_name = ... # type: Any
+ _reset_on_return = ... # type: Any
+ _use_threadlocal = ... # type: Any
+
+class _ConnectionRecord:
+ connection = ... # type: Any
+ finalize_callback = ... # type: Any
+ def __init__(self, pool) -> None: ...
+ def info(self): ...
+ @classmethod
+ def checkout(cls, pool): ...
+ fairy_ref = ... # type: Any
+ def checkin(self): ...
+ def close(self): ...
+ def invalidate(self, e=..., soft=...): ...
+ def get_connection(self): ...
+
+class _ConnectionFairy:
+ connection = ... # type: Any
+ def __init__(self, dbapi_connection, connection_record, echo) -> None: ...
+ @property
+ def is_valid(self): ...
+ def info(self): ...
+ def invalidate(self, e=..., soft=...): ...
+ def cursor(self, *args, **kwargs): ...
+ def __getattr__(self, key): ...
+ def detach(self): ...
+ def close(self): ...
+
+class SingletonThreadPool(Pool):
+ size = ... # type: Any
+ def __init__(self, creator, pool_size=..., **kw) -> None: ...
+ def recreate(self): ...
+ def dispose(self): ...
+ def status(self): ...
+
+class QueuePool(Pool):
+ def __init__(self, creator, pool_size=..., max_overflow=..., timeout=..., **kw) -> None: ...
+ def recreate(self): ...
+ def dispose(self): ...
+ def status(self): ...
+ def size(self): ...
+ def checkedin(self): ...
+ def overflow(self): ...
+ def checkedout(self): ...
+
+class NullPool(Pool):
+ def status(self): ...
+ def recreate(self): ...
+ def dispose(self): ...
+
+class StaticPool(Pool):
+ def connection(self): ...
+ def status(self): ...
+ def dispose(self): ...
+ def recreate(self): ...
+
+class AssertionPool(Pool):
+ def __init__(self, *args, **kw) -> None: ...
+ def status(self): ...
+ def dispose(self): ...
+ def recreate(self): ...
+
+class _DBProxy:
+ module = ... # type: Any
+ kw = ... # type: Any
+ poolclass = ... # type: Any
+ pools = ... # type: Any
+ def __init__(self, module, poolclass=..., **kw) -> None: ...
+ def close(self): ...
+ def __del__(self): ...
+ def __getattr__(self, key): ...
+ def get_pool(self, *args, **kw): ...
+ def connect(self, *args, **kw): ...
+ def dispose(self, *args, **kw): ...
diff --git a/typeshed/third_party/2/sqlalchemy/schema.pyi b/typeshed/third_party/2/sqlalchemy/schema.pyi
new file mode 100644
index 0000000..f788897
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/schema.pyi
@@ -0,0 +1,50 @@
+# Stubs for sqlalchemy.schema (Python 2)
+
+from .sql import base
+from .sql import schema
+from .sql import naming
+from .sql import ddl
+from .sql import elements
+
+SchemaVisitor = base.SchemaVisitor
+CheckConstraint = schema.CheckConstraint
+Column = schema.Column
+ColumnDefault = schema.ColumnDefault
+Constraint = schema.Constraint
+DefaultClause = schema.DefaultClause
+DefaultGenerator = schema.DefaultGenerator
+FetchedValue = schema.FetchedValue
+ForeignKey = schema.ForeignKey
+ForeignKeyConstraint = schema.ForeignKeyConstraint
+Index = schema.Index
+MetaData = schema.MetaData
+PassiveDefault = schema.PassiveDefault
+PrimaryKeyConstraint = schema.PrimaryKeyConstraint
+SchemaItem = schema.SchemaItem
+Sequence = schema.Sequence
+Table = schema.Table
+ThreadLocalMetaData = schema.ThreadLocalMetaData
+UniqueConstraint = schema.UniqueConstraint
+_get_table_key = schema._get_table_key
+ColumnCollectionConstraint = schema.ColumnCollectionConstraint
+ColumnCollectionMixin = schema.ColumnCollectionMixin
+conv = elements.conv
+DDL = ddl.DDL
+CreateTable = ddl.CreateTable
+DropTable = ddl.DropTable
+CreateSequence = ddl.CreateSequence
+DropSequence = ddl.DropSequence
+CreateIndex = ddl.CreateIndex
+DropIndex = ddl.DropIndex
+CreateSchema = ddl.CreateSchema
+DropSchema = ddl.DropSchema
+_DropView = ddl._DropView
+CreateColumn = ddl.CreateColumn
+AddConstraint = ddl.AddConstraint
+DropConstraint = ddl.DropConstraint
+DDLBase = ddl.DDLBase
+DDLElement = ddl.DDLElement
+_CreateDropBase = ddl._CreateDropBase
+_DDLCompiles = ddl._DDLCompiles
+sort_tables = ddl.sort_tables
+sort_tables_and_constraints = ddl.sort_tables_and_constraints
diff --git a/typeshed/third_party/2/sqlalchemy/sql/__init__.pyi b/typeshed/third_party/2/sqlalchemy/sql/__init__.pyi
new file mode 100644
index 0000000..91d06d8
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/sql/__init__.pyi
@@ -0,0 +1,66 @@
+# Stubs for sqlalchemy.sql (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from . import expression
+from . import visitors
+
+Alias = expression.Alias
+ClauseElement = expression.ClauseElement
+ColumnCollection = expression.ColumnCollection
+ColumnElement = expression.ColumnElement
+CompoundSelect = expression.CompoundSelect
+Delete = expression.Delete
+FromClause = expression.FromClause
+Insert = expression.Insert
+Join = expression.Join
+Select = expression.Select
+Selectable = expression.Selectable
+TableClause = expression.TableClause
+Update = expression.Update
+alias = expression.alias
+and_ = expression.and_
+asc = expression.asc
+between = expression.between
+bindparam = expression.bindparam
+case = expression.case
+cast = expression.cast
+collate = expression.collate
+column = expression.column
+delete = expression.delete
+desc = expression.desc
+distinct = expression.distinct
+except_ = expression.except_
+except_all = expression.except_all
+exists = expression.exists
+extract = expression.extract
+false = expression.false
+False_ = expression.False_
+func = expression.func
+funcfilter = expression.funcfilter
+insert = expression.insert
+intersect = expression.intersect
+intersect_all = expression.intersect_all
+join = expression.join
+label = expression.label
+literal = expression.literal
+literal_column = expression.literal_column
+modifier = expression.modifier
+not_ = expression.not_
+null = expression.null
+or_ = expression.or_
+outerjoin = expression.outerjoin
+outparam = expression.outparam
+over = expression.over
+select = expression.select
+subquery = expression.subquery
+table = expression.table
+text = expression.text
+true = expression.true
+True_ = expression.True_
+tuple_ = expression.tuple_
+type_coerce = expression.type_coerce
+union = expression.union
+union_all = expression.union_all
+update = expression.update
+ClauseVisitor = visitors.ClauseVisitor
diff --git a/typeshed/third_party/2/sqlalchemy/sql/annotation.pyi b/typeshed/third_party/2/sqlalchemy/sql/annotation.pyi
new file mode 100644
index 0000000..ba0aba4
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/sql/annotation.pyi
@@ -0,0 +1,11 @@
+class Annotated(object):
+ def __new__(cls, *args): ...
+ def __init__(self, element, values): ...
+ def _annotate(self, values): ...
+ def _with_annotations(self, values): ...
+ def _deannotate(self, values=..., clone: bool=...): ...
+ def _compiler_dispatch(self, visitor, **kw): ...
+ def _constructor(self): ...
+ def _clone(self): ...
+ def __hash__(self): ...
+ def __eq__(self): ...
diff --git a/typeshed/third_party/2/sqlalchemy/sql/base.pyi b/typeshed/third_party/2/sqlalchemy/sql/base.pyi
new file mode 100644
index 0000000..48e68c7
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/sql/base.pyi
@@ -0,0 +1,42 @@
+from typing import Any, Iterable
+
+from .visitors import ClauseVisitor
+from .. import util
+
+class Immutable(object):
+ def unique_params(self, *optionaldict, **kwargs): ...
+ def params(self, *optionaldict, **kwargs): ...
+ def _clone(self) -> Immutable: ...
+
+class DialectKWArgs(object):
+ def argument_for(cls, dialect_name, argument_name, default): ...
+ def kwargs(self): ...
+ def dialect_options(self): ...
+
+class Generative(object): ...
+
+class Executable(Generative):
+ def execution_options(self, **kw): ...
+ def execute(self, *multiparams, **params): ...
+ def scalar(self, *multiparams, **params): ...
+
+ @property
+ def bind(self): ...
+
+class SchemaEventTarget(object): ...
+class SchemaVisitor(ClauseVisitor): ...
+class ColumnCollection(util.OrderedProperties):
+ def replace(self, column): ...
+ def add(self, column): ...
+ def clear(self): ...
+ def remove(self, column): ...
+ def update(self, iter: Iterable[Any]): ...
+ def extend(self, iter: Iterable[Any]): ...
+ def contains_column(self, col): ...
+ def as_immutable(self): ...
+
+class ImmutableColumnCollection(util.ImmutableProperties, ColumnCollection): ...
+
+class ColumnSet(util.ordered_column_set): ...
+
+def _bind_or_error(schemaitem, msg): ...
diff --git a/typeshed/third_party/2/sqlalchemy/sql/ddl.pyi b/typeshed/third_party/2/sqlalchemy/sql/ddl.pyi
new file mode 100644
index 0000000..06ac96a
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/sql/ddl.pyi
@@ -0,0 +1,25 @@
+from .elements import ClauseElement
+from .base import Executable, SchemaVisitor
+
+class _DDLCompiles(ClauseElement): ...
+class DDLElement(Executable, _DDLCompiles): ...
+class DDL(DDLElement): ...
+class _CreateDropBase(DDLElement): ...
+class CreateSchema(_CreateDropBase): ...
+class DropSchema(_CreateDropBase): ...
+class CreateTable(_CreateDropBase): ...
+class _DropView(_CreateDropBase): ...
+class CreateColumn(_DDLCompiles): ...
+class DropTable(_CreateDropBase): ...
+class CreateSequence(_CreateDropBase): ...
+class DropSequence(_CreateDropBase): ...
+class CreateIndex(_CreateDropBase): ...
+class DropIndex(_CreateDropBase): ...
+class AddConstraint(_CreateDropBase): ...
+class DropConstraint(_CreateDropBase): ...
+class DDLBase(SchemaVisitor): ...
+class SchemaGenerator(DDLBase): ...
+class SchemaDropper(DDLBase): ...
+
+def sort_tables(tables, skip_fn=..., extra_dependencies=...): ...
+def sort_tables_and_constraints(tables, filter_fn=..., extra_dependencies=...): ...
diff --git a/typeshed/third_party/2/sqlalchemy/sql/dml.pyi b/typeshed/third_party/2/sqlalchemy/sql/dml.pyi
new file mode 100644
index 0000000..79cb201
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/sql/dml.pyi
@@ -0,0 +1,20 @@
+from typing import AnyStr
+
+from .base import Executable, DialectKWArgs
+from .elements import ClauseElement
+from .selectable import HasPrefixes
+
+class UpdateBase(DialectKWArgs, HasPrefixes, Executable, ClauseElement):
+ def params(self, *arg, **kw): ...
+ @property
+ def bind(self): ...
+ def returning(self, *cols): ...
+ def with_hint(self, text, selectable=..., dialect_name: AnyStr=...): ...
+
+class ValuesBase(UpdateBase):
+ def values(self, *args, **kwargs): ...
+ def return_defaults(self, *cols): ...
+
+class Insert(ValuesBase): ...
+class Update(ValuesBase): ...
+class Delete(UpdateBase): ...
diff --git a/typeshed/third_party/2/sqlalchemy/sql/elements.pyi b/typeshed/third_party/2/sqlalchemy/sql/elements.pyi
new file mode 100644
index 0000000..e2a8d38
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/sql/elements.pyi
@@ -0,0 +1,60 @@
+
+from .visitors import Visitable
+from .annotation import Annotated
+from .base import Executable, Immutable
+from .operators import ColumnOperators
+from .. import util
+
+class ClauseElement(Visitable): ...
+
+class ColumnElement(ColumnOperators, ClauseElement): ...
+
+class BindParameter(ColumnElement): ...
+class BinaryExpression(ColumnElement): ...
+
+class TypeClause(ClauseElement): ...
+class TextClause(Executable, ClauseElement): ...
+
+class Null(ColumnElement): ...
+class False_(ColumnElement): ...
+class True_(ColumnElement): ...
+
+class ClauseList(ClauseElement): ...
+class BooleanClauseList(ClauseList, ColumnElement): ...
+class Tuple(ClauseList, ColumnElement): ...
+class Case(ColumnElement): ...
+class Cast(ColumnElement): ...
+class Extract(ColumnElement): ...
+class _label_reference(ColumnElement): ...
+
+class _textual_label_reference(ColumnElement): ...
+class UnaryExpression(ColumnElement): ...
+class AsBoolean(UnaryExpression): ...
+class Grouping(ColumnElement): ...
+class Over(ColumnElement): ...
+class FunctionFilter(ColumnElement): ...
+class Label(ColumnElement): ...
+class ColumnClause(Immutable, ColumnElement): ...
+class _IdentifiedClause(Executable, ClauseElement): ...
+class SavepointClause(_IdentifiedClause): ...
+class RollbackToSavepointClause(_IdentifiedClause): ...
+class ReleaseSavepointClause(_IdentifiedClause): ...
+class quoted_name(util.MemoizedSlots, util.text_type): ...
+class _truncated_label(quoted_name): ...
+class conv(_truncated_label): ...
+class _defer_name(_truncated_label): ...
+class _defer_none_name(_defer_name): ...
+class _anonymous_label(_truncated_label): ...
+class AnnotatedColumnElement(Annotated): ...
+
+def _clone(element, **kw): ...
+def _type_from_args(args): ...
+def _literal_as_binds(element, name, type_=None): ...
+
+def collate(expression, collation) -> BinaryExpression: ...
+def between(expr, lower_bound, upper_bound, symmetric: bool=...): ...
+def literal(value, type_=None) -> BindParameter: ...
+def outparam(key, type_=None) -> BindParameter: ...
+def type_coerce(expression, type_): ...
+def not_(clause): ...
+def literal_column(text, type_=None): ...
diff --git a/typeshed/third_party/2/sqlalchemy/sql/expression.pyi b/typeshed/third_party/2/sqlalchemy/sql/expression.pyi
new file mode 100644
index 0000000..48fc3b8
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/sql/expression.pyi
@@ -0,0 +1,87 @@
+# Stubs for sqlalchemy.sql.expression (Python 2)
+
+from typing import Any
+from . import functions
+from . import elements
+from . import base
+from . import selectable
+from . import dml
+
+from .visitors import Visitable
+
+from .elements import ClauseElement, ColumnElement,\
+ BindParameter, UnaryExpression, BooleanClauseList, \
+ Label, Cast, Case, ColumnClause, TextClause, Over, Null, \
+ True_, False_, BinaryExpression, Tuple, TypeClause, Extract, \
+ Grouping, not_, \
+ collate, literal_column, between,\
+ literal, outparam, type_coerce, ClauseList, FunctionFilter
+from .elements import SavepointClause, RollbackToSavepointClause, \
+ ReleaseSavepointClause
+from .base import ColumnCollection, Generative, Executable
+from .selectable import Alias, Join, Select, Selectable, TableClause, \
+ CompoundSelect, CTE, FromClause, FromGrouping, SelectBase, \
+ alias, GenerativeSelect, \
+ subquery, HasPrefixes, HasSuffixes, Exists, ScalarSelect, TextAsFrom
+from .dml import Insert, Update, Delete, UpdateBase, ValuesBase
+
+func = functions.func # type: functions._FunctionGenerator
+modifier = functions.modifier # type: functions._FunctionGenerator
+
+and_ = ... # type: Any
+or_ = ... # type: Any
+bindparam = ... # type: Any
+select = ... # type: Any
+text = ... # type: Any
+table = ... # type: Any
+column = ... # type: Any
+over = ... # type: Any
+label = ... # type: Any
+case = ... # type: Any
+cast = ... # type: Any
+extract = ... # type: Any
+tuple_ = ... # type: Any
+except_ = ... # type: Any
+except_all = ... # type: Any
+intersect = ... # type: Any
+intersect_all = ... # type: Any
+union = ... # type: Any
+union_all = ... # type: Any
+exists = ... # type: Any
+nullsfirst = ... # type: Any
+nullslast = ... # type: Any
+asc = ... # type: Any
+desc = ... # type: Any
+distinct = ... # type: Any
+true = ... # type: Any
+false = ... # type: Any
+null = ... # type: Any
+join = ... # type: Any
+outerjoin = ... # type: Any
+insert = ... # type: Any
+update = ... # type: Any
+delete = ... # type: Any
+funcfilter = ... # type: Any
+
+# old names for compatibility
+_Executable = Executable
+_BindParamClause = BindParameter
+_Label = Label
+_SelectBase = SelectBase
+_BinaryExpression = BinaryExpression
+_Cast = Cast
+_Null = Null
+_False = False_
+_True = True_
+_TextClause = TextClause
+_UnaryExpression = UnaryExpression
+_Case = Case
+_Tuple = Tuple
+_Over = Over
+_Generative = Generative
+_TypeClause = TypeClause
+_Extract = Extract
+_Exists = Exists
+_Grouping = Grouping
+_FromGrouping = FromGrouping
+_ScalarSelect = ScalarSelect
diff --git a/typeshed/third_party/2/sqlalchemy/sql/functions.pyi b/typeshed/third_party/2/sqlalchemy/sql/functions.pyi
new file mode 100644
index 0000000..b656456
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/sql/functions.pyi
@@ -0,0 +1,47 @@
+
+from .base import Executable, ColumnCollection
+from .elements import ClauseList, Cast, Extract, _literal_as_binds, \
+ literal_column, _type_from_args, ColumnElement, _clone,\
+ Over, BindParameter, FunctionFilter
+from .selectable import FromClause, Select, Alias
+from .visitors import VisitableType
+
+class FunctionElement(Executable, ColumnElement, FromClause): ...
+
+class _FunctionGenerator(object):
+ def __init__(self, **opts): ...
+ def __getattr__(self, name): ...
+ def __call__(self, *c, **kwargs) -> Function: ...
+
+func = ... # type: _FunctionGenerator
+modifier = ... # type: _FunctionGenerator
+
+class Function(FunctionElement): ...
+
+class _GenericMeta(VisitableType): ...
+# TODO: Use GenericFunction(util.with_metaclass(_GenericMeta, Function))
+class GenericFunction(_GenericMeta, Function): ...
+class next_value(GenericFunction): ...
+
+class AnsiFunction(GenericFunction): ...
+class ReturnTypeFromArgs(GenericFunction): ...
+
+class coalesce(ReturnTypeFromArgs): ...
+class max(ReturnTypeFromArgs): ...
+class min(ReturnTypeFromArgs): ...
+class sum(ReturnTypeFromArgs): ...
+class now(GenericFunction): ...
+class concat(GenericFunction): ...
+
+class char_length(GenericFunction): ...
+class random(GenericFunction): ...
+class count(GenericFunction): ...
+class current_date(AnsiFunction): ...
+class current_time(AnsiFunction): ...
+class current_timestamp(AnsiFunction): ...
+class current_user(AnsiFunction): ...
+class localtime(AnsiFunction): ...
+class localtimestamp(AnsiFunction): ...
+class session_user(AnsiFunction): ...
+class sysdate(AnsiFunction): ...
+class user(AnsiFunction): ...
diff --git a/typeshed/third_party/2/sqlalchemy/sql/naming.pyi b/typeshed/third_party/2/sqlalchemy/sql/naming.pyi
new file mode 100644
index 0000000..d9172c4
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/sql/naming.pyi
@@ -0,0 +1 @@
+class ConventionDict(object): ...
diff --git a/typeshed/third_party/2/sqlalchemy/sql/operators.pyi b/typeshed/third_party/2/sqlalchemy/sql/operators.pyi
new file mode 100644
index 0000000..5ae39cd
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/sql/operators.pyi
@@ -0,0 +1,99 @@
+from typing import Any, AnyStr, Callable
+
+class Operators(object):
+ def op(self, opstring: AnyStr, precedence: int, is_comparison: bool): ...
+ def operate(self, op: Callable[[Any], Any], *other, **kwargs): ...
+ def reverse_operator(self, op: Callable[[Any], Any], *other, **kwargs): ...
+ def __and__(self, other): ...
+ def __or__(self, other): ...
+ def __invert__(self): ...
+
+
+class ColumnOperators(Operators):
+ def concat(self, other): ...
+ def like(self, other, escape=None): ...
+ def ilike(self, other, escape=None): ...
+ def notlike(self, other, escape=None): ...
+ def notilike(self, other, escape=None): ...
+ def in_(self, other): ...
+ def notin_(self, other): ...
+ def is_(self, other): ...
+ def startswith(self, other, **kwargs): ...
+ def endswith(self, other, **kwargs): ...
+ def contains(self, other, **kwargs): ...
+ def match(self, other, **kwargs): ...
+ def desc(self): ...
+ def asc(self): ...
+ def nullsfirst(self): ...
+ def nullslast(self): ...
+ def collate(self, collation): ...
+ def between(self, cleft, cright, symmetric: bool = ...): ...
+ def distinct(self): ...
+
+ def __lt__(self, other): ...
+ def __le__(self, other): ...
+ def __eq__(self, other): ...
+ def __ne__(self, other): ...
+ def __gt__(self, other): ...
+ def __ge__(self, other): ...
+ def __neg__(self, other): ...
+ def __getitem__(self, index): ...
+ def __lshift__(self, other): ...
+ def __rshift__(self, other): ...
+
+ def __radd__(self, other): ...
+ def __rsub__(self, other): ...
+ def __rmul__(self, other): ...
+ def __rdiv__(self, other): ...
+ def __rmod__(self, other): ...
+ def __add__(self, other): ...
+ def __sub__(self, other): ...
+ def __mul__(self, other): ...
+ def __div__(self, other): ...
+ def __mod__(self, other): ...
+ def __truediv__(self, other): ...
+ def __rtruediv__(self, other): ...
+
+def from_(): ...
+def as_(): ...
+def exists(): ...
+def istrue(a): ...
+def isfalse(a): ...
+def is_(a, b): ...
+def isnot(a, b): ...
+def collate(a, b): ...
+def op(a, opstring, b): ...
+
+def like_op(a, b, escape=None): ...
+def notlike_op(a, b, escape=None): ...
+def ilike_op(a, b, escape=None): ...
+def notilike_op(a, b, escape=None): ...
+def between_op(a, b, symmetric: bool): ...
+def notbetween_(a, b, symmetric: bool): ...
+
+def in_op(a, b): ...
+def notin_op(a, b): ...
+def distinct_op(a): ...
+
+def startswith_op(a, b, escape=None): ...
+def notstartswith_op(a, b, escape=None): ...
+def endswith_op(a, b, escape=None): ...
+def notendswith_op(a, b, escape=None): ...
+def contains_op(a, b, escape=None): ...
+def notcontains_op(a, b, escape=None): ...
+
+def match_op(a, b, **kw): ...
+def notmatch_op(a, b, **kw): ...
+
+def comma_op(a, b): ...
+def concat_op(a, b): ...
+
+def desc_op(a): ...
+def asc_op(a): ...
+def nullsfirst_op(a): ...
+def nullslast_op(a): ...
+
+def is_comparison(op): ...
+def is_commutative(op): ...
+def is_ordering_modified(op): ...
+def is_precedent(operator, against): ...
diff --git a/typeshed/third_party/2/sqlalchemy/sql/schema.pyi b/typeshed/third_party/2/sqlalchemy/sql/schema.pyi
new file mode 100644
index 0000000..b2b3e4c
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/sql/schema.pyi
@@ -0,0 +1,126 @@
+from typing import Any, AnyStr
+
+from .base import SchemaEventTarget, DialectKWArgs
+from .base import ColumnCollection
+from .elements import ClauseElement, ColumnClause, TextClause, \
+ ColumnElement
+from .selectable import TableClause
+
+from . import visitors
+
+class SchemaItem(SchemaEventTarget, visitors.Visitable):
+ def _execute_on_connection(self, connection, multiparams, params): ...
+ @property
+ def info(self): ...
+ @property
+ def quote(self): ...
+ def get_children(self, **kwargs): ...
+ def _init_items(self, *args): ...
+ def _schema_item_copy(self, schema_item): ...
+ def __repr__(self): ...
+
+
+class Table(DialectKWArgs, SchemaItem, TableClause):
+ def __init__(self, name, metadata, *args, **kwargs): ...
+ @property
+ def key(self): ...
+ @property
+ def primary_key(self): ...
+ def __repr__(self): ...
+ def __str__(self): ...
+ def append_column(self, column): ...
+ def append_constraint(self, constraint): ...
+ def append_ddl_listener(self, event, listener): ...
+ def get_children(self, column_collections=True, schema_visitor=False, **kwargs): ...
+ def exists(self, bind=None): ...
+ def create(self, bind=None, checkfirst=False): ...
+ def drop(self, bind=None, checkfirst=False): ...
+ def tometadata(self, metadata, schema=None): ...
+ c = ... # type: ColumnCollection
+ constraints = ... # type: Set[Constraint]
+
+
+class Column(SchemaItem, ColumnClause):
+ primary_key = ... # type: Any
+ def __init__(self, *args, **kwargs): ...
+ def references(self, column): ...
+ def append_foreign_key(self, fk): ...
+ def __repr__(self): ...
+ def _set_parent(self, table): ...
+ def _setup_on_memoized_fks(self, fn): ...
+ def _on_table_attach(self, fn): ...
+ def copy(self, **kw): ...
+ def _make_proxy(self, selectable, name=None, key=None,
+ name_is_truncatable=False, **kw): ...
+ def get_children(self, schema_visitor=False, **kwargs): ...
+
+
+class ForeignKey(DialectKWArgs, SchemaItem):
+ def __init__(self, column, _constraint=None, use_alter=False, name=None,
+ onupdate=None, ondelete=None, deferrable=None,
+ initially=None, link_to_name=False, match=None,
+ info=None, **dialect_kw) -> None: ...
+ def __repr__(self): ...
+ def copy(self, schema=None): ...
+ def _get_colspec(self, schema=None, table_name=None): ...
+ @property
+ def _referred_schema(self): ...
+ def _table_key(self): ...
+ def references(self, table): ...
+ def get_referent(self, table): ...
+ @property
+ def _column_tokens(self): ...
+ def _resolve_col_tokens(self): ...
+ def _link_to_col_by_colstring(self, parenttable, table, colname): ...
+ def _set_target_column(self, column): ...
+ @property
+ def column(self): ...
+ def _set_parent(self, column): ...
+ def _set_remote_table(self, table): ...
+ def _remove_from_metadata(self, metadata): ...
+ def _set_table(self, column, table): ...
+
+class _NotAColumnExpr(object): ...
+class DefaultGenerator(_NotAColumnExpr, SchemaItem): ...
+class ColumnDefault(DefaultGenerator): ...
+class Sequence(DefaultGenerator): ...
+class FetchedValue(_NotAColumnExpr, SchemaEventTarget): ...
+class DefaultClause(FetchedValue): ...
+class PassiveDefault(DefaultClause): ...
+
+class Constraint(DialectKWArgs, SchemaItem):
+ def __init__(self, name=None, deferrable=None, initially=None): ...
+ def __contains__(self, x): ...
+ def contains_column(self, col): ...
+ def keys(self): ...
+ def __add__(self, other): ...
+ def __iter__(self): ...
+ def __len__(self): ...
+ def copy(self, **kw): ...
+
+class ColumnCollectionMixin(object):
+ columns = ... # type: Any
+ def __init__(self, *columns, **kw): ...
+ @classmethod
+ def _extract_col_expression_collection(cls, expressions): ...
+ def _check_attach(self, evt=False): ...
+ def _set_parent(self, table): ...
+
+class ColumnCollectionConstraint(ColumnCollectionMixin, Constraint):
+ def __init__(self, *columns, **kw): ...
+ def _set_parent(self, table): ...
+ def __contains__(self, x): ...
+ def copy(self, **kw): ...
+ def contains_column(self, col): ...
+ def __iter__(self): ...
+ def __len__(self): ...
+
+class CheckConstraint(ColumnCollectionConstraint): ...
+class ForeignKeyConstraint(ColumnCollectionConstraint): ...
+class PrimaryKeyConstraint(ColumnCollectionConstraint): ...
+class UniqueConstraint(ColumnCollectionConstraint): ...
+class Index(DialectKWArgs, ColumnCollectionMixin, SchemaItem): ...
+class MetaData(SchemaItem): ...
+class ThreadLocalMetaData(MetaData): ...
+
+def _get_table_key(name: AnyStr, schema: AnyStr): ...
diff --git a/typeshed/third_party/2/sqlalchemy/sql/selectable.pyi b/typeshed/third_party/2/sqlalchemy/sql/selectable.pyi
new file mode 100644
index 0000000..a3b1925
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/sql/selectable.pyi
@@ -0,0 +1,74 @@
+from .base import Immutable, Executable, \
+ ColumnCollection, ColumnSet, Generative
+from .elements import ClauseElement, TextClause, ClauseList, \
+ Grouping, UnaryExpression, BindParameter
+from .annotation import Annotated
+from .visitors import Visitable
+from .. import util
+
+def subquery(alias, *args, **kwargs): ...
+def alias(selectable, name=..., flat: bool=...): ...
+
+class Selectable(ClauseElement):
+ def selectable(self): ...
+
+class HasPrefixes(object):
+ def prefix_with(self, *expr, **kw): ...
+
+class HasSuffixes(object):
+ def suffix_with(self, *expr, **kw): ...
+
+class FromClause(Selectable):
+ def count(self, functions, whereclause=None, **params): ...
+ def select(self, whereclause=None, **params): ...
+ def join(self, right, onclause=None, isouter: bool=False): ...
+ def outerjoin(self, right, onclause=None): ...
+ def alias(self, name=None, flat: bool=False): ...
+ def is_derived_from(self, fromclause): ...
+ def _is_lexical_equivalent(self, other): ...
+ def replace_selectable(self, sqlutil, old, alias): ...
+ def correspond_on_equivalents(self, column, equivalents): ...
+ def corresponding_column(self, column, require_embedded: bool=False): ...
+ @property
+ def description(self): ...
+ def _reset_exported(self): ...
+ @property
+ def columns(self): ...
+ @property
+ def primary_key(self): ...
+ @property
+ def foreign_keys(self): ...
+ def _init_collections(self): ...
+ @property
+ def _cols_populated(self): ...
+ def _populate_column_collection(self): ...
+ def _refresh_for_new_column(self, column): ...
+
+class Join(FromClause): ...
+class Alias(FromClause): ...
+class CTE(Generative, HasSuffixes, Alias): ...
+class FromGrouping(FromClause): ...
+
+class TableClause(Immutable, FromClause):
+ def __init__(self, name, *columns): ...
+ def _export_columns(self): ...
+ @util.memoized_property
+ def description(self): ...
+ def append_column(self, c): ...
+ def get_children(self, **kwargs): ...
+ def count(self, whereclause=None, **params): ...
+ def insert(self, values=None, inline=False, **kwargs): ...
+ def update(self, whereclause=None, values=None, inline=False, **kwargs): ...
+ def delete(self, whereclause=None, **kwargs): ...
+ @property
+ def _from_objects(self): ...
+
+class ForUpdateArg(ClauseElement): ...
+class SelectBase(Executable, FromClause): ...
+class GenerativeSelect(SelectBase): ...
+class CompoundSelect(GenerativeSelect): ...
+class Select(HasPrefixes, HasSuffixes, GenerativeSelect): ...
+class ScalarSelect(Generative, Grouping): ...
+class Exists(UnaryExpression): ...
+class TextAsFrom(SelectBase): ...
+class AnnotatedFromClause(Annotated): ...
diff --git a/typeshed/third_party/2/sqlalchemy/sql/sqltypes.pyi b/typeshed/third_party/2/sqlalchemy/sql/sqltypes.pyi
new file mode 100644
index 0000000..6c51ef7
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/sql/sqltypes.pyi
@@ -0,0 +1,57 @@
+from .type_api import TypeEngine, TypeDecorator
+from .base import SchemaEventTarget
+
+class _DateAffinity(object): ...
+class Concatenable(object): ...
+class String(TypeEngine, Concatenable):
+ def __init__(self, length=None, collation=None,
+ convert_unicode=False,
+ unicode_error=None,
+ _warn_on_bytestring=False): ...
+
+class Text(String): ...
+class Unicode(String): ...
+class UnicodeText(Text): ...
+class Integer(TypeEngine, _DateAffinity): ...
+class SmallInteger(Integer): ...
+class BigInteger(Integer): ...
+class Numeric(TypeEngine, _DateAffinity): ...
+class Float(Numeric): ...
+class DateTime(TypeEngine, _DateAffinity):
+ def __init__(self, timezone=None): ...
+class Date(TypeEngine, _DateAffinity): ...
+class Time(TypeEngine, _DateAffinity): ...
+class _Binary(TypeEngine): ...
+class LargeBinary(_Binary): ...
+class Binary(LargeBinary): ...
+class SchemaType(SchemaEventTarget): ...
+class Enum(String, SchemaType): ...
+class PickleType(TypeDecorator): ...
+class Boolean(TypeEngine, SchemaType): ...
+class Interval(_DateAffinity, TypeDecorator): ...
+
+class REAL(Float): ...
+class FLOAT(Float): ...
+class NUMERIC(Numeric): ...
+class DECIMAL(Numeric): ...
+class INTEGER(Integer): ...
+# In code it's INT=INTEGER
+class INT(Integer): ...
+class SMALLINT(SmallInteger): ...
+class BIGINT(BigInteger): ...
+class TIMESTAMP(DateTime): ...
+class DATETIME(DateTime): ...
+class DATE(Date): ...
+class TIME(Time): ...
+class TEXT(Text): ...
+class CLOB(Text): ...
+class VARCHAR(String): ...
+class NVARCHAR(Unicode): ...
+class CHAR(String): ...
+class NCHAR(Unicode): ...
+class BLOB(LargeBinary): ...
+class BINARY(_Binary): ...
+class VARBINARY(_Binary): ...
+class BOOLEAN(Boolean): ...
+class NullType(TypeEngine): ...
+class MatchType(Boolean): ...
diff --git a/typeshed/third_party/2/sqlalchemy/sql/type_api.pyi b/typeshed/third_party/2/sqlalchemy/sql/type_api.pyi
new file mode 100644
index 0000000..9b8d0e8
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/sql/type_api.pyi
@@ -0,0 +1,16 @@
+from .. import util
+from .visitors import Visitable, VisitableType
+
+class TypeEngine(Visitable):
+ @property
+ def python_type(self): ...
+ def get_dbapi_type(self, dbapi): ...
+ def literal_processor(self, dialect): ...
+ def bind_processor(self, dialect): ...
+ def result_processor(self, dialect, coltype): ...
+
+class VisitableCheckKWArg(util.EnsureKWArgType, VisitableType): ...
+# TODO: class UserDefinedType(util.with_metaclass(VisitableCheckKWArg, TypeEngine)):
+class UserDefinedType(VisitableCheckKWArg, TypeEngine): ...
+class TypeDecorator(TypeEngine): ...
+class Variant(TypeDecorator): ...
diff --git a/typeshed/third_party/2/sqlalchemy/sql/visitors.pyi b/typeshed/third_party/2/sqlalchemy/sql/visitors.pyi
new file mode 100644
index 0000000..6fc58e7
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/sql/visitors.pyi
@@ -0,0 +1,33 @@
+# Stubs for sqlalchemy.sql.visitors (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class VisitableType(type):
+ def __init__(cls, clsname, bases, clsdict) -> None: ...
+
+class Visitable: ...
+
+class ClauseVisitor:
+ __traverse_options__ = ... # type: Any
+ def traverse_single(self, obj, **kw): ...
+ def iterate(self, obj): ...
+ def traverse(self, obj): ...
+ def chain(self, visitor): ...
+
+class CloningVisitor(ClauseVisitor):
+ def copy_and_process(self, list_): ...
+ def traverse(self, obj): ...
+
+class ReplacingCloningVisitor(CloningVisitor):
+ def replace(self, elem): ...
+ def traverse(self, obj): ...
+
+def iterate(obj, opts): ...
+def iterate_depthfirst(obj, opts): ...
+def traverse_using(iterator, obj, visitors): ...
+def traverse(obj, opts, visitors): ...
+def traverse_depthfirst(obj, opts, visitors): ...
+def cloned_traverse(obj, opts, visitors): ...
+def replacement_traverse(obj, opts, replace): ...
diff --git a/typeshed/third_party/2/sqlalchemy/types.pyi b/typeshed/third_party/2/sqlalchemy/types.pyi
new file mode 100644
index 0000000..7aa160c
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/types.pyi
@@ -0,0 +1,51 @@
+# Stubs for sqlalchemy.types (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from .sql import type_api
+from .sql import sqltypes
+
+TypeEngine = type_api.TypeEngine
+TypeDecorator = type_api.TypeDecorator
+UserDefinedType = type_api.UserDefinedType
+BIGINT = sqltypes.BIGINT
+BINARY = sqltypes.BINARY
+BLOB = sqltypes.BLOB
+BOOLEAN = sqltypes.BOOLEAN
+BigInteger = sqltypes.BigInteger
+Binary = sqltypes.Binary
+Boolean = sqltypes.Boolean
+CHAR = sqltypes.CHAR
+CLOB = sqltypes.CLOB
+Concatenable = sqltypes.Concatenable
+DATE = sqltypes.DATE
+DATETIME = sqltypes.DATETIME
+DECIMAL = sqltypes.DECIMAL
+Date = sqltypes.Date
+DateTime = sqltypes.DateTime
+Enum = sqltypes.Enum
+FLOAT = sqltypes.FLOAT
+Float = sqltypes.Float
+INT = sqltypes.INT
+INTEGER = sqltypes.INTEGER
+Integer = sqltypes.Integer
+Interval = sqltypes.Interval
+LargeBinary = sqltypes.LargeBinary
+NCHAR = sqltypes.NCHAR
+NVARCHAR = sqltypes.NVARCHAR
+NUMERIC = sqltypes.NUMERIC
+Numeric = sqltypes.Numeric
+PickleType = sqltypes.PickleType
+REAL = sqltypes.REAL
+SMALLINT = sqltypes.SMALLINT
+SmallInteger = sqltypes.SmallInteger
+String = sqltypes.String
+TEXT = sqltypes.TEXT
+TIME = sqltypes.TIME
+TIMESTAMP = sqltypes.TIMESTAMP
+Text = sqltypes.Text
+Time = sqltypes.Time
+Unicode = sqltypes.Unicode
+UnicodeText = sqltypes.UnicodeText
+VARBINARY = sqltypes.VARBINARY
+VARCHAR = sqltypes.VARCHAR
diff --git a/typeshed/third_party/2/sqlalchemy/util/__init__.pyi b/typeshed/third_party/2/sqlalchemy/util/__init__.pyi
new file mode 100644
index 0000000..a42c2ce
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/util/__init__.pyi
@@ -0,0 +1,133 @@
+# Stubs for sqlalchemy.util (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from . import compat
+from . import _collections
+from . import langhelpers
+from . import deprecations
+
+callable = compat.callable
+cmp = compat.cmp
+reduce = compat.reduce
+threading = compat.threading
+py3k = compat.py3k
+py33 = compat.py33
+py2k = compat.py2k
+jython = compat.jython
+pypy = compat.pypy
+cpython = compat.cpython
+win32 = compat.win32
+pickle = compat.pickle
+dottedgetter = compat.dottedgetter
+parse_qsl = compat.parse_qsl
+namedtuple = compat.namedtuple
+next = compat.next
+reraise = compat.reraise
+raise_from_cause = compat.raise_from_cause
+text_type = compat.text_type
+safe_kwarg = compat.safe_kwarg
+string_types = compat.string_types
+int_types = compat.int_types
+binary_type = compat.binary_type
+nested = compat.nested
+quote_plus = compat.quote_plus
+with_metaclass = compat.with_metaclass
+print_ = compat.print_
+itertools_filterfalse = compat.itertools_filterfalse
+u = compat.u
+ue = compat.ue
+b = compat.b
+unquote_plus = compat.unquote_plus
+unquote = compat.unquote
+b64decode = compat.b64decode
+b64encode = compat.b64encode
+byte_buffer = compat.byte_buffer
+itertools_filter = compat.itertools_filter
+iterbytes = compat.iterbytes
+StringIO = compat.StringIO
+inspect_getargspec = compat.inspect_getargspec
+zip_longest = compat.zip_longest
+KeyedTuple = _collections.KeyedTuple
+ImmutableContainer = _collections.ImmutableContainer
+immutabledict = _collections.immutabledict
+Properties = _collections.Properties
+OrderedProperties = _collections.OrderedProperties
+ImmutableProperties = _collections.ImmutableProperties
+OrderedDict = _collections.OrderedDict
+OrderedSet = _collections.OrderedSet
+IdentitySet = _collections.IdentitySet
+OrderedIdentitySet = _collections.OrderedIdentitySet
+column_set = _collections.column_set
+column_dict = _collections.column_dict
+ordered_column_set = _collections.ordered_column_set
+populate_column_dict = _collections.populate_column_dict
+unique_list = _collections.unique_list
+UniqueAppender = _collections.UniqueAppender
+PopulateDict = _collections.PopulateDict
+EMPTY_SET = _collections.EMPTY_SET
+to_list = _collections.to_list
+to_set = _collections.to_set
+to_column_set = _collections.to_column_set
+update_copy = _collections.update_copy
+flatten_iterator = _collections.flatten_iterator
+has_intersection = _collections.has_intersection
+LRUCache = _collections.LRUCache
+ScopedRegistry = _collections.ScopedRegistry
+ThreadLocalRegistry = _collections.ThreadLocalRegistry
+WeakSequence = _collections.WeakSequence
+coerce_generator_arg = _collections.coerce_generator_arg
+lightweight_named_tuple = _collections.lightweight_named_tuple
+iterate_attributes = langhelpers.iterate_attributes
+class_hierarchy = langhelpers.class_hierarchy
+portable_instancemethod = langhelpers.portable_instancemethod
+unbound_method_to_callable = langhelpers.unbound_method_to_callable
+getargspec_init = langhelpers.getargspec_init
+format_argspec_init = langhelpers.format_argspec_init
+format_argspec_plus = langhelpers.format_argspec_plus
+get_func_kwargs = langhelpers.get_func_kwargs
+get_cls_kwargs = langhelpers.get_cls_kwargs
+decorator = langhelpers.decorator
+as_interface = langhelpers.as_interface
+memoized_property = langhelpers.memoized_property
+memoized_instancemethod = langhelpers.memoized_instancemethod
+md5_hex = langhelpers.md5_hex
+group_expirable_memoized_property = langhelpers.group_expirable_memoized_property
+dependencies = langhelpers.dependencies
+decode_slice = langhelpers.decode_slice
+monkeypatch_proxied_specials = langhelpers.monkeypatch_proxied_specials
+asbool = langhelpers.asbool
+bool_or_str = langhelpers.bool_or_str
+coerce_kw_type = langhelpers.coerce_kw_type
+duck_type_collection = langhelpers.duck_type_collection
+assert_arg_type = langhelpers.assert_arg_type
+symbol = langhelpers.symbol
+dictlike_iteritems = langhelpers.dictlike_iteritems
+classproperty = langhelpers.classproperty
+set_creation_order = langhelpers.set_creation_order
+warn_exception = langhelpers.warn_exception
+warn = langhelpers.warn
+NoneType = langhelpers.NoneType
+constructor_copy = langhelpers.constructor_copy
+methods_equivalent = langhelpers.methods_equivalent
+chop_traceback = langhelpers.chop_traceback
+asint = langhelpers.asint
+generic_repr = langhelpers.generic_repr
+counter = langhelpers.counter
+PluginLoader = langhelpers.PluginLoader
+hybridproperty = langhelpers.hybridproperty
+hybridmethod = langhelpers.hybridmethod
+safe_reraise = langhelpers.safe_reraise
+get_callable_argspec = langhelpers.get_callable_argspec
+only_once = langhelpers.only_once
+attrsetter = langhelpers.attrsetter
+ellipses_string = langhelpers.ellipses_string
+warn_limited = langhelpers.warn_limited
+map_bits = langhelpers.map_bits
+MemoizedSlots = langhelpers.MemoizedSlots
+EnsureKWArgType = langhelpers.EnsureKWArgType
+warn_deprecated = deprecations.warn_deprecated
+warn_pending_deprecation = deprecations.warn_pending_deprecation
+deprecated = deprecations.deprecated
+pending_deprecation = deprecations.pending_deprecation
+inject_docstring_text = deprecations.inject_docstring_text
diff --git a/typeshed/third_party/2/sqlalchemy/util/_collections.pyi b/typeshed/third_party/2/sqlalchemy/util/_collections.pyi
new file mode 100644
index 0000000..58ca80a
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/util/_collections.pyi
@@ -0,0 +1,214 @@
+# Stubs for sqlalchemy.util._collections (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from . import compat
+
+threading = compat.threading
+itertools_filterfalse = compat.itertools_filterfalse
+string_types = compat.string_types
+
+EMPTY_SET = ... # type: Any
+
+class AbstractKeyedTuple(tuple):
+ def keys(self): ...
+
+class KeyedTuple(AbstractKeyedTuple):
+ def __new__(cls, vals, labels=...): ...
+ def __setattr__(self, key, value): ...
+
+class _LW(AbstractKeyedTuple):
+ def __new__(cls, vals): ...
+ def __reduce__(self): ...
+
+class ImmutableContainer:
+ __delitem__ = ... # type: Any
+
+class immutabledict(ImmutableContainer, dict):
+ clear = ... # type: Any
+ def __new__(cls, *args): ...
+ def __init__(self, *args) -> None: ...
+ def __reduce__(self): ...
+ def union(self, d): ...
+
+class Properties:
+ def __init__(self, data) -> None: ...
+ def __len__(self): ...
+ def __iter__(self): ...
+ def __add__(self, other): ...
+ def __setitem__(self, key, object): ...
+ def __getitem__(self, key): ...
+ def __delitem__(self, key): ...
+ def __setattr__(self, key, obj): ...
+ def __getattr__(self, key): ...
+ def __contains__(self, key): ...
+ def as_immutable(self): ...
+ def update(self, value): ...
+ def get(self, key, default=...): ...
+ def keys(self): ...
+ def values(self): ...
+ def items(self): ...
+ def has_key(self, key): ...
+ def clear(self): ...
+
+class OrderedProperties(Properties):
+ def __init__(self) -> None: ...
+
+class ImmutableProperties(ImmutableContainer, Properties): ...
+
+class OrderedDict(dict):
+ def __reduce__(self): ...
+ def __init__(self, ____sequence=..., **kwargs) -> None: ...
+ def clear(self): ...
+ def copy(self): ...
+ def __copy__(self): ...
+ def sort(self, *arg, **kw): ...
+ def update(self, ____sequence=..., **kwargs): ...
+ def setdefault(self, key, value): ...
+ def __iter__(self): ...
+ def keys(self): ...
+ def values(self): ...
+ def items(self): ...
+ def itervalues(self): ...
+ def iterkeys(self): ...
+ def iteritems(self): ...
+ def __setitem__(self, key, object): ...
+ def __delitem__(self, key): ...
+ def pop(self, key, *default): ...
+ def popitem(self): ...
+
+class OrderedSet(set):
+ def __init__(self, d=...) -> None: ...
+ def add(self, element): ...
+ def remove(self, element): ...
+ def insert(self, pos, element): ...
+ def discard(self, element): ...
+ def clear(self): ...
+ def __getitem__(self, key): ...
+ def __iter__(self): ...
+ def __add__(self, other): ...
+ def update(self, iterable): ...
+ __ior__ = ... # type: Any
+ def union(self, other): ...
+ __or__ = ... # type: Any
+ def intersection(self, other): ...
+ __and__ = ... # type: Any
+ def symmetric_difference(self, other): ...
+ __xor__ = ... # type: Any
+ def difference(self, other): ...
+ __sub__ = ... # type: Any
+ def intersection_update(self, other): ...
+ __iand__ = ... # type: Any
+ def symmetric_difference_update(self, other): ...
+ __ixor__ = ... # type: Any
+ def difference_update(self, other): ...
+ __isub__ = ... # type: Any
+
+class IdentitySet:
+ def __init__(self, iterable=...) -> None: ...
+ def add(self, value): ...
+ def __contains__(self, value): ...
+ def remove(self, value): ...
+ def discard(self, value): ...
+ def pop(self): ...
+ def clear(self): ...
+ def __cmp__(self, other): ...
+ def __eq__(self, other): ...
+ def __ne__(self, other): ...
+ def issubset(self, iterable): ...
+ def __le__(self, other): ...
+ def __lt__(self, other): ...
+ def issuperset(self, iterable): ...
+ def __ge__(self, other): ...
+ def __gt__(self, other): ...
+ def union(self, iterable): ...
+ def __or__(self, other): ...
+ def update(self, iterable): ...
+ def __ior__(self, other): ...
+ def difference(self, iterable): ...
+ def __sub__(self, other): ...
+ def difference_update(self, iterable): ...
+ def __isub__(self, other): ...
+ def intersection(self, iterable): ...
+ def __and__(self, other): ...
+ def intersection_update(self, iterable): ...
+ def __iand__(self, other): ...
+ def symmetric_difference(self, iterable): ...
+ def __xor__(self, other): ...
+ def symmetric_difference_update(self, iterable): ...
+ def __ixor__(self, other): ...
+ def copy(self): ...
+ __copy__ = ... # type: Any
+ def __len__(self): ...
+ def __iter__(self): ...
+ def __hash__(self): ...
+
+class WeakSequence:
+ def __init__(self, __elements=...) -> None: ...
+ def append(self, item): ...
+ def __len__(self): ...
+ def __iter__(self): ...
+ def __getitem__(self, index): ...
+
+class OrderedIdentitySet(IdentitySet):
+ class _working_set(OrderedSet):
+ __sa_hash_exempt__ = ... # type: Any
+ def __init__(self, iterable=...) -> None: ...
+
+class PopulateDict(dict):
+ creator = ... # type: Any
+ def __init__(self, creator) -> None: ...
+ def __missing__(self, key): ...
+
+column_set = set
+column_dict = dict
+ordered_column_set = OrderedSet
+populate_column_dict = PopulateDict
+
+def unique_list(seq, hashfunc=...): ...
+
+class UniqueAppender:
+ data = ... # type: Any
+ def __init__(self, data, via=...) -> None: ...
+ def append(self, item): ...
+ def __iter__(self): ...
+
+def coerce_generator_arg(arg): ...
+def to_list(x, default=...): ...
+def has_intersection(set_, iterable): ...
+def to_set(x): ...
+def to_column_set(x): ...
+def update_copy(d, _new=..., **kw): ...
+def flatten_iterator(x): ...
+
+class LRUCache(dict):
+ capacity = ... # type: Any
+ threshold = ... # type: Any
+ def __init__(self, capacity=..., threshold=...) -> None: ...
+ def get(self, key, default=...): ...
+ def __getitem__(self, key): ...
+ def values(self): ...
+ def setdefault(self, key, value): ...
+ def __setitem__(self, key, value): ...
+
+def lightweight_named_tuple(name, fields): ...
+
+class ScopedRegistry:
+ createfunc = ... # type: Any
+ scopefunc = ... # type: Any
+ registry = ... # type: Any
+ def __init__(self, createfunc, scopefunc) -> None: ...
+ def __call__(self): ...
+ def has(self): ...
+ def set(self, obj): ...
+ def clear(self): ...
+
+class ThreadLocalRegistry(ScopedRegistry):
+ createfunc = ... # type: Any
+ registry = ... # type: Any
+ def __init__(self, createfunc) -> None: ...
+ def __call__(self): ...
+ def has(self): ...
+ def set(self, obj): ...
+ def clear(self): ...
diff --git a/typeshed/third_party/2/sqlalchemy/util/compat.pyi b/typeshed/third_party/2/sqlalchemy/util/compat.pyi
new file mode 100644
index 0000000..39ec058
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/util/compat.pyi
@@ -0,0 +1,67 @@
+# Stubs for sqlalchemy.util.compat (Python 2)
+
+from typing import Any
+from collections import namedtuple
+
+import threading
+import pickle
+from six.moves.urllib.parse import (quote_plus, unquote_plus,
+ parse_qsl, quote, unquote)
+# import configparser
+from six.moves import StringIO
+
+from io import BytesIO as byte_buffer
+
+from operator import attrgetter as dottedgetter
+
+from six.moves import zip_longest
+
+py33 = ... # type: Any
+py32 = ... # type: Any
+py3k = ... # type: Any
+py2k = ... # type: Any
+py265 = ... # type: Any
+jython = ... # type: Any
+pypy = ... # type: Any
+win32 = ... # type: Any
+cpython = ... # type: Any
+next = ... # type: Any
+safe_kwarg = ... # type: Any
+
+ArgSpec = namedtuple('ArgSpec', ['args', 'varargs', 'keywords', 'defaults'])
+
+def inspect_getargspec(func): ...
+
+string_types = ... # type: Any
+binary_type = ... # type: Any
+text_type = unicode
+int_types = ... # type: Any
+
+def callable(fn): ...
+def cmp(a, b): ...
+
+itertools_filterfalse = ... # type: Any
+itertools_filter = ... # type: Any
+itertools_imap = ... # type: Any
+
+def b64encode(x): ...
+def b64decode(x): ...
+
+def iterbytes(buf): ...
+def u(s): ...
+def ue(s): ...
+def b(s): ...
+def import_(*args): ...
+
+reduce = ... # type: Any
+
+def print_(*args, **kwargs): ...
+
+time_func = ... # type: Any
+
+def reraise(tp, value, tb=..., cause=...): ...
+def raise_from_cause(exception, exc_info=...): ...
+
+def exec_(func_text, globals_, lcl=...): ...
+def with_metaclass(meta, *bases): ...
+def nested(*managers): ...
diff --git a/typeshed/third_party/2/sqlalchemy/util/deprecations.pyi b/typeshed/third_party/2/sqlalchemy/util/deprecations.pyi
new file mode 100644
index 0000000..49940cf
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/util/deprecations.pyi
@@ -0,0 +1,13 @@
+# Stubs for sqlalchemy.util.deprecations (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from . import langhelpers
+
+decorator = langhelpers.decorator
+
+def warn_deprecated(msg, stacklevel=...): ...
+def warn_pending_deprecation(msg, stacklevel=...): ...
+def deprecated(version, message=..., add_deprecation_to_docstring=...): ...
+def pending_deprecation(version, message=..., add_deprecation_to_docstring=...): ...
+def inject_docstring_text(doctext, injecttext, pos): ...
diff --git a/typeshed/third_party/2/sqlalchemy/util/langhelpers.pyi b/typeshed/third_party/2/sqlalchemy/util/langhelpers.pyi
new file mode 100644
index 0000000..2dadc07
--- /dev/null
+++ b/typeshed/third_party/2/sqlalchemy/util/langhelpers.pyi
@@ -0,0 +1,134 @@
+# Stubs for sqlalchemy.util.langhelpers (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from . import compat
+
+def md5_hex(x): ...
+
+class safe_reraise:
+ def __enter__(self): ...
+ def __exit__(self, type_, value, traceback): ...
+
+def decode_slice(slc): ...
+def map_bits(fn, n): ...
+def decorator(target): ...
+def public_factory(target, location): ...
+
+class PluginLoader:
+ group = ... # type: Any
+ impls = ... # type: Any
+ auto_fn = ... # type: Any
+ def __init__(self, group, auto_fn=...) -> None: ...
+ def load(self, name): ...
+ def register(self, name, modulepath, objname): ...
+
+def get_cls_kwargs(cls, _set=...): ...
+def inspect_func_args(fn): ...
+def get_func_kwargs(func): ...
+def get_callable_argspec(fn, no_self=..., _is_init=...): ...
+def format_argspec_plus(fn, grouped=...): ...
+def format_argspec_init(method, grouped=...): ...
+def getargspec_init(method): ...
+def unbound_method_to_callable(func_or_cls): ...
+def generic_repr(obj, additional_kw=..., to_inspect=..., omit_kwarg=...): ...
+
+class portable_instancemethod:
+ target = ... # type: Any
+ name = ... # type: Any
+ def __init__(self, meth) -> None: ...
+ def __call__(self, *arg, **kw): ...
+
+def class_hierarchy(cls): ...
+def iterate_attributes(cls): ...
+def monkeypatch_proxied_specials(into_cls, from_cls, skip=..., only=..., name=..., from_instance=...): ...
+def methods_equivalent(meth1, meth2): ...
+def as_interface(obj, cls=..., methods=..., required=...): ...
+
+class memoized_property:
+ fget = ... # type: Any
+ __name__ = ... # type: Any
+ def __init__(self, fget, doc=...) -> None: ...
+ def __get__(self, obj, cls): ...
+ @classmethod
+ def reset(cls, obj, name): ...
+
+def memoized_instancemethod(fn): ...
+
+class group_expirable_memoized_property:
+ attributes = ... # type: Any
+ def __init__(self, attributes=...) -> None: ...
+ def expire_instance(self, instance): ...
+ def __call__(self, fn): ...
+ def method(self, fn): ...
+
+class MemoizedSlots:
+ def __getattr__(self, key): ...
+
+def dependency_for(modulename): ...
+
+class dependencies:
+ import_deps = ... # type: Any
+ def __init__(self, *deps) -> None: ...
+ def __call__(self, fn): ...
+ @classmethod
+ def resolve_all(cls, path): ...
+ class _importlater:
+ def __new__(cls, path, addtl): ...
+ def __init__(self, path, addtl) -> None: ...
+ def module(self): ...
+ def __getattr__(self, key): ...
+
+def asbool(obj): ...
+def bool_or_str(*text): ...
+def asint(value): ...
+def coerce_kw_type(kw, key, type_, flexi_bool=...): ...
+def constructor_copy(obj, cls, *args, **kw): ...
+def counter(): ...
+def duck_type_collection(specimen, default=...): ...
+def assert_arg_type(arg, argtype, name): ...
+def dictlike_iteritems(dictlike): ...
+
+class classproperty:
+ def __init__(self, fget, *arg, **kw) -> None: ...
+ def __get__(desc, self, cls): ...
+
+class hybridproperty:
+ func = ... # type: Any
+ def __init__(self, func) -> None: ...
+ def __get__(self, instance, owner): ...
+
+class hybridmethod:
+ func = ... # type: Any
+ def __init__(self, func) -> None: ...
+ def __get__(self, instance, owner): ...
+
+class _symbol(int):
+ def __new__(self, name, doc=..., canonical=...): ...
+ def __reduce__(self): ...
+
+class symbol:
+ symbols = ... # type: Any
+ def __new__(cls, name, doc=..., canonical=...): ...
+
+def set_creation_order(instance): ...
+def warn_exception(func, *args, **kwargs): ...
+def ellipses_string(value, len_=...): ...
+
+class _hash_limit_string(compat.text_type):
+ def __new__(cls, value, num, args): ...
+ def __hash__(self): ...
+ def __eq__(self, other): ...
+
+def warn(msg): ...
+def warn_limited(msg, args): ...
+def only_once(fn): ...
+def chop_traceback(tb, exclude_prefix=..., exclude_suffix=...): ...
+
+NoneType = ... # type: Any
+
+def attrsetter(attrname): ...
+
+class EnsureKWArgType(type):
+ def __init__(cls, clsname, bases, clsdict) -> None: ...
diff --git a/typeshed/third_party/2/thrift/Thrift.pyi b/typeshed/third_party/2/thrift/Thrift.pyi
new file mode 100644
index 0000000..4397fb6
--- /dev/null
+++ b/typeshed/third_party/2/thrift/Thrift.pyi
@@ -0,0 +1,55 @@
+# Stubs for thrift.Thrift (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class TType:
+ STOP = ... # type: Any
+ VOID = ... # type: Any
+ BOOL = ... # type: Any
+ BYTE = ... # type: Any
+ I08 = ... # type: Any
+ DOUBLE = ... # type: Any
+ I16 = ... # type: Any
+ I32 = ... # type: Any
+ I64 = ... # type: Any
+ STRING = ... # type: Any
+ UTF7 = ... # type: Any
+ STRUCT = ... # type: Any
+ MAP = ... # type: Any
+ SET = ... # type: Any
+ LIST = ... # type: Any
+ UTF8 = ... # type: Any
+ UTF16 = ... # type: Any
+
+class TMessageType:
+ CALL = ... # type: Any
+ REPLY = ... # type: Any
+ EXCEPTION = ... # type: Any
+ ONEWAY = ... # type: Any
+
+class TProcessor:
+ def process(iprot, oprot): ...
+
+class TException(Exception):
+ message = ... # type: Any
+ def __init__(self, message=...) -> None: ...
+
+class TApplicationException(TException):
+ UNKNOWN = ... # type: Any
+ UNKNOWN_METHOD = ... # type: Any
+ INVALID_MESSAGE_TYPE = ... # type: Any
+ WRONG_METHOD_NAME = ... # type: Any
+ BAD_SEQUENCE_ID = ... # type: Any
+ MISSING_RESULT = ... # type: Any
+ INTERNAL_ERROR = ... # type: Any
+ PROTOCOL_ERROR = ... # type: Any
+ INVALID_TRANSFORM = ... # type: Any
+ INVALID_PROTOCOL = ... # type: Any
+ UNSUPPORTED_CLIENT_TYPE = ... # type: Any
+ type = ... # type: Any
+ def __init__(self, type=..., message=...) -> None: ...
+ message = ... # type: Any
+ def read(self, iprot): ...
+ def write(self, oprot): ...
diff --git a/mypy/test/__init__.py b/typeshed/third_party/2/thrift/__init__.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/third_party/2/thrift/__init__.pyi
diff --git a/typeshed/third_party/2/thrift/protocol/TBinaryProtocol.pyi b/typeshed/third_party/2/thrift/protocol/TBinaryProtocol.pyi
new file mode 100644
index 0000000..a1e5e71
--- /dev/null
+++ b/typeshed/third_party/2/thrift/protocol/TBinaryProtocol.pyi
@@ -0,0 +1,66 @@
+# Stubs for thrift.protocol.TBinaryProtocol (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+from .TProtocol import TProtocolBase
+from .TProtocol import * # noqa: F403
+
+class TBinaryProtocol(TProtocolBase):
+ VERSION_MASK = ... # type: Any
+ VERSION_1 = ... # type: Any
+ TYPE_MASK = ... # type: Any
+ strictRead = ... # type: Any
+ strictWrite = ... # type: Any
+ def __init__(self, trans, strictRead=..., strictWrite=...) -> None: ...
+ def writeMessageBegin(self, name, type, seqid): ...
+ def writeMessageEnd(self): ...
+ def writeStructBegin(self, name): ...
+ def writeStructEnd(self): ...
+ def writeFieldBegin(self, name, type, id): ...
+ def writeFieldEnd(self): ...
+ def writeFieldStop(self): ...
+ def writeMapBegin(self, ktype, vtype, size): ...
+ def writeMapEnd(self): ...
+ def writeListBegin(self, etype, size): ...
+ def writeListEnd(self): ...
+ def writeSetBegin(self, etype, size): ...
+ def writeSetEnd(self): ...
+ def writeBool(self, bool): ...
+ def writeByte(self, byte): ...
+ def writeI16(self, i16): ...
+ def writeI32(self, i32): ...
+ def writeI64(self, i64): ...
+ def writeDouble(self, dub): ...
+ def writeString(self, str): ...
+ def readMessageBegin(self): ...
+ def readMessageEnd(self): ...
+ def readStructBegin(self): ...
+ def readStructEnd(self): ...
+ def readFieldBegin(self): ...
+ def readFieldEnd(self): ...
+ def readMapBegin(self): ...
+ def readMapEnd(self): ...
+ def readListBegin(self): ...
+ def readListEnd(self): ...
+ def readSetBegin(self): ...
+ def readSetEnd(self): ...
+ def readBool(self): ...
+ def readByte(self): ...
+ def readI16(self): ...
+ def readI32(self): ...
+ def readI64(self): ...
+ def readDouble(self): ...
+ def readString(self): ...
+
+class TBinaryProtocolFactory:
+ strictRead = ... # type: Any
+ strictWrite = ... # type: Any
+ def __init__(self, strictRead=..., strictWrite=...) -> None: ...
+ def getProtocol(self, trans): ...
+
+class TBinaryProtocolAccelerated(TBinaryProtocol): ...
+
+class TBinaryProtocolAcceleratedFactory:
+ def getProtocol(self, trans): ...
diff --git a/typeshed/third_party/2/thrift/protocol/TProtocol.pyi b/typeshed/third_party/2/thrift/protocol/TProtocol.pyi
new file mode 100644
index 0000000..e59765a
--- /dev/null
+++ b/typeshed/third_party/2/thrift/protocol/TProtocol.pyi
@@ -0,0 +1,80 @@
+# Stubs for thrift.protocol.TProtocol (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+from thrift.Thrift import TException
+from thrift.Thrift import * # noqa: F403
+
+class TProtocolException(TException):
+ UNKNOWN = ... # type: Any
+ INVALID_DATA = ... # type: Any
+ NEGATIVE_SIZE = ... # type: Any
+ SIZE_LIMIT = ... # type: Any
+ BAD_VERSION = ... # type: Any
+ NOT_IMPLEMENTED = ... # type: Any
+ DEPTH_LIMIT = ... # type: Any
+ type = ... # type: Any
+ def __init__(self, type=..., message=...) -> None: ...
+
+class TProtocolBase:
+ trans = ... # type: Any
+ def __init__(self, trans) -> None: ...
+ def writeMessageBegin(self, name, ttype, seqid): ...
+ def writeMessageEnd(self): ...
+ def writeStructBegin(self, name): ...
+ def writeStructEnd(self): ...
+ def writeFieldBegin(self, name, ttype, fid): ...
+ def writeFieldEnd(self): ...
+ def writeFieldStop(self): ...
+ def writeMapBegin(self, ktype, vtype, size): ...
+ def writeMapEnd(self): ...
+ def writeListBegin(self, etype, size): ...
+ def writeListEnd(self): ...
+ def writeSetBegin(self, etype, size): ...
+ def writeSetEnd(self): ...
+ def writeBool(self, bool_val): ...
+ def writeByte(self, byte): ...
+ def writeI16(self, i16): ...
+ def writeI32(self, i32): ...
+ def writeI64(self, i64): ...
+ def writeDouble(self, dub): ...
+ def writeString(self, str_val): ...
+ def readMessageBegin(self): ...
+ def readMessageEnd(self): ...
+ def readStructBegin(self): ...
+ def readStructEnd(self): ...
+ def readFieldBegin(self): ...
+ def readFieldEnd(self): ...
+ def readMapBegin(self): ...
+ def readMapEnd(self): ...
+ def readListBegin(self): ...
+ def readListEnd(self): ...
+ def readSetBegin(self): ...
+ def readSetEnd(self): ...
+ def readBool(self): ...
+ def readByte(self): ...
+ def readI16(self): ...
+ def readI32(self): ...
+ def readI64(self): ...
+ def readDouble(self): ...
+ def readString(self): ...
+ def skip(self, ttype): ...
+ def readFieldByTType(self, ttype, spec): ...
+ def readContainerList(self, spec): ...
+ def readContainerSet(self, spec): ...
+ def readContainerStruct(self, spec): ...
+ def readContainerMap(self, spec): ...
+ def readStruct(self, obj, thrift_spec): ...
+ def writeContainerStruct(self, val, spec): ...
+ def writeContainerList(self, val, spec): ...
+ def writeContainerSet(self, val, spec): ...
+ def writeContainerMap(self, val, spec): ...
+ def writeStruct(self, obj, thrift_spec): ...
+ def writeFieldByTType(self, ttype, val, spec): ...
+
+def checkIntegerLimits(i, bits): ...
+
+class TProtocolFactory:
+ def getProtocol(self, trans): ...
diff --git a/typeshed/third_party/2/thrift/protocol/__init__.pyi b/typeshed/third_party/2/thrift/protocol/__init__.pyi
new file mode 100644
index 0000000..f98118b
--- /dev/null
+++ b/typeshed/third_party/2/thrift/protocol/__init__.pyi
@@ -0,0 +1,11 @@
+# Stubs for thrift.protocol (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+# Names in __all__ with no definition:
+# TBase
+# TBinaryProtocol
+# TCompactProtocol
+# TJSONProtocol
+# TProtocol
+# fastbinary
diff --git a/typeshed/third_party/2/thrift/transport/TSocket.pyi b/typeshed/third_party/2/thrift/transport/TSocket.pyi
new file mode 100644
index 0000000..6148117
--- /dev/null
+++ b/typeshed/third_party/2/thrift/transport/TSocket.pyi
@@ -0,0 +1,33 @@
+# Stubs for thrift.transport.TSocket (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+from .TTransport import TTransportBase, TServerTransportBase
+from .TTransport import * # noqa: F403
+
+class TSocketBase(TTransportBase):
+ handle = ... # type: Any
+ def close(self): ...
+
+class TSocket(TSocketBase):
+ host = ... # type: Any
+ port = ... # type: Any
+ handle = ... # type: Any
+ def __init__(self, host=..., port=..., unix_socket=..., socket_family=...) -> None: ...
+ def setHandle(self, h): ...
+ def isOpen(self): ...
+ def setTimeout(self, ms): ...
+ def open(self): ...
+ def read(self, sz): ...
+ def write(self, buff): ...
+ def flush(self): ...
+
+class TServerSocket(TSocketBase, TServerTransportBase):
+ host = ... # type: Any
+ port = ... # type: Any
+ handle = ... # type: Any
+ def __init__(self, host=..., port=..., unix_socket=..., socket_family=...) -> None: ...
+ def listen(self): ...
+ def accept(self): ...
diff --git a/typeshed/third_party/2/thrift/transport/TTransport.pyi b/typeshed/third_party/2/thrift/transport/TTransport.pyi
new file mode 100644
index 0000000..d46cca0
--- /dev/null
+++ b/typeshed/third_party/2/thrift/transport/TTransport.pyi
@@ -0,0 +1,111 @@
+# Stubs for thrift.transport.TTransport (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from thrift.Thrift import TException
+
+class TTransportException(TException):
+ UNKNOWN = ... # type: Any
+ NOT_OPEN = ... # type: Any
+ ALREADY_OPEN = ... # type: Any
+ TIMED_OUT = ... # type: Any
+ END_OF_FILE = ... # type: Any
+ type = ... # type: Any
+ def __init__(self, type=..., message=...) -> None: ...
+
+class TTransportBase:
+ def isOpen(self): ...
+ def open(self): ...
+ def close(self): ...
+ def read(self, sz): ...
+ def readAll(self, sz): ...
+ def write(self, buf): ...
+ def flush(self): ...
+
+class CReadableTransport:
+ @property
+ def cstringio_buf(self): ...
+ def cstringio_refill(self, partialread, reqlen): ...
+
+class TServerTransportBase:
+ def listen(self): ...
+ def accept(self): ...
+ def close(self): ...
+
+class TTransportFactoryBase:
+ def getTransport(self, trans): ...
+
+class TBufferedTransportFactory:
+ def getTransport(self, trans): ...
+
+class TBufferedTransport(TTransportBase, CReadableTransport):
+ DEFAULT_BUFFER = ... # type: Any
+ def __init__(self, trans, rbuf_size=...) -> None: ...
+ def isOpen(self): ...
+ def open(self): ...
+ def close(self): ...
+ def read(self, sz): ...
+ def write(self, buf): ...
+ def flush(self): ...
+ @property
+ def cstringio_buf(self): ...
+ def cstringio_refill(self, partialread, reqlen): ...
+
+class TMemoryBuffer(TTransportBase, CReadableTransport):
+ def __init__(self, value=...) -> None: ...
+ def isOpen(self): ...
+ def open(self): ...
+ def close(self): ...
+ def read(self, sz): ...
+ def write(self, buf): ...
+ def flush(self): ...
+ def getvalue(self): ...
+ @property
+ def cstringio_buf(self): ...
+ def cstringio_refill(self, partialread, reqlen): ...
+
+class TFramedTransportFactory:
+ def getTransport(self, trans): ...
+
+class TFramedTransport(TTransportBase, CReadableTransport):
+ def __init__(self, trans) -> None: ...
+ def isOpen(self): ...
+ def open(self): ...
+ def close(self): ...
+ def read(self, sz): ...
+ def readFrame(self): ...
+ def write(self, buf): ...
+ def flush(self): ...
+ @property
+ def cstringio_buf(self): ...
+ def cstringio_refill(self, prefix, reqlen): ...
+
+class TFileObjectTransport(TTransportBase):
+ fileobj = ... # type: Any
+ def __init__(self, fileobj) -> None: ...
+ def isOpen(self): ...
+ def close(self): ...
+ def read(self, sz): ...
+ def write(self, buf): ...
+ def flush(self): ...
+
+class TSaslClientTransport(TTransportBase, CReadableTransport):
+ START = ... # type: Any
+ OK = ... # type: Any
+ BAD = ... # type: Any
+ ERROR = ... # type: Any
+ COMPLETE = ... # type: Any
+ transport = ... # type: Any
+ sasl = ... # type: Any
+ def __init__(self, transport, host, service, mechanism=..., **sasl_kwargs) -> None: ...
+ def open(self): ...
+ def send_sasl_msg(self, status, body): ...
+ def recv_sasl_msg(self): ...
+ def write(self, data): ...
+ def flush(self): ...
+ def read(self, sz): ...
+ def close(self): ...
+ @property
+ def cstringio_buf(self): ...
+ def cstringio_refill(self, prefix, reqlen): ...
diff --git a/typeshed/third_party/2/thrift/transport/__init__.pyi b/typeshed/third_party/2/thrift/transport/__init__.pyi
new file mode 100644
index 0000000..ce02c61
--- /dev/null
+++ b/typeshed/third_party/2/thrift/transport/__init__.pyi
@@ -0,0 +1,9 @@
+# Stubs for thrift.transport (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+# Names in __all__ with no definition:
+# THttpClient
+# TSocket
+# TTransport
+# TZlibTransport
diff --git a/mypy/test/__init__.py b/typeshed/third_party/2/tornado/__init__.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/third_party/2/tornado/__init__.pyi
diff --git a/typeshed/third_party/2/tornado/concurrent.pyi b/typeshed/third_party/2/tornado/concurrent.pyi
new file mode 100644
index 0000000..46f39a3
--- /dev/null
+++ b/typeshed/third_party/2/tornado/concurrent.pyi
@@ -0,0 +1,47 @@
+# Stubs for tornado.concurrent (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+futures = ... # type: Any
+
+class ReturnValueIgnoredError(Exception): ...
+
+class _TracebackLogger:
+ exc_info = ... # type: Any
+ formatted_tb = ... # type: Any
+ def __init__(self, exc_info) -> None: ...
+ def activate(self): ...
+ def clear(self): ...
+ def __del__(self): ...
+
+class Future:
+ def __init__(self) -> None: ...
+ def cancel(self): ...
+ def cancelled(self): ...
+ def running(self): ...
+ def done(self): ...
+ def result(self, timeout=...): ...
+ def exception(self, timeout=...): ...
+ def add_done_callback(self, fn): ...
+ def set_result(self, result): ...
+ def set_exception(self, exception): ...
+ def exc_info(self): ...
+ def set_exc_info(self, exc_info): ...
+ def __del__(self): ...
+
+TracebackFuture = ... # type: Any
+FUTURES = ... # type: Any
+
+def is_future(x): ...
+
+class DummyExecutor:
+ def submit(self, fn, *args, **kwargs): ...
+ def shutdown(self, wait=...): ...
+
+dummy_executor = ... # type: Any
+
+def run_on_executor(*args, **kwargs): ...
+def return_future(f): ...
+def chain_future(a, b): ...
diff --git a/typeshed/third_party/2/tornado/gen.pyi b/typeshed/third_party/2/tornado/gen.pyi
new file mode 100644
index 0000000..fbde2da
--- /dev/null
+++ b/typeshed/third_party/2/tornado/gen.pyi
@@ -0,0 +1,113 @@
+# Stubs for tornado.gen (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from collections import namedtuple
+
+singledispatch = ... # type: Any
+
+class KeyReuseError(Exception): ...
+class UnknownKeyError(Exception): ...
+class LeakedCallbackError(Exception): ...
+class BadYieldError(Exception): ...
+class ReturnValueIgnoredError(Exception): ...
+class TimeoutError(Exception): ...
+
+def engine(func): ...
+def coroutine(func, replace_callback=...): ...
+
+class Return(Exception):
+ value = ... # type: Any
+ def __init__(self, value=...) -> None: ...
+
+class WaitIterator:
+ current_index = ... # type: Any
+ def __init__(self, *args, **kwargs) -> None: ...
+ def done(self): ...
+ def next(self): ...
+
+class YieldPoint:
+ def start(self, runner): ...
+ def is_ready(self): ...
+ def get_result(self): ...
+
+class Callback(YieldPoint):
+ key = ... # type: Any
+ def __init__(self, key) -> None: ...
+ runner = ... # type: Any
+ def start(self, runner): ...
+ def is_ready(self): ...
+ def get_result(self): ...
+
+class Wait(YieldPoint):
+ key = ... # type: Any
+ def __init__(self, key) -> None: ...
+ runner = ... # type: Any
+ def start(self, runner): ...
+ def is_ready(self): ...
+ def get_result(self): ...
+
+class WaitAll(YieldPoint):
+ keys = ... # type: Any
+ def __init__(self, keys) -> None: ...
+ runner = ... # type: Any
+ def start(self, runner): ...
+ def is_ready(self): ...
+ def get_result(self): ...
+
+def Task(func, *args, **kwargs): ...
+
+class YieldFuture(YieldPoint):
+ future = ... # type: Any
+ io_loop = ... # type: Any
+ def __init__(self, future, io_loop=...) -> None: ...
+ runner = ... # type: Any
+ key = ... # type: Any
+ result_fn = ... # type: Any
+ def start(self, runner): ...
+ def is_ready(self): ...
+ def get_result(self): ...
+
+class Multi(YieldPoint):
+ keys = ... # type: Any
+ children = ... # type: Any
+ unfinished_children = ... # type: Any
+ quiet_exceptions = ... # type: Any
+ def __init__(self, children, quiet_exceptions=...) -> None: ...
+ def start(self, runner): ...
+ def is_ready(self): ...
+ def get_result(self): ...
+
+def multi_future(children, quiet_exceptions=...): ...
+def maybe_future(x): ...
+def with_timeout(timeout, future, io_loop=..., quiet_exceptions=...): ...
+def sleep(duration): ...
+
+moment = ... # type: Any
+
+class Runner:
+ gen = ... # type: Any
+ result_future = ... # type: Any
+ future = ... # type: Any
+ yield_point = ... # type: Any
+ pending_callbacks = ... # type: Any
+ results = ... # type: Any
+ running = ... # type: Any
+ finished = ... # type: Any
+ had_exception = ... # type: Any
+ io_loop = ... # type: Any
+ stack_context_deactivate = ... # type: Any
+ def __init__(self, gen, result_future, first_yielded) -> None: ...
+ def register_callback(self, key): ...
+ def is_ready(self, key): ...
+ def set_result(self, key, result): ...
+ def pop_result(self, key): ...
+ def run(self): ...
+ def handle_yield(self, yielded): ...
+ def result_callback(self, key): ...
+ def handle_exception(self, typ, value, tb): ...
+
+Arguments = namedtuple('Arguments', ['args', 'kwargs'])
+
+def convert_yielded(yielded): ...
diff --git a/typeshed/third_party/2/tornado/httpclient.pyi b/typeshed/third_party/2/tornado/httpclient.pyi
new file mode 100644
index 0000000..fa41d16
--- /dev/null
+++ b/typeshed/third_party/2/tornado/httpclient.pyi
@@ -0,0 +1,112 @@
+# Stubs for tornado.httpclient (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from tornado.util import Configurable
+
+class HTTPClient:
+ def __init__(self, async_client_class=..., **kwargs) -> None: ...
+ def __del__(self): ...
+ def close(self): ...
+ def fetch(self, request, **kwargs): ...
+
+class AsyncHTTPClient(Configurable):
+ @classmethod
+ def configurable_base(cls): ...
+ @classmethod
+ def configurable_default(cls): ...
+ def __new__(cls, io_loop=..., force_instance=..., **kwargs): ...
+ io_loop = ... # type: Any
+ defaults = ... # type: Any
+ def initialize(self, io_loop, defaults=...): ...
+ def close(self): ...
+ def fetch(self, request, callback=..., raise_error=..., **kwargs): ...
+ def fetch_impl(self, request, callback): ...
+ @classmethod
+ def configure(cls, impl, **kwargs): ...
+
+class HTTPRequest:
+ headers = ... # type: Any
+ proxy_host = ... # type: Any
+ proxy_port = ... # type: Any
+ proxy_username = ... # type: Any
+ proxy_password = ... # type: Any
+ url = ... # type: Any
+ method = ... # type: Any
+ body = ... # type: Any
+ body_producer = ... # type: Any
+ auth_username = ... # type: Any
+ auth_password = ... # type: Any
+ auth_mode = ... # type: Any
+ connect_timeout = ... # type: Any
+ request_timeout = ... # type: Any
+ follow_redirects = ... # type: Any
+ max_redirects = ... # type: Any
+ user_agent = ... # type: Any
+ decompress_response = ... # type: Any
+ network_interface = ... # type: Any
+ streaming_callback = ... # type: Any
+ header_callback = ... # type: Any
+ prepare_curl_callback = ... # type: Any
+ allow_nonstandard_methods = ... # type: Any
+ validate_cert = ... # type: Any
+ ca_certs = ... # type: Any
+ allow_ipv6 = ... # type: Any
+ client_key = ... # type: Any
+ client_cert = ... # type: Any
+ ssl_options = ... # type: Any
+ expect_100_continue = ... # type: Any
+ start_time = ... # type: Any
+ def __init__(self, url, method=..., headers=..., body=..., auth_username=..., auth_password=..., auth_mode=..., connect_timeout=..., request_timeout=..., if_modified_since=..., follow_redirects=..., max_redirects=..., user_agent=..., use_gzip=..., network_interface=..., streaming_callback=..., header_callback=..., prepare_curl_callback=..., proxy_host=..., proxy_port=..., proxy_username=..., proxy_password=..., allow_nonstandard_methods=..., validate_cert=..., ca_certs=..., allow_ipv [...]
+ @property
+ def headers(self): ...
+ @headers.setter
+ def headers(self, value): ...
+ @property
+ def body(self): ...
+ @body.setter
+ def body(self, value): ...
+ @property
+ def body_producer(self): ...
+ @body_producer.setter
+ def body_producer(self, value): ...
+ @property
+ def streaming_callback(self): ...
+ @streaming_callback.setter
+ def streaming_callback(self, value): ...
+ @property
+ def header_callback(self): ...
+ @header_callback.setter
+ def header_callback(self, value): ...
+ @property
+ def prepare_curl_callback(self): ...
+ @prepare_curl_callback.setter
+ def prepare_curl_callback(self, value): ...
+
+class HTTPResponse:
+ request = ... # type: Any
+ code = ... # type: Any
+ reason = ... # type: Any
+ headers = ... # type: Any
+ buffer = ... # type: Any
+ effective_url = ... # type: Any
+ error = ... # type: Any
+ request_time = ... # type: Any
+ time_info = ... # type: Any
+ def __init__(self, request, code, headers=..., buffer=..., effective_url=..., error=..., request_time=..., time_info=..., reason=...) -> None: ...
+ body = ... # type: Any
+ def rethrow(self): ...
+
+class HTTPError(Exception):
+ code = ... # type: Any
+ response = ... # type: Any
+ def __init__(self, code, message=..., response=...) -> None: ...
+
+class _RequestProxy:
+ request = ... # type: Any
+ defaults = ... # type: Any
+ def __init__(self, request, defaults) -> None: ...
+ def __getattr__(self, name): ...
+
+def main(): ...
diff --git a/typeshed/third_party/2/tornado/httpserver.pyi b/typeshed/third_party/2/tornado/httpserver.pyi
new file mode 100644
index 0000000..f4b2aa9
--- /dev/null
+++ b/typeshed/third_party/2/tornado/httpserver.pyi
@@ -0,0 +1,45 @@
+# Stubs for tornado.httpserver (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from tornado import httputil
+from tornado.tcpserver import TCPServer
+from tornado.util import Configurable
+
+class HTTPServer(TCPServer, Configurable, httputil.HTTPServerConnectionDelegate):
+ def __init__(self, *args, **kwargs) -> None: ...
+ request_callback = ... # type: Any
+ no_keep_alive = ... # type: Any
+ xheaders = ... # type: Any
+ protocol = ... # type: Any
+ conn_params = ... # type: Any
+ def initialize(self, request_callback, no_keep_alive=..., io_loop=..., xheaders=..., ssl_options=..., protocol=..., decompress_request=..., chunk_size=..., max_header_size=..., idle_connection_timeout=..., body_timeout=..., max_body_size=..., max_buffer_size=...): ...
+ @classmethod
+ def configurable_base(cls): ...
+ @classmethod
+ def configurable_default(cls): ...
+ def close_all_connections(self): ...
+ def handle_stream(self, stream, address): ...
+ def start_request(self, server_conn, request_conn): ...
+ def on_close(self, server_conn): ...
+
+class _HTTPRequestContext:
+ address = ... # type: Any
+ protocol = ... # type: Any
+ address_family = ... # type: Any
+ remote_ip = ... # type: Any
+ def __init__(self, stream, address, protocol) -> None: ...
+
+class _ServerRequestAdapter(httputil.HTTPMessageDelegate):
+ server = ... # type: Any
+ connection = ... # type: Any
+ request = ... # type: Any
+ delegate = ... # type: Any
+ def __init__(self, server, server_conn, request_conn) -> None: ...
+ def headers_received(self, start_line, headers): ...
+ def data_received(self, chunk): ...
+ def finish(self): ...
+ def on_connection_close(self): ...
+
+HTTPRequest = ... # type: Any
diff --git a/typeshed/third_party/2/tornado/httputil.pyi b/typeshed/third_party/2/tornado/httputil.pyi
new file mode 100644
index 0000000..f8fefb5
--- /dev/null
+++ b/typeshed/third_party/2/tornado/httputil.pyi
@@ -0,0 +1,93 @@
+# Stubs for tornado.httputil (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from tornado.util import ObjectDict
+from collections import namedtuple
+
+class SSLError(Exception): ...
+
+class _NormalizedHeaderCache(dict):
+ size = ... # type: Any
+ queue = ... # type: Any
+ def __init__(self, size) -> None: ...
+ def __missing__(self, key): ...
+
+class HTTPHeaders(dict):
+ def __init__(self, *args, **kwargs) -> None: ...
+ def add(self, name, value): ...
+ def get_list(self, name): ...
+ def get_all(self): ...
+ def parse_line(self, line): ...
+ @classmethod
+ def parse(cls, headers): ...
+ def __setitem__(self, name, value): ...
+ def __getitem__(self, name): ...
+ def __delitem__(self, name): ...
+ def __contains__(self, name): ...
+ def get(self, name, default=...): ...
+ def update(self, *args, **kwargs): ...
+ def copy(self): ...
+ __copy__ = ... # type: Any
+ def __deepcopy__(self, memo_dict): ...
+
+class HTTPServerRequest:
+ method = ... # type: Any
+ uri = ... # type: Any
+ version = ... # type: Any
+ headers = ... # type: Any
+ body = ... # type: Any
+ remote_ip = ... # type: Any
+ protocol = ... # type: Any
+ host = ... # type: Any
+ files = ... # type: Any
+ connection = ... # type: Any
+ arguments = ... # type: Any
+ query_arguments = ... # type: Any
+ body_arguments = ... # type: Any
+ def __init__(self, method=..., uri=..., version=..., headers=..., body=..., host=..., files=..., connection=..., start_line=...) -> None: ...
+ def supports_http_1_1(self): ...
+ @property
+ def cookies(self): ...
+ def write(self, chunk, callback=...): ...
+ def finish(self): ...
+ def full_url(self): ...
+ def request_time(self): ...
+ def get_ssl_certificate(self, binary_form=...): ...
+
+class HTTPInputError(Exception): ...
+class HTTPOutputError(Exception): ...
+
+class HTTPServerConnectionDelegate:
+ def start_request(self, server_conn, request_conn): ...
+ def on_close(self, server_conn): ...
+
+class HTTPMessageDelegate:
+ def headers_received(self, start_line, headers): ...
+ def data_received(self, chunk): ...
+ def finish(self): ...
+ def on_connection_close(self): ...
+
+class HTTPConnection:
+ def write_headers(self, start_line, headers, chunk=..., callback=...): ...
+ def write(self, chunk, callback=...): ...
+ def finish(self): ...
+
+def url_concat(url, args): ...
+
+class HTTPFile(ObjectDict): ...
+
+def parse_body_arguments(content_type, body, arguments, files, headers=...): ...
+def parse_multipart_form_data(boundary, data, arguments, files): ...
+def format_timestamp(ts): ...
+
+RequestStartLine = namedtuple('RequestStartLine', ['method', 'path', 'version'])
+
+def parse_request_start_line(line): ...
+
+ResponseStartLine = namedtuple('ResponseStartLine', ['version', 'code', 'reason'])
+
+def parse_response_start_line(line): ...
+def doctests(): ...
+def split_host_and_port(netloc): ...
diff --git a/typeshed/third_party/2/tornado/ioloop.pyi b/typeshed/third_party/2/tornado/ioloop.pyi
new file mode 100644
index 0000000..38624c5
--- /dev/null
+++ b/typeshed/third_party/2/tornado/ioloop.pyi
@@ -0,0 +1,88 @@
+# Stubs for tornado.ioloop (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from tornado.util import Configurable
+
+signal = ... # type: Any
+
+class TimeoutError(Exception): ...
+
+class IOLoop(Configurable):
+ NONE = ... # type: Any
+ READ = ... # type: Any
+ WRITE = ... # type: Any
+ ERROR = ... # type: Any
+ @staticmethod
+ def instance(): ...
+ @staticmethod
+ def initialized(): ...
+ def install(self): ...
+ @staticmethod
+ def clear_instance(): ...
+ @staticmethod
+ def current(instance=...): ...
+ def make_current(self): ...
+ @staticmethod
+ def clear_current(): ...
+ @classmethod
+ def configurable_base(cls): ...
+ @classmethod
+ def configurable_default(cls): ...
+ def initialize(self, make_current=...): ...
+ def close(self, all_fds=...): ...
+ def add_handler(self, fd, handler, events): ...
+ def update_handler(self, fd, events): ...
+ def remove_handler(self, fd): ...
+ def set_blocking_signal_threshold(self, seconds, action): ...
+ def set_blocking_log_threshold(self, seconds): ...
+ def log_stack(self, signal, frame): ...
+ def start(self): ...
+ def stop(self): ...
+ def run_sync(self, func, timeout=...): ...
+ def time(self): ...
+ def add_timeout(self, deadline, callback, *args, **kwargs): ...
+ def call_later(self, delay, callback, *args, **kwargs): ...
+ def call_at(self, when, callback, *args, **kwargs): ...
+ def remove_timeout(self, timeout): ...
+ def add_callback(self, callback, *args, **kwargs): ...
+ def add_callback_from_signal(self, callback, *args, **kwargs): ...
+ def spawn_callback(self, callback, *args, **kwargs): ...
+ def add_future(self, future, callback): ...
+ def handle_callback_exception(self, callback): ...
+ def split_fd(self, fd): ...
+ def close_fd(self, fd): ...
+
+class PollIOLoop(IOLoop):
+ time_func = ... # type: Any
+ def initialize(self, impl, time_func=..., **kwargs): ...
+ def close(self, all_fds=...): ...
+ def add_handler(self, fd, handler, events): ...
+ def update_handler(self, fd, events): ...
+ def remove_handler(self, fd): ...
+ def set_blocking_signal_threshold(self, seconds, action): ...
+ def start(self): ...
+ def stop(self): ...
+ def time(self): ...
+ def call_at(self, deadline, callback, *args, **kwargs): ...
+ def remove_timeout(self, timeout): ...
+ def add_callback(self, callback, *args, **kwargs): ...
+ def add_callback_from_signal(self, callback, *args, **kwargs): ...
+
+class _Timeout:
+ deadline = ... # type: Any
+ callback = ... # type: Any
+ tiebreaker = ... # type: Any
+ def __init__(self, deadline, callback, io_loop) -> None: ...
+ def __lt__(self, other): ...
+ def __le__(self, other): ...
+
+class PeriodicCallback:
+ callback = ... # type: Any
+ callback_time = ... # type: Any
+ io_loop = ... # type: Any
+ def __init__(self, callback, callback_time, io_loop=...) -> None: ...
+ def start(self): ...
+ def stop(self): ...
+ def is_running(self): ...
diff --git a/typeshed/third_party/2/tornado/locks.pyi b/typeshed/third_party/2/tornado/locks.pyi
new file mode 100644
index 0000000..ea61761
--- /dev/null
+++ b/typeshed/third_party/2/tornado/locks.pyi
@@ -0,0 +1,49 @@
+# Stubs for tornado.locks (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class _TimeoutGarbageCollector:
+ def __init__(self): ...
+
+class Condition(_TimeoutGarbageCollector):
+ io_loop = ... # type: Any
+ def __init__(self): ...
+ def wait(self, timeout=None): ...
+ def notify(self, n=1): ...
+ def notify_all(self): ...
+
+class Event:
+ def __init__(self): ...
+ def is_set(self): ...
+ def set(self): ...
+ def clear(self): ...
+ def wait(self, timeout=None): ...
+
+class _ReleasingContextManager:
+ def __init__(self, obj): ...
+ def __enter__(self): ...
+ def __exit__(self, exc_type, exc_val, exc_tb): ...
+
+class Semaphore(_TimeoutGarbageCollector):
+ def __init__(self, value=1): ...
+ def release(self): ...
+ def acquire(self, timeout=None): ...
+ def __enter__(self): ...
+ __exit__ = ... # type: Any
+ def __aenter__(self): ...
+ def __aexit__(self, typ, value, tb): ...
+
+class BoundedSemaphore(Semaphore):
+ def __init__(self, value=1): ...
+ def release(self): ...
+
+class Lock:
+ def __init__(self): ...
+ def acquire(self, timeout=None): ...
+ def release(self): ...
+ def __enter__(self): ...
+ __exit__ = ... # type: Any
+ def __aenter__(self): ...
+ def __aexit__(self, typ, value, tb): ...
diff --git a/typeshed/third_party/2/tornado/netutil.pyi b/typeshed/third_party/2/tornado/netutil.pyi
new file mode 100644
index 0000000..bfbc6b1
--- /dev/null
+++ b/typeshed/third_party/2/tornado/netutil.pyi
@@ -0,0 +1,49 @@
+# Stubs for tornado.netutil (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from tornado.util import Configurable
+
+ssl = ... # type: Any
+certifi = ... # type: Any
+xrange = ... # type: Any
+ssl_match_hostname = ... # type: Any
+SSLCertificateError = ... # type: Any
+
+def bind_sockets(port, address=..., family=..., backlog=..., flags=...): ...
+def bind_unix_socket(file, mode=..., backlog=...): ...
+def add_accept_handler(sock, callback, io_loop=...): ...
+def is_valid_ip(ip): ...
+
+class Resolver(Configurable):
+ @classmethod
+ def configurable_base(cls): ...
+ @classmethod
+ def configurable_default(cls): ...
+ def resolve(self, host, port, family=..., callback=...): ...
+ def close(self): ...
+
+class ExecutorResolver(Resolver):
+ io_loop = ... # type: Any
+ executor = ... # type: Any
+ close_executor = ... # type: Any
+ def initialize(self, io_loop=..., executor=..., close_executor=...): ...
+ def close(self): ...
+ def resolve(self, host, port, family=...): ...
+
+class BlockingResolver(ExecutorResolver):
+ def initialize(self, io_loop=...): ...
+
+class ThreadedResolver(ExecutorResolver):
+ def initialize(self, io_loop=..., num_threads=...): ...
+
+class OverrideResolver(Resolver):
+ resolver = ... # type: Any
+ mapping = ... # type: Any
+ def initialize(self, resolver, mapping): ...
+ def close(self): ...
+ def resolve(self, host, port, *args, **kwargs): ...
+
+def ssl_options_to_context(ssl_options): ...
+def ssl_wrap_socket(socket, ssl_options, server_hostname=..., **kwargs): ...
diff --git a/typeshed/third_party/2/tornado/tcpserver.pyi b/typeshed/third_party/2/tornado/tcpserver.pyi
new file mode 100644
index 0000000..9fa7a09
--- /dev/null
+++ b/typeshed/third_party/2/tornado/tcpserver.pyi
@@ -0,0 +1,21 @@
+# Stubs for tornado.tcpserver (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+ssl = ... # type: Any
+
+class TCPServer:
+ io_loop = ... # type: Any
+ ssl_options = ... # type: Any
+ max_buffer_size = ... # type: Any
+ read_chunk_size = ... # type: Any
+ def __init__(self, io_loop=..., ssl_options=..., max_buffer_size=..., read_chunk_size=...) -> None: ...
+ def listen(self, port, address=...): ...
+ def add_sockets(self, sockets): ...
+ def add_socket(self, socket): ...
+ def bind(self, port, address=..., family=..., backlog=...): ...
+ def start(self, num_processes=...): ...
+ def stop(self): ...
+ def handle_stream(self, stream, address): ...
diff --git a/typeshed/third_party/2/tornado/testing.pyi b/typeshed/third_party/2/tornado/testing.pyi
new file mode 100644
index 0000000..c6fde57
--- /dev/null
+++ b/typeshed/third_party/2/tornado/testing.pyi
@@ -0,0 +1,64 @@
+# Stubs for tornado.testing (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+import unittest
+import logging
+
+AsyncHTTPClient = ... # type: Any
+gen = ... # type: Any
+HTTPServer = ... # type: Any
+IOLoop = ... # type: Any
+netutil = ... # type: Any
+SimpleAsyncHTTPClient = ... # type: Any
+
+def get_unused_port(): ...
+def bind_unused_port(): ...
+
+class AsyncTestCase(unittest.TestCase):
+ def __init__(self, *args, **kwargs): ...
+ io_loop = ... # type: Any
+ def setUp(self): ...
+ def tearDown(self): ...
+ def get_new_ioloop(self): ...
+ def run(self, result=None): ...
+ def stop(self, _arg=None, **kwargs): ...
+ def wait(self, condition=None, timeout=5): ...
+
+class AsyncHTTPTestCase(AsyncTestCase):
+ http_client = ... # type: Any
+ http_server = ... # type: Any
+ def setUp(self): ...
+ def get_http_client(self): ...
+ def get_http_server(self): ...
+ def get_app(self): ...
+ def fetch(self, path, **kwargs): ...
+ def get_httpserver_options(self): ...
+ def get_http_port(self): ...
+ def get_protocol(self): ...
+ def get_url(self, path): ...
+ def tearDown(self): ...
+
+class AsyncHTTPSTestCase(AsyncHTTPTestCase):
+ def get_http_client(self): ...
+ def get_httpserver_options(self): ...
+ def get_ssl_options(self): ...
+ def get_protocol(self): ...
+
+def gen_test(f): ...
+
+class LogTrapTestCase(unittest.TestCase):
+ def run(self, result=None): ...
+
+class ExpectLog(logging.Filter):
+ logger = ... # type: Any
+ regex = ... # type: Any
+ required = ... # type: Any
+ matched = ... # type: Any
+ def __init__(self, logger, regex, required=True): ...
+ def filter(self, record): ...
+ def __enter__(self): ...
+ def __exit__(self, typ, value, tb): ...
+
+def main(**kwargs): ...
diff --git a/typeshed/third_party/2/tornado/util.pyi b/typeshed/third_party/2/tornado/util.pyi
new file mode 100644
index 0000000..3b07131
--- /dev/null
+++ b/typeshed/third_party/2/tornado/util.pyi
@@ -0,0 +1,50 @@
+# Stubs for tornado.util (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+xrange = ... # type: Any
+
+class ObjectDict(dict):
+ def __getattr__(self, name): ...
+ def __setattr__(self, name, value): ...
+
+class GzipDecompressor:
+ decompressobj = ... # type: Any
+ def __init__(self) -> None: ...
+ def decompress(self, value, max_length=...): ...
+ @property
+ def unconsumed_tail(self): ...
+ def flush(self): ...
+
+unicode_type = ... # type: Any
+basestring_type = ... # type: Any
+
+def import_object(name): ...
+
+bytes_type = ... # type: Any
+
+def errno_from_exception(e): ...
+
+class Configurable:
+ def __new__(cls, *args, **kwargs): ...
+ @classmethod
+ def configurable_base(cls): ...
+ @classmethod
+ def configurable_default(cls): ...
+ def initialize(self): ...
+ @classmethod
+ def configure(cls, impl, **kwargs): ...
+ @classmethod
+ def configured_class(cls): ...
+
+class ArgReplacer:
+ name = ... # type: Any
+ arg_pos = ... # type: Any
+ def __init__(self, func, name) -> None: ...
+ def get_old_value(self, args, kwargs, default=...): ...
+ def replace(self, new_value, args, kwargs): ...
+
+def timedelta_to_seconds(td): ...
+def doctests(): ...
diff --git a/typeshed/third_party/2/tornado/web.pyi b/typeshed/third_party/2/tornado/web.pyi
new file mode 100644
index 0000000..ca0c7c0
--- /dev/null
+++ b/typeshed/third_party/2/tornado/web.pyi
@@ -0,0 +1,261 @@
+# Stubs for tornado.web (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from tornado import httputil
+
+MIN_SUPPORTED_SIGNED_VALUE_VERSION = ... # type: Any
+MAX_SUPPORTED_SIGNED_VALUE_VERSION = ... # type: Any
+DEFAULT_SIGNED_VALUE_VERSION = ... # type: Any
+DEFAULT_SIGNED_VALUE_MIN_VERSION = ... # type: Any
+
+class RequestHandler:
+ SUPPORTED_METHODS = ... # type: Any
+ application = ... # type: Any
+ request = ... # type: Any
+ path_args = ... # type: Any
+ path_kwargs = ... # type: Any
+ ui = ... # type: Any
+ def __init__(self, application, request, **kwargs) -> None: ...
+ def initialize(self): ...
+ @property
+ def settings(self): ...
+ def head(self, *args, **kwargs): ...
+ def get(self, *args, **kwargs): ...
+ def post(self, *args, **kwargs): ...
+ def delete(self, *args, **kwargs): ...
+ def patch(self, *args, **kwargs): ...
+ def put(self, *args, **kwargs): ...
+ def options(self, *args, **kwargs): ...
+ def prepare(self): ...
+ def on_finish(self): ...
+ def on_connection_close(self): ...
+ def clear(self): ...
+ def set_default_headers(self): ...
+ def set_status(self, status_code, reason=...): ...
+ def get_status(self): ...
+ def set_header(self, name, value): ...
+ def add_header(self, name, value): ...
+ def clear_header(self, name): ...
+ def get_argument(self, name, default=..., strip=...): ...
+ def get_arguments(self, name, strip=...): ...
+ def get_body_argument(self, name, default=..., strip=...): ...
+ def get_body_arguments(self, name, strip=...): ...
+ def get_query_argument(self, name, default=..., strip=...): ...
+ def get_query_arguments(self, name, strip=...): ...
+ def decode_argument(self, value, name=...): ...
+ @property
+ def cookies(self): ...
+ def get_cookie(self, name, default=...): ...
+ def set_cookie(self, name, value, domain=..., expires=..., path=..., expires_days=..., **kwargs): ...
+ def clear_cookie(self, name, path=..., domain=...): ...
+ def clear_all_cookies(self, path=..., domain=...): ...
+ def set_secure_cookie(self, name, value, expires_days=..., version=..., **kwargs): ...
+ def create_signed_value(self, name, value, version=...): ...
+ def get_secure_cookie(self, name, value=..., max_age_days=..., min_version=...): ...
+ def get_secure_cookie_key_version(self, name, value=...): ...
+ def redirect(self, url, permanent=..., status=...): ...
+ def write(self, chunk): ...
+ def render(self, template_name, **kwargs): ...
+ def render_string(self, template_name, **kwargs): ...
+ def get_template_namespace(self): ...
+ def create_template_loader(self, template_path): ...
+ def flush(self, include_footers=..., callback=...): ...
+ def finish(self, chunk=...): ...
+ def send_error(self, status_code=..., **kwargs): ...
+ def write_error(self, status_code, **kwargs): ...
+ @property
+ def locale(self): ...
+ @locale.setter
+ def locale(self, value): ...
+ def get_user_locale(self): ...
+ def get_browser_locale(self, default=...): ...
+ @property
+ def current_user(self): ...
+ @current_user.setter
+ def current_user(self, value): ...
+ def get_current_user(self): ...
+ def get_login_url(self): ...
+ def get_template_path(self): ...
+ @property
+ def xsrf_token(self): ...
+ def check_xsrf_cookie(self): ...
+ def xsrf_form_html(self): ...
+ def static_url(self, path, include_host=..., **kwargs): ...
+ def require_setting(self, name, feature=...): ...
+ def reverse_url(self, name, *args): ...
+ def compute_etag(self): ...
+ def set_etag_header(self): ...
+ def check_etag_header(self): ...
+ def data_received(self, chunk): ...
+ def log_exception(self, typ, value, tb): ...
+
+def asynchronous(method): ...
+def stream_request_body(cls): ...
+def removeslash(method): ...
+def addslash(method): ...
+
+class Application(httputil.HTTPServerConnectionDelegate):
+ transforms = ... # type: Any
+ handlers = ... # type: Any
+ named_handlers = ... # type: Any
+ default_host = ... # type: Any
+ settings = ... # type: Any
+ ui_modules = ... # type: Any
+ ui_methods = ... # type: Any
+ def __init__(self, handlers=..., default_host=..., transforms=..., **settings) -> None: ...
+ def listen(self, port, address=..., **kwargs): ...
+ def add_handlers(self, host_pattern, host_handlers): ...
+ def add_transform(self, transform_class): ...
+ def start_request(self, server_conn, request_conn): ...
+ def __call__(self, request): ...
+ def reverse_url(self, name, *args): ...
+ def log_request(self, handler): ...
+
+class _RequestDispatcher(httputil.HTTPMessageDelegate):
+ application = ... # type: Any
+ connection = ... # type: Any
+ request = ... # type: Any
+ chunks = ... # type: Any
+ handler_class = ... # type: Any
+ handler_kwargs = ... # type: Any
+ path_args = ... # type: Any
+ path_kwargs = ... # type: Any
+ def __init__(self, application, connection) -> None: ...
+ def headers_received(self, start_line, headers): ...
+ stream_request_body = ... # type: Any
+ def set_request(self, request): ...
+ def data_received(self, data): ...
+ def finish(self): ...
+ def on_connection_close(self): ...
+ handler = ... # type: Any
+ def execute(self): ...
+
+class HTTPError(Exception):
+ status_code = ... # type: Any
+ log_message = ... # type: Any
+ args = ... # type: Any
+ reason = ... # type: Any
+ def __init__(self, status_code, log_message=..., *args, **kwargs) -> None: ...
+
+class Finish(Exception): ...
+
+class MissingArgumentError(HTTPError):
+ arg_name = ... # type: Any
+ def __init__(self, arg_name) -> None: ...
+
+class ErrorHandler(RequestHandler):
+ def initialize(self, status_code): ...
+ def prepare(self): ...
+ def check_xsrf_cookie(self): ...
+
+class RedirectHandler(RequestHandler):
+ def initialize(self, url, permanent=...): ...
+ def get(self): ...
+
+class StaticFileHandler(RequestHandler):
+ CACHE_MAX_AGE = ... # type: Any
+ root = ... # type: Any
+ default_filename = ... # type: Any
+ def initialize(self, path, default_filename=...): ...
+ @classmethod
+ def reset(cls): ...
+ def head(self, path): ...
+ path = ... # type: Any
+ absolute_path = ... # type: Any
+ modified = ... # type: Any
+ def get(self, path, include_body=...): ...
+ def compute_etag(self): ...
+ def set_headers(self): ...
+ def should_return_304(self): ...
+ @classmethod
+ def get_absolute_path(cls, root, path): ...
+ def validate_absolute_path(self, root, absolute_path): ...
+ @classmethod
+ def get_content(cls, abspath, start=..., end=...): ...
+ @classmethod
+ def get_content_version(cls, abspath): ...
+ def get_content_size(self): ...
+ def get_modified_time(self): ...
+ def get_content_type(self): ...
+ def set_extra_headers(self, path): ...
+ def get_cache_time(self, path, modified, mime_type): ...
+ @classmethod
+ def make_static_url(cls, settings, path, include_version=...): ...
+ def parse_url_path(self, url_path): ...
+ @classmethod
+ def get_version(cls, settings, path): ...
+
+class FallbackHandler(RequestHandler):
+ fallback = ... # type: Any
+ def initialize(self, fallback): ...
+ def prepare(self): ...
+
+class OutputTransform:
+ def __init__(self, request) -> None: ...
+ def transform_first_chunk(self, status_code, headers, chunk, finishing): ...
+ def transform_chunk(self, chunk, finishing): ...
+
+class GZipContentEncoding(OutputTransform):
+ CONTENT_TYPES = ... # type: Any
+ MIN_LENGTH = ... # type: Any
+ def __init__(self, request) -> None: ...
+ def transform_first_chunk(self, status_code, headers, chunk, finishing): ...
+ def transform_chunk(self, chunk, finishing): ...
+
+def authenticated(method): ...
+
+class UIModule:
+ handler = ... # type: Any
+ request = ... # type: Any
+ ui = ... # type: Any
+ locale = ... # type: Any
+ def __init__(self, handler) -> None: ...
+ @property
+ def current_user(self): ...
+ def render(self, *args, **kwargs): ...
+ def embedded_javascript(self): ...
+ def javascript_files(self): ...
+ def embedded_css(self): ...
+ def css_files(self): ...
+ def html_head(self): ...
+ def html_body(self): ...
+ def render_string(self, path, **kwargs): ...
+
+class _linkify(UIModule):
+ def render(self, text, **kwargs): ...
+
+class _xsrf_form_html(UIModule):
+ def render(self): ...
+
+class TemplateModule(UIModule):
+ def __init__(self, handler) -> None: ...
+ def render(self, path, **kwargs): ...
+ def embedded_javascript(self): ...
+ def javascript_files(self): ...
+ def embedded_css(self): ...
+ def css_files(self): ...
+ def html_head(self): ...
+ def html_body(self): ...
+
+class _UIModuleNamespace:
+ handler = ... # type: Any
+ ui_modules = ... # type: Any
+ def __init__(self, handler, ui_modules) -> None: ...
+ def __getitem__(self, key): ...
+ def __getattr__(self, key): ...
+
+class URLSpec:
+ regex = ... # type: Any
+ handler_class = ... # type: Any
+ kwargs = ... # type: Any
+ name = ... # type: Any
+ def __init__(self, pattern, handler, kwargs=..., name=...) -> None: ...
+ def reverse(self, *args): ...
+
+url = ... # type: Any
+
+def create_signed_value(secret, name, value, version=..., clock=..., key_version=...): ...
+def decode_signed_value(secret, name, value, max_age_days=..., clock=..., min_version=...): ...
+def get_signature_key_version(value): ...
diff --git a/typeshed/third_party/2/werkzeug/__init__.pyi b/typeshed/third_party/2/werkzeug/__init__.pyi
new file mode 100644
index 0000000..5bb4845
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/__init__.pyi
@@ -0,0 +1,155 @@
+# Stubs for werkzeug (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from types import ModuleType
+
+from typing import Any
+
+from werkzeug import _internal
+from werkzeug import datastructures
+from werkzeug import debug
+from werkzeug import exceptions
+from werkzeug import formparser
+from werkzeug import http
+from werkzeug import local
+from werkzeug import security
+from werkzeug import serving
+from werkzeug import test
+from werkzeug import testapp
+from werkzeug import urls
+from werkzeug import useragents
+from werkzeug import utils
+from werkzeug import wrappers
+from werkzeug import wsgi
+
+class module(ModuleType):
+ def __getattr__(self, name): ...
+ def __dir__(self): ...
+
+
+__version__ = ... # type: Any
+
+run_simple = serving.run_simple
+test_app = testapp.test_app
+UserAgent = useragents.UserAgent
+_easteregg = _internal._easteregg
+DebuggedApplication = debug.DebuggedApplication
+MultiDict = datastructures.MultiDict
+CombinedMultiDict = datastructures.CombinedMultiDict
+Headers = datastructures.Headers
+EnvironHeaders = datastructures.EnvironHeaders
+ImmutableList = datastructures.ImmutableList
+ImmutableDict = datastructures.ImmutableDict
+ImmutableMultiDict = datastructures.ImmutableMultiDict
+TypeConversionDict = datastructures.TypeConversionDict
+ImmutableTypeConversionDict = datastructures.ImmutableTypeConversionDict
+Accept = datastructures.Accept
+MIMEAccept = datastructures.MIMEAccept
+CharsetAccept = datastructures.CharsetAccept
+LanguageAccept = datastructures.LanguageAccept
+RequestCacheControl = datastructures.RequestCacheControl
+ResponseCacheControl = datastructures.ResponseCacheControl
+ETags = datastructures.ETags
+HeaderSet = datastructures.HeaderSet
+WWWAuthenticate = datastructures.WWWAuthenticate
+Authorization = datastructures.Authorization
+FileMultiDict = datastructures.FileMultiDict
+CallbackDict = datastructures.CallbackDict
+FileStorage = datastructures.FileStorage
+OrderedMultiDict = datastructures.OrderedMultiDict
+ImmutableOrderedMultiDict = datastructures.ImmutableOrderedMultiDict
+escape = utils.escape
+environ_property = utils.environ_property
+append_slash_redirect = utils.append_slash_redirect
+redirect = utils.redirect
+cached_property = utils.cached_property
+import_string = utils.import_string
+dump_cookie = http.dump_cookie
+parse_cookie = http.parse_cookie
+unescape = utils.unescape
+format_string = utils.format_string
+find_modules = utils.find_modules
+header_property = utils.header_property
+html = utils.html
+xhtml = utils.xhtml
+HTMLBuilder = utils.HTMLBuilder
+validate_arguments = utils.validate_arguments
+ArgumentValidationError = utils.ArgumentValidationError
+bind_arguments = utils.bind_arguments
+secure_filename = utils.secure_filename
+BaseResponse = wrappers.BaseResponse
+BaseRequest = wrappers.BaseRequest
+Request = wrappers.Request
+Response = wrappers.Response
+AcceptMixin = wrappers.AcceptMixin
+ETagRequestMixin = wrappers.ETagRequestMixin
+ETagResponseMixin = wrappers.ETagResponseMixin
+ResponseStreamMixin = wrappers.ResponseStreamMixin
+CommonResponseDescriptorsMixin = wrappers.CommonResponseDescriptorsMixin
+UserAgentMixin = wrappers.UserAgentMixin
+AuthorizationMixin = wrappers.AuthorizationMixin
+WWWAuthenticateMixin = wrappers.WWWAuthenticateMixin
+CommonRequestDescriptorsMixin = wrappers.CommonRequestDescriptorsMixin
+Local = local.Local
+LocalManager = local.LocalManager
+LocalProxy = local.LocalProxy
+LocalStack = local.LocalStack
+release_local = local.release_local
+generate_password_hash = security.generate_password_hash
+check_password_hash = security.check_password_hash
+Client = test.Client
+EnvironBuilder = test.EnvironBuilder
+create_environ = test.create_environ
+run_wsgi_app = test.run_wsgi_app
+get_current_url = wsgi.get_current_url
+get_host = wsgi.get_host
+pop_path_info = wsgi.pop_path_info
+peek_path_info = wsgi.peek_path_info
+SharedDataMiddleware = wsgi.SharedDataMiddleware
+DispatcherMiddleware = wsgi.DispatcherMiddleware
+ClosingIterator = wsgi.ClosingIterator
+FileWrapper = wsgi.FileWrapper
+make_line_iter = wsgi.make_line_iter
+LimitedStream = wsgi.LimitedStream
+responder = wsgi.responder
+wrap_file = wsgi.wrap_file
+extract_path_info = wsgi.extract_path_info
+parse_etags = http.parse_etags
+parse_date = http.parse_date
+http_date = http.http_date
+cookie_date = http.cookie_date
+parse_cache_control_header = http.parse_cache_control_header
+is_resource_modified = http.is_resource_modified
+parse_accept_header = http.parse_accept_header
+parse_set_header = http.parse_set_header
+quote_etag = http.quote_etag
+unquote_etag = http.unquote_etag
+generate_etag = http.generate_etag
+dump_header = http.dump_header
+parse_list_header = http.parse_list_header
+parse_dict_header = http.parse_dict_header
+parse_authorization_header = http.parse_authorization_header
+parse_www_authenticate_header = http.parse_www_authenticate_header
+remove_entity_headers = http.remove_entity_headers
+is_entity_header = http.is_entity_header
+remove_hop_by_hop_headers = http.remove_hop_by_hop_headers
+parse_options_header = http.parse_options_header
+dump_options_header = http.dump_options_header
+is_hop_by_hop_header = http.is_hop_by_hop_header
+unquote_header_value = http.unquote_header_value
+quote_header_value = http.quote_header_value
+HTTP_STATUS_CODES = http.HTTP_STATUS_CODES
+url_decode = urls.url_decode
+url_encode = urls.url_encode
+url_quote = urls.url_quote
+url_quote_plus = urls.url_quote_plus
+url_unquote = urls.url_unquote
+url_unquote_plus = urls.url_unquote_plus
+url_fix = urls.url_fix
+Href = urls.Href
+iri_to_uri = urls.iri_to_uri
+uri_to_iri = urls.uri_to_iri
+parse_form_data = formparser.parse_form_data
+abort = exceptions.Aborter
+Aborter = exceptions.Aborter
diff --git a/typeshed/third_party/2/werkzeug/_compat.pyi b/typeshed/third_party/2/werkzeug/_compat.pyi
new file mode 100644
index 0000000..801bdda
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/_compat.pyi
@@ -0,0 +1,47 @@
+# Stubs for werkzeug._compat (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+import StringIO as BytesIO
+
+PY2 = ... # type: Any
+WIN = ... # type: Any
+unichr = ... # type: Any
+text_type = ... # type: Any
+string_types = ... # type: Any
+integer_types = ... # type: Any
+iterkeys = ... # type: Any
+itervalues = ... # type: Any
+iteritems = ... # type: Any
+iterlists = ... # type: Any
+iterlistvalues = ... # type: Any
+int_to_byte = ... # type: Any
+iter_bytes = ... # type: Any
+
+def fix_tuple_repr(obj): ...
+def implements_iterator(cls): ...
+def implements_to_string(cls): ...
+def native_string_result(func): ...
+def implements_bool(cls): ...
+
+range_type = ... # type: Any
+NativeStringIO = ... # type: Any
+
+def make_literal_wrapper(reference): ...
+def normalize_string_tuple(tup): ...
+def try_coerce_native(s): ...
+
+wsgi_get_bytes = ... # type: Any
+
+def wsgi_decoding_dance(s, charset='', errors=''): ...
+def wsgi_encoding_dance(s, charset='', errors=''): ...
+def to_bytes(x, charset=..., errors=''): ...
+def to_native(x, charset=..., errors=''): ...
+def reraise(tp, value, tb=None): ...
+
+imap = ... # type: Any
+izip = ... # type: Any
+ifilter = ... # type: Any
+
+def to_unicode(x, charset=..., errors='', allow_none_charset=False): ...
diff --git a/typeshed/third_party/2/werkzeug/_internal.pyi b/typeshed/third_party/2/werkzeug/_internal.pyi
new file mode 100644
index 0000000..1a1bbd5
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/_internal.pyi
@@ -0,0 +1,22 @@
+# Stubs for werkzeug._internal (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class _Missing:
+ def __reduce__(self): ...
+
+class _DictAccessorProperty:
+ read_only = ... # type: Any
+ name = ... # type: Any
+ default = ... # type: Any
+ load_func = ... # type: Any
+ dump_func = ... # type: Any
+ __doc__ = ... # type: Any
+ def __init__(self, name, default=None, load_func=None, dump_func=None, read_only=None, doc=None): ...
+ def __get__(self, obj, type=None): ...
+ def __set__(self, obj, value): ...
+ def __delete__(self, obj): ...
+
+def _easteregg(app=None): ...
diff --git a/typeshed/third_party/2/werkzeug/_reloader.pyi b/typeshed/third_party/2/werkzeug/_reloader.pyi
new file mode 100644
index 0000000..9bfea1f
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/_reloader.pyi
@@ -0,0 +1,33 @@
+# Stubs for werkzeug._reloader (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class ReloaderLoop:
+ name = ... # type: Any
+ extra_files = ... # type: Any
+ interval = ... # type: Any
+ def __init__(self, extra_files=None, interval=1): ...
+ def run(self): ...
+ def restart_with_reloader(self): ...
+ def trigger_reload(self, filename): ...
+ def log_reload(self, filename): ...
+
+class StatReloaderLoop(ReloaderLoop):
+ name = ... # type: Any
+ def run(self): ...
+
+class WatchdogReloaderLoop(ReloaderLoop):
+ observable_paths = ... # type: Any
+ name = ... # type: Any
+ observer_class = ... # type: Any
+ event_handler = ... # type: Any
+ should_reload = ... # type: Any
+ def __init__(self, *args, **kwargs): ...
+ def trigger_reload(self, filename): ...
+ def run(self): ...
+
+reloader_loops = ... # type: Any
+
+def run_with_reloader(main_func, extra_files=None, interval=1, reloader_type=''): ...
diff --git a/typeshed/third_party/2/werkzeug/contrib/__init__.pyi b/typeshed/third_party/2/werkzeug/contrib/__init__.pyi
new file mode 100644
index 0000000..4b77b01
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/contrib/__init__.pyi
@@ -0,0 +1,3 @@
+# Stubs for werkzeug.contrib (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
diff --git a/typeshed/third_party/2/werkzeug/contrib/atom.pyi b/typeshed/third_party/2/werkzeug/contrib/atom.pyi
new file mode 100644
index 0000000..98f994d
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/contrib/atom.pyi
@@ -0,0 +1,54 @@
+# Stubs for werkzeug.contrib.atom (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+XHTML_NAMESPACE = ... # type: Any
+
+def format_iso8601(obj): ...
+
+class AtomFeed:
+ default_generator = ... # type: Any
+ title = ... # type: Any
+ title_type = ... # type: Any
+ url = ... # type: Any
+ feed_url = ... # type: Any
+ id = ... # type: Any
+ updated = ... # type: Any
+ author = ... # type: Any
+ icon = ... # type: Any
+ logo = ... # type: Any
+ rights = ... # type: Any
+ rights_type = ... # type: Any
+ subtitle = ... # type: Any
+ subtitle_type = ... # type: Any
+ generator = ... # type: Any
+ links = ... # type: Any
+ entries = ... # type: Any
+ def __init__(self, title=None, entries=None, **kwargs): ...
+ def add(self, *args, **kwargs): ...
+ def generate(self): ...
+ def to_string(self): ...
+ def get_response(self): ...
+ def __call__(self, environ, start_response): ...
+
+class FeedEntry:
+ title = ... # type: Any
+ title_type = ... # type: Any
+ content = ... # type: Any
+ content_type = ... # type: Any
+ url = ... # type: Any
+ id = ... # type: Any
+ updated = ... # type: Any
+ summary = ... # type: Any
+ summary_type = ... # type: Any
+ author = ... # type: Any
+ published = ... # type: Any
+ rights = ... # type: Any
+ links = ... # type: Any
+ categories = ... # type: Any
+ xml_base = ... # type: Any
+ def __init__(self, title=None, content=None, feed_url=None, **kwargs): ...
+ def generate(self): ...
+ def to_string(self): ...
diff --git a/typeshed/third_party/2/werkzeug/contrib/cache.pyi b/typeshed/third_party/2/werkzeug/contrib/cache.pyi
new file mode 100644
index 0000000..1c9fcbe
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/contrib/cache.pyi
@@ -0,0 +1,77 @@
+# Stubs for werkzeug.contrib.cache (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class BaseCache:
+ default_timeout = ... # type: Any
+ def __init__(self, default_timeout=300): ...
+ def get(self, key): ...
+ def delete(self, key): ...
+ def get_many(self, *keys): ...
+ def get_dict(self, *keys): ...
+ def set(self, key, value, timeout=None): ...
+ def add(self, key, value, timeout=None): ...
+ def set_many(self, mapping, timeout=None): ...
+ def delete_many(self, *keys): ...
+ def has(self, key): ...
+ def clear(self): ...
+ def inc(self, key, delta=1): ...
+ def dec(self, key, delta=1): ...
+
+class NullCache(BaseCache): ...
+
+class SimpleCache(BaseCache):
+ clear = ... # type: Any
+ def __init__(self, threshold=500, default_timeout=300): ...
+ def get(self, key): ...
+ def set(self, key, value, timeout=None): ...
+ def add(self, key, value, timeout=None): ...
+ def delete(self, key): ...
+ def has(self, key): ...
+
+class MemcachedCache(BaseCache):
+ key_prefix = ... # type: Any
+ def __init__(self, servers=None, default_timeout=300, key_prefix=None): ...
+ def get(self, key): ...
+ def get_dict(self, *keys): ...
+ def add(self, key, value, timeout=None): ...
+ def set(self, key, value, timeout=None): ...
+ def get_many(self, *keys): ...
+ def set_many(self, mapping, timeout=None): ...
+ def delete(self, key): ...
+ def delete_many(self, *keys): ...
+ def has(self, key): ...
+ def clear(self): ...
+ def inc(self, key, delta=1): ...
+ def dec(self, key, delta=1): ...
+ def import_preferred_memcache_lib(self, servers): ...
+
+GAEMemcachedCache = ... # type: Any
+
+class RedisCache(BaseCache):
+ key_prefix = ... # type: Any
+ def __init__(self, host='', port=6379, password=None, db=0, default_timeout=300, key_prefix=None, **kwargs): ...
+ def dump_object(self, value): ...
+ def load_object(self, value): ...
+ def get(self, key): ...
+ def get_many(self, *keys): ...
+ def set(self, key, value, timeout=None): ...
+ def add(self, key, value, timeout=None): ...
+ def set_many(self, mapping, timeout=None): ...
+ def delete(self, key): ...
+ def delete_many(self, *keys): ...
+ def has(self, key): ...
+ def clear(self): ...
+ def inc(self, key, delta=1): ...
+ def dec(self, key, delta=1): ...
+
+class FileSystemCache(BaseCache):
+ def __init__(self, cache_dir, threshold=500, default_timeout=300, mode=384): ...
+ def clear(self): ...
+ def get(self, key): ...
+ def add(self, key, value, timeout=None): ...
+ def set(self, key, value, timeout=None): ...
+ def delete(self, key): ...
+ def has(self, key): ...
diff --git a/typeshed/third_party/2/werkzeug/contrib/fixers.pyi b/typeshed/third_party/2/werkzeug/contrib/fixers.pyi
new file mode 100644
index 0000000..147456e
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/contrib/fixers.pyi
@@ -0,0 +1,41 @@
+# Stubs for werkzeug.contrib.fixers (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class CGIRootFix:
+ app = ... # type: Any
+ app_root = ... # type: Any
+ def __init__(self, app, app_root=''): ...
+ def __call__(self, environ, start_response): ...
+
+LighttpdCGIRootFix = ... # type: Any
+
+class PathInfoFromRequestUriFix:
+ app = ... # type: Any
+ def __init__(self, app): ...
+ def __call__(self, environ, start_response): ...
+
+class ProxyFix:
+ app = ... # type: Any
+ num_proxies = ... # type: Any
+ def __init__(self, app, num_proxies=1): ...
+ def get_remote_addr(self, forwarded_for): ...
+ def __call__(self, environ, start_response): ...
+
+class HeaderRewriterFix:
+ app = ... # type: Any
+ remove_headers = ... # type: Any
+ add_headers = ... # type: Any
+ def __init__(self, app, remove_headers=None, add_headers=None): ...
+ def __call__(self, environ, start_response): ...
+
+class InternetExplorerFix:
+ app = ... # type: Any
+ fix_vary = ... # type: Any
+ fix_attach = ... # type: Any
+ def __init__(self, app, fix_vary=True, fix_attach=True): ...
+ def fix_headers(self, environ, headers, status=None): ...
+ def run_fixed(self, environ, start_response): ...
+ def __call__(self, environ, start_response): ...
diff --git a/typeshed/third_party/2/werkzeug/contrib/iterio.pyi b/typeshed/third_party/2/werkzeug/contrib/iterio.pyi
new file mode 100644
index 0000000..fd2c2a2
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/contrib/iterio.pyi
@@ -0,0 +1,42 @@
+# Stubs for werkzeug.contrib.iterio (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+greenlet = ... # type: Any
+
+class IterIO:
+ def __new__(cls, obj, sentinel=''): ...
+ def __iter__(self): ...
+ def tell(self): ...
+ def isatty(self): ...
+ def seek(self, pos, mode=0): ...
+ def truncate(self, size=None): ...
+ def write(self, s): ...
+ def writelines(self, list): ...
+ def read(self, n=-1): ...
+ def readlines(self, sizehint=0): ...
+ def readline(self, length=None): ...
+ def flush(self): ...
+ def __next__(self): ...
+
+class IterI(IterIO):
+ def __new__(cls, func, sentinel=''): ...
+ closed = ... # type: Any
+ def close(self): ...
+ def write(self, s): ...
+ def writelines(self, list): ...
+ def flush(self): ...
+
+class IterO(IterIO):
+ sentinel = ... # type: Any
+ closed = ... # type: Any
+ pos = ... # type: Any
+ def __new__(cls, gen, sentinel=''): ...
+ def __iter__(self): ...
+ def close(self): ...
+ def seek(self, pos, mode=0): ...
+ def read(self, n=-1): ...
+ def readline(self, length=None): ...
+ def readlines(self, sizehint=0): ...
diff --git a/typeshed/third_party/2/werkzeug/contrib/jsrouting.pyi b/typeshed/third_party/2/werkzeug/contrib/jsrouting.pyi
new file mode 100644
index 0000000..6fdd615
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/contrib/jsrouting.pyi
@@ -0,0 +1,14 @@
+# Stubs for werkzeug.contrib.jsrouting (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+def dumps(*args): ...
+def render_template(name_parts, rules, converters): ...
+def generate_map(map, name=''): ...
+def generate_adapter(adapter, name='', map_name=''): ...
+def js_to_url_function(converter): ...
+def NumberConverter_js_to_url(conv): ...
+
+js_to_url_functions = ... # type: Any
diff --git a/typeshed/third_party/2/werkzeug/contrib/limiter.pyi b/typeshed/third_party/2/werkzeug/contrib/limiter.pyi
new file mode 100644
index 0000000..d51038e
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/contrib/limiter.pyi
@@ -0,0 +1,11 @@
+# Stubs for werkzeug.contrib.limiter (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class StreamLimitMiddleware:
+ app = ... # type: Any
+ maximum_size = ... # type: Any
+ def __init__(self, app, maximum_size=...): ...
+ def __call__(self, environ, start_response): ...
diff --git a/typeshed/third_party/2/werkzeug/contrib/lint.pyi b/typeshed/third_party/2/werkzeug/contrib/lint.pyi
new file mode 100644
index 0000000..a0c2295
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/contrib/lint.pyi
@@ -0,0 +1,47 @@
+# Stubs for werkzeug.contrib.lint (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class WSGIWarning(Warning): ...
+class HTTPWarning(Warning): ...
+
+def check_string(context, obj, stacklevel=3): ...
+
+class InputStream:
+ def __init__(self, stream): ...
+ def read(self, *args): ...
+ def readline(self, *args): ...
+ def __iter__(self): ...
+ def close(self): ...
+
+class ErrorStream:
+ def __init__(self, stream): ...
+ def write(self, s): ...
+ def flush(self): ...
+ def writelines(self, seq): ...
+ def close(self): ...
+
+class GuardedWrite:
+ def __init__(self, write, chunks): ...
+ def __call__(self, s): ...
+
+class GuardedIterator:
+ closed = ... # type: Any
+ headers_set = ... # type: Any
+ chunks = ... # type: Any
+ def __init__(self, iterator, headers_set, chunks): ...
+ def __iter__(self): ...
+ def next(self): ...
+ def close(self): ...
+ def __del__(self): ...
+
+class LintMiddleware:
+ app = ... # type: Any
+ def __init__(self, app): ...
+ def check_environ(self, environ): ...
+ def check_start_response(self, status, headers, exc_info): ...
+ def check_headers(self, headers): ...
+ def check_iterator(self, app_iter): ...
+ def __call__(self, *args, **kwargs): ...
diff --git a/typeshed/third_party/2/werkzeug/contrib/profiler.pyi b/typeshed/third_party/2/werkzeug/contrib/profiler.pyi
new file mode 100644
index 0000000..b41c1c8
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/contrib/profiler.pyi
@@ -0,0 +1,18 @@
+# Stubs for werkzeug.contrib.profiler (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+available = ... # type: Any
+
+class MergeStream:
+ streams = ... # type: Any
+ def __init__(self, *streams): ...
+ def write(self, data): ...
+
+class ProfilerMiddleware:
+ def __init__(self, app, stream=None, sort_by=..., restrictions=..., profile_dir=None): ...
+ def __call__(self, environ, start_response): ...
+
+def make_action(app_factory, hostname='', port=5000, threaded=False, processes=1, stream=None, sort_by=..., restrictions=...): ...
diff --git a/typeshed/third_party/2/werkzeug/contrib/securecookie.pyi b/typeshed/third_party/2/werkzeug/contrib/securecookie.pyi
new file mode 100644
index 0000000..c262bed
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/contrib/securecookie.pyi
@@ -0,0 +1,30 @@
+# Stubs for werkzeug.contrib.securecookie (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from hmac import new as hmac
+from hashlib import sha1 as _default_hash
+from werkzeug.contrib.sessions import ModificationTrackingDict
+
+class UnquoteError(Exception): ...
+
+class SecureCookie(ModificationTrackingDict):
+ hash_method = ... # type: Any
+ serialization_method = ... # type: Any
+ quote_base64 = ... # type: Any
+ secret_key = ... # type: Any
+ new = ... # type: Any
+ def __init__(self, data=None, secret_key=None, new=True): ...
+ @property
+ def should_save(self): ...
+ @classmethod
+ def quote(cls, value): ...
+ @classmethod
+ def unquote(cls, value): ...
+ def serialize(self, expires=None): ...
+ @classmethod
+ def unserialize(cls, string, secret_key): ...
+ @classmethod
+ def load_cookie(cls, request, key='', secret_key=None): ...
+ def save_cookie(self, response, key='', expires=None, session_expires=None, max_age=None, path='', domain=None, secure=None, httponly=False, force=False): ...
diff --git a/typeshed/third_party/2/werkzeug/contrib/sessions.pyi b/typeshed/third_party/2/werkzeug/contrib/sessions.pyi
new file mode 100644
index 0000000..5b84ede
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/contrib/sessions.pyi
@@ -0,0 +1,58 @@
+# Stubs for werkzeug.contrib.sessions (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from werkzeug.datastructures import CallbackDict
+
+def generate_key(salt=None): ...
+
+class ModificationTrackingDict(CallbackDict):
+ modified = ... # type: Any
+ def __init__(self, *args, **kwargs): ...
+ def copy(self): ...
+ def __copy__(self): ...
+
+class Session(ModificationTrackingDict):
+ sid = ... # type: Any
+ new = ... # type: Any
+ def __init__(self, data, sid, new=False): ...
+ @property
+ def should_save(self): ...
+
+class SessionStore:
+ session_class = ... # type: Any
+ def __init__(self, session_class=None): ...
+ def is_valid_key(self, key): ...
+ def generate_key(self, salt=None): ...
+ def new(self): ...
+ def save(self, session): ...
+ def save_if_modified(self, session): ...
+ def delete(self, session): ...
+ def get(self, sid): ...
+
+class FilesystemSessionStore(SessionStore):
+ path = ... # type: Any
+ filename_template = ... # type: Any
+ renew_missing = ... # type: Any
+ mode = ... # type: Any
+ def __init__(self, path=None, filename_template='', session_class=None, renew_missing=False, mode=420): ...
+ def get_session_filename(self, sid): ...
+ def save(self, session): ...
+ def delete(self, session): ...
+ def get(self, sid): ...
+ def list(self): ...
+
+class SessionMiddleware:
+ app = ... # type: Any
+ store = ... # type: Any
+ cookie_name = ... # type: Any
+ cookie_age = ... # type: Any
+ cookie_expires = ... # type: Any
+ cookie_path = ... # type: Any
+ cookie_domain = ... # type: Any
+ cookie_secure = ... # type: Any
+ cookie_httponly = ... # type: Any
+ environ_key = ... # type: Any
+ def __init__(self, app, store, cookie_name='', cookie_age=None, cookie_expires=None, cookie_path='', cookie_domain=None, cookie_secure=None, cookie_httponly=False, environ_key=''): ...
+ def __call__(self, environ, start_response): ...
diff --git a/typeshed/third_party/2/werkzeug/contrib/testtools.pyi b/typeshed/third_party/2/werkzeug/contrib/testtools.pyi
new file mode 100644
index 0000000..c304f39
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/contrib/testtools.pyi
@@ -0,0 +1,13 @@
+# Stubs for werkzeug.contrib.testtools (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from werkzeug.wrappers import Response
+
+class ContentAccessors:
+ def xml(self): ...
+ def lxml(self): ...
+ def json(self): ...
+
+class TestResponse(Response, ContentAccessors): ...
diff --git a/typeshed/third_party/2/werkzeug/contrib/wrappers.pyi b/typeshed/third_party/2/werkzeug/contrib/wrappers.pyi
new file mode 100644
index 0000000..b538462
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/contrib/wrappers.pyi
@@ -0,0 +1,31 @@
+# Stubs for werkzeug.contrib.wrappers (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+def is_known_charset(charset): ...
+
+class JSONRequestMixin:
+ def json(self): ...
+
+class ProtobufRequestMixin:
+ protobuf_check_initialization = ... # type: Any
+ def parse_protobuf(self, proto_type): ...
+
+class RoutingArgsRequestMixin:
+ routing_args = ... # type: Any
+ routing_vars = ... # type: Any
+
+class ReverseSlashBehaviorRequestMixin:
+ def path(self): ...
+ def script_root(self): ...
+
+class DynamicCharsetRequestMixin:
+ default_charset = ... # type: Any
+ def unknown_charset(self, charset): ...
+ def charset(self): ...
+
+class DynamicCharsetResponseMixin:
+ default_charset = ... # type: Any
+ charset = ... # type: Any
diff --git a/typeshed/third_party/2/werkzeug/datastructures.pyi b/typeshed/third_party/2/werkzeug/datastructures.pyi
new file mode 100644
index 0000000..cbbddf9
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/datastructures.pyi
@@ -0,0 +1,389 @@
+# Stubs for werkzeug.datastructures (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from collections import Container, Iterable, Mapping, MutableSet
+
+def is_immutable(self): ...
+def iter_multi_items(mapping): ...
+def native_itermethods(names): ...
+
+class ImmutableListMixin:
+ def __hash__(self): ...
+ def __reduce_ex__(self, protocol): ...
+ def __delitem__(self, key): ...
+ def __delslice__(self, i, j): ...
+ def __iadd__(self, other): ...
+ __imul__ = ... # type: Any
+ def __setitem__(self, key, value): ...
+ def __setslice__(self, i, j, value): ...
+ def append(self, item): ...
+ remove = ... # type: Any
+ def extend(self, iterable): ...
+ def insert(self, pos, value): ...
+ def pop(self, index=-1): ...
+ def reverse(self): ...
+ def sort(self, cmp=None, key=None, reverse=None): ...
+
+class ImmutableList(ImmutableListMixin, list): ...
+
+class ImmutableDictMixin:
+ @classmethod
+ def fromkeys(cls, *args, **kwargs): ...
+ def __reduce_ex__(self, protocol): ...
+ def __hash__(self): ...
+ def setdefault(self, key, default=None): ...
+ def update(self, *args, **kwargs): ...
+ def pop(self, key, default=None): ...
+ def popitem(self): ...
+ def __setitem__(self, key, value): ...
+ def __delitem__(self, key): ...
+ def clear(self): ...
+
+class ImmutableMultiDictMixin(ImmutableDictMixin):
+ def __reduce_ex__(self, protocol): ...
+ def add(self, key, value): ...
+ def popitemlist(self): ...
+ def poplist(self, key): ...
+ def setlist(self, key, new_list): ...
+ def setlistdefault(self, key, default_list=None): ...
+
+class UpdateDictMixin:
+ on_update = ... # type: Any
+ def calls_update(name): ...
+ def setdefault(self, key, default=None): ...
+ def pop(self, key, default=...): ...
+ __setitem__ = ... # type: Any
+ __delitem__ = ... # type: Any
+ clear = ... # type: Any
+ popitem = ... # type: Any
+ update = ... # type: Any
+
+class TypeConversionDict(dict):
+ def get(self, key, default=None, type=None): ...
+
+class ImmutableTypeConversionDict(ImmutableDictMixin, TypeConversionDict):
+ def copy(self): ...
+ def __copy__(self): ...
+
+class ViewItems:
+ def __init__(self, multi_dict, method, repr_name, *a, **kw): ...
+ def __iter__(self): ...
+
+class MultiDict(TypeConversionDict):
+ def __init__(self, mapping=None): ...
+ def __getitem__(self, key): ...
+ def __setitem__(self, key, value): ...
+ def add(self, key, value): ...
+ def getlist(self, key, type=None): ...
+ def setlist(self, key, new_list): ...
+ def setdefault(self, key, default=None): ...
+ def setlistdefault(self, key, default_list=None): ...
+ def items(self, multi=False): ...
+ def lists(self): ...
+ def keys(self): ...
+ __iter__ = ... # type: Any
+ def values(self): ...
+ def listvalues(self): ...
+ def copy(self): ...
+ def deepcopy(self, memo=None): ...
+ def to_dict(self, flat=True): ...
+ def update(self, other_dict): ...
+ def pop(self, key, default=...): ...
+ def popitem(self): ...
+ def poplist(self, key): ...
+ def popitemlist(self): ...
+ def __copy__(self): ...
+ def __deepcopy__(self, memo): ...
+
+class _omd_bucket:
+ prev = ... # type: Any
+ key = ... # type: Any
+ value = ... # type: Any
+ next = ... # type: Any
+ def __init__(self, omd, key, value): ...
+ def unlink(self, omd): ...
+
+class OrderedMultiDict(MultiDict):
+ def __init__(self, mapping=None): ...
+ def __eq__(self, other): ...
+ def __ne__(self, other): ...
+ def __reduce_ex__(self, protocol): ...
+ def __getitem__(self, key): ...
+ def __setitem__(self, key, value): ...
+ def __delitem__(self, key): ...
+ def keys(self): ...
+ __iter__ = ... # type: Any
+ def values(self): ...
+ def items(self, multi=False): ...
+ def lists(self): ...
+ def listvalues(self): ...
+ def add(self, key, value): ...
+ def getlist(self, key, type=None): ...
+ def setlist(self, key, new_list): ...
+ def setlistdefault(self, key, default_list=None): ...
+ def update(self, mapping): ...
+ def poplist(self, key): ...
+ def pop(self, key, default=...): ...
+ def popitem(self): ...
+ def popitemlist(self): ...
+
+class Headers(Mapping):
+ def __init__(self, defaults=None): ...
+ def __getitem__(self, key, _get_mode=False): ...
+ def __eq__(self, other): ...
+ def __ne__(self, other): ...
+ def get(self, key, default=None, type=None, as_bytes=False): ...
+ def getlist(self, key, type=None, as_bytes=False): ...
+ def get_all(self, name): ...
+ def items(self, lower=False): ...
+ def keys(self, lower=False): ...
+ def values(self): ...
+ def extend(self, iterable): ...
+ def __delitem__(self, key, _index_operation=True): ...
+ def remove(self, key): ...
+ def pop(self, **kwargs): ...
+ def popitem(self): ...
+ def __contains__(self, key): ...
+ has_key = ... # type: Any
+ def __iter__(self): ...
+ def __len__(self): ...
+ def add(self, _key, _value, **kw): ...
+ def add_header(self, _key, _value, **_kw): ...
+ def clear(self): ...
+ def set(self, _key, _value, **kw): ...
+ def setdefault(self, key, value): ...
+ def __setitem__(self, key, value): ...
+ def to_list(self, charset=''): ...
+ def to_wsgi_list(self): ...
+ def copy(self): ...
+ def __copy__(self): ...
+
+class ImmutableHeadersMixin:
+ def __delitem__(self, key, _index_operation=True): ... # FIXME: This is invalid but works around https://github.com/pallets/werkzeug/issues/1051
+ def __setitem__(self, key, value): ...
+ set = ... # type: Any
+ def add(self, *args, **kwargs): ...
+ remove = ... # type: Any
+ add_header = ... # type: Any
+ def extend(self, iterable): ...
+ def insert(self, pos, value): ...
+ def pop(self, **kwargs): ...
+ def popitem(self): ...
+ def setdefault(self, key, default): ...
+
+class EnvironHeaders(ImmutableHeadersMixin, Headers):
+ environ = ... # type: Any
+ def __init__(self, environ): ...
+ def __eq__(self, other): ...
+ def __getitem__(self, key, _get_mode=False): ...
+ def __len__(self): ...
+ def __iter__(self): ...
+ def copy(self): ...
+
+class CombinedMultiDict(ImmutableMultiDictMixin, MultiDict):
+ def __reduce_ex__(self, protocol): ...
+ dicts = ... # type: Any
+ def __init__(self, dicts=None): ...
+ @classmethod
+ def fromkeys(cls): ...
+ def __getitem__(self, key): ...
+ def get(self, key, default=None, type=None): ...
+ def getlist(self, key, type=None): ...
+ def keys(self): ...
+ __iter__ = ... # type: Any
+ def items(self, multi=False): ...
+ def values(self): ...
+ def lists(self): ...
+ def listvalues(self): ...
+ def copy(self): ...
+ def to_dict(self, flat=True): ...
+ def __len__(self): ...
+ def __contains__(self, key): ...
+ has_key = ... # type: Any
+
+class FileMultiDict(MultiDict):
+ def add_file(self, name, file, filename=None, content_type=None): ...
+
+class ImmutableDict(ImmutableDictMixin, dict):
+ def copy(self): ...
+ def __copy__(self): ...
+
+class ImmutableMultiDict(ImmutableMultiDictMixin, MultiDict):
+ def copy(self): ...
+ def __copy__(self): ...
+
+class ImmutableOrderedMultiDict(ImmutableMultiDictMixin, OrderedMultiDict):
+ def copy(self): ...
+ def __copy__(self): ...
+
+class Accept(ImmutableList):
+ provided = ... # type: Any
+ def __init__(self, values=...): ...
+ def __getitem__(self, key): ...
+ def quality(self, key): ...
+ def __contains__(self, value): ...
+ def index(self, key): ...
+ def find(self, key): ...
+ def values(self): ...
+ def to_header(self): ...
+ def best_match(self, matches, default=None): ...
+ @property
+ def best(self): ...
+
+class MIMEAccept(Accept):
+ @property
+ def accept_html(self): ...
+ @property
+ def accept_xhtml(self): ...
+ @property
+ def accept_json(self): ...
+
+class LanguageAccept(Accept): ...
+class CharsetAccept(Accept): ...
+
+def cache_property(key, empty, type): ...
+
+class _CacheControl(UpdateDictMixin, dict):
+ no_cache = ... # type: Any
+ no_store = ... # type: Any
+ max_age = ... # type: Any
+ no_transform = ... # type: Any
+ on_update = ... # type: Any
+ provided = ... # type: Any
+ def __init__(self, values=..., on_update=None): ...
+ def to_header(self): ...
+
+class RequestCacheControl(ImmutableDictMixin, _CacheControl):
+ max_stale = ... # type: Any
+ min_fresh = ... # type: Any
+ no_transform = ... # type: Any
+ only_if_cached = ... # type: Any
+
+class ResponseCacheControl(_CacheControl):
+ public = ... # type: Any
+ private = ... # type: Any
+ must_revalidate = ... # type: Any
+ proxy_revalidate = ... # type: Any
+ s_maxage = ... # type: Any
+
+class CallbackDict(UpdateDictMixin, dict):
+ on_update = ... # type: Any
+ def __init__(self, initial=None, on_update=None): ...
+
+class HeaderSet(MutableSet):
+ on_update = ... # type: Any
+ def __init__(self, headers=None, on_update=None): ...
+ def add(self, header): ...
+ def remove(self, header): ...
+ def update(self, iterable): ...
+ def discard(self, header): ...
+ def find(self, header): ...
+ def index(self, header): ...
+ def clear(self): ...
+ def as_set(self, preserve_casing=False): ...
+ def to_header(self): ...
+ def __getitem__(self, idx): ...
+ def __delitem__(self, idx): ...
+ def __setitem__(self, idx, value): ...
+ def __contains__(self, header): ...
+ def __len__(self): ...
+ def __iter__(self): ...
+ def __nonzero__(self): ...
+
+class ETags(Container, Iterable):
+ star_tag = ... # type: Any
+ def __init__(self, strong_etags=None, weak_etags=None, star_tag=False): ...
+ def as_set(self, include_weak=False): ...
+ def is_weak(self, etag): ...
+ def contains_weak(self, etag): ...
+ def contains(self, etag): ...
+ def contains_raw(self, etag): ...
+ def to_header(self): ...
+ def __call__(self, etag=None, data=None, include_weak=False): ...
+ def __bool__(self): ...
+ __nonzero__ = ... # type: Any
+ def __iter__(self): ...
+ def __contains__(self, etag): ...
+
+class IfRange:
+ etag = ... # type: Any
+ date = ... # type: Any
+ def __init__(self, etag=None, date=None): ...
+ def to_header(self): ...
+
+class Range:
+ units = ... # type: Any
+ ranges = ... # type: Any
+ def __init__(self, units, ranges): ...
+ def range_for_length(self, length): ...
+ def make_content_range(self, length): ...
+ def to_header(self): ...
+ def to_content_range_header(self, length): ...
+
+class ContentRange:
+ on_update = ... # type: Any
+ def __init__(self, units, start, stop, length=None, on_update=None): ...
+ units = ... # type: Any
+ start = ... # type: Any
+ stop = ... # type: Any
+ length = ... # type: Any
+ def set(self, start, stop, length=None, units=''): ...
+ def unset(self): ...
+ def to_header(self): ...
+ def __nonzero__(self): ...
+ __bool__ = ... # type: Any
+
+class Authorization(ImmutableDictMixin, dict):
+ type = ... # type: Any
+ def __init__(self, auth_type, data=None): ...
+ username = ... # type: Any
+ password = ... # type: Any
+ realm = ... # type: Any
+ nonce = ... # type: Any
+ uri = ... # type: Any
+ nc = ... # type: Any
+ cnonce = ... # type: Any
+ response = ... # type: Any
+ opaque = ... # type: Any
+ @property
+ def qop(self): ...
+
+class WWWAuthenticate(UpdateDictMixin, dict):
+ on_update = ... # type: Any
+ def __init__(self, auth_type=None, values=None, on_update=None): ...
+ def set_basic(self, realm=''): ...
+ def set_digest(self, realm, nonce, qop=..., opaque=None, algorithm=None, stale=False): ...
+ def to_header(self): ...
+ @staticmethod
+ def auth_property(name, doc=None): ...
+ type = ... # type: Any
+ realm = ... # type: Any
+ domain = ... # type: Any
+ nonce = ... # type: Any
+ opaque = ... # type: Any
+ algorithm = ... # type: Any
+ qop = ... # type: Any
+ stale = ... # type: Any
+
+class FileStorage:
+ name = ... # type: Any
+ stream = ... # type: Any
+ filename = ... # type: Any
+ headers = ... # type: Any
+ def __init__(self, stream=None, filename=None, name=None, content_type=None, content_length=None, headers=None): ...
+ @property
+ def content_type(self): ...
+ @property
+ def content_length(self): ...
+ @property
+ def mimetype(self): ...
+ @property
+ def mimetype_params(self): ...
+ def save(self, dst, buffer_size=16384): ...
+ def close(self): ...
+ def __nonzero__(self): ...
+ __bool__ = ... # type: Any
+ def __getattr__(self, name): ...
+ def __iter__(self): ...
diff --git a/typeshed/third_party/2/werkzeug/debug/__init__.pyi b/typeshed/third_party/2/werkzeug/debug/__init__.pyi
new file mode 100644
index 0000000..abe6495
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/debug/__init__.pyi
@@ -0,0 +1,40 @@
+# Stubs for werkzeug.debug (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from werkzeug.wrappers import BaseRequest as Request, BaseResponse as Response
+
+PIN_TIME = ... # type: Any
+
+class _ConsoleFrame:
+ console = ... # type: Any
+ id = ... # type: Any
+ def __init__(self, namespace): ...
+
+def get_pin_and_cookie_name(app): ...
+
+class DebuggedApplication:
+ app = ... # type: Any
+ evalex = ... # type: Any
+ frames = ... # type: Any
+ tracebacks = ... # type: Any
+ request_key = ... # type: Any
+ console_path = ... # type: Any
+ console_init_func = ... # type: Any
+ show_hidden_frames = ... # type: Any
+ secret = ... # type: Any
+ pin_logging = ... # type: Any
+ pin = ... # type: Any
+ def __init__(self, app, evalex=False, request_key='', console_path='', console_init_func=None, show_hidden_frames=False, lodgeit_url=None, pin_security=True, pin_logging=True): ...
+ @property
+ def pin_cookie_name(self): ...
+ def debug_application(self, environ, start_response): ...
+ def execute_command(self, request, command, frame): ...
+ def display_console(self, request): ...
+ def paste_traceback(self, request, traceback): ...
+ def get_resource(self, request, filename): ...
+ def is_trusted(self, environ): ...
+ def pin_auth(self, request): ...
+ def log_pin_request(self): ...
+ def __call__(self, environ, start_response): ...
diff --git a/typeshed/third_party/2/werkzeug/debug/console.pyi b/typeshed/third_party/2/werkzeug/debug/console.pyi
new file mode 100644
index 0000000..ddc1a33
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/debug/console.pyi
@@ -0,0 +1,48 @@
+# Stubs for werkzeug.debug.console (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+import code
+
+class HTMLStringO:
+ def __init__(self): ...
+ def isatty(self): ...
+ def close(self): ...
+ def flush(self): ...
+ def seek(self, n, mode=0): ...
+ def readline(self): ...
+ def reset(self): ...
+ def write(self, x): ...
+ def writelines(self, x): ...
+
+class ThreadedStream:
+ @staticmethod
+ def push(): ...
+ @staticmethod
+ def fetch(): ...
+ @staticmethod
+ def displayhook(obj): ...
+ def __setattr__(self, name, value): ...
+ def __dir__(self): ...
+ def __getattribute__(self, name): ...
+
+class _ConsoleLoader:
+ def __init__(self): ...
+ def register(self, code, source): ...
+ def get_source_by_code(self, code): ...
+
+class _InteractiveConsole(code.InteractiveInterpreter):
+ globals = ... # type: Any
+ more = ... # type: Any
+ buffer = ... # type: Any
+ def __init__(self, globals, locals): ...
+ def runsource(self, source): ...
+ def runcode(self, code): ...
+ def showtraceback(self): ...
+ def showsyntaxerror(self, filename=None): ...
+ def write(self, data): ...
+
+class Console:
+ def __init__(self, globals=None, locals=None): ...
+ def eval(self, code): ...
diff --git a/typeshed/third_party/2/werkzeug/debug/repr.pyi b/typeshed/third_party/2/werkzeug/debug/repr.pyi
new file mode 100644
index 0000000..6889a27
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/debug/repr.pyi
@@ -0,0 +1,37 @@
+# Stubs for werkzeug.debug.repr (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+deque = ... # type: Any
+missing = ... # type: Any
+RegexType = ... # type: Any
+HELP_HTML = ... # type: Any
+OBJECT_DUMP_HTML = ... # type: Any
+
+def debug_repr(obj): ...
+def dump(obj=...): ...
+
+class _Helper:
+ def __call__(self, topic=None): ...
+
+helper = ... # type: Any
+
+class DebugReprGenerator:
+ def __init__(self): ...
+ list_repr = ... # type: Any
+ tuple_repr = ... # type: Any
+ set_repr = ... # type: Any
+ frozenset_repr = ... # type: Any
+ deque_repr = ... # type: Any
+ def regex_repr(self, obj): ...
+ def string_repr(self, obj, limit=70): ...
+ def dict_repr(self, d, recursive, limit=5): ...
+ def object_repr(self, obj): ...
+ def dispatch_repr(self, obj, recursive): ...
+ def fallback_repr(self): ...
+ def repr(self, obj): ...
+ def dump_object(self, obj): ...
+ def dump_locals(self, d): ...
+ def render_object_dump(self, items, title, repr=None): ...
diff --git a/typeshed/third_party/2/werkzeug/debug/tbtools.pyi b/typeshed/third_party/2/werkzeug/debug/tbtools.pyi
new file mode 100644
index 0000000..1279409
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/debug/tbtools.pyi
@@ -0,0 +1,67 @@
+# Stubs for werkzeug.debug.tbtools (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+UTF8_COOKIE = ... # type: Any
+system_exceptions = ... # type: Any
+HEADER = ... # type: Any
+FOOTER = ... # type: Any
+PAGE_HTML = ... # type: Any
+CONSOLE_HTML = ... # type: Any
+SUMMARY_HTML = ... # type: Any
+FRAME_HTML = ... # type: Any
+SOURCE_LINE_HTML = ... # type: Any
+
+def render_console_html(secret, evalex_trusted=True): ...
+def get_current_traceback(ignore_system_exceptions=False, show_hidden_frames=False, skip=0): ...
+
+class Line:
+ lineno = ... # type: Any
+ code = ... # type: Any
+ in_frame = ... # type: Any
+ current = ... # type: Any
+ def __init__(self, lineno, code): ...
+ def classes(self): ...
+ def render(self): ...
+
+class Traceback:
+ exc_type = ... # type: Any
+ exc_value = ... # type: Any
+ exception_type = ... # type: Any
+ frames = ... # type: Any
+ def __init__(self, exc_type, exc_value, tb): ...
+ def filter_hidden_frames(self): ...
+ def is_syntax_error(self): ...
+ def exception(self): ...
+ def log(self, logfile=None): ...
+ def paste(self): ...
+ def render_summary(self, include_title=True): ...
+ def render_full(self, evalex=False, secret=None, evalex_trusted=True): ...
+ def generate_plaintext_traceback(self): ...
+ def plaintext(self): ...
+ id = ... # type: Any
+
+class Frame:
+ lineno = ... # type: Any
+ function_name = ... # type: Any
+ locals = ... # type: Any
+ globals = ... # type: Any
+ filename = ... # type: Any
+ module = ... # type: Any
+ loader = ... # type: Any
+ code = ... # type: Any
+ hide = ... # type: Any
+ info = ... # type: Any
+ def __init__(self, exc_type, exc_value, tb): ...
+ def render(self): ...
+ def render_line_context(self): ...
+ def get_annotated_lines(self): ...
+ def eval(self, code, mode=''): ...
+ def sourcelines(self): ...
+ def get_context_lines(self, context=5): ...
+ @property
+ def current_line(self): ...
+ def console(self): ...
+ id = ... # type: Any
diff --git a/typeshed/third_party/2/werkzeug/exceptions.pyi b/typeshed/third_party/2/werkzeug/exceptions.pyi
new file mode 100644
index 0000000..d520518
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/exceptions.pyi
@@ -0,0 +1,140 @@
+# Stubs for werkzeug.exceptions (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class HTTPException(Exception):
+ code = ... # type: Any
+ description = ... # type: Any
+ response = ... # type: Any
+ def __init__(self, description=None, response=None): ...
+ @classmethod
+ def wrap(cls, exception, name=None): ...
+ @property
+ def name(self): ...
+ def get_description(self, environ=None): ...
+ def get_body(self, environ=None): ...
+ def get_headers(self, environ=None): ...
+ def get_response(self, environ=None): ...
+ def __call__(self, environ, start_response): ...
+
+class BadRequest(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class ClientDisconnected(BadRequest): ...
+class SecurityError(BadRequest): ...
+class BadHost(BadRequest): ...
+
+class Unauthorized(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class Forbidden(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class NotFound(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class MethodNotAllowed(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+ valid_methods = ... # type: Any
+ def __init__(self, valid_methods=None, description=None): ...
+ def get_headers(self, environ): ...
+
+class NotAcceptable(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class RequestTimeout(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class Conflict(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class Gone(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class LengthRequired(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class PreconditionFailed(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class RequestEntityTooLarge(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class RequestURITooLarge(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class UnsupportedMediaType(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class RequestedRangeNotSatisfiable(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class ExpectationFailed(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class ImATeapot(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class UnprocessableEntity(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class PreconditionRequired(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class TooManyRequests(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class RequestHeaderFieldsTooLarge(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class InternalServerError(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class NotImplemented(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class BadGateway(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class ServiceUnavailable(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class GatewayTimeout(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class HTTPVersionNotSupported(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class Aborter:
+ mapping = ... # type: Any
+ def __init__(self, mapping=None, extra=None): ...
+ def __call__(self, code, *args, **kwargs): ...
diff --git a/typeshed/third_party/2/werkzeug/filesystem.pyi b/typeshed/third_party/2/werkzeug/filesystem.pyi
new file mode 100644
index 0000000..9f1b0bb
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/filesystem.pyi
@@ -0,0 +1,11 @@
+# Stubs for werkzeug.filesystem (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+has_likely_buggy_unicode_filesystem = ... # type: Any
+
+class BrokenFilesystemWarning(RuntimeWarning, UnicodeWarning): ...
+
+def get_filesystem_encoding(): ...
diff --git a/typeshed/third_party/2/werkzeug/formparser.pyi b/typeshed/third_party/2/werkzeug/formparser.pyi
new file mode 100644
index 0000000..4b61d27
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/formparser.pyi
@@ -0,0 +1,44 @@
+# Stubs for werkzeug.formparser (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+def default_stream_factory(total_content_length, filename, content_type, content_length=None): ...
+def parse_form_data(environ, stream_factory=None, charset='', errors='', max_form_memory_size=None, max_content_length=None, cls=None, silent=True): ...
+def exhaust_stream(f): ...
+
+class FormDataParser:
+ stream_factory = ... # type: Any
+ charset = ... # type: Any
+ errors = ... # type: Any
+ max_form_memory_size = ... # type: Any
+ max_content_length = ... # type: Any
+ cls = ... # type: Any
+ silent = ... # type: Any
+ def __init__(self, stream_factory=None, charset='', errors='', max_form_memory_size=None, max_content_length=None, cls=None, silent=True): ...
+ def get_parse_func(self, mimetype, options): ...
+ def parse_from_environ(self, environ): ...
+ def parse(self, stream, mimetype, content_length, options=None): ...
+ parse_functions = ... # type: Any
+
+def is_valid_multipart_boundary(boundary): ...
+def parse_multipart_headers(iterable): ...
+
+class MultiPartParser:
+ stream_factory = ... # type: Any
+ charset = ... # type: Any
+ errors = ... # type: Any
+ max_form_memory_size = ... # type: Any
+ cls = ... # type: Any
+ buffer_size = ... # type: Any
+ def __init__(self, stream_factory=None, charset='', errors='', max_form_memory_size=None, cls=None, buffer_size=...): ...
+ def fail(self, message): ...
+ def get_part_encoding(self, headers): ...
+ def get_part_charset(self, headers): ...
+ def start_file_streaming(self, filename, headers, total_content_length): ...
+ def in_memory_threshold_reached(self, bytes): ...
+ def validate_boundary(self, boundary): ...
+ def parse_lines(self, file, boundary, content_length): ...
+ def parse_parts(self, file, boundary, content_length): ...
+ def parse(self, file, boundary, content_length): ...
diff --git a/typeshed/third_party/2/werkzeug/http.pyi b/typeshed/third_party/2/werkzeug/http.pyi
new file mode 100644
index 0000000..1c6e3e8
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/http.pyi
@@ -0,0 +1,41 @@
+# Stubs for werkzeug.http (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from urllib2 import parse_http_list as _parse_list_header
+
+HTTP_STATUS_CODES = ... # type: Any
+
+def wsgi_to_bytes(data): ...
+def bytes_to_wsgi(data): ...
+def quote_header_value(value, extra_chars='', allow_token=True): ...
+def unquote_header_value(value, is_filename=False): ...
+def dump_options_header(header, options): ...
+def dump_header(iterable, allow_token=True): ...
+def parse_list_header(value): ...
+def parse_dict_header(value, cls=...): ...
+def parse_options_header(value, multiple=False): ...
+def parse_accept_header(value, cls=None): ...
+def parse_cache_control_header(value, on_update=None, cls=None): ...
+def parse_set_header(value, on_update=None): ...
+def parse_authorization_header(value): ...
+def parse_www_authenticate_header(value, on_update=None): ...
+def parse_if_range_header(value): ...
+def parse_range_header(value, make_inclusive=True): ...
+def parse_content_range_header(value, on_update=None): ...
+def quote_etag(etag, weak=False): ...
+def unquote_etag(etag): ...
+def parse_etags(value): ...
+def generate_etag(data): ...
+def parse_date(value): ...
+def cookie_date(expires=None): ...
+def http_date(timestamp=None): ...
+def is_resource_modified(environ, etag=None, data=None, last_modified=None): ...
+def remove_entity_headers(headers, allowed=...): ...
+def remove_hop_by_hop_headers(headers): ...
+def is_entity_header(header): ...
+def is_hop_by_hop_header(header): ...
+def parse_cookie(header, charset='', errors='', cls=None): ...
+def dump_cookie(key, value='', max_age=None, expires=None, path='', domain=None, secure=False, httponly=False, charset='', sync_expires=True): ...
+def is_byte_range_valid(start, stop, length): ...
diff --git a/typeshed/third_party/2/werkzeug/local.pyi b/typeshed/third_party/2/werkzeug/local.pyi
new file mode 100644
index 0000000..8b32367
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/local.pyi
@@ -0,0 +1,104 @@
+# Stubs for werkzeug.local (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+def release_local(local): ...
+
+class Local:
+ def __init__(self): ...
+ def __iter__(self): ...
+ def __call__(self, proxy): ...
+ def __release_local__(self): ...
+ def __getattr__(self, name): ...
+ def __setattr__(self, name, value): ...
+ def __delattr__(self, name): ...
+
+class LocalStack:
+ def __init__(self): ...
+ def __release_local__(self): ...
+ def _get__ident_func__(self): ...
+ def _set__ident_func__(self, value): ...
+ __ident_func__ = ... # type: Any
+ def __call__(self): ...
+ def push(self, obj): ...
+ def pop(self): ...
+ @property
+ def top(self): ...
+
+class LocalManager:
+ locals = ... # type: Any
+ ident_func = ... # type: Any
+ def __init__(self, locals=None, ident_func=None): ...
+ def get_ident(self): ...
+ def cleanup(self): ...
+ def make_middleware(self, app): ...
+ def middleware(self, func): ...
+
+class LocalProxy:
+ def __init__(self, local, name=None): ...
+ @property
+ def __dict__(self): ...
+ def __bool__(self): ...
+ def __unicode__(self): ...
+ def __dir__(self): ...
+ def __getattr__(self, name): ...
+ def __setitem__(self, key, value): ...
+ def __delitem__(self, key): ...
+ __getslice__ = ... # type: Any
+ def __setslice__(self, i, j, seq): ...
+ def __delslice__(self, i, j): ...
+ __setattr__ = ... # type: Any
+ __delattr__ = ... # type: Any
+ __lt__ = ... # type: Any
+ __le__ = ... # type: Any
+ __eq__ = ... # type: Any
+ __ne__ = ... # type: Any
+ __gt__ = ... # type: Any
+ __ge__ = ... # type: Any
+ __cmp__ = ... # type: Any
+ __hash__ = ... # type: Any
+ __call__ = ... # type: Any
+ __len__ = ... # type: Any
+ __getitem__ = ... # type: Any
+ __iter__ = ... # type: Any
+ __contains__ = ... # type: Any
+ __add__ = ... # type: Any
+ __sub__ = ... # type: Any
+ __mul__ = ... # type: Any
+ __floordiv__ = ... # type: Any
+ __mod__ = ... # type: Any
+ __divmod__ = ... # type: Any
+ __pow__ = ... # type: Any
+ __lshift__ = ... # type: Any
+ __rshift__ = ... # type: Any
+ __and__ = ... # type: Any
+ __xor__ = ... # type: Any
+ __or__ = ... # type: Any
+ __div__ = ... # type: Any
+ __truediv__ = ... # type: Any
+ __neg__ = ... # type: Any
+ __pos__ = ... # type: Any
+ __abs__ = ... # type: Any
+ __invert__ = ... # type: Any
+ __complex__ = ... # type: Any
+ __int__ = ... # type: Any
+ __long__ = ... # type: Any
+ __float__ = ... # type: Any
+ __oct__ = ... # type: Any
+ __hex__ = ... # type: Any
+ __index__ = ... # type: Any
+ __coerce__ = ... # type: Any
+ __enter__ = ... # type: Any
+ __exit__ = ... # type: Any
+ __radd__ = ... # type: Any
+ __rsub__ = ... # type: Any
+ __rmul__ = ... # type: Any
+ __rdiv__ = ... # type: Any
+ __rtruediv__ = ... # type: Any
+ __rfloordiv__ = ... # type: Any
+ __rmod__ = ... # type: Any
+ __rdivmod__ = ... # type: Any
+ __copy__ = ... # type: Any
+ __deepcopy__ = ... # type: Any
diff --git a/typeshed/third_party/2/werkzeug/posixemulation.pyi b/typeshed/third_party/2/werkzeug/posixemulation.pyi
new file mode 100644
index 0000000..5234999
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/posixemulation.pyi
@@ -0,0 +1,11 @@
+# Stubs for werkzeug.posixemulation (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from ._compat import to_unicode as to_unicode
+from .filesystem import get_filesystem_encoding as get_filesystem_encoding
+
+can_rename_open_file = ... # type: Any
+
+def rename(src, dst): ...
diff --git a/typeshed/third_party/2/werkzeug/routing.pyi b/typeshed/third_party/2/werkzeug/routing.pyi
new file mode 100644
index 0000000..ab94060
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/routing.pyi
@@ -0,0 +1,181 @@
+# Stubs for werkzeug.routing (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from werkzeug.exceptions import HTTPException
+
+def parse_converter_args(argstr): ...
+def parse_rule(rule): ...
+
+class RoutingException(Exception): ...
+
+class RequestRedirect(HTTPException, RoutingException):
+ code = ... # type: Any
+ new_url = ... # type: Any
+ def __init__(self, new_url): ...
+ def get_response(self, environ): ...
+
+class RequestSlash(RoutingException): ...
+
+class RequestAliasRedirect(RoutingException):
+ matched_values = ... # type: Any
+ def __init__(self, matched_values): ...
+
+class BuildError(RoutingException, LookupError):
+ endpoint = ... # type: Any
+ values = ... # type: Any
+ method = ... # type: Any
+ suggested = ... # type: Any
+ def __init__(self, endpoint, values, method, adapter=None): ...
+ def closest_rule(self, adapter): ...
+
+class ValidationError(ValueError): ...
+
+class RuleFactory:
+ def get_rules(self, map): ...
+
+class Subdomain(RuleFactory):
+ subdomain = ... # type: Any
+ rules = ... # type: Any
+ def __init__(self, subdomain, rules): ...
+ def get_rules(self, map): ...
+
+class Submount(RuleFactory):
+ path = ... # type: Any
+ rules = ... # type: Any
+ def __init__(self, path, rules): ...
+ def get_rules(self, map): ...
+
+class EndpointPrefix(RuleFactory):
+ prefix = ... # type: Any
+ rules = ... # type: Any
+ def __init__(self, prefix, rules): ...
+ def get_rules(self, map): ...
+
+class RuleTemplate:
+ rules = ... # type: Any
+ def __init__(self, rules): ...
+ def __call__(self, *args, **kwargs): ...
+
+class RuleTemplateFactory(RuleFactory):
+ rules = ... # type: Any
+ context = ... # type: Any
+ def __init__(self, rules, context): ...
+ def get_rules(self, map): ...
+
+class Rule(RuleFactory):
+ rule = ... # type: Any
+ is_leaf = ... # type: Any
+ map = ... # type: Any
+ strict_slashes = ... # type: Any
+ subdomain = ... # type: Any
+ host = ... # type: Any
+ defaults = ... # type: Any
+ build_only = ... # type: Any
+ alias = ... # type: Any
+ methods = ... # type: Any
+ endpoint = ... # type: Any
+ redirect_to = ... # type: Any
+ arguments = ... # type: Any
+ def __init__(self, string, defaults=None, subdomain=None, methods=None, build_only=False, endpoint=None, strict_slashes=None, redirect_to=None, alias=False, host=None): ...
+ def empty(self): ...
+ def get_empty_kwargs(self): ...
+ def get_rules(self, map): ...
+ def refresh(self): ...
+ def bind(self, map, rebind=False): ...
+ def get_converter(self, variable_name, converter_name, args, kwargs): ...
+ def compile(self): ...
+ def match(self, path): ...
+ def build(self, values, append_unknown=True): ...
+ def provides_defaults_for(self, rule): ...
+ def suitable_for(self, values, method=None): ...
+ def match_compare_key(self): ...
+ def build_compare_key(self): ...
+ def __eq__(self, other): ...
+ def __ne__(self, other): ...
+
+class BaseConverter:
+ regex = ... # type: Any
+ weight = ... # type: Any
+ map = ... # type: Any
+ def __init__(self, map): ...
+ def to_python(self, value): ...
+ def to_url(self, value): ...
+
+class UnicodeConverter(BaseConverter):
+ regex = ... # type: Any
+ def __init__(self, map, minlength=1, maxlength=None, length=None): ...
+
+class AnyConverter(BaseConverter):
+ regex = ... # type: Any
+ def __init__(self, map, *items): ...
+
+class PathConverter(BaseConverter):
+ regex = ... # type: Any
+ weight = ... # type: Any
+
+class NumberConverter(BaseConverter):
+ weight = ... # type: Any
+ fixed_digits = ... # type: Any
+ min = ... # type: Any
+ max = ... # type: Any
+ def __init__(self, map, fixed_digits=0, min=None, max=None): ...
+ def to_python(self, value): ...
+ def to_url(self, value): ...
+
+class IntegerConverter(NumberConverter):
+ regex = ... # type: Any
+ num_convert = ... # type: Any
+
+class FloatConverter(NumberConverter):
+ regex = ... # type: Any
+ num_convert = ... # type: Any
+ def __init__(self, map, min=None, max=None): ...
+
+class UUIDConverter(BaseConverter):
+ regex = ... # type: Any
+ def to_python(self, value): ...
+ def to_url(self, value): ...
+
+DEFAULT_CONVERTERS = ... # type: Any
+
+class Map:
+ default_converters = ... # type: Any
+ default_subdomain = ... # type: Any
+ charset = ... # type: Any
+ encoding_errors = ... # type: Any
+ strict_slashes = ... # type: Any
+ redirect_defaults = ... # type: Any
+ host_matching = ... # type: Any
+ converters = ... # type: Any
+ sort_parameters = ... # type: Any
+ sort_key = ... # type: Any
+ def __init__(self, rules=None, default_subdomain='', charset='', strict_slashes=True, redirect_defaults=True, converters=None, sort_parameters=False, sort_key=None, encoding_errors='', host_matching=False): ...
+ def is_endpoint_expecting(self, endpoint, *arguments): ...
+ def iter_rules(self, endpoint=None): ...
+ def add(self, rulefactory): ...
+ def bind(self, server_name, script_name=None, subdomain=None, url_scheme='', default_method='', path_info=None, query_args=None): ...
+ def bind_to_environ(self, environ, server_name=None, subdomain=None): ...
+ def update(self): ...
+
+class MapAdapter:
+ map = ... # type: Any
+ server_name = ... # type: Any
+ script_name = ... # type: Any
+ subdomain = ... # type: Any
+ url_scheme = ... # type: Any
+ path_info = ... # type: Any
+ default_method = ... # type: Any
+ query_args = ... # type: Any
+ def __init__(self, map, server_name, script_name, subdomain, url_scheme, path_info, default_method, query_args=None): ...
+ def dispatch(self, view_func, path_info=None, method=None, catch_http_exceptions=False): ...
+ def match(self, path_info=None, method=None, return_rule=False, query_args=None): ...
+ def test(self, path_info=None, method=None): ...
+ def allowed_methods(self, path_info=None): ...
+ def get_host(self, domain_part): ...
+ def get_default_redirect(self, rule, method, values, query_args): ...
+ def encode_query_args(self, query_args): ...
+ def make_redirect_url(self, path_info, query_args=None, domain_part=None): ...
+ def make_alias_redirect_url(self, path, endpoint, values, method, query_args): ...
+ def build(self, endpoint, values=None, method=None, force_external=False, append_unknown=True): ...
diff --git a/typeshed/third_party/2/werkzeug/script.pyi b/typeshed/third_party/2/werkzeug/script.pyi
new file mode 100644
index 0000000..e84180e
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/script.pyi
@@ -0,0 +1,16 @@
+# Stubs for werkzeug.script (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+argument_types = ... # type: Any
+converters = ... # type: Any
+
+def run(namespace=None, action_prefix='', args=None): ...
+def fail(message, code=-1): ...
+def find_actions(namespace, action_prefix): ...
+def print_usage(actions): ...
+def analyse_action(func): ...
+def make_shell(init_func=None, banner=None, use_ipython=True): ...
+def make_runserver(app_factory, hostname='', port=5000, use_reloader=False, use_debugger=False, use_evalex=True, threaded=False, processes=1, static_files=None, extra_files=None, ssl_context=None): ...
diff --git a/typeshed/third_party/2/werkzeug/security.pyi b/typeshed/third_party/2/werkzeug/security.pyi
new file mode 100644
index 0000000..c3752c1
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/security.pyi
@@ -0,0 +1,16 @@
+# Stubs for werkzeug.security (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+SALT_CHARS = ... # type: Any
+DEFAULT_PBKDF2_ITERATIONS = ... # type: Any
+
+def pbkdf2_hex(data, salt, iterations=..., keylen=None, hashfunc=None): ...
+def pbkdf2_bin(data, salt, iterations=..., keylen=None, hashfunc=None): ...
+def safe_str_cmp(a, b): ...
+def gen_salt(length): ...
+def generate_password_hash(password, method='', salt_length=8): ...
+def check_password_hash(pwhash, password): ...
+def safe_join(directory, filename): ...
diff --git a/typeshed/third_party/2/werkzeug/serving.pyi b/typeshed/third_party/2/werkzeug/serving.pyi
new file mode 100644
index 0000000..752e3e7
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/serving.pyi
@@ -0,0 +1,83 @@
+# Stubs for werkzeug.serving (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from ._compat import PY2 as PY2
+from SocketServer import ThreadingMixIn, ForkingMixIn
+from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
+
+class _SslDummy:
+ def __getattr__(self, name): ...
+
+ssl = ... # type: Any
+LISTEN_QUEUE = ... # type: Any
+can_open_by_fd = ... # type: Any
+
+class WSGIRequestHandler(BaseHTTPRequestHandler):
+ @property
+ def server_version(self): ...
+ def make_environ(self): ...
+ environ = ... # type: Any
+ close_connection = ... # type: Any
+ def run_wsgi(self): ...
+ def handle(self): ...
+ def initiate_shutdown(self): ...
+ def connection_dropped(self, error, environ=None): ...
+ raw_requestline = ... # type: Any
+ def handle_one_request(self): ...
+ def send_response(self, code, message=None): ...
+ def version_string(self): ...
+ def address_string(self): ...
+ def log_request(self, code='', size=''): ...
+ def log_error(self, *args): ...
+ def log_message(self, format, *args): ...
+ def log(self, type, message, *args): ...
+
+BaseRequestHandler = ... # type: Any
+
+def generate_adhoc_ssl_pair(cn=None): ...
+def make_ssl_devcert(base_path, host=None, cn=None): ...
+def generate_adhoc_ssl_context(): ...
+def load_ssl_context(cert_file, pkey_file=None, protocol=None): ...
+
+class _SSLContext:
+ def __init__(self, protocol): ...
+ def load_cert_chain(self, certfile, keyfile=None, password=None): ...
+ def wrap_socket(self, sock, **kwargs): ...
+
+def is_ssl_error(error=None): ...
+def select_ip_version(host, port): ...
+
+class BaseWSGIServer(HTTPServer):
+ multithread = ... # type: Any
+ multiprocess = ... # type: Any
+ request_queue_size = ... # type: Any
+ address_family = ... # type: Any
+ app = ... # type: Any
+ passthrough_errors = ... # type: Any
+ shutdown_signal = ... # type: Any
+ host = ... # type: Any
+ port = ... # type: Any
+ socket = ... # type: Any
+ server_address = ... # type: Any
+ ssl_context = ... # type: Any
+ def __init__(self, host, port, app, handler=None, passthrough_errors=False, ssl_context=None, fd=None): ...
+ def log(self, type, message, *args): ...
+ def serve_forever(self): ...
+ def handle_error(self, request, client_address): ...
+ def get_request(self): ...
+
+class ThreadedWSGIServer(ThreadingMixIn, BaseWSGIServer):
+ multithread = ... # type: Any
+
+class ForkingWSGIServer(ForkingMixIn, BaseWSGIServer):
+ multiprocess = ... # type: Any
+ max_children = ... # type: Any
+ def __init__(self, host, port, app, processes=40, handler=None, passthrough_errors=False, ssl_context=None, fd=None): ...
+
+def make_server(host=None, port=None, app=None, threaded=False, processes=1, request_handler=None, passthrough_errors=False, ssl_context=None, fd=None): ...
+def is_running_from_reloader(): ...
+def run_simple(hostname, port, application, use_reloader=False, use_debugger=False, use_evalex=True, extra_files=None, reloader_interval=1, reloader_type='', threaded=False, processes=1, request_handler=None, static_files=None, passthrough_errors=False, ssl_context=None): ...
+def run_with_reloader(*args, **kwargs): ...
+def main(): ...
diff --git a/typeshed/third_party/2/werkzeug/test.pyi b/typeshed/third_party/2/werkzeug/test.pyi
new file mode 100644
index 0000000..89315ca
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/test.pyi
@@ -0,0 +1,85 @@
+# Stubs for werkzeug.test (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from urllib2 import Request as U2Request
+from cookielib import CookieJar
+
+def stream_encode_multipart(values, use_tempfile=True, threshold=..., boundary=None, charset=''): ...
+def encode_multipart(values, boundary=None, charset=''): ...
+def File(fd, filename=None, mimetype=None): ...
+
+class _TestCookieHeaders:
+ headers = ... # type: Any
+ def __init__(self, headers): ...
+ def getheaders(self, name): ...
+ def get_all(self, name, default=None): ...
+
+class _TestCookieResponse:
+ headers = ... # type: Any
+ def __init__(self, headers): ...
+ def info(self): ...
+
+class _TestCookieJar(CookieJar):
+ def inject_wsgi(self, environ): ...
+ def extract_wsgi(self, environ, headers): ...
+
+class EnvironBuilder:
+ server_protocol = ... # type: Any
+ wsgi_version = ... # type: Any
+ request_class = ... # type: Any
+ charset = ... # type: Any
+ path = ... # type: Any
+ base_url = ... # type: Any
+ query_string = ... # type: Any
+ args = ... # type: Any
+ method = ... # type: Any
+ headers = ... # type: Any
+ content_type = ... # type: Any
+ errors_stream = ... # type: Any
+ multithread = ... # type: Any
+ multiprocess = ... # type: Any
+ run_once = ... # type: Any
+ environ_base = ... # type: Any
+ environ_overrides = ... # type: Any
+ input_stream = ... # type: Any
+ content_length = ... # type: Any
+ closed = ... # type: Any
+ def __init__(self, path='', base_url=None, query_string=None, method='', input_stream=None, content_type=None, content_length=None, errors_stream=None, multithread=False, multiprocess=False, run_once=False, headers=None, data=None, environ_base=None, environ_overrides=None, charset=''): ...
+ def form_property(name, storage, doc): ...
+ form = ... # type: Any
+ files = ... # type: Any
+ @property
+ def server_name(self): ...
+ @property
+ def server_port(self): ...
+ def __del__(self): ...
+ def close(self): ...
+ def get_environ(self): ...
+ def get_request(self, cls=None): ...
+
+class ClientRedirectError(Exception): ...
+
+class Client:
+ application = ... # type: Any
+ response_wrapper = ... # type: Any
+ cookie_jar = ... # type: Any
+ allow_subdomain_redirects = ... # type: Any
+ def __init__(self, application, response_wrapper=None, use_cookies=True, allow_subdomain_redirects=False): ...
+ def set_cookie(self, server_name, key, value='', max_age=None, expires=None, path='', domain=None, secure=None, httponly=False, charset=''): ...
+ def delete_cookie(self, server_name, key, path='', domain=None): ...
+ def run_wsgi_app(self, environ, buffered=False): ...
+ def resolve_redirect(self, response, new_location, environ, buffered=False): ...
+ def open(self, *args, **kwargs): ...
+ def get(self, *args, **kw): ...
+ def patch(self, *args, **kw): ...
+ def post(self, *args, **kw): ...
+ def head(self, *args, **kw): ...
+ def put(self, *args, **kw): ...
+ def delete(self, *args, **kw): ...
+ def options(self, *args, **kw): ...
+ def trace(self, *args, **kw): ...
+
+def create_environ(*args, **kwargs): ...
+def run_wsgi_app(app, environ, buffered=False): ...
diff --git a/typeshed/third_party/2/werkzeug/testapp.pyi b/typeshed/third_party/2/werkzeug/testapp.pyi
new file mode 100644
index 0000000..3a85843
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/testapp.pyi
@@ -0,0 +1,13 @@
+# Stubs for werkzeug.testapp (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from werkzeug.wrappers import BaseRequest as Request, BaseResponse as Response
+
+logo = ... # type: Any
+TEMPLATE = ... # type: Any
+
+def iter_sys_path(): ...
+def render_testapp(req): ...
+def test_app(environ, start_response): ...
diff --git a/typeshed/third_party/2/werkzeug/urls.pyi b/typeshed/third_party/2/werkzeug/urls.pyi
new file mode 100644
index 0000000..5f55e12
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/urls.pyi
@@ -0,0 +1,69 @@
+# Stubs for werkzeug.urls (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from collections import namedtuple
+from typing import Any
+
+_URLTuple = namedtuple(
+ '_URLTuple',
+ ['scheme', 'netloc', 'path', 'query', 'fragment']
+)
+
+class BaseURL(_URLTuple):
+ def replace(self, **kwargs): ...
+ @property
+ def host(self): ...
+ @property
+ def ascii_host(self): ...
+ @property
+ def port(self): ...
+ @property
+ def auth(self): ...
+ @property
+ def username(self): ...
+ @property
+ def raw_username(self): ...
+ @property
+ def password(self): ...
+ @property
+ def raw_password(self): ...
+ def decode_query(self, *args, **kwargs): ...
+ def join(self, *args, **kwargs): ...
+ def to_url(self): ...
+ def decode_netloc(self): ...
+ def to_uri_tuple(self): ...
+ def to_iri_tuple(self): ...
+ def get_file_location(self, pathformat=None): ...
+
+class URL(BaseURL):
+ def encode_netloc(self): ...
+ def encode(self, charset='', errors=''): ...
+
+class BytesURL(BaseURL):
+ def encode_netloc(self): ...
+ def decode(self, charset='', errors=''): ...
+
+def url_parse(url, scheme=None, allow_fragments=True): ...
+def url_quote(string, charset='', errors='', safe='', unsafe=''): ...
+def url_quote_plus(string, charset='', errors='', safe=''): ...
+def url_unparse(components): ...
+def url_unquote(string, charset='', errors='', unsafe=''): ...
+def url_unquote_plus(s, charset='', errors=''): ...
+def url_fix(s, charset=''): ...
+def uri_to_iri(uri, charset='', errors=''): ...
+def iri_to_uri(iri, charset='', errors='', safe_conversion=False): ...
+def url_decode(s, charset='', decode_keys=False, include_empty=True, errors='', separator='', cls=None): ...
+def url_decode_stream(stream, charset='', decode_keys=False, include_empty=True, errors='', separator='', cls=None, limit=None, return_iterator=False): ...
+def url_encode(obj, charset='', encode_keys=False, sort=False, key=None, separator=''): ...
+def url_encode_stream(obj, stream=None, charset='', encode_keys=False, sort=False, key=None, separator=''): ...
+def url_join(base, url, allow_fragments=True): ...
+
+class Href:
+ base = ... # type: Any
+ charset = ... # type: Any
+ sort = ... # type: Any
+ key = ... # type: Any
+ def __init__(self, base='', charset='', sort=False, key=None): ...
+ def __getattr__(self, name): ...
+ def __call__(self, *path, **query): ...
diff --git a/typeshed/third_party/2/werkzeug/useragents.pyi b/typeshed/third_party/2/werkzeug/useragents.pyi
new file mode 100644
index 0000000..96b262a
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/useragents.pyi
@@ -0,0 +1,18 @@
+# Stubs for werkzeug.useragents (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class UserAgentParser:
+ platforms = ... # type: Any
+ browsers = ... # type: Any
+ def __init__(self): ...
+ def __call__(self, user_agent): ...
+
+class UserAgent:
+ string = ... # type: Any
+ def __init__(self, environ_or_string): ...
+ def to_header(self): ...
+ def __nonzero__(self): ...
+ __bool__ = ... # type: Any
diff --git a/typeshed/third_party/2/werkzeug/utils.pyi b/typeshed/third_party/2/werkzeug/utils.pyi
new file mode 100644
index 0000000..ff7fd39
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/utils.pyi
@@ -0,0 +1,53 @@
+# Stubs for werkzeug.utils (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from werkzeug._internal import _DictAccessorProperty
+
+class cached_property(property):
+ __name__ = ... # type: Any
+ __module__ = ... # type: Any
+ __doc__ = ... # type: Any
+ func = ... # type: Any
+ def __init__(self, func, name=None, doc=None): ...
+ def __set__(self, obj, value): ...
+ def __get__(self, obj, type=None): ...
+
+class environ_property(_DictAccessorProperty):
+ read_only = ... # type: Any
+ def lookup(self, obj): ...
+
+class header_property(_DictAccessorProperty):
+ def lookup(self, obj): ...
+
+class HTMLBuilder:
+ def __init__(self, dialect): ...
+ def __call__(self, s): ...
+ def __getattr__(self, tag): ...
+
+html = ... # type: Any
+xhtml = ... # type: Any
+
+def get_content_type(mimetype, charset): ...
+def format_string(string, context): ...
+def secure_filename(filename): ...
+def escape(s, quote=None): ...
+def unescape(s): ...
+def redirect(location, code=302, Response=None): ...
+def append_slash_redirect(environ, code=301): ...
+def import_string(import_name, silent=False): ...
+def find_modules(import_path, include_packages=False, recursive=False): ...
+def validate_arguments(func, args, kwargs, drop_extra=True): ...
+def bind_arguments(func, args, kwargs): ...
+
+class ArgumentValidationError(ValueError):
+ missing = ... # type: Any
+ extra = ... # type: Any
+ extra_positional = ... # type: Any
+ def __init__(self, missing=None, extra=None, extra_positional=None): ...
+
+class ImportStringError(ImportError):
+ import_name = ... # type: Any
+ exception = ... # type: Any
+ def __init__(self, import_name, exception): ...
diff --git a/typeshed/third_party/2/werkzeug/wrappers.pyi b/typeshed/third_party/2/werkzeug/wrappers.pyi
new file mode 100644
index 0000000..7924bcb
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/wrappers.pyi
@@ -0,0 +1,194 @@
+# Stubs for werkzeug.wrappers (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class BaseRequest:
+ charset = ... # type: Any
+ encoding_errors = ... # type: Any
+ max_content_length = ... # type: Any
+ max_form_memory_size = ... # type: Any
+ parameter_storage_class = ... # type: Any
+ list_storage_class = ... # type: Any
+ dict_storage_class = ... # type: Any
+ form_data_parser_class = ... # type: Any
+ trusted_hosts = ... # type: Any
+ disable_data_descriptor = ... # type: Any
+ environ = ... # type: Any
+ shallow = ... # type: Any
+ def __init__(self, environ, populate_request=True, shallow=False): ...
+ @property
+ def url_charset(self): ...
+ @classmethod
+ def from_values(cls, *args, **kwargs): ...
+ @classmethod
+ def application(cls, f): ...
+ @property
+ def want_form_data_parsed(self): ...
+ def make_form_data_parser(self): ...
+ def close(self): ...
+ def __enter__(self): ...
+ def __exit__(self, exc_type, exc_value, tb): ...
+ def stream(self): ...
+ input_stream = ... # type: Any
+ def args(self): ...
+ def data(self): ...
+ def get_data(self, cache=True, as_text=False, parse_form_data=False): ...
+ def form(self): ...
+ def values(self): ...
+ def files(self): ...
+ def cookies(self): ...
+ def headers(self): ...
+ def path(self): ...
+ def full_path(self): ...
+ def script_root(self): ...
+ def url(self): ...
+ def base_url(self): ...
+ def url_root(self): ...
+ def host_url(self): ...
+ def host(self): ...
+ query_string = ... # type: Any
+ method = ... # type: Any
+ def access_route(self): ...
+ @property
+ def remote_addr(self): ...
+ remote_user = ... # type: Any
+ scheme = ... # type: Any
+ is_xhr = ... # type: Any
+ is_secure = ... # type: Any
+ is_multithread = ... # type: Any
+ is_multiprocess = ... # type: Any
+ is_run_once = ... # type: Any
+
+class BaseResponse:
+ charset = ... # type: Any
+ default_status = ... # type: Any
+ default_mimetype = ... # type: Any
+ implicit_sequence_conversion = ... # type: Any
+ autocorrect_location_header = ... # type: Any
+ automatically_set_content_length = ... # type: Any
+ headers = ... # type: Any
+ status_code = ... # type: Any
+ status = ... # type: Any
+ direct_passthrough = ... # type: Any
+ response = ... # type: Any
+ def __init__(self, response=None, status=None, headers=None, mimetype=None, content_type=None, direct_passthrough=False): ...
+ def call_on_close(self, func): ...
+ @classmethod
+ def force_type(cls, response, environ=None): ...
+ @classmethod
+ def from_app(cls, app, environ, buffered=False): ...
+ def get_data(self, as_text=False): ...
+ def set_data(self, value): ...
+ data = ... # type: Any
+ def calculate_content_length(self): ...
+ def make_sequence(self): ...
+ def iter_encoded(self): ...
+ def set_cookie(self, key, value='', max_age=None, expires=None, path='', domain=None, secure=False, httponly=False): ...
+ def delete_cookie(self, key, path='', domain=None): ...
+ @property
+ def is_streamed(self): ...
+ @property
+ def is_sequence(self): ...
+ def close(self): ...
+ def __enter__(self): ...
+ def __exit__(self, exc_type, exc_value, tb): ...
+ def freeze(self): ...
+ def get_wsgi_headers(self, environ): ...
+ def get_app_iter(self, environ): ...
+ def get_wsgi_response(self, environ): ...
+ def __call__(self, environ, start_response): ...
+
+class AcceptMixin:
+ def accept_mimetypes(self): ...
+ def accept_charsets(self): ...
+ def accept_encodings(self): ...
+ def accept_languages(self): ...
+
+class ETagRequestMixin:
+ def cache_control(self): ...
+ def if_match(self): ...
+ def if_none_match(self): ...
+ def if_modified_since(self): ...
+ def if_unmodified_since(self): ...
+ def if_range(self): ...
+ def range(self): ...
+
+class UserAgentMixin:
+ def user_agent(self): ...
+
+class AuthorizationMixin:
+ def authorization(self): ...
+
+class StreamOnlyMixin:
+ disable_data_descriptor = ... # type: Any
+ want_form_data_parsed = ... # type: Any
+
+class ETagResponseMixin:
+ @property
+ def cache_control(self): ...
+ status_code = ... # type: Any
+ def make_conditional(self, request_or_environ, accept_ranges=False, complete_length=None): ...
+ def add_etag(self, overwrite=False, weak=False): ...
+ def set_etag(self, etag, weak=False): ...
+ def get_etag(self): ...
+ def freeze(self, no_etag=False): ...
+ accept_ranges = ... # type: Any
+ content_range = ... # type: Any
+
+class ResponseStream:
+ mode = ... # type: Any
+ response = ... # type: Any
+ closed = ... # type: Any
+ def __init__(self, response): ...
+ def write(self, value): ...
+ def writelines(self, seq): ...
+ def close(self): ...
+ def flush(self): ...
+ def isatty(self): ...
+ @property
+ def encoding(self): ...
+
+class ResponseStreamMixin:
+ def stream(self): ...
+
+class CommonRequestDescriptorsMixin:
+ content_type = ... # type: Any
+ def content_length(self): ...
+ content_encoding = ... # type: Any
+ content_md5 = ... # type: Any
+ referrer = ... # type: Any
+ date = ... # type: Any
+ max_forwards = ... # type: Any
+ @property
+ def mimetype(self): ...
+ @property
+ def mimetype_params(self): ...
+ def pragma(self): ...
+
+class CommonResponseDescriptorsMixin:
+ mimetype = ... # type: Any
+ mimetype_params = ... # type: Any
+ location = ... # type: Any
+ age = ... # type: Any
+ content_type = ... # type: Any
+ content_length = ... # type: Any
+ content_location = ... # type: Any
+ content_encoding = ... # type: Any
+ content_md5 = ... # type: Any
+ date = ... # type: Any
+ expires = ... # type: Any
+ last_modified = ... # type: Any
+ retry_after = ... # type: Any
+ vary = ... # type: Any
+ content_language = ... # type: Any
+ allow = ... # type: Any
+
+class WWWAuthenticateMixin:
+ @property
+ def www_authenticate(self): ...
+
+class Request(BaseRequest, AcceptMixin, ETagRequestMixin, UserAgentMixin, AuthorizationMixin, CommonRequestDescriptorsMixin): ...
+class PlainRequest(StreamOnlyMixin, Request): ...
+class Response(ETagResponseMixin, BaseResponse, ResponseStreamMixin, CommonResponseDescriptorsMixin, WWWAuthenticateMixin): ... # FIXME: This is invalid but works around https://github.com/pallets/werkzeug/issues/1052
diff --git a/typeshed/third_party/2/werkzeug/wsgi.pyi b/typeshed/third_party/2/werkzeug/wsgi.pyi
new file mode 100644
index 0000000..9c4d005
--- /dev/null
+++ b/typeshed/third_party/2/werkzeug/wsgi.pyi
@@ -0,0 +1,88 @@
+# Stubs for werkzeug.wsgi (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+def responder(f): ...
+def get_current_url(environ, root_only=False, strip_querystring=False, host_only=False, trusted_hosts=None): ...
+def host_is_trusted(hostname, trusted_list): ...
+def get_host(environ, trusted_hosts=None): ...
+def get_content_length(environ): ...
+def get_input_stream(environ, safe_fallback=True): ...
+def get_query_string(environ): ...
+def get_path_info(environ, charset='', errors=''): ...
+def get_script_name(environ, charset='', errors=''): ...
+def pop_path_info(environ, charset='', errors=''): ...
+def peek_path_info(environ, charset='', errors=''): ...
+def extract_path_info(environ_or_baseurl, path_or_url, charset='', errors='', collapse_http_schemes=True): ...
+
+class SharedDataMiddleware:
+ app = ... # type: Any
+ exports = ... # type: Any
+ cache = ... # type: Any
+ cache_timeout = ... # type: Any
+ fallback_mimetype = ... # type: Any
+ def __init__(self, app, exports, disallow=None, cache=True, cache_timeout=..., fallback_mimetype=''): ...
+ def is_allowed(self, filename): ...
+ def get_file_loader(self, filename): ...
+ def get_package_loader(self, package, package_path): ...
+ def get_directory_loader(self, directory): ...
+ def generate_etag(self, mtime, file_size, real_filename): ...
+ def __call__(self, environ, start_response): ...
+
+class DispatcherMiddleware:
+ app = ... # type: Any
+ mounts = ... # type: Any
+ def __init__(self, app, mounts=None): ...
+ def __call__(self, environ, start_response): ...
+
+class ClosingIterator:
+ def __init__(self, iterable, callbacks=None): ...
+ def __iter__(self): ...
+ def __next__(self): ...
+ def close(self): ...
+
+def wrap_file(environ, file, buffer_size=8192): ...
+
+class FileWrapper:
+ file = ... # type: Any
+ buffer_size = ... # type: Any
+ def __init__(self, file, buffer_size=8192): ...
+ def close(self): ...
+ def seekable(self): ...
+ def seek(self, *args): ...
+ def tell(self): ...
+ def __iter__(self): ...
+ def __next__(self): ...
+
+class _RangeWrapper:
+ iterable = ... # type: Any
+ byte_range = ... # type: Any
+ start_byte = ... # type: Any
+ end_byte = ... # type: Any
+ read_length = ... # type: Any
+ seekable = ... # type: Any
+ end_reached = ... # type: Any
+ def __init__(self, iterable, start_byte=0, byte_range=None): ...
+ def __iter__(self): ...
+ def __next__(self): ...
+ def close(self): ...
+
+def make_line_iter(stream, limit=None, buffer_size=..., cap_at_buffer=False): ...
+def make_chunk_iter(stream, separator, limit=None, buffer_size=..., cap_at_buffer=False): ...
+
+class LimitedStream:
+ limit = ... # type: Any
+ def __init__(self, stream, limit): ...
+ def __iter__(self): ...
+ @property
+ def is_exhausted(self): ...
+ def on_exhausted(self): ...
+ def on_disconnect(self): ...
+ def exhaust(self, chunk_size=...): ...
+ def read(self, size=None): ...
+ def readline(self, size=None): ...
+ def readlines(self, size=None): ...
+ def tell(self): ...
+ def __next__(self): ...
diff --git a/typeshed/third_party/2/yaml/__init__.pyi b/typeshed/third_party/2/yaml/__init__.pyi
new file mode 100644
index 0000000..6efac20
--- /dev/null
+++ b/typeshed/third_party/2/yaml/__init__.pyi
@@ -0,0 +1,51 @@
+# Stubs for yaml (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+# from yaml.error import *
+# from yaml.tokens import *
+# from yaml.events import *
+# from yaml.nodes import *
+# from yaml.loader import *
+# from yaml.dumper import *
+# TODO: stubs for cyaml?
+# from cyaml import *
+
+__with_libyaml__ = ... # type: Any
+
+def scan(stream, Loader=...): ...
+def parse(stream, Loader=...): ...
+def compose(stream, Loader=...): ...
+def compose_all(stream, Loader=...): ...
+def load(stream, Loader=...): ...
+def load_all(stream, Loader=...): ...
+def safe_load(stream): ...
+def safe_load_all(stream): ...
+def emit(events, stream=..., Dumper=..., canonical=..., indent=..., width=..., allow_unicode=..., line_break=...): ...
+def serialize_all(nodes, stream=..., Dumper=..., canonical=..., indent=..., width=..., allow_unicode=..., line_break=..., encoding=..., explicit_start=..., explicit_end=..., version=..., tags=...): ...
+def serialize(node, stream=..., Dumper=..., **kwds): ...
+def dump_all(documents, stream=..., Dumper=..., default_style=..., default_flow_style=..., canonical=..., indent=..., width=..., allow_unicode=..., line_break=..., encoding=..., explicit_start=..., explicit_end=..., version=..., tags=...): ...
+def dump(data, stream=..., Dumper=..., **kwds): ...
+def safe_dump_all(documents, stream=..., **kwds): ...
+def safe_dump(data, stream=..., **kwds): ...
+def add_implicit_resolver(tag, regexp, first=..., Loader=..., Dumper=...): ...
+def add_path_resolver(tag, path, kind=..., Loader=..., Dumper=...): ...
+def add_constructor(tag, constructor, Loader=...): ...
+def add_multi_constructor(tag_prefix, multi_constructor, Loader=...): ...
+def add_representer(data_type, representer, Dumper=...): ...
+def add_multi_representer(data_type, multi_representer, Dumper=...): ...
+
+class YAMLObjectMetaclass(type):
+ def __init__(cls, name, bases, kwds) -> None: ...
+
+class YAMLObject:
+ __metaclass__ = ... # type: Any
+ yaml_loader = ... # type: Any
+ yaml_dumper = ... # type: Any
+ yaml_tag = ... # type: Any
+ yaml_flow_style = ... # type: Any
+ @classmethod
+ def from_yaml(cls, loader, node): ...
+ @classmethod
+ def to_yaml(cls, dumper, data): ...
diff --git a/typeshed/third_party/2/yaml/composer.pyi b/typeshed/third_party/2/yaml/composer.pyi
new file mode 100644
index 0000000..f5f7e61
--- /dev/null
+++ b/typeshed/third_party/2/yaml/composer.pyi
@@ -0,0 +1,21 @@
+# Stubs for yaml.composer (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from yaml.error import Mark, YAMLError, MarkedYAMLError
+from yaml.nodes import Node, ScalarNode, CollectionNode, SequenceNode, MappingNode
+
+class ComposerError(MarkedYAMLError): ...
+
+class Composer:
+ anchors = ... # type: Any
+ def __init__(self) -> None: ...
+ def check_node(self): ...
+ def get_node(self): ...
+ def get_single_node(self): ...
+ def compose_document(self): ...
+ def compose_node(self, parent, index): ...
+ def compose_scalar_node(self, anchor): ...
+ def compose_sequence_node(self, anchor): ...
+ def compose_mapping_node(self, anchor): ...
diff --git a/typeshed/third_party/2/yaml/constructor.pyi b/typeshed/third_party/2/yaml/constructor.pyi
new file mode 100644
index 0000000..36b7124
--- /dev/null
+++ b/typeshed/third_party/2/yaml/constructor.pyi
@@ -0,0 +1,70 @@
+# Stubs for yaml.constructor (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from yaml.error import Mark, YAMLError, MarkedYAMLError
+from yaml.nodes import Node, ScalarNode, CollectionNode, SequenceNode, MappingNode
+
+from typing import Any
+
+class ConstructorError(MarkedYAMLError): ...
+
+class BaseConstructor:
+ yaml_constructors = ... # type: Any
+ yaml_multi_constructors = ... # type: Any
+ constructed_objects = ... # type: Any
+ recursive_objects = ... # type: Any
+ state_generators = ... # type: Any
+ deep_construct = ... # type: Any
+ def __init__(self) -> None: ...
+ def check_data(self): ...
+ def get_data(self): ...
+ def get_single_data(self): ...
+ def construct_document(self, node): ...
+ def construct_object(self, node, deep=...): ...
+ def construct_scalar(self, node): ...
+ def construct_sequence(self, node, deep=...): ...
+ def construct_mapping(self, node, deep=...): ...
+ def construct_pairs(self, node, deep=...): ...
+ def add_constructor(cls, tag, constructor): ...
+ def add_multi_constructor(cls, tag_prefix, multi_constructor): ...
+
+class SafeConstructor(BaseConstructor):
+ def construct_scalar(self, node): ...
+ def flatten_mapping(self, node): ...
+ def construct_mapping(self, node, deep=...): ...
+ def construct_yaml_null(self, node): ...
+ bool_values = ... # type: Any
+ def construct_yaml_bool(self, node): ...
+ def construct_yaml_int(self, node): ...
+ inf_value = ... # type: Any
+ nan_value = ... # type: Any
+ def construct_yaml_float(self, node): ...
+ def construct_yaml_binary(self, node): ...
+ timestamp_regexp = ... # type: Any
+ def construct_yaml_timestamp(self, node): ...
+ def construct_yaml_omap(self, node): ...
+ def construct_yaml_pairs(self, node): ...
+ def construct_yaml_set(self, node): ...
+ def construct_yaml_str(self, node): ...
+ def construct_yaml_seq(self, node): ...
+ def construct_yaml_map(self, node): ...
+ def construct_yaml_object(self, node, cls): ...
+ def construct_undefined(self, node): ...
+
+class Constructor(SafeConstructor):
+ def construct_python_str(self, node): ...
+ def construct_python_unicode(self, node): ...
+ def construct_python_long(self, node): ...
+ def construct_python_complex(self, node): ...
+ def construct_python_tuple(self, node): ...
+ def find_python_module(self, name, mark): ...
+ def find_python_name(self, name, mark): ...
+ def construct_python_name(self, suffix, node): ...
+ def construct_python_module(self, suffix, node): ...
+ class classobj: ...
+ def make_python_instance(self, suffix, node, args=..., kwds=..., newobj=...): ...
+ def set_python_instance_state(self, instance, state): ...
+ def construct_python_object(self, suffix, node): ...
+ def construct_python_object_apply(self, suffix, node, newobj=...): ...
+ def construct_python_object_new(self, suffix, node): ...
diff --git a/typeshed/third_party/2/yaml/dumper.pyi b/typeshed/third_party/2/yaml/dumper.pyi
new file mode 100644
index 0000000..85b75fb
--- /dev/null
+++ b/typeshed/third_party/2/yaml/dumper.pyi
@@ -0,0 +1,17 @@
+# Stubs for yaml.dumper (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from yaml.emitter import Emitter
+from yaml.serializer import Serializer
+from yaml.representer import BaseRepresenter, Representer, SafeRepresenter
+from yaml.resolver import BaseResolver, Resolver
+
+class BaseDumper(Emitter, Serializer, BaseRepresenter, BaseResolver):
+ def __init__(self, stream, default_style=..., default_flow_style=..., canonical=..., indent=..., width=..., allow_unicode=..., line_break=..., encoding=..., explicit_start=..., explicit_end=..., version=..., tags=...) -> None: ...
+
+class SafeDumper(Emitter, Serializer, SafeRepresenter, Resolver):
+ def __init__(self, stream, default_style=..., default_flow_style=..., canonical=..., indent=..., width=..., allow_unicode=..., line_break=..., encoding=..., explicit_start=..., explicit_end=..., version=..., tags=...) -> None: ...
+
+class Dumper(Emitter, Serializer, Representer, Resolver):
+ def __init__(self, stream, default_style=..., default_flow_style=..., canonical=..., indent=..., width=..., allow_unicode=..., line_break=..., encoding=..., explicit_start=..., explicit_end=..., version=..., tags=...) -> None: ...
diff --git a/typeshed/third_party/2/yaml/emitter.pyi b/typeshed/third_party/2/yaml/emitter.pyi
new file mode 100644
index 0000000..99e72ac
--- /dev/null
+++ b/typeshed/third_party/2/yaml/emitter.pyi
@@ -0,0 +1,110 @@
+# Stubs for yaml.emitter (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from yaml.error import YAMLError
+
+class EmitterError(YAMLError): ...
+
+class ScalarAnalysis:
+ scalar = ... # type: Any
+ empty = ... # type: Any
+ multiline = ... # type: Any
+ allow_flow_plain = ... # type: Any
+ allow_block_plain = ... # type: Any
+ allow_single_quoted = ... # type: Any
+ allow_double_quoted = ... # type: Any
+ allow_block = ... # type: Any
+ def __init__(self, scalar, empty, multiline, allow_flow_plain, allow_block_plain, allow_single_quoted, allow_double_quoted, allow_block) -> None: ...
+
+class Emitter:
+ DEFAULT_TAG_PREFIXES = ... # type: Any
+ stream = ... # type: Any
+ encoding = ... # type: Any
+ states = ... # type: Any
+ state = ... # type: Any
+ events = ... # type: Any
+ event = ... # type: Any
+ indents = ... # type: Any
+ indent = ... # type: Any
+ flow_level = ... # type: Any
+ root_context = ... # type: Any
+ sequence_context = ... # type: Any
+ mapping_context = ... # type: Any
+ simple_key_context = ... # type: Any
+ line = ... # type: Any
+ column = ... # type: Any
+ whitespace = ... # type: Any
+ indention = ... # type: Any
+ open_ended = ... # type: Any
+ canonical = ... # type: Any
+ allow_unicode = ... # type: Any
+ best_indent = ... # type: Any
+ best_width = ... # type: Any
+ best_line_break = ... # type: Any
+ tag_prefixes = ... # type: Any
+ prepared_anchor = ... # type: Any
+ prepared_tag = ... # type: Any
+ analysis = ... # type: Any
+ style = ... # type: Any
+ def __init__(self, stream, canonical=..., indent=..., width=..., allow_unicode=..., line_break=...) -> None: ...
+ def dispose(self): ...
+ def emit(self, event): ...
+ def need_more_events(self): ...
+ def need_events(self, count): ...
+ def increase_indent(self, flow=..., indentless=...): ...
+ def expect_stream_start(self): ...
+ def expect_nothing(self): ...
+ def expect_first_document_start(self): ...
+ def expect_document_start(self, first=...): ...
+ def expect_document_end(self): ...
+ def expect_document_root(self): ...
+ def expect_node(self, root=..., sequence=..., mapping=..., simple_key=...): ...
+ def expect_alias(self): ...
+ def expect_scalar(self): ...
+ def expect_flow_sequence(self): ...
+ def expect_first_flow_sequence_item(self): ...
+ def expect_flow_sequence_item(self): ...
+ def expect_flow_mapping(self): ...
+ def expect_first_flow_mapping_key(self): ...
+ def expect_flow_mapping_key(self): ...
+ def expect_flow_mapping_simple_value(self): ...
+ def expect_flow_mapping_value(self): ...
+ def expect_block_sequence(self): ...
+ def expect_first_block_sequence_item(self): ...
+ def expect_block_sequence_item(self, first=...): ...
+ def expect_block_mapping(self): ...
+ def expect_first_block_mapping_key(self): ...
+ def expect_block_mapping_key(self, first=...): ...
+ def expect_block_mapping_simple_value(self): ...
+ def expect_block_mapping_value(self): ...
+ def check_empty_sequence(self): ...
+ def check_empty_mapping(self): ...
+ def check_empty_document(self): ...
+ def check_simple_key(self): ...
+ def process_anchor(self, indicator): ...
+ def process_tag(self): ...
+ def choose_scalar_style(self): ...
+ def process_scalar(self): ...
+ def prepare_version(self, version): ...
+ def prepare_tag_handle(self, handle): ...
+ def prepare_tag_prefix(self, prefix): ...
+ def prepare_tag(self, tag): ...
+ def prepare_anchor(self, anchor): ...
+ def analyze_scalar(self, scalar): ...
+ def flush_stream(self): ...
+ def write_stream_start(self): ...
+ def write_stream_end(self): ...
+ def write_indicator(self, indicator, need_whitespace, whitespace=..., indention=...): ...
+ def write_indent(self): ...
+ def write_line_break(self, data=...): ...
+ def write_version_directive(self, version_text): ...
+ def write_tag_directive(self, handle_text, prefix_text): ...
+ def write_single_quoted(self, text, split=...): ...
+ ESCAPE_REPLACEMENTS = ... # type: Any
+ def write_double_quoted(self, text, split=...): ...
+ def determine_block_hints(self, text): ...
+ def write_folded(self, text): ...
+ def write_literal(self, text): ...
+ def write_plain(self, text, split=...): ...
diff --git a/typeshed/third_party/2/yaml/error.pyi b/typeshed/third_party/2/yaml/error.pyi
new file mode 100644
index 0000000..247e25d
--- /dev/null
+++ b/typeshed/third_party/2/yaml/error.pyi
@@ -0,0 +1,25 @@
+# Stubs for yaml.error (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class Mark:
+ name = ... # type: Any
+ index = ... # type: Any
+ line = ... # type: Any
+ column = ... # type: Any
+ buffer = ... # type: Any
+ pointer = ... # type: Any
+ def __init__(self, name, index, line, column, buffer, pointer) -> None: ...
+ def get_snippet(self, indent=..., max_length=...): ...
+
+class YAMLError(Exception): ...
+
+class MarkedYAMLError(YAMLError):
+ context = ... # type: Any
+ context_mark = ... # type: Any
+ problem = ... # type: Any
+ problem_mark = ... # type: Any
+ note = ... # type: Any
+ def __init__(self, context=..., context_mark=..., problem=..., problem_mark=..., note=...) -> None: ...
diff --git a/typeshed/third_party/2/yaml/events.pyi b/typeshed/third_party/2/yaml/events.pyi
new file mode 100644
index 0000000..ff5f12b
--- /dev/null
+++ b/typeshed/third_party/2/yaml/events.pyi
@@ -0,0 +1,66 @@
+# Stubs for yaml.events (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class Event:
+ start_mark = ... # type: Any
+ end_mark = ... # type: Any
+ def __init__(self, start_mark=..., end_mark=...) -> None: ...
+
+class NodeEvent(Event):
+ anchor = ... # type: Any
+ start_mark = ... # type: Any
+ end_mark = ... # type: Any
+ def __init__(self, anchor, start_mark=..., end_mark=...) -> None: ...
+
+class CollectionStartEvent(NodeEvent):
+ anchor = ... # type: Any
+ tag = ... # type: Any
+ implicit = ... # type: Any
+ start_mark = ... # type: Any
+ end_mark = ... # type: Any
+ flow_style = ... # type: Any
+ def __init__(self, anchor, tag, implicit, start_mark=..., end_mark=..., flow_style=...) -> None: ...
+
+class CollectionEndEvent(Event): ...
+
+class StreamStartEvent(Event):
+ start_mark = ... # type: Any
+ end_mark = ... # type: Any
+ encoding = ... # type: Any
+ def __init__(self, start_mark=..., end_mark=..., encoding=...) -> None: ...
+
+class StreamEndEvent(Event): ...
+
+class DocumentStartEvent(Event):
+ start_mark = ... # type: Any
+ end_mark = ... # type: Any
+ explicit = ... # type: Any
+ version = ... # type: Any
+ tags = ... # type: Any
+ def __init__(self, start_mark=..., end_mark=..., explicit=..., version=..., tags=...) -> None: ...
+
+class DocumentEndEvent(Event):
+ start_mark = ... # type: Any
+ end_mark = ... # type: Any
+ explicit = ... # type: Any
+ def __init__(self, start_mark=..., end_mark=..., explicit=...) -> None: ...
+
+class AliasEvent(NodeEvent): ...
+
+class ScalarEvent(NodeEvent):
+ anchor = ... # type: Any
+ tag = ... # type: Any
+ implicit = ... # type: Any
+ value = ... # type: Any
+ start_mark = ... # type: Any
+ end_mark = ... # type: Any
+ style = ... # type: Any
+ def __init__(self, anchor, tag, implicit, value, start_mark=..., end_mark=..., style=...) -> None: ...
+
+class SequenceStartEvent(CollectionStartEvent): ...
+class SequenceEndEvent(CollectionEndEvent): ...
+class MappingStartEvent(CollectionStartEvent): ...
+class MappingEndEvent(CollectionEndEvent): ...
diff --git a/typeshed/third_party/2/yaml/loader.pyi b/typeshed/third_party/2/yaml/loader.pyi
new file mode 100644
index 0000000..6d3b4c1
--- /dev/null
+++ b/typeshed/third_party/2/yaml/loader.pyi
@@ -0,0 +1,19 @@
+# Stubs for yaml.loader (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from yaml.reader import Reader
+from yaml.scanner import Scanner
+from yaml.parser import Parser
+from yaml.composer import Composer
+from yaml.constructor import BaseConstructor, SafeConstructor, Constructor
+from yaml.resolver import BaseResolver, Resolver
+
+class BaseLoader(Reader, Scanner, Parser, Composer, BaseConstructor, BaseResolver):
+ def __init__(self, stream) -> None: ...
+
+class SafeLoader(Reader, Scanner, Parser, Composer, SafeConstructor, Resolver):
+ def __init__(self, stream) -> None: ...
+
+class Loader(Reader, Scanner, Parser, Composer, Constructor, Resolver):
+ def __init__(self, stream) -> None: ...
diff --git a/typeshed/third_party/2/yaml/nodes.pyi b/typeshed/third_party/2/yaml/nodes.pyi
new file mode 100644
index 0000000..a4039cd
--- /dev/null
+++ b/typeshed/third_party/2/yaml/nodes.pyi
@@ -0,0 +1,35 @@
+# Stubs for yaml.nodes (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class Node:
+ tag = ... # type: Any
+ value = ... # type: Any
+ start_mark = ... # type: Any
+ end_mark = ... # type: Any
+ def __init__(self, tag, value, start_mark, end_mark) -> None: ...
+
+class ScalarNode(Node):
+ id = ... # type: Any
+ tag = ... # type: Any
+ value = ... # type: Any
+ start_mark = ... # type: Any
+ end_mark = ... # type: Any
+ style = ... # type: Any
+ def __init__(self, tag, value, start_mark=..., end_mark=..., style=...) -> None: ...
+
+class CollectionNode(Node):
+ tag = ... # type: Any
+ value = ... # type: Any
+ start_mark = ... # type: Any
+ end_mark = ... # type: Any
+ flow_style = ... # type: Any
+ def __init__(self, tag, value, start_mark=..., end_mark=..., flow_style=...) -> None: ...
+
+class SequenceNode(CollectionNode):
+ id = ... # type: Any
+
+class MappingNode(CollectionNode):
+ id = ... # type: Any
diff --git a/typeshed/third_party/2/yaml/parser.pyi b/typeshed/third_party/2/yaml/parser.pyi
new file mode 100644
index 0000000..ed47b39
--- /dev/null
+++ b/typeshed/third_party/2/yaml/parser.pyi
@@ -0,0 +1,48 @@
+# Stubs for yaml.parser (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from yaml.error import MarkedYAMLError
+
+class ParserError(MarkedYAMLError): ...
+
+class Parser:
+ DEFAULT_TAGS = ... # type: Any
+ current_event = ... # type: Any
+ yaml_version = ... # type: Any
+ tag_handles = ... # type: Any
+ states = ... # type: Any
+ marks = ... # type: Any
+ state = ... # type: Any
+ def __init__(self) -> None: ...
+ def dispose(self): ...
+ def check_event(self, *choices): ...
+ def peek_event(self): ...
+ def get_event(self): ...
+ def parse_stream_start(self): ...
+ def parse_implicit_document_start(self): ...
+ def parse_document_start(self): ...
+ def parse_document_end(self): ...
+ def parse_document_content(self): ...
+ def process_directives(self): ...
+ def parse_block_node(self): ...
+ def parse_flow_node(self): ...
+ def parse_block_node_or_indentless_sequence(self): ...
+ def parse_node(self, block=..., indentless_sequence=...): ...
+ def parse_block_sequence_first_entry(self): ...
+ def parse_block_sequence_entry(self): ...
+ def parse_indentless_sequence_entry(self): ...
+ def parse_block_mapping_first_key(self): ...
+ def parse_block_mapping_key(self): ...
+ def parse_block_mapping_value(self): ...
+ def parse_flow_sequence_first_entry(self): ...
+ def parse_flow_sequence_entry(self, first=...): ...
+ def parse_flow_sequence_entry_mapping_key(self): ...
+ def parse_flow_sequence_entry_mapping_value(self): ...
+ def parse_flow_sequence_entry_mapping_end(self): ...
+ def parse_flow_mapping_first_key(self): ...
+ def parse_flow_mapping_key(self, first=...): ...
+ def parse_flow_mapping_value(self): ...
+ def parse_flow_mapping_empty_value(self): ...
+ def process_empty_scalar(self, mark): ...
diff --git a/typeshed/third_party/2/yaml/reader.pyi b/typeshed/third_party/2/yaml/reader.pyi
new file mode 100644
index 0000000..20bbc8f
--- /dev/null
+++ b/typeshed/third_party/2/yaml/reader.pyi
@@ -0,0 +1,38 @@
+# Stubs for yaml.reader (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from yaml.error import YAMLError
+
+class ReaderError(YAMLError):
+ name = ... # type: Any
+ character = ... # type: Any
+ position = ... # type: Any
+ encoding = ... # type: Any
+ reason = ... # type: Any
+ def __init__(self, name, position, character, encoding, reason) -> None: ...
+
+class Reader:
+ name = ... # type: Any
+ stream = ... # type: Any
+ stream_pointer = ... # type: Any
+ eof = ... # type: Any
+ buffer = ... # type: Any
+ pointer = ... # type: Any
+ raw_buffer = ... # type: Any
+ raw_decode = ... # type: Any
+ encoding = ... # type: Any
+ index = ... # type: Any
+ line = ... # type: Any
+ column = ... # type: Any
+ def __init__(self, stream) -> None: ...
+ def peek(self, index=...): ...
+ def prefix(self, length=...): ...
+ def forward(self, length=...): ...
+ def get_mark(self): ...
+ def determine_encoding(self): ...
+ NON_PRINTABLE = ... # type: Any
+ def check_printable(self, data): ...
+ def update(self, length): ...
+ def update_raw(self, size=...): ...
diff --git a/typeshed/third_party/2/yaml/representer.pyi b/typeshed/third_party/2/yaml/representer.pyi
new file mode 100644
index 0000000..b2a3c50
--- /dev/null
+++ b/typeshed/third_party/2/yaml/representer.pyi
@@ -0,0 +1,56 @@
+# Stubs for yaml.representer (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from yaml.error import YAMLError
+
+class RepresenterError(YAMLError): ...
+
+class BaseRepresenter:
+ yaml_representers = ... # type: Any
+ yaml_multi_representers = ... # type: Any
+ default_style = ... # type: Any
+ default_flow_style = ... # type: Any
+ represented_objects = ... # type: Any
+ object_keeper = ... # type: Any
+ alias_key = ... # type: Any
+ def __init__(self, default_style=..., default_flow_style=...) -> None: ...
+ def represent(self, data): ...
+ def get_classobj_bases(self, cls): ...
+ def represent_data(self, data): ...
+ def add_representer(cls, data_type, representer): ...
+ def add_multi_representer(cls, data_type, representer): ...
+ def represent_scalar(self, tag, value, style=...): ...
+ def represent_sequence(self, tag, sequence, flow_style=...): ...
+ def represent_mapping(self, tag, mapping, flow_style=...): ...
+ def ignore_aliases(self, data): ...
+
+class SafeRepresenter(BaseRepresenter):
+ def ignore_aliases(self, data): ...
+ def represent_none(self, data): ...
+ def represent_str(self, data): ...
+ def represent_unicode(self, data): ...
+ def represent_bool(self, data): ...
+ def represent_int(self, data): ...
+ def represent_long(self, data): ...
+ inf_value = ... # type: Any
+ def represent_float(self, data): ...
+ def represent_list(self, data): ...
+ def represent_dict(self, data): ...
+ def represent_set(self, data): ...
+ def represent_date(self, data): ...
+ def represent_datetime(self, data): ...
+ def represent_yaml_object(self, tag, data, cls, flow_style=...): ...
+ def represent_undefined(self, data): ...
+
+class Representer(SafeRepresenter):
+ def represent_str(self, data): ...
+ def represent_unicode(self, data): ...
+ def represent_long(self, data): ...
+ def represent_complex(self, data): ...
+ def represent_tuple(self, data): ...
+ def represent_name(self, data): ...
+ def represent_module(self, data): ...
+ def represent_instance(self, data): ...
+ def represent_object(self, data): ...
diff --git a/typeshed/third_party/2/yaml/resolver.pyi b/typeshed/third_party/2/yaml/resolver.pyi
new file mode 100644
index 0000000..0920e7c
--- /dev/null
+++ b/typeshed/third_party/2/yaml/resolver.pyi
@@ -0,0 +1,26 @@
+# Stubs for yaml.resolver (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from yaml.error import YAMLError
+
+class ResolverError(YAMLError): ...
+
+class BaseResolver:
+ DEFAULT_SCALAR_TAG = ... # type: Any
+ DEFAULT_SEQUENCE_TAG = ... # type: Any
+ DEFAULT_MAPPING_TAG = ... # type: Any
+ yaml_implicit_resolvers = ... # type: Any
+ yaml_path_resolvers = ... # type: Any
+ resolver_exact_paths = ... # type: Any
+ resolver_prefix_paths = ... # type: Any
+ def __init__(self) -> None: ...
+ def add_implicit_resolver(cls, tag, regexp, first): ...
+ def add_path_resolver(cls, tag, path, kind=...): ...
+ def descend_resolver(self, current_node, current_index): ...
+ def ascend_resolver(self): ...
+ def check_resolver_prefix(self, depth, path, kind, current_node, current_index): ...
+ def resolve(self, kind, value, implicit): ...
+
+class Resolver(BaseResolver): ...
diff --git a/typeshed/third_party/2/yaml/scanner.pyi b/typeshed/third_party/2/yaml/scanner.pyi
new file mode 100644
index 0000000..b4058ef
--- /dev/null
+++ b/typeshed/third_party/2/yaml/scanner.pyi
@@ -0,0 +1,100 @@
+# Stubs for yaml.scanner (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from yaml.error import MarkedYAMLError
+
+class ScannerError(MarkedYAMLError): ...
+
+class SimpleKey:
+ token_number = ... # type: Any
+ required = ... # type: Any
+ index = ... # type: Any
+ line = ... # type: Any
+ column = ... # type: Any
+ mark = ... # type: Any
+ def __init__(self, token_number, required, index, line, column, mark) -> None: ...
+
+class Scanner:
+ done = ... # type: Any
+ flow_level = ... # type: Any
+ tokens = ... # type: Any
+ tokens_taken = ... # type: Any
+ indent = ... # type: Any
+ indents = ... # type: Any
+ allow_simple_key = ... # type: Any
+ possible_simple_keys = ... # type: Any
+ def __init__(self) -> None: ...
+ def check_token(self, *choices): ...
+ def peek_token(self): ...
+ def get_token(self): ...
+ def need_more_tokens(self): ...
+ def fetch_more_tokens(self): ...
+ def next_possible_simple_key(self): ...
+ def stale_possible_simple_keys(self): ...
+ def save_possible_simple_key(self): ...
+ def remove_possible_simple_key(self): ...
+ def unwind_indent(self, column): ...
+ def add_indent(self, column): ...
+ def fetch_stream_start(self): ...
+ def fetch_stream_end(self): ...
+ def fetch_directive(self): ...
+ def fetch_document_start(self): ...
+ def fetch_document_end(self): ...
+ def fetch_document_indicator(self, TokenClass): ...
+ def fetch_flow_sequence_start(self): ...
+ def fetch_flow_mapping_start(self): ...
+ def fetch_flow_collection_start(self, TokenClass): ...
+ def fetch_flow_sequence_end(self): ...
+ def fetch_flow_mapping_end(self): ...
+ def fetch_flow_collection_end(self, TokenClass): ...
+ def fetch_flow_entry(self): ...
+ def fetch_block_entry(self): ...
+ def fetch_key(self): ...
+ def fetch_value(self): ...
+ def fetch_alias(self): ...
+ def fetch_anchor(self): ...
+ def fetch_tag(self): ...
+ def fetch_literal(self): ...
+ def fetch_folded(self): ...
+ def fetch_block_scalar(self, style): ...
+ def fetch_single(self): ...
+ def fetch_double(self): ...
+ def fetch_flow_scalar(self, style): ...
+ def fetch_plain(self): ...
+ def check_directive(self): ...
+ def check_document_start(self): ...
+ def check_document_end(self): ...
+ def check_block_entry(self): ...
+ def check_key(self): ...
+ def check_value(self): ...
+ def check_plain(self): ...
+ def scan_to_next_token(self): ...
+ def scan_directive(self): ...
+ def scan_directive_name(self, start_mark): ...
+ def scan_yaml_directive_value(self, start_mark): ...
+ def scan_yaml_directive_number(self, start_mark): ...
+ def scan_tag_directive_value(self, start_mark): ...
+ def scan_tag_directive_handle(self, start_mark): ...
+ def scan_tag_directive_prefix(self, start_mark): ...
+ def scan_directive_ignored_line(self, start_mark): ...
+ def scan_anchor(self, TokenClass): ...
+ def scan_tag(self): ...
+ def scan_block_scalar(self, style): ...
+ def scan_block_scalar_indicators(self, start_mark): ...
+ def scan_block_scalar_ignored_line(self, start_mark): ...
+ def scan_block_scalar_indentation(self): ...
+ def scan_block_scalar_breaks(self, indent): ...
+ def scan_flow_scalar(self, style): ...
+ ESCAPE_REPLACEMENTS = ... # type: Any
+ ESCAPE_CODES = ... # type: Any
+ def scan_flow_scalar_non_spaces(self, double, start_mark): ...
+ def scan_flow_scalar_spaces(self, double, start_mark): ...
+ def scan_flow_scalar_breaks(self, double, start_mark): ...
+ def scan_plain(self): ...
+ def scan_plain_spaces(self, indent, start_mark): ...
+ def scan_tag_handle(self, name, start_mark): ...
+ def scan_tag_uri(self, name, start_mark): ...
+ def scan_uri_escapes(self, name, start_mark): ...
+ def scan_line_break(self): ...
diff --git a/typeshed/third_party/2/yaml/serializer.pyi b/typeshed/third_party/2/yaml/serializer.pyi
new file mode 100644
index 0000000..c502056
--- /dev/null
+++ b/typeshed/third_party/2/yaml/serializer.pyi
@@ -0,0 +1,27 @@
+# Stubs for yaml.serializer (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from yaml.error import YAMLError
+
+class SerializerError(YAMLError): ...
+
+class Serializer:
+ ANCHOR_TEMPLATE = ... # type: Any
+ use_encoding = ... # type: Any
+ use_explicit_start = ... # type: Any
+ use_explicit_end = ... # type: Any
+ use_version = ... # type: Any
+ use_tags = ... # type: Any
+ serialized_nodes = ... # type: Any
+ anchors = ... # type: Any
+ last_anchor_id = ... # type: Any
+ closed = ... # type: Any
+ def __init__(self, encoding=..., explicit_start=..., explicit_end=..., version=..., tags=...) -> None: ...
+ def open(self): ...
+ def close(self): ...
+ def serialize(self, node): ...
+ def anchor_node(self, node): ...
+ def generate_anchor(self, node): ...
+ def serialize_node(self, node, parent, index): ...
diff --git a/typeshed/third_party/2/yaml/tokens.pyi b/typeshed/third_party/2/yaml/tokens.pyi
new file mode 100644
index 0000000..0d659f7
--- /dev/null
+++ b/typeshed/third_party/2/yaml/tokens.pyi
@@ -0,0 +1,97 @@
+# Stubs for yaml.tokens (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class Token:
+ start_mark = ... # type: Any
+ end_mark = ... # type: Any
+ def __init__(self, start_mark, end_mark) -> None: ...
+
+class DirectiveToken(Token):
+ id = ... # type: Any
+ name = ... # type: Any
+ value = ... # type: Any
+ start_mark = ... # type: Any
+ end_mark = ... # type: Any
+ def __init__(self, name, value, start_mark, end_mark) -> None: ...
+
+class DocumentStartToken(Token):
+ id = ... # type: Any
+
+class DocumentEndToken(Token):
+ id = ... # type: Any
+
+class StreamStartToken(Token):
+ id = ... # type: Any
+ start_mark = ... # type: Any
+ end_mark = ... # type: Any
+ encoding = ... # type: Any
+ def __init__(self, start_mark=..., end_mark=..., encoding=...) -> None: ...
+
+class StreamEndToken(Token):
+ id = ... # type: Any
+
+class BlockSequenceStartToken(Token):
+ id = ... # type: Any
+
+class BlockMappingStartToken(Token):
+ id = ... # type: Any
+
+class BlockEndToken(Token):
+ id = ... # type: Any
+
+class FlowSequenceStartToken(Token):
+ id = ... # type: Any
+
+class FlowMappingStartToken(Token):
+ id = ... # type: Any
+
+class FlowSequenceEndToken(Token):
+ id = ... # type: Any
+
+class FlowMappingEndToken(Token):
+ id = ... # type: Any
+
+class KeyToken(Token):
+ id = ... # type: Any
+
+class ValueToken(Token):
+ id = ... # type: Any
+
+class BlockEntryToken(Token):
+ id = ... # type: Any
+
+class FlowEntryToken(Token):
+ id = ... # type: Any
+
+class AliasToken(Token):
+ id = ... # type: Any
+ value = ... # type: Any
+ start_mark = ... # type: Any
+ end_mark = ... # type: Any
+ def __init__(self, value, start_mark, end_mark) -> None: ...
+
+class AnchorToken(Token):
+ id = ... # type: Any
+ value = ... # type: Any
+ start_mark = ... # type: Any
+ end_mark = ... # type: Any
+ def __init__(self, value, start_mark, end_mark) -> None: ...
+
+class TagToken(Token):
+ id = ... # type: Any
+ value = ... # type: Any
+ start_mark = ... # type: Any
+ end_mark = ... # type: Any
+ def __init__(self, value, start_mark, end_mark) -> None: ...
+
+class ScalarToken(Token):
+ id = ... # type: Any
+ value = ... # type: Any
+ plain = ... # type: Any
+ start_mark = ... # type: Any
+ end_mark = ... # type: Any
+ style = ... # type: Any
+ def __init__(self, value, plain, start_mark, end_mark, style=...) -> None: ...
diff --git a/typeshed/third_party/2and3/Crypto/Cipher/AES.pyi b/typeshed/third_party/2and3/Crypto/Cipher/AES.pyi
new file mode 100644
index 0000000..45b13ab
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Cipher/AES.pyi
@@ -0,0 +1,23 @@
+# Stubs for Crypto.Cipher.AES (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Union, Text
+from .blockalgo import BlockAlgo
+
+__revision__ = ... # type: str
+
+class AESCipher(BlockAlgo):
+ def __init__(self, key: Union[bytes, Text], *args, **kwargs) -> None: ...
+
+def new(key: Union[bytes, Text], *args, **kwargs) -> AESCipher: ...
+
+MODE_ECB = ... # type: int
+MODE_CBC = ... # type: int
+MODE_CFB = ... # type: int
+MODE_PGP = ... # type: int
+MODE_OFB = ... # type: int
+MODE_CTR = ... # type: int
+MODE_OPENPGP = ... # type: int
+block_size = ... # type: int
+key_size = ... # type: int
diff --git a/typeshed/third_party/2and3/Crypto/Cipher/ARC2.pyi b/typeshed/third_party/2and3/Crypto/Cipher/ARC2.pyi
new file mode 100644
index 0000000..08aec54
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Cipher/ARC2.pyi
@@ -0,0 +1,23 @@
+# Stubs for Crypto.Cipher.ARC2 (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Union, Text
+from .blockalgo import BlockAlgo
+
+__revision__ = ... # type: str
+
+class RC2Cipher(BlockAlgo):
+ def __init__(self, key: Union[bytes, Text], *args, **kwargs) -> None: ...
+
+def new(key: Union[bytes, Text], *args, **kwargs) -> RC2Cipher: ...
+
+MODE_ECB = ... # type: int
+MODE_CBC = ... # type: int
+MODE_CFB = ... # type: int
+MODE_PGP = ... # type: int
+MODE_OFB = ... # type: int
+MODE_CTR = ... # type: int
+MODE_OPENPGP = ... # type: int
+block_size = ... # type: int
+key_size = ... # type: int
diff --git a/typeshed/third_party/2and3/Crypto/Cipher/ARC4.pyi b/typeshed/third_party/2and3/Crypto/Cipher/ARC4.pyi
new file mode 100644
index 0000000..3a52539
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Cipher/ARC4.pyi
@@ -0,0 +1,19 @@
+# Stubs for Crypto.Cipher.ARC4 (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Union, Text
+
+__revision__ = ... # type: str
+
+class ARC4Cipher:
+ block_size = ... # type: int
+ key_size = ... # type: int
+ def __init__(self, key: Union[bytes, Text], *args, **kwargs) -> None: ...
+ def encrypt(self, plaintext): ...
+ def decrypt(self, ciphertext): ...
+
+def new(key: Union[bytes, Text], *args, **kwargs) -> ARC4Cipher: ...
+
+block_size = ... # type: int
+key_size = ... # type: int
diff --git a/typeshed/third_party/2and3/Crypto/Cipher/Blowfish.pyi b/typeshed/third_party/2and3/Crypto/Cipher/Blowfish.pyi
new file mode 100644
index 0000000..546eac2
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Cipher/Blowfish.pyi
@@ -0,0 +1,23 @@
+# Stubs for Crypto.Cipher.Blowfish (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Union, Text
+from .blockalgo import BlockAlgo
+
+__revision__ = ... # type: str
+
+class BlowfishCipher(BlockAlgo):
+ def __init__(self, key: Union[bytes, Text], *args, **kwargs) -> None: ...
+
+def new(key: Union[bytes, Text], *args, **kwargs) -> BlowfishCipher: ...
+
+MODE_ECB = ... # type: int
+MODE_CBC = ... # type: int
+MODE_CFB = ... # type: int
+MODE_PGP = ... # type: int
+MODE_OFB = ... # type: int
+MODE_CTR = ... # type: int
+MODE_OPENPGP = ... # type: int
+block_size = ... # type: int
+key_size = ... # type: Any
diff --git a/typeshed/third_party/2and3/Crypto/Cipher/CAST.pyi b/typeshed/third_party/2and3/Crypto/Cipher/CAST.pyi
new file mode 100644
index 0000000..f63a43b
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Cipher/CAST.pyi
@@ -0,0 +1,23 @@
+# Stubs for Crypto.Cipher.CAST (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Union, Text
+from .blockalgo import BlockAlgo
+
+__revision__ = ... # type: str
+
+class CAST128Cipher(BlockAlgo):
+ def __init__(self, key: Union[bytes, Text], *args, **kwargs) -> None: ...
+
+def new(key: Union[bytes, Text], *args, **kwargs) -> CAST128Cipher: ...
+
+MODE_ECB = ... # type: int
+MODE_CBC = ... # type: int
+MODE_CFB = ... # type: int
+MODE_PGP = ... # type: int
+MODE_OFB = ... # type: int
+MODE_CTR = ... # type: int
+MODE_OPENPGP = ... # type: int
+block_size = ... # type: int
+key_size = ... # type: Any
diff --git a/typeshed/third_party/2and3/Crypto/Cipher/DES.pyi b/typeshed/third_party/2and3/Crypto/Cipher/DES.pyi
new file mode 100644
index 0000000..c2b2f5c
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Cipher/DES.pyi
@@ -0,0 +1,23 @@
+# Stubs for Crypto.Cipher.DES (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Union, Text
+from .blockalgo import BlockAlgo
+
+__revision__ = ... # type: str
+
+class DESCipher(BlockAlgo):
+ def __init__(self, key: Union[bytes, Text], *args, **kwargs) -> None: ...
+
+def new(key: Union[bytes, Text], *args, **kwargs) -> DESCipher: ...
+
+MODE_ECB = ... # type: int
+MODE_CBC = ... # type: int
+MODE_CFB = ... # type: int
+MODE_PGP = ... # type: int
+MODE_OFB = ... # type: int
+MODE_CTR = ... # type: int
+MODE_OPENPGP = ... # type: int
+block_size = ... # type: int
+key_size = ... # type: int
diff --git a/typeshed/third_party/2and3/Crypto/Cipher/DES3.pyi b/typeshed/third_party/2and3/Crypto/Cipher/DES3.pyi
new file mode 100644
index 0000000..f8684b7
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Cipher/DES3.pyi
@@ -0,0 +1,24 @@
+# Stubs for Crypto.Cipher.DES3 (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Union, Text
+
+from .blockalgo import BlockAlgo
+
+__revision__ = ... # type: str
+
+class DES3Cipher(BlockAlgo):
+ def __init__(self, key: Union[bytes, Text], *args, **kwargs) -> None: ...
+
+def new(key: Union[bytes, Text], *args, **kwargs) -> DES3Cipher: ...
+
+MODE_ECB = ... # type: int
+MODE_CBC = ... # type: int
+MODE_CFB = ... # type: int
+MODE_PGP = ... # type: int
+MODE_OFB = ... # type: int
+MODE_CTR = ... # type: int
+MODE_OPENPGP = ... # type: int
+block_size = ... # type: int
+key_size = ... # type: Any
diff --git a/typeshed/third_party/2and3/Crypto/Cipher/PKCS1_OAEP.pyi b/typeshed/third_party/2and3/Crypto/Cipher/PKCS1_OAEP.pyi
new file mode 100644
index 0000000..4f57f48
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Cipher/PKCS1_OAEP.pyi
@@ -0,0 +1,17 @@
+# Stubs for Crypto.Cipher.PKCS1_OAEP (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional, Union, Text
+
+from Crypto.PublicKey.RSA import _RSAobj
+
+class PKCS1OAEP_Cipher:
+ def __init__(self, key: _RSAobj, hashAlgo: Any, mgfunc: Any, label: Any) -> None: ...
+ def can_encrypt(self): ...
+ def can_decrypt(self): ...
+ def encrypt(self, message: Union[bytes, Text]) -> bytes: ...
+ def decrypt(self, ct: bytes) -> bytes: ...
+
+
+def new(key: _RSAobj, hashAlgo: Optional[Any] = ..., mgfunc: Optional[Any] = ..., label: Any = ...) -> PKCS1OAEP_Cipher: ...
diff --git a/typeshed/third_party/2and3/Crypto/Cipher/PKCS1_v1_5.pyi b/typeshed/third_party/2and3/Crypto/Cipher/PKCS1_v1_5.pyi
new file mode 100644
index 0000000..5d10282
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Cipher/PKCS1_v1_5.pyi
@@ -0,0 +1,17 @@
+# Stubs for Crypto.Cipher.PKCS1_v1_5 (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Union, Text
+
+from Crypto.PublicKey.RSA import _RSAobj
+
+class PKCS115_Cipher:
+ def __init__(self, key: _RSAobj) -> None: ...
+ def can_encrypt(self) -> bool: ...
+ def can_decrypt(self) -> bool: ...
+ rf = ... # type: Any
+ def encrypt(self, message: Union[bytes, Text]) -> bytes: ...
+ def decrypt(self, ct: bytes, sentinel: Any) -> bytes: ...
+
+def new(key: _RSAobj) -> PKCS115_Cipher: ...
diff --git a/typeshed/third_party/2and3/Crypto/Cipher/XOR.pyi b/typeshed/third_party/2and3/Crypto/Cipher/XOR.pyi
new file mode 100644
index 0000000..c131867
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Cipher/XOR.pyi
@@ -0,0 +1,20 @@
+# Stubs for Crypto.Cipher.XOR (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Union, Text
+
+__revision__ = ... # type: str
+
+class XORCipher:
+ block_size = ... # type: int
+ key_size = ... # type: int
+ def __init__(self, key: Union[bytes, Text], *args, **kwargs) -> None: ...
+ def encrypt(self, plaintext: Union[bytes, Text]) -> bytes: ...
+ def decrypt(self, ciphertext: bytes) -> bytes: ...
+
+
+def new(key: Union[bytes, Text], *args, **kwargs) -> XORCipher: ...
+
+block_size = ... # type: int
+key_size = ... # type: int
diff --git a/typeshed/third_party/2and3/Crypto/Cipher/__init__.pyi b/typeshed/third_party/2and3/Crypto/Cipher/__init__.pyi
new file mode 100644
index 0000000..3d42ce3
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Cipher/__init__.pyi
@@ -0,0 +1,15 @@
+# Stubs for Crypto.Cipher (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+# Names in __all__ with no definition:
+# AES
+# ARC2
+# ARC4
+# Blowfish
+# CAST
+# DES
+# DES3
+# PKCS1_OAEP
+# PKCS1_v1_5
+# XOR
diff --git a/typeshed/third_party/2and3/Crypto/Cipher/blockalgo.pyi b/typeshed/third_party/2and3/Crypto/Cipher/blockalgo.pyi
new file mode 100644
index 0000000..fa71377
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Cipher/blockalgo.pyi
@@ -0,0 +1,21 @@
+# Stubs for Crypto.Cipher.blockalgo (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Union, Text
+
+MODE_ECB = ... # type: int
+MODE_CBC = ... # type: int
+MODE_CFB = ... # type: int
+MODE_PGP = ... # type: int
+MODE_OFB = ... # type: int
+MODE_CTR = ... # type: int
+MODE_OPENPGP = ... # type: int
+
+class BlockAlgo:
+ mode = ... # type: int
+ block_size = ... # type: int
+ IV = ... # type: Any
+ def __init__(self, factory: Any, key: Union[bytes, Text], *args, **kwargs) -> None: ...
+ def encrypt(self, plaintext: Union[bytes, Text]) -> bytes: ...
+ def decrypt(self, ciphertext: bytes) -> bytes: ...
diff --git a/typeshed/third_party/2and3/Crypto/Hash/HMAC.pyi b/typeshed/third_party/2and3/Crypto/Hash/HMAC.pyi
new file mode 100644
index 0000000..3a71ac4
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Hash/HMAC.pyi
@@ -0,0 +1,20 @@
+# Stubs for Crypto.Hash.HMAC (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+digest_size = ... # type: Any
+
+class HMAC:
+ digest_size = ... # type: Any
+ digestmod = ... # type: Any
+ outer = ... # type: Any
+ inner = ... # type: Any
+ def __init__(self, key, msg: Optional[Any] = ..., digestmod: Optional[Any] = ...) -> None: ...
+ def update(self, msg): ...
+ def copy(self): ...
+ def digest(self): ...
+ def hexdigest(self): ...
+
+def new(key, msg: Optional[Any] = ..., digestmod: Optional[Any] = ...): ...
diff --git a/typeshed/third_party/2and3/Crypto/Hash/MD2.pyi b/typeshed/third_party/2and3/Crypto/Hash/MD2.pyi
new file mode 100644
index 0000000..4449c71
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Hash/MD2.pyi
@@ -0,0 +1,17 @@
+# Stubs for Crypto.Hash.MD2 (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+from Crypto.Hash.hashalgo import HashAlgo
+
+class MD2Hash(HashAlgo):
+ oid = ... # type: Any
+ digest_size = ... # type: int
+ block_size = ... # type: int
+ def __init__(self, data: Optional[Any] = ...) -> None: ...
+ def new(self, data: Optional[Any] = ...): ...
+
+def new(data: Optional[Any] = ...): ...
+
+digest_size = ... # type: Any
diff --git a/typeshed/third_party/2and3/Crypto/Hash/MD4.pyi b/typeshed/third_party/2and3/Crypto/Hash/MD4.pyi
new file mode 100644
index 0000000..b2e7ee0
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Hash/MD4.pyi
@@ -0,0 +1,17 @@
+# Stubs for Crypto.Hash.MD4 (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+from Crypto.Hash.hashalgo import HashAlgo
+
+class MD4Hash(HashAlgo):
+ oid = ... # type: Any
+ digest_size = ... # type: int
+ block_size = ... # type: int
+ def __init__(self, data: Optional[Any] = ...) -> None: ...
+ def new(self, data: Optional[Any] = ...): ...
+
+def new(data: Optional[Any] = ...): ...
+
+digest_size = ... # type: Any
diff --git a/typeshed/third_party/2and3/Crypto/Hash/MD5.pyi b/typeshed/third_party/2and3/Crypto/Hash/MD5.pyi
new file mode 100644
index 0000000..15f7ce4
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Hash/MD5.pyi
@@ -0,0 +1,17 @@
+# Stubs for Crypto.Hash.MD5 (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+from Crypto.Hash.hashalgo import HashAlgo
+
+class MD5Hash(HashAlgo):
+ oid = ... # type: Any
+ digest_size = ... # type: int
+ block_size = ... # type: int
+ def __init__(self, data: Optional[Any] = ...) -> None: ...
+ def new(self, data: Optional[Any] = ...): ...
+
+def new(data: Optional[Any] = ...): ...
+
+digest_size = ... # type: Any
diff --git a/typeshed/third_party/2and3/Crypto/Hash/RIPEMD.pyi b/typeshed/third_party/2and3/Crypto/Hash/RIPEMD.pyi
new file mode 100644
index 0000000..ba965de
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Hash/RIPEMD.pyi
@@ -0,0 +1,17 @@
+# Stubs for Crypto.Hash.RIPEMD (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+from Crypto.Hash.hashalgo import HashAlgo
+
+class RIPEMD160Hash(HashAlgo):
+ oid = ... # type: Any
+ digest_size = ... # type: int
+ block_size = ... # type: int
+ def __init__(self, data: Optional[Any] = ...) -> None: ...
+ def new(self, data: Optional[Any] = ...): ...
+
+def new(data: Optional[Any] = ...): ...
+
+digest_size = ... # type: Any
diff --git a/typeshed/third_party/2and3/Crypto/Hash/SHA.pyi b/typeshed/third_party/2and3/Crypto/Hash/SHA.pyi
new file mode 100644
index 0000000..16965f7
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Hash/SHA.pyi
@@ -0,0 +1,17 @@
+# Stubs for Crypto.Hash.SHA (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+from Crypto.Hash.hashalgo import HashAlgo
+
+class SHA1Hash(HashAlgo):
+ oid = ... # type: Any
+ digest_size = ... # type: int
+ block_size = ... # type: int
+ def __init__(self, data: Optional[Any] = ...) -> None: ...
+ def new(self, data: Optional[Any] = ...): ...
+
+def new(data: Optional[Any] = ...): ...
+
+digest_size = ... # type: Any
diff --git a/typeshed/third_party/2and3/Crypto/Hash/SHA224.pyi b/typeshed/third_party/2and3/Crypto/Hash/SHA224.pyi
new file mode 100644
index 0000000..e9b68d2
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Hash/SHA224.pyi
@@ -0,0 +1,17 @@
+# Stubs for Crypto.Hash.SHA224 (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+from Crypto.Hash.hashalgo import HashAlgo
+
+class SHA224Hash(HashAlgo):
+ oid = ... # type: Any
+ digest_size = ... # type: int
+ block_size = ... # type: int
+ def __init__(self, data: Optional[Any] = ...) -> None: ...
+ def new(self, data: Optional[Any] = ...): ...
+
+def new(data: Optional[Any] = ...): ...
+
+digest_size = ... # type: Any
diff --git a/typeshed/third_party/2and3/Crypto/Hash/SHA256.pyi b/typeshed/third_party/2and3/Crypto/Hash/SHA256.pyi
new file mode 100644
index 0000000..ca21b6f
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Hash/SHA256.pyi
@@ -0,0 +1,17 @@
+# Stubs for Crypto.Hash.SHA256 (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+from Crypto.Hash.hashalgo import HashAlgo
+
+class SHA256Hash(HashAlgo):
+ oid = ... # type: Any
+ digest_size = ... # type: int
+ block_size = ... # type: int
+ def __init__(self, data: Optional[Any] = ...) -> None: ...
+ def new(self, data: Optional[Any] = ...): ...
+
+def new(data: Optional[Any] = ...): ...
+
+digest_size = ... # type: Any
diff --git a/typeshed/third_party/2and3/Crypto/Hash/SHA384.pyi b/typeshed/third_party/2and3/Crypto/Hash/SHA384.pyi
new file mode 100644
index 0000000..c318eed
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Hash/SHA384.pyi
@@ -0,0 +1,17 @@
+# Stubs for Crypto.Hash.SHA384 (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+from Crypto.Hash.hashalgo import HashAlgo
+
+class SHA384Hash(HashAlgo):
+ oid = ... # type: Any
+ digest_size = ... # type: int
+ block_size = ... # type: int
+ def __init__(self, data: Optional[Any] = ...) -> None: ...
+ def new(self, data: Optional[Any] = ...): ...
+
+def new(data: Optional[Any] = ...): ...
+
+digest_size = ... # type: Any
diff --git a/typeshed/third_party/2and3/Crypto/Hash/SHA512.pyi b/typeshed/third_party/2and3/Crypto/Hash/SHA512.pyi
new file mode 100644
index 0000000..6239511
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Hash/SHA512.pyi
@@ -0,0 +1,17 @@
+# Stubs for Crypto.Hash.SHA512 (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+from Crypto.Hash.hashalgo import HashAlgo
+
+class SHA512Hash(HashAlgo):
+ oid = ... # type: Any
+ digest_size = ... # type: int
+ block_size = ... # type: int
+ def __init__(self, data: Optional[Any] = ...) -> None: ...
+ def new(self, data: Optional[Any] = ...): ...
+
+def new(data: Optional[Any] = ...): ...
+
+digest_size = ... # type: Any
diff --git a/typeshed/third_party/2and3/Crypto/Hash/__init__.pyi b/typeshed/third_party/2and3/Crypto/Hash/__init__.pyi
new file mode 100644
index 0000000..6385911
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Hash/__init__.pyi
@@ -0,0 +1,15 @@
+# Stubs for Crypto.Hash (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+# Names in __all__ with no definition:
+# HMAC
+# MD2
+# MD4
+# MD5
+# RIPEMD
+# SHA
+# SHA224
+# SHA256
+# SHA384
+# SHA512
diff --git a/typeshed/third_party/2and3/Crypto/Hash/hashalgo.pyi b/typeshed/third_party/2and3/Crypto/Hash/hashalgo.pyi
new file mode 100644
index 0000000..e762453
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Hash/hashalgo.pyi
@@ -0,0 +1,15 @@
+# Stubs for Crypto.Hash.hashalgo (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+class HashAlgo:
+ digest_size = ... # type: Any
+ block_size = ... # type: Any
+ def __init__(self, hashFactory, data: Optional[Any] = ...) -> None: ...
+ def update(self, data): ...
+ def digest(self): ...
+ def hexdigest(self): ...
+ def copy(self): ...
+ def new(self, data: Optional[Any] = ...): ...
diff --git a/typeshed/third_party/2and3/Crypto/Protocol/AllOrNothing.pyi b/typeshed/third_party/2and3/Crypto/Protocol/AllOrNothing.pyi
new file mode 100644
index 0000000..300e1bf
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Protocol/AllOrNothing.pyi
@@ -0,0 +1,14 @@
+# Stubs for Crypto.Protocol.AllOrNothing (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+__revision__ = ... # type: str
+
+def isInt(x): ...
+
+class AllOrNothing:
+ def __init__(self, ciphermodule, mode: Optional[Any] = ..., IV: Optional[Any] = ...) -> None: ...
+ def digest(self, text): ...
+ def undigest(self, blocks): ...
diff --git a/typeshed/third_party/2and3/Crypto/Protocol/Chaffing.pyi b/typeshed/third_party/2and3/Crypto/Protocol/Chaffing.pyi
new file mode 100644
index 0000000..73c1d56
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Protocol/Chaffing.pyi
@@ -0,0 +1,9 @@
+# Stubs for Crypto.Protocol.Chaffing (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+__revision__ = ... # type: str
+
+class Chaff:
+ def __init__(self, factor: float = ..., blocksper: int = ...) -> None: ...
+ def chaff(self, blocks): ...
diff --git a/typeshed/third_party/2and3/Crypto/Protocol/KDF.pyi b/typeshed/third_party/2and3/Crypto/Protocol/KDF.pyi
new file mode 100644
index 0000000..a14b351
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Protocol/KDF.pyi
@@ -0,0 +1,11 @@
+# Stubs for Crypto.Protocol.KDF (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+from Crypto.Hash import SHA as SHA1
+
+__revision__ = ... # type: str
+
+def PBKDF1(password, salt, dkLen, count: int = ..., hashAlgo: Optional[Any] = ...): ...
+def PBKDF2(password, salt, dkLen: int = ..., count: int = ..., prf: Optional[Any] = ...): ...
diff --git a/typeshed/third_party/2and3/Crypto/Protocol/__init__.pyi b/typeshed/third_party/2and3/Crypto/Protocol/__init__.pyi
new file mode 100644
index 0000000..afcab98
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Protocol/__init__.pyi
@@ -0,0 +1,8 @@
+# Stubs for Crypto.Protocol (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+# Names in __all__ with no definition:
+# AllOrNothing
+# Chaffing
+# KDF
diff --git a/typeshed/third_party/2and3/Crypto/PublicKey/DSA.pyi b/typeshed/third_party/2and3/Crypto/PublicKey/DSA.pyi
new file mode 100644
index 0000000..30b7b1c
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/PublicKey/DSA.pyi
@@ -0,0 +1,31 @@
+# Stubs for Crypto.PublicKey.DSA (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+from .pubkey import pubkey
+
+class _DSAobj(pubkey):
+ keydata = ... # type: Any
+ implementation = ... # type: Any
+ key = ... # type: Any
+ def __init__(self, implementation, key) -> None: ...
+ def __getattr__(self, attrname): ...
+ def sign(self, M, K): ...
+ def verify(self, M, signature): ...
+ def has_private(self): ...
+ def size(self): ...
+ def can_blind(self): ...
+ def can_encrypt(self): ...
+ def can_sign(self): ...
+ def publickey(self): ...
+
+class DSAImplementation:
+ error = ... # type: Any
+ def __init__(self, **kwargs) -> None: ...
+ def generate(self, bits, randfunc: Optional[Any] = ..., progress_func: Optional[Any] = ...): ...
+ def construct(self, tup): ...
+
+generate = ... # type: Any
+construct = ... # type: Any
+error = ... # type: Any
diff --git a/typeshed/third_party/2and3/Crypto/PublicKey/ElGamal.pyi b/typeshed/third_party/2and3/Crypto/PublicKey/ElGamal.pyi
new file mode 100644
index 0000000..4ed2c5b
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/PublicKey/ElGamal.pyi
@@ -0,0 +1,23 @@
+# Stubs for Crypto.PublicKey.ElGamal (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+from Crypto.PublicKey.pubkey import pubkey
+from Crypto.PublicKey.pubkey import * # noqa: F403
+
+class error(Exception): ...
+
+def generate(bits, randfunc, progress_func: Optional[Any] = ...): ...
+def construct(tup): ...
+
+class ElGamalobj(pubkey):
+ keydata = ... # type: Any
+ def encrypt(self, plaintext, K): ...
+ def decrypt(self, ciphertext): ...
+ def sign(self, M, K): ...
+ def verify(self, M, signature): ...
+ def size(self): ...
+ def has_private(self): ...
+ def publickey(self): ...
diff --git a/typeshed/third_party/2and3/Crypto/PublicKey/RSA.pyi b/typeshed/third_party/2and3/Crypto/PublicKey/RSA.pyi
new file mode 100644
index 0000000..1fbd6ff
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/PublicKey/RSA.pyi
@@ -0,0 +1,36 @@
+# Stubs for Crypto.PublicKey.RSA (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional, Union, Text
+from .pubkey import pubkey
+
+class _RSAobj(pubkey):
+ keydata = ... # type: Any
+ implementation = ... # type: Any
+ key = ... # type: Any
+ def __init__(self, implementation, key, randfunc: Optional[Any] = ...) -> None: ...
+ def __getattr__(self, attrname): ...
+ def encrypt(self, plaintext, K): ...
+ def decrypt(self, ciphertext): ...
+ def sign(self, M, K): ...
+ def verify(self, M, signature): ...
+ def has_private(self): ...
+ def size(self): ...
+ def can_blind(self): ...
+ def can_encrypt(self): ...
+ def can_sign(self): ...
+ def publickey(self): ...
+ def exportKey(self, format: str = ..., passphrase: Optional[Any] = ..., pkcs: int = ...): ...
+
+class RSAImplementation:
+ error = ... # type: Any
+ def __init__(self, **kwargs) -> None: ...
+ def generate(self, bits, randfunc: Optional[Any] = ..., progress_func: Optional[Any] = ..., e: int = ...): ...
+ def construct(self, tup): ...
+ def importKey(self, externKey: Any, passphrase: Union[None, bytes, Text] = ...) -> _RSAobj: ...
+
+generate = ... # type: Any
+construct = ... # type: Any
+importKey = ... # type: Any
+error = ... # type: Any
diff --git a/typeshed/third_party/2and3/Crypto/PublicKey/__init__.pyi b/typeshed/third_party/2and3/Crypto/PublicKey/__init__.pyi
new file mode 100644
index 0000000..84bc3bc
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/PublicKey/__init__.pyi
@@ -0,0 +1,8 @@
+# Stubs for Crypto.PublicKey (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+# Names in __all__ with no definition:
+# DSA
+# ElGamal
+# RSA
diff --git a/typeshed/third_party/2and3/Crypto/PublicKey/pubkey.pyi b/typeshed/third_party/2and3/Crypto/PublicKey/pubkey.pyi
new file mode 100644
index 0000000..dd34d69
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/PublicKey/pubkey.pyi
@@ -0,0 +1,25 @@
+# Stubs for Crypto.PublicKey.pubkey (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from Crypto.Util.number import * # noqa: F403
+
+__revision__ = ... # type: str
+
+class pubkey:
+ def __init__(self) -> None: ...
+ def encrypt(self, plaintext, K): ...
+ def decrypt(self, ciphertext): ...
+ def sign(self, M, K): ...
+ def verify(self, M, signature): ...
+ def validate(self, M, signature): ...
+ def blind(self, M, B): ...
+ def unblind(self, M, B): ...
+ def can_sign(self): ...
+ def can_encrypt(self): ...
+ def can_blind(self): ...
+ def size(self): ...
+ def has_private(self): ...
+ def publickey(self): ...
+ def __eq__(self, other): ...
+ def __ne__(self, other): ...
diff --git a/typeshed/third_party/2and3/Crypto/Random/Fortuna/FortunaAccumulator.pyi b/typeshed/third_party/2and3/Crypto/Random/Fortuna/FortunaAccumulator.pyi
new file mode 100644
index 0000000..e843070
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Random/Fortuna/FortunaAccumulator.pyi
@@ -0,0 +1,29 @@
+# Stubs for Crypto.Random.Fortuna.FortunaAccumulator (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+__revision__ = ... # type: str
+
+class FortunaPool:
+ digest_size = ... # type: Any
+ def __init__(self) -> None: ...
+ def append(self, data): ...
+ def digest(self): ...
+ def hexdigest(self): ...
+ length = ... # type: int
+ def reset(self): ...
+
+def which_pools(r): ...
+
+class FortunaAccumulator:
+ min_pool_size = ... # type: int
+ reseed_interval = ... # type: float
+ reseed_count = ... # type: int
+ generator = ... # type: Any
+ last_reseed = ... # type: Any
+ pools = ... # type: Any
+ def __init__(self) -> None: ...
+ def random_data(self, bytes): ...
+ def add_random_event(self, source_number, pool_number, data): ...
diff --git a/typeshed/third_party/2and3/Crypto/Random/Fortuna/FortunaGenerator.pyi b/typeshed/third_party/2and3/Crypto/Random/Fortuna/FortunaGenerator.pyi
new file mode 100644
index 0000000..89d13ab
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Random/Fortuna/FortunaGenerator.pyi
@@ -0,0 +1,20 @@
+# Stubs for Crypto.Random.Fortuna.FortunaGenerator (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+__revision__ = ... # type: str
+
+class AESGenerator:
+ block_size = ... # type: Any
+ key_size = ... # type: int
+ max_blocks_per_request = ... # type: Any
+ counter = ... # type: Any
+ key = ... # type: Any
+ block_size_shift = ... # type: Any
+ blocks_per_key = ... # type: Any
+ max_bytes_per_request = ... # type: Any
+ def __init__(self) -> None: ...
+ def reseed(self, seed): ...
+ def pseudo_random_data(self, bytes): ...
diff --git a/typeshed/third_party/2and3/Crypto/Random/Fortuna/SHAd256.pyi b/typeshed/third_party/2and3/Crypto/Random/Fortuna/SHAd256.pyi
new file mode 100644
index 0000000..5a83fd9
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Random/Fortuna/SHAd256.pyi
@@ -0,0 +1,17 @@
+# Stubs for Crypto.Random.Fortuna.SHAd256 (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+class _SHAd256:
+ digest_size = ... # type: Any
+ def __init__(self, internal_api_check, sha256_hash_obj) -> None: ...
+ def copy(self): ...
+ def digest(self): ...
+ def hexdigest(self): ...
+ def update(self, data): ...
+
+digest_size = ... # type: Any
+
+def new(data: Optional[Any] = ...): ...
diff --git a/typeshed/third_party/2and3/Crypto/Random/Fortuna/__init__.pyi b/typeshed/third_party/2and3/Crypto/Random/Fortuna/__init__.pyi
new file mode 100644
index 0000000..fd03fb2
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Random/Fortuna/__init__.pyi
@@ -0,0 +1,3 @@
+# Stubs for Crypto.Random.Fortuna (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
diff --git a/typeshed/third_party/2and3/Crypto/Random/OSRNG/__init__.pyi b/typeshed/third_party/2and3/Crypto/Random/OSRNG/__init__.pyi
new file mode 100644
index 0000000..e73ed2e
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Random/OSRNG/__init__.pyi
@@ -0,0 +1,5 @@
+# Stubs for Crypto.Random.OSRNG (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+__revision__ = ... # type: str
diff --git a/typeshed/third_party/2and3/Crypto/Random/OSRNG/fallback.pyi b/typeshed/third_party/2and3/Crypto/Random/OSRNG/fallback.pyi
new file mode 100644
index 0000000..fafc388
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Random/OSRNG/fallback.pyi
@@ -0,0 +1,9 @@
+# Stubs for Crypto.Random.OSRNG.fallback (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from .rng_base import BaseRNG
+
+class PythonOSURandomRNG(BaseRNG):
+ name = ... # type: str
+ def __init__(self) -> None: ...
diff --git a/typeshed/third_party/2and3/Crypto/Random/OSRNG/posix.pyi b/typeshed/third_party/2and3/Crypto/Random/OSRNG/posix.pyi
new file mode 100644
index 0000000..c7d4613
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Random/OSRNG/posix.pyi
@@ -0,0 +1,10 @@
+# Stubs for Crypto.Random.OSRNG.posix (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+from .rng_base import BaseRNG
+
+class DevURandomRNG(BaseRNG):
+ name = ... # type: str
+ def __init__(self, devname: Optional[Any] = ...) -> None: ...
diff --git a/typeshed/third_party/2and3/Crypto/Random/OSRNG/rng_base.pyi b/typeshed/third_party/2and3/Crypto/Random/OSRNG/rng_base.pyi
new file mode 100644
index 0000000..4fa634a
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Random/OSRNG/rng_base.pyi
@@ -0,0 +1,15 @@
+# Stubs for Crypto.Random.OSRNG.rng_base (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+__revision__ = ... # type: str
+
+class BaseRNG:
+ closed = ... # type: bool
+ def __init__(self) -> None: ...
+ def __del__(self): ...
+ def __enter__(self): ...
+ def __exit__(self): ...
+ def close(self): ...
+ def flush(self): ...
+ def read(self, N: int = ...): ...
diff --git a/typeshed/third_party/2and3/Crypto/Random/__init__.pyi b/typeshed/third_party/2and3/Crypto/Random/__init__.pyi
new file mode 100644
index 0000000..d9872cb
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Random/__init__.pyi
@@ -0,0 +1,5 @@
+# Stubs for Crypto.Random (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+def new(*args, **kwargs): ...
diff --git a/typeshed/third_party/2and3/Crypto/Random/random.pyi b/typeshed/third_party/2and3/Crypto/Random/random.pyi
new file mode 100644
index 0000000..12a2e6f
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Random/random.pyi
@@ -0,0 +1,21 @@
+# Stubs for Crypto.Random.random (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+class StrongRandom:
+ def __init__(self, rng: Optional[Any] = ..., randfunc: Optional[Any] = ...) -> None: ...
+ def getrandbits(self, k): ...
+ def randrange(self, *args): ...
+ def randint(self, a, b): ...
+ def choice(self, seq): ...
+ def shuffle(self, x): ...
+ def sample(self, population, k): ...
+
+getrandbits = ... # type: Any
+randrange = ... # type: Any
+randint = ... # type: Any
+choice = ... # type: Any
+shuffle = ... # type: Any
+sample = ... # type: Any
diff --git a/typeshed/third_party/2and3/Crypto/Signature/PKCS1_PSS.pyi b/typeshed/third_party/2and3/Crypto/Signature/PKCS1_PSS.pyi
new file mode 100644
index 0000000..12edf26
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Signature/PKCS1_PSS.pyi
@@ -0,0 +1,13 @@
+# Stubs for Crypto.Signature.PKCS1_PSS (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+class PSS_SigScheme:
+ def __init__(self, key, mgfunc, saltLen) -> None: ...
+ def can_sign(self): ...
+ def sign(self, mhash): ...
+ def verify(self, mhash, S): ...
+
+def new(key, mgfunc: Optional[Any] = ..., saltLen: Optional[Any] = ...): ...
diff --git a/typeshed/third_party/2and3/Crypto/Signature/PKCS1_v1_5.pyi b/typeshed/third_party/2and3/Crypto/Signature/PKCS1_v1_5.pyi
new file mode 100644
index 0000000..d48d3a3
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Signature/PKCS1_v1_5.pyi
@@ -0,0 +1,12 @@
+# Stubs for Crypto.Signature.PKCS1_v1_5 (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+
+class PKCS115_SigScheme:
+ def __init__(self, key) -> None: ...
+ def can_sign(self): ...
+ def sign(self, mhash): ...
+ def verify(self, mhash, S): ...
+
+def new(key): ...
diff --git a/typeshed/third_party/2and3/Crypto/Signature/__init__.pyi b/typeshed/third_party/2and3/Crypto/Signature/__init__.pyi
new file mode 100644
index 0000000..710372a
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Signature/__init__.pyi
@@ -0,0 +1,7 @@
+# Stubs for Crypto.Signature (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+# Names in __all__ with no definition:
+# PKCS1_PSS
+# PKCS1_v1_5
diff --git a/typeshed/third_party/2and3/Crypto/Util/Counter.pyi b/typeshed/third_party/2and3/Crypto/Util/Counter.pyi
new file mode 100644
index 0000000..620c1be
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Util/Counter.pyi
@@ -0,0 +1,7 @@
+# Stubs for Crypto.Util.Counter (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+def new(nbits, prefix: Any = ..., suffix: Any = ..., initial_value: int = ..., overflow: int = ..., little_endian: bool = ..., allow_wraparound: bool = ..., disable_shortcut: bool = ...): ...
diff --git a/typeshed/third_party/2and3/Crypto/Util/RFC1751.pyi b/typeshed/third_party/2and3/Crypto/Util/RFC1751.pyi
new file mode 100644
index 0000000..abd7444
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Util/RFC1751.pyi
@@ -0,0 +1,13 @@
+# Stubs for Crypto.Util.RFC1751 (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+__revision__ = ... # type: str
+binary = ... # type: Any
+
+def key_to_english(key): ...
+def english_to_key(s): ...
+
+wordlist = ... # type: Any
diff --git a/typeshed/third_party/2and3/Crypto/Util/__init__.pyi b/typeshed/third_party/2and3/Crypto/Util/__init__.pyi
new file mode 100644
index 0000000..26f6576
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Util/__init__.pyi
@@ -0,0 +1,10 @@
+# Stubs for Crypto.Util (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+# Names in __all__ with no definition:
+# RFC1751
+# asn1
+# number
+# randpool
+# strxor
diff --git a/typeshed/third_party/2and3/Crypto/Util/asn1.pyi b/typeshed/third_party/2and3/Crypto/Util/asn1.pyi
new file mode 100644
index 0000000..b9227af
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Util/asn1.pyi
@@ -0,0 +1,49 @@
+# Stubs for Crypto.Util.asn1 (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+class DerObject:
+ typeTags = ... # type: Any
+ typeTag = ... # type: Any
+ payload = ... # type: Any
+ def __init__(self, ASN1Type: Optional[Any] = ..., payload: Any = ...) -> None: ...
+ def isType(self, ASN1Type): ...
+ def encode(self): ...
+ def decode(self, derEle, noLeftOvers: int = ...): ...
+
+class DerInteger(DerObject):
+ value = ... # type: Any
+ def __init__(self, value: int = ...) -> None: ...
+ payload = ... # type: Any
+ def encode(self): ...
+ def decode(self, derEle, noLeftOvers: int = ...): ...
+
+class DerSequence(DerObject):
+ def __init__(self, startSeq: Optional[Any] = ...) -> None: ...
+ def __delitem__(self, n): ...
+ def __getitem__(self, n): ...
+ def __setitem__(self, key, value): ...
+ def __setslice__(self, i, j, sequence): ...
+ def __delslice__(self, i, j): ...
+ def __getslice__(self, i, j): ...
+ def __len__(self): ...
+ def append(self, item): ...
+ def hasInts(self): ...
+ def hasOnlyInts(self): ...
+ payload = ... # type: Any
+ def encode(self): ...
+ def decode(self, derEle, noLeftOvers: int = ...): ...
+
+class DerOctetString(DerObject):
+ payload = ... # type: Any
+ def __init__(self, value: Any = ...) -> None: ...
+ def decode(self, derEle, noLeftOvers: int = ...): ...
+
+class DerNull(DerObject):
+ def __init__(self) -> None: ...
+
+class DerObjectId(DerObject):
+ def __init__(self) -> None: ...
+ def decode(self, derEle, noLeftOvers: int = ...): ...
diff --git a/typeshed/third_party/2and3/Crypto/Util/number.pyi b/typeshed/third_party/2and3/Crypto/Util/number.pyi
new file mode 100644
index 0000000..265f142
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Util/number.pyi
@@ -0,0 +1,26 @@
+# Stubs for Crypto.Util.number (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+from warnings import warn as _warn
+
+__revision__ = ... # type: str
+bignum = ... # type: Any
+
+def size(N): ...
+def getRandomNumber(N, randfunc: Optional[Any] = ...): ...
+def getRandomInteger(N, randfunc: Optional[Any] = ...): ...
+def getRandomRange(a, b, randfunc: Optional[Any] = ...): ...
+def getRandomNBitInteger(N, randfunc: Optional[Any] = ...): ...
+def GCD(x, y): ...
+def inverse(u, v): ...
+def getPrime(N, randfunc: Optional[Any] = ...): ...
+def getStrongPrime(N, e: int = ..., false_positive_prob: float = ..., randfunc: Optional[Any] = ...): ...
+def isPrime(N, false_positive_prob: float = ..., randfunc: Optional[Any] = ...): ...
+def long_to_bytes(n, blocksize: int = ...): ...
+def bytes_to_long(s): ...
+def long2str(n, blocksize: int = ...): ...
+def str2long(s): ...
+
+sieve_base = ... # type: Any
diff --git a/typeshed/third_party/2and3/Crypto/Util/randpool.pyi b/typeshed/third_party/2and3/Crypto/Util/randpool.pyi
new file mode 100644
index 0000000..4a5f2ac
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Util/randpool.pyi
@@ -0,0 +1,20 @@
+# Stubs for Crypto.Util.randpool (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+__revision__ = ... # type: str
+
+class RandomPool:
+ bytes = ... # type: Any
+ bits = ... # type: Any
+ entropy = ... # type: Any
+ def __init__(self, numbytes: int = ..., cipher: Optional[Any] = ..., hash: Optional[Any] = ..., file: Optional[Any] = ...) -> None: ...
+ def get_bytes(self, N): ...
+ def randomize(self, N: int = ...): ...
+ def stir(self, s: str = ...): ...
+ def stir_n(self, N: int = ...): ...
+ def add_event(self, s: str = ...): ...
+ def getBytes(self, N): ...
+ def addEvent(self, event, s: str = ...): ...
diff --git a/typeshed/third_party/2and3/Crypto/Util/strxor.pyi b/typeshed/third_party/2and3/Crypto/Util/strxor.pyi
new file mode 100644
index 0000000..8ba57b5
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/Util/strxor.pyi
@@ -0,0 +1,6 @@
+# Stubs for Crypto.Util.strxor (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+def strxor(*args, **kwargs): ...
+def strxor_c(*args, **kwargs): ...
diff --git a/typeshed/third_party/2and3/Crypto/__init__.pyi b/typeshed/third_party/2and3/Crypto/__init__.pyi
new file mode 100644
index 0000000..7b99b04
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/__init__.pyi
@@ -0,0 +1,11 @@
+# Stubs for Crypto (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+# Names in __all__ with no definition:
+# Cipher
+# Hash
+# Protocol
+# PublicKey
+# Signature
+# Util
diff --git a/typeshed/third_party/2and3/Crypto/pct_warnings.pyi b/typeshed/third_party/2and3/Crypto/pct_warnings.pyi
new file mode 100644
index 0000000..6fb4fc8
--- /dev/null
+++ b/typeshed/third_party/2and3/Crypto/pct_warnings.pyi
@@ -0,0 +1,11 @@
+# Stubs for Crypto.pct_warnings (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+class CryptoWarning(Warning): ...
+class CryptoDeprecationWarning(DeprecationWarning, CryptoWarning): ...
+class CryptoRuntimeWarning(RuntimeWarning, CryptoWarning): ...
+class RandomPool_DeprecationWarning(CryptoDeprecationWarning): ...
+class ClockRewindWarning(CryptoRuntimeWarning): ...
+class GetRandomNumber_DeprecationWarning(CryptoDeprecationWarning): ...
+class PowmInsecureWarning(CryptoRuntimeWarning): ...
diff --git a/typeshed/third_party/2and3/atomicwrites/__init__.pyi b/typeshed/third_party/2and3/atomicwrites/__init__.pyi
new file mode 100644
index 0000000..34d74fb
--- /dev/null
+++ b/typeshed/third_party/2and3/atomicwrites/__init__.pyi
@@ -0,0 +1,16 @@
+import contextlib
+import os
+import sys
+import tempfile
+from typing import Any, AnyStr, Callable, IO, Iterator, Text
+def replace_atomic(src: AnyStr, dst: AnyStr) -> None: ...
+def move_atomic(src: AnyStr, dst: AnyStr) -> None: ...
+class AtomicWriter(object):
+ def __init__(self, path: AnyStr, mode: Text='w', overwrite: bool=False) -> None: ...
+ def open(self) -> contextlib.ContextManager[IO]: ...
+ def _open(self, get_fileobject: Callable) -> contextlib.ContextManager[IO]: ...
+ def get_fileobject(self, dir: AnyStr=None, **kwargs) -> IO: ...
+ def sync(self, f: IO) -> None: ...
+ def commit(self, f: IO) -> None: ...
+ def rollback(self, f: IO) -> None: ...
+def atomic_write(path: AnyStr, writer_cls: type=AtomicWriter, **cls_kwargs) -> contextlib.ContextManager[IO]: ...
diff --git a/mypy/test/__init__.py b/typeshed/third_party/2and3/backports/__init__.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/third_party/2and3/backports/__init__.pyi
diff --git a/typeshed/third_party/2and3/backports/ssl_match_hostname.pyi b/typeshed/third_party/2and3/backports/ssl_match_hostname.pyi
new file mode 100644
index 0000000..c219980
--- /dev/null
+++ b/typeshed/third_party/2and3/backports/ssl_match_hostname.pyi
@@ -0,0 +1,3 @@
+class CertificateError(ValueError): ...
+
+def match_hostname(cert, hostname): ...
diff --git a/typeshed/third_party/2and3/backports_abc.pyi b/typeshed/third_party/2and3/backports_abc.pyi
new file mode 100644
index 0000000..1b4c3a2
--- /dev/null
+++ b/typeshed/third_party/2and3/backports_abc.pyi
@@ -0,0 +1,19 @@
+# Stubs for backports_abc (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+def mk_gen(): ...
+def mk_awaitable(): ...
+def mk_coroutine(): ...
+
+Generator = ... # type: Any
+Awaitable = ... # type: Any
+Coroutine = ... # type: Any
+
+def isawaitable(obj): ...
+
+PATCHED = ... # type: Any
+
+def patch(patch_inspect=True): ...
diff --git a/typeshed/third_party/2and3/boto/__init__.pyi b/typeshed/third_party/2and3/boto/__init__.pyi
new file mode 100644
index 0000000..a95c1df
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/__init__.pyi
@@ -0,0 +1,80 @@
+# Stubs for boto (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional, Text
+import logging
+
+from .s3.connection import S3Connection
+
+Version = ... # type: Any
+UserAgent = ... # type: Any
+config = ... # type: Any
+BUCKET_NAME_RE = ... # type: Any
+TOO_LONG_DNS_NAME_COMP = ... # type: Any
+GENERATION_RE = ... # type: Any
+VERSION_RE = ... # type: Any
+ENDPOINTS_PATH = ... # type: Any
+
+def init_logging(): ...
+
+class NullHandler(logging.Handler):
+ def emit(self, record): ...
+
+log = ... # type: Any
+perflog = ... # type: Any
+
+def set_file_logger(name, filepath, level: Any = ..., format_string: Optional[Any] = ...): ...
+def set_stream_logger(name, level: Any = ..., format_string: Optional[Any] = ...): ...
+def connect_sqs(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_s3(aws_access_key_id: Optional[Text] = ..., aws_secret_access_key: Optional[Text] = ..., **kwargs) -> S3Connection: ...
+def connect_gs(gs_access_key_id: Optional[Any] = ..., gs_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_ec2(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_elb(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_autoscale(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_cloudwatch(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_sdb(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_fps(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_mturk(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_cloudfront(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_vpc(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_rds(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_rds2(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_emr(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_sns(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_iam(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_route53(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_cloudformation(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_euca(host: Optional[Any] = ..., aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., port: int = ..., path: str = ..., is_secure: bool = ..., **kwargs): ...
+def connect_glacier(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_ec2_endpoint(url, aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_walrus(host: Optional[Any] = ..., aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., port: int = ..., path: str = ..., is_secure: bool = ..., **kwargs): ...
+def connect_ses(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_sts(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_ia(ia_access_key_id: Optional[Any] = ..., ia_secret_access_key: Optional[Any] = ..., is_secure: bool = ..., **kwargs): ...
+def connect_dynamodb(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_swf(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_cloudsearch(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_cloudsearch2(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., sign_request: bool = ..., **kwargs): ...
+def connect_cloudsearchdomain(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_beanstalk(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_elastictranscoder(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_opsworks(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_redshift(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_support(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_cloudtrail(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_directconnect(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_kinesis(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_logs(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_route53domains(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_cognito_identity(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_cognito_sync(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_kms(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_awslambda(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_codedeploy(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_configservice(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_cloudhsm(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_ec2containerservice(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def connect_machinelearning(aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., **kwargs): ...
+def storage_uri(uri_str, default_scheme: str = ..., debug: int = ..., validate: bool = ..., bucket_storage_uri_class: Any = ..., suppress_consec_slashes: bool = ..., is_latest: bool = ...): ...
+def storage_uri_for_key(key): ...
diff --git a/typeshed/third_party/2and3/boto/auth.pyi b/typeshed/third_party/2and3/boto/auth.pyi
new file mode 100644
index 0000000..8fdf6ae
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/auth.pyi
@@ -0,0 +1,112 @@
+# Stubs for boto.auth (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+from boto.auth_handler import AuthHandler
+
+SIGV4_DETECT = ... # type: Any
+
+class HmacKeys:
+ host = ... # type: Any
+ def __init__(self, host, config, provider) -> None: ...
+ def update_provider(self, provider): ...
+ def algorithm(self): ...
+ def sign_string(self, string_to_sign): ...
+
+class AnonAuthHandler(AuthHandler, HmacKeys):
+ capability = ... # type: Any
+ def __init__(self, host, config, provider) -> None: ...
+ def add_auth(self, http_request, **kwargs): ...
+
+class HmacAuthV1Handler(AuthHandler, HmacKeys):
+ capability = ... # type: Any
+ def __init__(self, host, config, provider) -> None: ...
+ def update_provider(self, provider): ...
+ def add_auth(self, http_request, **kwargs): ...
+
+class HmacAuthV2Handler(AuthHandler, HmacKeys):
+ capability = ... # type: Any
+ def __init__(self, host, config, provider) -> None: ...
+ def update_provider(self, provider): ...
+ def add_auth(self, http_request, **kwargs): ...
+
+class HmacAuthV3Handler(AuthHandler, HmacKeys):
+ capability = ... # type: Any
+ def __init__(self, host, config, provider) -> None: ...
+ def add_auth(self, http_request, **kwargs): ...
+
+class HmacAuthV3HTTPHandler(AuthHandler, HmacKeys):
+ capability = ... # type: Any
+ def __init__(self, host, config, provider) -> None: ...
+ def headers_to_sign(self, http_request): ...
+ def canonical_headers(self, headers_to_sign): ...
+ def string_to_sign(self, http_request): ...
+ def add_auth(self, req, **kwargs): ...
+
+class HmacAuthV4Handler(AuthHandler, HmacKeys):
+ capability = ... # type: Any
+ service_name = ... # type: Any
+ region_name = ... # type: Any
+ def __init__(self, host, config, provider, service_name: Optional[Any] = ..., region_name: Optional[Any] = ...) -> None: ...
+ def headers_to_sign(self, http_request): ...
+ def host_header(self, host, http_request): ...
+ def query_string(self, http_request): ...
+ def canonical_query_string(self, http_request): ...
+ def canonical_headers(self, headers_to_sign): ...
+ def signed_headers(self, headers_to_sign): ...
+ def canonical_uri(self, http_request): ...
+ def payload(self, http_request): ...
+ def canonical_request(self, http_request): ...
+ def scope(self, http_request): ...
+ def split_host_parts(self, host): ...
+ def determine_region_name(self, host): ...
+ def determine_service_name(self, host): ...
+ def credential_scope(self, http_request): ...
+ def string_to_sign(self, http_request, canonical_request): ...
+ def signature(self, http_request, string_to_sign): ...
+ def add_auth(self, req, **kwargs): ...
+
+class S3HmacAuthV4Handler(HmacAuthV4Handler, AuthHandler):
+ capability = ... # type: Any
+ region_name = ... # type: Any
+ def __init__(self, *args, **kwargs) -> None: ...
+ def clean_region_name(self, region_name): ...
+ def canonical_uri(self, http_request): ...
+ def canonical_query_string(self, http_request): ...
+ def host_header(self, host, http_request): ...
+ def headers_to_sign(self, http_request): ...
+ def determine_region_name(self, host): ...
+ def determine_service_name(self, host): ...
+ def mangle_path_and_params(self, req): ...
+ def payload(self, http_request): ...
+ def add_auth(self, req, **kwargs): ...
+ def presign(self, req, expires, iso_date: Optional[Any] = ...): ...
+
+class STSAnonHandler(AuthHandler):
+ capability = ... # type: Any
+ def add_auth(self, http_request, **kwargs): ...
+
+class QuerySignatureHelper(HmacKeys):
+ def add_auth(self, http_request, **kwargs): ...
+
+class QuerySignatureV0AuthHandler(QuerySignatureHelper, AuthHandler):
+ SignatureVersion = ... # type: int
+ capability = ... # type: Any
+
+class QuerySignatureV1AuthHandler(QuerySignatureHelper, AuthHandler):
+ SignatureVersion = ... # type: int
+ capability = ... # type: Any
+ def __init__(self, *args, **kw) -> None: ...
+
+class QuerySignatureV2AuthHandler(QuerySignatureHelper, AuthHandler):
+ SignatureVersion = ... # type: int
+ capability = ... # type: Any
+
+class POSTPathQSV2AuthHandler(QuerySignatureV2AuthHandler, AuthHandler):
+ capability = ... # type: Any
+ def add_auth(self, req, **kwargs): ...
+
+def get_auth_handler(host, config, provider, requested_capability: Optional[Any] = ...): ...
+def detect_potential_sigv4(func): ...
+def detect_potential_s3sigv4(func): ...
diff --git a/typeshed/third_party/2and3/boto/auth_handler.pyi b/typeshed/third_party/2and3/boto/auth_handler.pyi
new file mode 100644
index 0000000..097f762
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/auth_handler.pyi
@@ -0,0 +1,13 @@
+# Stubs for boto.auth_handler (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from boto.plugin import Plugin
+
+class NotReadyToAuthenticate(Exception): ...
+
+class AuthHandler(Plugin):
+ capability = ... # type: Any
+ def __init__(self, host, config, provider) -> None: ...
+ def add_auth(self, http_request): ...
diff --git a/typeshed/third_party/2and3/boto/compat.pyi b/typeshed/third_party/2and3/boto/compat.pyi
new file mode 100644
index 0000000..85539f8
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/compat.pyi
@@ -0,0 +1,14 @@
+# Stubs for boto.compat (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from base64 import encodestring as encodebytes
+
+from six.moves import http_client
+
+expanduser = ... # type: Any
+StandardError = ... # type: Any
+long_type = ... # type: Any
+unquote_str = ... # type: Any
+parse_qs_safe = ... # type: Any
diff --git a/typeshed/third_party/2and3/boto/connection.pyi b/typeshed/third_party/2and3/boto/connection.pyi
new file mode 100644
index 0000000..c8275b8
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/connection.pyi
@@ -0,0 +1,119 @@
+# Stubs for boto.connection (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Dict, Optional, Text
+from six.moves import http_client
+
+HAVE_HTTPS_CONNECTION = ... # type: bool
+ON_APP_ENGINE = ... # type: Any
+PORTS_BY_SECURITY = ... # type: Any
+DEFAULT_CA_CERTS_FILE = ... # type: Any
+
+class HostConnectionPool:
+ queue = ... # type: Any
+ def __init__(self) -> None: ...
+ def size(self): ...
+ def put(self, conn): ...
+ def get(self): ...
+ def clean(self): ...
+
+class ConnectionPool:
+ CLEAN_INTERVAL = ... # type: float
+ STALE_DURATION = ... # type: float
+ host_to_pool = ... # type: Any
+ last_clean_time = ... # type: float
+ mutex = ... # type: Any
+ def __init__(self) -> None: ...
+ def size(self): ...
+ def get_http_connection(self, host, port, is_secure): ...
+ def put_http_connection(self, host, port, is_secure, conn): ...
+ def clean(self): ...
+
+class HTTPRequest:
+ method = ... # type: Any
+ protocol = ... # type: Any
+ host = ... # type: Any
+ port = ... # type: Any
+ path = ... # type: Any
+ auth_path = ... # type: Any
+ params = ... # type: Any
+ headers = ... # type: Any
+ body = ... # type: Any
+ def __init__(self, method, protocol, host, port, path, auth_path, params, headers, body) -> None: ...
+ def authorize(self, connection, **kwargs): ...
+
+class HTTPResponse(http_client.HTTPResponse):
+ def __init__(self, *args, **kwargs) -> None: ...
+ def read(self, amt: Optional[Any] = ...): ...
+
+class AWSAuthConnection:
+ suppress_consec_slashes = ... # type: Any
+ num_retries = ... # type: int
+ is_secure = ... # type: Any
+ https_validate_certificates = ... # type: Any
+ ca_certificates_file = ... # type: Any
+ port = ... # type: Any
+ http_exceptions = ... # type: Any
+ http_unretryable_exceptions = ... # type: Any
+ socket_exception_values = ... # type: Any
+ https_connection_factory = ... # type: Any
+ protocol = ... # type: str
+ host = ... # type: Any
+ path = ... # type: Any
+ debug = ... # type: Any
+ host_header = ... # type: Any
+ http_connection_kwargs = ... # type: Any
+ provider = ... # type: Any
+ auth_service_name = ... # type: Any
+ request_hook = ... # type: Any
+ def __init__(self, host, aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., is_secure: bool = ..., port: Optional[Any] = ..., proxy: Optional[Any] = ..., proxy_port: Optional[Any] = ..., proxy_user: Optional[Any] = ..., proxy_pass: Optional[Any] = ..., debug: int = ..., https_connection_factory: Optional[Any] = ..., path: str = ..., provider: str = ..., security_token: Optional[Any] = ..., suppress_consec_slashes: bool = ..., validate_certs: bool = .. [...]
+ auth_region_name = ... # type: Any
+ @property
+ def connection(self): ...
+ @property
+ def aws_access_key_id(self): ...
+ @property
+ def gs_access_key_id(self): ... # type: Any
+ access_key = ... # type: Any
+ @property
+ def aws_secret_access_key(self): ...
+ @property
+ def gs_secret_access_key(self): ...
+ secret_key = ... # type: Any
+ @property
+ def profile_name(self): ...
+ def get_path(self, path: str = ...): ...
+ def server_name(self, port: Optional[Any] = ...): ...
+ proxy = ... # type: Any
+ proxy_port = ... # type: Any
+ proxy_user = ... # type: Any
+ proxy_pass = ... # type: Any
+ no_proxy = ... # type: Any
+ use_proxy = ... # type: Any
+ def handle_proxy(self, proxy, proxy_port, proxy_user, proxy_pass): ...
+ def get_http_connection(self, host, port, is_secure): ...
+ def skip_proxy(self, host): ...
+ def new_http_connection(self, host, port, is_secure): ...
+ def put_http_connection(self, host, port, is_secure, connection): ...
+ def proxy_ssl(self, host: Optional[Any] = ..., port: Optional[Any] = ...): ...
+ def prefix_proxy_to_path(self, path, host: Optional[Any] = ...): ...
+ def get_proxy_auth_header(self): ...
+ def get_proxy_url_with_auth(self): ...
+ def set_host_header(self, request): ...
+ def set_request_hook(self, hook): ...
+ def build_base_http_request(self, method, path, auth_path, params: Optional[Any] = ..., headers: Optional[Any] = ..., data: str = ..., host: Optional[Any] = ...): ...
+ def make_request(self, method, path, headers: Optional[Any] = ..., data: str = ..., host: Optional[Any] = ..., auth_path: Optional[Any] = ..., sender: Optional[Any] = ..., override_num_retries: Optional[Any] = ..., params: Optional[Any] = ..., retry_handler: Optional[Any] = ...): ...
+ def close(self): ...
+
+class AWSQueryConnection(AWSAuthConnection):
+ APIVersion = ... # type: str
+ ResponseError = ... # type: Any
+ def __init__(self, aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., is_secure: bool = ..., port: Optional[Any] = ..., proxy: Optional[Any] = ..., proxy_port: Optional[Any] = ..., proxy_user: Optional[Any] = ..., proxy_pass: Optional[Any] = ..., host: Optional[Any] = ..., debug: int = ..., https_connection_factory: Optional[Any] = ..., path: str = ..., security_token: Optional[Any] = ..., validate_certs: bool = ..., profile_name: Optional[Any] = ..., [...]
+ def get_utf8_value(self, value): ...
+ def make_request(self, action, params: Optional[Any] = ..., path: str = ..., verb: str = ..., *args, **kwargs): ... # type: ignore # https://github.com/python/mypy/issues/1237
+ def build_list_params(self, params, items, label): ...
+ def build_complex_list_params(self, params, items, label, names): ...
+ def get_list(self, action, params, markers, path: str = ..., parent: Optional[Any] = ..., verb: str = ...): ...
+ def get_object(self, action, params, cls, path: str = ..., parent: Optional[Any] = ..., verb: str = ...): ...
+ def get_status(self, action, params, path: str = ..., parent: Optional[Any] = ..., verb: str = ...): ...
diff --git a/typeshed/third_party/2and3/boto/ec2/__init__.pyi b/typeshed/third_party/2and3/boto/ec2/__init__.pyi
new file mode 100644
index 0000000..64fa781
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/ec2/__init__.pyi
@@ -0,0 +1,11 @@
+# Stubs for boto.ec2 (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+RegionData = ... # type: Any
+
+def regions(**kw_params): ...
+def connect_to_region(region_name, **kw_params): ...
+def get_region(region_name, **kw_params): ...
diff --git a/typeshed/third_party/2and3/boto/elb/__init__.pyi b/typeshed/third_party/2and3/boto/elb/__init__.pyi
new file mode 100644
index 0000000..82e17fa
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/elb/__init__.pyi
@@ -0,0 +1,43 @@
+# Stubs for boto.ec2.elb (Python 2)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from boto.connection import AWSQueryConnection
+
+RegionData = ... # type: Any
+
+def regions(): ...
+def connect_to_region(region_name, **kw_params): ...
+
+class ELBConnection(AWSQueryConnection):
+ APIVersion = ... # type: Any
+ DefaultRegionName = ... # type: Any
+ DefaultRegionEndpoint = ... # type: Any
+ region = ... # type: Any
+ def __init__(self, aws_access_key_id=..., aws_secret_access_key=..., is_secure=..., port=..., proxy=..., proxy_port=..., proxy_user=..., proxy_pass=..., debug=..., https_connection_factory=..., region=..., path=..., security_token=..., validate_certs=..., profile_name=...) -> None: ...
+ def build_list_params(self, params, items, label): ...
+ def get_all_load_balancers(self, load_balancer_names=..., marker=...): ...
+ def create_load_balancer(self, name, zones, listeners=..., subnets=..., security_groups=..., scheme=..., complex_listeners=...): ...
+ def create_load_balancer_listeners(self, name, listeners=..., complex_listeners=...): ...
+ def delete_load_balancer(self, name): ...
+ def delete_load_balancer_listeners(self, name, ports): ...
+ def enable_availability_zones(self, load_balancer_name, zones_to_add): ...
+ def disable_availability_zones(self, load_balancer_name, zones_to_remove): ...
+ def modify_lb_attribute(self, load_balancer_name, attribute, value): ...
+ def get_all_lb_attributes(self, load_balancer_name): ...
+ def get_lb_attribute(self, load_balancer_name, attribute): ...
+ def register_instances(self, load_balancer_name, instances): ...
+ def deregister_instances(self, load_balancer_name, instances): ...
+ def describe_instance_health(self, load_balancer_name, instances=...): ...
+ def configure_health_check(self, name, health_check): ...
+ def set_lb_listener_SSL_certificate(self, lb_name, lb_port, ssl_certificate_id): ...
+ def create_app_cookie_stickiness_policy(self, name, lb_name, policy_name): ...
+ def create_lb_cookie_stickiness_policy(self, cookie_expiration_period, lb_name, policy_name): ...
+ def create_lb_policy(self, lb_name, policy_name, policy_type, policy_attributes): ...
+ def delete_lb_policy(self, lb_name, policy_name): ...
+ def set_lb_policies_of_listener(self, lb_name, lb_port, policies): ...
+ def set_lb_policies_of_backend_server(self, lb_name, instance_port, policies): ...
+ def apply_security_groups_to_lb(self, name, security_groups): ...
+ def attach_lb_to_subnets(self, name, subnets): ...
+ def detach_lb_from_subnets(self, name, subnets): ...
diff --git a/typeshed/third_party/2and3/boto/exception.pyi b/typeshed/third_party/2and3/boto/exception.pyi
new file mode 100644
index 0000000..83778af
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/exception.pyi
@@ -0,0 +1,150 @@
+# Stubs for boto.exception (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+from boto.compat import StandardError
+
+class BotoClientError(StandardError):
+ reason = ... # type: Any
+ def __init__(self, reason, *args) -> None: ...
+
+class SDBPersistenceError(StandardError): ...
+class StoragePermissionsError(BotoClientError): ...
+class S3PermissionsError(StoragePermissionsError): ...
+class GSPermissionsError(StoragePermissionsError): ...
+
+class BotoServerError(StandardError):
+ status = ... # type: Any
+ reason = ... # type: Any
+ body = ... # type: Any
+ request_id = ... # type: Any
+ error_code = ... # type: Any
+ message = ... # type: str
+ box_usage = ... # type: Any
+ def __init__(self, status, reason, body: Optional[Any] = ..., *args) -> None: ...
+ def __getattr__(self, name): ...
+ def __setattr__(self, name, value): ...
+ def startElement(self, name, attrs, connection): ...
+ def endElement(self, name, value, connection): ...
+
+class ConsoleOutput:
+ parent = ... # type: Any
+ instance_id = ... # type: Any
+ timestamp = ... # type: Any
+ comment = ... # type: Any
+ output = ... # type: Any
+ def __init__(self, parent: Optional[Any] = ...) -> None: ...
+ def startElement(self, name, attrs, connection): ...
+ def endElement(self, name, value, connection): ...
+
+class StorageCreateError(BotoServerError):
+ bucket = ... # type: Any
+ def __init__(self, status, reason, body: Optional[Any] = ...) -> None: ...
+ def endElement(self, name, value, connection): ...
+
+class S3CreateError(StorageCreateError): ...
+class GSCreateError(StorageCreateError): ...
+class StorageCopyError(BotoServerError): ...
+class S3CopyError(StorageCopyError): ...
+class GSCopyError(StorageCopyError): ...
+
+class SQSError(BotoServerError):
+ detail = ... # type: Any
+ type = ... # type: Any
+ def __init__(self, status, reason, body: Optional[Any] = ...) -> None: ...
+ def startElement(self, name, attrs, connection): ...
+ def endElement(self, name, value, connection): ...
+
+class SQSDecodeError(BotoClientError):
+ message = ... # type: Any
+ def __init__(self, reason, message) -> None: ...
+
+class StorageResponseError(BotoServerError):
+ resource = ... # type: Any
+ def __init__(self, status, reason, body: Optional[Any] = ...) -> None: ...
+ def startElement(self, name, attrs, connection): ...
+ def endElement(self, name, value, connection): ...
+
+class S3ResponseError(StorageResponseError): ...
+class GSResponseError(StorageResponseError): ...
+
+class EC2ResponseError(BotoServerError):
+ errors = ... # type: Any
+ def __init__(self, status, reason, body: Optional[Any] = ...) -> None: ...
+ def startElement(self, name, attrs, connection): ...
+ request_id = ... # type: Any
+ def endElement(self, name, value, connection): ...
+
+class JSONResponseError(BotoServerError):
+ status = ... # type: Any
+ reason = ... # type: Any
+ body = ... # type: Any
+ error_message = ... # type: Any
+ error_code = ... # type: Any
+ def __init__(self, status, reason, body: Optional[Any] = ..., *args) -> None: ...
+
+class DynamoDBResponseError(JSONResponseError): ...
+class SWFResponseError(JSONResponseError): ...
+class EmrResponseError(BotoServerError): ...
+
+class _EC2Error:
+ connection = ... # type: Any
+ error_code = ... # type: Any
+ error_message = ... # type: Any
+ def __init__(self, connection: Optional[Any] = ...) -> None: ...
+ def startElement(self, name, attrs, connection): ...
+ def endElement(self, name, value, connection): ...
+
+class SDBResponseError(BotoServerError): ...
+class AWSConnectionError(BotoClientError): ...
+class StorageDataError(BotoClientError): ...
+class S3DataError(StorageDataError): ...
+class GSDataError(StorageDataError): ...
+
+class InvalidUriError(Exception):
+ message = ... # type: Any
+ def __init__(self, message) -> None: ...
+
+class InvalidAclError(Exception):
+ message = ... # type: Any
+ def __init__(self, message) -> None: ...
+
+class InvalidCorsError(Exception):
+ message = ... # type: Any
+ def __init__(self, message) -> None: ...
+
+class NoAuthHandlerFound(Exception): ...
+
+class InvalidLifecycleConfigError(Exception):
+ message = ... # type: Any
+ def __init__(self, message) -> None: ...
+
+class ResumableTransferDisposition:
+ START_OVER = ... # type: str
+ WAIT_BEFORE_RETRY = ... # type: str
+ ABORT_CUR_PROCESS = ... # type: str
+ ABORT = ... # type: str
+
+class ResumableUploadException(Exception):
+ message = ... # type: Any
+ disposition = ... # type: Any
+ def __init__(self, message, disposition) -> None: ...
+
+class ResumableDownloadException(Exception):
+ message = ... # type: Any
+ disposition = ... # type: Any
+ def __init__(self, message, disposition) -> None: ...
+
+class TooManyRecordsException(Exception):
+ message = ... # type: Any
+ def __init__(self, message) -> None: ...
+
+class PleaseRetryException(Exception):
+ message = ... # type: Any
+ response = ... # type: Any
+ def __init__(self, message, response: Optional[Any] = ...) -> None: ...
+
+class InvalidInstanceMetadataError(Exception):
+ MSG = ... # type: str
+ def __init__(self, msg) -> None: ...
diff --git a/typeshed/third_party/2and3/boto/plugin.pyi b/typeshed/third_party/2and3/boto/plugin.pyi
new file mode 100644
index 0000000..37b9721
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/plugin.pyi
@@ -0,0 +1,13 @@
+# Stubs for boto.plugin (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+class Plugin:
+ capability = ... # type: Any
+ @classmethod
+ def is_capable(cls, requested_capability): ...
+
+def get_plugin(cls, requested_capability: Optional[Any] = ...): ...
+def load_plugins(config): ...
diff --git a/typeshed/third_party/2and3/boto/regioninfo.pyi b/typeshed/third_party/2and3/boto/regioninfo.pyi
new file mode 100644
index 0000000..9dbb46f
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/regioninfo.pyi
@@ -0,0 +1,20 @@
+# Stubs for boto.regioninfo (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+def load_endpoint_json(path): ...
+def merge_endpoints(defaults, additions): ...
+def load_regions(): ...
+def get_regions(service_name, region_cls: Optional[Any] = ..., connection_cls: Optional[Any] = ...): ...
+
+class RegionInfo:
+ connection = ... # type: Any
+ name = ... # type: Any
+ endpoint = ... # type: Any
+ connection_cls = ... # type: Any
+ def __init__(self, connection: Optional[Any] = ..., name: Optional[Any] = ..., endpoint: Optional[Any] = ..., connection_cls: Optional[Any] = ...) -> None: ...
+ def startElement(self, name, attrs, connection): ...
+ def endElement(self, name, value, connection): ...
+ def connect(self, **kw_params): ...
diff --git a/typeshed/third_party/2and3/boto/s3/__init__.pyi b/typeshed/third_party/2and3/boto/s3/__init__.pyi
new file mode 100644
index 0000000..b359694
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/s3/__init__.pyi
@@ -0,0 +1,16 @@
+# Stubs for boto.s3 (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from .connection import S3Connection
+
+from boto.connection import AWSAuthConnection
+from boto.regioninfo import RegionInfo
+
+from typing import List, Type, Text
+
+class S3RegionInfo(RegionInfo):
+ def connect(self, name: Text=None, endpoint: str=None, connection_cls: Type[AWSAuthConnection]=None, **kw_params) -> S3Connection: ...
+
+def regions() -> List[S3RegionInfo]: ...
+def connect_to_region(region_name: Text, **kw_params): ...
diff --git a/typeshed/third_party/2and3/boto/s3/acl.pyi b/typeshed/third_party/2and3/boto/s3/acl.pyi
new file mode 100644
index 0000000..8813009
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/s3/acl.pyi
@@ -0,0 +1,43 @@
+# Stubs for boto.s3.acl (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from .connection import S3Connection
+from .user import User
+from typing import Any, Dict, Optional, List, Text, Union
+
+CannedACLStrings = ... # type: List[str]
+
+class Policy:
+ parent = ... # type: Any
+ namespace = ... # type: Any
+ acl = ... # type: ACL
+ def __init__(self, parent: Optional[Any] = ...) -> None: ...
+ owner = ... # type: User
+ def startElement(self, name: Text, attrs: Dict[str, Any], connection: S3Connection) -> Union[None, User, ACL]: ...
+ def endElement(self, name: Text, value: Any, connection: S3Connection) -> None: ...
+ def to_xml(self) -> str: ...
+
+class ACL:
+ policy = ... # type: Policy
+ grants = ... # type: List[Grant]
+ def __init__(self, policy: Optional[Policy] = ...) -> None: ...
+ def add_grant(self, grant: Grant) -> None: ...
+ def add_email_grant(self, permission: Text, email_address: Text) -> None: ...
+ def add_user_grant(self, permission: Text, user_id: Text, display_name: Optional[Text] = ...) -> None: ...
+ def startElement(self, name, attrs, connection): ...
+ def endElement(self, name: Text, value: Any, connection: S3Connection) -> None: ...
+ def to_xml(self) -> str: ...
+
+class Grant:
+ NameSpace = ... # type: Text
+ permission = ... # type: Text
+ id = ... # type: Text
+ display_name = ... # type: Text
+ uri = ... # type: Text
+ email_address = ... # type: Text
+ type = ... # type: Text
+ def __init__(self, permission: Optional[Text] = ..., type: Optional[Text] = ..., id: Optional[Text] = ..., display_name: Optional[Text] = ..., uri: Optional[Text] = ..., email_address: Optional[Text] = ...) -> None: ...
+ def startElement(self, name, attrs, connection): ...
+ def endElement(self, name: Text, value: Any, connection: S3Connection) -> None: ...
+ def to_xml(self) -> str: ...
diff --git a/typeshed/third_party/2and3/boto/s3/bucket.pyi b/typeshed/third_party/2and3/boto/s3/bucket.pyi
new file mode 100644
index 0000000..3b6efb6
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/s3/bucket.pyi
@@ -0,0 +1,98 @@
+# Stubs for boto.s3.bucket (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from .bucketlistresultset import BucketListResultSet
+from .connection import S3Connection
+from .key import Key
+
+from typing import Any, Dict, Optional, Text, Type
+
+class S3WebsiteEndpointTranslate:
+ trans_region = ... # type: Dict[str, str]
+ @classmethod
+ def translate_region(self, reg: Text) -> str: ...
+
+S3Permissions = ... # type: List[str]
+
+class Bucket:
+ LoggingGroup = ... # type: str
+ BucketPaymentBody = ... # type: str
+ VersioningBody = ... # type: str
+ VersionRE = ... # type: str
+ MFADeleteRE = ... # type: str
+ name = ... # type: Text
+ connection = ... # type: S3Connection
+ key_class = ... # type: Type[Key]
+ def __init__(self, connection: Optional[S3Connection] = ..., name: Optional[Text] = ..., key_class: Type[Key] = ...) -> None: ...
+ def __iter__(self): ...
+ def __contains__(self, key_name) -> bool: ...
+ def startElement(self, name, attrs, connection): ...
+ creation_date = ... # type: Any
+ def endElement(self, name, value, connection): ...
+ def set_key_class(self, key_class): ...
+ def lookup(self, key_name, headers: Optional[Dict[Text, Text]] = ...): ...
+ def get_key(self, key_name, headers: Optional[Dict[Text, Text]] = ..., version_id: Optional[Any] = ..., response_headers: Optional[Dict[Text, Text]] = ..., validate: bool = ...) -> Key: ...
+ def list(self, prefix: Text = ..., delimiter: Text = ..., marker: Text = ..., headers: Optional[Dict[Text, Text]] = ..., encoding_type: Optional[Any] = ...) -> BucketListResultSet: ...
+ def list_versions(self, prefix: str = ..., delimiter: str = ..., key_marker: str = ..., version_id_marker: str = ..., headers: Optional[Dict[Text, Text]] = ..., encoding_type: Optional[Text] = ...) -> BucketListResultSet: ...
+ def list_multipart_uploads(self, key_marker: str = ..., upload_id_marker: str = ..., headers: Optional[Dict[Text, Text]] = ..., encoding_type: Optional[Any] = ...): ...
+ def validate_kwarg_names(self, kwargs, names): ...
+ def get_all_keys(self, headers: Optional[Dict[Text, Text]] = ..., **params): ...
+ def get_all_versions(self, headers: Optional[Dict[Text, Text]] = ..., **params): ...
+ def validate_get_all_versions_params(self, params): ...
+ def get_all_multipart_uploads(self, headers: Optional[Dict[Text, Text]] = ..., **params): ...
+ def new_key(self, key_name: Optional[Any] = ...): ...
+ def generate_url(self, expires_in, method: str = ..., headers: Optional[Dict[Text, Text]] = ..., force_http: bool = ..., response_headers: Optional[Dict[Text, Text]] = ..., expires_in_absolute: bool = ...): ...
+ def delete_keys(self, keys, quiet: bool = ..., mfa_token: Optional[Any] = ..., headers: Optional[Dict[Text, Text]] = ...): ...
+ def delete_key(self, key_name, headers: Optional[Dict[Text, Text]] = ..., version_id: Optional[Any] = ..., mfa_token: Optional[Any] = ...): ...
+ def copy_key(self, new_key_name, src_bucket_name, src_key_name, metadata: Optional[Any] = ..., src_version_id: Optional[Any] = ..., storage_class: str = ..., preserve_acl: bool = ..., encrypt_key: bool = ..., headers: Optional[Dict[Text, Text]] = ..., query_args: Optional[Any] = ...): ...
+ def set_canned_acl(self, acl_str, key_name: str = ..., headers: Optional[Dict[Text, Text]] = ..., version_id: Optional[Any] = ...): ...
+ def get_xml_acl(self, key_name: str = ..., headers: Optional[Dict[Text, Text]] = ..., version_id: Optional[Any] = ...): ...
+ def set_xml_acl(self, acl_str, key_name: str = ..., headers: Optional[Dict[Text, Text]] = ..., version_id: Optional[Any] = ..., query_args: str = ...): ...
+ def set_acl(self, acl_or_str, key_name: str = ..., headers: Optional[Dict[Text, Text]] = ..., version_id: Optional[Any] = ...): ...
+ def get_acl(self, key_name: str = ..., headers: Optional[Dict[Text, Text]] = ..., version_id: Optional[Any] = ...): ...
+ def set_subresource(self, subresource, value, key_name: str = ..., headers: Optional[Dict[Text, Text]] = ..., version_id: Optional[Any] = ...): ...
+ def get_subresource(self, subresource, key_name: str = ..., headers: Optional[Dict[Text, Text]] = ..., version_id: Optional[Any] = ...): ...
+ def make_public(self, recursive: bool = ..., headers: Optional[Dict[Text, Text]] = ...): ...
+ def add_email_grant(self, permission, email_address, recursive: bool = ..., headers: Optional[Dict[Text, Text]] = ...): ...
+ def add_user_grant(self, permission, user_id, recursive: bool = ..., headers: Optional[Dict[Text, Text]] = ..., display_name: Optional[Any] = ...): ...
+ def list_grants(self, headers: Optional[Dict[Text, Text]] = ...): ...
+ def get_location(self): ...
+ def set_xml_logging(self, logging_str, headers: Optional[Dict[Text, Text]] = ...): ...
+ def enable_logging(self, target_bucket, target_prefix: str = ..., grants: Optional[Any] = ..., headers: Optional[Dict[Text, Text]] = ...): ...
+ def disable_logging(self, headers: Optional[Dict[Text, Text]] = ...): ...
+ def get_logging_status(self, headers: Optional[Dict[Text, Text]] = ...): ...
+ def set_as_logging_target(self, headers: Optional[Dict[Text, Text]] = ...): ...
+ def get_request_payment(self, headers: Optional[Dict[Text, Text]] = ...): ...
+ def set_request_payment(self, payer: str = ..., headers: Optional[Dict[Text, Text]] = ...): ...
+ def configure_versioning(self, versioning, mfa_delete: bool = ..., mfa_token: Optional[Any] = ..., headers: Optional[Dict[Text, Text]] = ...): ...
+ def get_versioning_status(self, headers: Optional[Dict[Text, Text]] = ...): ...
+ def configure_lifecycle(self, lifecycle_config, headers: Optional[Dict[Text, Text]] = ...): ...
+ def get_lifecycle_config(self, headers: Optional[Dict[Text, Text]] = ...): ...
+ def delete_lifecycle_configuration(self, headers: Optional[Dict[Text, Text]] = ...): ...
+ def configure_website(self, suffix: Optional[Any] = ..., error_key: Optional[Any] = ..., redirect_all_requests_to: Optional[Any] = ..., routing_rules: Optional[Any] = ..., headers: Optional[Dict[Text, Text]] = ...): ...
+ def set_website_configuration(self, config, headers: Optional[Dict[Text, Text]] = ...): ...
+ def set_website_configuration_xml(self, xml, headers: Optional[Dict[Text, Text]] = ...): ...
+ def get_website_configuration(self, headers: Optional[Dict[Text, Text]] = ...): ...
+ def get_website_configuration_obj(self, headers: Optional[Dict[Text, Text]] = ...): ...
+ def get_website_configuration_with_xml(self, headers: Optional[Dict[Text, Text]] = ...): ...
+ def get_website_configuration_xml(self, headers: Optional[Dict[Text, Text]] = ...): ...
+ def delete_website_configuration(self, headers: Optional[Dict[Text, Text]] = ...): ...
+ def get_website_endpoint(self): ...
+ def get_policy(self, headers: Optional[Dict[Text, Text]] = ...): ...
+ def set_policy(self, policy, headers: Optional[Dict[Text, Text]] = ...): ...
+ def delete_policy(self, headers: Optional[Dict[Text, Text]] = ...): ...
+ def set_cors_xml(self, cors_xml, headers: Optional[Dict[Text, Text]] = ...): ...
+ def set_cors(self, cors_config, headers: Optional[Dict[Text, Text]] = ...): ...
+ def get_cors_xml(self, headers: Optional[Dict[Text, Text]] = ...): ...
+ def get_cors(self, headers: Optional[Dict[Text, Text]] = ...): ...
+ def delete_cors(self, headers: Optional[Dict[Text, Text]] = ...): ...
+ def initiate_multipart_upload(self, key_name, headers: Optional[Dict[Text, Text]] = ..., reduced_redundancy: bool = ..., metadata: Optional[Any] = ..., encrypt_key: bool = ..., policy: Optional[Any] = ...): ...
+ def complete_multipart_upload(self, key_name, upload_id, xml_body, headers: Optional[Dict[Text, Text]] = ...): ...
+ def cancel_multipart_upload(self, key_name, upload_id, headers: Optional[Dict[Text, Text]] = ...): ...
+ def delete(self, headers: Optional[Dict[Text, Text]] = ...): ...
+ def get_tags(self): ...
+ def get_xml_tags(self): ...
+ def set_xml_tags(self, tag_str, headers: Optional[Dict[Text, Text]] = ..., query_args: str = ...): ...
+ def set_tags(self, tags, headers: Optional[Dict[Text, Text]] = ...): ...
+ def delete_tags(self, headers: Optional[Dict[Text, Text]] = ...): ...
diff --git a/typeshed/third_party/2and3/boto/s3/bucketlistresultset.pyi b/typeshed/third_party/2and3/boto/s3/bucketlistresultset.pyi
new file mode 100644
index 0000000..97e79b0
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/s3/bucketlistresultset.pyi
@@ -0,0 +1,44 @@
+# Stubs for boto.s3.bucketlistresultset (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from .bucket import Bucket
+from .key import Key
+
+from typing import Any, Iterable, Iterator, Optional
+
+def bucket_lister(bucket, prefix: str = ..., delimiter: str = ..., marker: str = ..., headers: Optional[Any] = ..., encoding_type: Optional[Any] = ...): ...
+
+class BucketListResultSet(Iterable[Key]):
+ bucket = ... # type: Any
+ prefix = ... # type: Any
+ delimiter = ... # type: Any
+ marker = ... # type: Any
+ headers = ... # type: Any
+ encoding_type = ... # type: Any
+ def __init__(self, bucket: Optional[Any] = ..., prefix: str = ..., delimiter: str = ..., marker: str = ..., headers: Optional[Any] = ..., encoding_type: Optional[Any] = ...) -> None: ...
+ def __iter__(self) -> Iterator[Key]: ...
+
+def versioned_bucket_lister(bucket, prefix: str = ..., delimiter: str = ..., key_marker: str = ..., version_id_marker: str = ..., headers: Optional[Any] = ..., encoding_type: Optional[Any] = ...): ...
+
+class VersionedBucketListResultSet:
+ bucket = ... # type: Any
+ prefix = ... # type: Any
+ delimiter = ... # type: Any
+ key_marker = ... # type: Any
+ version_id_marker = ... # type: Any
+ headers = ... # type: Any
+ encoding_type = ... # type: Any
+ def __init__(self, bucket: Optional[Any] = ..., prefix: str = ..., delimiter: str = ..., key_marker: str = ..., version_id_marker: str = ..., headers: Optional[Any] = ..., encoding_type: Optional[Any] = ...) -> None: ...
+ def __iter__(self) -> Iterator[Key]: ...
+
+def multipart_upload_lister(bucket, key_marker: str = ..., upload_id_marker: str = ..., headers: Optional[Any] = ..., encoding_type: Optional[Any] = ...): ...
+
+class MultiPartUploadListResultSet:
+ bucket = ... # type: Any
+ key_marker = ... # type: Any
+ upload_id_marker = ... # type: Any
+ headers = ... # type: Any
+ encoding_type = ... # type: Any
+ def __init__(self, bucket: Optional[Any] = ..., key_marker: str = ..., upload_id_marker: str = ..., headers: Optional[Any] = ..., encoding_type: Optional[Any] = ...) -> None: ...
+ def __iter__(self): ...
diff --git a/typeshed/third_party/2and3/boto/s3/bucketlogging.pyi b/typeshed/third_party/2and3/boto/s3/bucketlogging.pyi
new file mode 100644
index 0000000..a3f83a5
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/s3/bucketlogging.pyi
@@ -0,0 +1,15 @@
+# Stubs for boto.s3.bucketlogging (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+class BucketLogging:
+ target = ... # type: Any
+ prefix = ... # type: Any
+ grants = ... # type: Any
+ def __init__(self, target: Optional[Any] = ..., prefix: Optional[Any] = ..., grants: Optional[Any] = ...) -> None: ...
+ def add_grant(self, grant): ...
+ def startElement(self, name, attrs, connection): ...
+ def endElement(self, name, value, connection): ...
+ def to_xml(self): ...
diff --git a/typeshed/third_party/2and3/boto/s3/connection.pyi b/typeshed/third_party/2and3/boto/s3/connection.pyi
new file mode 100644
index 0000000..73661f0
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/s3/connection.pyi
@@ -0,0 +1,71 @@
+# Stubs for boto.s3.connection (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from .bucket import Bucket
+
+from typing import Any, Dict, Optional, Text, Type
+from boto.connection import AWSAuthConnection
+from boto.exception import BotoClientError
+
+def check_lowercase_bucketname(n): ...
+def assert_case_insensitive(f): ...
+
+class _CallingFormat:
+ def get_bucket_server(self, server, bucket): ...
+ def build_url_base(self, connection, protocol, server, bucket, key: str = ...): ...
+ def build_host(self, server, bucket): ...
+ def build_auth_path(self, bucket, key: str = ...): ...
+ def build_path_base(self, bucket, key: str = ...): ...
+
+class SubdomainCallingFormat(_CallingFormat):
+ def get_bucket_server(self, server, bucket): ...
+
+class VHostCallingFormat(_CallingFormat):
+ def get_bucket_server(self, server, bucket): ...
+
+class OrdinaryCallingFormat(_CallingFormat):
+ def get_bucket_server(self, server, bucket): ...
+ def build_path_base(self, bucket, key: str = ...): ...
+
+class ProtocolIndependentOrdinaryCallingFormat(OrdinaryCallingFormat):
+ def build_url_base(self, connection, protocol, server, bucket, key: str = ...): ...
+
+class Location:
+ DEFAULT = ... # type: str
+ EU = ... # type: str
+ EUCentral1 = ... # type: str
+ USWest = ... # type: str
+ USWest2 = ... # type: str
+ SAEast = ... # type: str
+ APNortheast = ... # type: str
+ APSoutheast = ... # type: str
+ APSoutheast2 = ... # type: str
+ CNNorth1 = ... # type: str
+
+class NoHostProvided: ...
+class HostRequiredError(BotoClientError): ...
+
+class S3Connection(AWSAuthConnection):
+ DefaultHost = ... # type: Any
+ DefaultCallingFormat = ... # type: Any
+ QueryString = ... # type: str
+ calling_format = ... # type: Any
+ bucket_class = ... # type: Type[Bucket]
+ anon = ... # type: Any
+ def __init__(self, aws_access_key_id: Optional[Any] = ..., aws_secret_access_key: Optional[Any] = ..., is_secure: bool = ..., port: Optional[Any] = ..., proxy: Optional[Any] = ..., proxy_port: Optional[Any] = ..., proxy_user: Optional[Any] = ..., proxy_pass: Optional[Any] = ..., host: Any = ..., debug: int = ..., https_connection_factory: Optional[Any] = ..., calling_format: Any = ..., path: str = ..., provider: str = ..., bucket_class: Type[Bucket] = ..., security_token: Optional[An [...]
+ def __iter__(self): ...
+ def __contains__(self, bucket_name): ...
+ def set_bucket_class(self, bucket_class: Type[Bucket]) -> None: ...
+ def build_post_policy(self, expiration_time, conditions): ...
+ def build_post_form_args(self, bucket_name, key, expires_in: int = ..., acl: Optional[Any] = ..., success_action_redirect: Optional[Any] = ..., max_content_length: Optional[Any] = ..., http_method: str = ..., fields: Optional[Any] = ..., conditions: Optional[Any] = ..., storage_class: str = ..., server_side_encryption: Optional[Any] = ...): ...
+ def generate_url_sigv4(self, expires_in, method, bucket: str = ..., key: str = ..., headers: Optional[Dict[Text, Text]] = ..., force_http: bool = ..., response_headers: Optional[Dict[Text, Text]] = ..., version_id: Optional[Any] = ..., iso_date: Optional[Any] = ...): ...
+ def generate_url(self, expires_in, method, bucket: str = ..., key: str = ..., headers: Optional[Dict[Text, Text]] = ..., query_auth: bool = ..., force_http: bool = ..., response_headers: Optional[Dict[Text, Text]] = ..., expires_in_absolute: bool = ..., version_id: Optional[Any] = ...): ...
+ def get_all_buckets(self, headers: Optional[Dict[Text, Text]] = ...): ...
+ def get_canonical_user_id(self, headers: Optional[Dict[Text, Text]] = ...): ...
+ def get_bucket(self, bucket_name: Text, validate: bool = ..., headers: Optional[Dict[Text, Text]] = ...) -> Bucket: ...
+ def head_bucket(self, bucket_name, headers: Optional[Dict[Text, Text]] = ...): ...
+ def lookup(self, bucket_name, validate: bool = ..., headers: Optional[Dict[Text, Text]] = ...): ...
+ def create_bucket(self, bucket_name, headers: Optional[Dict[Text, Text]] = ..., location: Any = ..., policy: Optional[Any] = ...): ...
+ def delete_bucket(self, bucket, headers: Optional[Dict[Text, Text]] = ...): ...
+ def make_request(self, method, bucket: str = ..., key: str = ..., headers: Optional[Any] = ..., data: str = ..., query_args: Optional[Any] = ..., sender: Optional[Any] = ..., override_num_retries: Optional[Any] = ..., retry_handler: Optional[Any] = ..., *args, **kwargs): ... # type: ignore # https://github.com/python/mypy/issues/1237
diff --git a/typeshed/third_party/2and3/boto/s3/cors.pyi b/typeshed/third_party/2and3/boto/s3/cors.pyi
new file mode 100644
index 0000000..07f49b0
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/s3/cors.pyi
@@ -0,0 +1,23 @@
+# Stubs for boto.s3.cors (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+class CORSRule:
+ allowed_method = ... # type: Any
+ allowed_origin = ... # type: Any
+ id = ... # type: Any
+ allowed_header = ... # type: Any
+ max_age_seconds = ... # type: Any
+ expose_header = ... # type: Any
+ def __init__(self, allowed_method: Optional[Any] = ..., allowed_origin: Optional[Any] = ..., id: Optional[Any] = ..., allowed_header: Optional[Any] = ..., max_age_seconds: Optional[Any] = ..., expose_header: Optional[Any] = ...) -> None: ...
+ def startElement(self, name, attrs, connection): ...
+ def endElement(self, name, value, connection): ...
+ def to_xml(self) -> str: ...
+
+class CORSConfiguration(list):
+ def startElement(self, name, attrs, connection): ...
+ def endElement(self, name, value, connection): ...
+ def to_xml(self) -> str: ...
+ def add_rule(self, allowed_method, allowed_origin, id: Optional[Any] = ..., allowed_header: Optional[Any] = ..., max_age_seconds: Optional[Any] = ..., expose_header: Optional[Any] = ...): ...
diff --git a/typeshed/third_party/2and3/boto/s3/deletemarker.pyi b/typeshed/third_party/2and3/boto/s3/deletemarker.pyi
new file mode 100644
index 0000000..cf7bc64
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/s3/deletemarker.pyi
@@ -0,0 +1,16 @@
+# Stubs for boto.s3.deletemarker (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+class DeleteMarker:
+ bucket = ... # type: Any
+ name = ... # type: Any
+ version_id = ... # type: Any
+ is_latest = ... # type: bool
+ last_modified = ... # type: Any
+ owner = ... # type: Any
+ def __init__(self, bucket: Optional[Any] = ..., name: Optional[Any] = ...) -> None: ...
+ def startElement(self, name, attrs, connection): ...
+ def endElement(self, name, value, connection): ...
diff --git a/typeshed/third_party/2and3/boto/s3/key.pyi b/typeshed/third_party/2and3/boto/s3/key.pyi
new file mode 100644
index 0000000..f7232b7
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/s3/key.pyi
@@ -0,0 +1,91 @@
+# Stubs for boto.s3.key (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Callable, Dict, Optional, Text
+
+class Key:
+ DefaultContentType = ... # type: str
+ RestoreBody = ... # type: str
+ BufferSize = ... # type: Any
+ base_user_settable_fields = ... # type: Any
+ base_fields = ... # type: Any
+ bucket = ... # type: Any
+ name = ... # type: str
+ metadata = ... # type: Any
+ cache_control = ... # type: Any
+ content_type = ... # type: Any
+ content_encoding = ... # type: Any
+ content_disposition = ... # type: Any
+ content_language = ... # type: Any
+ filename = ... # type: Any
+ etag = ... # type: Any
+ is_latest = ... # type: bool
+ last_modified = ... # type: Any
+ owner = ... # type: Any
+ path = ... # type: Any
+ resp = ... # type: Any
+ mode = ... # type: Any
+ size = ... # type: Any
+ version_id = ... # type: Any
+ source_version_id = ... # type: Any
+ delete_marker = ... # type: bool
+ encrypted = ... # type: Any
+ ongoing_restore = ... # type: Any
+ expiry_date = ... # type: Any
+ local_hashes = ... # type: Any
+ def __init__(self, bucket: Optional[Any] = ..., name: Optional[Any] = ...) -> None: ...
+ def __iter__(self): ...
+ @property
+ def provider(self): ...
+ key = ... # type: Any
+ md5 = ... # type: Any
+ base64md5 = ... # type: Any
+ storage_class = ... # type: Any
+ def get_md5_from_hexdigest(self, md5_hexdigest): ...
+ def handle_encryption_headers(self, resp): ...
+ def handle_version_headers(self, resp, force: bool = ...): ...
+ def handle_restore_headers(self, response): ...
+ def handle_addl_headers(self, headers): ...
+ def open_read(self, headers: Optional[Dict[Text, Text]] = ..., query_args: str = ..., override_num_retries: Optional[Any] = ..., response_headers: Optional[Dict[Text, Text]] = ...): ...
+ def open_write(self, headers: Optional[Dict[Text, Text]] = ..., override_num_retries: Optional[Any] = ...): ...
+ def open(self, mode: str = ..., headers: Optional[Dict[Text, Text]] = ..., query_args: Optional[Any] = ..., override_num_retries: Optional[Any] = ...): ...
+ closed = ... # type: bool
+ def close(self, fast: bool = ...): ...
+ def next(self): ...
+ __next__ = ... # type: Any
+ def read(self, size: int = ...): ...
+ def change_storage_class(self, new_storage_class, dst_bucket: Optional[Any] = ..., validate_dst_bucket: bool = ...): ...
+ def copy(self, dst_bucket, dst_key, metadata: Optional[Any] = ..., reduced_redundancy: bool = ..., preserve_acl: bool = ..., encrypt_key: bool = ..., validate_dst_bucket: bool = ...): ...
+ def startElement(self, name, attrs, connection): ...
+ def endElement(self, name, value, connection): ...
+ def exists(self, headers: Optional[Dict[Text, Text]] = ...): ...
+ def delete(self, headers: Optional[Dict[Text, Text]] = ...): ...
+ def get_metadata(self, name): ...
+ def set_metadata(self, name, value): ...
+ def update_metadata(self, d): ...
+ def set_acl(self, acl_str, headers: Optional[Dict[Text, Text]] = ...): ...
+ def get_acl(self, headers: Optional[Dict[Text, Text]] = ...): ...
+ def get_xml_acl(self, headers: Optional[Dict[Text, Text]] = ...): ...
+ def set_xml_acl(self, acl_str, headers: Optional[Dict[Text, Text]] = ...): ...
+ def set_canned_acl(self, acl_str, headers: Optional[Dict[Text, Text]] = ...): ...
+ def get_redirect(self): ...
+ def set_redirect(self, redirect_location, headers: Optional[Dict[Text, Text]] = ...): ...
+ def make_public(self, headers: Optional[Dict[Text, Text]] = ...): ...
+ def generate_url(self, expires_in, method: str = ..., headers: Optional[Dict[Text, Text]] = ..., query_auth: bool = ..., force_http: bool = ..., response_headers: Optional[Dict[Text, Text]] = ..., expires_in_absolute: bool = ..., version_id: Optional[Any] = ..., policy: Optional[Any] = ..., reduced_redundancy: bool = ..., encrypt_key: bool = ...): ...
+ def send_file(self, fp, headers: Optional[Dict[Text, Text]] = ..., cb: Optional[Callable[[int, int], Any]] = ..., num_cb: int = ..., query_args: Optional[Any] = ..., chunked_transfer: bool = ..., size: Optional[Any] = ...): ...
+ def should_retry(self, response, chunked_transfer: bool = ...): ...
+ def compute_md5(self, fp, size: Optional[Any] = ...): ...
+ def set_contents_from_stream(self, fp, headers: Optional[Dict[Text, Text]] = ..., replace: bool = ..., cb: Optional[Callable[[int, int], Any]] = ..., num_cb: int = ..., policy: Optional[Any] = ..., reduced_redundancy: bool = ..., query_args: Optional[Any] = ..., size: Optional[Any] = ...): ...
+ def set_contents_from_file(self, fp, headers: Optional[Dict[Text, Text]] = ..., replace: bool = ..., cb: Optional[Callable[[int, int], Any]] = ..., num_cb: int = ..., policy: Optional[Any] = ..., md5: Optional[Any] = ..., reduced_redundancy: bool = ..., query_args: Optional[Any] = ..., encrypt_key: bool = ..., size: Optional[Any] = ..., rewind: bool = ...): ...
+ def set_contents_from_filename(self, filename, headers: Optional[Dict[Text, Text]] = ..., replace: bool = ..., cb: Optional[Callable[[int, int], Any]] = ..., num_cb: int = ..., policy: Optional[Any] = ..., md5: Optional[Any] = ..., reduced_redundancy: bool = ..., encrypt_key: bool = ...): ...
+ def set_contents_from_string(self, string_data: Text, headers: Optional[Dict[Text, Text]] = ..., replace: bool = ..., cb: Optional[Callable[[int, int], Any]] = ..., num_cb: int = ..., policy: Optional[Any] = ..., md5: Optional[Any] = ..., reduced_redundancy: bool = ..., encrypt_key: bool = ...) -> None: ...
+ def get_file(self, fp, headers: Optional[Dict[Text, Text]] = ..., cb: Optional[Callable[[int, int], Any]] = ..., num_cb: int = ..., torrent: bool = ..., version_id: Optional[Any] = ..., override_num_retries: Optional[Any] = ..., response_headers: Optional[Dict[Text, Text]] = ...): ...
+ def get_torrent_file(self, fp, headers: Optional[Dict[Text, Text]] = ..., cb: Optional[Callable[[int, int], Any]] = ..., num_cb: int = ...): ...
+ def get_contents_to_file(self, fp, headers: Optional[Dict[Text, Text]] = ..., cb: Optional[Callable[[int, int], Any]] = ..., num_cb: int = ..., torrent: bool = ..., version_id: Optional[Any] = ..., res_download_handler: Optional[Any] = ..., response_headers: Optional[Dict[Text, Text]] = ...): ...
+ def get_contents_to_filename(self, filename, headers: Optional[Dict[Text, Text]] = ..., cb: Optional[Callable[[int, int], Any]] = ..., num_cb: int = ..., torrent: bool = ..., version_id: Optional[Any] = ..., res_download_handler: Optional[Any] = ..., response_headers: Optional[Dict[Text, Text]] = ...): ...
+ def get_contents_as_string(self, headers: Optional[Dict[Text, Text]] = ..., cb: Optional[Callable[[int, int], Any]] = ..., num_cb: int = ..., torrent: bool = ..., version_id: Optional[Any] = ..., response_headers: Optional[Dict[Text, Text]] = ..., encoding: Optional[Any] = ...) -> str: ...
+ def add_email_grant(self, permission, email_address, headers: Optional[Dict[Text, Text]] = ...): ...
+ def add_user_grant(self, permission, user_id, headers: Optional[Dict[Text, Text]] = ..., display_name: Optional[Any] = ...): ...
+ def set_remote_metadata(self, metadata_plus, metadata_minus, preserve_acl, headers: Optional[Dict[Text, Text]] = ...): ...
+ def restore(self, days, headers: Optional[Dict[Text, Text]] = ...): ...
diff --git a/typeshed/third_party/2and3/boto/s3/keyfile.pyi b/typeshed/third_party/2and3/boto/s3/keyfile.pyi
new file mode 100644
index 0000000..2fe5faa
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/s3/keyfile.pyi
@@ -0,0 +1,33 @@
+# Stubs for boto.s3.keyfile (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class KeyFile:
+ key = ... # type: Any
+ location = ... # type: int
+ closed = ... # type: bool
+ softspace = ... # type: int
+ mode = ... # type: str
+ encoding = ... # type: str
+ errors = ... # type: str
+ newlines = ... # type: str
+ name = ... # type: Any
+ def __init__(self, key) -> None: ...
+ def tell(self): ...
+ def seek(self, pos, whence: Any = ...): ...
+ def read(self, size): ...
+ def close(self): ...
+ def isatty(self): ...
+ def getkey(self): ...
+ def write(self, buf): ...
+ def fileno(self): ...
+ def flush(self): ...
+ def next(self): ...
+ def readinto(self): ...
+ def readline(self): ...
+ def readlines(self): ...
+ def truncate(self): ...
+ def writelines(self): ...
+ def xreadlines(self): ...
diff --git a/typeshed/third_party/2and3/boto/s3/lifecycle.pyi b/typeshed/third_party/2and3/boto/s3/lifecycle.pyi
new file mode 100644
index 0000000..c15048e
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/s3/lifecycle.pyi
@@ -0,0 +1,55 @@
+# Stubs for boto.s3.lifecycle (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+class Rule:
+ id = ... # type: Any
+ prefix = ... # type: Any
+ status = ... # type: Any
+ expiration = ... # type: Any
+ transition = ... # type: Any
+ def __init__(self, id: Optional[Any] = ..., prefix: Optional[Any] = ..., status: Optional[Any] = ..., expiration: Optional[Any] = ..., transition: Optional[Any] = ...) -> None: ...
+ def startElement(self, name, attrs, connection): ...
+ def endElement(self, name, value, connection): ...
+ def to_xml(self): ...
+
+class Expiration:
+ days = ... # type: Any
+ date = ... # type: Any
+ def __init__(self, days: Optional[Any] = ..., date: Optional[Any] = ...) -> None: ...
+ def startElement(self, name, attrs, connection): ...
+ def endElement(self, name, value, connection): ...
+ def to_xml(self): ...
+
+class Transition:
+ days = ... # type: Any
+ date = ... # type: Any
+ storage_class = ... # type: Any
+ def __init__(self, days: Optional[Any] = ..., date: Optional[Any] = ..., storage_class: Optional[Any] = ...) -> None: ...
+ def to_xml(self): ...
+
+class Transitions(list):
+ transition_properties = ... # type: int
+ current_transition_property = ... # type: int
+ temp_days = ... # type: Any
+ temp_date = ... # type: Any
+ temp_storage_class = ... # type: Any
+ def __init__(self) -> None: ...
+ def startElement(self, name, attrs, connection): ...
+ def endElement(self, name, value, connection): ...
+ def to_xml(self): ...
+ def add_transition(self, days: Optional[Any] = ..., date: Optional[Any] = ..., storage_class: Optional[Any] = ...): ...
+ @property
+ def days(self): ...
+ @property
+ def date(self): ...
+ @property
+ def storage_class(self): ...
+
+class Lifecycle(list):
+ def startElement(self, name, attrs, connection): ...
+ def endElement(self, name, value, connection): ...
+ def to_xml(self): ...
+ def add_rule(self, id: Optional[Any] = ..., prefix: str = ..., status: str = ..., expiration: Optional[Any] = ..., transition: Optional[Any] = ...): ...
diff --git a/typeshed/third_party/2and3/boto/s3/multidelete.pyi b/typeshed/third_party/2and3/boto/s3/multidelete.pyi
new file mode 100644
index 0000000..46449c4
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/s3/multidelete.pyi
@@ -0,0 +1,31 @@
+# Stubs for boto.s3.multidelete (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+class Deleted:
+ key = ... # type: Any
+ version_id = ... # type: Any
+ delete_marker = ... # type: Any
+ delete_marker_version_id = ... # type: Any
+ def __init__(self, key: Optional[Any] = ..., version_id: Optional[Any] = ..., delete_marker: bool = ..., delete_marker_version_id: Optional[Any] = ...) -> None: ...
+ def startElement(self, name, attrs, connection): ...
+ def endElement(self, name, value, connection): ...
+
+class Error:
+ key = ... # type: Any
+ version_id = ... # type: Any
+ code = ... # type: Any
+ message = ... # type: Any
+ def __init__(self, key: Optional[Any] = ..., version_id: Optional[Any] = ..., code: Optional[Any] = ..., message: Optional[Any] = ...) -> None: ...
+ def startElement(self, name, attrs, connection): ...
+ def endElement(self, name, value, connection): ...
+
+class MultiDeleteResult:
+ bucket = ... # type: Any
+ deleted = ... # type: Any
+ errors = ... # type: Any
+ def __init__(self, bucket: Optional[Any] = ...) -> None: ...
+ def startElement(self, name, attrs, connection): ...
+ def endElement(self, name, value, connection): ...
diff --git a/typeshed/third_party/2and3/boto/s3/multipart.pyi b/typeshed/third_party/2and3/boto/s3/multipart.pyi
new file mode 100644
index 0000000..2bc738f
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/s3/multipart.pyi
@@ -0,0 +1,53 @@
+# Stubs for boto.s3.multipart (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+class CompleteMultiPartUpload:
+ bucket = ... # type: Any
+ location = ... # type: Any
+ bucket_name = ... # type: Any
+ key_name = ... # type: Any
+ etag = ... # type: Any
+ version_id = ... # type: Any
+ encrypted = ... # type: Any
+ def __init__(self, bucket: Optional[Any] = ...) -> None: ...
+ def startElement(self, name, attrs, connection): ...
+ def endElement(self, name, value, connection): ...
+
+class Part:
+ bucket = ... # type: Any
+ part_number = ... # type: Any
+ last_modified = ... # type: Any
+ etag = ... # type: Any
+ size = ... # type: Any
+ def __init__(self, bucket: Optional[Any] = ...) -> None: ...
+ def startElement(self, name, attrs, connection): ...
+ def endElement(self, name, value, connection): ...
+
+def part_lister(mpupload, part_number_marker: Optional[Any] = ...): ...
+
+class MultiPartUpload:
+ bucket = ... # type: Any
+ bucket_name = ... # type: Any
+ key_name = ... # type: Any
+ id = ... # type: Any
+ initiator = ... # type: Any
+ owner = ... # type: Any
+ storage_class = ... # type: Any
+ initiated = ... # type: Any
+ part_number_marker = ... # type: Any
+ next_part_number_marker = ... # type: Any
+ max_parts = ... # type: Any
+ is_truncated = ... # type: bool
+ def __init__(self, bucket: Optional[Any] = ...) -> None: ...
+ def __iter__(self): ...
+ def to_xml(self): ...
+ def startElement(self, name, attrs, connection): ...
+ def endElement(self, name, value, connection): ...
+ def get_all_parts(self, max_parts: Optional[Any] = ..., part_number_marker: Optional[Any] = ..., encoding_type: Optional[Any] = ...): ...
+ def upload_part_from_file(self, fp, part_num, headers: Optional[Any] = ..., replace: bool = ..., cb: Optional[Any] = ..., num_cb: int = ..., md5: Optional[Any] = ..., size: Optional[Any] = ...): ...
+ def copy_part_from_key(self, src_bucket_name, src_key_name, part_num, start: Optional[Any] = ..., end: Optional[Any] = ..., src_version_id: Optional[Any] = ..., headers: Optional[Any] = ...): ...
+ def complete_upload(self): ...
+ def cancel_upload(self): ...
diff --git a/typeshed/third_party/2and3/boto/s3/prefix.pyi b/typeshed/third_party/2and3/boto/s3/prefix.pyi
new file mode 100644
index 0000000..12501b2
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/s3/prefix.pyi
@@ -0,0 +1,14 @@
+# Stubs for boto.s3.prefix (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+class Prefix:
+ bucket = ... # type: Any
+ name = ... # type: Any
+ def __init__(self, bucket: Optional[Any] = ..., name: Optional[Any] = ...) -> None: ...
+ def startElement(self, name, attrs, connection): ...
+ def endElement(self, name, value, connection): ...
+ @property
+ def provider(self): ...
diff --git a/typeshed/third_party/2and3/boto/s3/tagging.pyi b/typeshed/third_party/2and3/boto/s3/tagging.pyi
new file mode 100644
index 0000000..07c1fca
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/s3/tagging.pyi
@@ -0,0 +1,26 @@
+# Stubs for boto.s3.tagging (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+class Tag:
+ key = ... # type: Any
+ value = ... # type: Any
+ def __init__(self, key: Optional[Any] = ..., value: Optional[Any] = ...) -> None: ...
+ def startElement(self, name, attrs, connection): ...
+ def endElement(self, name, value, connection): ...
+ def to_xml(self): ...
+ def __eq__(self, other): ...
+
+class TagSet(list):
+ def startElement(self, name, attrs, connection): ...
+ def endElement(self, name, value, connection): ...
+ def add_tag(self, key, value): ...
+ def to_xml(self): ...
+
+class Tags(list):
+ def startElement(self, name, attrs, connection): ...
+ def endElement(self, name, value, connection): ...
+ def to_xml(self): ...
+ def add_tag_set(self, tag_set): ...
diff --git a/typeshed/third_party/2and3/boto/s3/user.pyi b/typeshed/third_party/2and3/boto/s3/user.pyi
new file mode 100644
index 0000000..21832e9
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/s3/user.pyi
@@ -0,0 +1,14 @@
+# Stubs for boto.s3.user (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+class User:
+ type = ... # type: Any
+ id = ... # type: Any
+ display_name = ... # type: Any
+ def __init__(self, parent: Optional[Any] = ..., id: str = ..., display_name: str = ...) -> None: ...
+ def startElement(self, name, attrs, connection): ...
+ def endElement(self, name, value, connection): ...
+ def to_xml(self, element_name: str = ...): ...
diff --git a/typeshed/third_party/2and3/boto/s3/website.pyi b/typeshed/third_party/2and3/boto/s3/website.pyi
new file mode 100644
index 0000000..f832077
--- /dev/null
+++ b/typeshed/third_party/2and3/boto/s3/website.pyi
@@ -0,0 +1,66 @@
+# Stubs for boto.s3.website (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+def tag(key, value): ...
+
+class WebsiteConfiguration:
+ suffix = ... # type: Any
+ error_key = ... # type: Any
+ redirect_all_requests_to = ... # type: Any
+ routing_rules = ... # type: Any
+ def __init__(self, suffix: Optional[Any] = ..., error_key: Optional[Any] = ..., redirect_all_requests_to: Optional[Any] = ..., routing_rules: Optional[Any] = ...) -> None: ...
+ def startElement(self, name, attrs, connection): ...
+ def endElement(self, name, value, connection): ...
+ def to_xml(self): ...
+
+class _XMLKeyValue:
+ translator = ... # type: Any
+ container = ... # type: Any
+ def __init__(self, translator, container: Optional[Any] = ...) -> None: ...
+ def startElement(self, name, attrs, connection): ...
+ def endElement(self, name, value, connection): ...
+ def to_xml(self): ...
+
+class RedirectLocation(_XMLKeyValue):
+ TRANSLATOR = ... # type: Any
+ hostname = ... # type: Any
+ protocol = ... # type: Any
+ def __init__(self, hostname: Optional[Any] = ..., protocol: Optional[Any] = ...) -> None: ...
+ def to_xml(self): ...
+
+class RoutingRules(list):
+ def add_rule(self, rule): ...
+ def startElement(self, name, attrs, connection): ...
+ def endElement(self, name, value, connection): ...
+ def to_xml(self): ...
+
+class RoutingRule:
+ condition = ... # type: Any
+ redirect = ... # type: Any
+ def __init__(self, condition: Optional[Any] = ..., redirect: Optional[Any] = ...) -> None: ...
+ def startElement(self, name, attrs, connection): ...
+ def endElement(self, name, value, connection): ...
+ def to_xml(self): ...
+ @classmethod
+ def when(cls, key_prefix: Optional[Any] = ..., http_error_code: Optional[Any] = ...): ...
+ def then_redirect(self, hostname: Optional[Any] = ..., protocol: Optional[Any] = ..., replace_key: Optional[Any] = ..., replace_key_prefix: Optional[Any] = ..., http_redirect_code: Optional[Any] = ...): ...
+
+class Condition(_XMLKeyValue):
+ TRANSLATOR = ... # type: Any
+ key_prefix = ... # type: Any
+ http_error_code = ... # type: Any
+ def __init__(self, key_prefix: Optional[Any] = ..., http_error_code: Optional[Any] = ...) -> None: ...
+ def to_xml(self): ...
+
+class Redirect(_XMLKeyValue):
+ TRANSLATOR = ... # type: Any
+ hostname = ... # type: Any
+ protocol = ... # type: Any
+ replace_key = ... # type: Any
+ replace_key_prefix = ... # type: Any
+ http_redirect_code = ... # type: Any
+ def __init__(self, hostname: Optional[Any] = ..., protocol: Optional[Any] = ..., replace_key: Optional[Any] = ..., replace_key_prefix: Optional[Any] = ..., http_redirect_code: Optional[Any] = ...) -> None: ...
+ def to_xml(self): ...
diff --git a/typeshed/third_party/2and3/certifi.pyi b/typeshed/third_party/2and3/certifi.pyi
new file mode 100644
index 0000000..c809e6d
--- /dev/null
+++ b/typeshed/third_party/2and3/certifi.pyi
@@ -0,0 +1,2 @@
+def where() -> str: ...
+def old_where() -> str: ...
diff --git a/typeshed/third_party/2and3/characteristic/__init__.pyi b/typeshed/third_party/2and3/characteristic/__init__.pyi
new file mode 100644
index 0000000..07e0f60
--- /dev/null
+++ b/typeshed/third_party/2and3/characteristic/__init__.pyi
@@ -0,0 +1,34 @@
+from typing import Sequence, Callable, Union, Any, Optional, AnyStr, TypeVar, Type
+
+def with_repr(attrs: Sequence[Union[AnyStr, Attribute]]) -> Callable[..., Any]: ...
+def with_cmp(attrs: Sequence[Union[AnyStr, Attribute]]) -> Callable[..., Any]: ...
+def with_init(attrs: Sequence[Union[AnyStr, Attribute]]) -> Callable[..., Any]: ...
+def immutable(attrs: Sequence[Union[AnyStr, Attribute]]) -> Callable[..., Any]: ...
+
+def strip_leading_underscores(attribute_name: AnyStr) -> AnyStr: ...
+
+NOTHING = Any
+
+T = TypeVar('T')
+
+def attributes(
+ attrs: Sequence[Union[AnyStr, Attribute]],
+ apply_with_cmp: bool = True,
+ apply_with_init: bool = True,
+ apply_with_repr: bool = True,
+ apply_immutable: bool = False,
+ store_attributes: Optional[Callable[[type, Attribute], Any]] = None,
+ **kw: Optional[dict]) -> Callable[[Type[T]], Type[T]]: ...
+
+class Attribute:
+ def __init__(
+ self,
+ name: AnyStr,
+ exclude_from_cmp: bool = False,
+ exclude_from_init: bool = False,
+ exclude_from_repr: bool = False,
+ exclude_from_immutable: bool = False,
+ default_value: Any = NOTHING,
+ default_factory: Optional[Callable[[None], Any]] = None,
+ instance_of: Optional[Any] = None,
+ init_aliaser: Optional[Callable[[AnyStr], AnyStr]] = strip_leading_underscores) -> None: ...
diff --git a/typeshed/third_party/2and3/jinja2/__init__.pyi b/typeshed/third_party/2and3/jinja2/__init__.pyi
new file mode 100644
index 0000000..e77f4fd
--- /dev/null
+++ b/typeshed/third_party/2and3/jinja2/__init__.pyi
@@ -0,0 +1,11 @@
+# Stubs for jinja2 (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from jinja2.environment import Environment as Environment, Template as Template
+from jinja2.loaders import BaseLoader as BaseLoader, FileSystemLoader as FileSystemLoader, PackageLoader as PackageLoader, DictLoader as DictLoader, FunctionLoader as FunctionLoader, PrefixLoader as PrefixLoader, ChoiceLoader as ChoiceLoader, ModuleLoader as ModuleLoader
+from jinja2.bccache import BytecodeCache as BytecodeCache, FileSystemBytecodeCache as FileSystemBytecodeCache, MemcachedBytecodeCache as MemcachedBytecodeCache
+from jinja2.runtime import Undefined as Undefined, DebugUndefined as DebugUndefined, StrictUndefined as StrictUndefined, make_logging_undefined as make_logging_undefined
+from jinja2.exceptions import TemplateError as TemplateError, UndefinedError as UndefinedError, TemplateNotFound as TemplateNotFound, TemplatesNotFound as TemplatesNotFound, TemplateSyntaxError as TemplateSyntaxError, TemplateAssertionError as TemplateAssertionError
+from jinja2.filters import environmentfilter as environmentfilter, contextfilter as contextfilter, evalcontextfilter as evalcontextfilter
+from jinja2.utils import Markup as Markup, escape as escape, clear_caches as clear_caches, environmentfunction as environmentfunction, evalcontextfunction as evalcontextfunction, contextfunction as contextfunction, is_undefined as is_undefined
diff --git a/typeshed/third_party/2and3/jinja2/_compat.pyi b/typeshed/third_party/2and3/jinja2/_compat.pyi
new file mode 100644
index 0000000..1c83f44
--- /dev/null
+++ b/typeshed/third_party/2and3/jinja2/_compat.pyi
@@ -0,0 +1,38 @@
+# Stubs for jinja2._compat (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+import sys
+
+if sys.version_info[0] >= 3:
+ from io import BytesIO
+ from urllib.parse import quote_from_bytes as url_quote
+else:
+ from cStringIO import StringIO as BytesIO
+ from urllib import quote as url_quote
+
+PY2 = ... # type: Any
+PYPY = ... # type: Any
+unichr = ... # type: Any
+range_type = ... # type: Any
+text_type = ... # type: Any
+string_types = ... # type: Any
+integer_types = ... # type: Any
+iterkeys = ... # type: Any
+itervalues = ... # type: Any
+iteritems = ... # type: Any
+NativeStringIO = ... # type: Any
+
+def reraise(tp, value, tb: Optional[Any] = ...): ...
+
+ifilter = ... # type: Any
+imap = ... # type: Any
+izip = ... # type: Any
+intern = ... # type: Any
+implements_iterator = ... # type: Any
+implements_to_string = ... # type: Any
+encode_filename = ... # type: Any
+get_next = ... # type: Any
+
+def with_metaclass(meta, *bases): ...
diff --git a/typeshed/third_party/2and3/jinja2/_stringdefs.pyi b/typeshed/third_party/2and3/jinja2/_stringdefs.pyi
new file mode 100644
index 0000000..d09bdbc
--- /dev/null
+++ b/typeshed/third_party/2and3/jinja2/_stringdefs.pyi
@@ -0,0 +1,44 @@
+# Stubs for jinja2._stringdefs (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+Cc = ... # type: str
+Cf = ... # type: str
+Cn = ... # type: str
+Co = ... # type: str
+Cs = ... # type: Any
+Ll = ... # type: str
+Lm = ... # type: str
+Lo = ... # type: str
+Lt = ... # type: str
+Lu = ... # type: str
+Mc = ... # type: str
+Me = ... # type: str
+Mn = ... # type: str
+Nd = ... # type: str
+Nl = ... # type: str
+No = ... # type: str
+Pc = ... # type: str
+Pd = ... # type: str
+Pe = ... # type: str
+Pf = ... # type: str
+Pi = ... # type: str
+Po = ... # type: str
+Ps = ... # type: str
+Sc = ... # type: str
+Sk = ... # type: str
+Sm = ... # type: str
+So = ... # type: str
+Zl = ... # type: str
+Zp = ... # type: str
+Zs = ... # type: str
+cats = ... # type: Any
+
+def combine(*args): ...
+
+xid_start = ... # type: str
+xid_continue = ... # type: str
+
+def allexcept(*args): ...
diff --git a/typeshed/third_party/2and3/jinja2/bccache.pyi b/typeshed/third_party/2and3/jinja2/bccache.pyi
new file mode 100644
index 0000000..ef03701
--- /dev/null
+++ b/typeshed/third_party/2and3/jinja2/bccache.pyi
@@ -0,0 +1,48 @@
+# Stubs for jinja2.bccache (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+marshal_dump = ... # type: Any
+marshal_load = ... # type: Any
+bc_version = ... # type: int
+bc_magic = ... # type: Any
+
+class Bucket:
+ environment = ... # type: Any
+ key = ... # type: Any
+ checksum = ... # type: Any
+ def __init__(self, environment, key, checksum) -> None: ...
+ code = ... # type: Any
+ def reset(self): ...
+ def load_bytecode(self, f): ...
+ def write_bytecode(self, f): ...
+ def bytecode_from_string(self, string): ...
+ def bytecode_to_string(self): ...
+
+class BytecodeCache:
+ def load_bytecode(self, bucket): ...
+ def dump_bytecode(self, bucket): ...
+ def clear(self): ...
+ def get_cache_key(self, name, filename: Optional[Any] = ...): ...
+ def get_source_checksum(self, source): ...
+ def get_bucket(self, environment, name, filename, source): ...
+ def set_bucket(self, bucket): ...
+
+class FileSystemBytecodeCache(BytecodeCache):
+ directory = ... # type: Any
+ pattern = ... # type: Any
+ def __init__(self, directory: Optional[Any] = ..., pattern: str = ...) -> None: ...
+ def load_bytecode(self, bucket): ...
+ def dump_bytecode(self, bucket): ...
+ def clear(self): ...
+
+class MemcachedBytecodeCache(BytecodeCache):
+ client = ... # type: Any
+ prefix = ... # type: Any
+ timeout = ... # type: Any
+ ignore_memcache_errors = ... # type: Any
+ def __init__(self, client, prefix: str = ..., timeout: Optional[Any] = ..., ignore_memcache_errors: bool = ...) -> None: ...
+ def load_bytecode(self, bucket): ...
+ def dump_bytecode(self, bucket): ...
diff --git a/typeshed/third_party/2and3/jinja2/compiler.pyi b/typeshed/third_party/2and3/jinja2/compiler.pyi
new file mode 100644
index 0000000..44e001c
--- /dev/null
+++ b/typeshed/third_party/2and3/jinja2/compiler.pyi
@@ -0,0 +1,180 @@
+# Stubs for jinja2.compiler (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+from keyword import iskeyword as is_python_keyword
+from jinja2.visitor import NodeVisitor
+
+operators = ... # type: Any
+dict_item_iter = ... # type: str
+
+unoptimize_before_dead_code = ... # type: bool
+
+def generate(node, environment, name, filename, stream: Optional[Any] = ..., defer_init: bool = ...): ...
+def has_safe_repr(value): ...
+def find_undeclared(nodes, names): ...
+
+class Identifiers:
+ declared = ... # type: Any
+ outer_undeclared = ... # type: Any
+ undeclared = ... # type: Any
+ declared_locally = ... # type: Any
+ declared_parameter = ... # type: Any
+ def __init__(self) -> None: ...
+ def add_special(self, name): ...
+ def is_declared(self, name): ...
+ def copy(self): ...
+
+class Frame:
+ eval_ctx = ... # type: Any
+ identifiers = ... # type: Any
+ toplevel = ... # type: bool
+ rootlevel = ... # type: bool
+ require_output_check = ... # type: Any
+ buffer = ... # type: Any
+ block = ... # type: Any
+ assigned_names = ... # type: Any
+ parent = ... # type: Any
+ def __init__(self, eval_ctx, parent: Optional[Any] = ...) -> None: ...
+ def copy(self): ...
+ def inspect(self, nodes): ...
+ def find_shadowed(self, extra: Any = ...): ...
+ def inner(self): ...
+ def soft(self): ...
+ __copy__ = ... # type: Any
+
+class VisitorExit(RuntimeError): ...
+
+class DependencyFinderVisitor(NodeVisitor):
+ filters = ... # type: Any
+ tests = ... # type: Any
+ def __init__(self) -> None: ...
+ def visit_Filter(self, node): ...
+ def visit_Test(self, node): ...
+ def visit_Block(self, node): ...
+
+class UndeclaredNameVisitor(NodeVisitor):
+ names = ... # type: Any
+ undeclared = ... # type: Any
+ def __init__(self, names) -> None: ...
+ def visit_Name(self, node): ...
+ def visit_Block(self, node): ...
+
+class FrameIdentifierVisitor(NodeVisitor):
+ identifiers = ... # type: Any
+ def __init__(self, identifiers) -> None: ...
+ def visit_Name(self, node): ...
+ def visit_If(self, node): ...
+ def visit_Macro(self, node): ...
+ def visit_Import(self, node): ...
+ def visit_FromImport(self, node): ...
+ def visit_Assign(self, node): ...
+ def visit_For(self, node): ...
+ def visit_CallBlock(self, node): ...
+ def visit_FilterBlock(self, node): ...
+ def visit_AssignBlock(self, node): ...
+ def visit_Scope(self, node): ...
+ def visit_Block(self, node): ...
+
+class CompilerExit(Exception): ...
+
+class CodeGenerator(NodeVisitor):
+ environment = ... # type: Any
+ name = ... # type: Any
+ filename = ... # type: Any
+ stream = ... # type: Any
+ created_block_context = ... # type: bool
+ defer_init = ... # type: Any
+ import_aliases = ... # type: Any
+ blocks = ... # type: Any
+ extends_so_far = ... # type: int
+ has_known_extends = ... # type: bool
+ code_lineno = ... # type: int
+ tests = ... # type: Any
+ filters = ... # type: Any
+ debug_info = ... # type: Any
+ def __init__(self, environment, name, filename, stream: Optional[Any] = ..., defer_init: bool = ...) -> None: ...
+ def fail(self, msg, lineno): ...
+ def temporary_identifier(self): ...
+ def buffer(self, frame): ...
+ def return_buffer_contents(self, frame): ...
+ def indent(self): ...
+ def outdent(self, step: int = ...): ...
+ def start_write(self, frame, node: Optional[Any] = ...): ...
+ def end_write(self, frame): ...
+ def simple_write(self, s, frame, node: Optional[Any] = ...): ...
+ def blockvisit(self, nodes, frame): ...
+ def write(self, x): ...
+ def writeline(self, x, node: Optional[Any] = ..., extra: int = ...): ...
+ def newline(self, node: Optional[Any] = ..., extra: int = ...): ...
+ def signature(self, node, frame, extra_kwargs: Optional[Any] = ...): ...
+ def pull_locals(self, frame): ...
+ def pull_dependencies(self, nodes): ...
+ def unoptimize_scope(self, frame): ...
+ def push_scope(self, frame, extra_vars: Any = ...): ...
+ def pop_scope(self, aliases, frame): ...
+ def function_scoping(self, node, frame, children: Optional[Any] = ..., find_special: bool = ...): ...
+ def macro_body(self, node, frame, children: Optional[Any] = ...): ...
+ def macro_def(self, node, frame): ...
+ def position(self, node): ...
+ def visit_Template(self, node, frame: Optional[Any] = ...): ...
+ def visit_Block(self, node, frame): ...
+ def visit_Extends(self, node, frame): ...
+ def visit_Include(self, node, frame): ...
+ def visit_Import(self, node, frame): ...
+ def visit_FromImport(self, node, frame): ...
+ def visit_For(self, node, frame): ...
+ def visit_If(self, node, frame): ...
+ def visit_Macro(self, node, frame): ...
+ def visit_CallBlock(self, node, frame): ...
+ def visit_FilterBlock(self, node, frame): ...
+ def visit_ExprStmt(self, node, frame): ...
+ def visit_Output(self, node, frame): ...
+ def make_assignment_frame(self, frame): ...
+ def export_assigned_vars(self, frame, assignment_frame): ...
+ def visit_Assign(self, node, frame): ...
+ def visit_AssignBlock(self, node, frame): ...
+ def visit_Name(self, node, frame): ...
+ def visit_Const(self, node, frame): ...
+ def visit_TemplateData(self, node, frame): ...
+ def visit_Tuple(self, node, frame): ...
+ def visit_List(self, node, frame): ...
+ def visit_Dict(self, node, frame): ...
+ def binop(operator, interceptable: bool = ...): ...
+ def uaop(operator, interceptable: bool = ...): ...
+ visit_Add = ... # type: Any
+ visit_Sub = ... # type: Any
+ visit_Mul = ... # type: Any
+ visit_Div = ... # type: Any
+ visit_FloorDiv = ... # type: Any
+ visit_Pow = ... # type: Any
+ visit_Mod = ... # type: Any
+ visit_And = ... # type: Any
+ visit_Or = ... # type: Any
+ visit_Pos = ... # type: Any
+ visit_Neg = ... # type: Any
+ visit_Not = ... # type: Any
+ def visit_Concat(self, node, frame): ...
+ def visit_Compare(self, node, frame): ...
+ def visit_Operand(self, node, frame): ...
+ def visit_Getattr(self, node, frame): ...
+ def visit_Getitem(self, node, frame): ...
+ def visit_Slice(self, node, frame): ...
+ def visit_Filter(self, node, frame): ...
+ def visit_Test(self, node, frame): ...
+ def visit_CondExpr(self, node, frame): ...
+ def visit_Call(self, node, frame, forward_caller: bool = ...): ...
+ def visit_Keyword(self, node, frame): ...
+ def visit_MarkSafe(self, node, frame): ...
+ def visit_MarkSafeIfAutoescape(self, node, frame): ...
+ def visit_EnvironmentAttribute(self, node, frame): ...
+ def visit_ExtensionAttribute(self, node, frame): ...
+ def visit_ImportedName(self, node, frame): ...
+ def visit_InternalName(self, node, frame): ...
+ def visit_ContextReference(self, node, frame): ...
+ def visit_Continue(self, node, frame): ...
+ def visit_Break(self, node, frame): ...
+ def visit_Scope(self, node, frame): ...
+ def visit_EvalContextModifier(self, node, frame): ...
+ def visit_ScopedEvalContextModifier(self, node, frame): ...
diff --git a/typeshed/third_party/2and3/jinja2/constants.pyi b/typeshed/third_party/2and3/jinja2/constants.pyi
new file mode 100644
index 0000000..ca47cb0
--- /dev/null
+++ b/typeshed/third_party/2and3/jinja2/constants.pyi
@@ -0,0 +1,5 @@
+# Stubs for jinja2.constants (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+LOREM_IPSUM_WORDS = ... # type: str
diff --git a/typeshed/third_party/2and3/jinja2/debug.pyi b/typeshed/third_party/2and3/jinja2/debug.pyi
new file mode 100644
index 0000000..270acf5
--- /dev/null
+++ b/typeshed/third_party/2and3/jinja2/debug.pyi
@@ -0,0 +1,41 @@
+# Stubs for jinja2.debug (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+tproxy = ... # type: Any
+raise_helper = ... # type: str
+
+class TracebackFrameProxy:
+ tb = ... # type: Any
+ def __init__(self, tb) -> None: ...
+ @property
+ def tb_next(self): ...
+ def set_next(self, next): ...
+ @property
+ def is_jinja_frame(self): ...
+ def __getattr__(self, name): ...
+
+def make_frame_proxy(frame): ...
+
+class ProcessedTraceback:
+ exc_type = ... # type: Any
+ exc_value = ... # type: Any
+ frames = ... # type: Any
+ def __init__(self, exc_type, exc_value, frames) -> None: ...
+ def render_as_text(self, limit: Optional[Any] = ...): ...
+ def render_as_html(self, full: bool = ...): ...
+ @property
+ def is_template_syntax_error(self): ...
+ @property
+ def exc_info(self): ...
+ @property
+ def standard_exc_info(self): ...
+
+def make_traceback(exc_info, source_hint: Optional[Any] = ...): ...
+def translate_syntax_error(error, source: Optional[Any] = ...): ...
+def translate_exception(exc_info, initial_skip: int = ...): ...
+def fake_exc_info(exc_info, filename, lineno): ...
+
+tb_set_next = ... # type: Any
diff --git a/typeshed/third_party/2and3/jinja2/defaults.pyi b/typeshed/third_party/2and3/jinja2/defaults.pyi
new file mode 100644
index 0000000..0788c7c
--- /dev/null
+++ b/typeshed/third_party/2and3/jinja2/defaults.pyi
@@ -0,0 +1,25 @@
+# Stubs for jinja2.defaults (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from jinja2.filters import FILTERS as DEFAULT_FILTERS
+from jinja2.tests import TESTS as DEFAULT_TESTS
+
+BLOCK_START_STRING = ... # type: str
+BLOCK_END_STRING = ... # type: str
+VARIABLE_START_STRING = ... # type: str
+VARIABLE_END_STRING = ... # type: str
+COMMENT_START_STRING = ... # type: str
+COMMENT_END_STRING = ... # type: str
+LINE_STATEMENT_PREFIX = ... # type: Any
+LINE_COMMENT_PREFIX = ... # type: Any
+TRIM_BLOCKS = ... # type: bool
+LSTRIP_BLOCKS = ... # type: bool
+NEWLINE_SEQUENCE = ... # type: str
+KEEP_TRAILING_NEWLINE = ... # type: bool
+DEFAULT_NAMESPACE = ... # type: Any
+
+# Names in __all__ with no definition:
+# DEFAULT_FILTERS
+# DEFAULT_TESTS
diff --git a/typeshed/third_party/2and3/jinja2/environment.pyi b/typeshed/third_party/2and3/jinja2/environment.pyi
new file mode 100644
index 0000000..559369a
--- /dev/null
+++ b/typeshed/third_party/2and3/jinja2/environment.pyi
@@ -0,0 +1,109 @@
+# Stubs for jinja2.environment (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Callable, Dict, Iterator, List, Optional, Text, Type, Union
+
+from .bccache import BytecodeCache
+from .loaders import BaseLoader
+from .runtime import Context, Undefined
+
+def get_spontaneous_environment(*args): ...
+def create_cache(size): ...
+def copy_cache(cache): ...
+def load_extensions(environment, extensions): ...
+
+class Environment:
+ sandboxed = ... # type: bool
+ overlayed = ... # type: bool
+ linked_to = ... # type: Any
+ shared = ... # type: bool
+ exception_handler = ... # type: Any
+ exception_formatter = ... # type: Any
+ code_generator_class = ... # type: Any
+ context_class = ... # type: Any
+ block_start_string = ... # type: Text
+ block_end_string = ... # type: Text
+ variable_start_string = ... # type: Text
+ variable_end_string = ... # type: Text
+ comment_start_string = ... # type: Text
+ comment_end_string = ... # type: Text
+ line_statement_prefix = ... # type: Text
+ line_comment_prefix = ... # type: Text
+ trim_blocks = ... # type: bool
+ lstrip_blocks = ... # type: Any
+ newline_sequence = ... # type: Text
+ keep_trailing_newline = ... # type: bool
+ undefined = ... # type: Type[Undefined]
+ optimized = ... # type: bool
+ finalize = ... # type: Callable
+ autoescape = ... # type: Any
+ filters = ... # type: Any
+ tests = ... # type: Any
+ globals = ... # type: Dict[str, Any]
+ loader = ... # type: BaseLoader
+ cache = ... # type: Any
+ bytecode_cache = ... # type: BytecodeCache
+ auto_reload = ... # type: bool
+ extensions = ... # type: List
+ def __init__(self, block_start_string: Text = ..., block_end_string: Text = ..., variable_start_string: Text = ..., variable_end_string: Text = ..., comment_start_string: Any = ..., comment_end_string: Text = ..., line_statement_prefix: Text = ..., line_comment_prefix: Text = ..., trim_blocks: bool = ..., lstrip_blocks: bool = ..., newline_sequence: Text = ..., keep_trailing_newline: bool = ..., extensions: List = ..., optimized: bool = ..., undefined: Type[Undefined] = ..., finalize [...]
+ def add_extension(self, extension): ...
+ def extend(self, **attributes): ...
+ def overlay(self, block_start_string: Text = ..., block_end_string: Text = ..., variable_start_string: Text = ..., variable_end_string: Text = ..., comment_start_string: Any = ..., comment_end_string: Text = ..., line_statement_prefix: Text = ..., line_comment_prefix: Text = ..., trim_blocks: bool = ..., lstrip_blocks: bool = ..., extensions: List = ..., optimized: bool = ..., undefined: Type[Undefined] = ..., finalize: Callable = ..., autoescape: bool = ..., loader: Optional[BaseLoa [...]
+ lexer = ... # type: Any
+ def iter_extensions(self): ...
+ def getitem(self, obj, argument): ...
+ def getattr(self, obj, attribute): ...
+ def call_filter(self, name, value, args: Optional[Any] = ..., kwargs: Optional[Any] = ..., context: Optional[Any] = ..., eval_ctx: Optional[Any] = ...): ...
+ def call_test(self, name, value, args: Optional[Any] = ..., kwargs: Optional[Any] = ...): ...
+ def parse(self, source, name: Optional[Any] = ..., filename: Optional[Any] = ...): ...
+ def lex(self, source, name: Optional[Any] = ..., filename: Optional[Any] = ...): ...
+ def preprocess(self, source: Text, name: Optional[Any] = ..., filename: Optional[Any] = ...): ...
+ def compile(self, source, name: Optional[Any] = ..., filename: Optional[Any] = ..., raw: bool = ..., defer_init: bool = ...): ...
+ def compile_expression(self, source: Text, undefined_to_none: bool = ...): ...
+ def compile_templates(self, target, extensions: Optional[Any] = ..., filter_func: Optional[Any] = ..., zip: str = ..., log_function: Optional[Any] = ..., ignore_errors: bool = ..., py_compile: bool = ...): ...
+ def list_templates(self, extensions: Optional[Any] = ..., filter_func: Optional[Any] = ...): ...
+ def handle_exception(self, exc_info: Optional[Any] = ..., rendered: bool = ..., source_hint: Optional[Any] = ...): ...
+ def join_path(self, template: Union[Template, Text], parent: Text) -> Text: ...
+ def get_template(self, name: Union[Template, Text], parent: Optional[Text] = ..., globals: Optional[Any] = ...) -> Template: ...
+ def select_template(self, names: List[Union[Template, Text]], parent: Optional[Text] = ..., globals: Optional[Dict[str, Any]] = ...) -> Template: ...
+ def get_or_select_template(self, template_name_or_list: Union[Union[Template, Text], List[Union[Template, Text]]], parent: Optional[Text] = ..., globals: Optional[Dict[str, Any]] = ...) -> Template: ...
+ def from_string(self, source: Text, globals: Optional[Dict[str, Any]] = ..., template_class: Optional[Type[Template]] = ...) -> Template: ...
+ def make_globals(self, d: Optional[Dict[str, Any]]) -> Dict[str, Any]: ...
+
+class Template:
+ def __new__(cls, source, block_start_string: Any = ..., block_end_string: Any = ..., variable_start_string: Any = ..., variable_end_string: Any = ..., comment_start_string: Any = ..., comment_end_string: Any = ..., line_statement_prefix: Any = ..., line_comment_prefix: Any = ..., trim_blocks: Any = ..., lstrip_blocks: Any = ..., newline_sequence: Any = ..., keep_trailing_newline: Any = ..., extensions: Any = ..., optimized: bool = ..., undefined: Any = ..., finalize: Optional[Any] = [...]
+ @classmethod
+ def from_code(cls, environment, code, globals, uptodate: Optional[Any] = ...): ...
+ @classmethod
+ def from_module_dict(cls, environment, module_dict, globals): ...
+ def render(self, *args, **kwargs) -> Text: ...
+ def stream(self, *args, **kwargs) -> TemplateStream: ...
+ def generate(self, *args, **kwargs) -> Iterator[Text]: ...
+ def new_context(self, vars: Optional[Dict[str, Any]] = ..., shared: bool = ..., locals: Optional[Dict[str, Any]] = ...) -> Context: ...
+ def make_module(self, vars: Optional[Dict[str, Any]] = ..., shared: bool = ..., locals: Optional[Dict[str, Any]] = ...) -> Context: ...
+ @property
+ def module(self) -> Any: ...
+ def get_corresponding_lineno(self, lineno): ...
+ @property
+ def is_up_to_date(self) -> bool: ...
+ @property
+ def debug_info(self): ...
+
+class TemplateModule:
+ __name__ = ... # type: Any
+ def __init__(self, template, context) -> None: ...
+ def __html__(self): ...
+
+class TemplateExpression:
+ def __init__(self, template, undefined_to_none) -> None: ...
+ def __call__(self, *args, **kwargs): ...
+
+class TemplateStream:
+ def __init__(self, gen) -> None: ...
+ def dump(self, fp, encoding: Optional[Text] = ..., errors: Text = ...): ...
+ buffered = ... # type: bool
+ def disable_buffering(self) -> None: ...
+ def enable_buffering(self, size: int = ...) -> None: ...
+ def __iter__(self): ...
+ def __next__(self): ...
diff --git a/typeshed/third_party/2and3/jinja2/exceptions.pyi b/typeshed/third_party/2and3/jinja2/exceptions.pyi
new file mode 100644
index 0000000..1008167
--- /dev/null
+++ b/typeshed/third_party/2and3/jinja2/exceptions.pyi
@@ -0,0 +1,37 @@
+# Stubs for jinja2.exceptions (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional, Text
+
+class TemplateError(Exception):
+ def __init__(self, message: Optional[Text] = ...) -> None: ...
+ @property
+ def message(self): ...
+ def __unicode__(self): ...
+ @property
+ def message(self): ...
+
+class TemplateNotFound(IOError, LookupError, TemplateError):
+ message = ... # type: Any
+ name = ... # type: Any
+ templates = ... # type: Any
+ def __init__(self, name, message: Optional[Text] = ...) -> None: ...
+
+class TemplatesNotFound(TemplateNotFound):
+ templates = ... # type: Any
+ def __init__(self, names: Any = ..., message: Optional[Text] = ...) -> None: ...
+
+class TemplateSyntaxError(TemplateError):
+ lineno = ... # type: int
+ name = ... # type: Text
+ filename = ... # type: Text
+ source = ... # type: Text
+ translated = ... # type: bool
+ def __init__(self, message: Text, lineno: int, name: Optional[Text] = ..., filename: Optional[Text] = ...) -> None: ...
+
+class TemplateAssertionError(TemplateSyntaxError): ...
+class TemplateRuntimeError(TemplateError): ...
+class UndefinedError(TemplateRuntimeError): ...
+class SecurityError(TemplateRuntimeError): ...
+class FilterArgumentError(TemplateRuntimeError): ...
diff --git a/typeshed/third_party/2and3/jinja2/ext.pyi b/typeshed/third_party/2and3/jinja2/ext.pyi
new file mode 100644
index 0000000..5159242
--- /dev/null
+++ b/typeshed/third_party/2and3/jinja2/ext.pyi
@@ -0,0 +1,62 @@
+# Stubs for jinja2.ext (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+GETTEXT_FUNCTIONS = ... # type: Any
+
+class ExtensionRegistry(type):
+ def __new__(cls, name, bases, d): ...
+
+class Extension:
+ tags = ... # type: Any
+ priority = ... # type: int
+ environment = ... # type: Any
+ def __init__(self, environment) -> None: ...
+ def bind(self, environment): ...
+ def preprocess(self, source, name, filename: Optional[Any] = ...): ...
+ def filter_stream(self, stream): ...
+ def parse(self, parser): ...
+ def attr(self, name, lineno: Optional[Any] = ...): ...
+ def call_method(self, name, args: Optional[Any] = ..., kwargs: Optional[Any] = ..., dyn_args: Optional[Any] = ..., dyn_kwargs: Optional[Any] = ..., lineno: Optional[Any] = ...): ...
+
+class InternationalizationExtension(Extension):
+ tags = ... # type: Any
+ def __init__(self, environment) -> None: ...
+ def parse(self, parser): ...
+
+class ExprStmtExtension(Extension):
+ tags = ... # type: Any
+ def parse(self, parser): ...
+
+class LoopControlExtension(Extension):
+ tags = ... # type: Any
+ def parse(self, parser): ...
+
+class WithExtension(Extension):
+ tags = ... # type: Any
+ def parse(self, parser): ...
+
+class AutoEscapeExtension(Extension):
+ tags = ... # type: Any
+ def parse(self, parser): ...
+
+def extract_from_ast(node, gettext_functions: Any = ..., babel_style: bool = ...): ...
+
+class _CommentFinder:
+ tokens = ... # type: Any
+ comment_tags = ... # type: Any
+ offset = ... # type: int
+ last_lineno = ... # type: int
+ def __init__(self, tokens, comment_tags) -> None: ...
+ def find_backwards(self, offset): ...
+ def find_comments(self, lineno): ...
+
+def babel_extract(fileobj, keywords, comment_tags, options): ...
+
+i18n = ... # type: Any
+do = ... # type: Any
+loopcontrols = ... # type: Any
+with_ = ... # type: Any
+autoescape = ... # type: Any
diff --git a/typeshed/third_party/2and3/jinja2/filters.pyi b/typeshed/third_party/2and3/jinja2/filters.pyi
new file mode 100644
index 0000000..7da165f
--- /dev/null
+++ b/typeshed/third_party/2and3/jinja2/filters.pyi
@@ -0,0 +1,61 @@
+# Stubs for jinja2.filters (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+def contextfilter(f): ...
+def evalcontextfilter(f): ...
+def environmentfilter(f): ...
+def make_attrgetter(environment, attribute): ...
+def do_forceescape(value): ...
+def do_urlencode(value): ...
+def do_replace(eval_ctx, s, old, new, count: Optional[Any] = ...): ...
+def do_upper(s): ...
+def do_lower(s): ...
+def do_xmlattr(_eval_ctx, d, autospace: bool = ...): ...
+def do_capitalize(s): ...
+def do_title(s): ...
+def do_dictsort(value, case_sensitive: bool = ..., by: str = ...): ...
+def do_sort(environment, value, reverse: bool = ..., case_sensitive: bool = ..., attribute: Optional[Any] = ...): ...
+def do_default(value, default_value: str = ..., boolean: bool = ...): ...
+def do_join(eval_ctx, value, d: str = ..., attribute: Optional[Any] = ...): ...
+def do_center(value, width: int = ...): ...
+def do_first(environment, seq): ...
+def do_last(environment, seq): ...
+def do_random(environment, seq): ...
+def do_filesizeformat(value, binary: bool = ...): ...
+def do_pprint(value, verbose: bool = ...): ...
+def do_urlize(eval_ctx, value, trim_url_limit: Optional[Any] = ..., nofollow: bool = ..., target: Optional[Any] = ...): ...
+def do_indent(s, width: int = ..., indentfirst: bool = ...): ...
+def do_truncate(s, length: int = ..., killwords: bool = ..., end: str = ...): ...
+def do_wordwrap(environment, s, width: int = ..., break_long_words: bool = ..., wrapstring: Optional[Any] = ...): ...
+def do_wordcount(s): ...
+def do_int(value, default: int = ..., base: int = ...): ...
+def do_float(value, default: float = ...): ...
+def do_format(value, *args, **kwargs): ...
+def do_trim(value): ...
+def do_striptags(value): ...
+def do_slice(value, slices, fill_with: Optional[Any] = ...): ...
+def do_batch(value, linecount, fill_with: Optional[Any] = ...): ...
+def do_round(value, precision: int = ..., method: str = ...): ...
+def do_groupby(environment, value, attribute): ...
+
+class _GroupTuple(tuple):
+ grouper = ... # type: Any
+ list = ... # type: Any
+ def __new__(cls, xxx_todo_changeme): ...
+
+def do_sum(environment, iterable, attribute: Optional[Any] = ..., start: int = ...): ...
+def do_list(value): ...
+def do_mark_safe(value): ...
+def do_mark_unsafe(value): ...
+def do_reverse(value): ...
+def do_attr(environment, obj, name): ...
+def do_map(*args, **kwargs): ...
+def do_select(*args, **kwargs): ...
+def do_reject(*args, **kwargs): ...
+def do_selectattr(*args, **kwargs): ...
+def do_rejectattr(*args, **kwargs): ...
+
+FILTERS = ... # type: Any
diff --git a/typeshed/third_party/2and3/jinja2/lexer.pyi b/typeshed/third_party/2and3/jinja2/lexer.pyi
new file mode 100644
index 0000000..b571a48
--- /dev/null
+++ b/typeshed/third_party/2and3/jinja2/lexer.pyi
@@ -0,0 +1,121 @@
+# Stubs for jinja2.lexer (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+whitespace_re = ... # type: Any
+string_re = ... # type: Any
+integer_re = ... # type: Any
+name_re = ... # type: Any
+float_re = ... # type: Any
+newline_re = ... # type: Any
+TOKEN_ADD = ... # type: Any
+TOKEN_ASSIGN = ... # type: Any
+TOKEN_COLON = ... # type: Any
+TOKEN_COMMA = ... # type: Any
+TOKEN_DIV = ... # type: Any
+TOKEN_DOT = ... # type: Any
+TOKEN_EQ = ... # type: Any
+TOKEN_FLOORDIV = ... # type: Any
+TOKEN_GT = ... # type: Any
+TOKEN_GTEQ = ... # type: Any
+TOKEN_LBRACE = ... # type: Any
+TOKEN_LBRACKET = ... # type: Any
+TOKEN_LPAREN = ... # type: Any
+TOKEN_LT = ... # type: Any
+TOKEN_LTEQ = ... # type: Any
+TOKEN_MOD = ... # type: Any
+TOKEN_MUL = ... # type: Any
+TOKEN_NE = ... # type: Any
+TOKEN_PIPE = ... # type: Any
+TOKEN_POW = ... # type: Any
+TOKEN_RBRACE = ... # type: Any
+TOKEN_RBRACKET = ... # type: Any
+TOKEN_RPAREN = ... # type: Any
+TOKEN_SEMICOLON = ... # type: Any
+TOKEN_SUB = ... # type: Any
+TOKEN_TILDE = ... # type: Any
+TOKEN_WHITESPACE = ... # type: Any
+TOKEN_FLOAT = ... # type: Any
+TOKEN_INTEGER = ... # type: Any
+TOKEN_NAME = ... # type: Any
+TOKEN_STRING = ... # type: Any
+TOKEN_OPERATOR = ... # type: Any
+TOKEN_BLOCK_BEGIN = ... # type: Any
+TOKEN_BLOCK_END = ... # type: Any
+TOKEN_VARIABLE_BEGIN = ... # type: Any
+TOKEN_VARIABLE_END = ... # type: Any
+TOKEN_RAW_BEGIN = ... # type: Any
+TOKEN_RAW_END = ... # type: Any
+TOKEN_COMMENT_BEGIN = ... # type: Any
+TOKEN_COMMENT_END = ... # type: Any
+TOKEN_COMMENT = ... # type: Any
+TOKEN_LINESTATEMENT_BEGIN = ... # type: Any
+TOKEN_LINESTATEMENT_END = ... # type: Any
+TOKEN_LINECOMMENT_BEGIN = ... # type: Any
+TOKEN_LINECOMMENT_END = ... # type: Any
+TOKEN_LINECOMMENT = ... # type: Any
+TOKEN_DATA = ... # type: Any
+TOKEN_INITIAL = ... # type: Any
+TOKEN_EOF = ... # type: Any
+operators = ... # type: Any
+reverse_operators = ... # type: Any
+operator_re = ... # type: Any
+ignored_tokens = ... # type: Any
+ignore_if_empty = ... # type: Any
+
+def describe_token(token): ...
+def describe_token_expr(expr): ...
+def count_newlines(value): ...
+def compile_rules(environment): ...
+
+class Failure:
+ message = ... # type: Any
+ error_class = ... # type: Any
+ def __init__(self, message, cls: Any = ...) -> None: ...
+ def __call__(self, lineno, filename): ...
+
+class Token(tuple):
+ lineno = ... # type: Any
+ type = ... # type: Any
+ value = ... # type: Any
+ def __new__(cls, lineno, type, value): ...
+ def test(self, expr): ...
+ def test_any(self, *iterable): ...
+
+class TokenStreamIterator:
+ stream = ... # type: Any
+ def __init__(self, stream) -> None: ...
+ def __iter__(self): ...
+ def __next__(self): ...
+
+class TokenStream:
+ name = ... # type: Any
+ filename = ... # type: Any
+ closed = ... # type: bool
+ current = ... # type: Any
+ def __init__(self, generator, name, filename) -> None: ...
+ def __iter__(self): ...
+ def __bool__(self): ...
+ __nonzero__ = ... # type: Any
+ eos = ... # type: Any
+ def push(self, token): ...
+ def look(self): ...
+ def skip(self, n: int = ...): ...
+ def next_if(self, expr): ...
+ def skip_if(self, expr): ...
+ def __next__(self): ...
+ def close(self): ...
+ def expect(self, expr): ...
+
+def get_lexer(environment): ...
+
+class Lexer:
+ newline_sequence = ... # type: Any
+ keep_trailing_newline = ... # type: Any
+ rules = ... # type: Any
+ def __init__(self, environment) -> None: ...
+ def tokenize(self, source, name: Optional[Any] = ..., filename: Optional[Any] = ..., state: Optional[Any] = ...): ...
+ def wrap(self, stream, name: Optional[Any] = ..., filename: Optional[Any] = ...): ...
+ def tokeniter(self, source, name, filename: Optional[Any] = ..., state: Optional[Any] = ...): ...
diff --git a/typeshed/third_party/2and3/jinja2/loaders.pyi b/typeshed/third_party/2and3/jinja2/loaders.pyi
new file mode 100644
index 0000000..7de950e
--- /dev/null
+++ b/typeshed/third_party/2and3/jinja2/loaders.pyi
@@ -0,0 +1,74 @@
+# Stubs for jinja2.loaders (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Callable, List, Optional, Text, Tuple
+from types import ModuleType
+
+from .environment import Environment
+
+def split_template_path(template: Text) -> List[Text]: ...
+
+class BaseLoader:
+ has_source_access = ... # type: bool
+ def get_source(self, environment, template): ...
+ def list_templates(self): ...
+ def load(self, environment, name, globals: Optional[Any] = ...): ...
+
+class FileSystemLoader(BaseLoader):
+ searchpath = ... # type: Text
+ encoding = ... # type: Any
+ followlinks = ... # type: Any
+ def __init__(self, searchpath: Text, encoding: Text = ..., followlinks: bool = ...) -> None: ...
+ def get_source(self, environment: Environment, template: Text) -> Tuple[Text, Text, Callable]: ...
+ def list_templates(self): ...
+
+class PackageLoader(BaseLoader):
+ encoding = ... # type: Text
+ manager = ... # type: Any
+ filesystem_bound = ... # type: Any
+ provider = ... # type: Any
+ package_path = ... # type: Any
+ def __init__(self, package_name: Text, package_path: Text = ..., encoding: Text = ...) -> None: ...
+ def get_source(self, environment: Environment, template: Text) -> Tuple[Text, Text, Callable]: ...
+ def list_templates(self): ...
+
+class DictLoader(BaseLoader):
+ mapping = ... # type: Any
+ def __init__(self, mapping) -> None: ...
+ def get_source(self, environment: Environment, template: Text) -> Tuple[Text, Text, Callable]: ...
+ def list_templates(self): ...
+
+class FunctionLoader(BaseLoader):
+ load_func = ... # type: Any
+ def __init__(self, load_func) -> None: ...
+ def get_source(self, environment: Environment, template: Text) -> Tuple[Text, Text, Callable]: ...
+
+class PrefixLoader(BaseLoader):
+ mapping = ... # type: Any
+ delimiter = ... # type: Any
+ def __init__(self, mapping, delimiter: str = ...) -> None: ...
+ def get_loader(self, template): ...
+ def get_source(self, environment: Environment, template: Text) -> Tuple[Text, Text, Callable]: ...
+ def load(self, environment, name, globals: Optional[Any] = ...): ...
+ def list_templates(self): ...
+
+class ChoiceLoader(BaseLoader):
+ loaders = ... # type: Any
+ def __init__(self, loaders) -> None: ...
+ def get_source(self, environment: Environment, template: Text) -> Tuple[Text, Text, Callable]: ...
+ def load(self, environment, name, globals: Optional[Any] = ...): ...
+ def list_templates(self): ...
+
+class _TemplateModule(ModuleType): ...
+
+class ModuleLoader(BaseLoader):
+ has_source_access = ... # type: bool
+ module = ... # type: Any
+ package_name = ... # type: Any
+ def __init__(self, path) -> None: ...
+ @staticmethod
+ def get_template_key(name): ...
+ @staticmethod
+ def get_module_filename(name): ...
+ def load(self, environment, name, globals: Optional[Any] = ...): ...
diff --git a/typeshed/third_party/2and3/jinja2/meta.pyi b/typeshed/third_party/2and3/jinja2/meta.pyi
new file mode 100644
index 0000000..998cc80
--- /dev/null
+++ b/typeshed/third_party/2and3/jinja2/meta.pyi
@@ -0,0 +1,15 @@
+# Stubs for jinja2.meta (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from jinja2.compiler import CodeGenerator
+
+class TrackingCodeGenerator(CodeGenerator):
+ undeclared_identifiers = ... # type: Any
+ def __init__(self, environment) -> None: ...
+ def write(self, x): ...
+ def pull_locals(self, frame): ...
+
+def find_undeclared_variables(ast): ...
+def find_referenced_templates(ast): ...
diff --git a/typeshed/third_party/2and3/jinja2/nodes.pyi b/typeshed/third_party/2and3/jinja2/nodes.pyi
new file mode 100644
index 0000000..ce43bb3
--- /dev/null
+++ b/typeshed/third_party/2and3/jinja2/nodes.pyi
@@ -0,0 +1,254 @@
+# Stubs for jinja2.nodes (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+class Impossible(Exception): ...
+
+class NodeType(type):
+ def __new__(cls, name, bases, d): ...
+
+class EvalContext:
+ environment = ... # type: Any
+ autoescape = ... # type: Any
+ volatile = ... # type: bool
+ def __init__(self, environment, template_name: Optional[Any] = ...) -> None: ...
+ def save(self): ...
+ def revert(self, old): ...
+
+def get_eval_context(node, ctx): ...
+
+class Node:
+ fields = ... # type: Any
+ attributes = ... # type: Any
+ abstract = ... # type: bool
+ def __init__(self, *fields, **attributes) -> None: ...
+ def iter_fields(self, exclude: Optional[Any] = ..., only: Optional[Any] = ...): ...
+ def iter_child_nodes(self, exclude: Optional[Any] = ..., only: Optional[Any] = ...): ...
+ def find(self, node_type): ...
+ def find_all(self, node_type): ...
+ def set_ctx(self, ctx): ...
+ def set_lineno(self, lineno, override: bool = ...): ...
+ def set_environment(self, environment): ...
+ def __eq__(self, other): ...
+ def __ne__(self, other): ...
+ __hash__ = ... # type: Any
+
+class Stmt(Node):
+ abstract = ... # type: bool
+
+class Helper(Node):
+ abstract = ... # type: bool
+
+class Template(Node):
+ fields = ... # type: Any
+
+class Output(Stmt):
+ fields = ... # type: Any
+
+class Extends(Stmt):
+ fields = ... # type: Any
+
+class For(Stmt):
+ fields = ... # type: Any
+
+class If(Stmt):
+ fields = ... # type: Any
+
+class Macro(Stmt):
+ fields = ... # type: Any
+
+class CallBlock(Stmt):
+ fields = ... # type: Any
+
+class FilterBlock(Stmt):
+ fields = ... # type: Any
+
+class Block(Stmt):
+ fields = ... # type: Any
+
+class Include(Stmt):
+ fields = ... # type: Any
+
+class Import(Stmt):
+ fields = ... # type: Any
+
+class FromImport(Stmt):
+ fields = ... # type: Any
+
+class ExprStmt(Stmt):
+ fields = ... # type: Any
+
+class Assign(Stmt):
+ fields = ... # type: Any
+
+class AssignBlock(Stmt):
+ fields = ... # type: Any
+
+class Expr(Node):
+ abstract = ... # type: bool
+ def as_const(self, eval_ctx: Optional[Any] = ...): ...
+ def can_assign(self): ...
+
+class BinExpr(Expr):
+ fields = ... # type: Any
+ operator = ... # type: Any
+ abstract = ... # type: bool
+ def as_const(self, eval_ctx: Optional[Any] = ...): ...
+
+class UnaryExpr(Expr):
+ fields = ... # type: Any
+ operator = ... # type: Any
+ abstract = ... # type: bool
+ def as_const(self, eval_ctx: Optional[Any] = ...): ...
+
+class Name(Expr):
+ fields = ... # type: Any
+ def can_assign(self): ...
+
+class Literal(Expr):
+ abstract = ... # type: bool
+
+class Const(Literal):
+ fields = ... # type: Any
+ def as_const(self, eval_ctx: Optional[Any] = ...): ...
+ @classmethod
+ def from_untrusted(cls, value, lineno: Optional[Any] = ..., environment: Optional[Any] = ...): ...
+
+class TemplateData(Literal):
+ fields = ... # type: Any
+ def as_const(self, eval_ctx: Optional[Any] = ...): ...
+
+class Tuple(Literal):
+ fields = ... # type: Any
+ def as_const(self, eval_ctx: Optional[Any] = ...): ...
+ def can_assign(self): ...
+
+class List(Literal):
+ fields = ... # type: Any
+ def as_const(self, eval_ctx: Optional[Any] = ...): ...
+
+class Dict(Literal):
+ fields = ... # type: Any
+ def as_const(self, eval_ctx: Optional[Any] = ...): ...
+
+class Pair(Helper):
+ fields = ... # type: Any
+ def as_const(self, eval_ctx: Optional[Any] = ...): ...
+
+class Keyword(Helper):
+ fields = ... # type: Any
+ def as_const(self, eval_ctx: Optional[Any] = ...): ...
+
+class CondExpr(Expr):
+ fields = ... # type: Any
+ def as_const(self, eval_ctx: Optional[Any] = ...): ...
+
+class Filter(Expr):
+ fields = ... # type: Any
+ def as_const(self, eval_ctx: Optional[Any] = ...): ...
+
+class Test(Expr):
+ fields = ... # type: Any
+
+class Call(Expr):
+ fields = ... # type: Any
+ def as_const(self, eval_ctx: Optional[Any] = ...): ...
+
+class Getitem(Expr):
+ fields = ... # type: Any
+ def as_const(self, eval_ctx: Optional[Any] = ...): ...
+ def can_assign(self): ...
+
+class Getattr(Expr):
+ fields = ... # type: Any
+ def as_const(self, eval_ctx: Optional[Any] = ...): ...
+ def can_assign(self): ...
+
+class Slice(Expr):
+ fields = ... # type: Any
+ def as_const(self, eval_ctx: Optional[Any] = ...): ...
+
+class Concat(Expr):
+ fields = ... # type: Any
+ def as_const(self, eval_ctx: Optional[Any] = ...): ...
+
+class Compare(Expr):
+ fields = ... # type: Any
+ def as_const(self, eval_ctx: Optional[Any] = ...): ...
+
+class Operand(Helper):
+ fields = ... # type: Any
+
+class Mul(BinExpr):
+ operator = ... # type: str
+
+class Div(BinExpr):
+ operator = ... # type: str
+
+class FloorDiv(BinExpr):
+ operator = ... # type: str
+
+class Add(BinExpr):
+ operator = ... # type: str
+
+class Sub(BinExpr):
+ operator = ... # type: str
+
+class Mod(BinExpr):
+ operator = ... # type: str
+
+class Pow(BinExpr):
+ operator = ... # type: str
+
+class And(BinExpr):
+ operator = ... # type: str
+ def as_const(self, eval_ctx: Optional[Any] = ...): ...
+
+class Or(BinExpr):
+ operator = ... # type: str
+ def as_const(self, eval_ctx: Optional[Any] = ...): ...
+
+class Not(UnaryExpr):
+ operator = ... # type: str
+
+class Neg(UnaryExpr):
+ operator = ... # type: str
+
+class Pos(UnaryExpr):
+ operator = ... # type: str
+
+class EnvironmentAttribute(Expr):
+ fields = ... # type: Any
+
+class ExtensionAttribute(Expr):
+ fields = ... # type: Any
+
+class ImportedName(Expr):
+ fields = ... # type: Any
+
+class InternalName(Expr):
+ fields = ... # type: Any
+ def __init__(self) -> None: ...
+
+class MarkSafe(Expr):
+ fields = ... # type: Any
+ def as_const(self, eval_ctx: Optional[Any] = ...): ...
+
+class MarkSafeIfAutoescape(Expr):
+ fields = ... # type: Any
+ def as_const(self, eval_ctx: Optional[Any] = ...): ...
+
+class ContextReference(Expr): ...
+class Continue(Stmt): ...
+class Break(Stmt): ...
+
+class Scope(Stmt):
+ fields = ... # type: Any
+
+class EvalContextModifier(Stmt):
+ fields = ... # type: Any
+
+class ScopedEvalContextModifier(EvalContextModifier):
+ fields = ... # type: Any
diff --git a/typeshed/third_party/2and3/jinja2/optimizer.pyi b/typeshed/third_party/2and3/jinja2/optimizer.pyi
new file mode 100644
index 0000000..2c30671
--- /dev/null
+++ b/typeshed/third_party/2and3/jinja2/optimizer.pyi
@@ -0,0 +1,33 @@
+# Stubs for jinja2.optimizer (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from jinja2.visitor import NodeTransformer
+
+def optimize(node, environment): ...
+
+class Optimizer(NodeTransformer):
+ environment = ... # type: Any
+ def __init__(self, environment) -> None: ...
+ def visit_If(self, node): ...
+ def fold(self, node): ...
+ visit_Add = ... # type: Any
+ visit_Sub = ... # type: Any
+ visit_Mul = ... # type: Any
+ visit_Div = ... # type: Any
+ visit_FloorDiv = ... # type: Any
+ visit_Pow = ... # type: Any
+ visit_Mod = ... # type: Any
+ visit_And = ... # type: Any
+ visit_Or = ... # type: Any
+ visit_Pos = ... # type: Any
+ visit_Neg = ... # type: Any
+ visit_Not = ... # type: Any
+ visit_Compare = ... # type: Any
+ visit_Getitem = ... # type: Any
+ visit_Getattr = ... # type: Any
+ visit_Call = ... # type: Any
+ visit_Filter = ... # type: Any
+ visit_Test = ... # type: Any
+ visit_CondExpr = ... # type: Any
diff --git a/typeshed/third_party/2and3/jinja2/parser.pyi b/typeshed/third_party/2and3/jinja2/parser.pyi
new file mode 100644
index 0000000..20d19fc
--- /dev/null
+++ b/typeshed/third_party/2and3/jinja2/parser.pyi
@@ -0,0 +1,64 @@
+# Stubs for jinja2.parser (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+class Parser:
+ environment = ... # type: Any
+ stream = ... # type: Any
+ name = ... # type: Any
+ filename = ... # type: Any
+ closed = ... # type: bool
+ extensions = ... # type: Any
+ def __init__(self, environment, source, name: Optional[Any] = ..., filename: Optional[Any] = ..., state: Optional[Any] = ...) -> None: ...
+ def fail(self, msg, lineno: Optional[Any] = ..., exc: Any = ...): ...
+ def fail_unknown_tag(self, name, lineno: Optional[Any] = ...): ...
+ def fail_eof(self, end_tokens: Optional[Any] = ..., lineno: Optional[Any] = ...): ...
+ def is_tuple_end(self, extra_end_rules: Optional[Any] = ...): ...
+ def free_identifier(self, lineno: Optional[Any] = ...): ...
+ def parse_statement(self): ...
+ def parse_statements(self, end_tokens, drop_needle: bool = ...): ...
+ def parse_set(self): ...
+ def parse_for(self): ...
+ def parse_if(self): ...
+ def parse_block(self): ...
+ def parse_extends(self): ...
+ def parse_import_context(self, node, default): ...
+ def parse_include(self): ...
+ def parse_import(self): ...
+ def parse_from(self): ...
+ def parse_signature(self, node): ...
+ def parse_call_block(self): ...
+ def parse_filter_block(self): ...
+ def parse_macro(self): ...
+ def parse_print(self): ...
+ def parse_assign_target(self, with_tuple: bool = ..., name_only: bool = ..., extra_end_rules: Optional[Any] = ...): ...
+ def parse_expression(self, with_condexpr: bool = ...): ...
+ def parse_condexpr(self): ...
+ def parse_or(self): ...
+ def parse_and(self): ...
+ def parse_not(self): ...
+ def parse_compare(self): ...
+ def parse_add(self): ...
+ def parse_sub(self): ...
+ def parse_concat(self): ...
+ def parse_mul(self): ...
+ def parse_div(self): ...
+ def parse_floordiv(self): ...
+ def parse_mod(self): ...
+ def parse_pow(self): ...
+ def parse_unary(self, with_filter: bool = ...): ...
+ def parse_primary(self): ...
+ def parse_tuple(self, simplified: bool = ..., with_condexpr: bool = ..., extra_end_rules: Optional[Any] = ..., explicit_parentheses: bool = ...): ...
+ def parse_list(self): ...
+ def parse_dict(self): ...
+ def parse_postfix(self, node): ...
+ def parse_filter_expr(self, node): ...
+ def parse_subscript(self, node): ...
+ def parse_subscribed(self): ...
+ def parse_call(self, node): ...
+ def parse_filter(self, node, start_inline: bool = ...): ...
+ def parse_test(self, node): ...
+ def subparse(self, end_tokens: Optional[Any] = ...): ...
+ def parse(self): ...
diff --git a/typeshed/third_party/2and3/jinja2/runtime.pyi b/typeshed/third_party/2and3/jinja2/runtime.pyi
new file mode 100644
index 0000000..cfef911
--- /dev/null
+++ b/typeshed/third_party/2and3/jinja2/runtime.pyi
@@ -0,0 +1,134 @@
+# Stubs for jinja2.runtime (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Dict, Optional, Text, Union
+from jinja2.utils import Markup as Markup, escape as escape, missing as missing, concat as concat
+from jinja2.exceptions import TemplateRuntimeError as TemplateRuntimeError, TemplateNotFound as TemplateNotFound
+
+from jinja2.environment import Environment
+
+to_string = ... # type: Any
+identity = ... # type: Any
+
+def markup_join(seq): ...
+def unicode_join(seq): ...
+
+class TemplateReference:
+ def __init__(self, context) -> None: ...
+ def __getitem__(self, name): ...
+
+class Context:
+ parent = ... # type: Union[Context, Dict[str, Any]]
+ vars = ... # type: Dict[str, Any]
+ environment = ... # type: Environment
+ eval_ctx = ... # type: Any
+ exported_vars = ... # type: Any
+ name = ... # type: Text
+ blocks = ... # type: Dict[str, Any]
+ def __init__(self, environment: Environment, parent: Union[Context, Dict[str, Any]], name: Text, blocks: Dict[str, Any]) -> None: ...
+ def super(self, name, current): ...
+ def get(self, key, default: Optional[Any] = ...): ...
+ def resolve(self, key): ...
+ def get_exported(self): ...
+ def get_all(self): ...
+ def call(__self, __obj, *args, **kwargs): ...
+ def derived(self, locals: Optional[Any] = ...): ...
+ keys = ... # type: Any
+ values = ... # type: Any
+ items = ... # type: Any
+ iterkeys = ... # type: Any
+ itervalues = ... # type: Any
+ iteritems = ... # type: Any
+ def __contains__(self, name): ...
+ def __getitem__(self, key): ...
+
+class BlockReference:
+ name = ... # type: Any
+ def __init__(self, name, context, stack, depth) -> None: ...
+ @property
+ def super(self): ...
+ def __call__(self): ...
+
+class LoopContext:
+ index0 = ... # type: int
+ depth0 = ... # type: Any
+ def __init__(self, iterable, recurse: Optional[Any] = ..., depth0: int = ...) -> None: ...
+ def cycle(self, *args): ...
+ first = ... # type: Any
+ last = ... # type: Any
+ index = ... # type: Any
+ revindex = ... # type: Any
+ revindex0 = ... # type: Any
+ depth = ... # type: Any
+ def __len__(self): ...
+ def __iter__(self): ...
+ def loop(self, iterable): ...
+ __call__ = ... # type: Any
+ @property
+ def length(self): ...
+
+class LoopContextIterator:
+ context = ... # type: Any
+ def __init__(self, context) -> None: ...
+ def __iter__(self): ...
+ def __next__(self): ...
+
+class Macro:
+ name = ... # type: Any
+ arguments = ... # type: Any
+ defaults = ... # type: Any
+ catch_kwargs = ... # type: Any
+ catch_varargs = ... # type: Any
+ caller = ... # type: Any
+ def __init__(self, environment, func, name, arguments, defaults, catch_kwargs, catch_varargs, caller) -> None: ...
+ def __call__(self, *args, **kwargs): ...
+
+class Undefined:
+ def __init__(self, hint: Optional[Any] = ..., obj: Any = ..., name: Optional[Any] = ..., exc: Any = ...) -> None: ...
+ def __getattr__(self, name): ...
+ __add__ = ... # type: Any
+ __radd__ = ... # type: Any
+ __mul__ = ... # type: Any
+ __rmul__ = ... # type: Any
+ __div__ = ... # type: Any
+ __rdiv__ = ... # type: Any
+ __truediv__ = ... # type: Any
+ __rtruediv__ = ... # type: Any
+ __floordiv__ = ... # type: Any
+ __rfloordiv__ = ... # type: Any
+ __mod__ = ... # type: Any
+ __rmod__ = ... # type: Any
+ __pos__ = ... # type: Any
+ __neg__ = ... # type: Any
+ __call__ = ... # type: Any
+ __getitem__ = ... # type: Any
+ __lt__ = ... # type: Any
+ __le__ = ... # type: Any
+ __gt__ = ... # type: Any
+ __ge__ = ... # type: Any
+ __int__ = ... # type: Any
+ __float__ = ... # type: Any
+ __complex__ = ... # type: Any
+ __pow__ = ... # type: Any
+ __rpow__ = ... # type: Any
+ def __eq__(self, other): ...
+ def __ne__(self, other): ...
+ def __hash__(self): ...
+ def __len__(self): ...
+ def __iter__(self): ...
+ def __nonzero__(self): ...
+ __bool__ = ... # type: Any
+
+def make_logging_undefined(logger: Optional[Any] = ..., base: Optional[Any] = ...): ...
+
+class DebugUndefined(Undefined): ...
+
+class StrictUndefined(Undefined):
+ __iter__ = ... # type: Any
+ __len__ = ... # type: Any
+ __nonzero__ = ... # type: Any
+ __eq__ = ... # type: Any
+ __ne__ = ... # type: Any
+ __bool__ = ... # type: Any
+ __hash__ = ... # type: Any
diff --git a/typeshed/third_party/2and3/jinja2/sandbox.pyi b/typeshed/third_party/2and3/jinja2/sandbox.pyi
new file mode 100644
index 0000000..f611420
--- /dev/null
+++ b/typeshed/third_party/2and3/jinja2/sandbox.pyi
@@ -0,0 +1,38 @@
+# Stubs for jinja2.sandbox (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from jinja2.environment import Environment
+
+MAX_RANGE = ... # type: int
+UNSAFE_FUNCTION_ATTRIBUTES = ... # type: Any
+UNSAFE_METHOD_ATTRIBUTES = ... # type: Any
+UNSAFE_GENERATOR_ATTRIBUTES = ... # type: Any
+
+def safe_range(*args): ...
+def unsafe(f): ...
+def is_internal_attribute(obj, attr): ...
+def modifies_known_mutable(obj, attr): ...
+
+class SandboxedEnvironment(Environment):
+ sandboxed = ... # type: bool
+ default_binop_table = ... # type: Any
+ default_unop_table = ... # type: Any
+ intercepted_binops = ... # type: Any
+ intercepted_unops = ... # type: Any
+ def intercept_unop(self, operator): ...
+ binop_table = ... # type: Any
+ unop_table = ... # type: Any
+ def __init__(self, *args, **kwargs) -> None: ...
+ def is_safe_attribute(self, obj, attr, value): ...
+ def is_safe_callable(self, obj): ...
+ def call_binop(self, context, operator, left, right): ...
+ def call_unop(self, context, operator, arg): ...
+ def getitem(self, obj, argument): ...
+ def getattr(self, obj, attribute): ...
+ def unsafe_undefined(self, obj, attribute): ...
+ def call(__self, __context, __obj, *args, **kwargs): ...
+
+class ImmutableSandboxedEnvironment(SandboxedEnvironment):
+ def is_safe_attribute(self, obj, attr, value): ...
diff --git a/typeshed/third_party/2and3/jinja2/tests.pyi b/typeshed/third_party/2and3/jinja2/tests.pyi
new file mode 100644
index 0000000..fb31db7
--- /dev/null
+++ b/typeshed/third_party/2and3/jinja2/tests.pyi
@@ -0,0 +1,28 @@
+# Stubs for jinja2.tests (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+number_re = ... # type: Any
+regex_type = ... # type: Any
+test_callable = ... # type: Any
+
+def test_odd(value): ...
+def test_even(value): ...
+def test_divisibleby(value, num): ...
+def test_defined(value): ...
+def test_undefined(value): ...
+def test_none(value): ...
+def test_lower(value): ...
+def test_upper(value): ...
+def test_string(value): ...
+def test_mapping(value): ...
+def test_number(value): ...
+def test_sequence(value): ...
+def test_equalto(value, other): ...
+def test_sameas(value, other): ...
+def test_iterable(value): ...
+def test_escaped(value): ...
+
+TESTS = ... # type: Any
diff --git a/typeshed/third_party/2and3/jinja2/utils.pyi b/typeshed/third_party/2and3/jinja2/utils.pyi
new file mode 100644
index 0000000..1368299
--- /dev/null
+++ b/typeshed/third_party/2and3/jinja2/utils.pyi
@@ -0,0 +1,64 @@
+# Stubs for jinja2.utils (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Optional
+
+from markupsafe import Markup, escape, soft_unicode
+
+missing = ... # type: Any
+internal_code = ... # type: Any
+concat = ... # type: Any
+
+def contextfunction(f): ...
+def evalcontextfunction(f): ...
+def environmentfunction(f): ...
+def internalcode(f): ...
+def is_undefined(obj): ...
+def consume(iterable): ...
+def clear_caches(): ...
+def import_string(import_name, silent: bool = ...): ...
+def open_if_exists(filename, mode: str = ...): ...
+def object_type_repr(obj): ...
+def pformat(obj, verbose: bool = ...): ...
+def urlize(text, trim_url_limit: Optional[Any] = ..., nofollow: bool = ..., target: Optional[Any] = ...): ...
+def generate_lorem_ipsum(n: int = ..., html: bool = ..., min: int = ..., max: int = ...): ...
+def unicode_urlencode(obj, charset: str = ..., for_qs: bool = ...): ...
+
+class LRUCache:
+ capacity = ... # type: Any
+ def __init__(self, capacity) -> None: ...
+ def __getnewargs__(self): ...
+ def copy(self): ...
+ def get(self, key, default: Optional[Any] = ...): ...
+ def setdefault(self, key, default: Optional[Any] = ...): ...
+ def clear(self): ...
+ def __contains__(self, key): ...
+ def __len__(self): ...
+ def __getitem__(self, key): ...
+ def __setitem__(self, key, value): ...
+ def __delitem__(self, key): ...
+ def items(self): ...
+ def iteritems(self): ...
+ def values(self): ...
+ def itervalue(self): ...
+ def keys(self): ...
+ def iterkeys(self): ...
+ __iter__ = ... # type: Any
+ def __reversed__(self): ...
+ __copy__ = ... # type: Any
+
+class Cycler:
+ items = ... # type: Any
+ def __init__(self, *items) -> None: ...
+ pos = ... # type: int
+ def reset(self): ...
+ @property
+ def current(self): ...
+ def __next__(self): ...
+
+class Joiner:
+ sep = ... # type: Any
+ used = ... # type: bool
+ def __init__(self, sep: str = ...) -> None: ...
+ def __call__(self): ...
diff --git a/typeshed/third_party/2and3/jinja2/visitor.pyi b/typeshed/third_party/2and3/jinja2/visitor.pyi
new file mode 100644
index 0000000..201750c
--- /dev/null
+++ b/typeshed/third_party/2and3/jinja2/visitor.pyi
@@ -0,0 +1,12 @@
+# Stubs for jinja2.visitor (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+class NodeVisitor:
+ def get_visitor(self, node): ...
+ def visit(self, node, *args, **kwargs): ...
+ def generic_visit(self, node, *args, **kwargs): ...
+
+class NodeTransformer(NodeVisitor):
+ def generic_visit(self, node, *args, **kwargs): ...
+ def visit_list(self, node, *args, **kwargs): ...
diff --git a/typeshed/third_party/2and3/markupsafe/__init__.pyi b/typeshed/third_party/2and3/markupsafe/__init__.pyi
new file mode 100644
index 0000000..723d329
--- /dev/null
+++ b/typeshed/third_party/2and3/markupsafe/__init__.pyi
@@ -0,0 +1,58 @@
+# Stubs for markupsafe (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+import sys
+
+from typing import Any, Callable, Dict, Iterable, List, Optional, Text, Tuple, Union
+from collections import Mapping
+from markupsafe._compat import text_type
+import string
+from markupsafe._speedups import escape as escape, escape_silent as escape_silent, soft_unicode as soft_unicode
+from markupsafe._native import escape as escape, escape_silent as escape_silent, soft_unicode as soft_unicode
+
+class Markup(text_type):
+ def __new__(cls, base: Text = ..., encoding: Optional[Text] = ..., errors: Text = ...) -> Markup: ...
+ def __html__(self) -> Markup: ...
+ def __add__(self, other: text_type) -> Markup: ...
+ def __radd__(self, other: text_type) -> Markup: ...
+ def __mul__(self, num: int) -> Markup: ...
+ def __rmul__(self, num: int) -> Markup: ...
+ def __mod__(self, *args: Any) -> Markup: ...
+ def join(self, seq: Iterable[text_type]): ...
+ def split(self, sep: text_type = None, maxsplit: int = -1) -> List[text_type]: ...
+ def rsplit(self, sep: text_type = None, maxsplit: int = -1) -> List[text_type]: ...
+ def splitlines(self, keepends: bool = ...) -> List[text_type]: ...
+ def unescape(self) -> Text: ...
+ def striptags(self) -> Text: ...
+ @classmethod
+ def escape(cls, s: text_type) -> Markup: ...
+ def partition(self, sep: text_type) -> Tuple[Markup, Markup, Markup]: ...
+ def rpartition(self, sep: text_type) -> Tuple[Markup, Markup, Markup]: ...
+ def format(*args, **kwargs) -> Markup: ...
+ def __html_format__(self, format_spec) -> Markup: ...
+ def __getslice__(self, start: int, stop: int) -> Markup: ...
+ def __getitem__(self, i: Union[int, slice]) -> Markup: ...
+ def capitalize(self) -> Markup: ...
+ def title(self) -> Markup: ...
+ def lower(self) -> Markup: ...
+ def upper(self) -> Markup: ...
+ def swapcase(self) -> Markup: ...
+ def replace(self, old: text_type, new: text_type, count: int = -1) -> Markup: ...
+ def ljust(self, width: int, fillchar: text_type = ...) -> Markup: ...
+ def rjust(self, width: int, fillchar: text_type = ...) -> Markup: ...
+ def lstrip(self, chars: text_type = None) -> Markup: ...
+ def rstrip(self, chars: text_type = None) -> Markup: ...
+ def strip(self, chars: text_type = None) -> Markup: ...
+ def center(self, width: int, fillchar: text_type = ...) -> Markup: ...
+ def zfill(self, width: int) -> Markup: ...
+ def translate(self, table: Union[Dict[int, Any], text_type]) -> Markup: ...
+ def expandtabs(self, tabsize: int = 8) -> Markup: ...
+
+class EscapeFormatter(string.Formatter):
+ escape = ... # type: Callable[[text_type], Markup]
+ def __init__(self, escape: Callable[[text_type], Markup]) -> None: ...
+ def format_field(self, value: text_type, format_spec: text_type) -> Markup: ...
+
+if sys.version_info[0] >= 3:
+ soft_str = soft_unicode
diff --git a/typeshed/third_party/2and3/markupsafe/_compat.pyi b/typeshed/third_party/2and3/markupsafe/_compat.pyi
new file mode 100644
index 0000000..72b6f60
--- /dev/null
+++ b/typeshed/third_party/2and3/markupsafe/_compat.pyi
@@ -0,0 +1,23 @@
+# Stubs for markupsafe._compat (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+import sys
+
+from typing import Any, Iterator, Mapping, Text, Tuple, TypeVar
+
+_K = TypeVar('_K')
+_V = TypeVar('_V')
+
+PY2 = ... # type: bool
+def iteritems(d: Mapping[_K, _V]) -> Iterator[Tuple[_K, _V]]: ...
+if sys.version_info[0] >= 3:
+ text_type = str
+ string_types = str,
+ unichr = chr
+ int_types = int,
+else:
+ text_type = unicode
+ string_types = (str, unicode)
+ unichr = __builtins__.unichr
+ int_types = (int, long)
diff --git a/typeshed/third_party/2and3/markupsafe/_constants.pyi b/typeshed/third_party/2and3/markupsafe/_constants.pyi
new file mode 100644
index 0000000..677b46c
--- /dev/null
+++ b/typeshed/third_party/2and3/markupsafe/_constants.pyi
@@ -0,0 +1,7 @@
+# Stubs for markupsafe._constants (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any, Dict, Text
+
+HTML_ENTITIES = ... # type: Dict[Text, int]
diff --git a/typeshed/third_party/2and3/markupsafe/_native.pyi b/typeshed/third_party/2and3/markupsafe/_native.pyi
new file mode 100644
index 0000000..13d6fec
--- /dev/null
+++ b/typeshed/third_party/2and3/markupsafe/_native.pyi
@@ -0,0 +1,11 @@
+# Stubs for markupsafe._native (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from . import Markup
+from ._compat import text_type, string_types
+from typing import Union, Text
+
+def escape(s: Union[Markup, Text]) -> Markup: ...
+def escape_silent(s: Union[None, Markup, Text]) -> Markup: ...
+def soft_unicode(s: Text) -> text_type: ...
diff --git a/typeshed/third_party/2and3/markupsafe/_speedups.pyi b/typeshed/third_party/2and3/markupsafe/_speedups.pyi
new file mode 100644
index 0000000..379e11e
--- /dev/null
+++ b/typeshed/third_party/2and3/markupsafe/_speedups.pyi
@@ -0,0 +1,11 @@
+# Stubs for markupsafe._speedups (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from . import Markup
+from ._compat import text_type, string_types
+from typing import Union, Text
+
+def escape(s: Union[Markup, Text]) -> Markup: ...
+def escape_silent(s: Union[None, Markup, Text]) -> Markup: ...
+def soft_unicode(s: Text) -> text_type: ...
diff --git a/typeshed/third_party/2and3/mypy_extensions.pyi b/typeshed/third_party/2and3/mypy_extensions.pyi
new file mode 100644
index 0000000..8b2ef3f
--- /dev/null
+++ b/typeshed/third_party/2and3/mypy_extensions.pyi
@@ -0,0 +1,11 @@
+from typing import Dict, Type, TypeVar, Union
+
+T = TypeVar('T')
+
+
+def TypedDict(typename: str, fields: Dict[str, Type[T]]) -> Type[dict]: ...
+
+# Return type that indicates a function does not return.
+# This type is equivalent to the None type, but the no-op Union is necessary to
+# distinguish the None type from the None value.
+NoReturn = Union[None]
diff --git a/typeshed/third_party/2and3/pytz/__init__.pyi b/typeshed/third_party/2and3/pytz/__init__.pyi
new file mode 100644
index 0000000..6bc917e
--- /dev/null
+++ b/typeshed/third_party/2and3/pytz/__init__.pyi
@@ -0,0 +1,26 @@
+# Stubs for pytz (Python 3.5)
+
+import datetime as dt
+from typing import Optional, List, Set, Dict # NOQA
+
+all_timezones = ... # type: List
+all_timezones_set = ... # type: Set
+common_timezones = ... # type: List
+common_timezones_set = ... # type: Set
+country_timezones = ... # type: Dict
+country_names = ... # type: Dict
+
+
+class _UTCclass(dt.tzinfo):
+ zone = ... # type: str
+ def fromutc(self, dt: dt.datetime) -> dt.datetime: ...
+ def utcoffset(self, dt: Optional[dt.datetime]) -> dt.timedelta: ... # type: ignore
+ def tzname(self, dt: Optional[dt.datetime]) -> str: ...
+ def dst(self, dt: Optional[dt.datetime]) -> dt.timedelta: ... # type: ignore
+ def localize(self, dt: dt.datetime, is_dst: bool=...) -> dt.datetime: ...
+ def normalize(self, dt: dt.datetime, is_dst: bool=...) -> dt.datetime: ...
+
+utc = ... # type: _UTCclass
+UTC = ... # type: _UTCclass
+
+def timezone(zone: str) -> dt.tzinfo: ...
diff --git a/typeshed/third_party/2and3/pytz/lazy.pyi b/typeshed/third_party/2and3/pytz/lazy.pyi
new file mode 100644
index 0000000..3618333
--- /dev/null
+++ b/typeshed/third_party/2and3/pytz/lazy.pyi
@@ -0,0 +1,13 @@
+# Stubs for pytz.lazy (Python 3.5)
+
+from typing import Any, Iterable, List, Set, Dict # NOQA
+from collections import Mapping
+
+class LazyDict(Mapping):
+ pass
+
+class LazyList(List):
+ pass
+
+class LazySet(Set):
+ pass
diff --git a/typeshed/third_party/2and3/singledispatch.pyi b/typeshed/third_party/2and3/singledispatch.pyi
new file mode 100644
index 0000000..ed24b7f
--- /dev/null
+++ b/typeshed/third_party/2and3/singledispatch.pyi
@@ -0,0 +1,17 @@
+from typing import Any, Callable, Generic, Mapping, Optional, TypeVar, overload
+
+
+_T = TypeVar("_T")
+
+
+class _SingleDispatchCallable(Generic[_T]):
+ registry = ... # type: Mapping[Any, Callable[..., _T]]
+ def dispatch(self, cls: Any) -> Callable[..., _T]: ...
+ @overload
+ def register(self, cls: Any) -> Callable[[Callable[..., _T]], Callable[..., _T]]: ...
+ @overload
+ def register(self, cls: Any, func: Callable[..., _T]) -> Callable[..., _T]: ...
+ def _clear_cache(self) -> None: ...
+ def __call__(self, *args: Any, **kwargs: Any) -> _T: ...
+
+def singledispatch(func: Callable[..., _T]) -> _SingleDispatchCallable[_T]: ...
diff --git a/typeshed/third_party/2and3/ujson.pyi b/typeshed/third_party/2and3/ujson.pyi
new file mode 100644
index 0000000..a982c8b
--- /dev/null
+++ b/typeshed/third_party/2and3/ujson.pyi
@@ -0,0 +1,51 @@
+# Stubs for ujson
+# See: https://pypi.python.org/pypi/ujson
+from typing import Any, AnyStr, IO, Optional
+
+__version__ = ... # type: str
+
+def encode(
+ obj: Any,
+ ensure_ascii: bool = ...,
+ double_precision: bool = ...,
+ encode_html_chars: bool = ...,
+ escape_forward_slashes: bool = ...,
+ sort_keys: bool = ...,
+ indent: int = ...,
+) -> str: ...
+
+def dumps(
+ obj: Any,
+ ensure_ascii: bool = ...,
+ double_precision: bool = ...,
+ encode_html_chars: bool = ...,
+ escape_forward_slashes: bool = ...,
+ sort_keys: bool = ...,
+ indent: int = ...,
+) -> str: ...
+
+def dump(
+ obj: Any,
+ fp: IO[str],
+ ensure_ascii: bool = ...,
+ double_precision: bool = ...,
+ encode_html_chars: bool = ...,
+ escape_forward_slashes: bool = ...,
+ sort_keys: bool = ...,
+ indent: int = ...,
+) -> None: ...
+
+def decode(
+ s: AnyStr,
+ precise_float: bool = ...,
+) -> Any: ...
+
+def loads(
+ s: AnyStr,
+ precise_float: bool = ...,
+) -> Any: ...
+
+def load(
+ fp: IO[AnyStr],
+ precise_float: bool = ...,
+) -> Any: ...
diff --git a/typeshed/third_party/3.6/click/__init__.pyi b/typeshed/third_party/3.6/click/__init__.pyi
new file mode 100644
index 0000000..c4228fc
--- /dev/null
+++ b/typeshed/third_party/3.6/click/__init__.pyi
@@ -0,0 +1,98 @@
+# -*- coding: utf-8 -*-
+"""
+ click
+ ~~~~~
+
+ Click is a simple Python module that wraps the stdlib's optparse to make
+ writing command line scripts fun. Unlike other modules, it's based around
+ a simple API that does not come with too much magic and is composable.
+
+ In case optparse ever gets removed from the stdlib, it will be shipped by
+ this module.
+
+ :copyright: (c) 2014 by Armin Ronacher.
+ :license: BSD, see LICENSE for more details.
+"""
+
+# Core classes
+from .core import Context, BaseCommand, Command, MultiCommand, Group, \
+ CommandCollection, Parameter, Option, Argument
+
+# Globals
+from .globals import get_current_context
+
+# Decorators
+from .decorators import pass_context, pass_obj, make_pass_decorator, \
+ command, group, argument, option, confirmation_option, \
+ password_option, version_option, help_option
+
+# Types
+from .types import ParamType, File, Path, Choice, IntRange, Tuple, \
+ STRING, INT, FLOAT, BOOL, UUID, UNPROCESSED
+
+# Utilities
+from .utils import echo, get_binary_stream, get_text_stream, open_file, \
+ format_filename, get_app_dir, get_os_args
+
+# Terminal functions
+from .termui import prompt, confirm, get_terminal_size, echo_via_pager, \
+ progressbar, clear, style, unstyle, secho, edit, launch, getchar, \
+ pause
+
+# Exceptions
+from .exceptions import ClickException, UsageError, BadParameter, \
+ FileError, Abort, NoSuchOption, BadOptionUsage, BadArgumentUsage, \
+ MissingParameter
+
+# Formatting
+from .formatting import HelpFormatter, wrap_text
+
+# Parsing
+from .parser import OptionParser
+
+
+__all__ = [
+ # Core classes
+ 'Context', 'BaseCommand', 'Command', 'MultiCommand', 'Group',
+ 'CommandCollection', 'Parameter', 'Option', 'Argument',
+
+ # Globals
+ 'get_current_context',
+
+ # Decorators
+ 'pass_context', 'pass_obj', 'make_pass_decorator', 'command', 'group',
+ 'argument', 'option', 'confirmation_option', 'password_option',
+ 'version_option', 'help_option',
+
+ # Types
+ 'ParamType', 'File', 'Path', 'Choice', 'IntRange', 'Tuple', 'STRING',
+ 'INT', 'FLOAT', 'BOOL', 'UUID', 'UNPROCESSED',
+
+ # Utilities
+ 'echo', 'get_binary_stream', 'get_text_stream', 'open_file',
+ 'format_filename', 'get_app_dir', 'get_os_args',
+
+ # Terminal functions
+ 'prompt', 'confirm', 'get_terminal_size', 'echo_via_pager',
+ 'progressbar', 'clear', 'style', 'unstyle', 'secho', 'edit', 'launch',
+ 'getchar', 'pause',
+
+ # Exceptions
+ 'ClickException', 'UsageError', 'BadParameter', 'FileError',
+ 'Abort', 'NoSuchOption', 'BadOptionUsage', 'BadArgumentUsage',
+ 'MissingParameter',
+
+ # Formatting
+ 'HelpFormatter', 'wrap_text',
+
+ # Parsing
+ 'OptionParser',
+]
+
+
+# Controls if click should emit the warning about the use of unicode
+# literals.
+disable_unicode_literals_warning = False
+
+
+__version__ = '6.6'
diff --git a/typeshed/third_party/3.6/click/core.pyi b/typeshed/third_party/3.6/click/core.pyi
new file mode 100644
index 0000000..fe44668
--- /dev/null
+++ b/typeshed/third_party/3.6/click/core.pyi
@@ -0,0 +1,435 @@
+from contextlib import contextmanager
+from typing import (
+ Any,
+ Callable,
+ Dict,
+ Generator,
+ Iterable,
+ List,
+ Mapping,
+ Optional,
+ Sequence,
+ Set,
+ Tuple,
+ TypeVar,
+ Union,
+)
+
+from click.formatting import HelpFormatter
+from click.parser import OptionParser
+
+
+def invoke_param_callback(
+ callback: Callable[['Context', 'Parameter', Optional[str]], Any],
+ ctx: 'Context',
+ param: 'Parameter',
+ value: Optional[str]
+) -> Any:
+ ...
+
+
+ at contextmanager
+def augment_usage_errors(
+ ctx: 'Context', param: 'Parameter' = None
+) -> Generator[None, None, None]:
+ ...
+
+
+def iter_params_for_processing(
+ invocation_order: Sequence['Parameter'],
+ declaration_order: Iterable['Parameter'],
+) -> Iterable['Parameter']:
+ ...
+
+
+class Context:
+ parent: Optional['Context']
+ command: 'Command'
+ info_name: Optional[str]
+ params: Dict
+ args: List[str]
+ protected_args: List[str]
+ obj: Any
+ default_map: Mapping[str, Any]
+ invoked_subcommand: Optional[str]
+ terminal_width: Optional[int]
+ max_content_width: Optional[int]
+ allow_extra_args: bool
+ allow_interspersed_args: bool
+ ignore_unknown_options: bool
+ help_option_names: List[str]
+ token_normalize_func: Optional[Callable[[str], str]]
+ resilient_parsing: bool
+ auto_envvar_prefix: Optional[str]
+ color: Optional[bool]
+ _meta: Dict[str, Any]
+ _close_callbacks: List
+ _depth: int
+
+ # properties
+ meta: Dict[str, Any]
+ command_path: str
+
+ def __init__(
+ self,
+ command: 'Command',
+ parent: 'Context' = None,
+ info_name: str = None,
+ obj: Any = None,
+ auto_envvar_prefix: str = None,
+ default_map: Mapping[str, Any] = None,
+ terminal_width: int = None,
+ max_content_width: int = None,
+ resilient_parsing: bool = False,
+ allow_extra_args: bool = None,
+ allow_interspersed_args: bool = None,
+ ignore_unknown_options: bool = None,
+ help_option_names: List[str] = None,
+ token_normalize_func: Callable[[str], str] = None,
+ color: bool = None
+ ) -> None:
+ ...
+
+ @contextmanager
+ def scope(self, cleanup: bool = True) -> Generator['Context', None, None]:
+ ...
+
+ def make_formatter(self) -> HelpFormatter:
+ ...
+
+ def call_on_close(self, f: Callable) -> Callable:
+ ...
+
+ def close(self) -> None:
+ ...
+
+ def find_root(self) -> 'Context':
+ ...
+
+ def find_object(self, object_type: type) -> Any:
+ ...
+
+ def ensure_object(self, object_type: type) -> Any:
+ ...
+
+ def lookup_default(self, name: str) -> Any:
+ ...
+
+ def fail(self, message: str) -> None:
+ ...
+
+ def abort(self) -> None:
+ ...
+
+ def exit(self, code: Union[int, str] = 0) -> None:
+ ...
+
+ def get_usage(self) -> str:
+ ...
+
+ def get_help(self) -> str:
+ ...
+
+ def invoke(
+ self, callback: Union['Command', Callable], *args, **kwargs
+ ) -> Any:
+ ...
+
+ def forward(
+ self, callback: Union['Command', Callable], *args, **kwargs
+ ) -> Any:
+ ...
+
+class BaseCommand:
+ allow_extra_args: bool
+ allow_interspersed_args: bool
+ ignore_unknown_options: bool
+ name: str
+ context_settings: Dict
+
+ def __init__(self, name: str, context_settings: Dict = None) -> None:
+ ...
+
+ def get_usage(self, ctx: Context) -> str:
+ ...
+
+ def get_help(self, ctx: Context) -> str:
+ ...
+
+ def make_context(
+ self, info_name: str, args: List[str], parent: Context = None, **extra
+ ) -> Context:
+ ...
+
+ def parse_args(self, ctx: Context, args: List[str]) -> List[str]:
+ ...
+
+ def invoke(self, ctx: Context) -> Any:
+ ...
+
+ def main(
+ self,
+ args: List[str] = None,
+ prog_name: str = None,
+ complete_var: str = None,
+ standalone_mode: bool = True,
+ **extra
+ ) -> Any:
+ ...
+
+ def __call__(self, *args, **kwargs) -> Any:
+ ...
+
+
+class Command(BaseCommand):
+ callback: Optional[Callable]
+ params: List['Parameter']
+ help: Optional[str]
+ epilog: Optional[str]
+ short_help: Optional[str]
+ options_metavar: str
+ add_help_option: bool
+
+ def __init__(
+ self,
+ name: str,
+ context_settings: Dict = None,
+ callback: Callable = None,
+ params: List['Parameter'] = None,
+ help: str = None,
+ epilog: str = None,
+ short_help: str = None,
+ options_metavar: str = '[OPTIONS]',
+ add_help_option: bool = True
+ ) -> None:
+ ...
+
+ def get_params(self, ctx: Context) -> List['Parameter']:
+ ...
+
+ def format_usage(
+ self,
+ ctx: Context,
+ formatter: HelpFormatter
+ ) -> None:
+ ...
+
+ def collect_usage_pieces(self, ctx: Context) -> List[str]:
+ ...
+
+ def get_help_option_names(self, ctx: Context) -> Set[str]:
+ ...
+
+ def get_help_option(self, ctx: Context) -> Optional['Option']:
+ ...
+
+ def make_parser(self, ctx: Context) -> OptionParser:
+ ...
+
+ def format_help(self, ctx: Context, formatter: HelpFormatter) -> None:
+ ...
+
+ def format_help_text(self, ctx: Context, formatter: HelpFormatter) -> None:
+ ...
+
+ def format_options(self, ctx: Context, formatter: HelpFormatter) -> None:
+ ...
+
+ def format_epilog(self, ctx: Context, formatter: HelpFormatter) -> None:
+ ...
+
+
+T = TypeVar('T')
+Decorator = Callable[[T], T]
+
+
+class MultiCommand(Command):
+ no_args_is_help: bool
+ invoke_without_command: bool
+ subcommand_metavar: str
+ chain: bool
+ result_callback: Callable
+
+ def __init__(
+ self,
+ name: str = None,
+ invoke_without_command: bool = False,
+ no_args_is_help: bool = None,
+ subcommand_metavar: str = None,
+ chain: bool = False,
+ result_callback: Callable = None,
+ **attrs
+ ) -> None:
+ ...
+
+ def resultcallback(
+ self, replace: bool = False
+ ) -> Decorator:
+ ...
+
+ def format_commands(self, ctx: Context, formatter: HelpFormatter) -> None:
+ ...
+
+ def resolve_command(
+ self, ctx: Context, args: List[str]
+ ) -> Tuple[str, Command, List[str]]:
+ ...
+
+ def get_command(self, ctx: Context, cmd_name: str) -> Optional[Command]:
+ ...
+
+ def list_commands(self, ctx: Context) -> Iterable[Command]:
+ ...
+
+
+class Group(MultiCommand):
+ commands: Dict[str, Command]
+
+ def __init__(
+ self, name: str = None, commands: Dict[str, Command] = None, **attrs
+ ) -> None:
+ ...
+
+ def add_command(self, cmd: Command, name: str = None):
+ ...
+
+ def command(self, *args, **kwargs) -> Decorator:
+ ...
+
+ def group(self, *args, **kwargs) -> Decorator:
+ ...
+
+
+class CommandCollection(MultiCommand):
+ sources: List[MultiCommand]
+
+ def __init__(
+ self, name: str = None, sources: List[MultiCommand] = None, **attrs
+ ) -> None:
+ ...
+
+ def add_source(self, multi_cmd: MultiCommand) -> None:
+ ...
+
+
+class Parameter:
+ param_type_name: str
+ name: str
+ opts: List[str]
+ secondary_opts: List[str]
+ type: 'ParamType'
+ required: bool
+ callback: Optional[Callable[[Context, 'Parameter', str], Any]]
+ nargs: int
+ multiple: bool
+ expose_value: bool
+ default: Any
+ is_eager: bool
+ metavar: Optional[str]
+ envvar: Union[str, List[str], None]
+ # properties
+ human_readable_name: str
+
+ def __init__(
+ self,
+ param_decls: List[str] = None,
+ type: Union[type, 'ParamType'] = None,
+ required: bool = False,
+ default: Any = None,
+ callback: Callable[[Context, 'Parameter', str], Any] = None,
+ nargs: int = None,
+ metavar: str = None,
+ expose_value: bool = True,
+ is_eager: bool = False,
+ envvar: Union[str, List[str]] = None
+ ) -> None:
+ ...
+
+ def make_metavar(self) -> str:
+ ...
+
+ def get_default(self, ctx: Context) -> Any:
+ ...
+
+ def add_to_parser(self, parser: OptionParser, ctx: Context) -> None:
+ ...
+
+ def consume_value(self, ctx: Context, opts: Dict[str, Any]) -> Any:
+ ...
+
+ def type_cast_value(self, ctx: Context, value: Any) -> Any:
+ ...
+
+ def process_value(self, ctx: Context, value: Any) -> Any:
+ ...
+
+ def value_is_missing(self, value: Any) -> bool:
+ ...
+
+ def full_process_value(self, ctx: Context, value: Any) -> Any:
+ ...
+
+ def resolve_envvar_value(self, ctx: Context) -> str:
+ ...
+
+ def value_from_envvar(self, ctx: Context) -> Union[str, List[str]]:
+ ...
+
+ def handle_parse_result(
+ self, ctx: Context, opts: Dict[str, Any], args: List[str]
+ ) -> Tuple[Any, List[str]]:
+ ...
+
+ def get_help_record(self, ctx: Context) -> Tuple[str, str]:
+ ...
+
+ def get_usage_pieces(self, ctx: Context) -> List[str]:
+ ...
+
+
+class Option(Parameter):
+ prompt: str # sic
+ confirmation_prompt: bool
+ hide_input: bool
+ is_flag: bool
+ flag_value: Any
+ is_bool_flag: bool
+ count: bool
+ multiple: bool
+ allow_from_autoenv: bool
+ help: Optional[str]
+ show_default: bool
+
+ def __init__(
+ self,
+ param_decls: List[str] = None,
+ show_default: bool = False,
+ prompt: Union[bool, str] = False,
+ confirmation_prompt: bool = False,
+ hide_input: bool = False,
+ is_flag: bool = None,
+ flag_value: Any = None,
+ multiple: bool = False,
+ count: bool = False,
+ allow_from_autoenv: bool = True,
+ type: Union[type, 'ParamType'] = None,
+ help: str = None,
+ **attrs
+ ) -> None:
+ ...
+
+ def prompt_for_value(self, ctx: Context) -> Any:
+ ...
+
+
+class Argument(Parameter):
+ def __init__(
+ self,
+ param_decls: List[str] = None,
+ required: bool = None,
+ **attrs
+ ) -> None:
+ ...
+
+# cyclic dependency
+from click.types import ParamType # noqa: E402
diff --git a/typeshed/third_party/3.6/click/decorators.pyi b/typeshed/third_party/3.6/click/decorators.pyi
new file mode 100644
index 0000000..a3dcddd
--- /dev/null
+++ b/typeshed/third_party/3.6/click/decorators.pyi
@@ -0,0 +1,218 @@
+from typing import Any, Callable, Dict, List, TypeVar, Union
+
+from click.core import Command, Group, Argument, Option, Parameter, Context
+from click.types import ParamType
+
+T = TypeVar('T')
+Decorator = Callable[[T], T]
+
+
+def pass_context(T) -> T:
+ ...
+
+
+def pass_obj(T) -> T:
+ ...
+
+
+def make_pass_decorator(
+ object_type: type, ensure: bool = False
+) -> Callable[[T], T]:
+ ...
+
+
+# NOTE: Decorators below have **attrs converted to concrete constructor
+# arguments from core.pyi to help with type checking.
+
+def command(
+ name: str = None,
+ cls: type = Command,
+ # Command
+ help: str = None,
+ epilog: str = None,
+ short_help: str = None,
+ options_metavar: str = '[OPTIONS]',
+ add_help_option: bool = True,
+) -> Decorator:
+ ...
+
+
+# This inherits attrs from Group, MultiCommand and Command.
+
+def group(
+ name: str = None,
+ cls: type = Group,
+ # Group
+ commands: Dict[str, Command] = None,
+ # MultiCommand
+ invoke_without_command: bool = False,
+ no_args_is_help: bool = None,
+ subcommand_metavar: str = None,
+ chain: bool = False,
+ result_callback: Callable = None,
+ # Command
+ help: str = None,
+ epilog: str = None,
+ short_help: str = None,
+ options_metavar: str = '[OPTIONS]',
+ add_help_option: bool = True,
+) -> Decorator:
+ ...
+
+
+def argument(
+ *param_decls: str,
+ cls: type = Argument,
+ # Argument
+ required: bool = None,
+ # Parameter
+ type: Union[type, ParamType] = None,
+ default: Any = None,
+ callback: Callable[[Context, Parameter, str], Any] = None,
+ nargs: int = None,
+ metavar: str = None,
+ expose_value: bool = True,
+ is_eager: bool = False,
+ envvar: Union[str, List[str]] = None
+) -> Decorator:
+ ...
+
+
+def option(
+ *param_decls: str,
+ cls: type = Option,
+ # Option
+ show_default: bool = False,
+ prompt: bool = False,
+ confirmation_prompt: bool = False,
+ hide_input: bool = False,
+ is_flag: bool = None,
+ flag_value: Any = None,
+ multiple: bool = False,
+ count: bool = False,
+ allow_from_autoenv: bool = True,
+ type: Union[type, ParamType] = None,
+ help: str = None,
+ # Parameter
+ default: Any = None,
+ callback: Callable[[Context, Parameter, str], Any] = None,
+ nargs: int = None,
+ metavar: str = None,
+ expose_value: bool = True,
+ is_eager: bool = False,
+ envvar: Union[str, List[str]] = None
+) -> Decorator:
+ ...
+
+
+# Defaults copied from the decorator body.
+def confirmation_option(
+ *param_decls: str,
+ cls: type = Option,
+ # Option
+ show_default: bool = False,
+ prompt: str = 'Do you want to continue?',
+ confirmation_prompt: bool = False,
+ hide_input: bool = False,
+ is_flag: bool = True,
+ flag_value: Any = None,
+ multiple: bool = False,
+ count: bool = False,
+ allow_from_autoenv: bool = True,
+ type: Union[type, ParamType] = None,
+ help: str = 'Confirm the action without prompting.',
+ # Parameter
+ default: Any = None,
+ callback: Callable[[Context, Parameter, str], Any] = None,
+ nargs: int = None,
+ metavar: str = None,
+ expose_value: bool = False,
+ is_eager: bool = False,
+ envvar: Union[str, List[str]] = None
+) -> Decorator:
+ ...
+
+
+# Defaults copied from the decorator body.
+def password_option(
+ *param_decls: str,
+ cls: type = Option,
+ # Option
+ show_default: bool = False,
+ prompt: bool = True,
+ confirmation_prompt: bool = True,
+ hide_input: bool = True,
+ is_flag: bool = None,
+ flag_value: Any = None,
+ multiple: bool = False,
+ count: bool = False,
+ allow_from_autoenv: bool = True,
+ type: Union[type, ParamType] = None,
+ help: str = None,
+ # Parameter
+ default: Any = None,
+ callback: Callable[[Context, Parameter, str], Any] = None,
+ nargs: int = None,
+ metavar: str = None,
+ expose_value: bool = True,
+ is_eager: bool = False,
+ envvar: Union[str, List[str]] = None
+) -> Decorator:
+ ...
+
+
+# Defaults copied from the decorator body.
+def version_option(
+ version: str = None,
+ *param_decls: str,
+ cls: type = Option,
+ # Option
+ show_default: bool = False,
+ prompt: bool = False,
+ confirmation_prompt: bool = False,
+ hide_input: bool = False,
+ is_flag: bool = True,
+ flag_value: Any = None,
+ multiple: bool = False,
+ count: bool = False,
+ allow_from_autoenv: bool = True,
+ type: Union[type, ParamType] = None,
+ help: str = 'Show the version and exit.',
+ # Parameter
+ default: Any = None,
+ callback: Callable[[Context, Parameter, str], Any] = None,
+ nargs: int = None,
+ metavar: str = None,
+ expose_value: bool = False,
+ is_eager: bool = True,
+ envvar: Union[str, List[str]] = None
+) -> Decorator:
+ ...
+
+
+# Defaults copied from the decorator body.
+def help_option(
+ *param_decls: str,
+ cls: type = Option,
+ # Option
+ show_default: bool = False,
+ prompt: bool = False,
+ confirmation_prompt: bool = False,
+ hide_input: bool = False,
+ is_flag: bool = True,
+ flag_value: Any = None,
+ multiple: bool = False,
+ count: bool = False,
+ allow_from_autoenv: bool = True,
+ type: Union[type, ParamType] = None,
+ help: str = 'Show this message and exit.',
+ # Parameter
+ default: Any = None,
+ callback: Callable[[Context, Parameter, str], Any] = None,
+ nargs: int = None,
+ metavar: str = None,
+ expose_value: bool = False,
+ is_eager: bool = True,
+ envvar: Union[str, List[str]] = None
+) -> Decorator:
+ ...
diff --git a/typeshed/third_party/3.6/click/exceptions.pyi b/typeshed/third_party/3.6/click/exceptions.pyi
new file mode 100644
index 0000000..7d49ae6
--- /dev/null
+++ b/typeshed/third_party/3.6/click/exceptions.pyi
@@ -0,0 +1,91 @@
+from typing import IO, List, Optional
+
+from click.core import Context, Parameter
+
+
+class ClickException(Exception):
+ exit_code: int
+ message: str
+
+ def __init__(self, message: str) -> None:
+ ...
+
+ def format_message(self) -> str:
+ ...
+
+ def show(self, file=None) -> None:
+ ...
+
+
+class UsageError(ClickException):
+ ctx: Optional[Context]
+
+ def __init__(self, message: str, ctx: Context = None) -> None:
+ ...
+
+ def show(self, file: IO = None) -> None:
+ ...
+
+
+class BadParameter(UsageError):
+ param: Optional[Parameter]
+ param_hint: Optional[str]
+
+ def __init__(
+ self,
+ message: str,
+ ctx: Context = None,
+ param: Parameter = None,
+ param_hint: str = None
+ ) -> None:
+ ...
+
+
+class MissingParameter(BadParameter):
+ param_type: str # valid values: 'parameter', 'option', 'argument'
+
+ def __init__(
+ self,
+ message: str = None,
+ ctx: Context = None,
+ param: Parameter = None,
+ param_hint: str = None,
+ param_type: str = None
+ ) -> None:
+ ...
+
+
+class NoSuchOption(UsageError):
+ option_name: str
+ possibilities: Optional[List[str]]
+
+ def __init__(
+ self,
+ option_name: str,
+ message: str = None,
+ possibilities: List[str] = None,
+ ctx: Context = None
+ ) -> None:
+ ...
+
+
+class BadOptionUsage(UsageError):
+ def __init__(self, message: str, ctx: Context = None) -> None:
+ ...
+
+
+class BadArgumentUsage(UsageError):
+ def __init__(self, message: str, ctx: Context = None) -> None:
+ ...
+
+
+class FileError(ClickException):
+ ui_filename: str
+ filename: str
+
+ def __init__(self, filename: str, hint: str = None) -> None:
+ ...
+
+
+class Abort(RuntimeError):
+ ...
diff --git a/typeshed/third_party/3.6/click/formatting.pyi b/typeshed/third_party/3.6/click/formatting.pyi
new file mode 100644
index 0000000..5ff1349
--- /dev/null
+++ b/typeshed/third_party/3.6/click/formatting.pyi
@@ -0,0 +1,89 @@
+from contextlib import contextmanager
+from typing import Generator, Iterable, List, Optional, Tuple
+
+
+FORCED_WIDTH: Optional[int]
+
+
+def measure_table(rows: Iterable[Iterable[str]]) -> Tuple[int, ...]:
+ ...
+
+
+def iter_rows(
+ rows: Iterable[Iterable[str]], col_count: int
+) -> Generator[Tuple[str, ...], None, None]:
+ ...
+
+
+def wrap_text(
+ text: str,
+ width: int = 78,
+ initial_indent: str = '',
+ subsequent_indent: str = '',
+ preserve_paragraphs: bool = False
+) -> str:
+ ...
+
+
+class HelpFormatter:
+ indent_increment: int
+ width: Optional[int]
+ current_indent: int
+ buffer: List[str]
+
+ def __init__(
+ self,
+ indent_increment: int = 2,
+ width: int = None,
+ max_width: int = None,
+ ) -> None:
+ ...
+
+ def write(self, string: str) -> None:
+ ...
+
+ def indent(self) -> None:
+ ...
+
+ def dedent(self) -> None:
+ ...
+
+ def write_usage(
+ self,
+ prog: str,
+ args: str = '',
+ prefix: str = 'Usage: ',
+ ):
+ ...
+
+ def write_heading(self, heading: str) -> None:
+ ...
+
+ def write_paragraph(self) -> None:
+ ...
+
+ def write_text(self, text: str) -> None:
+ ...
+
+ def write_dl(
+ self,
+ rows: Iterable[Iterable[str]],
+ col_max: int = 30,
+ col_spacing: int = 2,
+ ) -> None:
+ ...
+
+ @contextmanager
+ def section(self, name) -> Generator[None, None, None]:
+ ...
+
+ @contextmanager
+ def indentation(self) -> Generator[None, None, None]:
+ ...
+
+ def getvalue(self) -> str:
+ ...
+
+
+def join_options(options: List[str]) -> Tuple[str, bool]:
+ ...
diff --git a/typeshed/third_party/3.6/click/globals.pyi b/typeshed/third_party/3.6/click/globals.pyi
new file mode 100644
index 0000000..934ca7d
--- /dev/null
+++ b/typeshed/third_party/3.6/click/globals.pyi
@@ -0,0 +1,17 @@
+from click.core import Optional, Context
+
+
+def get_current_context(silent: bool = False) -> Context:
+ ...
+
+
+def push_context(ctx: Context) -> None:
+ ...
+
+
+def pop_context() -> None:
+ ...
+
+
+def resolve_color_default(color: bool = None) -> Optional[bool]:
+ ...
diff --git a/typeshed/third_party/3.6/click/parser.pyi b/typeshed/third_party/3.6/click/parser.pyi
new file mode 100644
index 0000000..3919966
--- /dev/null
+++ b/typeshed/third_party/3.6/click/parser.pyi
@@ -0,0 +1,102 @@
+from typing import Any, Dict, Iterable, List, Optional, Set, Tuple
+
+from click.core import Context
+
+
+def _unpack_args(
+ args: Iterable[str], nargs_spec: Iterable[int]
+) -> Tuple[Tuple[Optional[Tuple[str, ...]], ...], List[str]]:
+ ...
+
+
+def split_opt(opt: str) -> Tuple[str, str]:
+ ...
+
+
+def normalize_opt(opt: str, ctx: Context) -> str:
+ ...
+
+
+def split_arg_string(string: str) -> List[str]:
+ ...
+
+
+class Option:
+ dest: str
+ action: str
+ nargs: int
+ const: Any
+ obj: Any
+ prefixes: Set[str]
+ _short_opts: List[str]
+ _long_opts: List[str]
+ # properties
+ takes_value: bool
+
+ def __init__(
+ self,
+ opts: Iterable[str],
+ dest: str,
+ action: str = None,
+ nargs: int = 1,
+ const: Any = None,
+ obj: Any = None
+ ) -> None:
+ ...
+
+ def process(self, value: Any, state: 'ParsingState') -> None:
+ ...
+
+
+class Argument:
+ dest: str
+ nargs: int
+ obj: Any
+
+ def __init__(self, dest: str, nargs: int = 1, obj: Any = None) -> None:
+ ...
+
+ def process(self, value: Any, state: 'ParsingState') -> None:
+ ...
+
+
+class ParsingState:
+ opts: Dict[str, Any]
+ largs: List[str]
+ rargs: List[str]
+ order: List[Any]
+
+ def __init__(self, rargs: List[str]) -> None:
+ ...
+
+
+class OptionParser:
+ ctx: Optional[Context]
+ allow_interspersed_args: bool
+ ignore_unknown_options: bool
+ _short_opt: Dict[str, Option]
+ _long_opt: Dict[str, Option]
+ _opt_prefixes: Set[str]
+ _args: List[Argument]
+
+ def __init__(self, ctx: Context = None) -> None:
+ ...
+
+ def add_option(
+ self,
+ opts: Iterable[str],
+ dest: str,
+ action: str = None,
+ nargs: int = 1,
+ const: Any = None,
+ obj: Any = None
+ ) -> None:
+ ...
+
+ def add_argument(self, dest: str, nargs: int = 1, obj: Any = None) -> None:
+ ...
+
+ def parse_args(
+ self, args: List[str]
+ ) -> Tuple[Dict[str, Any], List[str], List[Any]]:
+ ...
diff --git a/typeshed/third_party/3.6/click/termui.pyi b/typeshed/third_party/3.6/click/termui.pyi
new file mode 100644
index 0000000..33ea7f4
--- /dev/null
+++ b/typeshed/third_party/3.6/click/termui.pyi
@@ -0,0 +1,147 @@
+from contextlib import contextmanager
+from typing import (
+ Any,
+ Callable,
+ Generator,
+ Iterable,
+ IO,
+ List,
+ Optional,
+ Tuple,
+ TypeVar,
+)
+
+
+def hidden_prompt_func(prompt: str) -> str:
+ ...
+
+
+def _build_prompt(
+ text: str,
+ suffix: str,
+ show_default: bool = False,
+ default: str = None,
+) -> str:
+ ...
+
+
+def prompt(
+ text: str,
+ default: str = None,
+ hide_input: bool = False,
+ confirmation_prompt: bool = False,
+ type: Any = None,
+ value_proc: Callable[[Optional[str]], Any] = None,
+ prompt_suffix: str = ': ',
+ show_default: bool = True,
+ err: bool = False,
+) -> Any:
+ ...
+
+
+def confirm(
+ text: str,
+ default: bool = False,
+ abort: bool = False,
+ prompt_suffix: str = ': ',
+ show_default: bool = True,
+ err: bool = False,
+) -> bool:
+ ...
+
+
+def get_terminal_size() -> Tuple[int, int]:
+ ...
+
+
+def echo_via_pager(text: str, color: bool = None) -> None:
+ ...
+
+
+T = TypeVar('T')
+
+
+ at contextmanager
+def progressbar(
+ iterable=Iterable[T],
+ length: int = None,
+ label: str = None,
+ show_eta: bool = True,
+ show_percent: bool = None,
+ show_pos: bool = False,
+ item_show_func: Callable[[T], str] = None,
+ fill_char: str = '#',
+ empty_char: str = '-',
+ bar_template: str = '%(label)s [%(bar)s] %(info)s',
+ info_sep: str = ' ',
+ width: int = 36,
+ file: IO = None,
+ color: bool = None,
+) -> Generator[T, None, None]:
+ ...
+
+
+def clear() -> None:
+ ...
+
+
+def style(
+ text: str,
+ fg: str = None,
+ bg: str = None,
+ bold: bool = None,
+ dim: bool = None,
+ underline: bool = None,
+ blink: bool = None,
+ reverse: bool = None,
+ reset: bool = True,
+):
+ ...
+
+
+def unstyle(text: str) -> str:
+ ...
+
+
+# Styling options copied from style() for nicer type checking.
+def secho(
+ text: str,
+ file: IO = None,
+ nl: bool =True,
+ err: bool = False,
+ color: bool = None,
+ fg: str = None,
+ bg: str = None,
+ bold: bool = None,
+ dim: bool = None,
+ underline: bool = None,
+ blink: bool = None,
+ reverse: bool = None,
+ reset: bool = True,
+):
+ ...
+
+
+def edit(
+ text: str = None,
+ editor: str = None,
+ env: str = None,
+ require_save: bool = True,
+ extension: str = '.txt',
+ filename: str = None,
+) -> str:
+ ...
+
+
+def launch(url: str, wait: bool = False, locate: bool = False) -> int:
+ ...
+
+
+def getchar(echo: bool = False) -> str:
+ ...
+
+
+def pause(
+ info: str ='Press any key to continue ...', err: bool = False
+) -> None:
+ ...
diff --git a/typeshed/third_party/3.6/click/types.pyi b/typeshed/third_party/3.6/click/types.pyi
new file mode 100644
index 0000000..9d06a6f
--- /dev/null
+++ b/typeshed/third_party/3.6/click/types.pyi
@@ -0,0 +1,283 @@
+from typing import Any, Callable, IO, Iterable, List, Optional, TypeVar, Union
+import uuid
+
+from click.core import Context, Parameter
+
+
+class ParamType:
+ name: str
+ is_composite: bool
+ envvar_list_splitter: Optional[str]
+
+ def __call__(
+ self,
+ value: Optional[str],
+ param: Parameter = None,
+ ctx: Context = None,
+ ) -> Any:
+ ...
+
+ def get_metavar(self, param: Parameter) -> str:
+ ...
+
+ def get_missing_message(self, param: Parameter) -> str:
+ ...
+
+ def convert(
+ self,
+ value: str,
+ param: Optional[Parameter],
+ ctx: Optional[Context],
+ ) -> Any:
+ ...
+
+ def split_envvar_value(self, rv: str) -> List[str]:
+ ...
+
+ def fail(self, message: str, param: Parameter = None, ctx: Context = None) -> None:
+ ...
+
+
+class BoolParamType(ParamType):
+ def __call__(
+ self,
+ value: Optional[str],
+ param: Parameter = None,
+ ctx: Context = None,
+ ) -> bool:
+ ...
+
+ def convert(
+ self,
+ value: str,
+ param: Optional[Parameter],
+ ctx: Optional[Context],
+ ) -> bool:
+ ...
+
+
+class CompositeParamType(ParamType):
+ arity: int
+
+
+class Choice(ParamType):
+ choices: Iterable[str]
+ def __init__(self, choices: Iterable[str]) -> None:
+ ...
+
+
+class FloatParamType(ParamType):
+ def __call__(
+ self,
+ value: Optional[str],
+ param: Parameter = None,
+ ctx: Context = None,
+ ) -> float:
+ ...
+
+ def convert(
+ self,
+ value: str,
+ param: Optional[Parameter],
+ ctx: Optional[Context],
+ ) -> float:
+ ...
+
+
+class FloatRange(FloatParamType):
+ ...
+
+
+class File(ParamType):
+ def __init__(
+ self,
+ mode: str = 'r',
+ encoding: str = None,
+ errors: str = None,
+ lazy: bool = None,
+ atomic: bool = None,
+ ) -> None:
+ ...
+
+ def __call__(
+ self,
+ value: Optional[str],
+ param: Parameter = None,
+ ctx: Context = None,
+ ) -> IO:
+ ...
+
+ def convert(
+ self,
+ value: str,
+ param: Optional[Parameter],
+ ctx: Optional[Context],
+ ) -> IO:
+ ...
+
+ def resolve_lazy_flag(self, value: str) -> bool:
+ ...
+
+
+F = TypeVar('F') # result of the function
+Func = Callable[[Optional[str]], F]
+
+
+class FuncParamType(ParamType):
+ func: Func
+
+ def __init__(self, func: Func) -> None:
+ ...
+
+ def __call__(
+ self,
+ value: Optional[str],
+ param: Parameter = None,
+ ctx: Context = None,
+ ) -> F:
+ ...
+
+ def convert(
+ self,
+ value: str,
+ param: Optional[Parameter],
+ ctx: Optional[Context],
+ ) -> F:
+ ...
+
+
+class IntParamType(ParamType):
+ def __call__(
+ self,
+ value: Optional[str],
+ param: Parameter = None,
+ ctx: Context = None,
+ ) -> int:
+ ...
+
+ def convert(
+ self,
+ value: str,
+ param: Optional[Parameter],
+ ctx: Optional[Context],
+ ) -> int:
+ ...
+
+
+class IntRange(IntParamType):
+ def __init__(
+ self, min: int = None, max: int = None, clamp: bool = False
+ ) -> None:
+ ...
+
+
+PathType = TypeVar('PathType', str, bytes)
+
+
+class Path(ParamType):
+ def __init__(
+ self,
+ exists: bool = False,
+ file_okay: bool = True,
+ dir_okay: bool = True,
+ writable: bool = False,
+ readable: bool = True,
+ resolve_path: bool = False,
+ allow_dash: bool = False,
+ path_type: PathType = None,
+ ) -> None:
+ ...
+
+ def coerce_path_result(self, rv: Union[str, bytes]) -> PathType:
+ ...
+
+ def __call__(
+ self,
+ value: Optional[str],
+ param: Parameter = None,
+ ctx: Context = None,
+ ) -> PathType:
+ ...
+
+ def convert(
+ self,
+ value: str,
+ param: Optional[Parameter],
+ ctx: Optional[Context],
+ ) -> PathType:
+ ...
+
+class StringParamType(ParamType):
+ def __call__(
+ self,
+ value: Optional[str],
+ param: Parameter = None,
+ ctx: Context = None,
+ ) -> str:
+ ...
+
+ def convert(
+ self,
+ value: str,
+ param: Optional[Parameter],
+ ctx: Optional[Context],
+ ) -> str:
+ ...
+
+
+class Tuple(CompositeParamType):
+ types: List[ParamType]
+
+ def __init__(self, types: Iterable[Any]) -> None:
+ ...
+
+ def __call__(
+ self,
+ value: Optional[str],
+ param: Parameter = None,
+ ctx: Context = None,
+ ) -> Tuple:
+ ...
+
+ def convert(
+ self,
+ value: str,
+ param: Optional[Parameter],
+ ctx: Optional[Context],
+ ) -> Tuple:
+ ...
+
+
+class UnprocessedParamType(ParamType):
+ ...
+
+
+class UUIDParameterType(ParamType):
+ def __call__(
+ self,
+ value: Optional[str],
+ param: Parameter = None,
+ ctx: Context = None,
+ ) -> uuid.UUID:
+ ...
+
+ def convert(
+ self,
+ value: str,
+ param: Optional[Parameter],
+ ctx: Optional[Context],
+ ) -> uuid.UUID:
+ ...
+
+
+def convert_type(ty: Any, default: Any = None) -> ParamType:
+ ...
+
+# parameter type shortcuts
+
+BOOL = BoolParamType()
+FLOAT = FloatParamType()
+INT = IntParamType()
+STRING = StringParamType()
+UNPROCESSED = UnprocessedParamType()
+UUID = UUIDParameterType()
diff --git a/typeshed/third_party/3.6/click/utils.pyi b/typeshed/third_party/3.6/click/utils.pyi
new file mode 100644
index 0000000..389659f
--- /dev/null
+++ b/typeshed/third_party/3.6/click/utils.pyi
@@ -0,0 +1,118 @@
+from typing import Any, Callable, Iterator, IO, List, Optional, TypeVar, Union
+
+
+T = TypeVar('T')
+Decorator = Callable[[T], T]
+
+
+def _posixify(name: str) -> str:
+ ...
+
+
+def safecall(func: T) -> T:
+ ...
+
+
+def make_str(value: Any) -> str:
+ ...
+
+
+def make_default_short_help(help: str, max_length: int = 45):
+ ...
+
+
+class LazyFile:
+ name: str
+ mode: str
+ encoding: Optional[str]
+ errors: str
+ atomic: bool
+
+ def __init__(
+ self,
+ filename: str,
+ mode: str = 'r',
+ encoding: str = None,
+ errors: str = 'strict',
+ atomic: bool = False
+ ) -> None:
+ ...
+
+ def open(self) -> IO:
+ ...
+
+ def close(self) -> None:
+ ...
+
+ def close_intelligently(self) -> None:
+ ...
+
+ def __enter__(self) -> 'LazyFile':
+ ...
+
+ def __exit__(self, exc_type, exc_value, tb):
+ ...
+
+ def __iter__(self) -> Iterator:
+ ...
+
+
+class KeepOpenFile(object):
+ _file: IO
+
+ def __init__(self, file: IO) -> None:
+ ...
+
+ def __enter__(self) -> 'KeepOpenFile':
+ ...
+
+ def __exit__(self, exc_type, exc_value, tb):
+ ...
+
+ def __iter__(self) -> Iterator:
+ ...
+
+
+def echo(
+ message: str = None,
+ file: IO = None,
+ nl: bool = True,
+ err: bool = False,
+ color: bool = None,
+) -> None:
+ ...
+
+
+def get_binary_stream(name: str) -> IO[bytes]:
+ ...
+
+
+def get_text_stream(
+ name: str, encoding: str = None, errors: str = 'strict'
+) -> IO[str]:
+ ...
+
+
+def open_file(
+ filename: str,
+ mode: str = 'r',
+ encoding: str = None,
+ errors: str = 'strict',
+ lazy: bool = False,
+ atomic: bool = False
+) -> Union[IO, LazyFile, KeepOpenFile]:
+ ...
+
+
+def get_os_args() -> List[str]:
+ ...
+
+
+def format_filename(filename: str, shorten: bool = False) -> str:
+ ...
+
+
+def get_app_dir(
+ app_name: str, roaming: bool = True, force_posix: bool = False
+) -> str:
+ ...
diff --git a/mypy/test/__init__.py b/typeshed/third_party/3/dateutil/__init__.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/third_party/3/dateutil/__init__.pyi
diff --git a/typeshed/third_party/3/dateutil/parser.pyi b/typeshed/third_party/3/dateutil/parser.pyi
new file mode 100644
index 0000000..32df996
--- /dev/null
+++ b/typeshed/third_party/3/dateutil/parser.pyi
@@ -0,0 +1,52 @@
+from typing import List, Tuple, Optional, Callable, Union, IO, Any
+from datetime import datetime
+
+__all__ = ... # type: List[str]
+
+
+class parserinfo(object):
+ JUMP = ... # type: List[str]
+ WEEKDAYS = ... # type: List[Tuple[str, str]]
+ MONTHS = ... # type: List[Tuple[str, str]]
+ HMS = ... # type: List[Tuple[str, str, str]]
+ AMPM = ... # type: List[Tuple[str, str, str]]
+ UTCZONE = ... # type: List[str]
+ PERTAIN = ... # type: List[str]
+ TZOFFSET = ... # type: Dict[str, int]
+
+ def __init__(self, dayfirst: bool=..., yearfirst: bool=...) -> None: ...
+ def jump(self, name: str) -> bool: ...
+ def weekday(self, name: str) -> str: ...
+ def month(self, name: str) -> str: ...
+ def hms(self, name: str) -> str: ...
+ def ampm(self, name: str) -> str: ...
+ def pertain(self, name: str) -> bool: ...
+ def utczone(self, name: str) -> bool: ...
+ def tzoffset(self, name: str) -> int: ...
+ def convertyear(self, year: int) -> int: ...
+ def validate(self, year: datetime) -> bool: ...
+
+
+class parser(object):
+ def __init__(self, info: parserinfo=...) -> None: ...
+
+ def parse(
+ self,
+ timestr: Union[str, bytes, IO[Any]],
+ default: Optional[datetime],
+ ignoretz: bool=...,
+ tzinfos: Any =...,
+ ) -> datetime: ...
+
+DEFAULTPARSER = ... # type: parser
+
+
+def parse(timestr, parserinfo: parserinfo=..., **kwargs) -> datetime:
+ ...
+
+
+class _tzparser(object):
+ ...
+
+
+DEFAULTTZPARSER = ... # type: _tzparser
diff --git a/typeshed/third_party/3/dateutil/relativedelta.pyi b/typeshed/third_party/3/dateutil/relativedelta.pyi
new file mode 100644
index 0000000..35e6d07
--- /dev/null
+++ b/typeshed/third_party/3/dateutil/relativedelta.pyi
@@ -0,0 +1,112 @@
+from typing import Optional, overload, Union
+from datetime import date, datetime, timedelta
+
+__all__ = ... # type: List[str]
+
+
+class weekday(object):
+ def __init__(self, weekday: int, n: Optional[int]=...) -> None: ...
+
+ def __call__(self, n: int) -> 'weekday': ...
+
+ def __eq__(self, other) -> bool: ...
+
+ def __repr__(self) -> str: ...
+
+ weekday = ... # type: int
+ n = ... # type: int
+
+MO = ... # type: weekday
+TU = ... # type: weekday
+WE = ... # type: weekday
+TH = ... # type: weekday
+FR = ... # type: weekday
+SA = ... # type: weekday
+SU = ... # type: weekday
+
+
+class relativedelta(object):
+ def __init__(self,
+ dt1: Optional[date]=...,
+ dt2: Optional[date]=...,
+ years: Optional[int]=..., months: Optional[int]=...,
+ days: Optional[int]=..., leapdays: Optional[int]=...,
+ weeks: Optional[int]=...,
+ hours: Optional[int]=..., minutes: Optional[int]=...,
+ seconds: Optional[int]=..., microseconds: Optional[int]=...,
+ year: Optional[int]=..., month: Optional[int]=...,
+ day: Optional[int]=...,
+ weekday: Optional[Union[int, weekday]]=...,
+ yearday: Optional[int]=...,
+ nlyearday: Optional[int]=...,
+ hour: Optional[int]=..., minute: Optional[int]=...,
+ second: Optional[int]=...,
+ microsecond: Optional[int]=...) -> None: ...
+
+ @property
+ def weeks(self) -> int: ...
+
+ @weeks.setter
+ def weeks(self, value: int) -> None: ...
+
+ def normalized(self) -> 'relativedelta': ...
+
+ # TODO: use Union when mypy will handle it properly in overloaded operator
+ # methods (#2129, #1442, #1264 in mypy)
+ @overload
+ def __add__(self, other: 'relativedelta') -> 'relativedelta': ...
+
+ @overload
+ def __add__(self, other: timedelta) -> 'relativedelta': ...
+
+ @overload
+ def __add__(self, other: date) -> date: ...
+
+ @overload
+ def __add__(self, other: datetime) -> datetime: ...
+
+ @overload
+ def __radd__(self, other: 'relativedelta') -> 'relativedelta': ...
+
+ @overload
+ def __radd__(self, other: timedelta) -> 'relativedelta': ...
+
+ @overload
+ def __radd__(self, other: date) -> date: ...
+
+ @overload
+ def __radd__(self, other: datetime) -> datetime: ...
+
+ @overload
+ def __rsub__(self, other: 'relativedelta') -> 'relativedelta': ...
+
+ @overload
+ def __rsub__(self, other: timedelta) -> 'relativedelta': ...
+
+ @overload
+ def __rsub__(self, other: date) -> date: ...
+
+ @overload
+ def __rsub__(self, other: datetime) -> datetime: ...
+
+ def __sub__(self, other: 'relativedelta') -> 'relativedelta': ...
+
+ def __neg__(self) -> 'relativedelta': ...
+
+ def __bool__(self) -> bool: ...
+
+ def __nonzero__(self) -> bool: ...
+
+ def __mul__(self, other: float) -> 'relativedelta': ...
+
+ def __rmul__(self, other: float) -> 'relativedelta': ...
+
+ def __eq__(self, other) -> bool: ...
+
+ def __ne__(self, other: object) -> bool: ...
+
+ def __div__(self, other: float) -> 'relativedelta': ...
+
+ def __truediv__(self, other: float) -> 'relativedelta': ...
+
+ def __repr__(self) -> str: ...
diff --git a/typeshed/third_party/3/docutils/__init__.pyi b/typeshed/third_party/3/docutils/__init__.pyi
new file mode 100644
index 0000000..eb1ae45
--- /dev/null
+++ b/typeshed/third_party/3/docutils/__init__.pyi
@@ -0,0 +1 @@
+...
diff --git a/typeshed/third_party/3/docutils/examples.pyi b/typeshed/third_party/3/docutils/examples.pyi
new file mode 100644
index 0000000..0abfc7b
--- /dev/null
+++ b/typeshed/third_party/3/docutils/examples.pyi
@@ -0,0 +1,3 @@
+from typing import Any
+
+html_parts = ... # type: Any
diff --git a/typeshed/third_party/3/docutils/nodes.pyi b/typeshed/third_party/3/docutils/nodes.pyi
new file mode 100644
index 0000000..f747fb1
--- /dev/null
+++ b/typeshed/third_party/3/docutils/nodes.pyi
@@ -0,0 +1,8 @@
+from typing import Any, List
+
+class reference:
+ def __init__(self,
+ rawsource: str = ...,
+ text: str = ...,
+ *children: List[Any],
+ **attributes) -> None: ...
diff --git a/typeshed/third_party/3/docutils/parsers/__init__.pyi b/typeshed/third_party/3/docutils/parsers/__init__.pyi
new file mode 100644
index 0000000..eb1ae45
--- /dev/null
+++ b/typeshed/third_party/3/docutils/parsers/__init__.pyi
@@ -0,0 +1 @@
+...
diff --git a/mypy/test/__init__.py b/typeshed/third_party/3/docutils/parsers/rst/__init__.pyi
similarity index 100%
copy from mypy/test/__init__.py
copy to typeshed/third_party/3/docutils/parsers/rst/__init__.pyi
diff --git a/typeshed/third_party/3/docutils/parsers/rst/nodes.pyi b/typeshed/third_party/3/docutils/parsers/rst/nodes.pyi
new file mode 100644
index 0000000..eb1ae45
--- /dev/null
+++ b/typeshed/third_party/3/docutils/parsers/rst/nodes.pyi
@@ -0,0 +1 @@
+...
diff --git a/typeshed/third_party/3/docutils/parsers/rst/roles.pyi b/typeshed/third_party/3/docutils/parsers/rst/roles.pyi
new file mode 100644
index 0000000..7307e58
--- /dev/null
+++ b/typeshed/third_party/3/docutils/parsers/rst/roles.pyi
@@ -0,0 +1,10 @@
+import docutils.nodes
+import docutils.parsers.rst.states
+
+from typing import Callable, Any, List, Dict, Tuple
+
+def register_local_role(name: str,
+ role_fn: Callable[[str, str, str, int, docutils.parsers.rst.states.Inliner, Dict, List],
+ Tuple[List[docutils.nodes.reference], List[docutils.nodes.reference]]]
+ ) -> None:
+ ...
diff --git a/typeshed/third_party/3/docutils/parsers/rst/states.pyi b/typeshed/third_party/3/docutils/parsers/rst/states.pyi
new file mode 100644
index 0000000..e39d2bc
--- /dev/null
+++ b/typeshed/third_party/3/docutils/parsers/rst/states.pyi
@@ -0,0 +1,5 @@
+import typing
+
+class Inliner:
+ def __init__(self) -> None:
+ ...
diff --git a/typeshed/third_party/3/enum.pyi b/typeshed/third_party/3/enum.pyi
new file mode 100644
index 0000000..3b97e1b
--- /dev/null
+++ b/typeshed/third_party/3/enum.pyi
@@ -0,0 +1,50 @@
+# FIXME: Stub incomplete, ommissions include:
+# * the metaclass
+# * _sunder_ methods with their transformations
+
+import sys
+from typing import List, Any, TypeVar, Union
+
+class Enum:
+ def __new__(cls, value: Any) -> None: ...
+ def __repr__(self) -> str: ...
+ def __str__(self) -> str: ...
+ def __dir__(self) -> List[str]: ...
+ def __format__(self, format_spec: str) -> str: ...
+ def __hash__(self) -> Any: ...
+ def __reduce_ex__(self, proto: Any) -> Any: ...
+
+ name = ... # type: str
+ value = ... # type: Any
+
+class IntEnum(int, Enum):
+ value = ... # type: int
+
+_T = TypeVar('_T')
+
+def unique(enumeration: _T) -> _T: ...
+
+if sys.version_info >= (3, 6):
+ _auto_null = ... # type: Any
+
+ class auto:
+ value = ... # type: Any
+
+ class Flag(Enum):
+ def __contains__(self: _T, other: _T) -> bool: ...
+ def __repr__(self) -> str: ...
+ def __str__(self) -> str: ...
+ def __bool__(self) -> bool: ...
+ def __or__(self: _T, other: _T) -> _T: ...
+ def __and__(self: _T, other: _T) -> _T: ...
+ def __xor__(self: _T, other: _T) -> _T: ...
+ def __invert__(self: _T) -> _T: ...
+
+ # All `type: ignore` comments below due to IntFlag making the function signatures more permissive.
+ class IntFlag(int, Flag): # type: ignore
+ def __or__(self: _T, other: Union[int, _T]) -> _T: ... # type: ignore
+ def __and__(self: _T, other: Union[int, _T]) -> _T: ... # type: ignore
+ def __xor__(self: _T, other: Union[int, _T]) -> _T: ... # type: ignore
+ __ror__ = __or__
+ __rand__ = __and__
+ __rxor__ = __xor__
diff --git a/typeshed/third_party/3/itsdangerous.pyi b/typeshed/third_party/3/itsdangerous.pyi
new file mode 100644
index 0000000..efa51df
--- /dev/null
+++ b/typeshed/third_party/3/itsdangerous.pyi
@@ -0,0 +1,156 @@
+# Stubs for itsdangerous (Python 3)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from datetime import datetime
+from typing import Any, Callable, IO, MutableMapping, Optional, Text, Tuple, TypeVar, Union
+
+PY2 = ... # type: bool
+text_type = str
+int_to_byte = Callable[[int], bytes]
+number_types = (int, float)
+izip = zip
+
+bytes_like = Union[bytearray, bytes]
+str_like = Union[str, bytes]
+can_become_bytes = Union[str, bytes, bytearray]
+comparable_bytes = TypeVar('comparable_bytes', str, Union[bytes, bytearray])
+
+class _CompactJSON:
+ def loads(self, payload: Text) -> Any: ...
+ def dumps(self, obj: Any) -> Text: ...
+
+compact_json = _CompactJSON
+EPOCH = ... # type: int
+
+def want_bytes(s: can_become_bytes, encoding='', errors='') -> bytes: ...
+def is_text_serializer(serializer: Any) -> bool: ...
+def constant_time_compare(val1: comparable_bytes, val2: comparable_bytes) -> bool: ...
+
+class BadData(Exception):
+ message = ... # type: str
+ def __init__(self, message: str) -> None: ...
+
+class BadPayload(BadData):
+ original_error = ... # type: Optional[Exception]
+ def __init__(self, message: str, original_error: Optional[Exception]=None) -> None: ...
+
+class BadSignature(BadData):
+ payload = ... # type: Optional[Any]
+ def __init__(self, message: str, payload: Optional[Any]=None) -> None: ...
+
+class BadTimeSignature(BadSignature):
+ date_signed = ... # type: Optional[int]
+ def __init__(self, message, payload: Optional[Any]=None, date_signed: Optional[int]=None) -> None: ...
+
+class BadHeader(BadSignature):
+ header = ... # type: Any
+ original_error = ... # type: Any
+ def __init__(self, message, payload=None, header=None, original_error=None) -> None: ...
+
+class SignatureExpired(BadTimeSignature): ...
+
+def base64_encode(string: can_become_bytes) -> bytes: ...
+def base64_decode(string: can_become_bytes) -> bytes: ...
+def int_to_bytes(num: int) -> bytes: ...
+def bytes_to_int(bytestr: can_become_bytes) -> bytes: ...
+
+class SigningAlgorithm:
+ def get_signature(self, key: bytes_like, value: bytes_like) -> bytes: ...
+ def verify_signature(self, key: bytes_like, value: bytes_like, sig: can_become_bytes) -> bool: ...
+
+class NoneAlgorithm(SigningAlgorithm):
+ def get_signature(self, key: bytes_like, value: bytes_like) -> bytes: ...
+
+class HMACAlgorithm(SigningAlgorithm):
+ default_digest_method = ... # type: Callable
+ digest_method = ... # type: Callable
+ def __init__(self, digest_method: Optional[Callable]=None) -> None: ...
+ def get_signature(self, key: bytes_like, value: bytes_like) -> bytes: ...
+
+class Signer:
+ default_digest_method = ... # type: Callable
+ default_key_derivation = ... # type: str
+ secret_key = ... # type: can_become_bytes
+ sep = ... # type: can_become_bytes
+ salt = ... # type: can_become_bytes
+ key_derivation = ... # type: str
+ digest_method = ... # type: Callable
+ algorithm = ... # type: SigningAlgorithm
+ def __init__(self, secret_key: can_become_bytes, salt: Optional[can_become_bytes]=None, sep: Optional[can_become_bytes]='',
+ key_derivation: Optional[str]=None,
+ digest_method: Optional[Callable]=None,
+ algorithm: Optional[SigningAlgorithm]=None) -> None: ...
+ def derive_key(self) -> bytes: ...
+ def get_signature(self, value: bytes_like) -> bytes: ...
+ def sign(self, value: bytes_like) -> bytes: ...
+ def verify_signature(self, value: bytes_like, sig: can_become_bytes) -> bool: ...
+ def unsign(self, signed_value: can_become_bytes) -> str: ...
+ def validate(self, signed_value: can_become_bytes) -> bool: ...
+
+class TimestampSigner(Signer):
+ def get_timestamp(self) -> int: ...
+ def timestamp_to_datetime(self, ts: int) -> datetime: ...
+ def sign(self, value: bytes_like) -> bytes: ...
+ def unsign(self, value: can_become_bytes, max_age: Optional[int]=None, return_timestamp=False) -> Any: ...
+ def validate(self, signed_value: can_become_bytes, max_age: Optional[int]=None) -> bool: ...
+
+class Serializer:
+ default_serializer = ... # type: Any
+ default_signer = ... # type: Callable[..., Signer]
+ secret_key = ... # type: Any
+ salt = ... # type: can_become_bytes
+ serializer = ... # type: Any
+ is_text_serializer = ... # type: bool
+ signer = ... # type: Signer
+ signer_kwargs = ... # type: MutableMapping
+ def __init__(self, secret_key: can_become_bytes, salt: Optional[can_become_bytes]=b'', serializer=None, signer: Optional[Callable[..., Signer]]=None, signer_kwargs: Optional[MutableMapping]=None) -> None: ...
+ def load_payload(self, payload: Any, serializer=None) -> Any: ...
+ def dump_payload(self, *args, **kwargs) -> bytes: ...
+ def make_signer(self, salt: Optional[can_become_bytes]=None) -> Signer: ...
+ def dumps(self, obj: Any, salt: Optional[can_become_bytes]=None) -> str_like: ...
+ def dump(self, obj: Any, f: IO, salt: Optional[can_become_bytes]=None) -> None: ...
+ def loads(self, s: can_become_bytes, salt: Optional[can_become_bytes]=None) -> Any: ...
+ def load(self, f: IO, salt: Optional[can_become_bytes]=None): ...
+ def loads_unsafe(self, s: can_become_bytes, salt: Optional[can_become_bytes]=None) -> Tuple[bool, Any]: ...
+ def load_unsafe(self, f: IO, *args, **kwargs) -> Tuple[bool, Any]: ...
+
+class TimedSerializer(Serializer):
+ default_signer = ... # type: Callable[..., TimestampSigner]
+ def loads(self, s: can_become_bytes, salt: Optional[can_become_bytes]=None, max_age: Optional[int]=None, return_timestamp=False) -> Any: ...
+ def loads_unsafe(self, s: can_become_bytes, salt: Optional[can_become_bytes]=None, max_age: Optional[int]=None) -> Tuple[bool, Any]: ...
+
+class JSONWebSignatureSerializer(Serializer):
+ jws_algorithms = ... # type: MutableMapping[str, SigningAlgorithm]
+ default_algorithm = ... # type: str
+ default_serializer = ... # type: Any
+ algorithm_name = ... # type: str
+ algorithm = ... # type: Any
+ def __init__(self, secret_key: can_become_bytes, salt: Optional[can_become_bytes]=None, serializer=None, signer: Optional[Callable[..., Signer]]=None, signer_kwargs: Optional[MutableMapping]=None, algorithm_name: Optional[str]=None) -> None: ...
+ def load_payload(self, payload: Any, return_header=False) -> Any: ...
+ def dump_payload(self, *args, **kwargs) -> bytes: ...
+ def make_algorithm(self, algorithm_name: str) -> SigningAlgorithm: ...
+ def make_signer(self, salt: Optional[can_become_bytes]=None, algorithm_name: Optional[str]=None) -> Signer: ...
+ def make_header(self, header_fields=Optional[MutableMapping]) -> MutableMapping: ...
+ def dumps(self, obj: Any, salt: Optional[can_become_bytes]=None, header_fields=Optional[MutableMapping]) -> str: ...
+ def loads(self, s: can_become_bytes, salt: Optional[can_become_bytes]=None, return_header=False) -> Any: ...
+ def loads_unsafe(self, s: can_become_bytes, salt: Optional[can_become_bytes]=None, return_header=False) -> Tuple[bool, Any]: ...
+
+class TimedJSONWebSignatureSerializer(JSONWebSignatureSerializer):
+ DEFAULT_EXPIRES_IN = ... # type: int
+ expires_in = ... # type: int
+ def __init__(self, secret_key: can_become_bytes, expires_in: Optional[int]=None, **kwargs) -> None: ...
+ def make_header(self, header_fields=Optional[MutableMapping]) -> MutableMapping: ...
+ def loads(self, s: can_become_bytes, salt: Optional[can_become_bytes]=None, return_header=False) -> Any: ...
+ def get_issue_date(self, header: MutableMapping) -> Optional[datetime]: ...
+ def now(self) -> int: ...
+
+class URLSafeSerializerMixin:
+ def load_payload(self, payload: Any, serializer: Any = ..., **kwargs) -> Any: ...
+ def dump_payload(self, *args, **kwargs) -> bytes: ...
+
+class URLSafeSerializer(URLSafeSerializerMixin, Serializer):
+ default_serializer = ... # type: Any
+
+class URLSafeTimedSerializer(URLSafeSerializerMixin, TimedSerializer):
+ default_serializer = ... # type: Any
diff --git a/mypy/test/__init__.py b/typeshed/third_party/3/lxml/__init__.pyi
similarity index 100%
rename from mypy/test/__init__.py
rename to typeshed/third_party/3/lxml/__init__.pyi
diff --git a/typeshed/third_party/3/lxml/etree.pyi b/typeshed/third_party/3/lxml/etree.pyi
new file mode 100644
index 0000000..39e5077
--- /dev/null
+++ b/typeshed/third_party/3/lxml/etree.pyi
@@ -0,0 +1,169 @@
+# Hand-written stub for lxml.etree as used by mypy.report.
+# This is *far* from complete, and the stubgen-generated ones crash mypy.
+# Any use of `Any` below means I couldn't figure out the type.
+
+import typing
+from typing import Any, Dict, List, MutableMapping, Tuple, Union
+from typing import Iterable, Iterator, SupportsBytes
+
+
+# We do *not* want `typing.AnyStr` because it is a `TypeVar`, which is an
+# unnecessary constraint. It seems reasonable to constrain each
+# List/Dict argument to use one type consistently, though, and it is
+# necessary in order to keep these brief.
+AnyStr = Union[str, bytes]
+ListAnyStr = Union[List[str], List[bytes]]
+DictAnyStr = Union[Dict[str, str], Dict[bytes, bytes]]
+Dict_Tuple2AnyStr_Any = Union[Dict[Tuple[str, str], Any], Tuple[bytes, bytes], Any]
+
+
+class ElementChildIterator(Iterator['_Element;']):
+ def __iter__(self) -> 'ElementChildIterator': ...
+ def __next__(self) -> '_Element': ...
+
+class _Element(Iterable['_Element']):
+ def addprevious(self, element: '_Element') -> None:
+ pass
+
+ attrib = ... # type: MutableMapping[str, str]
+ text = ... # type: AnyStr
+ tag = ... # type: str
+ def append(self, element: '_Element') -> '_Element': ...
+ def __iter__(self) -> ElementChildIterator: ...
+
+class ElementBase(_Element):
+ pass
+
+class _ElementTree:
+ def write(self,
+ file: Union[AnyStr, typing.IO],
+ encoding: AnyStr = ...,
+ method: AnyStr = ...,
+ pretty_print: bool = ...,
+ xml_declaration: Any = ...,
+ with_tail: Any = ...,
+ standalone: bool = ...,
+ compression: int = ...,
+ exclusive: bool = ...,
+ with_comments: bool = ...,
+ inclusive_ns_prefixes: ListAnyStr = ...) -> None:
+ pass
+
+class _XSLTResultTree(SupportsBytes):
+ pass
+
+class _XSLTQuotedStringParam:
+ pass
+
+class XMLParser:
+ pass
+
+class XMLSchema:
+ def __init__(self,
+ etree: Union[_Element, _ElementTree] = ...,
+ file: Union[AnyStr, typing.IO] = ...) -> None:
+ pass
+
+ def assertValid(self,
+ etree: Union[_Element, _ElementTree]) -> None:
+ pass
+
+class XSLTAccessControl:
+ pass
+
+class XSLT:
+ def __init__(self,
+ xslt_input: Union[_Element, _ElementTree],
+ extensions: Dict_Tuple2AnyStr_Any = ...,
+ regexp: bool = ...,
+ access_control: XSLTAccessControl = ...) -> None:
+ pass
+
+ def __call__(self,
+ _input: Union[_Element, _ElementTree],
+ profile_run: bool = ...,
+ **kwargs: Union[AnyStr, _XSLTQuotedStringParam]) -> _XSLTResultTree:
+ pass
+
+ @staticmethod
+ def strparam(s: AnyStr) -> _XSLTQuotedStringParam:
+ pass
+
+def Element(_tag: AnyStr,
+ attrib: DictAnyStr = ...,
+ nsmap: DictAnyStr = ...,
+ **extra: AnyStr) -> _Element:
+ pass
+
+def SubElement(_parent: _Element, _tag: AnyStr,
+ attrib: DictAnyStr = ...,
+ nsmap: DictAnyStr = ...,
+ **extra: AnyStr) -> _Element:
+ pass
+
+def ElementTree(element: _Element = ...,
+ file: Union[AnyStr, typing.IO] = ...,
+ parser: XMLParser = ...) -> _ElementTree:
+ pass
+
+def ProcessingInstruction(target: AnyStr, text: AnyStr = ...) -> _Element:
+ pass
+
+def parse(source: Union[AnyStr, typing.IO],
+ parser: XMLParser = ...,
+ base_url: AnyStr = ...) -> _ElementTree:
+ pass
+
+
+def fromstring(text: AnyStr,
+ parser: XMLParser = ...,
+ *,
+ base_url: AnyStr = ...) -> _Element: ...
+
+def tostring(element_or_tree: Union[_Element, _ElementTree],
+ encoding: Union[str, type] = ...,
+ method: str = ...,
+ xml_declaration: bool = ...,
+ pretty_print: bool = ...,
+ with_tail: bool = ...,
+ standalone: bool = ...,
+ doctype: str = ...,
+ exclusive: bool = ...,
+ with_comments: bool = ...,
+ inclusive_ns_prefixes: Any = ...) -> AnyStr: ...
+
+
+class _ErrorLog:
+ pass
+
+
+class Error(Exception):
+ pass
+
+class LxmlError(Error):
+ def __init__(self, message: Any, error_log: _ErrorLog = ...) -> None: ...
+ error_log = ... # type: _ErrorLog
+
+class DocumentInvalid(LxmlError):
+ pass
+
+class LxmlSyntaxError(LxmlError, SyntaxError):
+ pass
+
+class ParseError(LxmlSyntaxError):
+ pass
+
+class XMLSyntaxError(ParseError):
+ pass
+
+
+class _Validator:
+ pass
+
+class DTD(_Validator):
+ def __init__(self,
+ file: Union[AnyStr, typing.IO] = ...,
+ *,
+ external_id: Any = ...) -> None: ...
+
+ def assertValid(self, etree: _Element) -> None: ...
diff --git a/typeshed/third_party/3/lxml/objectify.pyi b/typeshed/third_party/3/lxml/objectify.pyi
new file mode 100644
index 0000000..74293c4
--- /dev/null
+++ b/typeshed/third_party/3/lxml/objectify.pyi
@@ -0,0 +1,13 @@
+# Hand-written stub, incomplete
+
+from typing import Union
+
+from lxml.etree import ElementBase, XMLParser
+
+class ObjectifiedElement(ElementBase):
+ pass
+
+def fromstring(text: Union[bytes, str],
+ parser: XMLParser = ...,
+ *,
+ base_url: Union[bytes, str] = ...) -> ObjectifiedElement: ...
diff --git a/typeshed/third_party/3/pkg_resources.pyi b/typeshed/third_party/3/pkg_resources.pyi
new file mode 100644
index 0000000..b31ea6d
--- /dev/null
+++ b/typeshed/third_party/3/pkg_resources.pyi
@@ -0,0 +1,313 @@
+# Stubs for pkg_resources (Python 3.4)
+
+from typing import (
+ Any, Callable, Dict, IO, Iterable, Generator, Optional, Sequence, Tuple,
+ List, Union,
+ TypeVar, overload,
+)
+import importlib.abc
+import sys
+import types
+import zipimport
+
+_T = TypeVar('_T')
+_NestedStr = Union[str, Iterable[Union[str, Iterable[Any]]]]
+_InstallerType = Callable[[Requirement], Optional[Distribution]]
+_EPDistType = Union[Distribution, Requirement, str]
+_MetadataType = Optional[IResourceProvider]
+_PkgReqType = Union[str, Requirement]
+_DistFinderType = Callable[[str, _Importer, bool],
+ Generator[Distribution, None, None]]
+_NSHandlerType = Callable[[_Importer, str, str, types.ModuleType], str]
+
+def declare_namespace(name: str) -> None: ...
+def fixup_namespace_packages(path_item: str) -> None: ...
+
+
+class WorkingSet:
+ entries = ... # type: List[str]
+ def __init__(self, entries: Optional[Iterable[str]] = ...) -> None: ...
+ def require(self, *requirements: _NestedStr) -> Sequence[Distribution]: ...
+ def run_script(self, requires: str, script_name: str) -> None: ...
+ def iter_entry_points(self, group: str, name: Optional[str] = ...) \
+ -> Generator[EntryPoint, None, None]: ...
+ def add_entry(self, entry: str) -> None: ...
+ def __contains__(self, dist: Distribution) -> bool: ...
+ def __iter__(self) -> Generator[Distribution, None, None]: ...
+ def find(self, req: Requirement) -> Optional[Distribution]: ...
+ def resolve(self, requirements: Sequence[Requirement],
+ env: Optional[Environment] = ...,
+ installer: Optional[_InstallerType] = ...) \
+ -> List[Distribution]: ...
+ def add(self, dist: Distribution, entry: Optional[str] = ...,
+ insert: bool = ..., replace: bool = ...) -> None: ...
+ def subscribe(self, callback: Callable[[Distribution], None]) -> None: ...
+ def find_plugins(self, plugin_env: Environment,
+ full_env: Optional[Environment] = ...,
+ fallback: bool = ...) \
+ -> Tuple[List[Distribution],
+ Dict[Distribution, Exception]]: ...
+
+working_set = ... # type: WorkingSet
+
+def require(
+ *requirements: Union[str, Sequence[str]]
+) -> Sequence[Distribution]: ...
+def run_script(requires: str, script_name: str) -> None: ...
+def iter_entry_points(
+ group: str, name: Optional[str] = ...
+) -> Generator[EntryPoint, None, None]: ...
+def add_activation_listener(
+ callback: Callable[[Distribution], None]
+) -> None: ...
+
+
+class Environment:
+ def __init__(self, search_path: Optional[Sequence[str]] = ...,
+ platform: Optional[str] = ...,
+ python: Optional[str] = ...) -> None: ...
+ def __getitem__(self, project_name: str) -> List[Distribution]: ...
+ def __iter__(self) -> Generator[str, None, None]: ...
+ def add(self, dist: Distribution) -> None: ...
+ def remove(self, dist: Distribution) -> None: ...
+ def can_add(self, dist: Distribution) -> bool: ...
+ def __add__(self,
+ other: Union[Distribution, Environment]) -> Environment: ...
+ def __iadd__(self,
+ other: Union[Distribution, Environment]) -> Environment: ...
+ @overload
+ def best_match(self, req: Requirement, working_set: WorkingSet) -> Distribution: ...
+ @overload
+ def best_match(self, req: Requirement, working_set: WorkingSet,
+ installer: Callable[[Requirement], _T] = ...) -> _T: ...
+ @overload
+ def obtain(self, requirement: Requirement) -> None: ...
+ @overload
+ def obtain(self, requirement: Requirement,
+ installer: Callable[[Requirement], _T] = ...) -> _T: ...
+ def scan(self, search_path: Optional[Sequence[str]] = ...) -> None: ...
+
+
+def parse_requirements(strs: Union[str, Iterable[str]]) -> Generator[Requirement, None, None]: ...
+
+class Requirement:
+ project_name = ... # type: str
+ key = ... # type: str
+ extras = ... # type: Tuple[str, ...]
+ specs = ... # type: List[Tuple[str, str]]
+ @staticmethod
+ def parse(s: Union[str, Iterable[str]]) -> Requirement: ...
+ def __contains__(self,
+ item: Union[Distribution, str, Tuple[str, ...]]) \
+ -> bool: ...
+ def __eq__(self, other_requirement: Any) -> bool: ...
+
+def load_entry_point(dist: _EPDistType, group: str, name: str) -> None: ...
+def get_entry_info(dist: _EPDistType, group: str,
+ name: str) -> Optional[EntryPoint]: ...
+ at overload
+def get_entry_map(dist: _EPDistType) -> Dict[str, Dict[str, EntryPoint]]: ...
+ at overload
+def get_entry_map(dist: _EPDistType, group: str = ...) -> Dict[str, EntryPoint]: ...
+
+class EntryPoint:
+ name = ... # type: str
+ module_name = ... # type: str
+ attrs = ... # type: Tuple[str, ...]
+ extras = ... # type: Tuple[str, ...]
+ dist = ... # type: Optional[Distribution]
+ def __init__(self, name: str, module_name: str,
+ attrs: Tuple[str, ...] = ..., extras: Tuple[str, ...] = ...,
+ dist: Optional[Distribution] = ...) -> None: ...
+ @classmethod
+ def parse(cls, src: str, dist: Optional[Distribution] = ...) -> EntryPoint: ...
+ @classmethod
+ def parse_group(cls, group: str, lines: Union[str, Sequence[str]],
+ dist: Optional[Distribution] = ...) -> Dict[str, EntryPoint]: ...
+ @classmethod
+ def parse_map(cls, data: Union[Dict[str, Union[str, Sequence[str]]],
+ str, Sequence[str]],
+ dist: Optional[Distribution] = ...) -> Dict[str, EntryPoint]: ...
+ def load(self, require: bool = ..., env: Optional[Environment] = ...,
+ installer: Optional[_InstallerType] = ...) -> Any: ...
+ def require(self, env: Optional[Environment] = ...,
+ installer: Optional[_InstallerType] = ...) -> None: ...
+
+
+def find_distributions(
+ path_item: str, only: bool = ...
+) -> Generator[Distribution, None, None]: ...
+def get_distribution(dist: Union[Requirement, str, Distribution]) -> Distribution: ...
+
+class Distribution(IResourceProvider, IMetadataProvider):
+ location = ... # type: str
+ project_name = ... # type: str
+ key = ... # type: str
+ extras = ... # type: List[str]
+ version = ... # type: str
+ parsed_version = ... # type: Tuple[str, ...]
+ py_version = ... # type: str
+ platform = ... # type: Optional[str]
+ precedence = ... # type: int
+ def __init__(self, location: Optional[str] = ...,
+ metadata: Optional[str] = ...,
+ project_name: Optional[str] = ...,
+ version: Optional[str] = ..., py_version: str = ...,
+ platform: Optional[str] = ...,
+ precedence: int = ...) -> None: ...
+ @classmethod
+ def from_location(cls, location: str, basename: str,
+ metadata: Optional[str] = ...,
+ **kw: Union[str, None, int]) -> Distribution: ...
+ @classmethod
+ def from_filename(cls, filename: str, metadata: Optional[str] = ...,
+ **kw: Union[str, None, int]) -> Distribution: ...
+ def activate(self, path: Optional[List[str]] = ...) -> None: ...
+ def as_requirement(self) -> Requirement: ...
+ def requires(self, extras: Tuple[str, ...] = ...) -> List[Requirement]: ...
+ def clone(self, **kw: Union[str, int, None]) -> Requirement: ...
+ def egg_name(self) -> str: ...
+ def __cmp__(self, other: Any) -> bool: ...
+ def get_entry_info(dist: _EPDistType, group: str,
+ name: str) -> Optional[EntryPoint]: ...
+ @overload
+ def get_entry_map(dist: _EPDistType) \
+ -> Dict[str, Dict[str, EntryPoint]]: ...
+ @overload
+ def get_entry_map(dist: _EPDistType, group: str = ...) \
+ -> Dict[str, EntryPoint]: ...
+ def load_entry_point(dist: _EPDistType, group: str, name: str) -> None: ...
+
+EGG_DIST = ... # type: int
+BINARY_DIST = ... # type: int
+SOURCE_DIST = ... # type: int
+CHECKOUT_DIST = ... # type: int
+DEVELOP_DIST = ... # type: int
+
+
+def resource_exists(package_or_requirement: _PkgReqType,
+ resource_name: str) -> bool: ...
+def resource_stream(package_or_requirement: _PkgReqType,
+ resource_name: str) -> IO[bytes]: ...
+def resource_string(package_or_requirement: _PkgReqType,
+ resource_name: str) -> bytes: ...
+def resource_isdir(package_or_requirement: _PkgReqType,
+ resource_name: str) -> bool: ...
+def resource_listdir(package_or_requirement: _PkgReqType,
+ resource_name: str) -> List[str]: ...
+
+def resource_filename(package_or_requirement: _PkgReqType,
+ resource_name: str) -> str: ...
+def set_extraction_path(path: str) -> None: ...
+def cleanup_resources(force: bool = ...) -> List[str]: ...
+
+class IResourceManager:
+ def resource_exists(self, package_or_requirement: _PkgReqType,
+ resource_name: str) -> bool: ...
+ def resource_stream(self, package_or_requirement: _PkgReqType,
+ resource_name: str) -> IO[bytes]: ...
+ def resource_string(self, package_or_requirement: _PkgReqType,
+ resource_name: str) -> bytes: ...
+ def resource_isdir(self, package_or_requirement: _PkgReqType,
+ resource_name: str) -> bool: ...
+ def resource_listdir(self, package_or_requirement: _PkgReqType,
+ resource_name: str) -> List[str]: ...
+ def resource_filename(self, package_or_requirement: _PkgReqType,
+ resource_name: str) -> str: ...
+ def set_extraction_path(self, path: str) -> None: ...
+ def cleanup_resources(self, force: bool = ...) -> List[str]: ...
+ def get_cache_path(self, archive_name: str,
+ names: Tuple[str, ...] = ...) -> str: ...
+ def extraction_error(self) -> None: ...
+ def postprocess(self, tempname: str, filename: str) -> None: ...
+
+
+ at overload
+def get_provider(package_or_requirement: str) -> IResourceProvider: ...
+ at overload
+def get_provider(package_or_requirement: Requirement) -> Distribution: ...
+
+class IMetadataProvider:
+ def has_metadata(self, name: str) -> bool: ...
+ def metadata_isdir(self, name: str) -> bool: ...
+ def metadata_listdir(self, name: str) -> List[str]: ...
+ def get_metadata(self, name: str) -> str: ...
+ def get_metadata_lines(self, name: str) -> Generator[List[str], None, None]: ...
+ def run_script(self, script_name: str, namespace: Dict[str, Any]) -> None: ...
+
+
+class ResolutionError(Exception): ...
+class DistributionNotFound(ResolutionError): ...
+class VersionConflict(ResolutionError): ...
+class UnknownExtra(ResolutionError): ...
+
+class ExtractionError(Exception):
+ manager = ... # type: IResourceManager
+ cache_path = ... # type: str
+ original_error = ... # type: Exception
+
+
+if sys.version_info >= (3, 3):
+ class _Importer(importlib.abc.MetaPathFinder, importlib.abc.InspectLoader): ...
+else:
+ class _Importer(importlib.abc.InspectLoader): ...
+
+def register_finder(importer_type: type,
+ distribution_finder: _DistFinderType) -> None: ...
+def register_loader_type(
+ loader_type: type,
+ provider_factory: Callable[[types.ModuleType], IResourceProvider]
+) -> None: ...
+def register_namespace_handler(importer_type: type,
+ namespace_handler: _NSHandlerType) -> None: ...
+
+
+class IResourceProvider(IMetadataProvider): ...
+
+
+class NullProvider: ...
+
+class EggProvider(NullProvider): ...
+
+class DefaultProvider(EggProvider): ...
+
+class PathMetadata(DefaultProvider, IResourceProvider):
+ def __init__(self, path: str, egg_info: str) -> None: ...
+
+class ZipProvider(EggProvider): ...
+
+class EggMetadata(ZipProvider, IResourceProvider):
+ def __init__(self, zipimporter: zipimport.zipimporter) -> None: ...
+
+class EmptyProvider(NullProvider): ...
+
+empty_provider = ... # type: EmptyProvider
+
+class FileMetadata(EmptyProvider, IResourceProvider):
+ def __init__(self, path_to_pkg_info: str) -> None: ...
+
+
+def parse_version(v: str) -> Tuple[str, ...]: ...
+def yield_lines(strs: _NestedStr) -> Generator[str, None, None]: ...
+def split_sections(
+ strs: _NestedStr
+) -> Generator[Tuple[Optional[str], str], None, None]: ...
+def safe_name(name: str) -> str: ...
+def safe_version(version: str) -> str: ...
+def safe_extra(extra: str) -> str: ...
+def to_filename(name_or_version: str) -> str: ...
+
+
+def get_build_platform() -> str: ...
+def get_platform() -> str: ...
+def get_supported_platform() -> str: ...
+def compatible_platforms(provided: Optional[str],
+ required: Optional[str]) -> bool: ...
+def get_default_cache() -> str: ...
+
+
+def get_importer(path_item: str) -> _Importer: ...
+
+
+def ensure_directory(path: str) -> None: ...
+def normalize_path(filename: str) -> str: ...
diff --git a/typeshed/third_party/3/requests/__init__.pyi b/typeshed/third_party/3/requests/__init__.pyi
new file mode 100644
index 0000000..a89d4a0
--- /dev/null
+++ b/typeshed/third_party/3/requests/__init__.pyi
@@ -0,0 +1,39 @@
+# Stubs for requests (based on version 2.6.0, Python 3)
+
+from typing import Any
+from . import models
+from . import api
+from . import sessions
+from . import status_codes
+from . import exceptions
+import logging
+
+__title__ = ... # type: Any
+__build__ = ... # type: Any
+__license__ = ... # type: Any
+__copyright__ = ... # type: Any
+__version__ = ... # type: Any
+
+Request = models.Request
+Response = models.Response
+PreparedRequest = models.PreparedRequest
+request = api.request
+get = api.get
+head = api.head
+post = api.post
+patch = api.patch
+put = api.put
+delete = api.delete
+options = api.options
+session = sessions.session
+Session = sessions.Session
+codes = status_codes.codes
+RequestException = exceptions.RequestException
+Timeout = exceptions.Timeout
+URLRequired = exceptions.URLRequired
+TooManyRedirects = exceptions.TooManyRedirects
+HTTPError = exceptions.HTTPError
+ConnectionError = exceptions.ConnectionError
+
+class NullHandler(logging.Handler):
+ def emit(self, record): ...
diff --git a/typeshed/third_party/3/requests/adapters.pyi b/typeshed/third_party/3/requests/adapters.pyi
new file mode 100644
index 0000000..d896f1a
--- /dev/null
+++ b/typeshed/third_party/3/requests/adapters.pyi
@@ -0,0 +1,72 @@
+# Stubs for requests.adapters (Python 3)
+
+from typing import Any, Container, Union, Tuple
+from . import models
+from .packages.urllib3 import poolmanager
+from .packages.urllib3 import response
+from .packages.urllib3.util import retry
+from . import compat
+from . import utils
+from . import structures
+from .packages.urllib3 import exceptions as urllib3_exceptions
+from . import cookies
+from . import exceptions
+from . import auth
+
+PreparedRequest = models.PreparedRequest
+Response = models.Response
+PoolManager = poolmanager.PoolManager
+proxy_from_url = poolmanager.proxy_from_url
+HTTPResponse = response.HTTPResponse
+Retry = retry.Retry
+DEFAULT_CA_BUNDLE_PATH = utils.DEFAULT_CA_BUNDLE_PATH
+get_encoding_from_headers = utils.get_encoding_from_headers
+prepend_scheme_if_needed = utils.prepend_scheme_if_needed
+get_auth_from_url = utils.get_auth_from_url
+urldefragauth = utils.urldefragauth
+CaseInsensitiveDict = structures.CaseInsensitiveDict
+ConnectTimeoutError = urllib3_exceptions.ConnectTimeoutError
+MaxRetryError = urllib3_exceptions.MaxRetryError
+ProtocolError = urllib3_exceptions.ProtocolError
+ReadTimeoutError = urllib3_exceptions.ReadTimeoutError
+ResponseError = urllib3_exceptions.ResponseError
+extract_cookies_to_jar = cookies.extract_cookies_to_jar
+ConnectionError = exceptions.ConnectionError
+ConnectTimeout = exceptions.ConnectTimeout
+ReadTimeout = exceptions.ReadTimeout
+SSLError = exceptions.SSLError
+ProxyError = exceptions.ProxyError
+RetryError = exceptions.RetryError
+
+DEFAULT_POOLBLOCK = ... # type: Any
+DEFAULT_POOLSIZE = ... # type: Any
+DEFAULT_RETRIES = ... # type: Any
+
+class BaseAdapter:
+ def __init__(self) -> None: ...
+ def send(self, request: PreparedRequest, stream=False,
+ timeout: Union[None, float, Tuple[float, float]]=None,
+ verify=False,
+ cert: Union[None, Union[str, bytes], Container[Union[str, bytes]]]=None
+ ) -> Response: ...
+ def close(self) -> None: ...
+class HTTPAdapter(BaseAdapter):
+ __attrs__ = ... # type: Any
+ max_retries = ... # type: Any
+ config = ... # type: Any
+ proxy_manager = ... # type: Any
+ def __init__(self, pool_connections=..., pool_maxsize=..., max_retries=...,
+ pool_block=...): ...
+ poolmanager = ... # type: Any
+ def init_poolmanager(self, connections, maxsize, block=..., **pool_kwargs): ...
+ def proxy_manager_for(self, proxy, **proxy_kwargs): ...
+ def cert_verify(self, conn, url, verify, cert): ...
+ def build_response(self, req, resp): ...
+ def get_connection(self, url, proxies=...): ...
+ def close(self): ...
+ def request_url(self, request, proxies): ...
+ def add_headers(self, request, **kwargs): ...
+ def proxy_headers(self, proxy): ...
+ # TODO: "request" is not actually optional, modified to please mypy.
+ def send(self, request=..., stream=..., timeout=..., verify=..., cert=...,
+ proxies=...): ...
diff --git a/typeshed/third_party/3/requests/api.pyi b/typeshed/third_party/3/requests/api.pyi
new file mode 100644
index 0000000..f5f1ec3
--- /dev/null
+++ b/typeshed/third_party/3/requests/api.pyi
@@ -0,0 +1,18 @@
+# Stubs for requests.api (Python 3)
+
+from typing import Optional, Union, Any
+
+from .models import Response
+
+def request(method: str, url: str, **kwargs) -> Response: ...
+def get(url: Union[str, bytes],
+ params: Optional[Union[str,
+ bytes,
+ dict[Union[str, bytes], Union[str, bytes]]]]=None,
+ **kwargs) -> Response: ...
+def options(url: str, **kwargs) -> Response: ...
+def head(url: str, **kwargs) -> Response: ...
+def post(url: str, data=..., json=..., **kwargs) -> Response: ...
+def put(url: str, data=..., **kwargs) -> Response: ...
+def patch(url: str, data=..., **kwargs) -> Response: ...
+def delete(url: str, **kwargs) -> Response: ...
diff --git a/typeshed/third_party/3/requests/auth.pyi b/typeshed/third_party/3/requests/auth.pyi
new file mode 100644
index 0000000..8eea2b0
--- /dev/null
+++ b/typeshed/third_party/3/requests/auth.pyi
@@ -0,0 +1,41 @@
+# Stubs for requests.auth (Python 3)
+
+from typing import Any
+from . import compat
+from . import cookies
+from . import utils
+from . import status_codes
+
+extract_cookies_to_jar = cookies.extract_cookies_to_jar
+parse_dict_header = utils.parse_dict_header
+to_native_string = utils.to_native_string
+codes = status_codes.codes
+
+CONTENT_TYPE_FORM_URLENCODED = ... # type: Any
+CONTENT_TYPE_MULTI_PART = ... # type: Any
+
+class AuthBase:
+ def __call__(self, r): ...
+
+class HTTPBasicAuth(AuthBase):
+ username = ... # type: Any
+ password = ... # type: Any
+ def __init__(self, username, password) -> None: ...
+ def __call__(self, r): ...
+
+class HTTPProxyAuth(HTTPBasicAuth):
+ def __call__(self, r): ...
+
+class HTTPDigestAuth(AuthBase):
+ username = ... # type: Any
+ password = ... # type: Any
+ last_nonce = ... # type: Any
+ nonce_count = ... # type: Any
+ chal = ... # type: Any
+ pos = ... # type: Any
+ num_401_calls = ... # type: Any
+ def __init__(self, username, password) -> None: ...
+ def build_digest_header(self, method, url): ...
+ def handle_redirect(self, r, **kwargs): ...
+ def handle_401(self, r, **kwargs): ...
+ def __call__(self, r): ...
diff --git a/typeshed/third_party/3/requests/compat.pyi b/typeshed/third_party/3/requests/compat.pyi
new file mode 100644
index 0000000..63b92f6
--- /dev/null
+++ b/typeshed/third_party/3/requests/compat.pyi
@@ -0,0 +1,6 @@
+# Stubs for requests.compat (Python 3.4)
+
+from typing import Any
+import collections
+
+OrderedDict = collections.OrderedDict
diff --git a/typeshed/third_party/3/requests/cookies.pyi b/typeshed/third_party/3/requests/cookies.pyi
new file mode 100644
index 0000000..f3bd57e
--- /dev/null
+++ b/typeshed/third_party/3/requests/cookies.pyi
@@ -0,0 +1,65 @@
+# Stubs for requests.cookies (Python 3)
+
+from typing import Any, MutableMapping
+# import cookielib
+from http import cookiejar as cookielib
+import collections
+from . import compat
+
+# cookielib = compat.cookielib
+
+class MockRequest:
+ type = ... # type: Any
+ def __init__(self, request) -> None: ...
+ def get_type(self): ...
+ def get_host(self): ...
+ def get_origin_req_host(self): ...
+ def get_full_url(self): ...
+ def is_unverifiable(self): ...
+ def has_header(self, name): ...
+ def get_header(self, name, default=...): ...
+ def add_header(self, key, val): ...
+ def add_unredirected_header(self, name, value): ...
+ def get_new_headers(self): ...
+ @property
+ def unverifiable(self): ...
+ @property
+ def origin_req_host(self): ...
+ @property
+ def host(self): ...
+
+class MockResponse:
+ def __init__(self, headers) -> None: ...
+ def info(self): ...
+ def getheaders(self, name): ...
+
+def extract_cookies_to_jar(jar, request, response): ...
+def get_cookie_header(jar, request): ...
+def remove_cookie_by_name(cookiejar, name, domain=..., path=...): ...
+
+class CookieConflictError(RuntimeError): ...
+
+class RequestsCookieJar(cookielib.CookieJar, MutableMapping):
+ def get(self, name, default=..., domain=..., path=...): ...
+ def set(self, name, value, **kwargs): ...
+ def iterkeys(self): ...
+ def keys(self): ...
+ def itervalues(self): ...
+ def values(self): ...
+ def iteritems(self): ...
+ def items(self): ...
+ def list_domains(self): ...
+ def list_paths(self): ...
+ def multiple_domains(self): ...
+ def get_dict(self, domain=..., path=...): ...
+ def __getitem__(self, name): ...
+ def __setitem__(self, name, value): ...
+ def __delitem__(self, name): ...
+ def set_cookie(self, cookie, *args, **kwargs): ...
+ def update(self, other): ...
+ def copy(self): ...
+
+def create_cookie(name, value, **kwargs): ...
+def morsel_to_cookie(morsel): ...
+def cookiejar_from_dict(cookie_dict, cookiejar=..., overwrite=...): ...
+def merge_cookies(cookiejar, cookies): ...
diff --git a/typeshed/third_party/3/requests/exceptions.pyi b/typeshed/third_party/3/requests/exceptions.pyi
new file mode 100644
index 0000000..ff0c328
--- /dev/null
+++ b/typeshed/third_party/3/requests/exceptions.pyi
@@ -0,0 +1,26 @@
+# Stubs for requests.exceptions (Python 3)
+
+from typing import Any
+from .packages.urllib3.exceptions import HTTPError as BaseHTTPError
+
+class RequestException(IOError):
+ response = ... # type: Any
+ request = ... # type: Any
+ def __init__(self, *args, **kwargs) -> None: ...
+
+class HTTPError(RequestException): ...
+class ConnectionError(RequestException): ...
+class ProxyError(ConnectionError): ...
+class SSLError(ConnectionError): ...
+class Timeout(RequestException): ...
+class ConnectTimeout(ConnectionError, Timeout): ...
+class ReadTimeout(Timeout): ...
+class URLRequired(RequestException): ...
+class TooManyRedirects(RequestException): ...
+class MissingSchema(RequestException, ValueError): ...
+class InvalidSchema(RequestException, ValueError): ...
+class InvalidURL(RequestException, ValueError): ...
+class ChunkedEncodingError(RequestException): ...
+class ContentDecodingError(RequestException, BaseHTTPError): ...
+class StreamConsumedError(RequestException, TypeError): ...
+class RetryError(RequestException): ...
diff --git a/typeshed/third_party/3/requests/hooks.pyi b/typeshed/third_party/3/requests/hooks.pyi
new file mode 100644
index 0000000..3367d9a
--- /dev/null
+++ b/typeshed/third_party/3/requests/hooks.pyi
@@ -0,0 +1,8 @@
+# Stubs for requests.hooks (Python 3)
+
+from typing import Any
+
+HOOKS = ... # type: Any
+
+def default_hooks(): ...
+def dispatch_hook(key, hooks, hook_data, **kwargs): ...
diff --git a/typeshed/third_party/3/requests/models.pyi b/typeshed/third_party/3/requests/models.pyi
new file mode 100644
index 0000000..7789899
--- /dev/null
+++ b/typeshed/third_party/3/requests/models.pyi
@@ -0,0 +1,136 @@
+# Stubs for requests.models (Python 3)
+
+from typing import Any, List, MutableMapping, Iterator, Dict
+import datetime
+
+from . import hooks
+from . import structures
+from . import auth
+from . import cookies
+from .cookies import RequestsCookieJar
+from .packages.urllib3 import fields
+from .packages.urllib3 import filepost
+from .packages.urllib3 import util
+from .packages.urllib3 import exceptions as urllib3_exceptions
+from . import exceptions
+from . import utils
+from . import compat
+from . import status_codes
+
+from typing import Optional, Union
+
+default_hooks = hooks.default_hooks
+CaseInsensitiveDict = structures.CaseInsensitiveDict
+HTTPBasicAuth = auth.HTTPBasicAuth
+cookiejar_from_dict = cookies.cookiejar_from_dict
+get_cookie_header = cookies.get_cookie_header
+RequestField = fields.RequestField
+encode_multipart_formdata = filepost.encode_multipart_formdata
+parse_url = util.parse_url
+DecodeError = urllib3_exceptions.DecodeError
+ReadTimeoutError = urllib3_exceptions.ReadTimeoutError
+ProtocolError = urllib3_exceptions.ProtocolError
+LocationParseError = urllib3_exceptions.LocationParseError
+HTTPError = exceptions.HTTPError
+MissingSchema = exceptions.MissingSchema
+InvalidURL = exceptions.InvalidURL
+ChunkedEncodingError = exceptions.ChunkedEncodingError
+ContentDecodingError = exceptions.ContentDecodingError
+ConnectionError = exceptions.ConnectionError
+StreamConsumedError = exceptions.StreamConsumedError
+guess_filename = utils.guess_filename
+get_auth_from_url = utils.get_auth_from_url
+requote_uri = utils.requote_uri
+stream_decode_response_unicode = utils.stream_decode_response_unicode
+to_key_val_list = utils.to_key_val_list
+parse_header_links = utils.parse_header_links
+iter_slices = utils.iter_slices
+guess_json_utf = utils.guess_json_utf
+super_len = utils.super_len
+to_native_string = utils.to_native_string
+codes = status_codes.codes
+
+REDIRECT_STATI = ... # type: Any
+DEFAULT_REDIRECT_LIMIT = ... # type: Any
+CONTENT_CHUNK_SIZE = ... # type: Any
+ITER_CHUNK_SIZE = ... # type: Any
+json_dumps = ... # type: Any
+
+class RequestEncodingMixin:
+ @property
+ def path_url(self): ...
+
+class RequestHooksMixin:
+ def register_hook(self, event, hook): ...
+ def deregister_hook(self, event, hook): ...
+
+class Request(RequestHooksMixin):
+ hooks = ... # type: Any
+ method = ... # type: Any
+ url = ... # type: Any
+ headers = ... # type: Any
+ files = ... # type: Any
+ data = ... # type: Any
+ json = ... # type: Any
+ params = ... # type: Any
+ auth = ... # type: Any
+ cookies = ... # type: Any
+ def __init__(self, method=..., url=..., headers=..., files=..., data=..., params=...,
+ auth=..., cookies=..., hooks=..., json=...): ...
+ def prepare(self): ...
+
+class PreparedRequest(RequestEncodingMixin, RequestHooksMixin):
+ method = ... # type: Optional[str]
+ url = ... # type: Optional[str]
+ headers = ... # type: CaseInsensitiveDict
+ body = ... # type: Optional[Union[str, bytes]]
+ hooks = ... # type: Any
+ def __init__(self) -> None: ...
+ def prepare(self, method=..., url=..., headers=..., files=..., data=..., params=...,
+ auth=..., cookies=..., hooks=..., json=...): ...
+ def copy(self): ...
+ def prepare_method(self, method): ...
+ def prepare_url(self, url, params): ...
+ def prepare_headers(self, headers): ...
+ def prepare_body(self, data, files, json=...): ...
+ def prepare_content_length(self, body): ...
+ def prepare_auth(self, auth, url=...): ...
+ def prepare_cookies(self, cookies): ...
+ def prepare_hooks(self, hooks): ...
+
+class Response:
+ __attrs__ = ... # type: Any
+ status_code = ... # type: int
+ headers = ... # type: MutableMapping[str, str]
+ raw = ... # type: Any
+ url = ... # type: str
+ encoding = ... # type: str
+ history = ... # type: List[Response]
+ reason = ... # type: str
+ cookies = ... # type: RequestsCookieJar
+ elapsed = ... # type: datetime.timedelta
+ request = ... # type: PreparedRequest
+ def __init__(self) -> None: ...
+ def __bool__(self) -> bool: ...
+ def __nonzero__(self) -> bool: ...
+ def __iter__(self) -> Iterator[bytes]: ...
+ @property
+ def ok(self) -> bool: ...
+ @property
+ def is_redirect(self) -> bool: ...
+ @property
+ def is_permanent_redirect(self) -> bool: ...
+ @property
+ def apparent_encoding(self) -> str: ...
+ def iter_content(self, chunk_size: int = ...,
+ decode_unicode: bool = ...) -> Iterator[Any]: ...
+ def iter_lines(self, chunk_size=..., decode_unicode=..., delimiter=...): ...
+ @property
+ def content(self) -> bytes: ...
+ @property
+ def text(self) -> str: ...
+ def json(self, **kwargs) -> Any: ...
+ @property
+ def links(self) -> Dict[Any, Any]: ...
+ def raise_for_status(self) -> None: ...
+ def close(self) -> None: ...
diff --git a/typeshed/third_party/3/requests/packages/__init__.pyi b/typeshed/third_party/3/requests/packages/__init__.pyi
new file mode 100644
index 0000000..2b1bff8
--- /dev/null
+++ b/typeshed/third_party/3/requests/packages/__init__.pyi
@@ -0,0 +1,8 @@
+# Stubs for requests.packages (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+class VendorAlias:
+ def __init__(self, package_names) -> None: ...
+ def find_module(self, fullname, path=...): ...
+ def load_module(self, name): ...
diff --git a/typeshed/third_party/3/requests/packages/urllib3/__init__.pyi b/typeshed/third_party/3/requests/packages/urllib3/__init__.pyi
new file mode 100644
index 0000000..61a1c5f
--- /dev/null
+++ b/typeshed/third_party/3/requests/packages/urllib3/__init__.pyi
@@ -0,0 +1,35 @@
+# Stubs for requests.packages.urllib3 (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from . import connectionpool
+from . import filepost
+from . import poolmanager
+from . import response
+from .util import request as _request
+from .util import url
+from .util import timeout
+from .util import retry
+import logging
+
+__license__ = ... # type: Any
+
+HTTPConnectionPool = connectionpool.HTTPConnectionPool
+HTTPSConnectionPool = connectionpool.HTTPSConnectionPool
+connection_from_url = connectionpool.connection_from_url
+encode_multipart_formdata = filepost.encode_multipart_formdata
+PoolManager = poolmanager.PoolManager
+ProxyManager = poolmanager.ProxyManager
+proxy_from_url = poolmanager.proxy_from_url
+HTTPResponse = response.HTTPResponse
+make_headers = _request.make_headers
+get_host = url.get_host
+Timeout = timeout.Timeout
+Retry = retry.Retry
+
+class NullHandler(logging.Handler):
+ def emit(self, record): ...
+
+def add_stderr_logger(level=...): ...
+def disable_warnings(category=...): ...
diff --git a/typeshed/third_party/3/requests/packages/urllib3/_collections.pyi b/typeshed/third_party/3/requests/packages/urllib3/_collections.pyi
new file mode 100644
index 0000000..58aa944
--- /dev/null
+++ b/typeshed/third_party/3/requests/packages/urllib3/_collections.pyi
@@ -0,0 +1,51 @@
+# Stubs for requests.packages.urllib3._collections (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from collections import MutableMapping
+
+class RLock:
+ def __enter__(self): ...
+ def __exit__(self, exc_type, exc_value, traceback): ...
+
+class RecentlyUsedContainer(MutableMapping):
+ ContainerCls = ... # type: Any
+ dispose_func = ... # type: Any
+ lock = ... # type: Any
+ def __init__(self, maxsize=..., dispose_func=...) -> None: ...
+ def __getitem__(self, key): ...
+ def __setitem__(self, key, value): ...
+ def __delitem__(self, key): ...
+ def __len__(self): ...
+ def __iter__(self): ...
+ def clear(self): ...
+ def keys(self): ...
+
+class HTTPHeaderDict(dict):
+ def __init__(self, headers=..., **kwargs) -> None: ...
+ def __setitem__(self, key, val): ...
+ def __getitem__(self, key): ...
+ def __delitem__(self, key): ...
+ def __contains__(self, key): ...
+ def __eq__(self, other): ...
+ def __ne__(self, other): ...
+ values = ... # type: Any
+ get = ... # type: Any
+ update = ... # type: Any
+ iterkeys = ... # type: Any
+ itervalues = ... # type: Any
+ def pop(self, key, default=...): ...
+ def discard(self, key): ...
+ def add(self, key, val): ...
+ def extend(*args, **kwargs): ...
+ def getlist(self, key): ...
+ getheaders = ... # type: Any
+ getallmatchingheaders = ... # type: Any
+ iget = ... # type: Any
+ def copy(self): ...
+ def iteritems(self): ...
+ def itermerged(self): ...
+ def items(self): ...
+ @classmethod
+ def from_httplib(cls, message, duplicates=...): ...
diff --git a/typeshed/third_party/3/requests/packages/urllib3/connection.pyi b/typeshed/third_party/3/requests/packages/urllib3/connection.pyi
new file mode 100644
index 0000000..77e4c42
--- /dev/null
+++ b/typeshed/third_party/3/requests/packages/urllib3/connection.pyi
@@ -0,0 +1,64 @@
+# Stubs for requests.packages.urllib3.connection (Python 3.4)
+
+from typing import Any
+from . import packages
+from http.client import HTTPConnection as _HTTPConnection
+import ssl
+# from httplib import HTTPConnection as _HTTPConnection # python 2
+from . import exceptions
+from .packages import ssl_match_hostname
+from .util import ssl_
+from . import util
+import http.client
+
+class DummyConnection: ...
+
+BaseSSLError = ssl.SSLError
+ConnectionError = __builtins__.ConnectionError
+HTTPException = http.client.HTTPException
+
+ConnectTimeoutError = exceptions.ConnectTimeoutError
+SystemTimeWarning = exceptions.SystemTimeWarning
+SecurityWarning = exceptions.SecurityWarning
+match_hostname = ssl_match_hostname.match_hostname
+resolve_cert_reqs = ssl_.resolve_cert_reqs
+resolve_ssl_version = ssl_.resolve_ssl_version
+ssl_wrap_socket = ssl_.ssl_wrap_socket
+assert_fingerprint = ssl_.assert_fingerprint
+connection = util.connection
+
+port_by_scheme = ... # type: Any
+RECENT_DATE = ... # type: Any
+
+class HTTPConnection(_HTTPConnection):
+ default_port = ... # type: Any
+ default_socket_options = ... # type: Any
+ is_verified = ... # type: Any
+ source_address = ... # type: Any
+ socket_options = ... # type: Any
+ def __init__(self, *args, **kw) -> None: ...
+ def connect(self): ...
+
+class HTTPSConnection(HTTPConnection):
+ default_port = ... # type: Any
+ key_file = ... # type: Any
+ cert_file = ... # type: Any
+ def __init__(self, host, port=..., key_file=..., cert_file=..., strict=..., timeout=..., **kw) -> None: ...
+ sock = ... # type: Any
+ def connect(self): ...
+
+class VerifiedHTTPSConnection(HTTPSConnection):
+ cert_reqs = ... # type: Any
+ ca_certs = ... # type: Any
+ ssl_version = ... # type: Any
+ assert_fingerprint = ... # type: Any
+ key_file = ... # type: Any
+ cert_file = ... # type: Any
+ assert_hostname = ... # type: Any
+ def set_cert(self, key_file=..., cert_file=..., cert_reqs=..., ca_certs=..., assert_hostname=..., assert_fingerprint=...): ...
+ sock = ... # type: Any
+ auto_open = ... # type: Any
+ is_verified = ... # type: Any
+ def connect(self): ...
+
+UnverifiedHTTPSConnection = ... # type: Any
diff --git a/typeshed/third_party/3/requests/packages/urllib3/connectionpool.pyi b/typeshed/third_party/3/requests/packages/urllib3/connectionpool.pyi
new file mode 100644
index 0000000..778bb7c
--- /dev/null
+++ b/typeshed/third_party/3/requests/packages/urllib3/connectionpool.pyi
@@ -0,0 +1,89 @@
+# Stubs for requests.packages.urllib3.connectionpool (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from . import exceptions
+from .packages import ssl_match_hostname
+from . import packages
+from .connection import (
+ HTTPException as HTTPException,
+ BaseSSLError as BaseSSLError,
+ ConnectionError as ConnectionError,
+)
+from . import request
+from . import response
+from . import connection
+from .util import connection as _connection
+from .util import retry
+from .util import timeout
+from .util import url
+
+ClosedPoolError = exceptions.ClosedPoolError
+ProtocolError = exceptions.ProtocolError
+EmptyPoolError = exceptions.EmptyPoolError
+HostChangedError = exceptions.HostChangedError
+LocationValueError = exceptions.LocationValueError
+MaxRetryError = exceptions.MaxRetryError
+ProxyError = exceptions.ProxyError
+ReadTimeoutError = exceptions.ReadTimeoutError
+SSLError = exceptions.SSLError
+TimeoutError = exceptions.TimeoutError
+InsecureRequestWarning = exceptions.InsecureRequestWarning
+CertificateError = ssl_match_hostname.CertificateError
+port_by_scheme = connection.port_by_scheme
+DummyConnection = connection.DummyConnection
+HTTPConnection = connection.HTTPConnection
+HTTPSConnection = connection.HTTPSConnection
+VerifiedHTTPSConnection = connection.VerifiedHTTPSConnection
+RequestMethods = request.RequestMethods
+HTTPResponse = response.HTTPResponse
+is_connection_dropped = _connection.is_connection_dropped
+Retry = retry.Retry
+Timeout = timeout.Timeout
+get_host = url.get_host
+
+xrange = ... # type: Any
+log = ... # type: Any
+
+class ConnectionPool:
+ scheme = ... # type: Any
+ QueueCls = ... # type: Any
+ host = ... # type: Any
+ port = ... # type: Any
+ def __init__(self, host, port=...) -> None: ...
+ def __enter__(self): ...
+ def __exit__(self, exc_type, exc_val, exc_tb): ...
+ def close(self): ...
+
+class HTTPConnectionPool(ConnectionPool, RequestMethods):
+ scheme = ... # type: Any
+ ConnectionCls = ... # type: Any
+ strict = ... # type: Any
+ timeout = ... # type: Any
+ retries = ... # type: Any
+ pool = ... # type: Any
+ block = ... # type: Any
+ proxy = ... # type: Any
+ proxy_headers = ... # type: Any
+ num_connections = ... # type: Any
+ num_requests = ... # type: Any
+ conn_kw = ... # type: Any
+ def __init__(self, host, port=..., strict=..., timeout=..., maxsize=..., block=..., headers=..., retries=..., _proxy=..., _proxy_headers=..., **conn_kw) -> None: ...
+ def close(self): ...
+ def is_same_host(self, url): ...
+ def urlopen(self, method, url, body=..., headers=..., retries=..., redirect=..., assert_same_host=..., timeout=..., pool_timeout=..., release_conn=..., **response_kw): ...
+
+class HTTPSConnectionPool(HTTPConnectionPool):
+ scheme = ... # type: Any
+ ConnectionCls = ... # type: Any
+ key_file = ... # type: Any
+ cert_file = ... # type: Any
+ cert_reqs = ... # type: Any
+ ca_certs = ... # type: Any
+ ssl_version = ... # type: Any
+ assert_hostname = ... # type: Any
+ assert_fingerprint = ... # type: Any
+ def __init__(self, host, port=..., strict=..., timeout=..., maxsize=..., block=..., headers=..., retries=..., _proxy=..., _proxy_headers=..., key_file=..., cert_file=..., cert_reqs=..., ca_certs=..., ssl_version=..., assert_hostname=..., assert_fingerprint=..., **conn_kw) -> None: ...
+
+def connection_from_url(url, **kw): ...
diff --git a/typeshed/third_party/3/requests/packages/urllib3/contrib/__init__.pyi b/typeshed/third_party/3/requests/packages/urllib3/contrib/__init__.pyi
new file mode 100644
index 0000000..69e47f7
--- /dev/null
+++ b/typeshed/third_party/3/requests/packages/urllib3/contrib/__init__.pyi
@@ -0,0 +1,3 @@
+# Stubs for requests.packages.urllib3.contrib (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
diff --git a/typeshed/third_party/3/requests/packages/urllib3/exceptions.pyi b/typeshed/third_party/3/requests/packages/urllib3/exceptions.pyi
new file mode 100644
index 0000000..3e7d0f6
--- /dev/null
+++ b/typeshed/third_party/3/requests/packages/urllib3/exceptions.pyi
@@ -0,0 +1,54 @@
+# Stubs for requests.packages.urllib3.exceptions (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class HTTPError(Exception): ...
+class HTTPWarning(Warning): ...
+
+class PoolError(HTTPError):
+ pool = ... # type: Any
+ def __init__(self, pool, message) -> None: ...
+ def __reduce__(self): ...
+
+class RequestError(PoolError):
+ url = ... # type: Any
+ def __init__(self, pool, url, message) -> None: ...
+ def __reduce__(self): ...
+
+class SSLError(HTTPError): ...
+class ProxyError(HTTPError): ...
+class DecodeError(HTTPError): ...
+class ProtocolError(HTTPError): ...
+
+ConnectionError = ... # type: Any
+
+class MaxRetryError(RequestError):
+ reason = ... # type: Any
+ def __init__(self, pool, url, reason=...) -> None: ...
+
+class HostChangedError(RequestError):
+ retries = ... # type: Any
+ def __init__(self, pool, url, retries=...) -> None: ...
+
+class TimeoutStateError(HTTPError): ...
+class TimeoutError(HTTPError): ...
+class ReadTimeoutError(TimeoutError, RequestError): ...
+class ConnectTimeoutError(TimeoutError): ...
+class EmptyPoolError(PoolError): ...
+class ClosedPoolError(PoolError): ...
+class LocationValueError(ValueError, HTTPError): ...
+
+class LocationParseError(LocationValueError):
+ location = ... # type: Any
+ def __init__(self, location) -> None: ...
+
+class ResponseError(HTTPError):
+ GENERIC_ERROR = ... # type: Any
+ SPECIFIC_ERROR = ... # type: Any
+
+class SecurityWarning(HTTPWarning): ...
+class InsecureRequestWarning(SecurityWarning): ...
+class SystemTimeWarning(SecurityWarning): ...
+class InsecurePlatformWarning(SecurityWarning): ...
diff --git a/typeshed/third_party/3/requests/packages/urllib3/fields.pyi b/typeshed/third_party/3/requests/packages/urllib3/fields.pyi
new file mode 100644
index 0000000..cdc7734
--- /dev/null
+++ b/typeshed/third_party/3/requests/packages/urllib3/fields.pyi
@@ -0,0 +1,16 @@
+# Stubs for requests.packages.urllib3.fields (Python 3.4)
+
+from typing import Any
+from . import packages
+
+def guess_content_type(filename, default=...): ...
+def format_header_param(name, value): ...
+
+class RequestField:
+ data = ... # type: Any
+ headers = ... # type: Any
+ def __init__(self, name, data, filename=..., headers=...) -> None: ...
+ @classmethod
+ def from_tuples(cls, fieldname, value): ...
+ def render_headers(self): ...
+ def make_multipart(self, content_disposition=..., content_type=..., content_location=...): ...
diff --git a/typeshed/third_party/3/requests/packages/urllib3/filepost.pyi b/typeshed/third_party/3/requests/packages/urllib3/filepost.pyi
new file mode 100644
index 0000000..f1ce517
--- /dev/null
+++ b/typeshed/third_party/3/requests/packages/urllib3/filepost.pyi
@@ -0,0 +1,19 @@
+# Stubs for requests.packages.urllib3.filepost (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from . import packages
+# from .packages import six
+from . import fields
+
+# six = packages.six
+# b = six.b
+RequestField = fields.RequestField
+
+writer = ... # type: Any
+
+def choose_boundary(): ...
+def iter_field_objects(fields): ...
+def iter_fields(fields): ...
+def encode_multipart_formdata(fields, boundary=...): ...
diff --git a/typeshed/third_party/3/requests/packages/urllib3/packages/__init__.pyi b/typeshed/third_party/3/requests/packages/urllib3/packages/__init__.pyi
new file mode 100644
index 0000000..67507f9
--- /dev/null
+++ b/typeshed/third_party/3/requests/packages/urllib3/packages/__init__.pyi
@@ -0,0 +1,3 @@
+# Stubs for requests.packages.urllib3.packages (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
diff --git a/typeshed/third_party/3/requests/packages/urllib3/packages/ssl_match_hostname/__init__.pyi b/typeshed/third_party/3/requests/packages/urllib3/packages/ssl_match_hostname/__init__.pyi
new file mode 100644
index 0000000..9efeac0
--- /dev/null
+++ b/typeshed/third_party/3/requests/packages/urllib3/packages/ssl_match_hostname/__init__.pyi
@@ -0,0 +1,8 @@
+# Stubs for requests.packages.urllib3.packages.ssl_match_hostname (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+import ssl
+
+CertificateError = ssl.CertificateError
+match_hostname = ssl.match_hostname
diff --git a/typeshed/third_party/3/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.pyi b/typeshed/third_party/3/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.pyi
new file mode 100644
index 0000000..5abbc9d
--- /dev/null
+++ b/typeshed/third_party/3/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.pyi
@@ -0,0 +1,7 @@
+# Stubs for requests.packages.urllib3.packages.ssl_match_hostname._implementation (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+class CertificateError(ValueError): ...
+
+def match_hostname(cert, hostname): ...
diff --git a/typeshed/third_party/3/requests/packages/urllib3/poolmanager.pyi b/typeshed/third_party/3/requests/packages/urllib3/poolmanager.pyi
new file mode 100644
index 0000000..a65f664
--- /dev/null
+++ b/typeshed/third_party/3/requests/packages/urllib3/poolmanager.pyi
@@ -0,0 +1,31 @@
+# Stubs for requests.packages.urllib3.poolmanager (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from .request import RequestMethods
+
+class PoolManager(RequestMethods):
+ proxy = ... # type: Any
+ connection_pool_kw = ... # type: Any
+ pools = ... # type: Any
+ def __init__(self, num_pools=..., headers=..., **connection_pool_kw) -> None: ...
+ def __enter__(self): ...
+ def __exit__(self, exc_type, exc_val, exc_tb): ...
+ def clear(self): ...
+ def connection_from_host(self, host, port=..., scheme=...): ...
+ def connection_from_url(self, url): ...
+ # TODO: This was the original signature -- copied another one from base class to fix complaint.
+ # def urlopen(self, method, url, redirect=True, **kw): ...
+ def urlopen(self, method, url, body=..., headers=..., encode_multipart=..., multipart_boundary=..., **kw): ...
+
+class ProxyManager(PoolManager):
+ proxy = ... # type: Any
+ proxy_headers = ... # type: Any
+ def __init__(self, proxy_url, num_pools=..., headers=..., proxy_headers=..., **connection_pool_kw) -> None: ...
+ def connection_from_host(self, host, port=..., scheme=...): ...
+ # TODO: This was the original signature -- copied another one from base class to fix complaint.
+ # def urlopen(self, method, url, redirect=True, **kw): ...
+ def urlopen(self, method, url, body=..., headers=..., encode_multipart=..., multipart_boundary=..., **kw): ...
+
+def proxy_from_url(url, **kw): ...
diff --git a/typeshed/third_party/3/requests/packages/urllib3/request.pyi b/typeshed/third_party/3/requests/packages/urllib3/request.pyi
new file mode 100644
index 0000000..788c759
--- /dev/null
+++ b/typeshed/third_party/3/requests/packages/urllib3/request.pyi
@@ -0,0 +1,13 @@
+# Stubs for requests.packages.urllib3.request (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class RequestMethods:
+ headers = ... # type: Any
+ def __init__(self, headers=...) -> None: ...
+ def urlopen(self, method, url, body=..., headers=..., encode_multipart=..., multipart_boundary=..., **kw): ...
+ def request(self, method, url, fields=..., headers=..., **urlopen_kw): ...
+ def request_encode_url(self, method, url, fields=..., **urlopen_kw): ...
+ def request_encode_body(self, method, url, fields=..., headers=..., encode_multipart=..., multipart_boundary=..., **urlopen_kw): ...
diff --git a/typeshed/third_party/3/requests/packages/urllib3/response.pyi b/typeshed/third_party/3/requests/packages/urllib3/response.pyi
new file mode 100644
index 0000000..ba2a801
--- /dev/null
+++ b/typeshed/third_party/3/requests/packages/urllib3/response.pyi
@@ -0,0 +1,58 @@
+# Stubs for requests.packages.urllib3.response (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+import io
+from . import _collections
+from . import exceptions
+# from .packages import six
+from .connection import HTTPException as HTTPException, BaseSSLError as BaseSSLError
+from .util import response
+
+HTTPHeaderDict = _collections.HTTPHeaderDict
+ProtocolError = exceptions.ProtocolError
+DecodeError = exceptions.DecodeError
+ReadTimeoutError = exceptions.ReadTimeoutError
+binary_type = bytes # six.binary_type
+PY3 = True # six.PY3
+is_fp_closed = response.is_fp_closed
+
+class DeflateDecoder:
+ def __init__(self) -> None: ...
+ def __getattr__(self, name): ...
+ def decompress(self, data): ...
+
+class GzipDecoder:
+ def __init__(self) -> None: ...
+ def __getattr__(self, name): ...
+ def decompress(self, data): ...
+
+class HTTPResponse(io.IOBase):
+ CONTENT_DECODERS = ... # type: Any
+ REDIRECT_STATUSES = ... # type: Any
+ headers = ... # type: Any
+ status = ... # type: Any
+ version = ... # type: Any
+ reason = ... # type: Any
+ strict = ... # type: Any
+ decode_content = ... # type: Any
+ def __init__(self, body=..., headers=..., status=..., version=..., reason=..., strict=..., preload_content=..., decode_content=..., original_response=..., pool=..., connection=...) -> None: ...
+ def get_redirect_location(self): ...
+ def release_conn(self): ...
+ @property
+ def data(self): ...
+ def tell(self): ...
+ def read(self, amt=..., decode_content=..., cache_content=...): ...
+ def stream(self, amt=..., decode_content=...): ...
+ @classmethod
+ def from_httplib(ResponseCls, r, **response_kw): ...
+ def getheaders(self): ...
+ def getheader(self, name, default=...): ...
+ def close(self): ...
+ @property
+ def closed(self): ...
+ def fileno(self): ...
+ def flush(self): ...
+ def readable(self): ...
+ def readinto(self, b): ...
diff --git a/typeshed/third_party/3/requests/packages/urllib3/util/__init__.pyi b/typeshed/third_party/3/requests/packages/urllib3/util/__init__.pyi
new file mode 100644
index 0000000..e4a0e13
--- /dev/null
+++ b/typeshed/third_party/3/requests/packages/urllib3/util/__init__.pyi
@@ -0,0 +1,29 @@
+# Stubs for requests.packages.urllib3.util (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from . import connection
+from . import request
+from . import response
+from . import ssl_
+from . import timeout
+from . import retry
+from . import url
+import ssl
+
+is_connection_dropped = connection.is_connection_dropped
+make_headers = request.make_headers
+is_fp_closed = response.is_fp_closed
+SSLContext = ssl.SSLContext
+HAS_SNI = ssl_.HAS_SNI
+assert_fingerprint = ssl_.assert_fingerprint
+resolve_cert_reqs = ssl_.resolve_cert_reqs
+resolve_ssl_version = ssl_.resolve_ssl_version
+ssl_wrap_socket = ssl_.ssl_wrap_socket
+current_time = timeout.current_time
+Timeout = timeout.Timeout
+Retry = retry.Retry
+get_host = url.get_host
+parse_url = url.parse_url
+split_first = url.split_first
+Url = url.Url
diff --git a/typeshed/third_party/3/requests/packages/urllib3/util/connection.pyi b/typeshed/third_party/3/requests/packages/urllib3/util/connection.pyi
new file mode 100644
index 0000000..cd67309
--- /dev/null
+++ b/typeshed/third_party/3/requests/packages/urllib3/util/connection.pyi
@@ -0,0 +1,11 @@
+# Stubs for requests.packages.urllib3.util.connection (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+poll = ... # type: Any
+select = ... # type: Any
+
+def is_connection_dropped(conn): ...
+def create_connection(address, timeout=..., source_address=..., socket_options=...): ...
diff --git a/typeshed/third_party/3/requests/packages/urllib3/util/request.pyi b/typeshed/third_party/3/requests/packages/urllib3/util/request.pyi
new file mode 100644
index 0000000..0be64df
--- /dev/null
+++ b/typeshed/third_party/3/requests/packages/urllib3/util/request.pyi
@@ -0,0 +1,12 @@
+# Stubs for requests.packages.urllib3.util.request (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+# from ..packages import six
+
+# b = six.b
+
+ACCEPT_ENCODING = ... # type: Any
+
+def make_headers(keep_alive=..., accept_encoding=..., user_agent=..., basic_auth=..., proxy_basic_auth=..., disable_cache=...): ...
diff --git a/typeshed/third_party/3/requests/packages/urllib3/util/response.pyi b/typeshed/third_party/3/requests/packages/urllib3/util/response.pyi
new file mode 100644
index 0000000..761a006
--- /dev/null
+++ b/typeshed/third_party/3/requests/packages/urllib3/util/response.pyi
@@ -0,0 +1,5 @@
+# Stubs for requests.packages.urllib3.util.response (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+def is_fp_closed(obj): ...
diff --git a/typeshed/third_party/3/requests/packages/urllib3/util/retry.pyi b/typeshed/third_party/3/requests/packages/urllib3/util/retry.pyi
new file mode 100644
index 0000000..e958d90
--- /dev/null
+++ b/typeshed/third_party/3/requests/packages/urllib3/util/retry.pyi
@@ -0,0 +1,36 @@
+# Stubs for requests.packages.urllib3.util.retry (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from .. import exceptions
+from .. import packages
+
+ConnectTimeoutError = exceptions.ConnectTimeoutError
+MaxRetryError = exceptions.MaxRetryError
+ProtocolError = exceptions.ProtocolError
+ReadTimeoutError = exceptions.ReadTimeoutError
+ResponseError = exceptions.ResponseError
+
+log = ... # type: Any
+
+class Retry:
+ DEFAULT_METHOD_WHITELIST = ... # type: Any
+ BACKOFF_MAX = ... # type: Any
+ total = ... # type: Any
+ connect = ... # type: Any
+ read = ... # type: Any
+ redirect = ... # type: Any
+ status_forcelist = ... # type: Any
+ method_whitelist = ... # type: Any
+ backoff_factor = ... # type: Any
+ raise_on_redirect = ... # type: Any
+ def __init__(self, total=..., connect=..., read=..., redirect=..., method_whitelist=..., status_forcelist=..., backoff_factor=..., raise_on_redirect=..., _observed_errors=...) -> None: ...
+ def new(self, **kw): ...
+ @classmethod
+ def from_int(cls, retries, redirect=..., default=...): ...
+ def get_backoff_time(self): ...
+ def sleep(self): ...
+ def is_forced_retry(self, method, status_code): ...
+ def is_exhausted(self): ...
+ def increment(self, method=..., url=..., response=..., error=..., _pool=..., _stacktrace=...): ...
diff --git a/typeshed/third_party/3/requests/packages/urllib3/util/ssl_.pyi b/typeshed/third_party/3/requests/packages/urllib3/util/ssl_.pyi
new file mode 100644
index 0000000..c7db0ac
--- /dev/null
+++ b/typeshed/third_party/3/requests/packages/urllib3/util/ssl_.pyi
@@ -0,0 +1,24 @@
+# Stubs for requests.packages.urllib3.util.ssl_ (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from .. import exceptions
+import ssl
+
+SSLError = exceptions.SSLError
+InsecurePlatformWarning = exceptions.InsecurePlatformWarning
+SSLContext = ssl.SSLContext
+
+HAS_SNI = ... # type: Any
+create_default_context = ... # type: Any
+OP_NO_SSLv2 = ... # type: Any
+OP_NO_SSLv3 = ... # type: Any
+OP_NO_COMPRESSION = ... # type: Any
+
+def assert_fingerprint(cert, fingerprint): ...
+def resolve_cert_reqs(candidate): ...
+def resolve_ssl_version(candidate): ...
+def create_urllib3_context(ssl_version=..., cert_reqs=..., options=..., ciphers=...): ...
+def ssl_wrap_socket(sock, keyfile=..., certfile=..., cert_reqs=..., ca_certs=...,
+ server_hostname=..., ssl_version=..., ciphers=..., ssl_context=...): ...
diff --git a/typeshed/third_party/3/requests/packages/urllib3/util/timeout.pyi b/typeshed/third_party/3/requests/packages/urllib3/util/timeout.pyi
new file mode 100644
index 0000000..0a7653c
--- /dev/null
+++ b/typeshed/third_party/3/requests/packages/urllib3/util/timeout.pyi
@@ -0,0 +1,24 @@
+# Stubs for requests.packages.urllib3.util.timeout (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from .. import exceptions
+
+TimeoutStateError = exceptions.TimeoutStateError
+
+def current_time(): ...
+
+class Timeout:
+ DEFAULT_TIMEOUT = ... # type: Any
+ total = ... # type: Any
+ def __init__(self, total=..., connect=..., read=...) -> None: ...
+ @classmethod
+ def from_float(cls, timeout): ...
+ def clone(self): ...
+ def start_connect(self): ...
+ def get_connect_duration(self): ...
+ @property
+ def connect_timeout(self): ...
+ @property
+ def read_timeout(self): ...
diff --git a/typeshed/third_party/3/requests/packages/urllib3/util/url.pyi b/typeshed/third_party/3/requests/packages/urllib3/util/url.pyi
new file mode 100644
index 0000000..9877b4a
--- /dev/null
+++ b/typeshed/third_party/3/requests/packages/urllib3/util/url.pyi
@@ -0,0 +1,26 @@
+# Stubs for requests.packages.urllib3.util.url (Python 3.4)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from .. import exceptions
+
+LocationParseError = exceptions.LocationParseError
+
+url_attrs = ... # type: Any
+
+class Url:
+ slots = ... # type: Any
+ def __new__(cls, scheme=..., auth=..., host=..., port=..., path=..., query=..., fragment=...): ...
+ @property
+ def hostname(self): ...
+ @property
+ def request_uri(self): ...
+ @property
+ def netloc(self): ...
+ @property
+ def url(self): ...
+
+def split_first(s, delims): ...
+def parse_url(url): ...
+def get_host(url): ...
diff --git a/typeshed/third_party/3/requests/sessions.pyi b/typeshed/third_party/3/requests/sessions.pyi
new file mode 100644
index 0000000..d1b79fc
--- /dev/null
+++ b/typeshed/third_party/3/requests/sessions.pyi
@@ -0,0 +1,108 @@
+# Stubs for requests.sessions (Python 3)
+
+from typing import Any, Union, MutableMapping, Text, Optional, IO, Tuple, Callable
+from . import adapters
+from . import auth
+from . import compat
+from . import cookies
+from . import models
+from .models import Response
+from . import hooks
+from . import utils
+from . import exceptions
+from .packages.urllib3 import _collections
+from . import structures
+from . import adapters
+from . import status_codes
+
+BaseAdapter = adapters.BaseAdapter
+OrderedDict = compat.OrderedDict
+cookiejar_from_dict = cookies.cookiejar_from_dict
+extract_cookies_to_jar = cookies.extract_cookies_to_jar
+RequestsCookieJar = cookies.RequestsCookieJar
+merge_cookies = cookies.merge_cookies
+Request = models.Request
+PreparedRequest = models.PreparedRequest
+DEFAULT_REDIRECT_LIMIT = models.DEFAULT_REDIRECT_LIMIT
+default_hooks = hooks.default_hooks
+dispatch_hook = hooks.dispatch_hook
+to_key_val_list = utils.to_key_val_list
+default_headers = utils.default_headers
+to_native_string = utils.to_native_string
+TooManyRedirects = exceptions.TooManyRedirects
+InvalidSchema = exceptions.InvalidSchema
+ChunkedEncodingError = exceptions.ChunkedEncodingError
+ContentDecodingError = exceptions.ContentDecodingError
+RecentlyUsedContainer = _collections.RecentlyUsedContainer
+CaseInsensitiveDict = structures.CaseInsensitiveDict
+HTTPAdapter = adapters.HTTPAdapter
+requote_uri = utils.requote_uri
+get_environ_proxies = utils.get_environ_proxies
+get_netrc_auth = utils.get_netrc_auth
+should_bypass_proxies = utils.should_bypass_proxies
+get_auth_from_url = utils.get_auth_from_url
+codes = status_codes.codes
+REDIRECT_STATI = models.REDIRECT_STATI
+
+REDIRECT_CACHE_SIZE = ... # type: Any
+
+def merge_setting(request_setting, session_setting, dict_class=...): ...
+def merge_hooks(request_hooks, session_hooks, dict_class=...): ...
+
+class SessionRedirectMixin:
+ def resolve_redirects(self, resp, req, stream=..., timeout=..., verify=..., cert=...,
+ proxies=...): ...
+ def rebuild_auth(self, prepared_request, response): ...
+ def rebuild_proxies(self, prepared_request, proxies): ...
+
+class Session(SessionRedirectMixin):
+ __attrs__ = ... # type: Any
+ headers = ... # type: Optional[MutableMapping[Text, Text]]
+ auth = ... # type: Union[None, Tuple[Text, Text], Callable[[Request], Request]]
+ proxies = ... # type: Optional[MutableMapping[Text, Text]]
+ hooks = ... # type: Optional[MutableMapping[Text, Callable[[Request], Any]]]
+ params = ... # type: Union[None, bytes, MutableMapping[Text, Text]]
+ stream = ... # type: bool
+ verify = ... # type: bool
+ cert = ... # type: Union[None, Text, Tuple[Text, Text]]
+ max_redirects = ... # type: int
+ trust_env = ... # type: bool
+ cookies = ... # type: Union[None, RequestsCookieJar, MutableMapping[Text, Text]]
+ adapters = ... # type: MutableMapping
+ redirect_cache = ... # type: RecentlyUsedContainer
+ def __init__(self) -> None: ...
+ def __enter__(self) -> 'Session': ...
+ def __exit__(self, *args) -> None: ...
+ def prepare_request(self, request): ...
+ def request(self, method: str, url: str,
+ params, # type: Union[None, bytes, MutableMapping[Text, Text]]
+ data, # type: Union[None, bytes, MutableMapping[Text, Text], IO]
+ headers, # type: Optional[MutableMapping[Text, Text]]
+ cookies, # type: Union[None, RequestsCookieJar, MutableMapping[Text, Text]]
+ files, # type: Optional[MutableMapping[Text, IO]]
+ auth, # type: Union[None, Tuple[Text, Text], Callable[[Request], Request]]
+ timeout, # type: Union[None, float, Tuple[float, float]]
+ allow_redirects, # type: Optional[bool]
+ proxies, # type: Optional[MutableMapping[Text, Text]]
+ hooks, # type: Optional[MutableMapping[Text, Callable[[Request], Any]]]
+ stream, # type: Optional[bool]
+ verify, # type: Optional[bool]
+ cert, # type: Union[Text, Tuple[Text, Text], None]
+ json # type: Optional[MutableMapping]
+ ) -> Response: ...
+ def get(self, url: Union[str, bytes], **kwargs) -> Response: ...
+ def options(self, url: Union[str, bytes], **kwargs) -> Response: ...
+ def head(self, url: Union[str, bytes], **kwargs) -> Response: ...
+ def post(self, url: Union[str, bytes], data=..., json=..., **kwargs) -> Response: ...
+ def put(self, url: Union[str, bytes], data=..., **kwargs) -> Response: ...
+ def patch(self, url: Union[str, bytes], data=..., **kwargs) -> Response: ...
+ def delete(self, url: Union[str, bytes], **kwargs) -> Response: ...
+ def send(self, request, **kwargs): ...
+ def merge_environment_settings(self, url, proxies, stream, verify, cert): ...
+ def get_adapter(self, url): ...
+ def close(self) -> None: ...
+ def mount(self, prefix:
+ Union[str, bytes],
+ adapter: BaseAdapter) -> None: ...
+
+def session() -> Session: ...
diff --git a/typeshed/third_party/3/requests/status_codes.pyi b/typeshed/third_party/3/requests/status_codes.pyi
new file mode 100644
index 0000000..e3035eb
--- /dev/null
+++ b/typeshed/third_party/3/requests/status_codes.pyi
@@ -0,0 +1,8 @@
+# Stubs for requests.status_codes (Python 3)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from .structures import LookupDict
+
+codes = ... # type: Any
diff --git a/typeshed/third_party/3/requests/structures.pyi b/typeshed/third_party/3/requests/structures.pyi
new file mode 100644
index 0000000..af4273b
--- /dev/null
+++ b/typeshed/third_party/3/requests/structures.pyi
@@ -0,0 +1,12 @@
+# Stubs for requests.structures (Python 3)
+
+from typing import Any, Iterator, MutableMapping, Tuple, Union
+
+class CaseInsensitiveDict(MutableMapping[str, Union[str, bytes]]):
+ def lower_items(self) -> Iterator[Tuple[str, Union[str, bytes]]]: ...
+
+class LookupDict(dict):
+ name = ... # type: Any
+ def __init__(self, name=...) -> None: ...
+ def __getitem__(self, key): ...
+ def get(self, key, default=...): ...
diff --git a/typeshed/third_party/3/requests/utils.pyi b/typeshed/third_party/3/requests/utils.pyi
new file mode 100644
index 0000000..945277a
--- /dev/null
+++ b/typeshed/third_party/3/requests/utils.pyi
@@ -0,0 +1,52 @@
+# Stubs for requests.utils (Python 3)
+
+from typing import Any
+from . import compat
+from . import cookies
+from . import structures
+from . import exceptions
+
+OrderedDict = compat.OrderedDict
+RequestsCookieJar = cookies.RequestsCookieJar
+cookiejar_from_dict = cookies.cookiejar_from_dict
+CaseInsensitiveDict = structures.CaseInsensitiveDict
+InvalidURL = exceptions.InvalidURL
+
+NETRC_FILES = ... # type: Any
+DEFAULT_CA_BUNDLE_PATH = ... # type: Any
+
+def dict_to_sequence(d): ...
+def super_len(o): ...
+def get_netrc_auth(url): ...
+def guess_filename(obj): ...
+def from_key_val_list(value): ...
+def to_key_val_list(value): ...
+def parse_list_header(value): ...
+def parse_dict_header(value): ...
+def unquote_header_value(value, is_filename=...): ...
+def dict_from_cookiejar(cj): ...
+def add_dict_to_cookiejar(cj, cookie_dict): ...
+def get_encodings_from_content(content): ...
+def get_encoding_from_headers(headers): ...
+def stream_decode_response_unicode(iterator, r): ...
+def iter_slices(string, slice_length): ...
+def get_unicode_from_response(r): ...
+
+UNRESERVED_SET = ... # type: Any
+
+def unquote_unreserved(uri): ...
+def requote_uri(uri): ...
+def address_in_network(ip, net): ...
+def dotted_netmask(mask): ...
+def is_ipv4_address(string_ip): ...
+def is_valid_cidr(string_network): ...
+def should_bypass_proxies(url): ...
+def get_environ_proxies(url): ...
+def default_user_agent(name=...): ...
+def default_headers(): ...
+def parse_header_links(value): ...
+def guess_json_utf(data): ...
+def prepend_scheme_if_needed(url, new_scheme): ...
+def get_auth_from_url(url): ...
+def to_native_string(string, encoding=...): ...
+def urldefragauth(url): ...
diff --git a/typeshed/third_party/3/six/__init__.pyi b/typeshed/third_party/3/six/__init__.pyi
new file mode 100644
index 0000000..333bd27
--- /dev/null
+++ b/typeshed/third_party/3/six/__init__.pyi
@@ -0,0 +1,103 @@
+# Stubs for six (Python 3.5)
+
+from __future__ import print_function
+
+from typing import (
+ Any,
+ AnyStr,
+ Callable,
+ Dict,
+ ItemsView,
+ Iterable,
+ KeysView,
+ Mapping,
+ Optional,
+ Pattern,
+ Tuple,
+ Type,
+ TypeVar,
+ Union,
+ ValuesView,
+ overload,
+)
+import types
+import typing
+import unittest
+from mypy_extensions import NoReturn
+
+# Exports
+from io import StringIO as StringIO, BytesIO as BytesIO
+from builtins import next as next
+from functools import wraps as wraps
+
+_T = TypeVar('_T')
+_K = TypeVar('_K')
+_V = TypeVar('_V')
+
+# TODO make constant, then move this stub to 2and3
+# https://github.com/python/typeshed/issues/17
+PY2 = False
+PY3 = True
+PY34 = ... # type: bool
+
+string_types = str,
+integer_types = int,
+class_types = type,
+text_type = str
+binary_type = bytes
+
+MAXSIZE = ... # type: int
+
+# def add_move
+# def remove_move
+
+def callable(obj: object) -> bool: ...
+
+def get_unbound_function(unbound: types.FunctionType) -> types.FunctionType: ...
+def create_bound_method(func: types.FunctionType, obj: object) -> types.MethodType: ...
+def create_unbound_method(func: types.FunctionType, cls: type) -> types.FunctionType: ...
+
+Iterator = object
+
+def get_method_function(meth: types.MethodType) -> types.FunctionType: ...
+def get_method_self(meth: types.MethodType) -> Optional[object]: ...
+def get_function_closure(fun: types.FunctionType) -> Optional[Tuple[types._Cell, ...]]: ...
+def get_function_code(fun: types.FunctionType) -> types.CodeType: ...
+def get_function_defaults(fun: types.FunctionType) -> Optional[Tuple[Any, ...]]: ...
+def get_function_globals(fun: types.FunctionType) -> Dict[str, Any]: ...
+
+def iterkeys(d: Mapping[_K, _V]) -> typing.Iterator[_K]: ...
+def itervalues(d: Mapping[_K, _V]) -> typing.Iterator[_V]: ...
+def iteritems(d: Mapping[_K, _V]) -> typing.Iterator[Tuple[_K, _V]]: ...
+# def iterlists
+
+def viewkeys(d: Mapping[_K, _V]) -> KeysView[_K]: ...
+def viewvalues(d: Mapping[_K, _V]) -> ValuesView[_V]: ...
+def viewitems(d: Mapping[_K, _V]) -> ItemsView[_K, _V]: ...
+
+def b(s: str) -> binary_type: ...
+def u(s: str) -> text_type: ...
+
+unichr = chr
+def int2byte(i: int) -> bytes: ...
+def byte2int(bs: binary_type) -> int: ...
+def indexbytes(buf: binary_type, i: int) -> int: ...
+def iterbytes(buf: binary_type) -> typing.Iterator[int]: ...
+
+def assertCountEqual(self: unittest.TestCase, first: Iterable[_T], second: Iterable[_T], msg: str = None) -> None: ...
+ at overload
+def assertRaisesRegex(self: unittest.TestCase, msg: str = None) -> Any: ...
+ at overload
+def assertRaisesRegex(self: unittest.TestCase, callable_obj: Callable[..., Any], *args: Any, **kwargs: Any) -> Any: ...
+def assertRegex(self: unittest.TestCase, text: AnyStr, expected_regex: Union[AnyStr, Pattern[AnyStr]], msg: str = None) -> None: ...
+
+exec_ = exec
+
+def reraise(tp: Optional[Type[BaseException]], value: Optional[BaseException], tb: Optional[types.TracebackType] = None) -> NoReturn: ...
+def raise_from(value: BaseException, from_value: BaseException) -> None: ...
+
+print_ = print
+
+def with_metaclass(meta: type, *bases: type) -> type: ...
+def add_metaclass(metaclass: type) -> Callable[[_T], _T]: ...
+def python_2_unicode_compatible(klass: _T) -> _T: ...
diff --git a/typeshed/third_party/3/six/moves/__init__.pyi b/typeshed/third_party/3/six/moves/__init__.pyi
new file mode 100644
index 0000000..859a7eb
--- /dev/null
+++ b/typeshed/third_party/3/six/moves/__init__.pyi
@@ -0,0 +1,34 @@
+# Generated by stubtool 0.1, DO NOT EDIT
+# See https://github.com/o11c/stubtool
+#
+# Stubs for six.moves (Python 3.2)
+
+from http import cookies as http_cookies
+from io import StringIO as cStringIO
+from builtins import filter as filter
+from itertools import filterfalse as filterfalse
+from builtins import input as input
+from sys import intern as intern
+from builtins import map as map
+from os import getcwd as getcwd
+from os import getcwdb as getcwdb
+from builtins import range as range
+from imp import reload as reload_module
+from functools import reduce as reduce
+from shlex import quote as shlex_quote
+from io import StringIO as StringIO
+from collections import UserDict as UserDict
+from collections import UserList as UserList
+from collections import UserString as UserString
+from builtins import range as xrange
+from builtins import zip as zip
+from itertools import zip_longest as zip_longest
+import six.moves.cPickle as cPickle
+import html.parser as html_parser
+import html.entities as html_entities
+import http.client as http_client
+
+import six.moves.urllib_parse as urllib_parse
+import six.moves.urllib_error as urllib_error
+import six.moves.urllib as urllib
+import six.moves.urllib_robotparser as urllib_robotparser
diff --git a/typeshed/third_party/3/six/moves/cPickle.pyi b/typeshed/third_party/3/six/moves/cPickle.pyi
new file mode 100644
index 0000000..f2e2e12
--- /dev/null
+++ b/typeshed/third_party/3/six/moves/cPickle.pyi
@@ -0,0 +1,6 @@
+# Generated by stubtool 0.1, DO NOT EDIT
+# See https://github.com/o11c/stubtool
+#
+# Stubs for six.moves.cPickle (Python 3.2)
+
+from pickle import * # noqa: F403
diff --git a/typeshed/third_party/3/six/moves/urllib/__init__.pyi b/typeshed/third_party/3/six/moves/urllib/__init__.pyi
new file mode 100644
index 0000000..298b049
--- /dev/null
+++ b/typeshed/third_party/3/six/moves/urllib/__init__.pyi
@@ -0,0 +1,10 @@
+# Generated by stubtool 0.1, DO NOT EDIT
+# See https://github.com/o11c/stubtool
+#
+# Stubs for six.moves.urllib (Python 3.2)
+
+import six.moves.urllib.error as error
+import six.moves.urllib.parse as parse
+import six.moves.urllib.request as request
+import six.moves.urllib.response as response
+import six.moves.urllib.robotparser as robotparser
diff --git a/typeshed/third_party/3/six/moves/urllib/error.pyi b/typeshed/third_party/3/six/moves/urllib/error.pyi
new file mode 100644
index 0000000..a45b0f7
--- /dev/null
+++ b/typeshed/third_party/3/six/moves/urllib/error.pyi
@@ -0,0 +1,8 @@
+# Generated by stubtool 0.1, DO NOT EDIT
+# See https://github.com/o11c/stubtool
+#
+# Stubs for six.moves.urllib.error (Python 3.2)
+
+from urllib.error import URLError as URLError
+from urllib.error import HTTPError as HTTPError
+from urllib.error import ContentTooShortError as ContentTooShortError
diff --git a/typeshed/third_party/3/six/moves/urllib/parse.pyi b/typeshed/third_party/3/six/moves/urllib/parse.pyi
new file mode 100644
index 0000000..c640af2
--- /dev/null
+++ b/typeshed/third_party/3/six/moves/urllib/parse.pyi
@@ -0,0 +1,22 @@
+# Generated by stubtool 0.1, DO NOT EDIT
+# See https://github.com/o11c/stubtool
+#
+# Stubs for six.moves.urllib.parse (Python 3.2)
+
+from six.moves.urllib_parse import (
+ ParseResult as ParseResult,
+ SplitResult as SplitResult,
+ parse_qs as parse_qs,
+ parse_qsl as parse_qsl,
+ urldefrag as urldefrag,
+ urljoin as urljoin,
+ urlparse as urlparse,
+ urlsplit as urlsplit,
+ urlunparse as urlunparse,
+ urlunsplit as urlunsplit,
+ quote as quote,
+ quote_plus as quote_plus,
+ unquote as unquote,
+ unquote_plus as unquote_plus,
+ urlencode as urlencode,
+)
diff --git a/typeshed/third_party/3/six/moves/urllib/request.pyi b/typeshed/third_party/3/six/moves/urllib/request.pyi
new file mode 100644
index 0000000..b15ced7
--- /dev/null
+++ b/typeshed/third_party/3/six/moves/urllib/request.pyi
@@ -0,0 +1,40 @@
+# Generated by stubtool 0.1, DO NOT EDIT
+# See https://github.com/o11c/stubtool
+#
+# Stubs for six.moves.urllib.request (Python 3.2)
+
+from urllib.request import BaseHandler as BaseHandler
+from urllib.request import HTTPRedirectHandler as HTTPRedirectHandler
+from urllib.request import OpenerDirector as OpenerDirector
+
+from urllib.request import install_opener as install_opener
+from urllib.request import build_opener as build_opener
+
+# from urllib.request import urlopen as urlopen
+# from urllib.request import pathname2url as pathname2url
+# from urllib.request import url2pathname as url2pathname
+# from urllib.request import getproxies as getproxies
+# from urllib.request import Request as Request
+# from urllib.request import HTTPDefaultErrorHandler as HTTPDefaultErrorHandler
+# from urllib.request import HTTPCookieProcessor as HTTPCookieProcessor
+# from urllib.request import ProxyHandler as ProxyHandler
+# from urllib.request import HTTPPasswordMgr as HTTPPasswordMgr
+# from urllib.request import HTTPPasswordMgrWithDefaultRealm as HTTPPasswordMgrWithDefaultRealm
+# from urllib.request import AbstractBasicAuthHandler as AbstractBasicAuthHandler
+# from urllib.request import HTTPBasicAuthHandler as HTTPBasicAuthHandler
+# from urllib.request import ProxyBasicAuthHandler as ProxyBasicAuthHandler
+# from urllib.request import AbstractDigestAuthHandler as AbstractDigestAuthHandler
+# from urllib.request import HTTPDigestAuthHandler as HTTPDigestAuthHandler
+# from urllib.request import ProxyDigestAuthHandler as ProxyDigestAuthHandler
+# from urllib.request import HTTPHandler as HTTPHandler
+# from urllib.request import HTTPSHandler as HTTPSHandler
+# from urllib.request import FileHandler as FileHandler
+# from urllib.request import FTPHandler as FTPHandler
+# from urllib.request import CacheFTPHandler as CacheFTPHandler
+# from urllib.request import UnknownHandler as UnknownHandler
+# from urllib.request import HTTPErrorProcessor as HTTPErrorProcessor
+# from urllib.request import urlretrieve as urlretrieve
+# from urllib.request import urlcleanup as urlcleanup
+# from urllib.request import URLopener as URLopener
+# from urllib.request import FancyURLopener as FancyURLopener
+# from urllib.request import proxy_bypass as proxy_bypass
diff --git a/typeshed/third_party/3/six/moves/urllib/response.pyi b/typeshed/third_party/3/six/moves/urllib/response.pyi
new file mode 100644
index 0000000..c3b34a8
--- /dev/null
+++ b/typeshed/third_party/3/six/moves/urllib/response.pyi
@@ -0,0 +1 @@
+from urllib.response import addinfourl as addinfourl
diff --git a/typeshed/third_party/3/six/moves/urllib/robotparser.pyi b/typeshed/third_party/3/six/moves/urllib/robotparser.pyi
new file mode 100644
index 0000000..6690355
--- /dev/null
+++ b/typeshed/third_party/3/six/moves/urllib/robotparser.pyi
@@ -0,0 +1,6 @@
+# Generated by stubtool 0.1, DO NOT EDIT
+# See https://github.com/o11c/stubtool
+#
+# Stubs for six.moves.urllib.robotparser (Python 3.2)
+
+from urllib.robotparser import RobotFileParser as RobotFileParser
diff --git a/typeshed/third_party/3/six/moves/urllib_error.pyi b/typeshed/third_party/3/six/moves/urllib_error.pyi
new file mode 100644
index 0000000..1368664
--- /dev/null
+++ b/typeshed/third_party/3/six/moves/urllib_error.pyi
@@ -0,0 +1,10 @@
+# Generated by stubtool 0.1, DO NOT EDIT
+# See https://github.com/o11c/stubtool
+#
+# Stubs for six.moves.urllib_error (Python 3.2)
+
+from six.moves.urllib.error import (
+ URLError as URLError,
+ HTTPError as HTTPError,
+ ContentTooShortError as ContentTooShortError,
+)
diff --git a/typeshed/third_party/3/six/moves/urllib_parse.pyi b/typeshed/third_party/3/six/moves/urllib_parse.pyi
new file mode 100644
index 0000000..96f6207
--- /dev/null
+++ b/typeshed/third_party/3/six/moves/urllib_parse.pyi
@@ -0,0 +1,20 @@
+# Generated by stubtool 0.1, DO NOT EDIT
+# See https://github.com/o11c/stubtool
+#
+# Stubs for six.moves.urllib_parse (Python 3.2)
+
+from urllib.parse import ParseResult as ParseResult
+from urllib.parse import SplitResult as SplitResult
+from urllib.parse import parse_qs as parse_qs
+from urllib.parse import parse_qsl as parse_qsl
+from urllib.parse import urldefrag as urldefrag
+from urllib.parse import urljoin as urljoin
+from urllib.parse import urlparse as urlparse
+from urllib.parse import urlsplit as urlsplit
+from urllib.parse import urlunparse as urlunparse
+from urllib.parse import urlunsplit as urlunsplit
+from urllib.parse import quote as quote
+from urllib.parse import quote_plus as quote_plus
+from urllib.parse import unquote as unquote
+from urllib.parse import unquote_plus as unquote_plus
+from urllib.parse import urlencode as urlencode
diff --git a/typeshed/third_party/3/six/moves/urllib_request.pyi b/typeshed/third_party/3/six/moves/urllib_request.pyi
new file mode 100644
index 0000000..168f635
--- /dev/null
+++ b/typeshed/third_party/3/six/moves/urllib_request.pyi
@@ -0,0 +1,41 @@
+# Generated by stubtool 0.1, DO NOT EDIT
+# See https://github.com/o11c/stubtool
+#
+# Stubs for six.moves.urllib_request (Python 3.2)
+
+from six.moves.urllib.request import (
+ install_opener as install_opener,
+ build_opener as build_opener,
+ BaseHandler as BaseHandler,
+ OpenerDirector as OpenerDirector,
+ HTTPRedirectHandler as HTTPRedirectHandler,
+
+ # urlopen as urlopen,
+ # pathname2url as pathname2url,
+ # url2pathname as url2pathname,
+ # getproxies as getproxies,
+ # Request as Request,
+ # HTTPDefaultErrorHandler as HTTPDefaultErrorHandler,
+ # HTTPCookieProcessor as HTTPCookieProcessor,
+ # ProxyHandler as ProxyHandler,
+ # HTTPPasswordMgr as HTTPPasswordMgr,
+ # HTTPPasswordMgrWithDefaultRealm as HTTPPasswordMgrWithDefaultRealm,
+ # AbstractBasicAuthHandler as AbstractBasicAuthHandler,
+ # HTTPBasicAuthHandler as HTTPBasicAuthHandler,
+ # ProxyBasicAuthHandler as ProxyBasicAuthHandler,
+ # AbstractDigestAuthHandler as AbstractDigestAuthHandler,
+ # HTTPDigestAuthHandler as HTTPDigestAuthHandler,
+ # ProxyDigestAuthHandler as ProxyDigestAuthHandler,
+ # HTTPHandler as HTTPHandler,
+ # HTTPSHandler as HTTPSHandler,
+ # FileHandler as FileHandler,
+ # FTPHandler as FTPHandler,
+ # CacheFTPHandler as CacheFTPHandler,
+ # UnknownHandler as UnknownHandler,
+ # HTTPErrorProcessor as HTTPErrorProcessor,
+ # urlretrieve as urlretrieve,
+ # urlcleanup as urlcleanup,
+ # URLopener as URLopener,
+ # FancyURLopener as FancyURLopener,
+ # proxy_bypass as proxy_bypass,
+)
diff --git a/typeshed/third_party/3/six/moves/urllib_response.pyi b/typeshed/third_party/3/six/moves/urllib_response.pyi
new file mode 100644
index 0000000..1574d7d
--- /dev/null
+++ b/typeshed/third_party/3/six/moves/urllib_response.pyi
@@ -0,0 +1 @@
+from six.moves.urllib.response import addinfourl as addinfourl
diff --git a/typeshed/third_party/3/six/moves/urllib_robotparser.pyi b/typeshed/third_party/3/six/moves/urllib_robotparser.pyi
new file mode 100644
index 0000000..8b4ca73
--- /dev/null
+++ b/typeshed/third_party/3/six/moves/urllib_robotparser.pyi
@@ -0,0 +1,8 @@
+# Generated by stubtool 0.1, DO NOT EDIT
+# See https://github.com/o11c/stubtool
+#
+# Stubs for six.moves.urllib_robotparser (Python 3.2)
+
+from six.moves.urllib.robotparser import (
+ RobotFileParser as RobotFileParser,
+)
diff --git a/typeshed/third_party/3/typed_ast/__init__.pyi b/typeshed/third_party/3/typed_ast/__init__.pyi
new file mode 100644
index 0000000..92e1216
--- /dev/null
+++ b/typeshed/third_party/3/typed_ast/__init__.pyi
@@ -0,0 +1,2 @@
+# This module is a fork of the CPython 2.7 and 3.5 ast modules with PEP 484 support.
+# See: https://github.com/dropbox/typed_ast
diff --git a/typeshed/third_party/3/typed_ast/ast27.pyi b/typeshed/third_party/3/typed_ast/ast27.pyi
new file mode 100644
index 0000000..28e0dfe
--- /dev/null
+++ b/typeshed/third_party/3/typed_ast/ast27.pyi
@@ -0,0 +1,360 @@
+import typing
+from typing import Any, Optional, Union, Generic, Iterator
+
+class NodeVisitor():
+ def visit(self, node: AST) -> Any: ...
+ def generic_visit(self, node: AST) -> None: ...
+
+class NodeTransformer(NodeVisitor):
+ def generic_visit(self, node: AST) -> None: ...
+
+def parse(source: Union[str, bytes], filename: Union[str, bytes] = ..., mode: str = ...) -> AST: ...
+def copy_location(new_node: AST, old_node: AST) -> AST: ...
+def dump(node: AST, annotate_fields: bool = ..., include_attributes: bool = ...) -> str: ...
+def fix_missing_locations(node: AST) -> AST: ...
+def get_docstring(node: AST, clean: bool = ...) -> Optional[bytes]: ...
+def increment_lineno(node: AST, n: int = ...) -> AST: ...
+def iter_child_nodes(node: AST) -> Iterator[AST]: ...
+def iter_fields(node: AST) -> Iterator[typing.Tuple[str, Any]]: ...
+def literal_eval(node_or_string: Union[str, AST]) -> Any: ...
+def walk(node: AST) -> Iterator[AST]: ...
+
+PyCF_ONLY_AST = ... # type: int
+
+# ast classes
+
+identifier = str
+
+class AST:
+ _attributes = ... # type: typing.Tuple[str, ...]
+ _fields = ... # type: typing.Tuple[str, ...]
+ def __init__(self, *args, **kwargs) -> None: ...
+
+class mod(AST):
+ ...
+
+class Module(mod):
+ body = ... # type: typing.List[stmt]
+ type_ignores = ... # type: typing.List[TypeIgnore]
+
+class Interactive(mod):
+ body = ... # type: typing.List[stmt]
+
+class Expression(mod):
+ body = ... # type: expr
+
+class FunctionType(mod):
+ argtypes = ... # type: typing.List[expr]
+ returns = ... # type: expr
+
+class Suite(mod):
+ body = ... # type: typing.List[stmt]
+
+
+class stmt(AST):
+ lineno = ... # type: int
+ col_offset = ... # type: int
+
+class FunctionDef(stmt):
+ name = ... # type: identifier
+ args = ... # type: arguments
+ body = ... # type: typing.List[stmt]
+ decorator_list = ... # type: typing.List[expr]
+ type_comment = ... # type: Optional[str]
+
+class ClassDef(stmt):
+ name = ... # type: identifier
+ bases = ... # type: typing.List[expr]
+ body = ... # type: typing.List[stmt]
+ decorator_list = ... # type: typing.List[expr]
+
+class Return(stmt):
+ value = ... # type: Optional[expr]
+
+class Delete(stmt):
+ targets = ... # type: typing.List[expr]
+
+class Assign(stmt):
+ targets = ... # type: typing.List[expr]
+ value = ... # type: expr
+ type_comment = ... # type: Optional[str]
+
+class AugAssign(stmt):
+ target = ... # type: expr
+ op = ... # type: operator
+ value = ... # type: expr
+
+class Print(stmt):
+ dest = ... # type: Optional[expr]
+ values = ... # type: typing.List[expr]
+ nl = ... # type: bool
+
+class For(stmt):
+ target = ... # type: expr
+ iter = ... # type: expr
+ body = ... # type: typing.List[stmt]
+ orelse = ... # type: typing.List[stmt]
+ type_comment = ... # type: Optional[str]
+
+class While(stmt):
+ test = ... # type: expr
+ body = ... # type: typing.List[stmt]
+ orelse = ... # type: typing.List[stmt]
+
+class If(stmt):
+ test = ... # type: expr
+ body = ... # type: typing.List[stmt]
+ orelse = ... # type: typing.List[stmt]
+
+class With(stmt):
+ context_expr = ... # type: expr
+ optional_vars = ... # type: Optional[expr]
+ body = ... # type: typing.List[stmt]
+ type_comment = ... # type: Optional[str]
+
+class Raise(stmt):
+ type = ... # type: Optional[expr]
+ inst = ... # type: Optional[expr]
+ tback = ... # type: Optional[expr]
+
+class TryExcept(stmt):
+ body = ... # type: typing.List[stmt]
+ handlers = ... # type: typing.List[ExceptHandler]
+ orelse = ... # type: typing.List[stmt]
+
+class TryFinally(stmt):
+ body = ... # type: typing.List[stmt]
+ finalbody = ... # type: typing.List[stmt]
+
+class Assert(stmt):
+ test = ... # type: expr
+ msg = ... # type: Optional[expr]
+
+class Import(stmt):
+ names = ... # type: typing.List[alias]
+
+class ImportFrom(stmt):
+ module = ... # type: Optional[identifier]
+ names = ... # type: typing.List[alias]
+ level = ... # type: Optional[int]
+
+class Exec(stmt):
+ body = ... # type: expr
+ globals = ... # type: Optional[expr]
+ locals = ... # type: Optional[expr]
+
+class Global(stmt):
+ names = ... # type: typing.List[identifier]
+
+class Expr(stmt):
+ value = ... # type: expr
+
+class Pass(stmt): ...
+class Break(stmt): ...
+class Continue(stmt): ...
+
+
+class slice(AST):
+ ...
+
+_slice = slice # this lets us type the variable named 'slice' below
+
+class Slice(slice):
+ lower = ... # type: Optional[expr]
+ upper = ... # type: Optional[expr]
+ step = ... # type: Optional[expr]
+
+class ExtSlice(slice):
+ dims = ... # type: typing.List[slice]
+
+class Index(slice):
+ value = ... # type: expr
+
+class Ellipsis(slice): ...
+
+
+class expr(AST):
+ lineno = ... # type: int
+ col_offset = ... # type: int
+
+class BoolOp(expr):
+ op = ... # type: boolop
+ values = ... # type: typing.List[expr]
+
+class BinOp(expr):
+ left = ... # type: expr
+ op = ... # type: operator
+ right = ... # type: expr
+
+class UnaryOp(expr):
+ op = ... # type: unaryop
+ operand = ... # type: expr
+
+class Lambda(expr):
+ args = ... # type: arguments
+ body = ... # type: expr
+
+class IfExp(expr):
+ test = ... # type: expr
+ body = ... # type: expr
+ orelse = ... # type: expr
+
+class Dict(expr):
+ keys = ... # type: typing.List[expr]
+ values = ... # type: typing.List[expr]
+
+class Set(expr):
+ elts = ... # type: typing.List[expr]
+
+class ListComp(expr):
+ elt = ... # type: expr
+ generators = ... # type: typing.List[comprehension]
+
+class SetComp(expr):
+ elt = ... # type: expr
+ generators = ... # type: typing.List[comprehension]
+
+class DictComp(expr):
+ key = ... # type: expr
+ value = ... # type: expr
+ generators = ... # type: typing.List[comprehension]
+
+class GeneratorExp(expr):
+ elt = ... # type: expr
+ generators = ... # type: typing.List[comprehension]
+
+class Yield(expr):
+ value = ... # type: Optional[expr]
+
+class Compare(expr):
+ left = ... # type: expr
+ ops = ... # type: typing.List[cmpop]
+ comparators = ... # type: typing.List[expr]
+
+class Call(expr):
+ func = ... # type: expr
+ args = ... # type: typing.List[expr]
+ keywords = ... # type: typing.List[keyword]
+ starargs = ... # type: Optional[expr]
+ kwargs = ... # type: Optional[expr]
+
+class Repr(expr):
+ value = ... # type: expr
+
+class Num(expr):
+ n = ... # type: Union[int, float]
+
+class Str(expr):
+ s = ... # type: bytes
+
+class Attribute(expr):
+ value = ... # type: expr
+ attr = ... # type: identifier
+ ctx = ... # type: expr_context
+
+class Subscript(expr):
+ value = ... # type: expr
+ slice = ... # type: _slice
+ ctx = ... # type: expr_context
+
+class Name(expr):
+ id = ... # type: identifier
+ ctx = ... # type: expr_context
+
+class List(expr):
+ elts = ... # type: typing.List[expr]
+ ctx = ... # type: expr_context
+
+class Tuple(expr):
+ elts = ... # type: typing.List[expr]
+ ctx = ... # type: expr_context
+
+
+class expr_context(AST):
+ ...
+
+class AugLoad(expr_context): ...
+class AugStore(expr_context): ...
+class Del(expr_context): ...
+class Load(expr_context): ...
+class Param(expr_context): ...
+class Store(expr_context): ...
+
+
+class boolop(AST):
+ ...
+
+class And(boolop): ...
+class Or(boolop): ...
+
+class operator(AST):
+ ...
+
+class Add(operator): ...
+class BitAnd(operator): ...
+class BitOr(operator): ...
+class BitXor(operator): ...
+class Div(operator): ...
+class FloorDiv(operator): ...
+class LShift(operator): ...
+class Mod(operator): ...
+class Mult(operator): ...
+class Pow(operator): ...
+class RShift(operator): ...
+class Sub(operator): ...
+
+class unaryop(AST):
+ ...
+
+class Invert(unaryop): ...
+class Not(unaryop): ...
+class UAdd(unaryop): ...
+class USub(unaryop): ...
+
+class cmpop(AST):
+ ...
+
+class Eq(cmpop): ...
+class Gt(cmpop): ...
+class GtE(cmpop): ...
+class In(cmpop): ...
+class Is(cmpop): ...
+class IsNot(cmpop): ...
+class Lt(cmpop): ...
+class LtE(cmpop): ...
+class NotEq(cmpop): ...
+class NotIn(cmpop): ...
+
+
+class comprehension(AST):
+ target = ... # type: expr
+ iter = ... # type: expr
+ ifs = ... # type: typing.List[expr]
+
+
+class ExceptHandler(AST):
+ type = ... # type: Optional[expr]
+ name = ... # type: Optional[expr]
+ body = ... # type: typing.List[stmt]
+ lineno = ... # type: int
+ col_offset = ... # type: int
+
+
+class arguments(AST):
+ args = ... # type: typing.List[expr]
+ vararg = ... # type: Optional[identifier]
+ kwarg = ... # type: Optional[identifier]
+ defaults = ... # type: typing.List[expr]
+ type_comments = ... # type: typing.List[str]
+
+class keyword(AST):
+ arg = ... # type: identifier
+ value = ... # type: expr
+
+class alias(AST):
+ name = ... # type: identifier
+ asname = ... # type: Optional[identifier]
+
+
+class TypeIgnore(AST):
+ lineno = ... # type: int
diff --git a/typeshed/third_party/3/typed_ast/ast35.pyi b/typeshed/third_party/3/typed_ast/ast35.pyi
new file mode 100644
index 0000000..71ac1ba
--- /dev/null
+++ b/typeshed/third_party/3/typed_ast/ast35.pyi
@@ -0,0 +1,392 @@
+import typing
+from typing import Any, Optional, Union, Generic, Iterator
+
+class NodeVisitor():
+ def visit(self, node: AST) -> Any: ...
+ def generic_visit(self, node: AST) -> None: ...
+
+class NodeTransformer(NodeVisitor):
+ def generic_visit(self, node: AST) -> None: ...
+
+def parse(source: Union[str, bytes], filename: Union[str, bytes] = ..., mode: str = ...) -> AST: ...
+def copy_location(new_node: AST, old_node: AST) -> AST: ...
+def dump(node: AST, annotate_fields: bool = ..., include_attributes: bool = ...) -> str: ...
+def fix_missing_locations(node: AST) -> AST: ...
+def get_docstring(node: AST, clean: bool = ...) -> str: ...
+def increment_lineno(node: AST, n: int = ...) -> AST: ...
+def iter_child_nodes(node: AST) -> Iterator[AST]: ...
+def iter_fields(node: AST) -> Iterator[typing.Tuple[str, Any]]: ...
+def literal_eval(node_or_string: Union[str, AST]) -> Any: ...
+def walk(node: AST) -> Iterator[AST]: ...
+
+PyCF_ONLY_AST = ... # type: int
+
+# ast classes
+
+identifier = str
+
+class AST:
+ _attributes = ... # type: typing.Tuple[str, ...]
+ _fields = ... # type: typing.Tuple[str, ...]
+ def __init__(self, *args, **kwargs) -> None: ...
+
+class mod(AST):
+ ...
+
+class Module(mod):
+ body = ... # type: typing.List[stmt]
+ type_ignores = ... # type: typing.List[TypeIgnore]
+
+class Interactive(mod):
+ body = ... # type: typing.List[stmt]
+
+class Expression(mod):
+ body = ... # type: expr
+
+class FunctionType(mod):
+ argtypes = ... # type: typing.List[expr]
+ returns = ... # type: expr
+
+class Suite(mod):
+ body = ... # type: typing.List[stmt]
+
+
+class stmt(AST):
+ lineno = ... # type: int
+ col_offset = ... # type: int
+
+class FunctionDef(stmt):
+ name = ... # type: identifier
+ args = ... # type: arguments
+ body = ... # type: typing.List[stmt]
+ decorator_list = ... # type: typing.List[expr]
+ returns = ... # type: Optional[expr]
+ type_comment = ... # type: Optional[str]
+
+class AsyncFunctionDef(stmt):
+ name = ... # type: identifier
+ args = ... # type: arguments
+ body = ... # type: typing.List[stmt]
+ decorator_list = ... # type: typing.List[expr]
+ returns = ... # type: Optional[expr]
+ type_comment = ... # type: Optional[str]
+
+class ClassDef(stmt):
+ name = ... # type: identifier
+ bases = ... # type: typing.List[expr]
+ keywords = ... # type: typing.List[keyword]
+ body = ... # type: typing.List[stmt]
+ decorator_list = ... # type: typing.List[expr]
+
+class Return(stmt):
+ value = ... # type: Optional[expr]
+
+class Delete(stmt):
+ targets = ... # type: typing.List[expr]
+
+class Assign(stmt):
+ targets = ... # type: typing.List[expr]
+ value = ... # type: Optional[expr]
+ type_comment = ... # type: Optional[str]
+ annotation = ... # type: Optional[expr]
+
+class AugAssign(stmt):
+ target = ... # type: expr
+ op = ... # type: operator
+ value = ... # type: expr
+
+class For(stmt):
+ target = ... # type: expr
+ iter = ... # type: expr
+ body = ... # type: typing.List[stmt]
+ orelse = ... # type: typing.List[stmt]
+ type_comment = ... # type: Optional[str]
+
+class AsyncFor(stmt):
+ target = ... # type: expr
+ iter = ... # type: expr
+ body = ... # type: typing.List[stmt]
+ orelse = ... # type: typing.List[stmt]
+
+class While(stmt):
+ test = ... # type: expr
+ body = ... # type: typing.List[stmt]
+ orelse = ... # type: typing.List[stmt]
+
+class If(stmt):
+ test = ... # type: expr
+ body = ... # type: typing.List[stmt]
+ orelse = ... # type: typing.List[stmt]
+
+class With(stmt):
+ items = ... # type: typing.List[withitem]
+ body = ... # type: typing.List[stmt]
+ type_comment = ... # type: Optional[str]
+
+class AsyncWith(stmt):
+ items = ... # type: typing.List[withitem]
+ body = ... # type: typing.List[stmt]
+
+class Raise(stmt):
+ exc = ... # type: Optional[expr]
+ cause = ... # type: Optional[expr]
+
+class Try(stmt):
+ body = ... # type: typing.List[stmt]
+ handlers = ... # type: typing.List[ExceptHandler]
+ orelse = ... # type: typing.List[stmt]
+ finalbody = ... # type: typing.List[stmt]
+
+class Assert(stmt):
+ test = ... # type: expr
+ msg = ... # type: Optional[expr]
+
+class Import(stmt):
+ names = ... # type: typing.List[alias]
+
+class ImportFrom(stmt):
+ module = ... # type: Optional[identifier]
+ names = ... # type: typing.List[alias]
+ level = ... # type: Optional[int]
+
+class Global(stmt):
+ names = ... # type: typing.List[identifier]
+
+class Nonlocal(stmt):
+ names = ... # type: typing.List[identifier]
+
+class Expr(stmt):
+ value = ... # type: expr
+
+class Pass(stmt): ...
+class Break(stmt): ...
+class Continue(stmt): ...
+
+
+class slice(AST):
+ ...
+
+_slice = slice # this lets us type the variable named 'slice' below
+
+class Slice(slice):
+ lower = ... # type: Optional[expr]
+ upper = ... # type: Optional[expr]
+ step = ... # type: Optional[expr]
+
+class ExtSlice(slice):
+ dims = ... # type: typing.List[slice]
+
+class Index(slice):
+ value = ... # type: expr
+
+
+class expr(AST):
+ lineno = ... # type: int
+ col_offset = ... # type: int
+
+class BoolOp(expr):
+ op = ... # type: boolop
+ values = ... # type: typing.List[expr]
+
+class BinOp(expr):
+ left = ... # type: expr
+ op = ... # type: operator
+ right = ... # type: expr
+
+class UnaryOp(expr):
+ op = ... # type: unaryop
+ operand = ... # type: expr
+
+class Lambda(expr):
+ args = ... # type: arguments
+ body = ... # type: expr
+
+class IfExp(expr):
+ test = ... # type: expr
+ body = ... # type: expr
+ orelse = ... # type: expr
+
+class Dict(expr):
+ keys = ... # type: typing.List[expr]
+ values = ... # type: typing.List[expr]
+
+class Set(expr):
+ elts = ... # type: typing.List[expr]
+
+class ListComp(expr):
+ elt = ... # type: expr
+ generators = ... # type: typing.List[comprehension]
+
+class SetComp(expr):
+ elt = ... # type: expr
+ generators = ... # type: typing.List[comprehension]
+
+class DictComp(expr):
+ key = ... # type: expr
+ value = ... # type: expr
+ generators = ... # type: typing.List[comprehension]
+
+class GeneratorExp(expr):
+ elt = ... # type: expr
+ generators = ... # type: typing.List[comprehension]
+
+class Await(expr):
+ value = ... # type: expr
+
+class Yield(expr):
+ value = ... # type: Optional[expr]
+
+class YieldFrom(expr):
+ value = ... # type: expr
+
+class Compare(expr):
+ left = ... # type: expr
+ ops = ... # type: typing.List[cmpop]
+ comparators = ... # type: typing.List[expr]
+
+class Call(expr):
+ func = ... # type: expr
+ args = ... # type: typing.List[expr]
+ keywords = ... # type: typing.List[keyword]
+
+class Num(expr):
+ n = ... # type: Union[int, float]
+
+class Str(expr):
+ s = ... # type: str
+
+class Bytes(expr):
+ s = ... # type: bytes
+
+class NameConstant(expr):
+ value = ... # type: Any
+
+class Ellipsis(expr): ...
+
+class Attribute(expr):
+ value = ... # type: expr
+ attr = ... # type: identifier
+ ctx = ... # type: expr_context
+
+class Subscript(expr):
+ value = ... # type: expr
+ slice = ... # type: _slice
+ ctx = ... # type: expr_context
+
+class Starred(expr):
+ value = ... # type: expr
+ ctx = ... # type: expr_context
+
+class Name(expr):
+ id = ... # type: identifier
+ ctx = ... # type: expr_context
+
+class List(expr):
+ elts = ... # type: typing.List[expr]
+ ctx = ... # type: expr_context
+
+class Tuple(expr):
+ elts = ... # type: typing.List[expr]
+ ctx = ... # type: expr_context
+
+
+class expr_context(AST):
+ ...
+
+class AugLoad(expr_context): ...
+class AugStore(expr_context): ...
+class Del(expr_context): ...
+class Load(expr_context): ...
+class Param(expr_context): ...
+class Store(expr_context): ...
+
+
+class boolop(AST):
+ ...
+
+class And(boolop): ...
+class Or(boolop): ...
+
+class operator(AST):
+ ...
+
+class Add(operator): ...
+class BitAnd(operator): ...
+class BitOr(operator): ...
+class BitXor(operator): ...
+class Div(operator): ...
+class FloorDiv(operator): ...
+class LShift(operator): ...
+class Mod(operator): ...
+class Mult(operator): ...
+class MatMult(operator): ...
+class Pow(operator): ...
+class RShift(operator): ...
+class Sub(operator): ...
+
+class unaryop(AST):
+ ...
+
+class Invert(unaryop): ...
+class Not(unaryop): ...
+class UAdd(unaryop): ...
+class USub(unaryop): ...
+
+class cmpop(AST):
+ ...
+
+class Eq(cmpop): ...
+class Gt(cmpop): ...
+class GtE(cmpop): ...
+class In(cmpop): ...
+class Is(cmpop): ...
+class IsNot(cmpop): ...
+class Lt(cmpop): ...
+class LtE(cmpop): ...
+class NotEq(cmpop): ...
+class NotIn(cmpop): ...
+
+
+class comprehension(AST):
+ target = ... # type: expr
+ iter = ... # type: expr
+ ifs = ... # type: typing.List[expr]
+
+
+class ExceptHandler(AST):
+ type = ... # type: Optional[expr]
+ name = ... # type: Optional[identifier]
+ body = ... # type: typing.List[stmt]
+ lineno = ... # type: int
+ col_offset = ... # type: int
+
+
+class arguments(AST):
+ args = ... # type: typing.List[arg]
+ vararg = ... # type: Optional[arg]
+ kwonlyargs = ... # type: typing.List[arg]
+ kw_defaults = ... # type: typing.List[expr]
+ kwarg = ... # type: Optional[arg]
+ defaults = ... # type: typing.List[expr]
+
+class arg(AST):
+ arg = ... # type: identifier
+ annotation = ... # type: Optional[expr]
+ lineno = ... # type: int
+ col_offset = ... # type: int
+
+class keyword(AST):
+ arg = ... # type: Optional[identifier]
+ value = ... # type: expr
+
+class alias(AST):
+ name = ... # type: identifier
+ asname = ... # type: Optional[identifier]
+
+class withitem(AST):
+ context_expr = ... # type: expr
+ optional_vars = ... # type: Optional[expr]
+
+
+class TypeIgnore(AST):
+ lineno = ... # type: int
diff --git a/typeshed/third_party/3/typed_ast/conversions.pyi b/typeshed/third_party/3/typed_ast/conversions.pyi
new file mode 100644
index 0000000..53fcc32
--- /dev/null
+++ b/typeshed/third_party/3/typed_ast/conversions.pyi
@@ -0,0 +1,4 @@
+from . import ast27
+from . import ast35
+
+def py2to3(ast: ast27.AST) -> ast35.AST: ...
diff --git a/typeshed/third_party/3/werkzeug/__init__.pyi b/typeshed/third_party/3/werkzeug/__init__.pyi
new file mode 100644
index 0000000..806f964
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/__init__.pyi
@@ -0,0 +1,154 @@
+# Stubs for werkzeug (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from types import ModuleType
+from typing import Any
+
+from werkzeug import _internal
+from werkzeug import datastructures
+from werkzeug import debug
+from werkzeug import exceptions
+from werkzeug import formparser
+from werkzeug import http
+from werkzeug import local
+from werkzeug import security
+from werkzeug import serving
+from werkzeug import test
+from werkzeug import testapp
+from werkzeug import urls
+from werkzeug import useragents
+from werkzeug import utils
+from werkzeug import wrappers
+from werkzeug import wsgi
+
+class module(ModuleType):
+ def __getattr__(self, name): ...
+ def __dir__(self): ...
+
+
+__version__ = ... # type: Any
+
+run_simple = serving.run_simple
+test_app = testapp.test_app
+UserAgent = useragents.UserAgent
+_easteregg = _internal._easteregg
+DebuggedApplication = debug.DebuggedApplication
+MultiDict = datastructures.MultiDict
+CombinedMultiDict = datastructures.CombinedMultiDict
+Headers = datastructures.Headers
+EnvironHeaders = datastructures.EnvironHeaders
+ImmutableList = datastructures.ImmutableList
+ImmutableDict = datastructures.ImmutableDict
+ImmutableMultiDict = datastructures.ImmutableMultiDict
+TypeConversionDict = datastructures.TypeConversionDict
+ImmutableTypeConversionDict = datastructures.ImmutableTypeConversionDict
+Accept = datastructures.Accept
+MIMEAccept = datastructures.MIMEAccept
+CharsetAccept = datastructures.CharsetAccept
+LanguageAccept = datastructures.LanguageAccept
+RequestCacheControl = datastructures.RequestCacheControl
+ResponseCacheControl = datastructures.ResponseCacheControl
+ETags = datastructures.ETags
+HeaderSet = datastructures.HeaderSet
+WWWAuthenticate = datastructures.WWWAuthenticate
+Authorization = datastructures.Authorization
+FileMultiDict = datastructures.FileMultiDict
+CallbackDict = datastructures.CallbackDict
+FileStorage = datastructures.FileStorage
+OrderedMultiDict = datastructures.OrderedMultiDict
+ImmutableOrderedMultiDict = datastructures.ImmutableOrderedMultiDict
+escape = utils.escape
+environ_property = utils.environ_property
+append_slash_redirect = utils.append_slash_redirect
+redirect = utils.redirect
+cached_property = utils.cached_property
+import_string = utils.import_string
+dump_cookie = http.dump_cookie
+parse_cookie = http.parse_cookie
+unescape = utils.unescape
+format_string = utils.format_string
+find_modules = utils.find_modules
+header_property = utils.header_property
+html = utils.html
+xhtml = utils.xhtml
+HTMLBuilder = utils.HTMLBuilder
+validate_arguments = utils.validate_arguments
+ArgumentValidationError = utils.ArgumentValidationError
+bind_arguments = utils.bind_arguments
+secure_filename = utils.secure_filename
+BaseResponse = wrappers.BaseResponse
+BaseRequest = wrappers.BaseRequest
+Request = wrappers.Request
+Response = wrappers.Response
+AcceptMixin = wrappers.AcceptMixin
+ETagRequestMixin = wrappers.ETagRequestMixin
+ETagResponseMixin = wrappers.ETagResponseMixin
+ResponseStreamMixin = wrappers.ResponseStreamMixin
+CommonResponseDescriptorsMixin = wrappers.CommonResponseDescriptorsMixin
+UserAgentMixin = wrappers.UserAgentMixin
+AuthorizationMixin = wrappers.AuthorizationMixin
+WWWAuthenticateMixin = wrappers.WWWAuthenticateMixin
+CommonRequestDescriptorsMixin = wrappers.CommonRequestDescriptorsMixin
+Local = local.Local
+LocalManager = local.LocalManager
+LocalProxy = local.LocalProxy
+LocalStack = local.LocalStack
+release_local = local.release_local
+generate_password_hash = security.generate_password_hash
+check_password_hash = security.check_password_hash
+Client = test.Client
+EnvironBuilder = test.EnvironBuilder
+create_environ = test.create_environ
+run_wsgi_app = test.run_wsgi_app
+get_current_url = wsgi.get_current_url
+get_host = wsgi.get_host
+pop_path_info = wsgi.pop_path_info
+peek_path_info = wsgi.peek_path_info
+SharedDataMiddleware = wsgi.SharedDataMiddleware
+DispatcherMiddleware = wsgi.DispatcherMiddleware
+ClosingIterator = wsgi.ClosingIterator
+FileWrapper = wsgi.FileWrapper
+make_line_iter = wsgi.make_line_iter
+LimitedStream = wsgi.LimitedStream
+responder = wsgi.responder
+wrap_file = wsgi.wrap_file
+extract_path_info = wsgi.extract_path_info
+parse_etags = http.parse_etags
+parse_date = http.parse_date
+http_date = http.http_date
+cookie_date = http.cookie_date
+parse_cache_control_header = http.parse_cache_control_header
+is_resource_modified = http.is_resource_modified
+parse_accept_header = http.parse_accept_header
+parse_set_header = http.parse_set_header
+quote_etag = http.quote_etag
+unquote_etag = http.unquote_etag
+generate_etag = http.generate_etag
+dump_header = http.dump_header
+parse_list_header = http.parse_list_header
+parse_dict_header = http.parse_dict_header
+parse_authorization_header = http.parse_authorization_header
+parse_www_authenticate_header = http.parse_www_authenticate_header
+remove_entity_headers = http.remove_entity_headers
+is_entity_header = http.is_entity_header
+remove_hop_by_hop_headers = http.remove_hop_by_hop_headers
+parse_options_header = http.parse_options_header
+dump_options_header = http.dump_options_header
+is_hop_by_hop_header = http.is_hop_by_hop_header
+unquote_header_value = http.unquote_header_value
+quote_header_value = http.quote_header_value
+HTTP_STATUS_CODES = http.HTTP_STATUS_CODES
+url_decode = urls.url_decode
+url_encode = urls.url_encode
+url_quote = urls.url_quote
+url_quote_plus = urls.url_quote_plus
+url_unquote = urls.url_unquote
+url_unquote_plus = urls.url_unquote_plus
+url_fix = urls.url_fix
+Href = urls.Href
+iri_to_uri = urls.iri_to_uri
+uri_to_iri = urls.uri_to_iri
+parse_form_data = formparser.parse_form_data
+abort = exceptions.Aborter
+Aborter = exceptions.Aborter
diff --git a/typeshed/third_party/3/werkzeug/_compat.pyi b/typeshed/third_party/3/werkzeug/_compat.pyi
new file mode 100644
index 0000000..1b0f55b
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/_compat.pyi
@@ -0,0 +1,47 @@
+# Stubs for werkzeug._compat (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from io import StringIO as BytesIO
+
+PY2 = ... # type: Any
+WIN = ... # type: Any
+unichr = ... # type: Any
+text_type = ... # type: Any
+string_types = ... # type: Any
+integer_types = ... # type: Any
+iterkeys = ... # type: Any
+itervalues = ... # type: Any
+iteritems = ... # type: Any
+iterlists = ... # type: Any
+iterlistvalues = ... # type: Any
+int_to_byte = ... # type: Any
+iter_bytes = ... # type: Any
+
+def fix_tuple_repr(obj): ...
+def implements_iterator(cls): ...
+def implements_to_string(cls): ...
+def native_string_result(func): ...
+def implements_bool(cls): ...
+
+range_type = ... # type: Any
+NativeStringIO = ... # type: Any
+
+def make_literal_wrapper(reference): ...
+def normalize_string_tuple(tup): ...
+def try_coerce_native(s): ...
+
+wsgi_get_bytes = ... # type: Any
+
+def wsgi_decoding_dance(s, charset='', errors=''): ...
+def wsgi_encoding_dance(s, charset='', errors=''): ...
+def to_bytes(x, charset=..., errors=''): ...
+def to_native(x, charset=..., errors=''): ...
+def reraise(tp, value, tb=None): ...
+
+imap = ... # type: Any
+izip = ... # type: Any
+ifilter = ... # type: Any
+
+def to_unicode(x, charset=..., errors='', allow_none_charset=False): ...
diff --git a/typeshed/third_party/3/werkzeug/_internal.pyi b/typeshed/third_party/3/werkzeug/_internal.pyi
new file mode 100644
index 0000000..d16a33d
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/_internal.pyi
@@ -0,0 +1,22 @@
+# Stubs for werkzeug._internal (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class _Missing:
+ def __reduce__(self): ...
+
+class _DictAccessorProperty:
+ read_only = ... # type: Any
+ name = ... # type: Any
+ default = ... # type: Any
+ load_func = ... # type: Any
+ dump_func = ... # type: Any
+ __doc__ = ... # type: Any
+ def __init__(self, name, default=None, load_func=None, dump_func=None, read_only=None, doc=None): ...
+ def __get__(self, obj, type=None): ...
+ def __set__(self, obj, value): ...
+ def __delete__(self, obj): ...
+
+def _easteregg(app=None): ...
diff --git a/typeshed/third_party/3/werkzeug/_reloader.pyi b/typeshed/third_party/3/werkzeug/_reloader.pyi
new file mode 100644
index 0000000..669065e
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/_reloader.pyi
@@ -0,0 +1,33 @@
+# Stubs for werkzeug._reloader (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class ReloaderLoop:
+ name = ... # type: Any
+ extra_files = ... # type: Any
+ interval = ... # type: Any
+ def __init__(self, extra_files=None, interval=1): ...
+ def run(self): ...
+ def restart_with_reloader(self): ...
+ def trigger_reload(self, filename): ...
+ def log_reload(self, filename): ...
+
+class StatReloaderLoop(ReloaderLoop):
+ name = ... # type: Any
+ def run(self): ...
+
+class WatchdogReloaderLoop(ReloaderLoop):
+ observable_paths = ... # type: Any
+ name = ... # type: Any
+ observer_class = ... # type: Any
+ event_handler = ... # type: Any
+ should_reload = ... # type: Any
+ def __init__(self, *args, **kwargs): ...
+ def trigger_reload(self, filename): ...
+ def run(self): ...
+
+reloader_loops = ... # type: Any
+
+def run_with_reloader(main_func, extra_files=None, interval=1, reloader_type=''): ...
diff --git a/typeshed/third_party/3/werkzeug/contrib/__init__.pyi b/typeshed/third_party/3/werkzeug/contrib/__init__.pyi
new file mode 100644
index 0000000..3fb4116
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/contrib/__init__.pyi
@@ -0,0 +1,3 @@
+# Stubs for werkzeug.contrib (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
diff --git a/typeshed/third_party/3/werkzeug/contrib/atom.pyi b/typeshed/third_party/3/werkzeug/contrib/atom.pyi
new file mode 100644
index 0000000..cfb535d
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/contrib/atom.pyi
@@ -0,0 +1,54 @@
+# Stubs for werkzeug.contrib.atom (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+XHTML_NAMESPACE = ... # type: Any
+
+def format_iso8601(obj): ...
+
+class AtomFeed:
+ default_generator = ... # type: Any
+ title = ... # type: Any
+ title_type = ... # type: Any
+ url = ... # type: Any
+ feed_url = ... # type: Any
+ id = ... # type: Any
+ updated = ... # type: Any
+ author = ... # type: Any
+ icon = ... # type: Any
+ logo = ... # type: Any
+ rights = ... # type: Any
+ rights_type = ... # type: Any
+ subtitle = ... # type: Any
+ subtitle_type = ... # type: Any
+ generator = ... # type: Any
+ links = ... # type: Any
+ entries = ... # type: Any
+ def __init__(self, title=None, entries=None, **kwargs): ...
+ def add(self, *args, **kwargs): ...
+ def generate(self): ...
+ def to_string(self): ...
+ def get_response(self): ...
+ def __call__(self, environ, start_response): ...
+
+class FeedEntry:
+ title = ... # type: Any
+ title_type = ... # type: Any
+ content = ... # type: Any
+ content_type = ... # type: Any
+ url = ... # type: Any
+ id = ... # type: Any
+ updated = ... # type: Any
+ summary = ... # type: Any
+ summary_type = ... # type: Any
+ author = ... # type: Any
+ published = ... # type: Any
+ rights = ... # type: Any
+ links = ... # type: Any
+ categories = ... # type: Any
+ xml_base = ... # type: Any
+ def __init__(self, title=None, content=None, feed_url=None, **kwargs): ...
+ def generate(self): ...
+ def to_string(self): ...
diff --git a/typeshed/third_party/3/werkzeug/contrib/cache.pyi b/typeshed/third_party/3/werkzeug/contrib/cache.pyi
new file mode 100644
index 0000000..7b071ea
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/contrib/cache.pyi
@@ -0,0 +1,87 @@
+# Stubs for werkzeug.contrib.cache (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class BaseCache:
+ default_timeout = ... # type: Any
+ def __init__(self, default_timeout=300): ...
+ def get(self, key): ...
+ def delete(self, key): ...
+ def get_many(self, *keys): ...
+ def get_dict(self, *keys): ...
+ def set(self, key, value, timeout=None): ...
+ def add(self, key, value, timeout=None): ...
+ def set_many(self, mapping, timeout=None): ...
+ def delete_many(self, *keys): ...
+ def has(self, key): ...
+ def clear(self): ...
+ def inc(self, key, delta=1): ...
+ def dec(self, key, delta=1): ...
+
+class NullCache(BaseCache): ...
+
+class SimpleCache(BaseCache):
+ clear = ... # type: Any
+ def __init__(self, threshold=500, default_timeout=300): ...
+ def get(self, key): ...
+ def set(self, key, value, timeout=None): ...
+ def add(self, key, value, timeout=None): ...
+ def delete(self, key): ...
+ def has(self, key): ...
+
+class MemcachedCache(BaseCache):
+ key_prefix = ... # type: Any
+ def __init__(self, servers=None, default_timeout=300, key_prefix=None): ...
+ def get(self, key): ...
+ def get_dict(self, *keys): ...
+ def add(self, key, value, timeout=None): ...
+ def set(self, key, value, timeout=None): ...
+ def get_many(self, *keys): ...
+ def set_many(self, mapping, timeout=None): ...
+ def delete(self, key): ...
+ def delete_many(self, *keys): ...
+ def has(self, key): ...
+ def clear(self): ...
+ def inc(self, key, delta=1): ...
+ def dec(self, key, delta=1): ...
+ def import_preferred_memcache_lib(self, servers): ...
+
+GAEMemcachedCache = ... # type: Any
+
+class RedisCache(BaseCache):
+ key_prefix = ... # type: Any
+ def __init__(self, host='', port=6379, password=None, db=0, default_timeout=300, key_prefix=None, **kwargs): ...
+ def dump_object(self, value): ...
+ def load_object(self, value): ...
+ def get(self, key): ...
+ def get_many(self, *keys): ...
+ def set(self, key, value, timeout=None): ...
+ def add(self, key, value, timeout=None): ...
+ def set_many(self, mapping, timeout=None): ...
+ def delete(self, key): ...
+ def delete_many(self, *keys): ...
+ def has(self, key): ...
+ def clear(self): ...
+ def inc(self, key, delta=1): ...
+ def dec(self, key, delta=1): ...
+
+class FileSystemCache(BaseCache):
+ def __init__(self, cache_dir, threshold=500, default_timeout=300, mode=384): ...
+ def clear(self): ...
+ def get(self, key): ...
+ def add(self, key, value, timeout=None): ...
+ def set(self, key, value, timeout=None): ...
+ def delete(self, key): ...
+ def has(self, key): ...
+
+class UWSGICache(BaseCache):
+ cache = ... # type: Any
+ def __init__(self, default_timeout=300, cache=''): ...
+ def get(self, key): ...
+ def delete(self, key): ...
+ def set(self, key, value, timeout=None): ...
+ def add(self, key, value, timeout=None): ...
+ def clear(self): ...
+ def has(self, key): ...
diff --git a/typeshed/third_party/3/werkzeug/contrib/fixers.pyi b/typeshed/third_party/3/werkzeug/contrib/fixers.pyi
new file mode 100644
index 0000000..d660263
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/contrib/fixers.pyi
@@ -0,0 +1,41 @@
+# Stubs for werkzeug.contrib.fixers (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class CGIRootFix:
+ app = ... # type: Any
+ app_root = ... # type: Any
+ def __init__(self, app, app_root=''): ...
+ def __call__(self, environ, start_response): ...
+
+LighttpdCGIRootFix = ... # type: Any
+
+class PathInfoFromRequestUriFix:
+ app = ... # type: Any
+ def __init__(self, app): ...
+ def __call__(self, environ, start_response): ...
+
+class ProxyFix:
+ app = ... # type: Any
+ num_proxies = ... # type: Any
+ def __init__(self, app, num_proxies=1): ...
+ def get_remote_addr(self, forwarded_for): ...
+ def __call__(self, environ, start_response): ...
+
+class HeaderRewriterFix:
+ app = ... # type: Any
+ remove_headers = ... # type: Any
+ add_headers = ... # type: Any
+ def __init__(self, app, remove_headers=None, add_headers=None): ...
+ def __call__(self, environ, start_response): ...
+
+class InternetExplorerFix:
+ app = ... # type: Any
+ fix_vary = ... # type: Any
+ fix_attach = ... # type: Any
+ def __init__(self, app, fix_vary=True, fix_attach=True): ...
+ def fix_headers(self, environ, headers, status=None): ...
+ def run_fixed(self, environ, start_response): ...
+ def __call__(self, environ, start_response): ...
diff --git a/typeshed/third_party/3/werkzeug/contrib/iterio.pyi b/typeshed/third_party/3/werkzeug/contrib/iterio.pyi
new file mode 100644
index 0000000..b65323a
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/contrib/iterio.pyi
@@ -0,0 +1,42 @@
+# Stubs for werkzeug.contrib.iterio (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+greenlet = ... # type: Any
+
+class IterIO:
+ def __new__(cls, obj, sentinel=''): ...
+ def __iter__(self): ...
+ def tell(self): ...
+ def isatty(self): ...
+ def seek(self, pos, mode=0): ...
+ def truncate(self, size=None): ...
+ def write(self, s): ...
+ def writelines(self, list): ...
+ def read(self, n=-1): ...
+ def readlines(self, sizehint=0): ...
+ def readline(self, length=None): ...
+ def flush(self): ...
+ def __next__(self): ...
+
+class IterI(IterIO):
+ def __new__(cls, func, sentinel=''): ...
+ closed = ... # type: Any
+ def close(self): ...
+ def write(self, s): ...
+ def writelines(self, list): ...
+ def flush(self): ...
+
+class IterO(IterIO):
+ sentinel = ... # type: Any
+ closed = ... # type: Any
+ pos = ... # type: Any
+ def __new__(cls, gen, sentinel=''): ...
+ def __iter__(self): ...
+ def close(self): ...
+ def seek(self, pos, mode=0): ...
+ def read(self, n=-1): ...
+ def readline(self, length=None): ...
+ def readlines(self, sizehint=0): ...
diff --git a/typeshed/third_party/3/werkzeug/contrib/jsrouting.pyi b/typeshed/third_party/3/werkzeug/contrib/jsrouting.pyi
new file mode 100644
index 0000000..9ba5cff
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/contrib/jsrouting.pyi
@@ -0,0 +1,14 @@
+# Stubs for werkzeug.contrib.jsrouting (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+def dumps(*args): ...
+def render_template(name_parts, rules, converters): ...
+def generate_map(map, name=''): ...
+def generate_adapter(adapter, name='', map_name=''): ...
+def js_to_url_function(converter): ...
+def NumberConverter_js_to_url(conv): ...
+
+js_to_url_functions = ... # type: Any
diff --git a/typeshed/third_party/3/werkzeug/contrib/limiter.pyi b/typeshed/third_party/3/werkzeug/contrib/limiter.pyi
new file mode 100644
index 0000000..d27776f
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/contrib/limiter.pyi
@@ -0,0 +1,11 @@
+# Stubs for werkzeug.contrib.limiter (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class StreamLimitMiddleware:
+ app = ... # type: Any
+ maximum_size = ... # type: Any
+ def __init__(self, app, maximum_size=...): ...
+ def __call__(self, environ, start_response): ...
diff --git a/typeshed/third_party/3/werkzeug/contrib/lint.pyi b/typeshed/third_party/3/werkzeug/contrib/lint.pyi
new file mode 100644
index 0000000..ccaecf5
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/contrib/lint.pyi
@@ -0,0 +1,47 @@
+# Stubs for werkzeug.contrib.lint (Python 3)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class WSGIWarning(Warning): ...
+class HTTPWarning(Warning): ...
+
+def check_string(context, obj, stacklevel=3): ...
+
+class InputStream:
+ def __init__(self, stream): ...
+ def read(self, *args): ...
+ def readline(self, *args): ...
+ def __iter__(self): ...
+ def close(self): ...
+
+class ErrorStream:
+ def __init__(self, stream): ...
+ def write(self, s): ...
+ def flush(self): ...
+ def writelines(self, seq): ...
+ def close(self): ...
+
+class GuardedWrite:
+ def __init__(self, write, chunks): ...
+ def __call__(self, s): ...
+
+class GuardedIterator:
+ closed = ... # type: Any
+ headers_set = ... # type: Any
+ chunks = ... # type: Any
+ def __init__(self, iterator, headers_set, chunks): ...
+ def __iter__(self): ...
+ def next(self): ...
+ def close(self): ...
+ def __del__(self): ...
+
+class LintMiddleware:
+ app = ... # type: Any
+ def __init__(self, app): ...
+ def check_environ(self, environ): ...
+ def check_start_response(self, status, headers, exc_info): ...
+ def check_headers(self, headers): ...
+ def check_iterator(self, app_iter): ...
+ def __call__(self, *args, **kwargs): ...
diff --git a/typeshed/third_party/3/werkzeug/contrib/profiler.pyi b/typeshed/third_party/3/werkzeug/contrib/profiler.pyi
new file mode 100644
index 0000000..d3daf6d
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/contrib/profiler.pyi
@@ -0,0 +1,18 @@
+# Stubs for werkzeug.contrib.profiler (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+available = ... # type: Any
+
+class MergeStream:
+ streams = ... # type: Any
+ def __init__(self, *streams): ...
+ def write(self, data): ...
+
+class ProfilerMiddleware:
+ def __init__(self, app, stream=None, sort_by=..., restrictions=..., profile_dir=None): ...
+ def __call__(self, environ, start_response): ...
+
+def make_action(app_factory, hostname='', port=5000, threaded=False, processes=1, stream=None, sort_by=..., restrictions=...): ...
diff --git a/typeshed/third_party/3/werkzeug/contrib/securecookie.pyi b/typeshed/third_party/3/werkzeug/contrib/securecookie.pyi
new file mode 100644
index 0000000..36ed6b7
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/contrib/securecookie.pyi
@@ -0,0 +1,30 @@
+# Stubs for werkzeug.contrib.securecookie (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from hmac import new as hmac
+from hashlib import sha1 as _default_hash
+from werkzeug.contrib.sessions import ModificationTrackingDict
+
+class UnquoteError(Exception): ...
+
+class SecureCookie(ModificationTrackingDict):
+ hash_method = ... # type: Any
+ serialization_method = ... # type: Any
+ quote_base64 = ... # type: Any
+ secret_key = ... # type: Any
+ new = ... # type: Any
+ def __init__(self, data=None, secret_key=None, new=True): ...
+ @property
+ def should_save(self): ...
+ @classmethod
+ def quote(cls, value): ...
+ @classmethod
+ def unquote(cls, value): ...
+ def serialize(self, expires=None): ...
+ @classmethod
+ def unserialize(cls, string, secret_key): ...
+ @classmethod
+ def load_cookie(cls, request, key='', secret_key=None): ...
+ def save_cookie(self, response, key='', expires=None, session_expires=None, max_age=None, path='', domain=None, secure=None, httponly=False, force=False): ...
diff --git a/typeshed/third_party/3/werkzeug/contrib/sessions.pyi b/typeshed/third_party/3/werkzeug/contrib/sessions.pyi
new file mode 100644
index 0000000..69cb4f5
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/contrib/sessions.pyi
@@ -0,0 +1,58 @@
+# Stubs for werkzeug.contrib.sessions (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from werkzeug.datastructures import CallbackDict
+
+def generate_key(salt=None): ...
+
+class ModificationTrackingDict(CallbackDict):
+ modified = ... # type: Any
+ def __init__(self, *args, **kwargs): ...
+ def copy(self): ...
+ def __copy__(self): ...
+
+class Session(ModificationTrackingDict):
+ sid = ... # type: Any
+ new = ... # type: Any
+ def __init__(self, data, sid, new=False): ...
+ @property
+ def should_save(self): ...
+
+class SessionStore:
+ session_class = ... # type: Any
+ def __init__(self, session_class=None): ...
+ def is_valid_key(self, key): ...
+ def generate_key(self, salt=None): ...
+ def new(self): ...
+ def save(self, session): ...
+ def save_if_modified(self, session): ...
+ def delete(self, session): ...
+ def get(self, sid): ...
+
+class FilesystemSessionStore(SessionStore):
+ path = ... # type: Any
+ filename_template = ... # type: Any
+ renew_missing = ... # type: Any
+ mode = ... # type: Any
+ def __init__(self, path=None, filename_template='', session_class=None, renew_missing=False, mode=420): ...
+ def get_session_filename(self, sid): ...
+ def save(self, session): ...
+ def delete(self, session): ...
+ def get(self, sid): ...
+ def list(self): ...
+
+class SessionMiddleware:
+ app = ... # type: Any
+ store = ... # type: Any
+ cookie_name = ... # type: Any
+ cookie_age = ... # type: Any
+ cookie_expires = ... # type: Any
+ cookie_path = ... # type: Any
+ cookie_domain = ... # type: Any
+ cookie_secure = ... # type: Any
+ cookie_httponly = ... # type: Any
+ environ_key = ... # type: Any
+ def __init__(self, app, store, cookie_name='', cookie_age=None, cookie_expires=None, cookie_path='', cookie_domain=None, cookie_secure=None, cookie_httponly=False, environ_key=''): ...
+ def __call__(self, environ, start_response): ...
diff --git a/typeshed/third_party/3/werkzeug/contrib/testtools.pyi b/typeshed/third_party/3/werkzeug/contrib/testtools.pyi
new file mode 100644
index 0000000..3c21524
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/contrib/testtools.pyi
@@ -0,0 +1,13 @@
+# Stubs for werkzeug.contrib.testtools (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from werkzeug.wrappers import Response
+
+class ContentAccessors:
+ def xml(self): ...
+ def lxml(self): ...
+ def json(self): ...
+
+class TestResponse(Response, ContentAccessors): ...
diff --git a/typeshed/third_party/3/werkzeug/contrib/wrappers.pyi b/typeshed/third_party/3/werkzeug/contrib/wrappers.pyi
new file mode 100644
index 0000000..2e43f6a
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/contrib/wrappers.pyi
@@ -0,0 +1,31 @@
+# Stubs for werkzeug.contrib.wrappers (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+def is_known_charset(charset): ...
+
+class JSONRequestMixin:
+ def json(self): ...
+
+class ProtobufRequestMixin:
+ protobuf_check_initialization = ... # type: Any
+ def parse_protobuf(self, proto_type): ...
+
+class RoutingArgsRequestMixin:
+ routing_args = ... # type: Any
+ routing_vars = ... # type: Any
+
+class ReverseSlashBehaviorRequestMixin:
+ def path(self): ...
+ def script_root(self): ...
+
+class DynamicCharsetRequestMixin:
+ default_charset = ... # type: Any
+ def unknown_charset(self, charset): ...
+ def charset(self): ...
+
+class DynamicCharsetResponseMixin:
+ default_charset = ... # type: Any
+ charset = ... # type: Any
diff --git a/typeshed/third_party/3/werkzeug/datastructures.pyi b/typeshed/third_party/3/werkzeug/datastructures.pyi
new file mode 100644
index 0000000..0204b34
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/datastructures.pyi
@@ -0,0 +1,389 @@
+# Stubs for werkzeug.datastructures (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from collections import Container, Iterable, Mapping, MutableSet
+
+def is_immutable(self): ...
+def iter_multi_items(mapping): ...
+def native_itermethods(names): ...
+
+class ImmutableListMixin:
+ def __hash__(self): ...
+ def __reduce_ex__(self, protocol): ...
+ def __delitem__(self, key): ...
+ def __delslice__(self, i, j): ...
+ def __iadd__(self, other): ...
+ __imul__ = ... # type: Any
+ def __setitem__(self, key, value): ...
+ def __setslice__(self, i, j, value): ...
+ def append(self, item): ...
+ remove = ... # type: Any
+ def extend(self, iterable): ...
+ def insert(self, pos, value): ...
+ def pop(self, index=-1): ...
+ def reverse(self): ...
+ def sort(self, cmp=None, key=None, reverse=None): ...
+
+class ImmutableList(ImmutableListMixin, list): ...
+
+class ImmutableDictMixin:
+ @classmethod
+ def fromkeys(cls, *args, **kwargs): ...
+ def __reduce_ex__(self, protocol): ...
+ def __hash__(self): ...
+ def setdefault(self, key, default=None): ...
+ def update(self, *args, **kwargs): ...
+ def pop(self, key, default=None): ...
+ def popitem(self): ...
+ def __setitem__(self, key, value): ...
+ def __delitem__(self, key): ...
+ def clear(self): ...
+
+class ImmutableMultiDictMixin(ImmutableDictMixin):
+ def __reduce_ex__(self, protocol): ...
+ def add(self, key, value): ...
+ def popitemlist(self): ...
+ def poplist(self, key): ...
+ def setlist(self, key, new_list): ...
+ def setlistdefault(self, key, default_list=None): ...
+
+class UpdateDictMixin:
+ on_update = ... # type: Any
+ def calls_update(name): ...
+ def setdefault(self, key, default=None): ...
+ def pop(self, key, default=...): ...
+ __setitem__ = ... # type: Any
+ __delitem__ = ... # type: Any
+ clear = ... # type: Any
+ popitem = ... # type: Any
+ update = ... # type: Any
+
+class TypeConversionDict(dict):
+ def get(self, key, default=None, type=None): ...
+
+class ImmutableTypeConversionDict(ImmutableDictMixin, TypeConversionDict):
+ def copy(self): ...
+ def __copy__(self): ...
+
+class ViewItems:
+ def __init__(self, multi_dict, method, repr_name, *a, **kw): ...
+ def __iter__(self): ...
+
+class MultiDict(TypeConversionDict):
+ def __init__(self, mapping=None): ...
+ def __getitem__(self, key): ...
+ def __setitem__(self, key, value): ...
+ def add(self, key, value): ...
+ def getlist(self, key, type=None): ...
+ def setlist(self, key, new_list): ...
+ def setdefault(self, key, default=None): ...
+ def setlistdefault(self, key, default_list=None): ...
+ def items(self, multi=False): ...
+ def lists(self): ...
+ def keys(self): ...
+ __iter__ = ... # type: Any
+ def values(self): ...
+ def listvalues(self): ...
+ def copy(self): ...
+ def deepcopy(self, memo=None): ...
+ def to_dict(self, flat=True): ...
+ def update(self, other_dict): ...
+ def pop(self, key, default=...): ...
+ def popitem(self): ...
+ def poplist(self, key): ...
+ def popitemlist(self): ...
+ def __copy__(self): ...
+ def __deepcopy__(self, memo): ...
+
+class _omd_bucket:
+ prev = ... # type: Any
+ key = ... # type: Any
+ value = ... # type: Any
+ next = ... # type: Any
+ def __init__(self, omd, key, value): ...
+ def unlink(self, omd): ...
+
+class OrderedMultiDict(MultiDict):
+ def __init__(self, mapping=None): ...
+ def __eq__(self, other): ...
+ def __ne__(self, other): ...
+ def __reduce_ex__(self, protocol): ...
+ def __getitem__(self, key): ...
+ def __setitem__(self, key, value): ...
+ def __delitem__(self, key): ...
+ def keys(self): ...
+ __iter__ = ... # type: Any
+ def values(self): ...
+ def items(self, multi=False): ...
+ def lists(self): ...
+ def listvalues(self): ...
+ def add(self, key, value): ...
+ def getlist(self, key, type=None): ...
+ def setlist(self, key, new_list): ...
+ def setlistdefault(self, key, default_list=None): ...
+ def update(self, mapping): ...
+ def poplist(self, key): ...
+ def pop(self, key, default=...): ...
+ def popitem(self): ...
+ def popitemlist(self): ...
+
+class Headers(Mapping):
+ def __init__(self, defaults=None): ...
+ def __getitem__(self, key, _get_mode=False): ...
+ def __eq__(self, other): ...
+ def __ne__(self, other): ...
+ def get(self, key, default=None, type=None, as_bytes=False): ...
+ def getlist(self, key, type=None, as_bytes=False): ...
+ def get_all(self, name): ...
+ def items(self, lower=False): ...
+ def keys(self, lower=False): ...
+ def values(self): ...
+ def extend(self, iterable): ...
+ def __delitem__(self, key): ...
+ def remove(self, key): ...
+ def pop(self, **kwargs): ...
+ def popitem(self): ...
+ def __contains__(self, key): ...
+ has_key = ... # type: Any
+ def __iter__(self): ...
+ def __len__(self): ...
+ def add(self, _key, _value, **kw): ...
+ def add_header(self, _key, _value, **_kw): ...
+ def clear(self): ...
+ def set(self, _key, _value, **kw): ...
+ def setdefault(self, key, value): ...
+ def __setitem__(self, key, value): ...
+ def to_list(self, charset=''): ...
+ def to_wsgi_list(self): ...
+ def copy(self): ...
+ def __copy__(self): ...
+
+class ImmutableHeadersMixin:
+ def __delitem__(self, key): ...
+ def __setitem__(self, key, value): ...
+ set = ... # type: Any
+ def add(self, *args, **kwargs): ...
+ remove = ... # type: Any
+ add_header = ... # type: Any
+ def extend(self, iterable): ...
+ def insert(self, pos, value): ...
+ def pop(self, **kwargs): ...
+ def popitem(self): ...
+ def setdefault(self, key, default): ...
+
+class EnvironHeaders(ImmutableHeadersMixin, Headers):
+ environ = ... # type: Any
+ def __init__(self, environ): ...
+ def __eq__(self, other): ...
+ def __getitem__(self, key, _get_mode=False): ...
+ def __len__(self): ...
+ def __iter__(self): ...
+ def copy(self): ...
+
+class CombinedMultiDict(ImmutableMultiDictMixin, MultiDict):
+ def __reduce_ex__(self, protocol): ...
+ dicts = ... # type: Any
+ def __init__(self, dicts=None): ...
+ @classmethod
+ def fromkeys(cls): ...
+ def __getitem__(self, key): ...
+ def get(self, key, default=None, type=None): ...
+ def getlist(self, key, type=None): ...
+ def keys(self): ...
+ __iter__ = ... # type: Any
+ def items(self, multi=False): ...
+ def values(self): ...
+ def lists(self): ...
+ def listvalues(self): ...
+ def copy(self): ...
+ def to_dict(self, flat=True): ...
+ def __len__(self): ...
+ def __contains__(self, key): ...
+ has_key = ... # type: Any
+
+class FileMultiDict(MultiDict):
+ def add_file(self, name, file, filename=None, content_type=None): ...
+
+class ImmutableDict(ImmutableDictMixin, dict):
+ def copy(self): ...
+ def __copy__(self): ...
+
+class ImmutableMultiDict(ImmutableMultiDictMixin, MultiDict):
+ def copy(self): ...
+ def __copy__(self): ...
+
+class ImmutableOrderedMultiDict(ImmutableMultiDictMixin, OrderedMultiDict):
+ def copy(self): ...
+ def __copy__(self): ...
+
+class Accept(ImmutableList):
+ provided = ... # type: Any
+ def __init__(self, values=...): ...
+ def __getitem__(self, key): ...
+ def quality(self, key): ...
+ def __contains__(self, value): ...
+ def index(self, key): ...
+ def find(self, key): ...
+ def values(self): ...
+ def to_header(self): ...
+ def best_match(self, matches, default=None): ...
+ @property
+ def best(self): ...
+
+class MIMEAccept(Accept):
+ @property
+ def accept_html(self): ...
+ @property
+ def accept_xhtml(self): ...
+ @property
+ def accept_json(self): ...
+
+class LanguageAccept(Accept): ...
+class CharsetAccept(Accept): ...
+
+def cache_property(key, empty, type): ...
+
+class _CacheControl(UpdateDictMixin, dict):
+ no_cache = ... # type: Any
+ no_store = ... # type: Any
+ max_age = ... # type: Any
+ no_transform = ... # type: Any
+ on_update = ... # type: Any
+ provided = ... # type: Any
+ def __init__(self, values=..., on_update=None): ...
+ def to_header(self): ...
+
+class RequestCacheControl(ImmutableDictMixin, _CacheControl):
+ max_stale = ... # type: Any
+ min_fresh = ... # type: Any
+ no_transform = ... # type: Any
+ only_if_cached = ... # type: Any
+
+class ResponseCacheControl(_CacheControl):
+ public = ... # type: Any
+ private = ... # type: Any
+ must_revalidate = ... # type: Any
+ proxy_revalidate = ... # type: Any
+ s_maxage = ... # type: Any
+
+class CallbackDict(UpdateDictMixin, dict):
+ on_update = ... # type: Any
+ def __init__(self, initial=None, on_update=None): ...
+
+class HeaderSet(MutableSet):
+ on_update = ... # type: Any
+ def __init__(self, headers=None, on_update=None): ...
+ def add(self, header): ...
+ def remove(self, header): ...
+ def update(self, iterable): ...
+ def discard(self, header): ...
+ def find(self, header): ...
+ def index(self, header): ...
+ def clear(self): ...
+ def as_set(self, preserve_casing=False): ...
+ def to_header(self): ...
+ def __getitem__(self, idx): ...
+ def __delitem__(self, idx): ...
+ def __setitem__(self, idx, value): ...
+ def __contains__(self, header): ...
+ def __len__(self): ...
+ def __iter__(self): ...
+ def __nonzero__(self): ...
+
+class ETags(Container, Iterable):
+ star_tag = ... # type: Any
+ def __init__(self, strong_etags=None, weak_etags=None, star_tag=False): ...
+ def as_set(self, include_weak=False): ...
+ def is_weak(self, etag): ...
+ def contains_weak(self, etag): ...
+ def contains(self, etag): ...
+ def contains_raw(self, etag): ...
+ def to_header(self): ...
+ def __call__(self, etag=None, data=None, include_weak=False): ...
+ def __bool__(self): ...
+ __nonzero__ = ... # type: Any
+ def __iter__(self): ...
+ def __contains__(self, etag): ...
+
+class IfRange:
+ etag = ... # type: Any
+ date = ... # type: Any
+ def __init__(self, etag=None, date=None): ...
+ def to_header(self): ...
+
+class Range:
+ units = ... # type: Any
+ ranges = ... # type: Any
+ def __init__(self, units, ranges): ...
+ def range_for_length(self, length): ...
+ def make_content_range(self, length): ...
+ def to_header(self): ...
+ def to_content_range_header(self, length): ...
+
+class ContentRange:
+ on_update = ... # type: Any
+ def __init__(self, units, start, stop, length=None, on_update=None): ...
+ units = ... # type: Any
+ start = ... # type: Any
+ stop = ... # type: Any
+ length = ... # type: Any
+ def set(self, start, stop, length=None, units=''): ...
+ def unset(self): ...
+ def to_header(self): ...
+ def __nonzero__(self): ...
+ __bool__ = ... # type: Any
+
+class Authorization(ImmutableDictMixin, dict):
+ type = ... # type: Any
+ def __init__(self, auth_type, data=None): ...
+ username = ... # type: Any
+ password = ... # type: Any
+ realm = ... # type: Any
+ nonce = ... # type: Any
+ uri = ... # type: Any
+ nc = ... # type: Any
+ cnonce = ... # type: Any
+ response = ... # type: Any
+ opaque = ... # type: Any
+ @property
+ def qop(self): ...
+
+class WWWAuthenticate(UpdateDictMixin, dict):
+ on_update = ... # type: Any
+ def __init__(self, auth_type=None, values=None, on_update=None): ...
+ def set_basic(self, realm=''): ...
+ def set_digest(self, realm, nonce, qop=..., opaque=None, algorithm=None, stale=False): ...
+ def to_header(self): ...
+ @staticmethod
+ def auth_property(name, doc=None): ...
+ type = ... # type: Any
+ realm = ... # type: Any
+ domain = ... # type: Any
+ nonce = ... # type: Any
+ opaque = ... # type: Any
+ algorithm = ... # type: Any
+ qop = ... # type: Any
+ stale = ... # type: Any
+
+class FileStorage:
+ name = ... # type: Any
+ stream = ... # type: Any
+ filename = ... # type: Any
+ headers = ... # type: Any
+ def __init__(self, stream=None, filename=None, name=None, content_type=None, content_length=None, headers=None): ...
+ @property
+ def content_type(self): ...
+ @property
+ def content_length(self): ...
+ @property
+ def mimetype(self): ...
+ @property
+ def mimetype_params(self): ...
+ def save(self, dst, buffer_size=16384): ...
+ def close(self): ...
+ def __nonzero__(self): ...
+ __bool__ = ... # type: Any
+ def __getattr__(self, name): ...
+ def __iter__(self): ...
diff --git a/typeshed/third_party/3/werkzeug/debug/__init__.pyi b/typeshed/third_party/3/werkzeug/debug/__init__.pyi
new file mode 100644
index 0000000..e02bc3c
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/debug/__init__.pyi
@@ -0,0 +1,43 @@
+# Stubs for werkzeug.debug (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from werkzeug.wrappers import BaseRequest as Request, BaseResponse as Response
+
+PIN_TIME = ... # type: Any
+
+def hash_pin(pin): ...
+def get_machine_id(): ...
+
+class _ConsoleFrame:
+ console = ... # type: Any
+ id = ... # type: Any
+ def __init__(self, namespace): ...
+
+def get_pin_and_cookie_name(app): ...
+
+class DebuggedApplication:
+ app = ... # type: Any
+ evalex = ... # type: Any
+ frames = ... # type: Any
+ tracebacks = ... # type: Any
+ request_key = ... # type: Any
+ console_path = ... # type: Any
+ console_init_func = ... # type: Any
+ show_hidden_frames = ... # type: Any
+ secret = ... # type: Any
+ pin_logging = ... # type: Any
+ pin = ... # type: Any
+ def __init__(self, app, evalex=False, request_key='', console_path='', console_init_func=None, show_hidden_frames=False, lodgeit_url=None, pin_security=True, pin_logging=True): ...
+ @property
+ def pin_cookie_name(self): ...
+ def debug_application(self, environ, start_response): ...
+ def execute_command(self, request, command, frame): ...
+ def display_console(self, request): ...
+ def paste_traceback(self, request, traceback): ...
+ def get_resource(self, request, filename): ...
+ def check_pin_trust(self, environ): ...
+ def pin_auth(self, request): ...
+ def log_pin_request(self): ...
+ def __call__(self, environ, start_response): ...
diff --git a/typeshed/third_party/3/werkzeug/debug/console.pyi b/typeshed/third_party/3/werkzeug/debug/console.pyi
new file mode 100644
index 0000000..9fdf0b5
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/debug/console.pyi
@@ -0,0 +1,48 @@
+# Stubs for werkzeug.debug.console (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+import code
+
+class HTMLStringO:
+ def __init__(self): ...
+ def isatty(self): ...
+ def close(self): ...
+ def flush(self): ...
+ def seek(self, n, mode=0): ...
+ def readline(self): ...
+ def reset(self): ...
+ def write(self, x): ...
+ def writelines(self, x): ...
+
+class ThreadedStream:
+ @staticmethod
+ def push(): ...
+ @staticmethod
+ def fetch(): ...
+ @staticmethod
+ def displayhook(obj): ...
+ def __setattr__(self, name, value): ...
+ def __dir__(self): ...
+ def __getattribute__(self, name): ...
+
+class _ConsoleLoader:
+ def __init__(self): ...
+ def register(self, code, source): ...
+ def get_source_by_code(self, code): ...
+
+class _InteractiveConsole(code.InteractiveInterpreter):
+ globals = ... # type: Any
+ more = ... # type: Any
+ buffer = ... # type: Any
+ def __init__(self, globals, locals): ...
+ def runsource(self, source): ...
+ def runcode(self, code): ...
+ def showtraceback(self): ...
+ def showsyntaxerror(self, filename=None): ...
+ def write(self, data): ...
+
+class Console:
+ def __init__(self, globals=None, locals=None): ...
+ def eval(self, code): ...
diff --git a/typeshed/third_party/3/werkzeug/debug/repr.pyi b/typeshed/third_party/3/werkzeug/debug/repr.pyi
new file mode 100644
index 0000000..063c421
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/debug/repr.pyi
@@ -0,0 +1,37 @@
+# Stubs for werkzeug.debug.repr (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+deque = ... # type: Any
+missing = ... # type: Any
+RegexType = ... # type: Any
+HELP_HTML = ... # type: Any
+OBJECT_DUMP_HTML = ... # type: Any
+
+def debug_repr(obj): ...
+def dump(obj=...): ...
+
+class _Helper:
+ def __call__(self, topic=None): ...
+
+helper = ... # type: Any
+
+class DebugReprGenerator:
+ def __init__(self): ...
+ list_repr = ... # type: Any
+ tuple_repr = ... # type: Any
+ set_repr = ... # type: Any
+ frozenset_repr = ... # type: Any
+ deque_repr = ... # type: Any
+ def regex_repr(self, obj): ...
+ def string_repr(self, obj, limit=70): ...
+ def dict_repr(self, d, recursive, limit=5): ...
+ def object_repr(self, obj): ...
+ def dispatch_repr(self, obj, recursive): ...
+ def fallback_repr(self): ...
+ def repr(self, obj): ...
+ def dump_object(self, obj): ...
+ def dump_locals(self, d): ...
+ def render_object_dump(self, items, title, repr=None): ...
diff --git a/typeshed/third_party/3/werkzeug/debug/tbtools.pyi b/typeshed/third_party/3/werkzeug/debug/tbtools.pyi
new file mode 100644
index 0000000..1107c62
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/debug/tbtools.pyi
@@ -0,0 +1,67 @@
+# Stubs for werkzeug.debug.tbtools (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+UTF8_COOKIE = ... # type: Any
+system_exceptions = ... # type: Any
+HEADER = ... # type: Any
+FOOTER = ... # type: Any
+PAGE_HTML = ... # type: Any
+CONSOLE_HTML = ... # type: Any
+SUMMARY_HTML = ... # type: Any
+FRAME_HTML = ... # type: Any
+SOURCE_LINE_HTML = ... # type: Any
+
+def render_console_html(secret, evalex_trusted=True): ...
+def get_current_traceback(ignore_system_exceptions=False, show_hidden_frames=False, skip=0): ...
+
+class Line:
+ lineno = ... # type: Any
+ code = ... # type: Any
+ in_frame = ... # type: Any
+ current = ... # type: Any
+ def __init__(self, lineno, code): ...
+ def classes(self): ...
+ def render(self): ...
+
+class Traceback:
+ exc_type = ... # type: Any
+ exc_value = ... # type: Any
+ exception_type = ... # type: Any
+ frames = ... # type: Any
+ def __init__(self, exc_type, exc_value, tb): ...
+ def filter_hidden_frames(self): ...
+ def is_syntax_error(self): ...
+ def exception(self): ...
+ def log(self, logfile=None): ...
+ def paste(self): ...
+ def render_summary(self, include_title=True): ...
+ def render_full(self, evalex=False, secret=None, evalex_trusted=True): ...
+ def generate_plaintext_traceback(self): ...
+ def plaintext(self): ...
+ id = ... # type: Any
+
+class Frame:
+ lineno = ... # type: Any
+ function_name = ... # type: Any
+ locals = ... # type: Any
+ globals = ... # type: Any
+ filename = ... # type: Any
+ module = ... # type: Any
+ loader = ... # type: Any
+ code = ... # type: Any
+ hide = ... # type: Any
+ info = ... # type: Any
+ def __init__(self, exc_type, exc_value, tb): ...
+ def render(self): ...
+ def render_line_context(self): ...
+ def get_annotated_lines(self): ...
+ def eval(self, code, mode=''): ...
+ def sourcelines(self): ...
+ def get_context_lines(self, context=5): ...
+ @property
+ def current_line(self): ...
+ def console(self): ...
+ id = ... # type: Any
diff --git a/typeshed/third_party/3/werkzeug/exceptions.pyi b/typeshed/third_party/3/werkzeug/exceptions.pyi
new file mode 100644
index 0000000..7e71597
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/exceptions.pyi
@@ -0,0 +1,152 @@
+# Stubs for werkzeug.exceptions (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class HTTPException(Exception):
+ code = ... # type: Any
+ description = ... # type: Any
+ response = ... # type: Any
+ def __init__(self, description=None, response=None): ...
+ @classmethod
+ def wrap(cls, exception, name=None): ...
+ @property
+ def name(self): ...
+ def get_description(self, environ=None): ...
+ def get_body(self, environ=None): ...
+ def get_headers(self, environ=None): ...
+ def get_response(self, environ=None): ...
+ def __call__(self, environ, start_response): ...
+
+class BadRequest(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class ClientDisconnected(BadRequest): ...
+class SecurityError(BadRequest): ...
+class BadHost(BadRequest): ...
+
+class Unauthorized(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class Forbidden(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class NotFound(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class MethodNotAllowed(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+ valid_methods = ... # type: Any
+ def __init__(self, valid_methods=None, description=None): ...
+ def get_headers(self, environ): ...
+
+class NotAcceptable(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class RequestTimeout(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class Conflict(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class Gone(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class LengthRequired(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class PreconditionFailed(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class RequestEntityTooLarge(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class RequestURITooLarge(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class UnsupportedMediaType(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class RequestedRangeNotSatisfiable(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+ length = ... # type: Any
+ units = ... # type: Any
+ def __init__(self, length=None, units='', description=None): ...
+ def get_headers(self, environ): ...
+
+class ExpectationFailed(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class ImATeapot(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class UnprocessableEntity(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class Locked(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class PreconditionRequired(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class TooManyRequests(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class RequestHeaderFieldsTooLarge(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class UnavailableForLegalReasons(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class InternalServerError(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class NotImplemented(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class BadGateway(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class ServiceUnavailable(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class GatewayTimeout(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class HTTPVersionNotSupported(HTTPException):
+ code = ... # type: Any
+ description = ... # type: Any
+
+class Aborter:
+ mapping = ... # type: Any
+ def __init__(self, mapping=None, extra=None): ...
+ def __call__(self, code, *args, **kwargs): ...
diff --git a/typeshed/third_party/3/werkzeug/filesystem.pyi b/typeshed/third_party/3/werkzeug/filesystem.pyi
new file mode 100644
index 0000000..5ebc566
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/filesystem.pyi
@@ -0,0 +1,11 @@
+# Stubs for werkzeug.filesystem (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+has_likely_buggy_unicode_filesystem = ... # type: Any
+
+class BrokenFilesystemWarning(RuntimeWarning, UnicodeWarning): ...
+
+def get_filesystem_encoding(): ...
diff --git a/typeshed/third_party/3/werkzeug/formparser.pyi b/typeshed/third_party/3/werkzeug/formparser.pyi
new file mode 100644
index 0000000..1b63dca
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/formparser.pyi
@@ -0,0 +1,44 @@
+# Stubs for werkzeug.formparser (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+def default_stream_factory(total_content_length, filename, content_type, content_length=None): ...
+def parse_form_data(environ, stream_factory=None, charset='', errors='', max_form_memory_size=None, max_content_length=None, cls=None, silent=True): ...
+def exhaust_stream(f): ...
+
+class FormDataParser:
+ stream_factory = ... # type: Any
+ charset = ... # type: Any
+ errors = ... # type: Any
+ max_form_memory_size = ... # type: Any
+ max_content_length = ... # type: Any
+ cls = ... # type: Any
+ silent = ... # type: Any
+ def __init__(self, stream_factory=None, charset='', errors='', max_form_memory_size=None, max_content_length=None, cls=None, silent=True): ...
+ def get_parse_func(self, mimetype, options): ...
+ def parse_from_environ(self, environ): ...
+ def parse(self, stream, mimetype, content_length, options=None): ...
+ parse_functions = ... # type: Any
+
+def is_valid_multipart_boundary(boundary): ...
+def parse_multipart_headers(iterable): ...
+
+class MultiPartParser:
+ charset = ... # type: Any
+ errors = ... # type: Any
+ max_form_memory_size = ... # type: Any
+ stream_factory = ... # type: Any
+ cls = ... # type: Any
+ buffer_size = ... # type: Any
+ def __init__(self, stream_factory=None, charset='', errors='', max_form_memory_size=None, cls=None, buffer_size=...): ...
+ def fail(self, message): ...
+ def get_part_encoding(self, headers): ...
+ def get_part_charset(self, headers): ...
+ def start_file_streaming(self, filename, headers, total_content_length): ...
+ def in_memory_threshold_reached(self, bytes): ...
+ def validate_boundary(self, boundary): ...
+ def parse_lines(self, file, boundary, content_length, cap_at_buffer=True): ...
+ def parse_parts(self, file, boundary, content_length): ...
+ def parse(self, file, boundary, content_length): ...
diff --git a/typeshed/third_party/3/werkzeug/http.pyi b/typeshed/third_party/3/werkzeug/http.pyi
new file mode 100644
index 0000000..61202ea
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/http.pyi
@@ -0,0 +1,42 @@
+# Stubs for werkzeug.http (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from urllib.request import parse_http_list as _parse_list_header
+from urllib.parse import unquote_to_bytes as _unquote
+
+HTTP_STATUS_CODES = ... # type: Any
+
+def wsgi_to_bytes(data): ...
+def bytes_to_wsgi(data): ...
+def quote_header_value(value, extra_chars='', allow_token=True): ...
+def unquote_header_value(value, is_filename=False): ...
+def dump_options_header(header, options): ...
+def dump_header(iterable, allow_token=True): ...
+def parse_list_header(value): ...
+def parse_dict_header(value, cls=...): ...
+def parse_options_header(value, multiple=False): ...
+def parse_accept_header(value, cls=None): ...
+def parse_cache_control_header(value, on_update=None, cls=None): ...
+def parse_set_header(value, on_update=None): ...
+def parse_authorization_header(value): ...
+def parse_www_authenticate_header(value, on_update=None): ...
+def parse_if_range_header(value): ...
+def parse_range_header(value, make_inclusive=True): ...
+def parse_content_range_header(value, on_update=None): ...
+def quote_etag(etag, weak=False): ...
+def unquote_etag(etag): ...
+def parse_etags(value): ...
+def generate_etag(data): ...
+def parse_date(value): ...
+def cookie_date(expires=None): ...
+def http_date(timestamp=None): ...
+def is_resource_modified(environ, etag=None, data=None, last_modified=None, ignore_if_range=True): ...
+def remove_entity_headers(headers, allowed=...): ...
+def remove_hop_by_hop_headers(headers): ...
+def is_entity_header(header): ...
+def is_hop_by_hop_header(header): ...
+def parse_cookie(header, charset='', errors='', cls=None): ...
+def dump_cookie(key, value='', max_age=None, expires=None, path='', domain=None, secure=False, httponly=False, charset='', sync_expires=True): ...
+def is_byte_range_valid(start, stop, length): ...
diff --git a/typeshed/third_party/3/werkzeug/local.pyi b/typeshed/third_party/3/werkzeug/local.pyi
new file mode 100644
index 0000000..1ed3102
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/local.pyi
@@ -0,0 +1,104 @@
+# Stubs for werkzeug.local (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+def release_local(local): ...
+
+class Local:
+ def __init__(self): ...
+ def __iter__(self): ...
+ def __call__(self, proxy): ...
+ def __release_local__(self): ...
+ def __getattr__(self, name): ...
+ def __setattr__(self, name, value): ...
+ def __delattr__(self, name): ...
+
+class LocalStack:
+ def __init__(self): ...
+ def __release_local__(self): ...
+ def _get__ident_func__(self): ...
+ def _set__ident_func__(self, value): ...
+ __ident_func__ = ... # type: Any
+ def __call__(self): ...
+ def push(self, obj): ...
+ def pop(self): ...
+ @property
+ def top(self): ...
+
+class LocalManager:
+ locals = ... # type: Any
+ ident_func = ... # type: Any
+ def __init__(self, locals=None, ident_func=None): ...
+ def get_ident(self): ...
+ def cleanup(self): ...
+ def make_middleware(self, app): ...
+ def middleware(self, func): ...
+
+class LocalProxy:
+ def __init__(self, local, name=None): ...
+ @property
+ def __dict__(self): ...
+ def __bool__(self): ...
+ def __unicode__(self): ...
+ def __dir__(self): ...
+ def __getattr__(self, name): ...
+ def __setitem__(self, key, value): ...
+ def __delitem__(self, key): ...
+ __getslice__ = ... # type: Any
+ def __setslice__(self, i, j, seq): ...
+ def __delslice__(self, i, j): ...
+ __setattr__ = ... # type: Any
+ __delattr__ = ... # type: Any
+ __lt__ = ... # type: Any
+ __le__ = ... # type: Any
+ __eq__ = ... # type: Any
+ __ne__ = ... # type: Any
+ __gt__ = ... # type: Any
+ __ge__ = ... # type: Any
+ __cmp__ = ... # type: Any
+ __hash__ = ... # type: Any
+ __call__ = ... # type: Any
+ __len__ = ... # type: Any
+ __getitem__ = ... # type: Any
+ __iter__ = ... # type: Any
+ __contains__ = ... # type: Any
+ __add__ = ... # type: Any
+ __sub__ = ... # type: Any
+ __mul__ = ... # type: Any
+ __floordiv__ = ... # type: Any
+ __mod__ = ... # type: Any
+ __divmod__ = ... # type: Any
+ __pow__ = ... # type: Any
+ __lshift__ = ... # type: Any
+ __rshift__ = ... # type: Any
+ __and__ = ... # type: Any
+ __xor__ = ... # type: Any
+ __or__ = ... # type: Any
+ __div__ = ... # type: Any
+ __truediv__ = ... # type: Any
+ __neg__ = ... # type: Any
+ __pos__ = ... # type: Any
+ __abs__ = ... # type: Any
+ __invert__ = ... # type: Any
+ __complex__ = ... # type: Any
+ __int__ = ... # type: Any
+ __long__ = ... # type: Any
+ __float__ = ... # type: Any
+ __oct__ = ... # type: Any
+ __hex__ = ... # type: Any
+ __index__ = ... # type: Any
+ __coerce__ = ... # type: Any
+ __enter__ = ... # type: Any
+ __exit__ = ... # type: Any
+ __radd__ = ... # type: Any
+ __rsub__ = ... # type: Any
+ __rmul__ = ... # type: Any
+ __rdiv__ = ... # type: Any
+ __rtruediv__ = ... # type: Any
+ __rfloordiv__ = ... # type: Any
+ __rmod__ = ... # type: Any
+ __rdivmod__ = ... # type: Any
+ __copy__ = ... # type: Any
+ __deepcopy__ = ... # type: Any
diff --git a/typeshed/third_party/3/werkzeug/posixemulation.pyi b/typeshed/third_party/3/werkzeug/posixemulation.pyi
new file mode 100644
index 0000000..a2838fc
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/posixemulation.pyi
@@ -0,0 +1,11 @@
+# Stubs for werkzeug.posixemulation (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from ._compat import to_unicode as to_unicode
+from .filesystem import get_filesystem_encoding as get_filesystem_encoding
+
+can_rename_open_file = ... # type: Any
+
+def rename(src, dst): ...
diff --git a/typeshed/third_party/3/werkzeug/routing.pyi b/typeshed/third_party/3/werkzeug/routing.pyi
new file mode 100644
index 0000000..ff0bbda
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/routing.pyi
@@ -0,0 +1,182 @@
+# Stubs for werkzeug.routing (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from werkzeug.exceptions import HTTPException
+
+def parse_converter_args(argstr): ...
+def parse_rule(rule): ...
+
+class RoutingException(Exception): ...
+
+class RequestRedirect(HTTPException, RoutingException):
+ code = ... # type: Any
+ new_url = ... # type: Any
+ def __init__(self, new_url): ...
+ def get_response(self, environ): ...
+
+class RequestSlash(RoutingException): ...
+
+class RequestAliasRedirect(RoutingException):
+ matched_values = ... # type: Any
+ def __init__(self, matched_values): ...
+
+class BuildError(RoutingException, LookupError):
+ endpoint = ... # type: Any
+ values = ... # type: Any
+ method = ... # type: Any
+ adapter = ... # type: Any
+ def __init__(self, endpoint, values, method, adapter=None): ...
+ def suggested(self): ...
+ def closest_rule(self, adapter): ...
+
+class ValidationError(ValueError): ...
+
+class RuleFactory:
+ def get_rules(self, map): ...
+
+class Subdomain(RuleFactory):
+ subdomain = ... # type: Any
+ rules = ... # type: Any
+ def __init__(self, subdomain, rules): ...
+ def get_rules(self, map): ...
+
+class Submount(RuleFactory):
+ path = ... # type: Any
+ rules = ... # type: Any
+ def __init__(self, path, rules): ...
+ def get_rules(self, map): ...
+
+class EndpointPrefix(RuleFactory):
+ prefix = ... # type: Any
+ rules = ... # type: Any
+ def __init__(self, prefix, rules): ...
+ def get_rules(self, map): ...
+
+class RuleTemplate:
+ rules = ... # type: Any
+ def __init__(self, rules): ...
+ def __call__(self, *args, **kwargs): ...
+
+class RuleTemplateFactory(RuleFactory):
+ rules = ... # type: Any
+ context = ... # type: Any
+ def __init__(self, rules, context): ...
+ def get_rules(self, map): ...
+
+class Rule(RuleFactory):
+ rule = ... # type: Any
+ is_leaf = ... # type: Any
+ map = ... # type: Any
+ strict_slashes = ... # type: Any
+ subdomain = ... # type: Any
+ host = ... # type: Any
+ defaults = ... # type: Any
+ build_only = ... # type: Any
+ alias = ... # type: Any
+ methods = ... # type: Any
+ endpoint = ... # type: Any
+ redirect_to = ... # type: Any
+ arguments = ... # type: Any
+ def __init__(self, string, defaults=None, subdomain=None, methods=None, build_only=False, endpoint=None, strict_slashes=None, redirect_to=None, alias=False, host=None): ...
+ def empty(self): ...
+ def get_empty_kwargs(self): ...
+ def get_rules(self, map): ...
+ def refresh(self): ...
+ def bind(self, map, rebind=False): ...
+ def get_converter(self, variable_name, converter_name, args, kwargs): ...
+ def compile(self): ...
+ def match(self, path, method=None): ...
+ def build(self, values, append_unknown=True): ...
+ def provides_defaults_for(self, rule): ...
+ def suitable_for(self, values, method=None): ...
+ def match_compare_key(self): ...
+ def build_compare_key(self): ...
+ def __eq__(self, other): ...
+ def __ne__(self, other): ...
+
+class BaseConverter:
+ regex = ... # type: Any
+ weight = ... # type: Any
+ map = ... # type: Any
+ def __init__(self, map): ...
+ def to_python(self, value): ...
+ def to_url(self, value): ...
+
+class UnicodeConverter(BaseConverter):
+ regex = ... # type: Any
+ def __init__(self, map, minlength=1, maxlength=None, length=None): ...
+
+class AnyConverter(BaseConverter):
+ regex = ... # type: Any
+ def __init__(self, map, *items): ...
+
+class PathConverter(BaseConverter):
+ regex = ... # type: Any
+ weight = ... # type: Any
+
+class NumberConverter(BaseConverter):
+ weight = ... # type: Any
+ fixed_digits = ... # type: Any
+ min = ... # type: Any
+ max = ... # type: Any
+ def __init__(self, map, fixed_digits=0, min=None, max=None): ...
+ def to_python(self, value): ...
+ def to_url(self, value): ...
+
+class IntegerConverter(NumberConverter):
+ regex = ... # type: Any
+ num_convert = ... # type: Any
+
+class FloatConverter(NumberConverter):
+ regex = ... # type: Any
+ num_convert = ... # type: Any
+ def __init__(self, map, min=None, max=None): ...
+
+class UUIDConverter(BaseConverter):
+ regex = ... # type: Any
+ def to_python(self, value): ...
+ def to_url(self, value): ...
+
+DEFAULT_CONVERTERS = ... # type: Any
+
+class Map:
+ default_converters = ... # type: Any
+ default_subdomain = ... # type: Any
+ charset = ... # type: Any
+ encoding_errors = ... # type: Any
+ strict_slashes = ... # type: Any
+ redirect_defaults = ... # type: Any
+ host_matching = ... # type: Any
+ converters = ... # type: Any
+ sort_parameters = ... # type: Any
+ sort_key = ... # type: Any
+ def __init__(self, rules=None, default_subdomain='', charset='', strict_slashes=True, redirect_defaults=True, converters=None, sort_parameters=False, sort_key=None, encoding_errors='', host_matching=False): ...
+ def is_endpoint_expecting(self, endpoint, *arguments): ...
+ def iter_rules(self, endpoint=None): ...
+ def add(self, rulefactory): ...
+ def bind(self, server_name, script_name=None, subdomain=None, url_scheme='', default_method='', path_info=None, query_args=None): ...
+ def bind_to_environ(self, environ, server_name=None, subdomain=None): ...
+ def update(self): ...
+
+class MapAdapter:
+ map = ... # type: Any
+ server_name = ... # type: Any
+ script_name = ... # type: Any
+ subdomain = ... # type: Any
+ url_scheme = ... # type: Any
+ path_info = ... # type: Any
+ default_method = ... # type: Any
+ query_args = ... # type: Any
+ def __init__(self, map, server_name, script_name, subdomain, url_scheme, path_info, default_method, query_args=None): ...
+ def dispatch(self, view_func, path_info=None, method=None, catch_http_exceptions=False): ...
+ def match(self, path_info=None, method=None, return_rule=False, query_args=None): ...
+ def test(self, path_info=None, method=None): ...
+ def allowed_methods(self, path_info=None): ...
+ def get_host(self, domain_part): ...
+ def get_default_redirect(self, rule, method, values, query_args): ...
+ def encode_query_args(self, query_args): ...
+ def make_redirect_url(self, path_info, query_args=None, domain_part=None): ...
+ def make_alias_redirect_url(self, path, endpoint, values, method, query_args): ...
+ def build(self, endpoint, values=None, method=None, force_external=False, append_unknown=True): ...
diff --git a/typeshed/third_party/3/werkzeug/script.pyi b/typeshed/third_party/3/werkzeug/script.pyi
new file mode 100644
index 0000000..a01ffde
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/script.pyi
@@ -0,0 +1,16 @@
+# Stubs for werkzeug.script (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+argument_types = ... # type: Any
+converters = ... # type: Any
+
+def run(namespace=None, action_prefix='', args=None): ...
+def fail(message, code=-1): ...
+def find_actions(namespace, action_prefix): ...
+def print_usage(actions): ...
+def analyse_action(func): ...
+def make_shell(init_func=None, banner=None, use_ipython=True): ...
+def make_runserver(app_factory, hostname='', port=5000, use_reloader=False, use_debugger=False, use_evalex=True, threaded=False, processes=1, static_files=None, extra_files=None, ssl_context=None): ...
diff --git a/typeshed/third_party/3/werkzeug/security.pyi b/typeshed/third_party/3/werkzeug/security.pyi
new file mode 100644
index 0000000..b28d68a
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/security.pyi
@@ -0,0 +1,16 @@
+# Stubs for werkzeug.security (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+SALT_CHARS = ... # type: Any
+DEFAULT_PBKDF2_ITERATIONS = ... # type: Any
+
+def pbkdf2_hex(data, salt, iterations=..., keylen=None, hashfunc=None): ...
+def pbkdf2_bin(data, salt, iterations=..., keylen=None, hashfunc=None): ...
+def safe_str_cmp(a, b): ...
+def gen_salt(length): ...
+def generate_password_hash(password, method='', salt_length=8): ...
+def check_password_hash(pwhash, password): ...
+def safe_join(directory, filename): ...
diff --git a/typeshed/third_party/3/werkzeug/serving.pyi b/typeshed/third_party/3/werkzeug/serving.pyi
new file mode 100644
index 0000000..db347d2
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/serving.pyi
@@ -0,0 +1,84 @@
+# Stubs for werkzeug.serving (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from socketserver import ThreadingMixIn, ForkingMixIn
+from http.server import HTTPServer, BaseHTTPRequestHandler
+
+class _SslDummy:
+ def __getattr__(self, name): ...
+
+ssl = ... # type: Any
+LISTEN_QUEUE = ... # type: Any
+can_open_by_fd = ... # type: Any
+
+class WSGIRequestHandler(BaseHTTPRequestHandler):
+ @property
+ def server_version(self): ...
+ def make_environ(self): ...
+ environ = ... # type: Any
+ close_connection = ... # type: Any
+ def run_wsgi(self): ...
+ def handle(self): ...
+ def initiate_shutdown(self): ...
+ def connection_dropped(self, error, environ=None): ...
+ raw_requestline = ... # type: Any
+ def handle_one_request(self): ...
+ def send_response(self, code, message=None): ...
+ def version_string(self): ...
+ def address_string(self): ...
+ def port_integer(self): ...
+ def log_request(self, code='', size=''): ...
+ def log_error(self, *args): ...
+ def log_message(self, format, *args): ...
+ def log(self, type, message, *args): ...
+
+BaseRequestHandler = ... # type: Any
+
+def generate_adhoc_ssl_pair(cn=None): ...
+def make_ssl_devcert(base_path, host=None, cn=None): ...
+def generate_adhoc_ssl_context(): ...
+def load_ssl_context(cert_file, pkey_file=None, protocol=None): ...
+
+class _SSLContext:
+ def __init__(self, protocol): ...
+ def load_cert_chain(self, certfile, keyfile=None, password=None): ...
+ def wrap_socket(self, sock, **kwargs): ...
+
+def is_ssl_error(error=None): ...
+def select_ip_version(host, port): ...
+
+class BaseWSGIServer(HTTPServer):
+ multithread = ... # type: Any
+ multiprocess = ... # type: Any
+ request_queue_size = ... # type: Any
+ address_family = ... # type: Any
+ app = ... # type: Any
+ passthrough_errors = ... # type: Any
+ shutdown_signal = ... # type: Any
+ host = ... # type: Any
+ port = ... # type: Any
+ socket = ... # type: Any
+ server_address = ... # type: Any
+ ssl_context = ... # type: Any
+ def __init__(self, host, port, app, handler=None, passthrough_errors=False, ssl_context=None, fd=None): ...
+ def log(self, type, message, *args): ...
+ def serve_forever(self): ...
+ def handle_error(self, request, client_address): ...
+ def get_request(self): ...
+
+class ThreadedWSGIServer(ThreadingMixIn, BaseWSGIServer):
+ multithread = ... # type: Any
+ daemon_threads = ... # type: Any
+
+class ForkingWSGIServer(ForkingMixIn, BaseWSGIServer):
+ multiprocess = ... # type: Any
+ max_children = ... # type: Any
+ def __init__(self, host, port, app, processes=40, handler=None, passthrough_errors=False, ssl_context=None, fd=None): ...
+
+def make_server(host=None, port=None, app=None, threaded=False, processes=1, request_handler=None, passthrough_errors=False, ssl_context=None, fd=None): ...
+def is_running_from_reloader(): ...
+def run_simple(hostname, port, application, use_reloader=False, use_debugger=False, use_evalex=True, extra_files=None, reloader_interval=1, reloader_type='', threaded=False, processes=1, request_handler=None, static_files=None, passthrough_errors=False, ssl_context=None): ...
+def run_with_reloader(*args, **kwargs): ...
+def main(): ...
diff --git a/typeshed/third_party/3/werkzeug/test.pyi b/typeshed/third_party/3/werkzeug/test.pyi
new file mode 100644
index 0000000..1def658
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/test.pyi
@@ -0,0 +1,85 @@
+# Stubs for werkzeug.test (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from urllib.request import Request as U2Request
+from http.cookiejar import CookieJar
+
+def stream_encode_multipart(values, use_tempfile=True, threshold=..., boundary=None, charset=''): ...
+def encode_multipart(values, boundary=None, charset=''): ...
+def File(fd, filename=None, mimetype=None): ...
+
+class _TestCookieHeaders:
+ headers = ... # type: Any
+ def __init__(self, headers): ...
+ def getheaders(self, name): ...
+ def get_all(self, name, default=None): ...
+
+class _TestCookieResponse:
+ headers = ... # type: Any
+ def __init__(self, headers): ...
+ def info(self): ...
+
+class _TestCookieJar(CookieJar):
+ def inject_wsgi(self, environ): ...
+ def extract_wsgi(self, environ, headers): ...
+
+class EnvironBuilder:
+ server_protocol = ... # type: Any
+ wsgi_version = ... # type: Any
+ request_class = ... # type: Any
+ charset = ... # type: Any
+ path = ... # type: Any
+ base_url = ... # type: Any
+ query_string = ... # type: Any
+ args = ... # type: Any
+ method = ... # type: Any
+ headers = ... # type: Any
+ content_type = ... # type: Any
+ errors_stream = ... # type: Any
+ multithread = ... # type: Any
+ multiprocess = ... # type: Any
+ run_once = ... # type: Any
+ environ_base = ... # type: Any
+ environ_overrides = ... # type: Any
+ input_stream = ... # type: Any
+ content_length = ... # type: Any
+ closed = ... # type: Any
+ def __init__(self, path='', base_url=None, query_string=None, method='', input_stream=None, content_type=None, content_length=None, errors_stream=None, multithread=False, multiprocess=False, run_once=False, headers=None, data=None, environ_base=None, environ_overrides=None, charset=''): ...
+ def form_property(name, storage, doc): ...
+ form = ... # type: Any
+ files = ... # type: Any
+ @property
+ def server_name(self): ...
+ @property
+ def server_port(self): ...
+ def __del__(self): ...
+ def close(self): ...
+ def get_environ(self): ...
+ def get_request(self, cls=None): ...
+
+class ClientRedirectError(Exception): ...
+
+class Client:
+ application = ... # type: Any
+ response_wrapper = ... # type: Any
+ cookie_jar = ... # type: Any
+ allow_subdomain_redirects = ... # type: Any
+ def __init__(self, application, response_wrapper=None, use_cookies=True, allow_subdomain_redirects=False): ...
+ def set_cookie(self, server_name, key, value='', max_age=None, expires=None, path='', domain=None, secure=None, httponly=False, charset=''): ...
+ def delete_cookie(self, server_name, key, path='', domain=None): ...
+ def run_wsgi_app(self, environ, buffered=False): ...
+ def resolve_redirect(self, response, new_location, environ, buffered=False): ...
+ def open(self, *args, **kwargs): ...
+ def get(self, *args, **kw): ...
+ def patch(self, *args, **kw): ...
+ def post(self, *args, **kw): ...
+ def head(self, *args, **kw): ...
+ def put(self, *args, **kw): ...
+ def delete(self, *args, **kw): ...
+ def options(self, *args, **kw): ...
+ def trace(self, *args, **kw): ...
+
+def create_environ(*args, **kwargs): ...
+def run_wsgi_app(app, environ, buffered=False): ...
diff --git a/typeshed/third_party/3/werkzeug/testapp.pyi b/typeshed/third_party/3/werkzeug/testapp.pyi
new file mode 100644
index 0000000..cee939b
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/testapp.pyi
@@ -0,0 +1,13 @@
+# Stubs for werkzeug.testapp (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from werkzeug.wrappers import BaseRequest as Request, BaseResponse as Response
+
+logo = ... # type: Any
+TEMPLATE = ... # type: Any
+
+def iter_sys_path(): ...
+def render_testapp(req): ...
+def test_app(environ, start_response): ...
diff --git a/typeshed/third_party/3/werkzeug/urls.pyi b/typeshed/third_party/3/werkzeug/urls.pyi
new file mode 100644
index 0000000..be248d2
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/urls.pyi
@@ -0,0 +1,71 @@
+# Stubs for werkzeug.urls (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from collections import namedtuple
+from typing import Any
+
+
+_URLTuple = namedtuple(
+ '_URLTuple',
+ ['scheme', 'netloc', 'path', 'query', 'fragment']
+)
+
+
+class BaseURL(_URLTuple):
+ def replace(self, **kwargs): ...
+ @property
+ def host(self): ...
+ @property
+ def ascii_host(self): ...
+ @property
+ def port(self): ...
+ @property
+ def auth(self): ...
+ @property
+ def username(self): ...
+ @property
+ def raw_username(self): ...
+ @property
+ def password(self): ...
+ @property
+ def raw_password(self): ...
+ def decode_query(self, *args, **kwargs): ...
+ def join(self, *args, **kwargs): ...
+ def to_url(self): ...
+ def decode_netloc(self): ...
+ def to_uri_tuple(self): ...
+ def to_iri_tuple(self): ...
+ def get_file_location(self, pathformat=None): ...
+
+class URL(BaseURL):
+ def encode_netloc(self): ...
+ def encode(self, charset='', errors=''): ...
+
+class BytesURL(BaseURL):
+ def encode_netloc(self): ...
+ def decode(self, charset='', errors=''): ...
+
+def url_parse(url, scheme=None, allow_fragments=True): ...
+def url_quote(string, charset='', errors='', safe='', unsafe=''): ...
+def url_quote_plus(string, charset='', errors='', safe=''): ...
+def url_unparse(components): ...
+def url_unquote(string, charset='', errors='', unsafe=''): ...
+def url_unquote_plus(s, charset='', errors=''): ...
+def url_fix(s, charset=''): ...
+def uri_to_iri(uri, charset='', errors=''): ...
+def iri_to_uri(iri, charset='', errors='', safe_conversion=False): ...
+def url_decode(s, charset='', decode_keys=False, include_empty=True, errors='', separator='', cls=None): ...
+def url_decode_stream(stream, charset='', decode_keys=False, include_empty=True, errors='', separator='', cls=None, limit=None, return_iterator=False): ...
+def url_encode(obj, charset='', encode_keys=False, sort=False, key=None, separator=b''): ...
+def url_encode_stream(obj, stream=None, charset='', encode_keys=False, sort=False, key=None, separator=b''): ...
+def url_join(base, url, allow_fragments=True): ...
+
+class Href:
+ base = ... # type: Any
+ charset = ... # type: Any
+ sort = ... # type: Any
+ key = ... # type: Any
+ def __init__(self, base='', charset='', sort=False, key=None): ...
+ def __getattr__(self, name): ...
+ def __call__(self, *path, **query): ...
diff --git a/typeshed/third_party/3/werkzeug/useragents.pyi b/typeshed/third_party/3/werkzeug/useragents.pyi
new file mode 100644
index 0000000..2471a24
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/useragents.pyi
@@ -0,0 +1,18 @@
+# Stubs for werkzeug.useragents (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class UserAgentParser:
+ platforms = ... # type: Any
+ browsers = ... # type: Any
+ def __init__(self): ...
+ def __call__(self, user_agent): ...
+
+class UserAgent:
+ string = ... # type: Any
+ def __init__(self, environ_or_string): ...
+ def to_header(self): ...
+ def __nonzero__(self): ...
+ __bool__ = ... # type: Any
diff --git a/typeshed/third_party/3/werkzeug/utils.pyi b/typeshed/third_party/3/werkzeug/utils.pyi
new file mode 100644
index 0000000..b26f316
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/utils.pyi
@@ -0,0 +1,53 @@
+# Stubs for werkzeug.utils (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+from werkzeug._internal import _DictAccessorProperty
+
+class cached_property(property):
+ __name__ = ... # type: Any
+ __module__ = ... # type: Any
+ __doc__ = ... # type: Any
+ func = ... # type: Any
+ def __init__(self, func, name=None, doc=None): ...
+ def __set__(self, obj, value): ...
+ def __get__(self, obj, type=None): ...
+
+class environ_property(_DictAccessorProperty):
+ read_only = ... # type: Any
+ def lookup(self, obj): ...
+
+class header_property(_DictAccessorProperty):
+ def lookup(self, obj): ...
+
+class HTMLBuilder:
+ def __init__(self, dialect): ...
+ def __call__(self, s): ...
+ def __getattr__(self, tag): ...
+
+html = ... # type: Any
+xhtml = ... # type: Any
+
+def get_content_type(mimetype, charset): ...
+def format_string(string, context): ...
+def secure_filename(filename): ...
+def escape(s, quote=None): ...
+def unescape(s): ...
+def redirect(location, code=302, Response=None): ...
+def append_slash_redirect(environ, code=301): ...
+def import_string(import_name, silent=False): ...
+def find_modules(import_path, include_packages=False, recursive=False): ...
+def validate_arguments(func, args, kwargs, drop_extra=True): ...
+def bind_arguments(func, args, kwargs): ...
+
+class ArgumentValidationError(ValueError):
+ missing = ... # type: Any
+ extra = ... # type: Any
+ extra_positional = ... # type: Any
+ def __init__(self, missing=None, extra=None, extra_positional=None): ...
+
+class ImportStringError(ImportError):
+ import_name = ... # type: Any
+ exception = ... # type: Any
+ def __init__(self, import_name, exception): ...
diff --git a/typeshed/third_party/3/werkzeug/wrappers.pyi b/typeshed/third_party/3/werkzeug/wrappers.pyi
new file mode 100644
index 0000000..9bc5151
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/wrappers.pyi
@@ -0,0 +1,194 @@
+# Stubs for werkzeug.wrappers (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+class BaseRequest:
+ charset = ... # type: Any
+ encoding_errors = ... # type: Any
+ max_content_length = ... # type: Any
+ max_form_memory_size = ... # type: Any
+ parameter_storage_class = ... # type: Any
+ list_storage_class = ... # type: Any
+ dict_storage_class = ... # type: Any
+ form_data_parser_class = ... # type: Any
+ trusted_hosts = ... # type: Any
+ disable_data_descriptor = ... # type: Any
+ environ = ... # type: Any
+ shallow = ... # type: Any
+ def __init__(self, environ, populate_request=True, shallow=False): ...
+ @property
+ def url_charset(self): ...
+ @classmethod
+ def from_values(cls, *args, **kwargs): ...
+ @classmethod
+ def application(cls, f): ...
+ @property
+ def want_form_data_parsed(self): ...
+ def make_form_data_parser(self): ...
+ def close(self): ...
+ def __enter__(self): ...
+ def __exit__(self, exc_type, exc_value, tb): ...
+ def stream(self): ...
+ input_stream = ... # type: Any
+ def args(self): ...
+ def data(self): ...
+ def get_data(self, cache=True, as_text=False, parse_form_data=False): ...
+ def form(self): ...
+ def values(self): ...
+ def files(self): ...
+ def cookies(self): ...
+ def headers(self): ...
+ def path(self): ...
+ def full_path(self): ...
+ def script_root(self): ...
+ def url(self): ...
+ def base_url(self): ...
+ def url_root(self): ...
+ def host_url(self): ...
+ def host(self): ...
+ query_string = ... # type: Any
+ method = ... # type: Any
+ def access_route(self): ...
+ @property
+ def remote_addr(self): ...
+ remote_user = ... # type: Any
+ scheme = ... # type: Any
+ is_xhr = ... # type: Any
+ is_secure = ... # type: Any
+ is_multithread = ... # type: Any
+ is_multiprocess = ... # type: Any
+ is_run_once = ... # type: Any
+
+class BaseResponse:
+ charset = ... # type: Any
+ default_status = ... # type: Any
+ default_mimetype = ... # type: Any
+ implicit_sequence_conversion = ... # type: Any
+ autocorrect_location_header = ... # type: Any
+ automatically_set_content_length = ... # type: Any
+ headers = ... # type: Any
+ status_code = ... # type: Any
+ status = ... # type: Any
+ direct_passthrough = ... # type: Any
+ response = ... # type: Any
+ def __init__(self, response=None, status=None, headers=None, mimetype=None, content_type=None, direct_passthrough=False): ...
+ def call_on_close(self, func): ...
+ @classmethod
+ def force_type(cls, response, environ=None): ...
+ @classmethod
+ def from_app(cls, app, environ, buffered=False): ...
+ def get_data(self, as_text=False): ...
+ def set_data(self, value): ...
+ data = ... # type: Any
+ def calculate_content_length(self): ...
+ def make_sequence(self): ...
+ def iter_encoded(self): ...
+ def set_cookie(self, key, value='', max_age=None, expires=None, path='', domain=None, secure=False, httponly=False): ...
+ def delete_cookie(self, key, path='', domain=None): ...
+ @property
+ def is_streamed(self): ...
+ @property
+ def is_sequence(self): ...
+ def close(self): ...
+ def __enter__(self): ...
+ def __exit__(self, exc_type, exc_value, tb): ...
+ def freeze(self, **kwargs): ...
+ def get_wsgi_headers(self, environ): ...
+ def get_app_iter(self, environ): ...
+ def get_wsgi_response(self, environ): ...
+ def __call__(self, environ, start_response): ...
+
+class AcceptMixin:
+ def accept_mimetypes(self): ...
+ def accept_charsets(self): ...
+ def accept_encodings(self): ...
+ def accept_languages(self): ...
+
+class ETagRequestMixin:
+ def cache_control(self): ...
+ def if_match(self): ...
+ def if_none_match(self): ...
+ def if_modified_since(self): ...
+ def if_unmodified_since(self): ...
+ def if_range(self): ...
+ def range(self): ...
+
+class UserAgentMixin:
+ def user_agent(self): ...
+
+class AuthorizationMixin:
+ def authorization(self): ...
+
+class StreamOnlyMixin:
+ disable_data_descriptor = ... # type: Any
+ want_form_data_parsed = ... # type: Any
+
+class ETagResponseMixin:
+ @property
+ def cache_control(self): ...
+ status_code = ... # type: Any
+ def make_conditional(self, request_or_environ, accept_ranges=False, complete_length=None): ...
+ def add_etag(self, overwrite=False, weak=False): ...
+ def set_etag(self, etag, weak=False): ...
+ def get_etag(self): ...
+ def freeze(self, *, no_etag=False): ...
+ accept_ranges = ... # type: Any
+ content_range = ... # type: Any
+
+class ResponseStream:
+ mode = ... # type: Any
+ response = ... # type: Any
+ closed = ... # type: Any
+ def __init__(self, response): ...
+ def write(self, value): ...
+ def writelines(self, seq): ...
+ def close(self): ...
+ def flush(self): ...
+ def isatty(self): ...
+ @property
+ def encoding(self): ...
+
+class ResponseStreamMixin:
+ def stream(self): ...
+
+class CommonRequestDescriptorsMixin:
+ content_type = ... # type: Any
+ def content_length(self): ...
+ content_encoding = ... # type: Any
+ content_md5 = ... # type: Any
+ referrer = ... # type: Any
+ date = ... # type: Any
+ max_forwards = ... # type: Any
+ @property
+ def mimetype(self): ...
+ @property
+ def mimetype_params(self): ...
+ def pragma(self): ...
+
+class CommonResponseDescriptorsMixin:
+ mimetype = ... # type: Any
+ mimetype_params = ... # type: Any
+ location = ... # type: Any
+ age = ... # type: Any
+ content_type = ... # type: Any
+ content_length = ... # type: Any
+ content_location = ... # type: Any
+ content_encoding = ... # type: Any
+ content_md5 = ... # type: Any
+ date = ... # type: Any
+ expires = ... # type: Any
+ last_modified = ... # type: Any
+ retry_after = ... # type: Any
+ vary = ... # type: Any
+ content_language = ... # type: Any
+ allow = ... # type: Any
+
+class WWWAuthenticateMixin:
+ @property
+ def www_authenticate(self): ...
+
+class Request(BaseRequest, AcceptMixin, ETagRequestMixin, UserAgentMixin, AuthorizationMixin, CommonRequestDescriptorsMixin): ...
+class PlainRequest(StreamOnlyMixin, Request): ...
+class Response(BaseResponse, ETagResponseMixin, ResponseStreamMixin, CommonResponseDescriptorsMixin, WWWAuthenticateMixin): ...
diff --git a/typeshed/third_party/3/werkzeug/wsgi.pyi b/typeshed/third_party/3/werkzeug/wsgi.pyi
new file mode 100644
index 0000000..4a0e681
--- /dev/null
+++ b/typeshed/third_party/3/werkzeug/wsgi.pyi
@@ -0,0 +1,88 @@
+# Stubs for werkzeug.wsgi (Python 3.5)
+#
+# NOTE: This dynamically typed stub was automatically generated by stubgen.
+
+from typing import Any
+
+def responder(f): ...
+def get_current_url(environ, root_only=False, strip_querystring=False, host_only=False, trusted_hosts=None): ...
+def host_is_trusted(hostname, trusted_list): ...
+def get_host(environ, trusted_hosts=None): ...
+def get_content_length(environ): ...
+def get_input_stream(environ, safe_fallback=True): ...
+def get_query_string(environ): ...
+def get_path_info(environ, charset='', errors=''): ...
+def get_script_name(environ, charset='', errors=''): ...
+def pop_path_info(environ, charset='', errors=''): ...
+def peek_path_info(environ, charset='', errors=''): ...
+def extract_path_info(environ_or_baseurl, path_or_url, charset='', errors='', collapse_http_schemes=True): ...
+
+class SharedDataMiddleware:
+ app = ... # type: Any
+ exports = ... # type: Any
+ cache = ... # type: Any
+ cache_timeout = ... # type: Any
+ fallback_mimetype = ... # type: Any
+ def __init__(self, app, exports, disallow=None, cache=True, cache_timeout=..., fallback_mimetype=''): ...
+ def is_allowed(self, filename): ...
+ def get_file_loader(self, filename): ...
+ def get_package_loader(self, package, package_path): ...
+ def get_directory_loader(self, directory): ...
+ def generate_etag(self, mtime, file_size, real_filename): ...
+ def __call__(self, environ, start_response): ...
+
+class DispatcherMiddleware:
+ app = ... # type: Any
+ mounts = ... # type: Any
+ def __init__(self, app, mounts=None): ...
+ def __call__(self, environ, start_response): ...
+
+class ClosingIterator:
+ def __init__(self, iterable, callbacks=None): ...
+ def __iter__(self): ...
+ def __next__(self): ...
+ def close(self): ...
+
+def wrap_file(environ, file, buffer_size=8192): ...
+
+class FileWrapper:
+ file = ... # type: Any
+ buffer_size = ... # type: Any
+ def __init__(self, file, buffer_size=8192): ...
+ def close(self): ...
+ def seekable(self): ...
+ def seek(self, *args): ...
+ def tell(self): ...
+ def __iter__(self): ...
+ def __next__(self): ...
+
+class _RangeWrapper:
+ iterable = ... # type: Any
+ byte_range = ... # type: Any
+ start_byte = ... # type: Any
+ end_byte = ... # type: Any
+ read_length = ... # type: Any
+ seekable = ... # type: Any
+ end_reached = ... # type: Any
+ def __init__(self, iterable, start_byte=0, byte_range=None): ...
+ def __iter__(self): ...
+ def __next__(self): ...
+ def close(self): ...
+
+def make_line_iter(stream, limit=None, buffer_size=..., cap_at_buffer=False): ...
+def make_chunk_iter(stream, separator, limit=None, buffer_size=..., cap_at_buffer=False): ...
+
+class LimitedStream:
+ limit = ... # type: Any
+ def __init__(self, stream, limit): ...
+ def __iter__(self): ...
+ @property
+ def is_exhausted(self): ...
+ def on_exhausted(self): ...
+ def on_disconnect(self): ...
+ def exhaust(self, chunk_size=...): ...
+ def read(self, size=None): ...
+ def readline(self, size=None): ...
+ def readlines(self, size=None): ...
+ def tell(self): ...
+ def __next__(self): ...
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/mypy.git
More information about the debian-med-commit
mailing list