[med-svn] [mypy] 01/01: New upstream version 0.470
Michael Crusoe
misterc-guest at moszumanska.debian.org
Sun Jan 15 09:29:50 UTC 2017
This is an automated email from the git hooks/post-receive script.
misterc-guest pushed a commit to annotated tag upstream/0.470
in repository mypy.
commit cfb5550bcba6e720c753e9b23ec516a7910d9614
Author: Michael R. Crusoe <michael.crusoe at gmail.com>
Date: Sun Jan 15 00:39:14 2017 -0800
New upstream version 0.470
---
.gitignore | 29 +
.gitmodules | 3 +
.travis.yml | 20 +
CONTRIBUTING.md | 152 +
CREDITS | 101 +
LICENSE | 228 ++
MANIFEST.in | 2 +
PKG-INFO | 29 -
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/test_typing.py | 37 +
lib-typing/3.2/test_typing.py | 38 +
lib-typing/3.2/typing.py | 18 +-
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/api.py | 56 +
mypy/build.py | 142 +-
mypy/checker.py | 182 +-
mypy/checkexpr.py | 217 +-
mypy/checkmember.py | 21 +-
mypy/constraints.py | 24 +-
mypy/erasetype.py | 7 +-
mypy/errors.py | 41 +-
mypy/expandtype.py | 11 +-
mypy/exprtotype.py | 6 +-
mypy/fastparse.py | 26 +-
mypy/fastparse2.py | 10 +-
mypy/fixup.py | 25 +-
mypy/git.py | 6 +-
mypy/indirection.py | 3 +
mypy/join.py | 25 +-
mypy/lex.py | 3 +-
mypy/main.py | 95 +-
mypy/meet.py | 30 +-
mypy/messages.py | 125 +-
mypy/myunit/__init__.py | 380 +++
mypy/myunit/__main__.py | 18 +
mypy/nodes.py | 20 +-
mypy/options.py | 25 +-
mypy/parse.py | 52 +-
mypy/report.py | 6 +-
mypy/sametypes.py | 17 +-
mypy/semanal.py | 107 +-
mypy/sharedparse.py | 100 +
mypy/strconv.py | 9 +-
mypy/stubgen.py | 22 +-
mypy/stubgenc.py | 51 +-
mypy/stubutil.py | 9 +-
mypy/subtypes.py | 265 +-
.../stdlib/3/email/mime => mypy/test}/__init__.py | 0
.../distutils/__init__.pyi => mypy/test/collect.py | 0
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 +++++
.../email/mime/__init__.pyi => mypy/test/update.py | 0
mypy/typeanal.py | 29 +-
mypy/types.py | 264 +-
mypy/version.py | 2 +-
mypy_self_check.ini | 15 +
mypy_strict_optional.ini | 5 +
pinfer/.gitignore | 3 +
pinfer/LICENSE | 27 +
pinfer/README | 47 +
.../2/wsgiref/__init__.pyi => pinfer/__init__.py | 0
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 | 35 +-
setup.py | 24 +-
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 +++++++++++
.../3.2/incomplete/urllib/__init__.py | 0
.../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 +++++
.../stdlib-samples/3.2/test/__init__.py | 0
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 | 940 ------
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 | 41 -
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 | 43 -
typeshed/stdlib/2/atexit.pyi | 5 -
typeshed/stdlib/2/base64.pyi | 25 -
typeshed/stdlib/2/binascii.pyi | 21 -
typeshed/stdlib/2/builtins.pyi | 940 ------
typeshed/stdlib/2/cPickle.pyi | 32 -
typeshed/stdlib/2/cStringIO.pyi | 50 -
typeshed/stdlib/2/calendar.pyi | 86 -
typeshed/stdlib/2/codecs.pyi | 202 --
typeshed/stdlib/2/collections.pyi | 108 -
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 -
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 -
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 | 83 -
typeshed/stdlib/2/io.pyi | 105 -
typeshed/stdlib/2/itertools.pyi | 87 -
typeshed/stdlib/2/json.pyi | 98 -
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 | 250 --
typeshed/stdlib/2/os/__init__.pyi | 302 --
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 | 206 --
typeshed/stdlib/2/posixpath.pyi | 50 -
typeshed/stdlib/2/pprint.pyi | 24 -
typeshed/stdlib/2/pwd.pyi | 18 -
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 | 12 -
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/simplejson/__init__.pyi | 10 -
typeshed/stdlib/2/simplejson/decoder.pyi | 6 -
typeshed/stdlib/2/simplejson/encoder.pyi | 9 -
typeshed/stdlib/2/simplejson/scanner.pyi | 7 -
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 | 255 --
typeshed/stdlib/2/ssl.pyi | 204 --
typeshed/stdlib/2/stat.pyi | 59 -
typeshed/stdlib/2/string.pyi | 74 -
typeshed/stdlib/2/strop.pyi | 73 -
typeshed/stdlib/2/struct.pyi | 28 -
typeshed/stdlib/2/subprocess.pyi | 109 -
typeshed/stdlib/2/sys.pyi | 136 -
typeshed/stdlib/2/syslog.pyi | 38 -
typeshed/stdlib/2/tempfile.pyi | 98 -
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 | 359 ---
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 | 56 -
typeshed/stdlib/2/uuid.pyi | 36 -
typeshed/stdlib/2/weakref.pyi | 47 -
typeshed/stdlib/2/wsgiref/validate.pyi | 47 -
typeshed/stdlib/2/xml/etree/ElementInclude.pyi | 19 -
typeshed/stdlib/2/xml/etree/ElementPath.pyi | 35 -
typeshed/stdlib/2/xml/etree/ElementTree.pyi | 116 -
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 | 127 -
typeshed/stdlib/2and3/bisect.pyi | 22 -
typeshed/stdlib/2and3/bz2.pyi | 6 -
typeshed/stdlib/2and3/cmath.pyi | 34 -
typeshed/stdlib/2and3/code.pyi | 27 -
typeshed/stdlib/2and3/colorsys.pyi | 15 -
typeshed/stdlib/2and3/contextlib.pyi | 53 -
typeshed/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
typeshed/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
typeshed/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
typeshed/stdlib/2and3/distutils/command/check.pyi | 0
typeshed/stdlib/2and3/distutils/command/clean.pyi | 0
typeshed/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
typeshed/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 -
typeshed/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 | 355 --
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 | 64 -
typeshed/stdlib/2and3/mimetypes.pyi | 38 -
typeshed/stdlib/2and3/mmap.pyi | 80 -
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/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 | 32 -
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 | 19 -
typeshed/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 -
typeshed/stdlib/3.2/xml/etree/__init__.pyi | 0
typeshed/stdlib/3.2/xml/etree/cElementTree.pyi | 5 -
typeshed/stdlib/3.3/ipaddress.pyi | 200 --
typeshed/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 -
typeshed/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 | 183 --
typeshed/stdlib/3.4/asyncio/futures.pyi | 47 -
typeshed/stdlib/3.4/asyncio/locks.pyi | 59 -
typeshed/stdlib/3.4/asyncio/protocols.pyi | 24 -
typeshed/stdlib/3.4/asyncio/queues.pyi | 47 -
typeshed/stdlib/3.4/asyncio/streams.pyi | 101 -
typeshed/stdlib/3.4/asyncio/subprocess.pyi | 60 -
typeshed/stdlib/3.4/asyncio/tasks.pyi | 57 -
typeshed/stdlib/3.4/asyncio/transports.pyi | 37 -
typeshed/stdlib/3.4/enum.pyi | 20 -
typeshed/stdlib/3.4/pathlib.pyi | 72 -
typeshed/stdlib/3.4/selectors.pyi | 90 -
typeshed/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 -
typeshed/stdlib/3.4/xml/etree/__init__.pyi | 0
typeshed/stdlib/3.4/xml/etree/cElementTree.pyi | 5 -
typeshed/stdlib/3.5/pathlib.pyi | 88 -
typeshed/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 -
typeshed/stdlib/3.5/xml/etree/__init__.pyi | 0
typeshed/stdlib/3.5/xml/etree/cElementTree.pyi | 5 -
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 | 295 --
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 | 14 -
typeshed/stdlib/3/_warnings.pyi | 11 -
typeshed/stdlib/3/abc.pyi | 13 -
typeshed/stdlib/3/array.pyi | 49 -
typeshed/stdlib/3/ast.pyi | 40 -
typeshed/stdlib/3/atexit.pyi | 9 -
typeshed/stdlib/3/base64.pyi | 25 -
typeshed/stdlib/3/binascii.pyi | 26 -
typeshed/stdlib/3/builtins.pyi | 898 ------
typeshed/stdlib/3/calendar.pyi | 86 -
typeshed/stdlib/3/cgi.pyi | 4 -
typeshed/stdlib/3/codecs.pyi | 194 --
typeshed/stdlib/3/collections/__init__.pyi | 163 -
typeshed/stdlib/3/collections/abc.pyi | 14 -
typeshed/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 | 15 -
typeshed/stdlib/3/concurrent/futures/thread.pyi | 11 -
typeshed/stdlib/3/configparser.pyi | 185 --
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 | 60 -
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 -
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 | 62 -
typeshed/stdlib/3/email/policy.pyi | 69 -
typeshed/stdlib/3/email/utils.pyi | 32 -
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 | 50 -
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 | 192 --
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 | 85 -
typeshed/stdlib/3/importlib/machinery.pyi | 178 -
typeshed/stdlib/3/importlib/util.pyi | 47 -
typeshed/stdlib/3/inspect.pyi | 289 --
typeshed/stdlib/3/io.pyi | 252 --
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 | 98 -
typeshed/stdlib/3/multiprocessing/managers.pyi | 10 -
typeshed/stdlib/3/multiprocessing/pool.pyi | 58 -
typeshed/stdlib/3/multiprocessing/process.pyi | 4 -
typeshed/stdlib/3/opcode.pyi | 18 -
typeshed/stdlib/3/os/__init__.pyi | 382 ---
typeshed/stdlib/3/os/path.pyi | 61 -
typeshed/stdlib/3/pdb.pyi | 30 -
typeshed/stdlib/3/pickle.pyi | 67 -
typeshed/stdlib/3/pipes.pyi | 19 -
typeshed/stdlib/3/platform.pyi | 35 -
typeshed/stdlib/3/posix.pyi | 7 -
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 | 255 --
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 | 162 -
typeshed/stdlib/3/sysconfig.pyi | 8 -
typeshed/stdlib/3/tempfile.pyi | 48 -
typeshed/stdlib/3/textwrap.pyi | 121 -
typeshed/stdlib/3/time.pyi | 75 -
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 | 149 -
typeshed/stdlib/3/typing.pyi | 448 ---
typeshed/stdlib/3/unicodedata.pyi | 37 -
typeshed/stdlib/3/unittest.pyi | 330 --
typeshed/stdlib/3/urllib/__init__.pyi | 0
typeshed/stdlib/3/urllib/error.pyi | 11 -
typeshed/stdlib/3/urllib/parse.pyi | 139 -
typeshed/stdlib/3/urllib/request.pyi | 199 --
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 -
typeshed/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 -
typeshed/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 | 148 -
typeshed/tests/pytype_test.py | 109 -
typeshed/third_party/2/Crypto/Cipher/AES.pyi | 0
typeshed/third_party/2/Crypto/Cipher/__init__.pyi | 15 -
typeshed/third_party/2/Crypto/Random/__init__.pyi | 5 -
typeshed/third_party/2/Crypto/Random/random.pyi | 3 -
typeshed/third_party/2/Crypto/__init__.pyi | 0
typeshed/third_party/2/OpenSSL/__init__.pyi | 0
typeshed/third_party/2/OpenSSL/crypto.pyi | 6 -
typeshed/third_party/2/boto/__init__.pyi | 78 -
typeshed/third_party/2/boto/connection.pyi | 108 -
typeshed/third_party/2/boto/ec2/__init__.pyi | 11 -
typeshed/third_party/2/boto/ec2/elb/__init__.pyi | 43 -
typeshed/third_party/2/boto/exception.pyi | 149 -
typeshed/third_party/2/concurrent/__init__.pyi | 0
.../third_party/2/concurrent/futures/__init__.pyi | 37 -
typeshed/third_party/2/croniter.pyi | 27 -
typeshed/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 --
typeshed/third_party/2/fb303/__init__.pyi | 0
typeshed/third_party/2/gflags.pyi | 216 --
typeshed/third_party/2/google/__init__.pyi | 0
.../third_party/2/google/protobuf/__init__.pyi | 1 -
.../third_party/2/google/protobuf/descriptor.pyi | 163 -
.../2/google/protobuf/descriptor_pb2.pyi | 2 -
.../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 -
.../third_party/2/google/protobuf/reflection.pyi | 10 -
typeshed/third_party/2/itsdangerous.pyi | 153 -
typeshed/third_party/2/kazoo/__init__.pyi | 4 -
typeshed/third_party/2/kazoo/client.pyi | 100 -
typeshed/third_party/2/kazoo/exceptions.pyi | 62 -
typeshed/third_party/2/kazoo/recipe/__init__.pyi | 4 -
typeshed/third_party/2/kazoo/recipe/watchers.pyi | 25 -
typeshed/third_party/2/pycurl.pyi | 81 -
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 | 15 -
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 | 133 -
.../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 | 4 -
.../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 | 4 -
.../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 | 7 -
.../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 | 21 -
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 -
typeshed/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/six/__init__.pyi | 89 -
typeshed/third_party/2/six/moves/__init__.pyi | 32 -
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 | 62 -
typeshed/third_party/2/sqlalchemy/sql/type_api.pyi | 9 -
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 -
typeshed/third_party/2/thrift/__init__.pyi | 0
.../2/thrift/protocol/TBinaryProtocol.pyi | 65 -
.../third_party/2/thrift/protocol/TProtocol.pyi | 79 -
.../third_party/2/thrift/protocol/__init__.pyi | 11 -
.../third_party/2/thrift/transport/TSocket.pyi | 32 -
.../third_party/2/thrift/transport/TTransport.pyi | 111 -
.../third_party/2/thrift/transport/__init__.pyi | 9 -
typeshed/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 | 50 -
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/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/backports/__init__.pyi | 0
.../2and3/backports/ssl_match_hostname.pyi | 3 -
typeshed/third_party/2and3/backports_abc.pyi | 19 -
typeshed/third_party/2and3/certifi.pyi | 2 -
typeshed/third_party/2and3/mypy_extensions.pyi | 6 -
typeshed/third_party/2and3/pytz/__init__.pyi | 25 -
typeshed/third_party/2and3/pytz/lazy.pyi | 13 -
typeshed/third_party/2and3/singledispatch.pyi | 5 -
typeshed/third_party/2and3/ujson.pyi | 45 -
typeshed/third_party/3/dateutil/__init__.pyi | 0
typeshed/third_party/3/dateutil/parser.pyi | 52 -
typeshed/third_party/3/dateutil/relativedelta.pyi | 86 -
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 | 20 -
typeshed/third_party/3/itsdangerous.pyi | 156 -
typeshed/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 | 310 --
typeshed/third_party/3/requests/__init__.pyi | 39 -
typeshed/third_party/3/requests/adapters.pyi | 72 -
typeshed/third_party/3/requests/api.pyi | 14 -
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 | 134 -
.../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 | 4 -
.../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 | 4 -
.../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 | 21 -
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 -
1013 files changed, 84183 insertions(+), 42328 deletions(-)
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..731180e
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,29 @@
+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
new file mode 100644
index 0000000..6b366ad
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "typeshed"]
+ path = typeshed
+ url = http://github.com/python/typeshed
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..4c25d0e
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,20 @@
+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
new file mode 100644
index 0000000..c01af3b
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,152 @@
+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
new file mode 100644
index 0000000..d4fe9ee
--- /dev/null
+++ b/CREDITS
@@ -0,0 +1,101 @@
+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
new file mode 100644
index 0000000..8145cc3
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,228 @@
+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/MANIFEST.in b/MANIFEST.in
new file mode 100644
index 0000000..e8e949f
--- /dev/null
+++ b/MANIFEST.in
@@ -0,0 +1,2 @@
+recursive-include scripts *
+recursive-exclude scripts myunit
diff --git a/PKG-INFO b/PKG-INFO
deleted file mode 100644
index 67929db..0000000
--- a/PKG-INFO
+++ /dev/null
@@ -1,29 +0,0 @@
-Metadata-Version: 1.1
-Name: mypy-lang
-Version: 0.4.6
-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: Topic :: Software Development
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..d4db725
--- /dev/null
+++ b/README.md
@@ -0,0 +1,307 @@
+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
new file mode 100644
index 0000000..80fd0f8
--- /dev/null
+++ b/appveyor.yml
@@ -0,0 +1,32 @@
+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
new file mode 100644
index 0000000..0a8547b
--- /dev/null
+++ b/build-requirements.txt
@@ -0,0 +1,2 @@
+setuptools
+wheel
diff --git a/conftest.py b/conftest.py
new file mode 100644
index 0000000..b2f3824
--- /dev/null
+++ b/conftest.py
@@ -0,0 +1,4 @@
+pytest_plugins = [
+ 'mypy.test.data',
+ 'pytest_cov',
+]
diff --git a/docs/Makefile b/docs/Makefile
new file mode 100644
index 0000000..be69e9d
--- /dev/null
+++ b/docs/Makefile
@@ -0,0 +1,177 @@
+# 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
new file mode 100644
index 0000000..2122eef
--- /dev/null
+++ b/docs/README.md
@@ -0,0 +1,49 @@
+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
new file mode 100755
index 0000000..1e3d843
--- /dev/null
+++ b/docs/make.bat
@@ -0,0 +1,242 @@
+ 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
new file mode 100644
index 0000000..d20641e
--- /dev/null
+++ b/docs/requirements-docs.txt
@@ -0,0 +1,2 @@
+Sphinx >= 1.4.4
+sphinx-rtd-theme >= 0.1.9
diff --git a/docs/source/additional_features.rst b/docs/source/additional_features.rst
new file mode 100644
index 0000000..b9dd07f
--- /dev/null
+++ b/docs/source/additional_features.rst
@@ -0,0 +1,9 @@
+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
new file mode 100644
index 0000000..572364d
--- /dev/null
+++ b/docs/source/basics.rst
@@ -0,0 +1,194 @@
+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
new file mode 100644
index 0000000..4426df7
--- /dev/null
+++ b/docs/source/builtin_types.rst
@@ -0,0 +1,37 @@
+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
new file mode 100644
index 0000000..900ee0c
--- /dev/null
+++ b/docs/source/casts.rst
@@ -0,0 +1,39 @@
+.. _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
new file mode 100644
index 0000000..3c74d6f
--- /dev/null
+++ b/docs/source/cheat_sheet.rst
@@ -0,0 +1,241 @@
+.. _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
new file mode 100644
index 0000000..cc9fef3
--- /dev/null
+++ b/docs/source/cheat_sheet_py3.rst
@@ -0,0 +1,288 @@
+.. _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
new file mode 100644
index 0000000..dc778d3
--- /dev/null
+++ b/docs/source/class_basics.rst
@@ -0,0 +1,157 @@
+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
new file mode 100644
index 0000000..e5d1a80
--- /dev/null
+++ b/docs/source/command_line.rst
@@ -0,0 +1,402 @@
+.. _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
new file mode 100644
index 0000000..3477d90
--- /dev/null
+++ b/docs/source/common_issues.rst
@@ -0,0 +1,386 @@
+.. _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
new file mode 100644
index 0000000..cf64842
--- /dev/null
+++ b/docs/source/conf.py
@@ -0,0 +1,268 @@
+# -*- 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
new file mode 100644
index 0000000..001f6c9
--- /dev/null
+++ b/docs/source/config_file.rst
@@ -0,0 +1,184 @@
+.. _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
new file mode 100644
index 0000000..a128b69
--- /dev/null
+++ b/docs/source/duck_type_compatibility.rst
@@ -0,0 +1,40 @@
+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
new file mode 100644
index 0000000..ba76442
--- /dev/null
+++ b/docs/source/dynamic_typing.rst
@@ -0,0 +1,86 @@
+.. _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
new file mode 100644
index 0000000..9fd73b4
--- /dev/null
+++ b/docs/source/faq.rst
@@ -0,0 +1,270 @@
+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
new file mode 100644
index 0000000..b55cddd
--- /dev/null
+++ b/docs/source/function_overloading.rst
@@ -0,0 +1,60 @@
+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
new file mode 100644
index 0000000..f6c0640
--- /dev/null
+++ b/docs/source/generics.rst
@@ -0,0 +1,390 @@
+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
new file mode 100644
index 0000000..a41c125
--- /dev/null
+++ b/docs/source/getting_started.rst
@@ -0,0 +1,24 @@
+.. _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
new file mode 100644
index 0000000..90cc749
--- /dev/null
+++ b/docs/source/index.rst
@@ -0,0 +1,42 @@
+.. 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
new file mode 100644
index 0000000..3bcd0ad
--- /dev/null
+++ b/docs/source/introduction.rst
@@ -0,0 +1,30 @@
+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
new file mode 100644
index 0000000..dc639d9
--- /dev/null
+++ b/docs/source/kinds_of_types.rst
@@ -0,0 +1,1002 @@
+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
new file mode 100644
index 0000000..2cb8f32
--- /dev/null
+++ b/docs/source/python2.rst
@@ -0,0 +1,136 @@
+.. _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
new file mode 100644
index 0000000..f676864
--- /dev/null
+++ b/docs/source/python36.rst
@@ -0,0 +1,100 @@
+.. _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
new file mode 100644
index 0000000..2537c51
--- /dev/null
+++ b/docs/source/revision_history.rst
@@ -0,0 +1,176 @@
+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
new file mode 100644
index 0000000..ca68d4c
--- /dev/null
+++ b/docs/source/supported_python_features.rst
@@ -0,0 +1,20 @@
+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
new file mode 100644
index 0000000..76e9cf9
--- /dev/null
+++ b/docs/source/type_inference_and_annotations.rst
@@ -0,0 +1,172 @@
+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
new file mode 100644
index 0000000..73b786b
--- /dev/null
+++ b/extensions/README.md
@@ -0,0 +1,6 @@
+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
new file mode 100644
index 0000000..26e568c
--- /dev/null
+++ b/extensions/mypy_extensions.py
@@ -0,0 +1,97 @@
+"""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
new file mode 100644
index 0000000..3490840
--- /dev/null
+++ b/extensions/setup.py
@@ -0,0 +1,44 @@
+#!/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/test_typing.py b/lib-typing/2.7/test_typing.py
index d095f84..39eb7c1 100644
--- a/lib-typing/2.7/test_typing.py
+++ b/lib-typing/2.7/test_typing.py
@@ -849,6 +849,43 @@ class GenericTests(BaseTestCase):
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]
diff --git a/lib-typing/3.2/test_typing.py b/lib-typing/3.2/test_typing.py
index 0910fd4..d203ce3 100644
--- a/lib-typing/3.2/test_typing.py
+++ b/lib-typing/3.2/test_typing.py
@@ -896,6 +896,44 @@ class GenericTests(BaseTestCase):
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]
diff --git a/lib-typing/3.2/typing.py b/lib-typing/3.2/typing.py
index 1a943ac..34845b7 100644
--- a/lib-typing/3.2/typing.py
+++ b/lib-typing/3.2/typing.py
@@ -870,6 +870,17 @@ def _make_subclasshook(cls):
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."""
@@ -967,7 +978,7 @@ class GenericMeta(TypingMeta, abc.ABCMeta):
return self
return self.__class__(self.__name__,
self.__bases__,
- dict(self.__dict__),
+ _no_slots_copy(self.__dict__),
tvars=_type_vars(ev_args) if ev_args else None,
args=ev_args,
origin=ev_origin,
@@ -1043,7 +1054,7 @@ class GenericMeta(TypingMeta, abc.ABCMeta):
args = params
return self.__class__(self.__name__,
self.__bases__,
- dict(self.__dict__),
+ _no_slots_copy(self.__dict__),
tvars=tvars,
args=args,
origin=self,
@@ -1059,7 +1070,8 @@ class GenericMeta(TypingMeta, abc.ABCMeta):
return issubclass(instance.__class__, self)
def __copy__(self):
- return self.__class__(self.__name__, self.__bases__, dict(self.__dict__),
+ return self.__class__(self.__name__, self.__bases__,
+ _no_slots_copy(self.__dict__),
self.__parameters__, self.__args__, self.__origin__,
self.__extra__, self.__orig_bases__)
diff --git a/misc/actions_stubs.py b/misc/actions_stubs.py
new file mode 100644
index 0000000..978af71
--- /dev/null
+++ b/misc/actions_stubs.py
@@ -0,0 +1,111 @@
+#!/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
new file mode 100644
index 0000000..643e2bf
--- /dev/null
+++ b/misc/analyze_cache.py
@@ -0,0 +1,189 @@
+#!/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
new file mode 100644
index 0000000..e9a758a
--- /dev/null
+++ b/misc/async_matrix.py
@@ -0,0 +1,120 @@
+#!/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
new file mode 100644
index 0000000..0b552bf
--- /dev/null
+++ b/misc/fix_annotate.py
@@ -0,0 +1,219 @@
+"""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
new file mode 100755
index 0000000..515e662
--- /dev/null
+++ b/misc/incremental_checker.py
@@ -0,0 +1,356 @@
+#!/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
new file mode 100644
index 0000000..67d80aa
--- /dev/null
+++ b/misc/macs.el
@@ -0,0 +1,22 @@
+; 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
new file mode 100644
index 0000000..e55f8cc
--- /dev/null
+++ b/misc/perf_checker.py
@@ -0,0 +1,93 @@
+#!/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
new file mode 100644
index 0000000..3da6b9d
--- /dev/null
+++ b/misc/remove-eol-whitespace.sh
@@ -0,0 +1,8 @@
+#!/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
new file mode 100644
index 0000000..9a91bb1
--- /dev/null
+++ b/misc/test_case_to_actual.py
@@ -0,0 +1,71 @@
+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
new file mode 100644
index 0000000..c44afe4
--- /dev/null
+++ b/misc/touch_checker.py
@@ -0,0 +1,151 @@
+#!/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
new file mode 100644
index 0000000..9200288
--- /dev/null
+++ b/misc/variadics.py
@@ -0,0 +1,54 @@
+"""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/api.py b/mypy/api.py
new file mode 100644
index 0000000..80f8d93
--- /dev/null
+++ b/mypy/api.py
@@ -0,0 +1,56 @@
+"""This module makes it possible to use mypy as part of a Python application.
+
+Since mypy still changes, the API was kept utterly simple and non-intrusive.
+It just mimics command line activation without starting a new interpreter.
+So the normal docs about the mypy command line apply.
+Changes in the command line version of mypy will be immediately useable.
+
+Just import this module and then call 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.
+Any pretty formatting is left to the caller.
+
+Trivial example of code using this module:
+
+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
+"""
+
+import sys
+from io import StringIO
+from typing import Tuple
+from mypy.main import main
+
+
+def run(params: str) -> Tuple[str, str]:
+ sys.argv = [''] + params.split()
+
+ old_stdout = sys.stdout
+ new_stdout = StringIO()
+ sys.stdout = new_stdout
+
+ old_stderr = sys.stderr
+ new_stderr = StringIO()
+ sys.stderr = new_stderr
+
+ try:
+ main(None)
+ except SystemExit:
+ pass
+
+ sys.stdout = old_stdout
+ sys.stderr = old_stderr
+
+ return new_stdout.getvalue(), new_stderr.getvalue()
diff --git a/mypy/build.py b/mypy/build.py
index cbc088f..85d06c8 100644
--- a/mypy/build.py
+++ b/mypy/build.py
@@ -301,7 +301,7 @@ CacheMeta = NamedTuple('CacheMeta',
])
# NOTE: dependencies + suppressed == all reachable imports;
# suppressed contains those reachable imports that were prevented by
-# --silent-imports or simply not found.
+# silent mode or simply not found.
# Priorities used for imports. (Here, top-level includes inside a class.)
@@ -368,12 +368,14 @@ class BuildManager:
self.reports = reports
self.options = options
self.version_id = version_id
- self.semantic_analyzer = SemanticAnalyzer(lib_path, self.errors)
+ self.modules = {} # type: Dict[str, MypyFile]
+ self.missing_modules = set() # type: Set[str]
+ self.semantic_analyzer = SemanticAnalyzer(self.modules, self.missing_modules,
+ lib_path, self.errors)
self.modules = self.semantic_analyzer.modules
self.semantic_analyzer_pass3 = ThirdPass(self.modules, self.errors)
self.all_types = {} # type: Dict[Expression, Type]
self.indirection_detector = TypeIndirectionVisitor()
- self.missing_modules = set() # type: Set[str]
self.stale_modules = set() # type: Set[str]
self.rechecked_modules = set() # type: Set[str]
@@ -451,7 +453,7 @@ class BuildManager:
"""Is there a file in the file system corresponding to module id?"""
return find_module(id, self.lib_path) is not None
- def parse_file(self, id: str, path: str, source: str) -> MypyFile:
+ def parse_file(self, id: str, path: str, source: str, ignore_errors: bool) -> MypyFile:
"""Parse the source of a file with the given name.
Raise CompileError if there is a parse error.
@@ -464,7 +466,7 @@ class BuildManager:
self.log("Bailing due to parse errors")
self.errors.raise_error()
- self.errors.set_file_ignored_lines(path, tree.ignored_lines)
+ self.errors.set_file_ignored_lines(path, tree.ignored_lines, ignore_errors)
return tree
def module_not_found(self, path: str, line: int, id: str) -> None:
@@ -481,7 +483,7 @@ class BuildManager:
else:
self.errors.report(line, 0, "Cannot find module named '{}'".format(id))
self.errors.report(line, 0, '(Perhaps setting MYPYPATH '
- 'or using the "--silent-imports" flag would help)',
+ 'or using the "--ignore-missing-imports" flag would help)',
severity='note', only_once=True)
def report_file(self, file: MypyFile, type_map: Dict[Expression, Type]) -> None:
@@ -781,7 +783,7 @@ def find_cache_meta(id: str, path: str, manager: BuildManager) -> Optional[Cache
# Ignore cache if (relevant) options aren't the same.
cached_options = m.options
- current_options = manager.options.select_options_affecting_cache()
+ current_options = manager.options.clone_for_module(id).select_options_affecting_cache()
if cached_options != current_options:
manager.trace('Metadata abandoned for {}: options differ'.format(id))
return None
@@ -1101,6 +1103,9 @@ class State:
# Options, specialized for this file
options = None # type: Options
+ # Whether to ignore all errors
+ ignore_all = False
+
def __init__(self,
id: Optional[str],
path: Optional[str],
@@ -1137,16 +1142,25 @@ class State:
file_id = '__builtin__'
path = find_module(file_id, manager.lib_path)
if path:
- # In silent mode, don't import .py files, except from stubs.
- if (self.options.silent_imports and
- path.endswith('.py') and (caller_state or ancestor_for)):
- # (Never silence builtins, even if it's a .py file;
- # this can happen in tests!)
- if (id != 'builtins' and
- not ((caller_state and
- caller_state.tree and
- caller_state.tree.is_stub))):
- if self.options.almost_silent:
+ # For non-stubs, look at options.follow_imports:
+ # - normal (default) -> fully analyze
+ # - silent -> analyze but silence errors
+ # - skip -> don't analyze, make the type Any
+ follow_imports = self.options.follow_imports
+ if (follow_imports != 'normal'
+ and path.endswith('.py') # Stubs are always normal
+ and id != 'builtins' # Builtins is always normal
+ and not (caller_state and
+ caller_state.tree and
+ caller_state.tree.is_stub)):
+ if follow_imports == 'silent':
+ # Still import it, but silence non-blocker errors.
+ manager.log("Silencing %s (%s)" % (path, id))
+ self.ignore_all = True
+ else:
+ # In 'error' mode, produce special error messages.
+ manager.log("Skipping %s (%s)" % (path, id))
+ if follow_imports == 'error':
if ancestor_for:
self.skipping_ancestor(id, path, ancestor_for)
else:
@@ -1159,9 +1173,7 @@ class State:
# misspelled module name, missing stub, module not in
# search path or the module has not been installed.
if caller_state:
- suppress_message = (self.options.silent_imports
- and not self.options.almost_silent)
- if not suppress_message:
+ if not self.options.ignore_missing_imports:
save_import_context = manager.errors.import_context()
manager.errors.set_import_context(caller_state.import_context)
manager.module_not_found(caller_state.xpath, caller_line, id)
@@ -1207,11 +1219,10 @@ class State:
manager = self.manager
manager.errors.set_import_context([])
manager.errors.set_file(ancestor_for.xpath)
- manager.errors.report(-1, -1, "Ancestor package '%s' silently ignored" % (id,),
- severity='note', only_once=True)
- manager.errors.report(-1, -1, "(Using --silent-imports, submodule passed on command line)",
+ manager.errors.report(-1, -1, "Ancestor package '%s' ignored" % (id,),
severity='note', only_once=True)
- manager.errors.report(-1, -1, "(This note brought to you by --almost-silent)",
+ manager.errors.report(-1, -1,
+ "(Using --follow-imports=error, submodule passed on command line)",
severity='note', only_once=True)
def skipping_module(self, id: str, path: str) -> None:
@@ -1222,12 +1233,10 @@ class State:
manager.errors.set_file(self.caller_state.xpath)
line = self.caller_line
manager.errors.report(line, 0,
- "Import of '%s' silently ignored" % (id,),
+ "Import of '%s' ignored" % (id,),
severity='note')
manager.errors.report(line, 0,
- "(Using --silent-imports, module not passed on command line)",
- severity='note', only_once=True)
- manager.errors.report(line, 0, "(This note courtesy of --almost-silent)",
+ "(Using --follow-imports=error, module not passed on command line)",
severity='note', only_once=True)
manager.errors.set_import_context(save_import_context)
@@ -1244,7 +1253,7 @@ class State:
"""Return whether the cache data for this file is fresh."""
# NOTE: self.dependencies may differ from
# self.meta.dependencies when a dependency is dropped due to
- # suppression by --silent-imports. However when a suppressed
+ # suppression by silent mode. However when a suppressed
# dependency is added back we find out later in the process.
return (self.meta is not None
and self.is_interface_fresh()
@@ -1303,24 +1312,25 @@ class State:
fixup_module_pass_two(self.tree, self.manager.modules)
def fix_suppressed_dependencies(self, graph: Graph) -> None:
- """Corrects whether dependencies are considered stale or not when using silent_imports.
+ """Corrects whether dependencies are considered stale in silent mode.
- This method is a hack to correct imports in silent_imports + incremental mode.
+ This method is a hack to correct imports in silent mode + incremental mode.
In particular, the problem is that when running mypy with a cold cache, the
`parse_file(...)` function is called *at the start* of the `load_graph(...)` function.
Note that load_graph will mark some dependencies as suppressed if they weren't specified
- on the command line in silent_imports mode.
+ on the command line in silent mode.
However, if the interface for a module is changed, parse_file will be called within
`process_stale_scc` -- *after* load_graph is finished, wiping out the changes load_graph
previously made.
This method is meant to be run after parse_file finishes in process_stale_scc and will
- recompute what modules should be considered suppressed in silent_import mode.
+ recompute what modules should be considered suppressed in silent mode.
"""
# TODO: See if it's possible to move this check directly into parse_file in some way.
# TODO: Find a way to write a test case for this fix.
- silent_mode = self.options.silent_imports or self.options.almost_silent
+ silent_mode = (self.options.ignore_missing_imports or
+ self.options.follow_imports == 'skip')
if not silent_mode:
return
@@ -1360,7 +1370,8 @@ class State:
except (UnicodeDecodeError, DecodeError) as decodeerr:
raise CompileError([
"mypy: can't decode file '{}': {}".format(self.path, str(decodeerr))])
- self.tree = manager.parse_file(self.id, self.xpath, source)
+ self.tree = manager.parse_file(self.id, self.xpath, source,
+ self.ignore_all or self.options.ignore_errors)
modules[self.id] = self.tree
@@ -1413,7 +1424,7 @@ class State:
# NOTE: What to do about race conditions (like editing the
# file while mypy runs)? A previous version of this code
# explicitly checked for this, but ran afoul of other reasons
- # for differences (e.g. --silent-imports).
+ # for differences (e.g. silent mode).
self.dependencies = dependencies
self.suppressed = suppressed
self.priorities = priorities
@@ -1509,12 +1520,71 @@ def dispatch(sources: List[BuildSource], manager: BuildManager) -> None:
manager.log("Mypy version %s" % __version__)
graph = load_graph(sources, manager)
manager.log("Loaded graph with %d nodes" % len(graph))
+ if manager.options.dump_graph:
+ dump_graph(graph)
+ return
process_graph(graph, manager)
if manager.options.warn_unused_ignores:
# TODO: This could also be a per-module option.
manager.errors.generate_unused_ignore_notes()
+class NodeInfo:
+ """Some info about a node in the graph of SCCs."""
+
+ def __init__(self, index: int, scc: List[str]) -> None:
+ self.node_id = "n%d" % index
+ self.scc = scc
+ self.sizes = {} # type: Dict[str, int] # mod -> size in bytes
+ self.deps = {} # type: Dict[str, int] # node_id -> pri
+
+ def dumps(self) -> str:
+ """Convert to JSON string."""
+ total_size = sum(self.sizes.values())
+ return "[%s, %s, %s,\n %s,\n %s]" % (json.dumps(self.node_id),
+ json.dumps(total_size),
+ json.dumps(self.scc),
+ json.dumps(self.sizes),
+ json.dumps(self.deps))
+
+
+def dump_graph(graph: Graph) -> None:
+ """Dump the graph as a JSON string to stdout.
+
+ This copies some of the work by process_graph()
+ (sorted_components() and order_ascc()).
+ """
+ nodes = []
+ sccs = sorted_components(graph)
+ for i, ascc in enumerate(sccs):
+ scc = order_ascc(graph, ascc)
+ node = NodeInfo(i, scc)
+ nodes.append(node)
+ inv_nodes = {} # module -> node_id
+ for node in nodes:
+ for mod in node.scc:
+ inv_nodes[mod] = node.node_id
+ for node in nodes:
+ for mod in node.scc:
+ state = graph[mod]
+ size = 0
+ if state.path:
+ try:
+ size = os.path.getsize(state.path)
+ except os.error:
+ pass
+ node.sizes[mod] = size
+ for dep in state.dependencies:
+ if dep in state.priorities:
+ pri = state.priorities[dep]
+ if dep in inv_nodes:
+ dep_id = inv_nodes[dep]
+ if (dep_id != node.node_id and
+ (dep_id not in node.deps or pri < node.deps[dep_id])):
+ node.deps[dep_id] = pri
+ print("[" + ",\n ".join(node.dumps() for node in nodes) + "\n]")
+
+
def load_graph(sources: List[BuildSource], manager: BuildManager) -> Graph:
"""Given some source files, load the full dependency graph."""
graph = {} # type: Graph
diff --git a/mypy/checker.py b/mypy/checker.py
index 2661452..6a1e10f 100644
--- a/mypy/checker.py
+++ b/mypy/checker.py
@@ -25,10 +25,11 @@ from mypy.nodes import (
DictionaryComprehension, ComplexExpr, EllipsisExpr, TypeAliasExpr,
RefExpr, YieldExpr, BackquoteExpr, ImportFrom, ImportAll, ImportBase,
AwaitExpr,
+ ARG_POS,
CONTRAVARIANT, COVARIANT)
from mypy import nodes
from mypy.types import (
- Type, AnyType, CallableType, Void, FunctionLike, Overloaded, TupleType,
+ Type, AnyType, CallableType, Void, FunctionLike, Overloaded, TupleType, TypedDictType,
Instance, NoneTyp, ErrorType, strip_type, TypeType,
UnionType, TypeVarId, TypeVarType, PartialType, DeletedType, UninhabitedType,
true_only, false_only, function_type
@@ -39,13 +40,13 @@ import mypy.checkexpr
from mypy.checkmember import map_type_from_supertype, bind_self, erase_to_bound
from mypy import messages
from mypy.subtypes import (
- is_subtype, is_equivalent, is_proper_subtype, is_more_precise, restrict_subtype_away,
- is_subtype_ignoring_tvars
+ is_subtype, is_equivalent, is_proper_subtype, is_more_precise,
+ restrict_subtype_away, is_subtype_ignoring_tvars
)
from mypy.maptype import map_instance_to_supertype
from mypy.semanal import fill_typevars, set_callable_name, refers_to_fullname
from mypy.erasetype import erase_typevars
-from mypy.expandtype import expand_type
+from mypy.expandtype import expand_type, expand_type_by_instance
from mypy.visitor import NodeVisitor
from mypy.join import join_types
from mypy.treetransform import TransformVisitor
@@ -181,6 +182,9 @@ class TypeChecker(NodeVisitor[Type]):
if all_ is not None and all_.type is not None:
seq_str = self.named_generic_type('typing.Sequence',
[self.named_type('builtins.str')])
+ if self.options.python_version[0] < 3:
+ seq_str = self.named_generic_type('typing.Sequence',
+ [self.named_type('builtins.unicode')])
if not is_subtype(all_.type, seq_str):
str_seq_s, all_s = self.msg.format_distinctly(seq_str, all_.type)
self.fail(messages.ALL_MUST_BE_SEQ_STR.format(str_seq_s, all_s),
@@ -546,10 +550,10 @@ class TypeChecker(NodeVisitor[Type]):
if fdef:
# Check if __init__ has an invalid, non-None return type.
- if (fdef.info and fdef.name() == '__init__' and
+ if (fdef.info and fdef.name() in ('__init__', '__init_subclass__') and
not isinstance(typ.ret_type, (Void, NoneTyp)) and
not self.dynamic_funcs[-1]):
- self.fail(messages.INIT_MUST_HAVE_NONE_RETURN_TYPE,
+ self.fail(messages.MUST_HAVE_NONE_RETURN_TYPE.format(fdef.name()),
item.type)
show_untyped = not self.is_typeshed_stub or self.options.warn_incomplete_stub
@@ -614,7 +618,7 @@ class TypeChecker(NodeVisitor[Type]):
if (isinstance(defn, FuncDef) and ref_type is not None and i == 0
and not defn.is_static
and typ.arg_kinds[0] not in [nodes.ARG_STAR, nodes.ARG_STAR2]):
- if defn.is_class or defn.name() == '__new__':
+ if defn.is_class or defn.name() in ('__new__', '__init_subclass__'):
ref_type = mypy.types.TypeType(ref_type)
erased = erase_to_bound(arg_type)
if not is_subtype_ignoring_tvars(ref_type, erased):
@@ -831,7 +835,7 @@ class TypeChecker(NodeVisitor[Type]):
def check_getattr_method(self, typ: CallableType, context: Context) -> None:
method_type = CallableType([AnyType(), self.named_type('builtins.str')],
[nodes.ARG_POS, nodes.ARG_POS],
- [None],
+ [None, None],
AnyType(),
self.named_type('builtins.function'))
if not is_subtype(typ, method_type):
@@ -932,7 +936,7 @@ class TypeChecker(NodeVisitor[Type]):
"""
# Use boolean variable to clarify code.
fail = False
- if not is_subtype(override, original):
+ if not is_subtype(override, original, ignore_pos_arg_names=True):
fail = True
elif (not isinstance(original, Overloaded) and
isinstance(override, Overloaded) and
@@ -1039,7 +1043,7 @@ class TypeChecker(NodeVisitor[Type]):
# Method override
first_sig = bind_self(first_type)
second_sig = bind_self(second_type)
- ok = is_subtype(first_sig, second_sig)
+ ok = is_subtype(first_sig, second_sig, ignore_pos_arg_names=True)
elif first_type and second_type:
ok = is_equivalent(first_type, second_type)
else:
@@ -1146,6 +1150,11 @@ class TypeChecker(NodeVisitor[Type]):
not new_syntax):
# Allow None's to be assigned to class variables with non-Optional types.
rvalue_type = lvalue_type
+ elif (isinstance(lvalue, MemberExpr) and
+ lvalue.kind is None): # Ignore member access to modules
+ instance_type = self.accept(lvalue.expr)
+ rvalue_type, infer_lvalue_type = self.check_member_assignment(
+ instance_type, lvalue_type, rvalue, lvalue)
else:
rvalue_type = self.check_simple_assignment(lvalue_type, rvalue, lvalue)
@@ -1430,6 +1439,7 @@ class TypeChecker(NodeVisitor[Type]):
"""
if var and not self.current_node_deferred:
var.type = type
+ var.is_inferred = True
self.store_type(lvalue, type)
def set_inference_error_fallback_type(self, var: Var, lvalue: Lvalue, type: Type,
@@ -1475,6 +1485,60 @@ class TypeChecker(NodeVisitor[Type]):
'{} has type'.format(lvalue_name))
return rvalue_type
+ def check_member_assignment(self, instance_type: Type, attribute_type: Type,
+ rvalue: Expression, context: Context) -> Tuple[Type, bool]:
+ """Type member assigment.
+
+ This is defers to check_simple_assignment, unless the member expression
+ is a descriptor, in which case this checks descriptor semantics as well.
+
+ Return the inferred rvalue_type and whether to infer anything about the attribute type
+ """
+ # Descriptors don't participate in class-attribute access
+ if ((isinstance(instance_type, FunctionLike) and instance_type.is_type_obj()) or
+ isinstance(instance_type, TypeType)):
+ rvalue_type = self.check_simple_assignment(attribute_type, rvalue, context)
+ return rvalue_type, True
+
+ if not isinstance(attribute_type, Instance):
+ rvalue_type = self.check_simple_assignment(attribute_type, rvalue, context)
+ return rvalue_type, True
+
+ if not attribute_type.type.has_readable_member('__set__'):
+ # If there is no __set__, we type-check that the assigned value matches
+ # the return type of __get__. This doesn't match the python semantics,
+ # (which allow you to override the descriptor with any value), but preserves
+ # the type of accessing the attribute (even after the override).
+ if attribute_type.type.has_readable_member('__get__'):
+ attribute_type = self.expr_checker.analyze_descriptor_access(
+ instance_type, attribute_type, context)
+ rvalue_type = self.check_simple_assignment(attribute_type, rvalue, context)
+ return rvalue_type, True
+
+ dunder_set = attribute_type.type.get_method('__set__')
+ if dunder_set is None:
+ self.msg.fail("{}.__set__ is not callable".format(attribute_type), context)
+ return AnyType(), False
+
+ function = function_type(dunder_set, self.named_type('builtins.function'))
+ bound_method = bind_self(function, attribute_type)
+ typ = map_instance_to_supertype(attribute_type, dunder_set.info)
+ dunder_set_type = expand_type_by_instance(bound_method, typ)
+
+ _, inferred_dunder_set_type = self.expr_checker.check_call(
+ dunder_set_type, [TempNode(instance_type), rvalue],
+ [nodes.ARG_POS, nodes.ARG_POS], context)
+
+ if not isinstance(inferred_dunder_set_type, CallableType):
+ self.fail("__set__ is not callable", context)
+ return AnyType(), True
+
+ if len(inferred_dunder_set_type.arg_types) < 2:
+ # A message already will have been recorded in check_call
+ return AnyType(), False
+
+ return inferred_dunder_set_type.arg_types[1], False
+
def check_indexed_assignment(self, lvalue: IndexExpr,
rvalue: Expression, context: Context) -> None:
"""Type check indexed assignment base[index] = rvalue.
@@ -1483,8 +1547,18 @@ class TypeChecker(NodeVisitor[Type]):
"""
self.try_infer_partial_type_from_indexed_assignment(lvalue, rvalue)
basetype = self.accept(lvalue.base)
- method_type = self.expr_checker.analyze_external_member_access(
- '__setitem__', basetype, context)
+ if isinstance(basetype, TypedDictType):
+ item_type = self.expr_checker.visit_typeddict_index_expr(basetype, lvalue.index)
+ method_type = CallableType(
+ arg_types=[self.named_type('builtins.str'), item_type],
+ arg_kinds=[ARG_POS, ARG_POS],
+ arg_names=[None, None],
+ ret_type=NoneTyp(),
+ fallback=self.named_type('builtins.function')
+ ) # type: Type
+ else:
+ method_type = self.expr_checker.analyze_external_member_access(
+ '__setitem__', basetype, context)
lvalue.method_type = method_type
self.expr_checker.check_call(method_type, [lvalue.index, rvalue],
[nodes.ARG_POS, nodes.ARG_POS],
@@ -2216,12 +2290,13 @@ class TypeChecker(NodeVisitor[Type]):
self.fail(msg, context)
return False
- def contains_none(self, t: Type):
+ def contains_none(self, t: Type) -> bool:
return (
isinstance(t, NoneTyp) or
(isinstance(t, UnionType) and any(self.contains_none(ut) for ut in t.items)) or
(isinstance(t, TupleType) and any(self.contains_none(tt) for tt in t.items)) or
- (isinstance(t, Instance) and t.args and any(self.contains_none(it) for it in t.args))
+ (isinstance(t, Instance) and bool(t.args)
+ and any(self.contains_none(it) for it in t.args))
)
def should_suppress_optional_error(self, related_types: List[Type]) -> bool:
@@ -2341,7 +2416,7 @@ class TypeChecker(NodeVisitor[Type]):
return partial_types
return None
- def is_unusable_type(self, typ: Type):
+ def is_unusable_type(self, typ: Type) -> bool:
"""Is this type an unusable type?
The two unusable types are Void and NoneTyp(is_ret_type=True).
@@ -2432,6 +2507,76 @@ def conditional_type_map(expr: Expression,
return {}, {}
+def partition_by_callable(type: Optional[Type]) -> Tuple[List[Type], List[Type]]:
+ """Takes in a type and partitions that type into callable subtypes and
+ uncallable subtypes.
+
+ Thus, given:
+ `callables, uncallables = partition_by_callable(type)`
+
+ If we assert `callable(type)` then `type` has type Union[*callables], and
+ If we assert `not callable(type)` then `type` has type Union[*uncallables]
+
+ Guaranteed to not return [], []"""
+ if isinstance(type, FunctionLike) or isinstance(type, TypeType):
+ return [type], []
+
+ if isinstance(type, AnyType):
+ return [type], [type]
+
+ if isinstance(type, UnionType):
+ callables = []
+ uncallables = []
+ for subtype in type.items:
+ subcallables, subuncallables = partition_by_callable(subtype)
+ callables.extend(subcallables)
+ uncallables.extend(subuncallables)
+ return callables, uncallables
+
+ if isinstance(type, TypeVarType):
+ return partition_by_callable(type.erase_to_union_or_bound())
+
+ if isinstance(type, Instance):
+ method = type.type.get_method('__call__')
+ if method:
+ callables, uncallables = partition_by_callable(method.type)
+ if len(callables) and not len(uncallables):
+ # Only consider the type callable if its __call__ method is
+ # definitely callable.
+ return [type], []
+ return [], [type]
+
+ return [], [type]
+
+
+def conditional_callable_type_map(expr: Expression,
+ current_type: Optional[Type],
+ ) -> Tuple[TypeMap, TypeMap]:
+ """Takes in an expression and the current type of the expression.
+
+ Returns a 2-tuple: The first element is a map from the expression to
+ the restricted type if it were callable. The second element is a
+ map from the expression to the type it would hold if it weren't
+ callable."""
+ if not current_type:
+ return {}, {}
+
+ if isinstance(current_type, AnyType):
+ return {}, {}
+
+ callables, uncallables = partition_by_callable(current_type)
+
+ if len(callables) and len(uncallables):
+ callable_map = {expr: UnionType.make_union(callables)} if len(callables) else None
+ uncallable_map = {expr: UnionType.make_union(uncallables)} if len(uncallables) else None
+ return callable_map, uncallable_map
+
+ elif len(callables):
+ return {}, None
+
+ return None, {}
+
+
def is_true_literal(n: Expression) -> bool:
return (refers_to_fullname(n, 'builtins.True')
or isinstance(n, IntExpr) and n.value == 1)
@@ -2505,7 +2650,7 @@ def find_isinstance_check(node: Expression,
type_map: Dict[Expression, Type],
) -> Tuple[TypeMap, TypeMap]:
"""Find any isinstance checks (within a chain of ands). Includes
- implicit and explicit checks for None.
+ implicit and explicit checks for None and calls to callable.
Return value is a map of variables to their types if the condition
is true and a map of variables to their types if the condition is false.
@@ -2526,6 +2671,11 @@ def find_isinstance_check(node: Expression,
vartype = type_map[expr]
type = get_isinstance_type(node.args[1], type_map)
return conditional_type_map(expr, vartype, type)
+ elif refers_to_fullname(node.callee, 'builtins.callable'):
+ expr = node.args[0]
+ if expr.literal == LITERAL_TYPE:
+ vartype = type_map[expr]
+ return conditional_callable_type_map(expr, vartype)
elif (isinstance(node, ComparisonExpr) and experiments.STRICT_OPTIONAL):
# Check for `x is None` and `x is not None`.
is_not = node.operators == ['is not']
diff --git a/mypy/checkexpr.py b/mypy/checkexpr.py
index 32cbbcb..d465ae4 100644
--- a/mypy/checkexpr.py
+++ b/mypy/checkexpr.py
@@ -1,12 +1,13 @@
"""Expression type checker. This file is conceptually part of TypeChecker."""
+from collections import OrderedDict
from typing import cast, Dict, Set, List, Iterable, Tuple, Callable, Union, Optional
from mypy.types import (
Type, AnyType, CallableType, Overloaded, NoneTyp, Void, TypeVarDef,
- TupleType, Instance, TypeVarId, TypeVarType, ErasedType, UnionType,
+ TupleType, TypedDictType, Instance, TypeVarId, TypeVarType, ErasedType, UnionType,
PartialType, DeletedType, UnboundType, UninhabitedType, TypeType,
- true_only, false_only, is_named_instance, function_type,
+ true_only, false_only, is_named_instance, function_type, callable_type, FunctionLike,
get_typ_args, set_typ_args,
)
from mypy.nodes import (
@@ -17,7 +18,7 @@ from mypy.nodes import (
ListComprehension, GeneratorExpr, SetExpr, MypyFile, Decorator,
ConditionalExpr, ComparisonExpr, TempNode, SetComprehension,
DictionaryComprehension, ComplexExpr, EllipsisExpr, StarExpr,
- TypeAliasExpr, BackquoteExpr, ARG_POS, ARG_NAMED, ARG_STAR2, MODULE_REF,
+ TypeAliasExpr, BackquoteExpr, ARG_POS, ARG_NAMED, ARG_STAR, ARG_STAR2, MODULE_REF,
UNBOUND_TVAR, BOUND_TVAR,
)
from mypy import nodes
@@ -29,13 +30,14 @@ from mypy.messages import MessageBuilder
from mypy import messages
from mypy.infer import infer_type_arguments, infer_function_type_arguments
from mypy import join
+from mypy.maptype import map_instance_to_supertype
from mypy.subtypes import is_subtype, is_equivalent
from mypy import applytype
from mypy import erasetype
-from mypy.checkmember import analyze_member_access, type_object_type
+from mypy.checkmember import analyze_member_access, type_object_type, bind_self
from mypy.constraints import get_actual_type
from mypy.checkstrformat import StringFormatterChecker
-from mypy.expandtype import expand_type
+from mypy.expandtype import expand_type, expand_type_by_instance
from mypy.util import split_module_names
from mypy.semanal import fill_typevars
@@ -169,6 +171,10 @@ class ExpressionChecker:
if e.analyzed:
# It's really a special form that only looks like a call.
return self.accept(e.analyzed, self.chk.type_context[-1])
+ if isinstance(e.callee, NameExpr) and isinstance(e.callee.node, TypeInfo) and \
+ e.callee.node.typeddict_type is not None:
+ return self.check_typeddict_call(e.callee.node.typeddict_type,
+ e.arg_kinds, e.arg_names, e.args, e)
self.try_infer_partial_type(e)
callee_type = self.accept(e.callee)
if (self.chk.options.disallow_untyped_calls and
@@ -178,6 +184,80 @@ class ExpressionChecker:
return self.msg.untyped_function_call(callee_type, e)
return self.check_call_expr_with_callee_type(callee_type, e)
+ def check_typeddict_call(self, callee: TypedDictType,
+ arg_kinds: List[int],
+ arg_names: List[str],
+ args: List[Expression],
+ context: Context) -> Type:
+ if len(args) >= 1 and all([ak == ARG_NAMED for ak in arg_kinds]):
+ # ex: Point(x=42, y=1337)
+ item_names = arg_names
+ item_args = args
+ return self.check_typeddict_call_with_kwargs(
+ callee, OrderedDict(zip(item_names, item_args)), context)
+
+ if len(args) == 1 and arg_kinds[0] == ARG_POS:
+ unique_arg = args[0]
+ if isinstance(unique_arg, DictExpr):
+ # ex: Point({'x': 42, 'y': 1337})
+ return self.check_typeddict_call_with_dict(callee, unique_arg, context)
+ if isinstance(unique_arg, CallExpr) and isinstance(unique_arg.analyzed, DictExpr):
+ # ex: Point(dict(x=42, y=1337))
+ return self.check_typeddict_call_with_dict(callee, unique_arg.analyzed, context)
+
+ if len(args) == 0:
+ # ex: EmptyDict()
+ return self.check_typeddict_call_with_kwargs(
+ callee, OrderedDict(), context)
+
+ self.chk.fail(messages.INVALID_TYPEDDICT_ARGS, context)
+ return AnyType()
+
+ def check_typeddict_call_with_dict(self, callee: TypedDictType,
+ kwargs: DictExpr,
+ context: Context) -> Type:
+ item_name_exprs = [item[0] for item in kwargs.items]
+ item_args = [item[1] for item in kwargs.items]
+
+ item_names = [] # List[str]
+ for item_name_expr in item_name_exprs:
+ if not isinstance(item_name_expr, StrExpr):
+ self.chk.fail(messages.TYPEDDICT_ITEM_NAME_MUST_BE_STRING_LITERAL, item_name_expr)
+ return AnyType()
+ item_names.append(item_name_expr.value)
+
+ return self.check_typeddict_call_with_kwargs(
+ callee, OrderedDict(zip(item_names, item_args)), context)
+
+ def check_typeddict_call_with_kwargs(self, callee: TypedDictType,
+ kwargs: 'OrderedDict[str, Expression]',
+ context: Context) -> Type:
+ if callee.items.keys() != kwargs.keys():
+ callee_item_names = callee.items.keys()
+ kwargs_item_names = kwargs.keys()
+
+ self.msg.typeddict_instantiated_with_unexpected_items(
+ expected_item_names=list(callee_item_names),
+ actual_item_names=list(kwargs_item_names),
+ context=context)
+ return AnyType()
+
+ items = OrderedDict() # type: OrderedDict[str, Type]
+ for (item_name, item_expected_type) in callee.items.items():
+ item_value = kwargs[item_name]
+
+ item_actual_type = self.chk.check_simple_assignment(
+ lvalue_type=item_expected_type, rvalue=item_value, context=item_value,
+ msg=messages.INCOMPATIBLE_TYPES,
+ lvalue_name='TypedDict item "{}"'.format(item_name),
+ rvalue_name='expression')
+ items[item_name] = item_actual_type
+
+ mapping_value_type = join.join_type_list(list(items.values()))
+ fallback = self.chk.named_generic_type('typing.Mapping',
+ [self.chk.str_type(), mapping_value_type])
+ return TypedDictType(items, fallback)
+
# Types and methods that can be used to infer partial types.
item_args = {'builtins.list': ['append'],
'builtins.set': ['add', 'discard'],
@@ -666,15 +746,21 @@ class ExpressionChecker:
if messages:
messages.too_few_arguments(callee, context, actual_names)
ok = False
+ elif kind == nodes.ARG_NAMED and (not formal_to_actual[i] and
+ not is_unexpected_arg_error):
+ # No actual for a mandatory named formal
+ if messages:
+ messages.missing_named_argument(callee, context, callee.arg_names[i])
+ ok = False
elif kind in [nodes.ARG_POS, nodes.ARG_OPT,
- nodes.ARG_NAMED] and is_duplicate_mapping(
+ nodes.ARG_NAMED, nodes.ARG_NAMED_OPT] and is_duplicate_mapping(
formal_to_actual[i], actual_kinds):
if (self.chk.in_checked_function() or
isinstance(actual_types[formal_to_actual[i][0]], TupleType)):
if messages:
messages.duplicate_argument_value(callee, i, context)
ok = False
- elif (kind == nodes.ARG_NAMED and formal_to_actual[i] and
+ elif (kind in (nodes.ARG_NAMED, nodes.ARG_NAMED_OPT) and formal_to_actual[i] and
actual_kinds[formal_to_actual[i][0]] not in [nodes.ARG_NAMED, nodes.ARG_STAR2]):
# Positional argument when expecting a keyword argument.
if messages:
@@ -898,10 +984,69 @@ class ExpressionChecker:
else:
# This is a reference to a non-module attribute.
original_type = self.accept(e.expr)
- return analyze_member_access(e.name, original_type, e,
- is_lvalue, False, False,
- self.named_type, self.not_ready_callback, self.msg,
- original_type=original_type, chk=self.chk)
+ member_type = analyze_member_access(
+ e.name, original_type, e, is_lvalue, False, False,
+ self.named_type, self.not_ready_callback, self.msg,
+ original_type=original_type, chk=self.chk)
+ if is_lvalue:
+ return member_type
+ else:
+ return self.analyze_descriptor_access(original_type, member_type, e)
+
+ def analyze_descriptor_access(self, instance_type: Type, descriptor_type: Type,
+ context: Context) -> Type:
+ """Type check descriptor access.
+
+ Arguments:
+ instance_type: The type of the instance on which the descriptor
+ attribute is being accessed (the type of ``a`` in ``a.f`` when
+ ``f`` is a descriptor).
+ descriptor_type: The type of the descriptor attribute being accessed
+ (the type of ``f`` in ``a.f`` when ``f`` is a descriptor).
+ context: The node defining the context of this inference.
+ Return:
+ The return type of the appropriate ``__get__`` overload for the descriptor.
+ """
+ if not isinstance(descriptor_type, Instance):
+ return descriptor_type
+
+ if not descriptor_type.type.has_readable_member('__get__'):
+ return descriptor_type
+
+ dunder_get = descriptor_type.type.get_method('__get__')
+
+ if dunder_get is None:
+ self.msg.fail("{}.__get__ is not callable".format(descriptor_type), context)
+ return AnyType()
+
+ function = function_type(dunder_get, self.named_type('builtins.function'))
+ bound_method = bind_self(function, descriptor_type)
+ typ = map_instance_to_supertype(descriptor_type, dunder_get.info)
+ dunder_get_type = expand_type_by_instance(bound_method, typ)
+ owner_type = None # type: Type
+
+ if isinstance(instance_type, FunctionLike) and instance_type.is_type_obj():
+ owner_type = instance_type.items()[0].ret_type
+ instance_type = NoneTyp()
+ elif isinstance(instance_type, TypeType):
+ owner_type = instance_type.item
+ instance_type = NoneTyp()
+ else:
+ owner_type = instance_type
+
+ _, inferred_dunder_get_type = self.check_call(
+ dunder_get_type, [TempNode(instance_type), TempNode(TypeType(owner_type))],
+ [nodes.ARG_POS, nodes.ARG_POS], context)
+
+ if isinstance(inferred_dunder_get_type, AnyType):
+ # check_call failed, and will have reported an error
+ return inferred_dunder_get_type
+
+ if not isinstance(inferred_dunder_get_type, CallableType):
+ self.msg.fail("{}.__get__ is not callable".format(descriptor_type), context)
+ return AnyType()
+
+ return inferred_dunder_get_type.ret_type
def analyze_external_member_access(self, member: str, base_type: Type,
context: Context) -> Type:
@@ -1290,6 +1435,8 @@ class ExpressionChecker:
else:
self.chk.fail(messages.TUPLE_INDEX_MUST_BE_AN_INT_LITERAL, e)
return AnyType()
+ elif isinstance(left_type, TypedDictType):
+ return self.visit_typeddict_index_expr(left_type, e.index)
else:
result, method_type = self.check_op('__getitem__', left_type, e.index, e)
e.method_type = method_type
@@ -1336,6 +1483,18 @@ class ExpressionChecker:
return -1 * operand.value
return None
+ def visit_typeddict_index_expr(self, td_type: TypedDictType, index: Expression) -> Type:
+ if not isinstance(index, (StrExpr, UnicodeExpr)):
+ self.msg.typeddict_item_name_must_be_string_literal(td_type, index)
+ return AnyType()
+ item_name = index.value
+
+ item_type = td_type.items.get(item_name)
+ if item_type is None:
+ self.msg.typeddict_item_name_not_found(td_type, item_name, index)
+ return AnyType()
+ return item_type
+
def visit_cast_expr(self, expr: CastExpr) -> Type:
"""Type check a cast expression."""
source_type = self.accept(expr.expr, context=AnyType())
@@ -1584,15 +1743,11 @@ class ExpressionChecker:
inferred_type = self.infer_lambda_type_using_context(e)
if not inferred_type:
# No useful type context.
- ret_type = e.expr().accept(self.chk)
- if not e.arguments:
- # Form 'lambda: e'; just use the inferred return type.
- return CallableType([], [], [], ret_type, self.named_type('builtins.function'))
- else:
- # TODO: Consider reporting an error. However, this is fine if
- # we are just doing the first pass in contextual type
- # inference.
- return AnyType()
+ ret_type = self.accept(e.expr())
+ if isinstance(ret_type, NoneTyp):
+ ret_type = Void()
+ fallback = self.named_type('builtins.function')
+ return callable_type(e, fallback, ret_type)
else:
# Type context available.
self.chk.check_func_item(e, type_override=inferred_type)
@@ -1606,13 +1761,19 @@ class ExpressionChecker:
return inferred_type
return replace_callable_return_type(inferred_type, ret_type)
- def infer_lambda_type_using_context(self, e: FuncExpr) -> CallableType:
+ def infer_lambda_type_using_context(self, e: FuncExpr) -> Optional[CallableType]:
"""Try to infer lambda expression type using context.
Return None if could not infer type.
"""
# TODO also accept 'Any' context
ctx = self.chk.type_context[-1]
+
+ if isinstance(ctx, UnionType):
+ callables = [t for t in ctx.items if isinstance(t, CallableType)]
+ if len(callables) == 1:
+ ctx = callables[0]
+
if not ctx or not isinstance(ctx, CallableType):
return None
@@ -1634,6 +1795,9 @@ class ExpressionChecker:
arg_kinds=arg_kinds
)
+ if ARG_STAR in arg_kinds or ARG_STAR2 in arg_kinds:
+ # TODO treat this case appropriately
+ return None
if callable_ctx.arg_kinds != arg_kinds:
# Incompatible context; cannot use it to infer types.
self.chk.fail(messages.CANNOT_INFER_LAMBDA_TYPE, e)
@@ -1898,7 +2062,7 @@ def map_actuals_to_formals(caller_kinds: List[int],
if kind == nodes.ARG_POS:
if j < ncallee:
if callee_kinds[j] in [nodes.ARG_POS, nodes.ARG_OPT,
- nodes.ARG_NAMED]:
+ nodes.ARG_NAMED, nodes.ARG_NAMED_OPT]:
map[j].append(i)
j += 1
elif callee_kinds[j] == nodes.ARG_STAR:
@@ -1920,14 +2084,14 @@ def map_actuals_to_formals(caller_kinds: List[int],
# Assume that it is an iterable (if it isn't, there will be
# an error later).
while j < ncallee:
- if callee_kinds[j] in (nodes.ARG_NAMED, nodes.ARG_STAR2):
+ if callee_kinds[j] in (nodes.ARG_NAMED, nodes.ARG_NAMED_OPT, nodes.ARG_STAR2):
break
else:
map[j].append(i)
if callee_kinds[j] == nodes.ARG_STAR:
break
j += 1
- elif kind == nodes.ARG_NAMED:
+ elif kind in (nodes.ARG_NAMED, nodes.ARG_NAMED_OPT):
name = caller_names[i]
if name in callee_names:
map[callee_names.index(name)].append(i)
@@ -2021,10 +2185,13 @@ def overload_arg_similarity(actual: Type, formal: Type) -> int:
if isinstance(formal, TypeVarType):
formal = formal.erase_to_union_or_bound()
if (isinstance(actual, UninhabitedType) or isinstance(actual, AnyType) or
- isinstance(formal, AnyType) or isinstance(formal, CallableType) or
+ isinstance(formal, AnyType) or
(isinstance(actual, Instance) and actual.type.fallback_to_any)):
# These could match anything at runtime.
return 2
+ if isinstance(formal, CallableType) and isinstance(actual, (CallableType, Overloaded)):
+ # TODO: do more sophisticated callable matching
+ return 2
if isinstance(actual, NoneTyp):
if not experiments.STRICT_OPTIONAL:
# NoneTyp matches anything if we're not doing strict Optional checking
diff --git a/mypy/checkmember.py b/mypy/checkmember.py
index 9a55103..31bd699 100644
--- a/mypy/checkmember.py
+++ b/mypy/checkmember.py
@@ -3,13 +3,15 @@
from typing import cast, Callable, List, Optional, TypeVar
from mypy.types import (
- Type, Instance, AnyType, TupleType, CallableType, FunctionLike, TypeVarDef,
+ Type, Instance, AnyType, TupleType, TypedDictType, CallableType, FunctionLike, TypeVarDef,
Overloaded, TypeVarType, UnionType, PartialType,
DeletedType, NoneTyp, TypeType, function_type
)
-from mypy.nodes import TypeInfo, FuncBase, Var, FuncDef, SymbolNode, Context, MypyFile
-from mypy.nodes import ARG_POS, ARG_STAR, ARG_STAR2
-from mypy.nodes import Decorator, OverloadedFuncDef
+from mypy.nodes import (
+ TypeInfo, FuncBase, Var, FuncDef, SymbolNode, Context, MypyFile, TypeVarExpr,
+ ARG_POS, ARG_STAR, ARG_STAR2,
+ Decorator, OverloadedFuncDef,
+)
from mypy.messages import MessageBuilder
from mypy.maptype import map_instance_to_supertype
from mypy.expandtype import expand_type_by_instance, expand_type
@@ -116,6 +118,11 @@ def analyze_member_access(name: str,
return analyze_member_access(name, typ.fallback, node, is_lvalue, is_super,
is_operator, builtin_type, not_ready_callback, msg,
original_type=original_type, chk=chk)
+ elif isinstance(typ, TypedDictType):
+ # Actually look up from the fallback instance type.
+ return analyze_member_access(name, typ.fallback, node, is_lvalue, is_super,
+ is_operator, builtin_type, not_ready_callback, msg,
+ original_type=original_type, chk=chk)
elif isinstance(typ, FunctionLike) and typ.is_type_obj():
# Class attribute.
# TODO super?
@@ -205,6 +212,7 @@ def analyze_member_var_access(name: str, itype: Instance, info: TypeInfo,
if isinstance(vv, Decorator):
# The associated Var node of a decorator contains the type.
v = vv.var
+
if isinstance(v, Var):
return analyze_var(name, v, itype, info, node, is_lvalue, msg,
original_type, not_ready_callback)
@@ -373,6 +381,9 @@ def analyze_class_attribute_access(itype: Instance,
not_ready_callback(name, context)
return AnyType()
+ if isinstance(node.node, TypeVarExpr):
+ return TypeVarType(node.tvar_def, node.tvar_def.line, node.tvar_def.column)
+
if isinstance(node.node, TypeInfo):
return type_object_type(node.node, builtin_type)
@@ -604,7 +615,7 @@ def bind_self(method: F, original_type: Type = None) -> F:
return cast(F, res)
-def erase_to_bound(t: Type):
+def erase_to_bound(t: Type) -> Type:
if isinstance(t, TypeVarType):
return t.upper_bound
if isinstance(t, TypeType):
diff --git a/mypy/constraints.py b/mypy/constraints.py
index e26e583..1d1e1c3 100644
--- a/mypy/constraints.py
+++ b/mypy/constraints.py
@@ -1,11 +1,11 @@
"""Type inference constraints."""
-from typing import List, Optional
+from typing import Iterable, List, Optional
from mypy.types import (
CallableType, Type, TypeVisitor, UnboundType, AnyType, Void, NoneTyp, TypeVarType,
- Instance, TupleType, UnionType, Overloaded, ErasedType, PartialType, DeletedType,
- UninhabitedType, TypeType, TypeVarId, is_named_instance
+ Instance, TupleType, TypedDictType, UnionType, Overloaded, ErasedType, PartialType,
+ DeletedType, UninhabitedType, TypeType, TypeVarId, is_named_instance
)
from mypy.maptype import map_instance_to_supertype
from mypy import nodes
@@ -342,11 +342,27 @@ class ConstraintBuilderVisitor(TypeVisitor[List[Constraint]]):
else:
return []
+ def visit_typeddict_type(self, template: TypedDictType) -> List[Constraint]:
+ actual = self.actual
+ if isinstance(actual, TypedDictType):
+ res = [] # type: List[Constraint]
+ # NOTE: Non-matching keys are ignored. Compatibility is checked
+ # elsewhere so this shouldn't be unsafe.
+ for (item_name, template_item_type, actual_item_type) in template.zip(actual):
+ res.extend(infer_constraints(template_item_type,
+ actual_item_type,
+ self.direction))
+ return res
+ elif isinstance(actual, AnyType):
+ return self.infer_against_any(template.items.values())
+ else:
+ return []
+
def visit_union_type(self, template: UnionType) -> List[Constraint]:
assert False, ("Unexpected UnionType in ConstraintBuilderVisitor"
" (should have been handled in infer_constraints)")
- def infer_against_any(self, types: List[Type]) -> List[Constraint]:
+ def infer_against_any(self, types: Iterable[Type]) -> List[Constraint]:
res = [] # type: List[Constraint]
for t in types:
res.extend(infer_constraints(t, AnyType(), self.direction))
diff --git a/mypy/erasetype.py b/mypy/erasetype.py
index 3f53f75..47a0d72 100644
--- a/mypy/erasetype.py
+++ b/mypy/erasetype.py
@@ -2,8 +2,8 @@ from typing import Optional, Container, Callable
from mypy.types import (
Type, TypeVisitor, UnboundType, ErrorType, AnyType, Void, NoneTyp, TypeVarId,
- Instance, TypeVarType, CallableType, TupleType, UnionType, Overloaded, ErasedType,
- PartialType, DeletedType, TypeTranslator, TypeList, UninhabitedType, TypeType
+ Instance, TypeVarType, CallableType, TupleType, TypedDictType, UnionType, Overloaded,
+ ErasedType, PartialType, DeletedType, TypeTranslator, TypeList, UninhabitedType, TypeType
)
from mypy import experiments
@@ -78,6 +78,9 @@ class EraseTypeVisitor(TypeVisitor[Type]):
def visit_tuple_type(self, t: TupleType) -> Type:
return t.fallback.accept(self)
+ def visit_typeddict_type(self, t: TypedDictType) -> Type:
+ return t.fallback.accept(self)
+
def visit_union_type(self, t: UnionType) -> Type:
return AnyType() # XXX: return underlying type if only one?
diff --git a/mypy/errors.py b/mypy/errors.py
index 373f6e7..702031d 100644
--- a/mypy/errors.py
+++ b/mypy/errors.py
@@ -47,7 +47,8 @@ class ErrorInfo:
def __init__(self, import_ctx: List[Tuple[str, int]], file: str, typ: str,
function_or_member: str, line: int, column: int, severity: str,
- message: str, blocker: bool, only_once: bool) -> None:
+ message: str, blocker: bool, only_once: bool,
+ origin: Tuple[str, int] = None) -> None:
self.import_ctx = import_ctx
self.file = file
self.type = typ
@@ -58,6 +59,7 @@ class ErrorInfo:
self.message = message
self.blocker = blocker
self.only_once = only_once
+ self.origin = origin or (file, line)
class Errors:
@@ -91,16 +93,19 @@ class Errors:
# Lines on which an error was actually ignored.
used_ignored_lines = None # type: Dict[str, Set[int]]
+ # Files where all errors should be ignored.
+ ignored_files = None # type: Set[str]
+
# Collection of reported only_once messages.
only_once_messages = None # type: Set[str]
- # Set to True to suppress "In function "foo":" messages.
- hide_error_context = False # type: bool
+ # Set to False to show "In function "foo":" messages.
+ hide_error_context = True # type: bool
# Set to True to show column numbers in error messages
show_column_numbers = False # type: bool
- def __init__(self, hide_error_context: bool = False,
+ def __init__(self, hide_error_context: bool = True,
show_column_numbers: bool = False) -> None:
self.error_info = []
self.import_ctx = []
@@ -108,6 +113,7 @@ class Errors:
self.function_or_member = [None]
self.ignored_lines = OrderedDict()
self.used_ignored_lines = defaultdict(set)
+ self.ignored_files = set()
self.only_once_messages = set()
self.hide_error_context = hide_error_context
self.show_column_numbers = show_column_numbers
@@ -142,8 +148,12 @@ class Errors:
# processed.
self.file = file
- def set_file_ignored_lines(self, file: str, ignored_lines: Set[int] = None) -> None:
+ def set_file_ignored_lines(self, file: str,
+ ignored_lines: Set[int] = None,
+ ignore_all: bool = False) -> None:
self.ignored_lines[file] = ignored_lines
+ if ignore_all:
+ self.ignored_files.add(file)
def push_function(self, name: str) -> None:
"""Set the current function or member short name (it can be None)."""
@@ -168,7 +178,8 @@ class Errors:
self.import_ctx = ctx[:]
def report(self, line: int, column: int, message: str, blocker: bool = False,
- severity: str = 'error', file: str = None, only_once: bool = False) -> None:
+ severity: str = 'error', file: str = None, only_once: bool = False,
+ origin_line: int = None) -> None:
"""Report message at the given line using the current error context.
Args:
@@ -178,6 +189,7 @@ class Errors:
severity: 'error', 'note' or 'warning'
file: if non-None, override current file as context
only_once: if True, only report this exact message once per build
+ origin_line: if non-None, override current context as origin
"""
type = self.type_name[-1]
if len(self.function_or_member) > 2:
@@ -186,16 +198,19 @@ class Errors:
file = self.file
info = ErrorInfo(self.import_context(), file, type,
self.function_or_member[-1], line, column, severity, message,
- blocker, only_once)
+ blocker, only_once,
+ origin=(self.file, origin_line) if origin_line else None)
self.add_error_info(info)
def add_error_info(self, info: ErrorInfo) -> None:
- if (info.file in self.ignored_lines and
- info.line in self.ignored_lines[info.file] and
- not info.blocker):
- # Annotation requests us to ignore all errors on this line.
- self.used_ignored_lines[info.file].add(info.line)
- return
+ (file, line) = info.origin
+ if not info.blocker: # Blockers cannot be ignored
+ if file in self.ignored_lines and line in self.ignored_lines[file]:
+ # Annotation requests us to ignore all errors on this line.
+ self.used_ignored_lines[file].add(line)
+ return
+ if file in self.ignored_files:
+ return
if info.only_once:
if info.message in self.only_once_messages:
return
diff --git a/mypy/expandtype.py b/mypy/expandtype.py
index c1ff808..785c77d 100644
--- a/mypy/expandtype.py
+++ b/mypy/expandtype.py
@@ -1,9 +1,9 @@
-from typing import Dict, List
+from typing import Dict, Iterable, List
from mypy.types import (
Type, Instance, CallableType, TypeVisitor, UnboundType, ErrorType, AnyType,
- Void, NoneTyp, TypeVarType, Overloaded, TupleType, UnionType, ErasedType, TypeList,
- PartialType, DeletedType, UninhabitedType, TypeType, TypeVarId
+ Void, NoneTyp, TypeVarType, Overloaded, TupleType, TypedDictType, UnionType,
+ ErasedType, TypeList, PartialType, DeletedType, UninhabitedType, TypeType, TypeVarId
)
@@ -93,6 +93,9 @@ class ExpandTypeVisitor(TypeVisitor[Type]):
def visit_tuple_type(self, t: TupleType) -> Type:
return t.copy_modified(items=self.expand_types(t.items))
+ def visit_typeddict_type(self, t: TypedDictType) -> Type:
+ return t.copy_modified(item_types=self.expand_types(t.items.values()))
+
def visit_union_type(self, t: UnionType) -> Type:
# After substituting for type variables in t.items,
# some of the resulting types might be subtypes of others.
@@ -108,7 +111,7 @@ class ExpandTypeVisitor(TypeVisitor[Type]):
item = t.item.accept(self)
return TypeType(item)
- def expand_types(self, types: List[Type]) -> List[Type]:
+ def expand_types(self, types: Iterable[Type]) -> List[Type]:
a = [] # type: List[Type]
for t in types:
a.append(t.accept(self))
diff --git a/mypy/exprtotype.py b/mypy/exprtotype.py
index 293454e..abc091a 100644
--- a/mypy/exprtotype.py
+++ b/mypy/exprtotype.py
@@ -2,7 +2,7 @@
from mypy.nodes import (
Expression, NameExpr, MemberExpr, IndexExpr, TupleExpr,
- ListExpr, StrExpr, BytesExpr, EllipsisExpr
+ ListExpr, StrExpr, BytesExpr, UnicodeExpr, EllipsisExpr
)
from mypy.parsetype import parse_str_as_type, TypeParseError
from mypy.types import Type, UnboundType, TypeList, EllipsisType
@@ -37,13 +37,15 @@ def expr_to_unanalyzed_type(expr: Expression) -> Type:
else:
args = [expr.index]
base.args = [expr_to_unanalyzed_type(arg) for arg in args]
+ if not base.args:
+ base.empty_tuple_index = True
return base
else:
raise TypeTranslationError()
elif isinstance(expr, ListExpr):
return TypeList([expr_to_unanalyzed_type(t) for t in expr.items],
line=expr.line, column=expr.column)
- elif isinstance(expr, (StrExpr, BytesExpr)):
+ elif isinstance(expr, (StrExpr, BytesExpr, UnicodeExpr)):
# Parse string literal type.
try:
result = parse_str_as_type(expr.value, expr.line)
diff --git a/mypy/fastparse.py b/mypy/fastparse.py
index 7463b9a..b882124 100644
--- a/mypy/fastparse.py
+++ b/mypy/fastparse.py
@@ -2,6 +2,7 @@ from functools import wraps
import sys
from typing import Tuple, Union, TypeVar, Callable, Sequence, Optional, Any, cast, List
+from mypy.sharedparse import special_function_elide_names, argument_elide_name
from mypy.nodes import (
MypyFile, Node, ImportBase, Import, ImportAll, ImportFrom, FuncDef, OverloadedFuncDef,
ClassDef, Decorator, Block, Var, OperatorAssignmentStmt,
@@ -15,7 +16,7 @@ from mypy.nodes import (
StarExpr, YieldFromExpr, NonlocalDecl, DictionaryComprehension,
SetComprehension, ComplexExpr, EllipsisExpr, YieldExpr, Argument,
AwaitExpr, TempNode, Expression, Statement,
- ARG_POS, ARG_OPT, ARG_STAR, ARG_NAMED, ARG_STAR2
+ ARG_POS, ARG_OPT, ARG_STAR, ARG_NAMED, ARG_NAMED_OPT, ARG_STAR2
)
from mypy.types import (
Type, CallableType, AnyType, UnboundType, TupleType, TypeList, EllipsisType,
@@ -261,7 +262,10 @@ class ASTConverter(ast35.NodeTransformer):
args = self.transform_args(n.args, n.lineno)
arg_kinds = [arg.kind for arg in args]
- arg_names = [arg.variable.name() for arg in args]
+ arg_names = [arg.variable.name() for arg in args] # type: List[Optional[str]]
+ arg_names = [None if argument_elide_name(name) else name for name in arg_names]
+ if special_function_elide_names(n.name):
+ arg_names = [None] * len(arg_names)
arg_types = None # type: List[Type]
if n.type_comment is not None:
try:
@@ -300,10 +304,12 @@ class ASTConverter(ast35.NodeTransformer):
raise FastParserError('Type signature has too many arguments', n.lineno, offset=0)
if len(arg_types) < len(arg_kinds):
raise FastParserError('Type signature has too few arguments', n.lineno, offset=0)
- func_type = CallableType([a if a is not None else AnyType() for a in arg_types],
+ func_type = CallableType([a if a is not None else
+ AnyType(implicit=True) for a in arg_types],
arg_kinds,
arg_names,
- return_type if return_type is not None else AnyType(),
+ return_type if return_type is not None else
+ AnyType(implicit=True),
None)
func_def = FuncDef(n.name,
@@ -356,14 +362,12 @@ class ASTConverter(ast35.NodeTransformer):
if args.vararg is not None:
new_args.append(make_argument(args.vararg, None, ARG_STAR))
- num_no_kw_defaults = len(args.kwonlyargs) - len(args.kw_defaults)
- # keyword-only arguments without defaults
- for a in args.kwonlyargs[:num_no_kw_defaults]:
- new_args.append(make_argument(a, None, ARG_NAMED))
-
# keyword-only arguments with defaults
- for a, d in zip(args.kwonlyargs[num_no_kw_defaults:], args.kw_defaults):
- new_args.append(make_argument(a, d, ARG_NAMED))
+ for a, d in zip(args.kwonlyargs, args.kw_defaults):
+ new_args.append(make_argument(
+ a,
+ d,
+ ARG_NAMED if d is None else ARG_NAMED_OPT))
# **kwarg
if args.kwarg is not None:
diff --git a/mypy/fastparse2.py b/mypy/fastparse2.py
index 19af86c..b1759db 100644
--- a/mypy/fastparse2.py
+++ b/mypy/fastparse2.py
@@ -18,6 +18,7 @@ from functools import wraps
import sys
from typing import Tuple, Union, TypeVar, Callable, Sequence, Optional, Any, cast, List
+from mypy.sharedparse import special_function_elide_names, argument_elide_name
from mypy.nodes import (
MypyFile, Node, ImportBase, Import, ImportAll, ImportFrom, FuncDef, OverloadedFuncDef,
ClassDef, Decorator, Block, Var, OperatorAssignmentStmt,
@@ -270,7 +271,11 @@ class ASTConverter(ast27.NodeTransformer):
args = self.transform_args(n.args, n.lineno)
arg_kinds = [arg.kind for arg in args]
- arg_names = [arg.variable.name() for arg in args]
+ arg_names = [arg.variable.name() for arg in args] # type: List[Optional[str]]
+ arg_names = [None if argument_elide_name(name) else name for name in arg_names]
+ if special_function_elide_names(n.name):
+ arg_names = [None] * len(arg_names)
+
arg_types = None # type: List[Type]
if n.type_comment is not None and len(n.type_comment) > 0:
try:
@@ -538,7 +543,8 @@ class ASTConverter(ast27.NodeTransformer):
keywords.append(ast27.keyword("file", n.dest))
if not n.nl:
- keywords.append(ast27.keyword("end", ast27.Str(" ", lineno=n.lineno, col_offset=-1)))
+ keywords.append(ast27.keyword("end", ast27.Str(" ", 0,
+ lineno=n.lineno, col_offset=-1)))
# TODO: Rather then desugaring Print into an intermediary ast27.Call object, it might
# be more efficient to just directly create a mypy.node.CallExpr object.
diff --git a/mypy/fixup.py b/mypy/fixup.py
index 147238d..8375b9f 100644
--- a/mypy/fixup.py
+++ b/mypy/fixup.py
@@ -2,13 +2,17 @@
from typing import Any, Dict, Optional
-from mypy.nodes import (MypyFile, SymbolNode, SymbolTable, SymbolTableNode,
- TypeInfo, FuncDef, OverloadedFuncDef, Decorator, Var,
- TypeVarExpr, ClassDef,
- LDEF, MDEF, GDEF)
-from mypy.types import (CallableType, EllipsisType, Instance, Overloaded, TupleType,
- TypeList, TypeVarType, UnboundType, UnionType, TypeVisitor,
- TypeType)
+from mypy.nodes import (
+ MypyFile, SymbolNode, SymbolTable, SymbolTableNode,
+ TypeInfo, FuncDef, OverloadedFuncDef, Decorator, Var,
+ TypeVarExpr, ClassDef,
+ LDEF, MDEF, GDEF
+)
+from mypy.types import (
+ CallableType, EllipsisType, Instance, Overloaded, TupleType, TypedDictType,
+ TypeList, TypeVarType, UnboundType, UnionType, TypeVisitor,
+ TypeType
+)
from mypy.visitor import NodeVisitor
@@ -192,6 +196,13 @@ class TypeFixer(TypeVisitor[None]):
if tt.fallback is not None:
tt.fallback.accept(self)
+ def visit_typeddict_type(self, tdt: TypedDictType) -> None:
+ if tdt.items:
+ for it in tdt.items.values():
+ it.accept(self)
+ if tdt.fallback is not None:
+ tdt.fallback.accept(self)
+
def visit_type_list(self, tl: TypeList) -> None:
for t in tl.items:
t.accept(self)
diff --git a/mypy/git.py b/mypy/git.py
index 355ef9b..453a025 100644
--- a/mypy/git.py
+++ b/mypy/git.py
@@ -6,6 +6,10 @@ import pipes
import subprocess
import sys
+MYPY = False
+if MYPY:
+ from typing import Iterator
+
def is_git_repo(dir: str) -> bool:
"""Is the given directory version-controlled with git?"""
@@ -23,7 +27,7 @@ def have_git() -> bool:
return False
-def get_submodules(dir: str):
+def get_submodules(dir: str) -> "Iterator[str]":
"""Return a list of all git top-level submodules in a given directory."""
# It would be nicer to do
# "git submodule foreach 'echo MODULE $name $path $sha1 $toplevel'"
diff --git a/mypy/indirection.py b/mypy/indirection.py
index 77c5a59..b36d999 100644
--- a/mypy/indirection.py
+++ b/mypy/indirection.py
@@ -87,6 +87,9 @@ class TypeIndirectionVisitor(TypeVisitor[Set[str]]):
def visit_tuple_type(self, t: types.TupleType) -> Set[str]:
return self._visit(*t.items) | self._visit(t.fallback)
+ def visit_typeddict_type(self, t: types.TypedDictType) -> Set[str]:
+ return self._visit(*t.items.values()) | self._visit(t.fallback)
+
def visit_star_type(self, t: types.StarType) -> Set[str]:
return set()
diff --git a/mypy/join.py b/mypy/join.py
index 6d86106..d14b83d 100644
--- a/mypy/join.py
+++ b/mypy/join.py
@@ -1,10 +1,11 @@
"""Calculation of the least upper bound types (joins)."""
-from typing import List
+from collections import OrderedDict
+from typing import cast, List
from mypy.types import (
Type, AnyType, NoneTyp, Void, TypeVisitor, Instance, UnboundType,
- ErrorType, TypeVarType, CallableType, TupleType, ErasedType, TypeList,
+ ErrorType, TypeVarType, CallableType, TupleType, TypedDictType, ErasedType, TypeList,
UnionType, FunctionLike, Overloaded, PartialType, DeletedType,
UninhabitedType, TypeType, true_or_false
)
@@ -170,6 +171,8 @@ class TypeJoinVisitor(TypeVisitor[Type]):
return join_types(t, self.s.fallback)
elif isinstance(self.s, TypeType):
return join_types(t, self.s)
+ elif isinstance(self.s, TypedDictType):
+ return join_types(t, self.s)
else:
return self.default(self.s)
@@ -234,13 +237,27 @@ class TypeJoinVisitor(TypeVisitor[Type]):
items = [] # type: List[Type]
for i in range(t.length()):
items.append(self.join(t.items[i], self.s.items[i]))
- # join fallback types if they are different
fallback = join_instances(self.s.fallback, t.fallback)
assert isinstance(fallback, Instance)
return TupleType(items, fallback)
else:
return self.default(self.s)
+ def visit_typeddict_type(self, t: TypedDictType) -> Type:
+ if isinstance(self.s, TypedDictType):
+ items = OrderedDict([
+ (item_name, s_item_type)
+ for (item_name, s_item_type, t_item_type) in self.s.zip(t)
+ if is_equivalent(s_item_type, t_item_type)
+ ])
+ mapping_value_type = join_type_list(list(items.values()))
+ fallback = self.s.create_anonymous_fallback(value_type=mapping_value_type)
+ return TypedDictType(items, fallback)
+ elif isinstance(self.s, Instance):
+ return join_instances(self.s, t.fallback)
+ else:
+ return self.default(self.s)
+
def visit_partial_type(self, t: PartialType) -> Type:
# We only have partial information so we can't decide the join result. We should
# never get here.
@@ -266,6 +283,8 @@ class TypeJoinVisitor(TypeVisitor[Type]):
return ErrorType()
elif isinstance(typ, TupleType):
return self.default(typ.fallback)
+ elif isinstance(typ, TypedDictType):
+ return self.default(typ.fallback)
elif isinstance(typ, FunctionLike):
return self.default(typ.fallback)
elif isinstance(typ, TypeVarType):
diff --git a/mypy/lex.py b/mypy/lex.py
index 66800a6..2ef7662 100644
--- a/mypy/lex.py
+++ b/mypy/lex.py
@@ -898,6 +898,7 @@ if __name__ == '__main__':
print('Usage: lex.py FILE', file=sys.stderr)
sys.exit(2)
fnam = sys.argv[1]
- s = open(fnam, 'rb').read()
+ with open(fnam, 'rb') as f:
+ s = f.read()
for t in lex(s):
print(t)
diff --git a/mypy/main.py b/mypy/main.py
index 19656e1..d2970e9 100644
--- a/mypy/main.py
+++ b/mypy/main.py
@@ -2,12 +2,13 @@
import argparse
import configparser
+import fnmatch
import os
import re
import sys
import time
-from typing import Any, Dict, List, Mapping, Optional, Set, Tuple
+from typing import Any, Dict, List, Mapping, Optional, Set, Tuple, cast
from mypy import build
from mypy import defaults
@@ -128,7 +129,8 @@ def process_options(args: List[str],
# Make the help output a little less jarring.
help_factory = (lambda prog:
- argparse.RawDescriptionHelpFormatter(prog=prog, max_help_position=28))
+ argparse.RawDescriptionHelpFormatter(prog=prog,
+ max_help_position=28)) # type: Any
parser = argparse.ArgumentParser(prog='mypy', epilog=FOOTER,
fromfile_prefix_chars='@',
formatter_class=help_factory)
@@ -148,10 +150,10 @@ def process_options(args: List[str],
"(defaults to sys.platform).")
parser.add_argument('-2', '--py2', dest='python_version', action='store_const',
const=defaults.PYTHON2_VERSION, help="use Python 2 mode")
- parser.add_argument('-s', '--silent-imports', action='store_true',
- help="don't follow imports to .py files")
- parser.add_argument('--almost-silent', action='store_true',
- help="like --silent-imports but reports the imports as errors")
+ parser.add_argument('--ignore-missing-imports', action='store_true',
+ help="silently ignore imports of missing modules")
+ parser.add_argument('--follow-imports', choices=['normal', 'silent', 'skip', 'error'],
+ default='normal', help="how to treat imports (default normal)")
parser.add_argument('--disallow-untyped-calls', action='store_true',
help="disallow calling functions without type annotations"
" from functions with type annotations")
@@ -171,11 +173,11 @@ def process_options(args: List[str],
help="warn about functions that end without returning")
parser.add_argument('--warn-unused-ignores', action='store_true',
help="warn about unneeded '# type: ignore' comments")
- parser.add_argument('--hide-error-context', action='store_true',
+ parser.add_argument('--show-error-context', action='store_false',
dest='hide_error_context',
- help="Hide context notes before errors")
+ help='Precede errors with "note:" messages explaining context')
parser.add_argument('--fast-parser', action='store_true',
- help="enable experimental fast parser")
+ help="enable fast parser (recommended except on Windows)")
parser.add_argument('-i', '--incremental', action='store_true',
help="enable experimental module cache")
parser.add_argument('--cache-dir', action='store', metavar='DIR',
@@ -222,15 +224,24 @@ def process_options(args: List[str],
# which will make the cache writing process output pretty-printed JSON (which
# is easier to debug).
parser.add_argument('--debug-cache', action='store_true', help=argparse.SUPPRESS)
- # deprecated options
- parser.add_argument('--silent', action='store_true', dest='special-opts:silent',
+ # --dump-graph will dump the contents of the graph of SCCs and exit.
+ parser.add_argument('--dump-graph', action='store_true', help=argparse.SUPPRESS)
+ parser.add_argument('--hide-error-context', action='store_true',
+ dest='hide_error_context',
help=argparse.SUPPRESS)
+ # deprecated options
parser.add_argument('-f', '--dirty-stubs', action='store_true',
dest='special-opts:dirty_stubs',
help=argparse.SUPPRESS)
parser.add_argument('--use-python-path', action='store_true',
dest='special-opts:use_python_path',
help=argparse.SUPPRESS)
+ parser.add_argument('-s', '--silent-imports', action='store_true',
+ dest='special-opts:silent_imports',
+ help=argparse.SUPPRESS)
+ parser.add_argument('--almost-silent', action='store_true',
+ dest='special-opts:almost_silent',
+ help=argparse.SUPPRESS)
report_group = parser.add_argument_group(
title='report generation',
@@ -259,7 +270,11 @@ def process_options(args: List[str],
# filename for the config file.
dummy = argparse.Namespace()
parser.parse_args(args, dummy)
- config_file = dummy.config_file or defaults.CONFIG_FILE
+ config_file = defaults.CONFIG_FILE
+ if dummy.config_file:
+ config_file = dummy.config_file
+ if not os.path.exists(config_file):
+ parser.error("Cannot file config file '%s'" % config_file)
# Parse config file first, so command line can override.
options = Options()
@@ -278,11 +293,18 @@ def process_options(args: List[str],
"See https://github.com/python/mypy/issues/1411 for more discussion."
)
- # warn about deprecated options
- if special_opts.silent:
- print("Warning: --silent is deprecated; use --silent-imports",
- file=sys.stderr)
- options.silent_imports = True
+ # Process deprecated options
+ if special_opts.almost_silent:
+ print("Warning: --almost-silent has been replaced by "
+ "--follow-imports=errors", file=sys.stderr)
+ if options.follow_imports == 'normal':
+ options.follow_imports = 'errors'
+ elif special_opts.silent_imports:
+ print("Warning: --silent-imports has been replaced by "
+ "--ignore-missing-imports --follow-imports=skip", file=sys.stderr)
+ options.ignore_missing_imports = True
+ if options.follow_imports == 'normal':
+ options.follow_imports = 'skip'
if special_opts.dirty_stubs:
print("Warning: -f/--dirty-stubs is deprecated and no longer necessary. Mypy no longer "
"checks the git status of stubs.",
@@ -456,7 +478,10 @@ config_types = {
'custom_typeshed_dir': str,
'mypy_path': lambda s: [p.strip() for p in re.split('[,:]', s)],
'junit_xml': str,
-}
+ # These two are for backwards compatibility
+ 'silent_imports': bool,
+ 'almost_silent': bool,
+} # type: Dict[str, Any]
def parse_config_file(options: Options, filename: str) -> None:
@@ -472,14 +497,13 @@ def parse_config_file(options: Options, filename: str) -> None:
return
if 'mypy' not in parser:
print("%s: No [mypy] section in config file" % filename, file=sys.stderr)
- return
-
- section = parser['mypy']
- prefix = '%s: [%s]' % (filename, 'mypy')
- updates, report_dirs = parse_section(prefix, options, section)
- for k, v in updates.items():
- setattr(options, k, v)
- options.report_dirs.update(report_dirs)
+ else:
+ section = parser['mypy']
+ prefix = '%s: [%s]' % (filename, 'mypy')
+ updates, report_dirs = parse_section(prefix, options, section)
+ for k, v in updates.items():
+ setattr(options, k, v)
+ options.report_dirs.update(report_dirs)
for name, section in parser.items():
if name.startswith('mypy-'):
@@ -500,7 +524,8 @@ def parse_config_file(options: Options, filename: str) -> None:
glob = glob.replace(os.sep, '.')
if os.altsep:
glob = glob.replace(os.altsep, '.')
- options.per_module_options[glob] = updates
+ pattern = re.compile(fnmatch.translate(glob))
+ options.per_module_options[pattern] = updates
def parse_section(prefix: str, template: Options,
@@ -509,7 +534,7 @@ def parse_section(prefix: str, template: Options,
Returns a dict of option values encountered, and a dict of report directories.
"""
- results = {}
+ results = {} # type: Dict[str, object]
report_dirs = {} # type: Dict[str, str]
for key in section:
key = key.replace('-', '_')
@@ -542,6 +567,20 @@ def parse_section(prefix: str, template: Options,
except ValueError as err:
print("%s: %s: %s" % (prefix, key, err), file=sys.stderr)
continue
+ if key == 'silent_imports':
+ print("%s: silent_imports has been replaced by "
+ "ignore_missing_imports=True; follow_imports=skip" % prefix, file=sys.stderr)
+ if v:
+ if 'ignore_missing_imports' not in results:
+ results['ignore_missing_imports'] = True
+ if 'follow_imports' not in results:
+ results['follow_imports'] = 'skip'
+ if key == 'almost_silent':
+ print("%s: almost_silent has been replaced by "
+ "follow_imports=error" % prefix, file=sys.stderr)
+ if v:
+ if 'follow_imports' not in results:
+ results['follow_imports'] = 'error'
results[key] = v
return results, report_dirs
diff --git a/mypy/meet.py b/mypy/meet.py
index 18796ae..7aa479c 100644
--- a/mypy/meet.py
+++ b/mypy/meet.py
@@ -1,12 +1,13 @@
-from typing import List
+from collections import OrderedDict
+from typing import List, Optional
-from mypy.join import is_similar_callables, combine_similar_callables
+from mypy.join import is_similar_callables, combine_similar_callables, join_type_list
from mypy.types import (
Type, AnyType, TypeVisitor, UnboundType, Void, ErrorType, NoneTyp, TypeVarType,
- Instance, CallableType, TupleType, ErasedType, TypeList, UnionType, PartialType,
+ Instance, CallableType, TupleType, TypedDictType, ErasedType, TypeList, UnionType, PartialType,
DeletedType, UninhabitedType, TypeType
)
-from mypy.subtypes import is_subtype
+from mypy.subtypes import is_equivalent, is_subtype
from mypy import experiments
@@ -227,6 +228,8 @@ class TypeMeetVisitor(TypeVisitor[Type]):
return NoneTyp()
elif isinstance(self.s, TypeType):
return meet_types(t, self.s)
+ elif isinstance(self.s, TupleType):
+ return meet_types(t, self.s)
else:
return self.default(self.s)
@@ -243,6 +246,25 @@ class TypeMeetVisitor(TypeVisitor[Type]):
items.append(self.meet(t.items[i], self.s.items[i]))
# TODO: What if the fallbacks are different?
return TupleType(items, t.fallback)
+ # meet(Tuple[t1, t2, <...>], Tuple[s, ...]) == Tuple[meet(t1, s), meet(t2, s), <...>].
+ elif (isinstance(self.s, Instance) and
+ self.s.type.fullname() == 'builtins.tuple' and self.s.args):
+ return t.copy_modified(items=[meet_types(it, self.s.args[0]) for it in t.items])
+ else:
+ return self.default(self.s)
+
+ def visit_typeddict_type(self, t: TypedDictType) -> Type:
+ if isinstance(self.s, TypedDictType):
+ for (_, l, r) in self.s.zip(t):
+ if not is_equivalent(l, r):
+ return self.default(self.s)
+ items = OrderedDict([
+ (item_name, s_item_type or t_item_type)
+ for (item_name, s_item_type, t_item_type) in self.s.zipall(t)
+ ])
+ mapping_value_type = join_type_list(list(items.values()))
+ fallback = self.s.create_anonymous_fallback(value_type=mapping_value_type)
+ return TypedDictType(items, fallback)
else:
return self.default(self.s)
diff --git a/mypy/messages.py b/mypy/messages.py
index e3eec25..53c46ac 100644
--- a/mypy/messages.py
+++ b/mypy/messages.py
@@ -10,12 +10,12 @@ from typing import cast, List, Dict, Any, Sequence, Iterable, Tuple
from mypy.errors import Errors
from mypy.types import (
- Type, CallableType, Instance, TypeVarType, TupleType, UnionType, Void, NoneTyp, AnyType,
- Overloaded, FunctionLike, DeletedType, TypeType
+ Type, CallableType, Instance, TypeVarType, TupleType, TypedDictType,
+ UnionType, Void, NoneTyp, AnyType, Overloaded, FunctionLike, DeletedType, TypeType
)
from mypy.nodes import (
TypeInfo, Context, MypyFile, op_methods, FuncDef, reverse_type_aliases,
- ARG_STAR, ARG_STAR2
+ ARG_POS, ARG_OPT, ARG_NAMED, ARG_NAMED_OPT, ARG_STAR, ARG_STAR2
)
@@ -44,7 +44,7 @@ INCOMPATIBLE_TYPES_IN_ASYNC_FOR = 'Incompatible types in "async for"'
INCOMPATIBLE_TYPES_IN_YIELD = 'Incompatible types in yield'
INCOMPATIBLE_TYPES_IN_YIELD_FROM = 'Incompatible types in "yield from"'
INCOMPATIBLE_TYPES_IN_STR_INTERPOLATION = 'Incompatible types in string interpolation'
-INIT_MUST_HAVE_NONE_RETURN_TYPE = 'The return type of "__init__" must be None'
+MUST_HAVE_NONE_RETURN_TYPE = 'The return type of "{}" must be None'
TUPLE_INDEX_MUST_BE_AN_INT_LITERAL = 'Tuple index must be an integer literal'
TUPLE_SLICE_MUST_BE_AN_INT_LITERAL = 'Tuple slice must be an integer literal'
TUPLE_INDEX_OUT_OF_RANGE = 'Tuple index out of range'
@@ -72,6 +72,19 @@ ARGUMENT_TYPE_EXPECTED = "Function is missing a type annotation for one or more
KEYWORD_ARGUMENT_REQUIRES_STR_KEY_TYPE = \
'Keyword argument only valid with "str" key type in call to "dict"'
ALL_MUST_BE_SEQ_STR = 'Type of __all__ must be {}, not {}'
+INVALID_TYPEDDICT_ARGS = \
+ 'Expected keyword arguments, {...}, or dict(...) in TypedDict constructor'
+TYPEDDICT_ITEM_NAME_MUST_BE_STRING_LITERAL = \
+ 'Expected TypedDict item name to be string literal'
+
+ARG_CONSTRUCTOR_NAMES = {
+ ARG_POS: "Arg",
+ ARG_OPT: "DefaultArg",
+ ARG_NAMED: "NamedArg",
+ ARG_NAMED_OPT: "DefaultNamedArg",
+ ARG_STAR: "StarArg",
+ ARG_STAR2: "KwArg",
+}
class MessageBuilder:
@@ -128,20 +141,24 @@ class MessageBuilder:
def is_errors(self) -> bool:
return self.errors.is_errors()
- def report(self, msg: str, context: Context, severity: str, file: str = None) -> None:
+ def report(self, msg: str, context: Context, severity: str,
+ file: str = None, origin: Context = None) -> None:
"""Report an error or note (unless disabled)."""
if self.disable_count <= 0:
self.errors.report(context.get_line() if context else -1,
context.get_column() if context else -1,
- msg.strip(), severity=severity, file=file)
+ msg.strip(), severity=severity, file=file,
+ origin_line=origin.get_line() if origin else None)
- def fail(self, msg: str, context: Context, file: str = None) -> None:
+ def fail(self, msg: str, context: Context, file: str = None,
+ origin: Context = None) -> None:
"""Report an error message (unless disabled)."""
- self.report(msg, context, 'error', file=file)
+ self.report(msg, context, 'error', file=file, origin=origin)
- def note(self, msg: str, context: Context, file: str = None) -> None:
+ def note(self, msg: str, context: Context, file: str = None,
+ origin: Context = None) -> None:
"""Report an error message (unless disabled)."""
- self.report(msg, context, 'note', file=file)
+ self.report(msg, context, 'note', file=file, origin=origin)
def format(self, typ: Type, verbosity: int = 0) -> str:
"""Convert a type to a relatively short string that is suitable for error messages.
@@ -168,8 +185,30 @@ class MessageBuilder:
return_type = strip_quotes(self.format(func.ret_type))
if func.is_ellipsis_args:
return 'Callable[..., {}]'.format(return_type)
- arg_types = [strip_quotes(self.format(t)) for t in func.arg_types]
- return 'Callable[[{}], {}]'.format(", ".join(arg_types), return_type)
+ arg_strings = []
+ for arg_name, arg_type, arg_kind in zip(
+ func.arg_names, func.arg_types, func.arg_kinds):
+ if (arg_kind == ARG_POS and arg_name is None
+ or verbosity == 0 and arg_kind in (ARG_POS, ARG_OPT)):
+
+ arg_strings.append(
+ strip_quotes(
+ self.format(
+ arg_type,
+ verbosity = max(verbosity - 1, 0))))
+ else:
+ constructor = ARG_CONSTRUCTOR_NAMES[arg_kind]
+ if arg_kind in (ARG_STAR, ARG_STAR2):
+ arg_strings.append("{}({})".format(
+ constructor,
+ strip_quotes(self.format(arg_type))))
+ else:
+ arg_strings.append("{}('{}', {})".format(
+ constructor,
+ arg_name,
+ strip_quotes(self.format(arg_type))))
+
+ return 'Callable[[{}], {}]'.format(", ".join(arg_strings), return_type)
else:
# Use a simple representation for function types; proper
# function types may result in long and difficult-to-read
@@ -204,8 +243,8 @@ class MessageBuilder:
# interpreted as a normal word.
return '"{}"'.format(base_str)
elif itype.type.fullname() == 'builtins.tuple':
- item_type = strip_quotes(self.format(itype.args[0]))
- return 'Tuple[{}, ...]'.format(item_type)
+ item_type_str = strip_quotes(self.format(itype.args[0]))
+ return 'Tuple[{}, ...]'.format(item_type_str)
elif itype.type.fullname() in reverse_type_aliases:
alias = reverse_type_aliases[itype.type.fullname()]
alias = alias.split('.')[-1]
@@ -239,6 +278,15 @@ class MessageBuilder:
return s
else:
return 'tuple(length {})'.format(len(items))
+ elif isinstance(typ, TypedDictType):
+ # If the TypedDictType is named, return the name
+ if typ.fallback.type.fullname() != 'typing.Mapping':
+ return self.format_simple(typ.fallback)
+ items = []
+ for (item_name, item_type) in typ.items.items():
+ items.append('{}={}'.format(item_name, strip_quotes(self.format(item_type))))
+ s = '"TypedDict({})"'.format(', '.join(items))
+ return s
elif isinstance(typ, UnionType):
# Only print Unions as Optionals if the Optional wouldn't have to contain another Union
print_as_optional = (len(typ.items) -
@@ -434,12 +482,12 @@ class MessageBuilder:
return
if name.startswith('"__getitem__" of'):
- self.invalid_index_type(arg_type, base, context)
+ self.invalid_index_type(arg_type, callee.arg_types[n - 1], base, context)
return
if name.startswith('"__setitem__" of'):
if n == 1:
- self.invalid_index_type(arg_type, base, context)
+ self.invalid_index_type(arg_type, callee.arg_types[n - 1], base, context)
else:
msg = '{} (expression has type {}, target has type {})'
arg_type_str, callee_type_str = self.format_distinctly(arg_type,
@@ -486,10 +534,10 @@ class MessageBuilder:
n, target, arg_type_str, expected_type_str)
self.fail(msg, context)
- def invalid_index_type(self, index_type: Type, base_str: str,
+ def invalid_index_type(self, index_type: Type, expected_type: Type, base_str: str,
context: Context) -> None:
- self.fail('Invalid index type {} for {}'.format(
- self.format(index_type), base_str), context)
+ self.fail('Invalid index type {} for {}; expected type {}'.format(
+ self.format(index_type), base_str, self.format(expected_type)), context)
def too_few_arguments(self, callee: CallableType, context: Context,
argument_names: List[str]) -> None:
@@ -508,6 +556,12 @@ class MessageBuilder:
msg += ' for {}'.format(callee.name)
self.fail(msg, context)
+ def missing_named_argument(self, callee: CallableType, context: Context, name: str) -> None:
+ msg = 'Missing named argument "{}"'.format(name)
+ if callee.name:
+ msg += ' for function {}'.format(callee.name)
+ self.fail(msg, context)
+
def too_many_arguments(self, callee: CallableType, context: Context) -> None:
msg = 'Too many arguments'
if callee.name:
@@ -532,7 +586,8 @@ class MessageBuilder:
if fullname is not None and '.' in fullname:
module_name = fullname.rsplit('.', 1)[0]
path = self.modules[module_name].path
- self.note('{} defined here'.format(callee.name), callee.definition, file=path)
+ self.note('{} defined here'.format(callee.name), callee.definition,
+ file=path, origin=context)
def duplicate_argument_value(self, callee: CallableType, index: int,
context: Context) -> None:
@@ -788,6 +843,28 @@ class MessageBuilder:
def redundant_cast(self, typ: Type, context: Context) -> None:
self.note('Redundant cast to {}'.format(self.format(typ)), context)
+ def typeddict_instantiated_with_unexpected_items(self,
+ expected_item_names: List[str],
+ actual_item_names: List[str],
+ context: Context) -> None:
+ self.fail('Expected items {} but found {}.'.format(
+ expected_item_names, actual_item_names), context)
+
+ def typeddict_item_name_must_be_string_literal(self,
+ typ: TypedDictType,
+ context: Context,
+ ) -> None:
+ self.fail('Cannot prove expression is a valid item name; expected one of {}'.format(
+ format_item_name_list(typ.items.keys())), context)
+
+ def typeddict_item_name_not_found(self,
+ typ: TypedDictType,
+ item_name: str,
+ context: Context,
+ ) -> None:
+ self.fail('\'{}\' is not a valid item name; expected one of {}'.format(
+ item_name, format_item_name_list(typ.items.keys())), context)
+
def capitalize(s: str) -> str:
"""Capitalize the first character of a string."""
@@ -831,6 +908,14 @@ def format_string_list(s: Iterable[str]) -> str:
return '%s, ... and %s (%i methods suppressed)' % (', '.join(l[:2]), l[-1], len(l) - 3)
+def format_item_name_list(s: Iterable[str]) -> str:
+ l = list(s)
+ if len(l) <= 5:
+ return '[' + ', '.join(["'%s'" % name for name in l]) + ']'
+ else:
+ return '[' + ', '.join(["'%s'" % name for name in l[:5]]) + ', ...]'
+
+
def callable_name(type: CallableType) -> str:
if type.name:
return type.name
diff --git a/mypy/myunit/__init__.py b/mypy/myunit/__init__.py
new file mode 100644
index 0000000..26b9a45
--- /dev/null
+++ b/mypy/myunit/__init__.py
@@ -0,0 +1,380 @@
+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
new file mode 100644
index 0000000..78ef01f
--- /dev/null
+++ b/mypy/myunit/__main__.py
@@ -0,0 +1,18 @@
+# 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/nodes.py b/mypy/nodes.py
index 013373c..eeff57a 100644
--- a/mypy/nodes.py
+++ b/mypy/nodes.py
@@ -627,6 +627,7 @@ class Var(SymbolNode):
is_self = False
is_ready = False # If inferred, is the inferred type available?
# Is this initialized explicitly to a non-None value in class body?
+ is_inferred = False
is_initialized_in_class = False
is_staticmethod = False
is_classmethod = False
@@ -644,6 +645,8 @@ class Var(SymbolNode):
def __init__(self, name: str, type: 'mypy.types.Type' = None) -> None:
self._name = name
self.type = type
+ if self.type is None:
+ self.is_inferred = True
self.is_self = False
self.is_ready = True
self.is_initialized_in_class = False
@@ -1214,6 +1217,8 @@ ARG_STAR = 2 # type: int
ARG_NAMED = 3 # type: int
# **arg argument
ARG_STAR2 = 4 # type: int
+# In an argument list, keyword-only and also optional
+ARG_NAMED_OPT = 5
class CallExpr(Expression):
@@ -1832,7 +1837,7 @@ class TempNode(Expression):
def __init__(self, typ: 'mypy.types.Type') -> None:
self.type = typ
- def __repr__(self):
+ def __repr__(self) -> str:
return 'TempNode(%s)' % str(self.type)
def accept(self, visitor: NodeVisitor[T]) -> T:
@@ -1894,13 +1899,14 @@ class TypeInfo(SymbolNode):
# object used for this class is not an Instance but a TupleType;
# the corresponding Instance is set as the fallback type of the
# tuple type.
- tuple_type = None # type: mypy.types.TupleType
+ tuple_type = None # type: Optional[mypy.types.TupleType]
# Is this a named tuple type?
is_named_tuple = False
- # Is this a typed dict type?
- is_typed_dict = False
+ # If this class is defined by the TypedDict type constructor,
+ # then this is not None.
+ typeddict_type = None # type: Optional[mypy.types.TypedDictType]
# Is this a newtype type?
is_newtype = False
@@ -1910,7 +1916,7 @@ class TypeInfo(SymbolNode):
FLAGS = [
'is_abstract', 'is_enum', 'fallback_to_any', 'is_named_tuple',
- 'is_typed_dict', 'is_newtype'
+ 'is_newtype'
]
def __init__(self, names: 'SymbolTable', defn: ClassDef, module_name: str) -> None:
@@ -2045,6 +2051,8 @@ class TypeInfo(SymbolNode):
'bases': [b.serialize() for b in self.bases],
'_promote': None if self._promote is None else self._promote.serialize(),
'tuple_type': None if self.tuple_type is None else self.tuple_type.serialize(),
+ 'typeddict_type':
+ None if self.typeddict_type is None else self.typeddict_type.serialize(),
'flags': get_flags(self, TypeInfo.FLAGS),
}
return data
@@ -2065,6 +2073,8 @@ class TypeInfo(SymbolNode):
else mypy.types.Type.deserialize(data['_promote']))
ti.tuple_type = (None if data['tuple_type'] is None
else mypy.types.TupleType.deserialize(data['tuple_type']))
+ ti.typeddict_type = (None if data['typeddict_type'] is None
+ else mypy.types.TypedDictType.deserialize(data['typeddict_type']))
set_flags(ti, data['flags'])
return ti
diff --git a/mypy/options.py b/mypy/options.py
index c3f3107..a9b6a05 100644
--- a/mypy/options.py
+++ b/mypy/options.py
@@ -2,7 +2,7 @@ import fnmatch
import pprint
import sys
-from typing import Any, Mapping, Optional, Tuple, List
+from typing import Any, Mapping, Optional, Tuple, List, Pattern
from mypy import defaults
@@ -17,8 +17,8 @@ class Options:
"""Options collected from flags."""
PER_MODULE_OPTIONS = {
- "silent_imports",
- "almost_silent",
+ "ignore_missing_imports",
+ "follow_imports",
"disallow_untyped_calls",
"disallow_untyped_defs",
"check_untyped_defs",
@@ -26,6 +26,7 @@ class Options:
"strict_optional_whitelist",
"show_none_errors",
"warn_no_return",
+ "ignore_errors",
}
OPTIONS_AFFECTING_CACHE = PER_MODULE_OPTIONS | {"strict_optional"}
@@ -39,8 +40,8 @@ class Options:
self.custom_typeshed_dir = None # type: Optional[str]
self.mypy_path = [] # type: List[str]
self.report_dirs = {} # type: Dict[str, str]
- self.silent_imports = False
- self.almost_silent = False
+ self.ignore_missing_imports = False
+ self.follow_imports = 'normal' # normal|silent|skip|error
# Disallow calling untyped functions from typed ones
self.disallow_untyped_calls = False
@@ -66,9 +67,15 @@ class Options:
# Warn about unused '# type: ignore' comments
self.warn_unused_ignores = False
+ # Files in which to ignore all non-fatal errors
+ self.ignore_errors = False
+
# Apply strict None checking
self.strict_optional = False
+ # Hide "note: In function "foo":" messages.
+ self.hide_error_context = True
+
# Files in which to allow strict-Optional related errors
# TODO: Kill this in favor of show_none_errors
self.strict_optional_whitelist = None # type: Optional[List[str]]
@@ -86,7 +93,7 @@ class Options:
self.junit_xml = None # type: Optional[str]
# Per-module options (raw)
- self.per_module_options = {} # type: Dict[str, Dict[str, object]]
+ self.per_module_options = {} # type: Dict[Pattern[str], Dict[str, object]]
# -- development options --
self.verbosity = 0 # More verbose messages (for troubleshooting)
@@ -107,9 +114,9 @@ class Options:
self.incremental = False
self.cache_dir = defaults.CACHE_DIR
self.debug_cache = False
- self.hide_error_context = False # Hide "note: In function "foo":" messages.
self.shadow_file = None # type: Optional[Tuple[str, str]]
self.show_column_numbers = False # type: bool
+ self.dump_graph = False
def __eq__(self, other: object) -> bool:
return self.__class__ == other.__class__ and self.__dict__ == other.__dict__
@@ -132,11 +139,11 @@ class Options:
new_options.__dict__.update(updates)
return new_options
- def module_matches_pattern(self, module: str, pattern: str) -> bool:
+ def module_matches_pattern(self, module: str, pattern: Pattern[str]) -> bool:
# If the pattern is 'mod.*', we want 'mod' to match that too.
# (That's so that a pattern specifying a package also matches
# that package's __init__.)
- return fnmatch.fnmatch(module, pattern) or fnmatch.fnmatch(module + '.', pattern)
+ return pattern.match(module) is not None or pattern.match(module + '.') is not None
def select_options_affecting_cache(self) -> Mapping[str, bool]:
return {opt: getattr(self, opt) for opt in self.OPTIONS_AFFECTING_CACHE}
diff --git a/mypy/parse.py b/mypy/parse.py
index f5fa404..cbfec39 100644
--- a/mypy/parse.py
+++ b/mypy/parse.py
@@ -14,6 +14,7 @@ from mypy.lex import (
UnicodeLit, FloatLit, Op, Indent, Keyword, Punct, LexError, ComplexLit,
EllipsisToken
)
+from mypy.sharedparse import special_function_elide_names, argument_elide_name
from mypy.nodes import (
MypyFile, Import, ImportAll, ImportFrom, FuncDef, OverloadedFuncDef,
ClassDef, Decorator, Block, Var, OperatorAssignmentStmt, Statement,
@@ -416,6 +417,11 @@ class Parser:
arg_kinds = [arg.kind for arg in args]
arg_names = [arg.variable.name() for arg in args]
+ # for overloads of special methods, let people name their arguments
+ # whatever they want, and don't let them call those functions with
+ # arguments by name.
+ if special_function_elide_names(name):
+ arg_names = [None] * len(arg_names)
body, comment_type = self.parse_block(allow_type=True)
# Potentially insert extra assignment statements to the beginning of the
@@ -536,10 +542,11 @@ class Parser:
try:
name_tok = self.expect_type(Name)
name = name_tok.string
+ include_names = not special_function_elide_names(name)
self.errors.push_function(name)
- args, typ, extra_stmts = self.parse_args(no_type_checks)
+ args, typ, extra_stmts = self.parse_args(no_type_checks, include_names)
except ParseError:
if not isinstance(self.current(), Break):
self.ind -= 1 # Kludge: go back to the Break token
@@ -550,9 +557,11 @@ class Parser:
return (name, args, typ, False, extra_stmts)
- def parse_args(self, no_type_checks: bool=False) -> Tuple[List[Argument],
- CallableType,
- List[AssignmentStmt]]:
+ def parse_args(self,
+ no_type_checks: bool = False,
+ include_names: bool = True) -> Tuple[List[Argument],
+ CallableType,
+ List[AssignmentStmt]]:
"""Parse a function signature (...) [-> t].
See parse_arg_list for an explanation of the final tuple item.
@@ -578,23 +587,29 @@ class Parser:
self.verify_argument_kinds(arg_kinds, lparen.line, lparen.column)
annotation = self.build_func_annotation(
- ret_type, args, lparen.line, lparen.column)
+ ret_type, args, lparen.line, lparen.column, include_names=include_names)
return args, annotation, extra_stmts
- def build_func_annotation(self, ret_type: Type, args: List[Argument],
- line: int, column: int, is_default_ret: bool = False) -> CallableType:
+ def build_func_annotation(self,
+ ret_type: Type,
+ args: List[Argument],
+ line: int,
+ column: int,
+ is_default_ret: bool = False,
+ *,
+ include_names: bool = True) -> CallableType:
arg_types = [arg.type_annotation for arg in args]
# Are there any type annotations?
if ((ret_type and not is_default_ret)
or arg_types != [None] * len(arg_types)):
# Yes. Construct a type for the function signature.
- return self.construct_function_type(args, ret_type, line, column)
+ return self.construct_function_type(args, ret_type, line, column, include_names)
else:
return None
def parse_arg_list(self, allow_signature: bool = True,
- no_type_checks: bool=False) -> Tuple[List[Argument],
+ no_type_checks: bool = False) -> Tuple[List[Argument],
List[AssignmentStmt]]:
"""Parse function definition argument list.
@@ -773,7 +788,7 @@ class Parser:
self.expect('=')
initializer = self.parse_expression(precedence[','])
if require_named:
- kind = nodes.ARG_NAMED
+ kind = nodes.ARG_NAMED_OPT
else:
kind = nodes.ARG_OPT
else:
@@ -819,8 +834,12 @@ class Parser:
self.fail('Invalid argument list', line, column)
found.add(kind)
- def construct_function_type(self, args: List[Argument], ret_type: Type,
- line: int, column: int) -> CallableType:
+ def construct_function_type(self,
+ args: List[Argument],
+ ret_type: Type,
+ line: int,
+ column: int,
+ include_names: bool = True) -> CallableType:
# Complete the type annotation by replacing omitted types with 'Any'.
arg_types = [arg.type_annotation for arg in args]
for i in range(len(arg_types)):
@@ -829,7 +848,11 @@ class Parser:
if ret_type is None:
ret_type = AnyType(implicit=True)
arg_kinds = [arg.kind for arg in args]
- arg_names = [arg.variable.name() for arg in args]
+ if include_names:
+ arg_names = [None if argument_elide_name(arg.variable.name()) else arg.variable.name()
+ for arg in args]
+ else:
+ arg_names = [None] * len(args)
return CallableType(arg_types, arg_kinds, arg_names, ret_type, None, name=None,
variables=None, line=line, column=column)
@@ -2009,7 +2032,8 @@ if __name__ == '__main__':
usage()
status = 0
for fnam in args:
- s = open(fnam, 'rb').read()
+ with open(fnam, 'rb') as f:
+ s = f.read()
errors = Errors()
try:
options = Options()
diff --git a/mypy/report.py b/mypy/report.py
index 2bb55aa..42c4a1c 100644
--- a/mypy/report.py
+++ b/mypy/report.py
@@ -107,7 +107,8 @@ class LineCountReporter(AbstractReporter):
def on_file(self, tree: MypyFile, type_map: Dict[Expression, Type]) -> None:
# Count physical lines. This assumes the file's encoding is a
# superset of ASCII (or at least uses \n in its line endings).
- physical_lines = len(open(tree.path, 'rb').readlines())
+ with open(tree.path, 'rb') as f:
+ physical_lines = len(f.readlines())
func_counter = FuncCounterVisitor()
tree.accept(func_counter)
@@ -225,7 +226,8 @@ class LineCoverageReporter(AbstractReporter):
stats.ensure_dir_exists(output_dir)
def on_file(self, tree: MypyFile, type_map: Dict[Expression, Type]) -> None:
- tree_source = open(tree.path).readlines()
+ with open(tree.path) as f:
+ tree_source = f.readlines()
coverage_visitor = LineCoverageVisitor(tree_source)
tree.accept(coverage_visitor)
diff --git a/mypy/sametypes.py b/mypy/sametypes.py
index 9e428ae..4878273 100644
--- a/mypy/sametypes.py
+++ b/mypy/sametypes.py
@@ -1,9 +1,9 @@
from typing import Sequence
from mypy.types import (
- Type, UnboundType, ErrorType, AnyType, NoneTyp, Void, TupleType, UnionType, CallableType,
- TypeVarType, Instance, TypeVisitor, ErasedType, TypeList, Overloaded, PartialType,
- DeletedType, UninhabitedType, TypeType
+ Type, UnboundType, ErrorType, AnyType, NoneTyp, Void, TupleType, TypedDictType,
+ UnionType, CallableType, TypeVarType, Instance, TypeVisitor, ErasedType,
+ TypeList, Overloaded, PartialType, DeletedType, UninhabitedType, TypeType
)
@@ -111,6 +111,17 @@ class SameTypeVisitor(TypeVisitor[bool]):
else:
return False
+ def visit_typeddict_type(self, left: TypedDictType) -> bool:
+ if isinstance(self.right, TypedDictType):
+ if left.items.keys() != self.right.items.keys():
+ return False
+ for (_, left_item_type, right_item_type) in left.zip(self.right):
+ if not is_same_type(left_item_type, right_item_type):
+ return False
+ return True
+ else:
+ return False
+
def visit_union_type(self, left: UnionType) -> bool:
# XXX This is a test for syntactic equality, not equivalence
if isinstance(self.right, UnionType):
diff --git a/mypy/semanal.py b/mypy/semanal.py
index 5e213a8..1db35f0 100644
--- a/mypy/semanal.py
+++ b/mypy/semanal.py
@@ -43,6 +43,7 @@ TODO: Check if the third pass slows down type checking significantly.
traverse the entire AST.
"""
+from collections import OrderedDict
from typing import (
List, Dict, Set, Tuple, cast, TypeVar, Union, Optional, Callable
)
@@ -59,7 +60,7 @@ from mypy.nodes import (
SymbolTableNode, BOUND_TVAR, UNBOUND_TVAR, ListComprehension, GeneratorExpr,
FuncExpr, MDEF, FuncBase, Decorator, SetExpr, TypeVarExpr, NewTypeExpr,
StrExpr, BytesExpr, PrintStmt, ConditionalExpr, PromoteExpr,
- ComparisonExpr, StarExpr, ARG_POS, ARG_NAMED, MroError, type_aliases,
+ ComparisonExpr, StarExpr, ARG_POS, ARG_NAMED, ARG_NAMED_OPT, MroError, type_aliases,
YieldFromExpr, NamedTupleExpr, TypedDictExpr, NonlocalDecl, SymbolNode,
SetComprehension, DictionaryComprehension, TYPE_ALIAS, TypeAliasExpr,
YieldExpr, ExecStmt, Argument, BackquoteExpr, ImportBase, AwaitExpr,
@@ -72,13 +73,15 @@ from mypy.errors import Errors, report_internal_error
from mypy.types import (
NoneTyp, CallableType, Overloaded, Instance, Type, TypeVarType, AnyType,
FunctionLike, UnboundType, TypeList, TypeVarDef, TypeType,
- TupleType, UnionType, StarType, EllipsisType, function_type)
+ TupleType, UnionType, StarType, EllipsisType, function_type, TypedDictType,
+)
from mypy.nodes import implicit_module_attrs
from mypy.typeanal import TypeAnalyser, TypeAnalyserPass3, analyze_type_alias
from mypy.exprtotype import expr_to_unanalyzed_type, TypeTranslationError
from mypy.sametypes import is_same_type
from mypy.erasetype import erase_typevars
from mypy.options import Options
+from mypy import join
T = TypeVar('T')
@@ -200,6 +203,8 @@ class SemanticAnalyzer(NodeVisitor):
errors = None # type: Errors # Keeps track of generated errors
def __init__(self,
+ modules: Dict[str, MypyFile],
+ missing_modules: Set[str],
lib_path: List[str], errors: Errors) -> None:
"""Construct semantic analyzer.
@@ -218,7 +223,8 @@ class SemanticAnalyzer(NodeVisitor):
self.loop_depth = 0
self.lib_path = lib_path
self.errors = errors
- self.modules = {}
+ self.modules = modules
+ self.missing_modules = missing_modules
self.postpone_nested_functions_stack = [FUNCTION_BOTH_PHASES]
self.postponed_functions_stack = []
self.all_exports = set() # type: Set[str]
@@ -329,7 +335,7 @@ class SemanticAnalyzer(NodeVisitor):
elif isinstance(functype, CallableType):
self_type = functype.arg_types[0]
if isinstance(self_type, AnyType):
- if func.is_class or func.name() == '__new__':
+ if func.is_class or func.name() in ('__new__', '__init_subclass__'):
leading_type = self.class_type(self.type)
else:
leading_type = fill_typevars(self.type)
@@ -905,6 +911,9 @@ class SemanticAnalyzer(NodeVisitor):
def object_type(self) -> Instance:
return self.named_type('__builtins__.object')
+ def str_type(self) -> Instance:
+ return self.named_type('__builtins__.str')
+
def class_type(self, info: TypeInfo) -> Type:
# Construct a function type whose fallback is cls.
from mypy import checkmember # To avoid import cycle.
@@ -988,6 +997,7 @@ class SemanticAnalyzer(NodeVisitor):
module = self.modules.get(import_id)
for id, as_id in imp.names:
node = module.names.get(id) if module else None
+ missing = False
# If the module does not contain a symbol with the name 'id',
# try checking if it's a module instead.
@@ -997,6 +1007,8 @@ class SemanticAnalyzer(NodeVisitor):
if mod is not None:
node = SymbolTableNode(MODULE_REF, mod, import_id)
self.add_submodules_to_parent_modules(possible_module_id, True)
+ elif possible_module_id in self.missing_modules:
+ missing = True
if node and node.kind != UNBOUND_IMPORTED:
node = self.normalize_type_alias(node, imp)
@@ -1016,7 +1028,7 @@ class SemanticAnalyzer(NodeVisitor):
node.type_override,
module_public=module_public)
self.add_symbol(imported_id, symbol, imp)
- elif module:
+ elif module and not missing:
# Missing attribute.
message = "Module '{}' has no attribute '{}'".format(import_id, id)
extra = self.undefined_name_extra_info('{}.{}'.format(import_id, id))
@@ -1261,6 +1273,7 @@ class SemanticAnalyzer(NodeVisitor):
if (add_global or nested_global) and lval.name not in self.globals:
# Define new global name.
v = Var(lval.name)
+ v.set_line(lval)
v._fullname = self.qualified_name(lval.name)
v.is_ready = False # Type not inferred yet
lval.node = v
@@ -1278,6 +1291,7 @@ class SemanticAnalyzer(NodeVisitor):
lval.name not in self.nonlocal_decls[-1]):
# Define new local name.
v = Var(lval.name)
+ v.set_line(lval)
lval.node = v
lval.is_def = True
lval.kind = LDEF
@@ -1295,10 +1309,11 @@ class SemanticAnalyzer(NodeVisitor):
lval.kind = MDEF
lval.fullname = lval.name
self.type.names[lval.name] = SymbolTableNode(MDEF, v)
+ elif explicit_type:
+ # Don't re-bind types
+ self.name_already_defined(lval.name, lval)
else:
# Bind to an existing name.
- if explicit_type:
- self.name_already_defined(lval.name, lval)
lval.accept(self)
self.check_lvalue_validity(lval.node, lval)
elif isinstance(lval, MemberExpr):
@@ -1349,6 +1364,7 @@ class SemanticAnalyzer(NodeVisitor):
# Implicit attribute definition in __init__.
lval.is_def = True
v = Var(lval.name)
+ v.set_line(lval)
v.info = self.type
v.is_ready = False
lval.def_var = v
@@ -1672,14 +1688,18 @@ class SemanticAnalyzer(NodeVisitor):
if not ok:
# Error. Construct dummy return value.
return self.build_namedtuple_typeinfo('namedtuple', [], [])
+ name = cast(StrExpr, call.args[0]).value
+ if name != var_name or self.is_func_scope():
+ # Give it a unique name derived from the line number.
+ name += '@' + str(call.line)
+ info = self.build_namedtuple_typeinfo(name, items, types)
+ # Store it as a global just in case it would remain anonymous.
+ # (Or in the nearest class if there is one.)
+ stnode = SymbolTableNode(GDEF, info, self.cur_mod_id)
+ if self.type:
+ self.type.names[name] = stnode
else:
- name = cast(StrExpr, call.args[0]).value
- if name != var_name:
- # Give it a unique name derived from the line number.
- name += '@' + str(call.line)
- info = self.build_namedtuple_typeinfo(name, items, types)
- # Store it as a global just in case it would remain anonymous.
- self.globals[name] = SymbolTableNode(GDEF, info, self.cur_mod_id)
+ self.globals[name] = stnode
call.analyzed = NamedTupleExpr(info)
call.analyzed.set_line(call.line, call.column)
return info
@@ -1724,7 +1744,7 @@ class SemanticAnalyzer(NodeVisitor):
types = [AnyType() for _ in items]
underscore = [item for item in items if item.startswith('_')]
if underscore:
- self.fail("namedtuple() Field names cannot start with an underscore: "
+ self.fail("namedtuple() field names cannot start with an underscore: "
+ ', '.join(underscore), call)
return items, types, ok
@@ -1767,7 +1787,7 @@ class SemanticAnalyzer(NodeVisitor):
def build_namedtuple_typeinfo(self, name: str, items: List[str],
types: List[Type]) -> TypeInfo:
- strtype = self.named_type('__builtins__.str') # type: Type
+ strtype = self.str_type()
basetuple_type = self.named_type('__builtins__.tuple', [AnyType()])
dictype = (self.named_type_or_none('builtins.dict', [strtype, AnyType()])
or self.object_type())
@@ -1803,8 +1823,12 @@ class SemanticAnalyzer(NodeVisitor):
tvd = TypeVarDef('NT', 1, [], info.tuple_type)
selftype = TypeVarType(tvd)
- def add_method(funcname: str, ret: Type, args: List[Argument], name=None,
- is_classmethod=False) -> None:
+ def add_method(funcname: str,
+ ret: Type,
+ args: List[Argument],
+ name: str = None,
+ is_classmethod: bool = False,
+ ) -> None:
if is_classmethod:
first = [Argument(Var('cls'), TypeType(selftype), None, ARG_POS)]
else:
@@ -1830,14 +1854,14 @@ class SemanticAnalyzer(NodeVisitor):
info.names[funcname] = SymbolTableNode(MDEF, func)
add_method('_replace', ret=selftype,
- args=[Argument(var, var.type, EllipsisExpr(), ARG_NAMED) for var in vars])
+ args=[Argument(var, var.type, EllipsisExpr(), ARG_NAMED_OPT) for var in vars])
add_method('__init__', ret=NoneTyp(), name=info.name(),
args=[Argument(var, var.type, None, ARG_POS) for var in vars])
add_method('_asdict', args=[], ret=ordereddictype)
add_method('_make', ret=selftype, is_classmethod=True,
args=[Argument(Var('iterable', iterable_type), iterable_type, None, ARG_POS),
- Argument(Var('new'), AnyType(), EllipsisExpr(), ARG_NAMED),
- Argument(Var('len'), AnyType(), EllipsisExpr(), ARG_NAMED)])
+ Argument(Var('new'), AnyType(), EllipsisExpr(), ARG_NAMED_OPT),
+ Argument(Var('len'), AnyType(), EllipsisExpr(), ARG_NAMED_OPT)])
return info
def make_argument(self, name: str, type: Type) -> Argument:
@@ -1864,8 +1888,9 @@ class SemanticAnalyzer(NodeVisitor):
return
# Yes, it's a valid TypedDict definition. Add it to the symbol table.
node = self.lookup(name, s)
- node.kind = GDEF # TODO locally defined TypedDict
- node.node = typed_dict
+ if node:
+ node.kind = GDEF # TODO locally defined TypedDict
+ node.node = typed_dict
def check_typeddict(self, node: Expression, var_name: str = None) -> Optional[TypeInfo]:
"""Check if a call defines a TypedDict.
@@ -1891,14 +1916,18 @@ class SemanticAnalyzer(NodeVisitor):
if not ok:
# Error. Construct dummy return value.
return self.build_typeddict_typeinfo('TypedDict', [], [])
+ name = cast(StrExpr, call.args[0]).value
+ if name != var_name or self.is_func_scope():
+ # Give it a unique name derived from the line number.
+ name += '@' + str(call.line)
+ info = self.build_typeddict_typeinfo(name, items, types)
+ # Store it as a global just in case it would remain anonymous.
+ # (Or in the nearest class if there is one.)
+ stnode = SymbolTableNode(GDEF, info, self.cur_mod_id)
+ if self.type:
+ self.type.names[name] = stnode
else:
- name = cast(StrExpr, call.args[0]).value
- if name != var_name:
- # Give it a unique name derived from the line number.
- name += '@' + str(call.line)
- info = self.build_typeddict_typeinfo(name, items, types)
- # Store it as a global just in case it would remain anonymous.
- self.globals[name] = SymbolTableNode(GDEF, info, self.cur_mod_id)
+ self.globals[name] = stnode
call.analyzed = TypedDictExpr(info)
call.analyzed.set_line(call.line, call.column)
return info
@@ -1922,6 +1951,10 @@ class SemanticAnalyzer(NodeVisitor):
"TypedDict() expects a dictionary literal as the second argument", call)
dictexpr = args[1]
items, types, ok = self.parse_typeddict_fields_with_types(dictexpr.items, call)
+ underscore = [item for item in items if item.startswith('_')]
+ if underscore:
+ self.fail("TypedDict() item names cannot start with an underscore: "
+ + ', '.join(underscore), call)
return items, types, ok
def parse_typeddict_fields_with_types(self, dict_items: List[Tuple[Expression, Expression]],
@@ -1947,17 +1980,13 @@ class SemanticAnalyzer(NodeVisitor):
def build_typeddict_typeinfo(self, name: str, items: List[str],
types: List[Type]) -> TypeInfo:
- strtype = self.named_type('__builtins__.str') # type: Type
- dictype = (self.named_type_or_none('builtins.dict', [strtype, AnyType()])
- or self.object_type())
- fallback = dictype
+ mapping_value_type = join.join_type_list(types)
+ fallback = (self.named_type_or_none('typing.Mapping',
+ [self.str_type(), mapping_value_type])
+ or self.object_type())
info = self.basic_new_typeinfo(name, fallback)
- info.is_typed_dict = True
-
- # (TODO: Store {items, types} inside "info" somewhere for use later.
- # Probably inside a new "info.keys" field which
- # would be analogous to "info.names".)
+ info.typeddict_type = TypedDictType(OrderedDict(zip(items, types)), fallback)
return info
diff --git a/mypy/sharedparse.py b/mypy/sharedparse.py
new file mode 100644
index 0000000..1643aac
--- /dev/null
+++ b/mypy/sharedparse.py
@@ -0,0 +1,100 @@
+from typing import Union, Tuple
+
+"""Shared logic between our three mypy parser files."""
+
+
+MAGIC_METHODS = {
+ "__abs__",
+ "__add__",
+ "__and__",
+ "__call__",
+ "__cmp__",
+ "__complex__",
+ "__contains__",
+ "__del__",
+ "__delattr__",
+ "__delitem__",
+ "__divmod__",
+ "__div__",
+ "__divmod__",
+ "__enter__",
+ "__exit__",
+ "__eq__",
+ "__floordiv__",
+ "__float__",
+ "__ge__",
+ "__getattr__",
+ "__getattribute__",
+ "__getitem__",
+ "__gt__",
+ "__hex__",
+ "__iadd__",
+ "__iand__",
+ "__idiv__",
+ "__ifloordiv__",
+ "__ilshift__",
+ "__imod__",
+ "__imul__",
+ "__init__",
+ "__init_subclass__",
+ "__int__",
+ "__invert__",
+ "__ior__",
+ "__ipow__",
+ "__irshift__",
+ "__isub__",
+ "__iter__",
+ "__ixor__",
+ "__le__",
+ "__len__",
+ "__long__",
+ "__lshift__",
+ "__lt__",
+ "__mod__",
+ "__mul__",
+ "__ne__",
+ "__neg__",
+ "__new__",
+ "__nonzero__",
+ "__oct__",
+ "__or__",
+ "__pos__",
+ "__pow__",
+ "__radd__",
+ "__rand__",
+ "__rdiv__",
+ "__repr__",
+ "__reversed__",
+ "__rfloordiv__",
+ "__rlshift__",
+ "__rmod__",
+ "__rmul__",
+ "__ror__",
+ "__rpow__",
+ "__rrshift__",
+ "__rshift__",
+ "__rsub__",
+ "__rxor__",
+ "__setattr__",
+ "__setitem__",
+ "__str__",
+ "__sub__",
+ "__unicode__",
+ "__xor__",
+}
+
+MAGIC_METHODS_ALLOWING_KWARGS = {
+ "__init__",
+ "__init_subclass__",
+ "__new__",
+}
+
+MAGIC_METHODS_POS_ARGS_ONLY = MAGIC_METHODS - MAGIC_METHODS_ALLOWING_KWARGS
+
+
+def special_function_elide_names(name: str) -> bool:
+ return name in MAGIC_METHODS_POS_ARGS_ONLY
+
+
+def argument_elide_name(name: Union[str, Tuple, None]) -> bool:
+ return isinstance(name, str) and name.startswith("__")
diff --git a/mypy/strconv.py b/mypy/strconv.py
index ba01ea8..68efaeb 100644
--- a/mypy/strconv.py
+++ b/mypy/strconv.py
@@ -41,9 +41,9 @@ class StrConv(NodeVisitor[str]):
extra = [] # type: List[Tuple[str, List[mypy.nodes.Var]]]
for i, arg in enumerate(o.arguments):
kind = arg.kind # type: int
- if kind == mypy.nodes.ARG_POS:
+ if kind in (mypy.nodes.ARG_POS, mypy.nodes.ARG_NAMED):
args.append(o.arguments[i].variable)
- elif kind in (mypy.nodes.ARG_OPT, mypy.nodes.ARG_NAMED):
+ elif kind in (mypy.nodes.ARG_OPT, mypy.nodes.ARG_NAMED_OPT):
args.append(o.arguments[i].variable)
init.append(o.arguments[i].initialization_statement)
elif kind == mypy.nodes.ARG_STAR:
@@ -108,7 +108,8 @@ class StrConv(NodeVisitor[str]):
def visit_func_def(self, o: 'mypy.nodes.FuncDef') -> str:
a = self.func_helper(o)
a.insert(0, o.name())
- if mypy.nodes.ARG_NAMED in [arg.kind for arg in o.arguments]:
+ arg_kinds = {arg.kind for arg in o.arguments}
+ if len(arg_kinds & {mypy.nodes.ARG_NAMED, mypy.nodes.ARG_NAMED_OPT}) > 0:
a.insert(1, 'MaxPos({})'.format(o.max_pos))
if o.is_abstract:
a.insert(-1, 'Abstract')
@@ -291,7 +292,7 @@ class StrConv(NodeVisitor[str]):
def visit_unicode_expr(self, o: 'mypy.nodes.UnicodeExpr') -> str:
return 'UnicodeExpr({})'.format(self.str_repr(o.value))
- def str_repr(self, s):
+ def str_repr(self, s: str) -> str:
s = re.sub(r'\\u[0-9a-fA-F]{4}', lambda m: '\\' + m.group(0), s)
return re.sub('[^\\x20-\\x7e]',
lambda m: r'\u%.4x' % ord(m.group(0)), s)
diff --git a/mypy/stubgen.py b/mypy/stubgen.py
index d302adf..86b5f92 100644
--- a/mypy/stubgen.py
+++ b/mypy/stubgen.py
@@ -45,7 +45,9 @@ import subprocess
import sys
import textwrap
-from typing import Any, List, Dict, Tuple, Iterable, Optional, NamedTuple, Set
+from typing import (
+ Any, List, Dict, Tuple, Iterable, Iterator, Optional, NamedTuple, Set, Union, cast
+)
import mypy.build
import mypy.parse
@@ -55,7 +57,8 @@ from mypy import defaults
from mypy.nodes import (
Expression, IntExpr, UnaryExpr, StrExpr, BytesExpr, NameExpr, FloatExpr, MemberExpr, TupleExpr,
ListExpr, ComparisonExpr, CallExpr, ClassDef, MypyFile, Decorator, AssignmentStmt,
- IfStmt, ImportAll, ImportFrom, Import, FuncDef, FuncBase, ARG_STAR, ARG_STAR2, ARG_NAMED
+ IfStmt, ImportAll, ImportFrom, Import, FuncDef, FuncBase,
+ ARG_STAR, ARG_STAR2, ARG_NAMED, ARG_NAMED_OPT,
)
from mypy.stubgenc import parse_all_signatures, find_unique_signatures, generate_stub_for_c_module
from mypy.stubutil import is_c_module, write_header
@@ -173,7 +176,8 @@ def generate_stub(path: str, output_dir: str, _all_: Optional[List[str]] = None,
target: str = None, add_header: bool = False, module: str = None,
pyversion: Tuple[int, int] = defaults.PYTHON3_VERSION,
fast_parser: bool = False) -> None:
- source = open(path, 'rb').read()
+ with open(path, 'rb') as f:
+ source = f.read()
options = MypyOptions()
options.python_version = pyversion
options.fast_parser = fast_parser
@@ -261,7 +265,7 @@ class StubGenerator(mypy.traverser.TraverserVisitor):
name = var.name()
init_stmt = arg_.initialization_statement
if init_stmt:
- if kind == ARG_NAMED and '*' not in args:
+ if kind in (ARG_NAMED, ARG_NAMED_OPT) and '*' not in args:
args.append('*')
typename = self.get_str_type_of_node(init_stmt.rvalue, True)
arg = '{}: {} = ...'.format(name, typename)
@@ -339,6 +343,7 @@ class StubGenerator(mypy.traverser.TraverserVisitor):
for lvalue in o.lvalues:
if isinstance(lvalue, NameExpr) and self.is_namedtuple(o.rvalue):
+ assert isinstance(o.rvalue, CallExpr)
self.process_namedtuple(lvalue, o.rvalue)
continue
if isinstance(lvalue, TupleExpr):
@@ -372,7 +377,7 @@ class StubGenerator(mypy.traverser.TraverserVisitor):
return ((isinstance(callee, NameExpr) and callee.name.endswith('namedtuple')) or
(isinstance(callee, MemberExpr) and callee.name == 'namedtuple'))
- def process_namedtuple(self, lvalue, rvalue):
+ def process_namedtuple(self, lvalue: NameExpr, rvalue: CallExpr) -> None:
self.add_import_line('from collections import namedtuple\n')
if self._state != EMPTY:
self.add('\n')
@@ -380,7 +385,7 @@ class StubGenerator(mypy.traverser.TraverserVisitor):
if isinstance(rvalue.args[1], StrExpr):
items = repr(rvalue.args[1].value)
elif isinstance(rvalue.args[1], ListExpr):
- list_items = rvalue.args[1].items
+ list_items = cast(List[StrExpr], rvalue.args[1].items)
items = '[%s]' % ', '.join(repr(item.value) for item in list_items)
else:
items = '<ERROR>'
@@ -583,7 +588,7 @@ def get_qualified_name(o: Expression) -> str:
return '<ERROR>'
-def walk_packages(packages: List[str]):
+def walk_packages(packages: List[str]) -> Iterator[str]:
for package_name in packages:
package = __import__(package_name)
yield package.__name__
@@ -605,7 +610,8 @@ def main() -> None:
all_sigs = [] # type: Any
all_class_sigs = [] # type: Any
for path in glob.glob('%s/*.rst' % options.doc_dir):
- func_sigs, class_sigs = parse_all_signatures(open(path).readlines())
+ with open(path) as f:
+ func_sigs, class_sigs = parse_all_signatures(f.readlines())
all_sigs += func_sigs
all_class_sigs += class_sigs
sigs = dict(find_unique_signatures(all_sigs))
diff --git a/mypy/stubgenc.py b/mypy/stubgenc.py
index 6e1829d..278193f 100644
--- a/mypy/stubgenc.py
+++ b/mypy/stubgenc.py
@@ -6,7 +6,8 @@ The public interface is via the mypy.stubgen module.
import importlib
import os.path
import re
-
+from typing import List, Dict, Tuple
+from types import ModuleType
from mypy.stubutil import (
parse_all_signatures, find_unique_signatures, is_c_module, write_header,
@@ -14,20 +15,25 @@ from mypy.stubutil import (
)
-def generate_stub_for_c_module(module_name, target, add_header=True, sigs={}, class_sigs={}):
+def generate_stub_for_c_module(module_name: str,
+ target: str,
+ add_header: bool = True,
+ sigs: Dict[str, str] = {},
+ class_sigs: Dict[str, str] = {},
+ ) -> None:
module = importlib.import_module(module_name)
assert is_c_module(module), '%s is not a C module' % module_name
subdir = os.path.dirname(target)
if subdir and not os.path.isdir(subdir):
os.makedirs(subdir)
- functions = []
+ functions = [] # type: List[str]
done = set()
items = sorted(module.__dict__.items(), key=lambda x: x[0])
for name, obj in items:
if is_c_function(obj):
generate_c_function_stub(module, name, obj, functions, sigs=sigs)
done.add(name)
- types = []
+ types = [] # type: List[str]
for name, obj in items:
if name.startswith('__') and name.endswith('__'):
continue
@@ -62,7 +68,7 @@ def generate_stub_for_c_module(module_name, target, add_header=True, sigs={}, cl
file.write('%s\n' % line)
-def add_typing_import(output):
+def add_typing_import(output: List[str]) -> List[str]:
names = []
for name in ['Any']:
if any(re.search(r'\b%s\b' % name, line) for line in output):
@@ -73,27 +79,34 @@ def add_typing_import(output):
return output[:]
-def is_c_function(obj):
+def is_c_function(obj: object) -> bool:
return type(obj) is type(ord)
-def is_c_method(obj):
+def is_c_method(obj: object) -> bool:
return type(obj) in (type(str.index),
type(str.__add__),
type(str.__new__))
-def is_c_classmethod(obj):
+def is_c_classmethod(obj: object) -> bool:
type_str = type(obj).__name__
return type_str == 'classmethod_descriptor'
-def is_c_type(obj):
+def is_c_type(obj: object) -> bool:
return type(obj) is type(int)
-def generate_c_function_stub(module, name, obj, output, self_var=None, sigs={}, class_name=None,
- class_sigs={}):
+def generate_c_function_stub(module: ModuleType,
+ name: str,
+ obj: object,
+ output: List[str],
+ self_var: str = None,
+ sigs: Dict[str, str] = {},
+ class_name: str = None,
+ class_sigs: Dict[str, str] = {},
+ ) -> None:
if self_var:
self_arg = '%s, ' % self_var
else:
@@ -117,7 +130,13 @@ def generate_c_function_stub(module, name, obj, output, self_var=None, sigs={},
output.append('def %s(%s%s): ...' % (name, self_arg, sig))
-def generate_c_type_stub(module, class_name, obj, output, sigs={}, class_sigs={}):
+def generate_c_type_stub(module: ModuleType,
+ class_name: str,
+ obj: type,
+ output: List[str],
+ sigs: Dict[str, str] = {},
+ class_sigs: Dict[str, str] = {},
+ ) -> None:
items = sorted(obj.__dict__.items(), key=lambda x: method_name_sort_key(x[0]))
methods = []
done = set()
@@ -151,7 +170,7 @@ def generate_c_type_stub(module, class_name, obj, output, sigs={}, class_sigs={}
# TODO: Is this always object?
del all_bases[-1]
# Remove base classes of other bases as redundant.
- bases = []
+ bases = [] # type: List[type]
for base in all_bases:
if not any(issubclass(b, base) for b in bases):
bases.append(base)
@@ -169,7 +188,7 @@ def generate_c_type_stub(module, class_name, obj, output, sigs={}, class_sigs={}
output.append(' %s' % method)
-def method_name_sort_key(name):
+def method_name_sort_key(name: str) -> Tuple[int, str]:
if name in ('__new__', '__init__'):
return (0, name)
if name.startswith('__') and name.endswith('__'):
@@ -177,7 +196,7 @@ def method_name_sort_key(name):
return (1, name)
-def is_skipped_attribute(attr):
+def is_skipped_attribute(attr: str) -> bool:
return attr in ('__getattribute__',
'__str__',
'__repr__',
@@ -187,7 +206,7 @@ def is_skipped_attribute(attr):
'__weakref__') # For pickling
-def infer_method_sig(name):
+def infer_method_sig(name: str) -> str:
if name.startswith('__') and name.endswith('__'):
name = name[2:-2]
if name in ('hash', 'iter', 'next', 'sizeof', 'copy', 'deepcopy', 'reduce', 'getinitargs',
diff --git a/mypy/stubutil.py b/mypy/stubutil.py
index 2c8633c..f0d8a17 100644
--- a/mypy/stubutil.py
+++ b/mypy/stubutil.py
@@ -1,7 +1,8 @@
import re
import sys
-from typing import Any, Optional, Tuple, Sequence, MutableSequence, List, MutableMapping
+from typing import Any, Optional, Tuple, Sequence, MutableSequence, List, MutableMapping, IO
+from types import ModuleType
# Type Alias for Signatures
@@ -85,11 +86,11 @@ def find_unique_signatures(sigs: Sequence[Sig]) -> List[Sig]:
return sorted(result)
-def is_c_module(module):
+def is_c_module(module: ModuleType) -> bool:
return '__file__' not in module.__dict__ or module.__dict__['__file__'].endswith('.so')
-def write_header(file, module_name, pyversion=(3, 5)):
+def write_header(file: IO[str], module_name: str, pyversion: Tuple[int, int] = (3, 5)) -> None:
if module_name:
if pyversion[0] >= 3:
version = '%d.%d' % (sys.version_info.major,
@@ -102,7 +103,7 @@ def write_header(file, module_name, pyversion=(3, 5)):
'# NOTE: This dynamically typed stub was automatically generated by stubgen.\n\n')
-def infer_sig_from_docstring(docstr, name):
+def infer_sig_from_docstring(docstr: str, name: str) -> Optional[str]:
if not docstr:
return None
docstr = docstr.lstrip()
diff --git a/mypy/subtypes.py b/mypy/subtypes.py
index bfb3c4b..c91250e 100644
--- a/mypy/subtypes.py
+++ b/mypy/subtypes.py
@@ -1,8 +1,8 @@
-from typing import List, Dict, Callable
+from typing import List, Optional, Dict, Callable
from mypy.types import (
- Type, AnyType, UnboundType, TypeVisitor, ErrorType, Void, NoneTyp,
- Instance, TypeVarType, CallableType, TupleType, UnionType, Overloaded,
+ Type, AnyType, UnboundType, TypeVisitor, ErrorType, FormalArgument, Void, NoneTyp,
+ Instance, TypeVarType, CallableType, TupleType, TypedDictType, UnionType, Overloaded,
ErasedType, TypeList, PartialType, DeletedType, UninhabitedType, TypeType, is_named_instance
)
import mypy.applytype
@@ -10,7 +10,10 @@ import mypy.constraints
# Circular import; done in the function instead.
# import mypy.solve
from mypy import messages, sametypes
-from mypy.nodes import CONTRAVARIANT, COVARIANT
+from mypy.nodes import (
+ CONTRAVARIANT, COVARIANT,
+ ARG_POS, ARG_OPT, ARG_NAMED, ARG_NAMED_OPT, ARG_STAR, ARG_STAR2,
+)
from mypy.maptype import map_instance_to_supertype
from mypy import experiments
@@ -29,7 +32,8 @@ def check_type_parameter(lefta: Type, righta: Type, variance: int) -> bool:
def is_subtype(left: Type, right: Type,
- type_parameter_checker: TypeParameterChecker = check_type_parameter) -> bool:
+ type_parameter_checker: TypeParameterChecker = check_type_parameter,
+ *, ignore_pos_arg_names: bool = False) -> bool:
"""Is 'left' subtype of 'right'?
Also consider Any to be a subtype of any type, and vice versa. This
@@ -45,10 +49,12 @@ def is_subtype(left: Type, right: Type,
or isinstance(right, ErasedType)):
return True
elif isinstance(right, UnionType) and not isinstance(left, UnionType):
- return any(is_subtype(left, item, type_parameter_checker)
+ return any(is_subtype(left, item, type_parameter_checker,
+ ignore_pos_arg_names=ignore_pos_arg_names)
for item in right.items)
else:
- return left.accept(SubtypeVisitor(right, type_parameter_checker))
+ return left.accept(SubtypeVisitor(right, type_parameter_checker,
+ ignore_pos_arg_names=ignore_pos_arg_names))
def is_subtype_ignoring_tvars(left: Type, right: Type) -> bool:
@@ -57,9 +63,15 @@ def is_subtype_ignoring_tvars(left: Type, right: Type) -> bool:
return is_subtype(left, right, ignore_tvars)
-def is_equivalent(a: Type, b: Type,
- type_parameter_checker: TypeParameterChecker = check_type_parameter) -> bool:
- return is_subtype(a, b, type_parameter_checker) and is_subtype(b, a, type_parameter_checker)
+def is_equivalent(a: Type,
+ b: Type,
+ type_parameter_checker: TypeParameterChecker = check_type_parameter,
+ *,
+ ignore_pos_arg_names: bool = False
+ ) -> bool:
+ return (
+ is_subtype(a, b, type_parameter_checker, ignore_pos_arg_names=ignore_pos_arg_names)
+ and is_subtype(b, a, type_parameter_checker, ignore_pos_arg_names=ignore_pos_arg_names))
def satisfies_upper_bound(a: Type, upper_bound: Type) -> bool:
@@ -78,9 +90,11 @@ def satisfies_upper_bound(a: Type, upper_bound: Type) -> bool:
class SubtypeVisitor(TypeVisitor[bool]):
def __init__(self, right: Type,
- type_parameter_checker: TypeParameterChecker) -> None:
+ type_parameter_checker: TypeParameterChecker,
+ *, ignore_pos_arg_names: bool = False) -> None:
self.right = right
self.check_type_parameter = type_parameter_checker
+ self.ignore_pos_arg_names = ignore_pos_arg_names
# visit_x(left) means: is left (which is an instance of X) a subtype of
# right?
@@ -123,9 +137,9 @@ class SubtypeVisitor(TypeVisitor[bool]):
if isinstance(right, TupleType) and right.fallback.type.is_enum:
return is_subtype(left, right.fallback)
if isinstance(right, Instance):
- if left.type._promote and is_subtype(left.type._promote,
- self.right,
- self.check_type_parameter):
+ if left.type._promote and is_subtype(
+ left.type._promote, self.right, self.check_type_parameter,
+ ignore_pos_arg_names=self.ignore_pos_arg_names):
return True
rname = right.type.fullname()
if not left.type.has_base(rname) and rname != 'builtins.object':
@@ -149,12 +163,16 @@ class SubtypeVisitor(TypeVisitor[bool]):
def visit_callable_type(self, left: CallableType) -> bool:
right = self.right
if isinstance(right, CallableType):
- return is_callable_subtype(left, right)
+ return is_callable_subtype(
+ left, right,
+ ignore_pos_arg_names=self.ignore_pos_arg_names)
elif isinstance(right, Overloaded):
- return all(is_subtype(left, item, self.check_type_parameter)
+ return all(is_subtype(left, item, self.check_type_parameter,
+ ignore_pos_arg_names=self.ignore_pos_arg_names)
for item in right.items())
elif isinstance(right, Instance):
- return is_subtype(left.fallback, right)
+ return is_subtype(left.fallback, right,
+ ignore_pos_arg_names=self.ignore_pos_arg_names)
elif isinstance(right, TypeType):
# This is unsound, we don't check the __init__ signature.
return left.is_type_obj() and is_subtype(left.ret_type, right.item)
@@ -171,7 +189,10 @@ class SubtypeVisitor(TypeVisitor[bool]):
is_named_instance(right, 'typing.Container') or
is_named_instance(right, 'typing.Sequence') or
is_named_instance(right, 'typing.Reversible')):
- iter_type = right.args[0]
+ if right.args:
+ iter_type = right.args[0]
+ else:
+ iter_type = AnyType()
return all(is_subtype(li, iter_type) for li in left.items)
elif is_subtype(left.fallback, right, self.check_type_parameter):
return True
@@ -188,6 +209,21 @@ class SubtypeVisitor(TypeVisitor[bool]):
else:
return False
+ def visit_typeddict_type(self, left: TypedDictType) -> bool:
+ right = self.right
+ if isinstance(right, Instance):
+ return is_subtype(left.fallback, right, self.check_type_parameter)
+ elif isinstance(right, TypedDictType):
+ if not left.names_are_wider_than(right):
+ return False
+ for (_, l, r) in left.zip(right):
+ if not is_equivalent(l, r, self.check_type_parameter):
+ return False
+ # (NOTE: Fallbacks don't matter.)
+ return True
+ else:
+ return False
+
def visit_overloaded(self, left: Overloaded) -> bool:
right = self.right
if isinstance(right, Instance):
@@ -195,7 +231,8 @@ class SubtypeVisitor(TypeVisitor[bool]):
elif isinstance(right, CallableType) or is_named_instance(
right, 'builtins.type'):
for item in left.items():
- if is_subtype(item, right, self.check_type_parameter):
+ if is_subtype(item, right, self.check_type_parameter,
+ ignore_pos_arg_names=self.ignore_pos_arg_names):
return True
return False
elif isinstance(right, Overloaded):
@@ -203,7 +240,8 @@ class SubtypeVisitor(TypeVisitor[bool]):
if len(left.items()) != len(right.items()):
return False
for i in range(len(left.items())):
- if not is_subtype(left.items()[i], right.items()[i], self.check_type_parameter):
+ if not is_subtype(left.items()[i], right.items()[i], self.check_type_parameter,
+ ignore_pos_arg_names=self.ignore_pos_arg_names):
return False
return True
elif isinstance(right, UnboundType):
@@ -240,9 +278,14 @@ class SubtypeVisitor(TypeVisitor[bool]):
def is_callable_subtype(left: CallableType, right: CallableType,
- ignore_return: bool = False) -> bool:
+ ignore_return: bool = False,
+ ignore_pos_arg_names: bool = False) -> bool:
"""Is left a subtype of right?"""
- # TODO: Support named arguments, **args, etc.
+
+ # If either function is implicitly typed, ignore positional arg names too
+ if left.implicit or right.implicit:
+ ignore_pos_arg_names = True
+
# Non-type cannot be a subtype of type.
if right.is_type_obj() and not left.is_type_obj():
return False
@@ -271,45 +314,157 @@ def is_callable_subtype(left: CallableType, right: CallableType,
if right.is_ellipsis_args:
return True
- # Check argument types.
- if left.min_args > right.min_args:
- return False
- if left.is_var_arg:
- return is_var_arg_callable_subtype_helper(left, right)
- if right.is_var_arg:
- return False
- if len(left.arg_types) < len(right.arg_types):
- return False
- for i in range(len(right.arg_types)):
- if not is_subtype(right.arg_types[i], left.arg_types[i]):
- return False
- return True
+ right_star_type = None # type: Optional[Type]
+ right_star2_type = None # type: Optional[Type]
+ # Match up corresponding arguments and check them for compatibility. In
+ # every pair (argL, argR) of corresponding arguments from L and R, argL must
+ # be "more general" than argR if L is to be a subtype of R.
-def is_var_arg_callable_subtype_helper(left: CallableType, right: CallableType) -> bool:
- """Is left a subtype of right, assuming left has *args?
+ # Arguments are corresponding if they either share a name, share a position,
+ # or both. If L's corresponding argument is ambiguous, L is not a subtype of
+ # R.
- See also is_callable_subtype for additional assumptions we can make.
- """
- left_fixed = left.max_fixed_args()
- right_fixed = right.max_fixed_args()
- num_fixed_matching = min(left_fixed, right_fixed)
- for i in range(num_fixed_matching):
- if not is_subtype(right.arg_types[i], left.arg_types[i]):
- return False
- if not right.is_var_arg:
- for i in range(num_fixed_matching, len(right.arg_types)):
- if not is_subtype(right.arg_types[i], left.arg_types[-1]):
+ # If left has one corresponding argument by name and another by position,
+ # consider them to be one "merged" argument (and not ambiguous) if they're
+ # both optional, they're name-only and position-only respectively, and they
+ # have the same type. This rule allows functions with (*args, **kwargs) to
+ # properly stand in for the full domain of formal arguments that they're
+ # used for in practice.
+
+ # Every argument in R must have a corresponding argument in L, and every
+ # required argument in L must have a corresponding argument in R.
+ done_with_positional = False
+ for i in range(len(right.arg_types)):
+ right_kind = right.arg_kinds[i]
+ if right_kind in (ARG_STAR, ARG_STAR2, ARG_NAMED, ARG_NAMED_OPT):
+ done_with_positional = True
+ right_required = right_kind in (ARG_POS, ARG_NAMED)
+ right_pos = None if done_with_positional else i
+
+ right_arg = FormalArgument(
+ right.arg_names[i],
+ right_pos,
+ right.arg_types[i],
+ right_required)
+
+ if right_kind == ARG_STAR:
+ right_star_type = right_arg.typ
+ # Right has an infinite series of optional positional arguments
+ # here. Get all further positional arguments of left, and make sure
+ # they're more general than their corresponding member in this
+ # series. Also make sure left has its own inifite series of
+ # optional positional arguments.
+ if not left.is_var_arg:
return False
- return True
- else:
- for i in range(left_fixed, right_fixed):
- if not is_subtype(right.arg_types[i], left.arg_types[-1]):
+ j = i
+ while j < len(left.arg_kinds) and left.arg_kinds[j] in (ARG_POS, ARG_OPT):
+ left_by_position = left.argument_by_position(j)
+ assert left_by_position is not None
+ # This fetches the synthetic argument that's from the *args
+ right_by_position = right.argument_by_position(j)
+ assert right_by_position is not None
+ if not are_args_compatible(left_by_position, right_by_position,
+ ignore_pos_arg_names):
+ return False
+ j += 1
+ continue
+
+ if right_kind == ARG_STAR2:
+ right_star2_type = right_arg.typ
+ # Right has an infinite set of optional named arguments here. Get
+ # all further named arguments of left and make sure they're more
+ # general than their corresponding member in this set. Also make
+ # sure left has its own infinite set of optional named arguments.
+ if not left.is_kw_arg:
return False
- for i in range(right_fixed, left_fixed):
- if not is_subtype(right.arg_types[-1], left.arg_types[i]):
+ left_names = {name for name in left.arg_names if name is not None}
+ right_names = {name for name in right.arg_names if name is not None}
+ left_only_names = left_names - right_names
+ for name in left_only_names:
+ left_by_name = left.argument_by_name(name)
+ assert left_by_name is not None
+ # This fetches the synthetic argument that's from the **kwargs
+ right_by_name = right.argument_by_name(name)
+ assert right_by_name is not None
+ if not are_args_compatible(left_by_name, right_by_name,
+ ignore_pos_arg_names):
+ return False
+ continue
+
+ # Left must have some kind of corresponding argument.
+ left_arg = left.corresponding_argument(right_arg)
+ if left_arg is None:
+ return False
+
+ if not are_args_compatible(left_arg, right_arg, ignore_pos_arg_names):
+ return False
+
+ done_with_positional = False
+ for i in range(len(left.arg_types)):
+ left_kind = left.arg_kinds[i]
+ if left_kind in (ARG_STAR, ARG_STAR2, ARG_NAMED, ARG_NAMED_OPT):
+ done_with_positional = True
+ left_arg = FormalArgument(
+ left.arg_names[i],
+ None if done_with_positional else i,
+ left.arg_types[i],
+ left_kind in (ARG_POS, ARG_NAMED))
+
+ # Check that *args and **kwargs types match in this loop
+ if left_kind == ARG_STAR:
+ if right_star_type is not None and not is_subtype(right_star_type, left_arg.typ):
return False
- return is_subtype(right.arg_types[-1], left.arg_types[-1])
+ continue
+ elif left_kind == ARG_STAR2:
+ if right_star2_type is not None and not is_subtype(right_star2_type, left_arg.typ):
+ return False
+ continue
+
+ right_by_name = (right.argument_by_name(left_arg.name)
+ if left_arg.name is not None
+ else None)
+
+ right_by_pos = (right.argument_by_position(left_arg.pos)
+ if left_arg.pos is not None
+ else None)
+
+ # If the left hand argument corresponds to two right-hand arguments,
+ # neither of them can be required.
+ if (right_by_name is not None
+ and right_by_pos is not None
+ and right_by_name != right_by_pos
+ and (right_by_pos.required or right_by_name.required)):
+ return False
+
+ # All *required* left-hand arguments must have a corresponding
+ # right-hand argument. Optional args it does not matter.
+ if left_arg.required and right_by_pos is None and right_by_name is None:
+ return False
+
+ return True
+
+
+def are_args_compatible(
+ left: FormalArgument,
+ right: FormalArgument,
+ ignore_pos_arg_names: bool) -> bool:
+ # If right has a specific name it wants this argument to be, left must
+ # have the same.
+ if right.name is not None and left.name != right.name:
+ # But pay attention to whether we're ignoring positional arg names
+ if not ignore_pos_arg_names or right.pos is None:
+ return False
+ # If right is at a specific position, left must have the same:
+ if right.pos is not None and left.pos != right.pos:
+ return False
+ # Left must have a more general type
+ if not is_subtype(right.typ, left.typ):
+ return False
+ # If right's argument is optional, left's must also be.
+ if not right.required and left.required:
+ return False
+ return True
def unify_generic_callable(type: CallableType, target: CallableType,
diff --git a/typeshed/stdlib/3/email/mime/__init__.py b/mypy/test/__init__.py
similarity index 100%
rename from typeshed/stdlib/3/email/mime/__init__.py
rename to mypy/test/__init__.py
diff --git a/typeshed/stdlib/2/distutils/__init__.pyi b/mypy/test/collect.py
similarity index 100%
rename from typeshed/stdlib/2/distutils/__init__.pyi
rename to mypy/test/collect.py
diff --git a/mypy/test/config.py b/mypy/test/config.py
new file mode 100644
index 0000000..681f866
--- /dev/null
+++ b/mypy/test/config.py
@@ -0,0 +1,19 @@
+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
new file mode 100644
index 0000000..e1b6133
--- /dev/null
+++ b/mypy/test/data.py
@@ -0,0 +1,468 @@
+"""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
new file mode 100644
index 0000000..32d889b
--- /dev/null
+++ b/mypy/test/helpers.py
@@ -0,0 +1,285 @@
+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
new file mode 100644
index 0000000..4e27e37
--- /dev/null
+++ b/mypy/test/testargs.py
@@ -0,0 +1,18 @@
+"""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
new file mode 100644
index 0000000..970e69d
--- /dev/null
+++ b/mypy/test/testcheck.py
@@ -0,0 +1,332 @@
+"""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
new file mode 100644
index 0000000..f2ddc9b
--- /dev/null
+++ b/mypy/test/testcmdline.py
@@ -0,0 +1,104 @@
+"""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
new file mode 100644
index 0000000..af3916f
--- /dev/null
+++ b/mypy/test/testextensions.py
@@ -0,0 +1,125 @@
+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
new file mode 100644
index 0000000..d88ca1c
--- /dev/null
+++ b/mypy/test/testgraph.py
@@ -0,0 +1,69 @@
+"""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
new file mode 100644
index 0000000..2142456
--- /dev/null
+++ b/mypy/test/testinfer.py
@@ -0,0 +1,223 @@
+"""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
new file mode 100644
index 0000000..fb857bd
--- /dev/null
+++ b/mypy/test/testlex.py
@@ -0,0 +1,466 @@
+"""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
new file mode 100644
index 0000000..5818479
--- /dev/null
+++ b/mypy/test/testmoduleinfo.py
@@ -0,0 +1,14 @@
+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
new file mode 100644
index 0000000..d6789c0
--- /dev/null
+++ b/mypy/test/testparse.py
@@ -0,0 +1,79 @@
+"""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
new file mode 100644
index 0000000..cc598d2
--- /dev/null
+++ b/mypy/test/testpythoneval.py
@@ -0,0 +1,135 @@
+"""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
new file mode 100644
index 0000000..80e6980
--- /dev/null
+++ b/mypy/test/testreports.py
@@ -0,0 +1,40 @@
+"""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
new file mode 100644
index 0000000..4870fa8
--- /dev/null
+++ b/mypy/test/testsemanal.py
@@ -0,0 +1,224 @@
+"""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
new file mode 100644
index 0000000..e407f75
--- /dev/null
+++ b/mypy/test/testsolve.py
@@ -0,0 +1,156 @@
+"""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
new file mode 100644
index 0000000..0be61ca
--- /dev/null
+++ b/mypy/test/teststubgen.py
@@ -0,0 +1,186 @@
+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
new file mode 100644
index 0000000..307cb7a
--- /dev/null
+++ b/mypy/test/testsubtypes.py
@@ -0,0 +1,208 @@
+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
new file mode 100644
index 0000000..1dac308
--- /dev/null
+++ b/mypy/test/testtransform.py
@@ -0,0 +1,85 @@
+"""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
new file mode 100644
index 0000000..a465c71
--- /dev/null
+++ b/mypy/test/testtypegen.py
@@ -0,0 +1,128 @@
+"""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
new file mode 100644
index 0000000..4364848
--- /dev/null
+++ b/mypy/test/testtypes.py
@@ -0,0 +1,847 @@
+"""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/typeshed/stdlib/2/email/mime/__init__.pyi b/mypy/test/update.py
similarity index 100%
rename from typeshed/stdlib/2/email/mime/__init__.pyi
rename to mypy/test/update.py
diff --git a/mypy/typeanal.py b/mypy/typeanal.py
index fc0d897..4d9f170 100644
--- a/mypy/typeanal.py
+++ b/mypy/typeanal.py
@@ -1,9 +1,10 @@
"""Semantic analysis of types"""
+from collections import OrderedDict
from typing import Callable, cast, List, Optional
from mypy.types import (
- Type, UnboundType, TypeVarType, TupleType, UnionType, Instance,
+ Type, UnboundType, TypeVarType, TupleType, TypedDictType, UnionType, Instance,
AnyType, CallableType, Void, NoneTyp, DeletedType, TypeList, TypeVarDef, TypeVisitor,
StarType, PartialType, EllipsisType, UninhabitedType, TypeType, get_typ_args, set_typ_args,
)
@@ -191,9 +192,7 @@ class TypeAnalyser(TypeVisitor[Type]):
# Instance with an invalid number of type arguments.
instance = Instance(info, self.anal_array(t.args), t.line, t.column)
tup = info.tuple_type
- if tup is None:
- return instance
- else:
+ if tup is not None:
# The class has a Tuple[...] base class so it will be
# represented as a tuple type.
if t.args:
@@ -201,6 +200,17 @@ class TypeAnalyser(TypeVisitor[Type]):
return AnyType()
return tup.copy_modified(items=self.anal_array(tup.items),
fallback=instance)
+ td = info.typeddict_type
+ if td is not None:
+ # The class has a TypedDict[...] base class so it will be
+ # represented as a typeddict type.
+ if t.args:
+ self.fail('Generic TypedDict types not supported', t)
+ return AnyType()
+ # Create a named TypedDictType
+ return td.copy_modified(item_types=self.anal_array(list(td.items.values())),
+ fallback=instance)
+ return instance
else:
return AnyType()
@@ -294,6 +304,13 @@ class TypeAnalyser(TypeVisitor[Type]):
fallback = t.fallback if t.fallback else self.builtin_type('builtins.tuple', [AnyType()])
return TupleType(self.anal_array(t.items), fallback, t.line)
+ def visit_typeddict_type(self, t: TypedDictType) -> Type:
+ items = OrderedDict([
+ (item_name, item_type.accept(self))
+ for (item_name, item_type) in t.items.items()
+ ])
+ return TypedDictType(items, t.fallback)
+
def visit_star_type(self, t: StarType) -> Type:
return StarType(t.type.accept(self), t.line)
@@ -460,6 +477,10 @@ class TypeAnalyserPass3(TypeVisitor[None]):
for item in t.items:
item.accept(self)
+ def visit_typeddict_type(self, t: TypedDictType) -> None:
+ for item_type in t.items.values():
+ item_type.accept(self)
+
def visit_union_type(self, t: UnionType) -> None:
for item in t.items:
item.accept(self)
diff --git a/mypy/types.py b/mypy/types.py
index 34c1ff2..32d7c83 100644
--- a/mypy/types.py
+++ b/mypy/types.py
@@ -2,14 +2,20 @@
from abc import abstractmethod
import copy
+from collections import OrderedDict
from typing import (
- Any, TypeVar, Dict, List, Tuple, cast, Generic, Set, Sequence, Optional, Union
+ Any, TypeVar, Dict, List, Tuple, cast, Generic, Set, Sequence, Optional, Union, Iterable,
+ NamedTuple,
)
import mypy.nodes
-from mypy.nodes import INVARIANT, SymbolNode
+from mypy.nodes import (
+ INVARIANT, SymbolNode,
+ ARG_POS, ARG_OPT, ARG_STAR, ARG_STAR2, ARG_NAMED, ARG_NAMED_OPT,
+)
from mypy import experiments
+from mypy.sharedparse import argument_elide_name
T = TypeVar('T')
@@ -451,6 +457,9 @@ class Instance(Type):
inst.type_ref = data['type_ref'] # Will be fixed up by fixup.py later.
return inst
+ def copy_modified(self, *, args: List[Type]) -> 'Instance':
+ return Instance(self.type, args, self.line, self.column, self.erased)
+
class TypeVarType(Type):
"""A type variable type.
@@ -535,11 +544,18 @@ class FunctionLike(Type):
_dummy = object() # type: Any
+FormalArgument = NamedTuple('FormalArgument', [
+ ('name', Optional[str]),
+ ('pos', Optional[int]),
+ ('typ', Type),
+ ('required', bool)])
+
+
class CallableType(FunctionLike):
"""Type of a non-overloaded callable object (function)."""
arg_types = None # type: List[Type] # Types of function arguments
- arg_kinds = None # type: List[int] # mypy.nodes.ARG_ constants
+ arg_kinds = None # type: List[int] # ARG_ constants
arg_names = None # type: List[str] # None if not a keyword argument
min_args = 0 # Minimum number of arguments; derived from arg_kinds
is_var_arg = False # Is it a varargs function? derived from arg_kinds
@@ -581,8 +597,9 @@ class CallableType(FunctionLike):
self.arg_types = arg_types
self.arg_kinds = arg_kinds
self.arg_names = arg_names
- self.min_args = arg_kinds.count(mypy.nodes.ARG_POS)
- self.is_var_arg = mypy.nodes.ARG_STAR in arg_kinds
+ self.min_args = arg_kinds.count(ARG_POS)
+ self.is_var_arg = ARG_STAR in arg_kinds
+ self.is_kw_arg = ARG_STAR2 in arg_kinds
self.ret_type = ret_type
self.fallback = fallback
assert not name or '<bound method' not in name
@@ -654,6 +671,78 @@ class CallableType(FunctionLike):
n -= 1
return n
+ def corresponding_argument(self, model: FormalArgument) -> Optional[FormalArgument]:
+ """Return the argument in this function that corresponds to `model`"""
+
+ by_name = self.argument_by_name(model.name)
+ by_pos = self.argument_by_position(model.pos)
+ if by_name is None and by_pos is None:
+ return None
+ if by_name is not None and by_pos is not None:
+ if by_name == by_pos:
+ return by_name
+ # If we're dealing with an optional pos-only and an optional
+ # name-only arg, merge them. This is the case for all functions
+ # taking both *args and **args, or a pair of functions like so:
+
+ # def right(a: int = ...) -> None: ...
+ # def left(__a: int = ..., *, a: int = ...) -> None: ...
+ from mypy.subtypes import is_equivalent
+ if (not (by_name.required or by_pos.required)
+ and by_pos.name is None
+ and by_name.pos is None
+ and is_equivalent(by_name.typ, by_pos.typ)):
+ return FormalArgument(by_name.name, by_pos.pos, by_name.typ, False)
+ return by_name if by_name is not None else by_pos
+
+ def argument_by_name(self, name: str) -> Optional[FormalArgument]:
+ if name is None:
+ return None
+ seen_star = False
+ star2_type = None # type: Optional[Type]
+ for i, (arg_name, kind, typ) in enumerate(
+ zip(self.arg_names, self.arg_kinds, self.arg_types)):
+ # No more positional arguments after these.
+ if kind in (ARG_STAR, ARG_STAR2, ARG_NAMED, ARG_NAMED_OPT):
+ seen_star = True
+ if kind == ARG_STAR:
+ continue
+ if kind == ARG_STAR2:
+ star2_type = typ
+ continue
+ if arg_name == name:
+ position = None if seen_star else i
+ return FormalArgument(name, position, typ, kind in (ARG_POS, ARG_NAMED))
+ if star2_type is not None:
+ return FormalArgument(name, None, star2_type, False)
+ return None
+
+ def argument_by_position(self, position: int) -> Optional[FormalArgument]:
+ if position is None:
+ return None
+ if self.is_var_arg:
+ for kind, typ in zip(self.arg_kinds, self.arg_types):
+ if kind == ARG_STAR:
+ star_type = typ
+ break
+ if position >= len(self.arg_names):
+ if self.is_var_arg:
+ return FormalArgument(None, position, star_type, False)
+ else:
+ return None
+ name, kind, typ = (
+ self.arg_names[position],
+ self.arg_kinds[position],
+ self.arg_types[position],
+ )
+ if kind in (ARG_POS, ARG_OPT):
+ return FormalArgument(name, position, typ, kind == ARG_POS)
+ else:
+ if self.is_var_arg:
+ return FormalArgument(None, position, star_type, False)
+ else:
+ return None
+
def items(self) -> List['CallableType']:
return [self]
@@ -799,7 +888,7 @@ class TupleType(Type):
implicit=data['implicit'])
def copy_modified(self, *, fallback: Instance = None,
- items: List[Type] = None) -> 'TupleType':
+ items: List[Type] = None) -> 'TupleType':
if fallback is None:
fallback = self.fallback
if items is None:
@@ -811,6 +900,86 @@ class TupleType(Type):
self.line, self.column, self.implicit)
+class TypedDictType(Type):
+ """The type of a TypedDict instance. TypedDict(K1=VT1, ..., Kn=VTn)
+
+ A TypedDictType can be either named or anonymous.
+ If it is anonymous then its fallback will be an Instance of Mapping[str, V].
+ If it is named then its fallback will be an Instance of the named type (ex: "Point")
+ whose TypeInfo has a typeddict_type that is anonymous.
+ """
+
+ items = None # type: OrderedDict[str, Type] # (item_name, item_type)
+ fallback = None # type: Instance
+
+ def __init__(self, items: 'OrderedDict[str, Type]', fallback: Instance,
+ line: int = -1, column: int = -1) -> None:
+ self.items = items
+ self.fallback = fallback
+ self.can_be_true = len(self.items) > 0
+ self.can_be_false = len(self.items) == 0
+ super().__init__(line, column)
+
+ def accept(self, visitor: 'TypeVisitor[T]') -> T:
+ return visitor.visit_typeddict_type(self)
+
+ def serialize(self) -> JsonDict:
+ return {'.class': 'TypedDictType',
+ 'items': [[n, t.serialize()] for (n, t) in self.items.items()],
+ 'fallback': self.fallback.serialize(),
+ }
+
+ @classmethod
+ def deserialize(cls, data: JsonDict) -> 'TypedDictType':
+ assert data['.class'] == 'TypedDictType'
+ return TypedDictType(OrderedDict([(n, Type.deserialize(t)) for (n, t) in data['items']]),
+ Instance.deserialize(data['fallback']))
+
+ def as_anonymous(self) -> 'TypedDictType':
+ if self.fallback.type.fullname() == 'typing.Mapping':
+ return self
+ assert self.fallback.type.typeddict_type is not None
+ return self.fallback.type.typeddict_type.as_anonymous()
+
+ def copy_modified(self, *, fallback: Instance = None,
+ item_types: List[Type] = None) -> 'TypedDictType':
+ if fallback is None:
+ fallback = self.fallback
+ if item_types is None:
+ items = self.items
+ else:
+ items = OrderedDict(zip(self.items, item_types))
+ return TypedDictType(items, fallback, self.line, self.column)
+
+ def create_anonymous_fallback(self, *, value_type: Type) -> Instance:
+ anonymous = self.as_anonymous()
+ return anonymous.fallback.copy_modified(args=[ # i.e. Mapping
+ anonymous.fallback.args[0], # i.e. str
+ value_type
+ ])
+
+ def names_are_wider_than(self, other: 'TypedDictType') -> bool:
+ return len(other.items.keys() - self.items.keys()) == 0
+
+ def zip(self, right: 'TypedDictType') -> Iterable[Tuple[str, Type, Type]]:
+ left = self
+ for (item_name, left_item_type) in left.items.items():
+ right_item_type = right.items.get(item_name)
+ if right_item_type is not None:
+ yield (item_name, left_item_type, right_item_type)
+
+ def zipall(self, right: 'TypedDictType') \
+ -> Iterable[Tuple[str, Optional[Type], Optional[Type]]]:
+ left = self
+ for (item_name, left_item_type) in left.items.items():
+ right_item_type = right.items.get(item_name)
+ yield (item_name, left_item_type, right_item_type)
+ for (item_name, right_item_type) in right.items.items():
+ if item_name in left.items:
+ continue
+ yield (item_name, None, right_item_type)
+
+
class StarType(Type):
"""The star type *type_parameter.
@@ -1080,6 +1249,10 @@ class TypeVisitor(Generic[T]):
def visit_tuple_type(self, t: TupleType) -> T:
pass
+ @abstractmethod
+ def visit_typeddict_type(self, t: TypedDictType) -> T:
+ pass
+
def visit_star_type(self, t: StarType) -> T:
raise self._notimplemented_helper('star_type')
@@ -1149,9 +1322,20 @@ class TypeTranslator(TypeVisitor[Type]):
def visit_tuple_type(self, t: TupleType) -> Type:
return TupleType(self.translate_types(t.items),
+ # TODO: This appears to be unsafe.
cast(Any, t.fallback.accept(self)),
t.line, t.column)
+ def visit_typeddict_type(self, t: TypedDictType) -> Type:
+ items = OrderedDict([
+ (item_name, item_type.accept(self))
+ for (item_name, item_type) in t.items.items()
+ ])
+ return TypedDictType(items,
+ # TODO: This appears to be unsafe.
+ cast(Any, t.fallback.accept(self)),
+ t.line, t.column)
+
def visit_star_type(self, t: StarType) -> Type:
return StarType(t.type.accept(self), t.line, t.column)
@@ -1229,7 +1413,10 @@ class TypeStrVisitor(TypeVisitor[str]):
return "<Deleted '{}'>".format(t.source)
def visit_instance(self, t: Instance) -> str:
- s = t.type.fullname() if t.type is not None else '<?>'
+ if t.type is not None:
+ s = t.type.fullname() or t.type.name() or '<???>'
+ else:
+ s = '<?>'
if t.erased:
s += '*'
if t.args != []:
@@ -1250,17 +1437,17 @@ class TypeStrVisitor(TypeVisitor[str]):
for i in range(len(t.arg_types)):
if s != '':
s += ', '
- if t.arg_kinds[i] == mypy.nodes.ARG_NAMED and not bare_asterisk:
+ if t.arg_kinds[i] in (ARG_NAMED, ARG_NAMED_OPT) and not bare_asterisk:
s += '*, '
bare_asterisk = True
- if t.arg_kinds[i] == mypy.nodes.ARG_STAR:
+ if t.arg_kinds[i] == ARG_STAR:
s += '*'
- if t.arg_kinds[i] == mypy.nodes.ARG_STAR2:
+ if t.arg_kinds[i] == ARG_STAR2:
s += '**'
if t.arg_names[i]:
s += t.arg_names[i] + ': '
s += str(t.arg_types[i])
- if t.arg_kinds[i] == mypy.nodes.ARG_OPT:
+ if t.arg_kinds[i] in (ARG_OPT, ARG_NAMED_OPT):
s += ' ='
s = '({})'.format(s)
@@ -1287,6 +1474,15 @@ class TypeStrVisitor(TypeVisitor[str]):
return 'Tuple[{}, fallback={}]'.format(s, t.fallback.accept(self))
return 'Tuple[{}]'.format(s)
+ def visit_typeddict_type(self, t: TypedDictType) -> str:
+ s = self.keywords_str(t.items.items())
+ if t.fallback and t.fallback.type:
+ if s == '':
+ return 'TypedDict(_fallback={})'.format(t.fallback.accept(self))
+ else:
+ return 'TypedDict({}, _fallback={})'.format(s, t.fallback.accept(self))
+ return 'TypedDict({})'.format(s)
+
def visit_star_type(self, t: StarType) -> str:
s = t.type.accept(self)
return '*{}'.format(s)
@@ -1320,6 +1516,15 @@ class TypeStrVisitor(TypeVisitor[str]):
res.append(str(t))
return ', '.join(res)
+ def keywords_str(self, a: Iterable[Tuple[str, Type]]) -> str:
+ """Convert keywords to strings (pretty-print types)
+ and join the results with commas.
+ """
+ return ', '.join([
+ '{}={}'.format(name, t.accept(self))
+ for (name, t) in a
+ ])
+
# These constants define the method used by TypeQuery to combine multiple
# query results, e.g. for tuple types. The strategy is not used for empty
@@ -1391,6 +1596,9 @@ class TypeQuery(TypeVisitor[bool]):
def visit_tuple_type(self, t: TupleType) -> bool:
return self.query_types(t.items)
+ def visit_typeddict_type(self, t: TypedDictType) -> bool:
+ return self.query_types(t.items.values())
+
def visit_star_type(self, t: StarType) -> bool:
return t.type.accept(self)
@@ -1403,7 +1611,7 @@ class TypeQuery(TypeVisitor[bool]):
def visit_type_type(self, t: TypeType) -> bool:
return t.item.accept(self)
- def query_types(self, types: Sequence[Type]) -> bool:
+ def query_types(self, types: Iterable[Type]) -> bool:
"""Perform a query for a list of types.
Use the strategy constant to combine the results.
@@ -1512,20 +1720,24 @@ def function_type(func: mypy.nodes.FuncBase, fallback: Instance) -> FunctionLike
# Implicit type signature with dynamic types.
# Overloaded functions always have a signature, so func must be an ordinary function.
assert isinstance(func, mypy.nodes.FuncItem), str(func)
- fdef = cast(mypy.nodes.FuncItem, func)
- name = func.name()
- if name:
- name = '"{}"'.format(name)
-
- return CallableType(
- [AnyType()] * len(fdef.arg_names),
- fdef.arg_kinds,
- fdef.arg_names,
- AnyType(),
- fallback,
- name,
- implicit=True,
- )
+ return callable_type(cast(mypy.nodes.FuncItem, func), fallback)
+
+
+def callable_type(fdef: mypy.nodes.FuncItem, fallback: Instance,
+ ret_type: Type = None) -> CallableType:
+ name = fdef.name()
+ if name:
+ name = '"{}"'.format(name)
+
+ return CallableType(
+ [AnyType()] * len(fdef.arg_names),
+ fdef.arg_kinds,
+ [None if argument_elide_name(n) else n for n in fdef.arg_names],
+ ret_type or AnyType(),
+ fallback,
+ name,
+ implicit=True,
+ )
def get_typ_args(tp: Type) -> List[Type]:
diff --git a/mypy/version.py b/mypy/version.py
index 551168e..e6a889f 100644
--- a/mypy/version.py
+++ b/mypy/version.py
@@ -1,7 +1,7 @@
import os
from mypy import git
-__version__ = '0.4.6'
+__version__ = '0.470'
base_version = __version__
mypy_dir = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
diff --git a/mypy_self_check.ini b/mypy_self_check.ini
new file mode 100644
index 0000000..3d54bd3
--- /dev/null
+++ b/mypy_self_check.ini
@@ -0,0 +1,15 @@
+[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
new file mode 100644
index 0000000..3b7d272
--- /dev/null
+++ b/mypy_strict_optional.ini
@@ -0,0 +1,5 @@
+; 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
new file mode 100644
index 0000000..e1dace5
--- /dev/null
+++ b/pinfer/.gitignore
@@ -0,0 +1,3 @@
+__pycache__
+*~
+*.pyc
diff --git a/pinfer/LICENSE b/pinfer/LICENSE
new file mode 100644
index 0000000..ecdce98
--- /dev/null
+++ b/pinfer/LICENSE
@@ -0,0 +1,27 @@
+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
new file mode 100644
index 0000000..1f4fe4c
--- /dev/null
+++ b/pinfer/README
@@ -0,0 +1,47 @@
+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/typeshed/stdlib/2/wsgiref/__init__.pyi b/pinfer/__init__.py
similarity index 100%
rename from typeshed/stdlib/2/wsgiref/__init__.pyi
rename to pinfer/__init__.py
diff --git a/pinfer/inspect3.py b/pinfer/inspect3.py
new file mode 100644
index 0000000..4d74be1
--- /dev/null
+++ b/pinfer/inspect3.py
@@ -0,0 +1,122 @@
+# 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
new file mode 100644
index 0000000..451038d
--- /dev/null
+++ b/pinfer/p.py
@@ -0,0 +1,83 @@
+#!/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
new file mode 100644
index 0000000..3dd1445
--- /dev/null
+++ b/pinfer/pinfer.py
@@ -0,0 +1,686 @@
+"""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
new file mode 100644
index 0000000..d6168db
--- /dev/null
+++ b/pinfer/test_pinfer.py
@@ -0,0 +1,302 @@
+"""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
new file mode 100644
index 0000000..688e8c0
--- /dev/null
+++ b/pinfer/test_pinfer3.py
@@ -0,0 +1,31 @@
+""" 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
new file mode 100644
index 0000000..6e1e493
--- /dev/null
+++ b/pinfer/unparse.py
@@ -0,0 +1,610 @@
+# 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
new file mode 100644
index 0000000..0936cb2
--- /dev/null
+++ b/pinfer/unparse3.py
@@ -0,0 +1,610 @@
+# 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
new file mode 100644
index 0000000..2b14288
--- /dev/null
+++ b/pytest.ini
@@ -0,0 +1,14 @@
+[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
new file mode 100755
index 0000000..05f6179
--- /dev/null
+++ b/runtests.py
@@ -0,0 +1,428 @@
+#!/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
new file mode 100755
index 0000000..43fce06
--- /dev/null
+++ b/scripts/myunit
@@ -0,0 +1,9 @@
+#!/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 dfa2885..43ab1b3 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,7 +1,24 @@
[flake8]
max-line-length = 99
-exclude = mypy/codec/*
-# Thing to ignore:
+# 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)
@@ -10,7 +27,10 @@ exclude = mypy/codec/*
# W503: line break before binary operator
# E704: multiple statements on one line (def)
# E402: module level import not at top of file
-ignore = E251,E128,F401,W601,E701,W503,E704,E402
+# B3??: Python 3 compatibility warnings
+# B006: use of mutable defaults in function signatures
+# B007: Loop control variable not used within the loop body.
+ignore = E251,E128,F401,W601,E701,W503,E704,E402,B3,B006,B007
[coverage:run]
branch = true
@@ -19,3 +39,12 @@ parallel = true
[coverage:report]
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"
diff --git a/setup.py b/setup.py
index 374f76b..ec62117 100644
--- a/setup.py
+++ b/setup.py
@@ -9,8 +9,11 @@ if sys.version_info < (3, 2, 0):
sys.stderr.write("ERROR: You need Python 3.2 or later to use mypy.\n")
exit(1)
-from distutils.core import setup
-from distutils.command.build_py import build_py
+# This requires setuptools when building; setuptools is not needed
+# when installing from a wheel file (though it is still neeeded for
+# alternative forms of installing, as suggested by README.md).
+from setuptools import setup
+from setuptools.command.build_py import build_py
from mypy.version import base_version
from mypy import git
@@ -81,19 +84,27 @@ classifiers = [
'Programming Language :: Python :: 3.3',
'Programming Language :: Python :: 3.4',
'Programming Language :: Python :: 3.5',
+ 'Programming Language :: Python :: 3.6',
'Topic :: Software Development',
]
package_dir = {'mypy': 'mypy'}
-if sys.version_info < (3, 5, 0):
- package_dir[''] = 'lib-typing/3.2'
scripts = ['scripts/mypy', 'scripts/stubgen']
if os.name == 'nt':
scripts.append('scripts/mypy.bat')
-setup(name='mypy-lang',
+# These requirements are used when installing by other means than bdist_wheel.
+# E.g. "pip3 install ." or
+# "pip3 install git+git://github.com/python/mypy.git"
+# (as suggested by README.md).
+install_requires = []
+install_requires.append('typed-ast >= 0.6.3')
+if sys.version_info < (3, 5):
+ install_requires.append('typing >= 3.5.3')
+
+setup(name='mypy',
version=version,
description=description,
long_description=long_description,
@@ -103,10 +114,11 @@ setup(name='mypy-lang',
license='MIT License',
platforms=['POSIX'],
package_dir=package_dir,
- py_modules=['typing'] if sys.version_info < (3, 5, 0) else [],
+ py_modules=[],
packages=['mypy'],
scripts=scripts,
data_files=data_files,
classifiers=classifiers,
cmdclass={'build_py': CustomPythonBuild},
+ install_requires=install_requires,
)
diff --git a/test-data/.flake8 b/test-data/.flake8
new file mode 120000
index 0000000..3ec8bd5
--- /dev/null
+++ b/test-data/.flake8
@@ -0,0 +1 @@
+../typeshed/.flake8
\ No newline at end of file
diff --git a/test-data/samples/bottles.py b/test-data/samples/bottles.py
new file mode 100644
index 0000000..ddf77f5
--- /dev/null
+++ b/test-data/samples/bottles.py
@@ -0,0 +1,13 @@
+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
new file mode 100644
index 0000000..d2eb4ac
--- /dev/null
+++ b/test-data/samples/class.py
@@ -0,0 +1,18 @@
+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
new file mode 100644
index 0000000..105c27a
--- /dev/null
+++ b/test-data/samples/cmdline.py
@@ -0,0 +1,8 @@
+# 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
new file mode 100644
index 0000000..56b6f8f
--- /dev/null
+++ b/test-data/samples/crawl.py
@@ -0,0 +1,863 @@
+#!/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
new file mode 100644
index 0000000..5eaad70
--- /dev/null
+++ b/test-data/samples/crawl2.py
@@ -0,0 +1,852 @@
+#!/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
new file mode 100644
index 0000000..d74a5b5
--- /dev/null
+++ b/test-data/samples/dict.py
@@ -0,0 +1,8 @@
+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
new file mode 100644
index 0000000..26248c8
--- /dev/null
+++ b/test-data/samples/fib.py
@@ -0,0 +1,5 @@
+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
new file mode 100644
index 0000000..f540c7c
--- /dev/null
+++ b/test-data/samples/files.py
@@ -0,0 +1,14 @@
+# 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
new file mode 100644
index 0000000..f7eeed4
--- /dev/null
+++ b/test-data/samples/for.py
@@ -0,0 +1,4 @@
+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
new file mode 100644
index 0000000..9150c96
--- /dev/null
+++ b/test-data/samples/generators.py
@@ -0,0 +1,24 @@
+# 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
new file mode 100644
index 0000000..47e7626
--- /dev/null
+++ b/test-data/samples/greet.py
@@ -0,0 +1,8 @@
+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
new file mode 100644
index 0000000..d3f1cee
--- /dev/null
+++ b/test-data/samples/guess.py
@@ -0,0 +1,32 @@
+# "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
new file mode 100644
index 0000000..6c0b2ca
--- /dev/null
+++ b/test-data/samples/hello.py
@@ -0,0 +1,2 @@
+import typing
+print('Hello, world')
diff --git a/test-data/samples/input.py b/test-data/samples/input.py
new file mode 100644
index 0000000..cca9233
--- /dev/null
+++ b/test-data/samples/input.py
@@ -0,0 +1,3 @@
+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
new file mode 100644
index 0000000..9ee2475
--- /dev/null
+++ b/test-data/samples/itertool.py
@@ -0,0 +1,16 @@
+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
new file mode 100644
index 0000000..5889a8e
--- /dev/null
+++ b/test-data/samples/readme.txt
@@ -0,0 +1,25 @@
+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
new file mode 100644
index 0000000..6d8d799
--- /dev/null
+++ b/test-data/samples/regexp.py
@@ -0,0 +1,7 @@
+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
new file mode 100644
index 0000000..ef91964
--- /dev/null
+++ b/test-data/stdlib-samples/3.2/base64.py
@@ -0,0 +1,411 @@
+#! /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
new file mode 100644
index 0000000..ec27b90
--- /dev/null
+++ b/test-data/stdlib-samples/3.2/fnmatch.py
@@ -0,0 +1,112 @@
+"""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
new file mode 100644
index 0000000..bd1fddf
--- /dev/null
+++ b/test-data/stdlib-samples/3.2/genericpath.py
@@ -0,0 +1,112 @@
+"""
+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
new file mode 100644
index 0000000..32f5bce
--- /dev/null
+++ b/test-data/stdlib-samples/3.2/getopt.py
@@ -0,0 +1,220 @@
+"""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
new file mode 100644
index 0000000..0f3d5f5
--- /dev/null
+++ b/test-data/stdlib-samples/3.2/glob.py
@@ -0,0 +1,84 @@
+"""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
new file mode 100644
index 0000000..aa861eb
--- /dev/null
+++ b/test-data/stdlib-samples/3.2/incomplete/logging/__init__.py
@@ -0,0 +1,1873 @@
+# 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/typeshed/stdlib/2/xml/__init__.pyi b/test-data/stdlib-samples/3.2/incomplete/urllib/__init__.py
similarity index 100%
rename from typeshed/stdlib/2/xml/__init__.pyi
rename to test-data/stdlib-samples/3.2/incomplete/urllib/__init__.py
diff --git a/test-data/stdlib-samples/3.2/incomplete/urllib/parse.py b/test-data/stdlib-samples/3.2/incomplete/urllib/parse.py
new file mode 100644
index 0000000..4fa65c4
--- /dev/null
+++ b/test-data/stdlib-samples/3.2/incomplete/urllib/parse.py
@@ -0,0 +1,980 @@
+"""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
new file mode 100644
index 0000000..cf5d59e
--- /dev/null
+++ b/test-data/stdlib-samples/3.2/posixpath.py
@@ -0,0 +1,466 @@
+"""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
new file mode 100644
index 0000000..650c1a3
--- /dev/null
+++ b/test-data/stdlib-samples/3.2/pprint.py
@@ -0,0 +1,380 @@
+# 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
new file mode 100644
index 0000000..8ce0a69
--- /dev/null
+++ b/test-data/stdlib-samples/3.2/random.py
@@ -0,0 +1,743 @@
+"""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
new file mode 100644
index 0000000..7204a4d
--- /dev/null
+++ b/test-data/stdlib-samples/3.2/shutil.py
@@ -0,0 +1,790 @@
+"""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
new file mode 100644
index 0000000..e286525
--- /dev/null
+++ b/test-data/stdlib-samples/3.2/subprocess.py
@@ -0,0 +1,1703 @@
+# 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
new file mode 100644
index 0000000..d12e21e
--- /dev/null
+++ b/test-data/stdlib-samples/3.2/tempfile.py
@@ -0,0 +1,717 @@
+"""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/typeshed/stdlib/2/xml/etree/__init__.pyi b/test-data/stdlib-samples/3.2/test/__init__.py
similarity index 100%
rename from typeshed/stdlib/2/xml/etree/__init__.pyi
rename to test-data/stdlib-samples/3.2/test/__init__.py
diff --git a/test-data/stdlib-samples/3.2/test/randv2_32.pck b/test-data/stdlib-samples/3.2/test/randv2_32.pck
new file mode 100644
index 0000000..587ab24
--- /dev/null
+++ b/test-data/stdlib-samples/3.2/test/randv2_32.pck
@@ -0,0 +1,633 @@
+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
new file mode 100644
index 0000000..090dd6f
--- /dev/null
+++ b/test-data/stdlib-samples/3.2/test/randv2_64.pck
@@ -0,0 +1,633 @@
+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
new file mode 100644
index 0000000..09fc38b
--- /dev/null
+++ b/test-data/stdlib-samples/3.2/test/randv3.pck
@@ -0,0 +1,633 @@
+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
new file mode 100644
index 0000000..1f61e13
--- /dev/null
+++ b/test-data/stdlib-samples/3.2/test/subprocessdata/fd_status.py
@@ -0,0 +1,24 @@
+"""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
new file mode 100644
index 0000000..1dc3191
--- /dev/null
+++ b/test-data/stdlib-samples/3.2/test/subprocessdata/input_reader.py
@@ -0,0 +1,7 @@
+"""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
new file mode 100644
index 0000000..fe6f9db
--- /dev/null
+++ b/test-data/stdlib-samples/3.2/test/subprocessdata/qcat.py
@@ -0,0 +1,7 @@
+"""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
new file mode 100644
index 0000000..6990637
--- /dev/null
+++ b/test-data/stdlib-samples/3.2/test/subprocessdata/qgrep.py
@@ -0,0 +1,10 @@
+"""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
new file mode 100644
index 0000000..6072aec
--- /dev/null
+++ b/test-data/stdlib-samples/3.2/test/subprocessdata/sigchild_ignore.py
@@ -0,0 +1,6 @@
+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
new file mode 100644
index 0000000..a36ba28
--- /dev/null
+++ b/test-data/stdlib-samples/3.2/test/support.py
@@ -0,0 +1,1602 @@
+"""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
new file mode 100644
index 0000000..9e4dcf5
--- /dev/null
+++ b/test-data/stdlib-samples/3.2/test/test_base64.py
@@ -0,0 +1,267 @@
+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
new file mode 100644
index 0000000..0f5a23b
--- /dev/null
+++ b/test-data/stdlib-samples/3.2/test/test_fnmatch.py
@@ -0,0 +1,93 @@
+"""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
new file mode 100644
index 0000000..43b78e7
--- /dev/null
+++ b/test-data/stdlib-samples/3.2/test/test_genericpath.py
@@ -0,0 +1,313 @@
+"""
+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
new file mode 100644
index 0000000..3320552
--- /dev/null
+++ b/test-data/stdlib-samples/3.2/test/test_getopt.py
@@ -0,0 +1,190 @@
+# 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
new file mode 100644
index 0000000..08c8932
--- /dev/null
+++ b/test-data/stdlib-samples/3.2/test/test_glob.py
@@ -0,0 +1,122 @@
+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
new file mode 100644
index 0000000..de98975
--- /dev/null
+++ b/test-data/stdlib-samples/3.2/test/test_posixpath.py
@@ -0,0 +1,531 @@
+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
new file mode 100644
index 0000000..cf54ebd
--- /dev/null
+++ b/test-data/stdlib-samples/3.2/test/test_pprint.py
@@ -0,0 +1,488 @@
+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
new file mode 100644
index 0000000..5989cee
--- /dev/null
+++ b/test-data/stdlib-samples/3.2/test/test_random.py
@@ -0,0 +1,533 @@
+#!/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
new file mode 100644
index 0000000..23ae745
--- /dev/null
+++ b/test-data/stdlib-samples/3.2/test/test_set.py
@@ -0,0 +1,1884 @@
+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
new file mode 100644
index 0000000..32e0fd1
--- /dev/null
+++ b/test-data/stdlib-samples/3.2/test/test_shutil.py
@@ -0,0 +1,978 @@
+# 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
new file mode 100644
index 0000000..772d8cc
--- /dev/null
+++ b/test-data/stdlib-samples/3.2/test/test_subprocess.py
@@ -0,0 +1,1764 @@
+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
new file mode 100644
index 0000000..31b0fec
--- /dev/null
+++ b/test-data/stdlib-samples/3.2/test/test_tempfile.py
@@ -0,0 +1,1122 @@
+# 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
new file mode 100644
index 0000000..79d921a
--- /dev/null
+++ b/test-data/stdlib-samples/3.2/test/test_textwrap.py
@@ -0,0 +1,601 @@
+#
+# 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
new file mode 100644
index 0000000..92ebd95
--- /dev/null
+++ b/test-data/stdlib-samples/3.2/test/tf_inherit_check.py
@@ -0,0 +1,25 @@
+# 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
new file mode 100644
index 0000000..a6d0266
--- /dev/null
+++ b/test-data/stdlib-samples/3.2/textwrap.py
@@ -0,0 +1,391 @@
+"""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
new file mode 100644
index 0000000..1caeabf
--- /dev/null
+++ b/test-data/unit/check-abstract.test
@@ -0,0 +1,734 @@
+-- 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
new file mode 100644
index 0000000..0758165
--- /dev/null
+++ b/test-data/unit/check-async-await.test
@@ -0,0 +1,376 @@
+-- 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
new file mode 100644
index 0000000..05fa1a9
--- /dev/null
+++ b/test-data/unit/check-basic.test
@@ -0,0 +1,310 @@
+[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
new file mode 100644
index 0000000..ee935ae
--- /dev/null
+++ b/test-data/unit/check-bound.test
@@ -0,0 +1,203 @@
+-- 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
new file mode 100644
index 0000000..429ad44
--- /dev/null
+++ b/test-data/unit/check-callable.test
@@ -0,0 +1,345 @@
+[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
new file mode 100644
index 0000000..a18532d
--- /dev/null
+++ b/test-data/unit/check-class-namedtuple.test
@@ -0,0 +1,378 @@
+[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
new file mode 100644
index 0000000..2f6e029
--- /dev/null
+++ b/test-data/unit/check-classes.test
@@ -0,0 +1,2430 @@
+-- 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
new file mode 100644
index 0000000..ae8bab8
--- /dev/null
+++ b/test-data/unit/check-columns.test
@@ -0,0 +1,68 @@
+[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
new file mode 100644
index 0000000..997a996
--- /dev/null
+++ b/test-data/unit/check-dynamic-typing.test
@@ -0,0 +1,676 @@
+-- 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
new file mode 100644
index 0000000..8b103f6
--- /dev/null
+++ b/test-data/unit/check-expressions.test
@@ -0,0 +1,1652 @@
+-- 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
new file mode 100644
index 0000000..7f322d7
--- /dev/null
+++ b/test-data/unit/check-fastparse.test
@@ -0,0 +1,191 @@
+[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
new file mode 100644
index 0000000..409f4db
--- /dev/null
+++ b/test-data/unit/check-flags.test
@@ -0,0 +1,242 @@
+[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
new file mode 100644
index 0000000..31a6168
--- /dev/null
+++ b/test-data/unit/check-functions.test
@@ -0,0 +1,1666 @@
+-- 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
new file mode 100644
index 0000000..46df3c9
--- /dev/null
+++ b/test-data/unit/check-generic-subtyping.test
@@ -0,0 +1,749 @@
+-- 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
new file mode 100644
index 0000000..225d66f
--- /dev/null
+++ b/test-data/unit/check-generics.test
@@ -0,0 +1,1419 @@
+-- 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
new file mode 100644
index 0000000..b6d127c
--- /dev/null
+++ b/test-data/unit/check-ignore.test
@@ -0,0 +1,218 @@
+[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
new file mode 100644
index 0000000..439d536
--- /dev/null
+++ b/test-data/unit/check-incremental.test
@@ -0,0 +1,1780 @@
+-- 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
new file mode 100644
index 0000000..7673093
--- /dev/null
+++ b/test-data/unit/check-inference-context.test
@@ -0,0 +1,820 @@
+
+
+-- 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
new file mode 100644
index 0000000..54f73f5
--- /dev/null
+++ b/test-data/unit/check-inference.test
@@ -0,0 +1,1765 @@
+-- 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
new file mode 100644
index 0000000..d6041cc
--- /dev/null
+++ b/test-data/unit/check-isinstance.test
@@ -0,0 +1,1330 @@
+[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
new file mode 100644
index 0000000..ac8f388
--- /dev/null
+++ b/test-data/unit/check-kwargs.test
@@ -0,0 +1,339 @@
+-- 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
new file mode 100644
index 0000000..c9c67e8
--- /dev/null
+++ b/test-data/unit/check-lists.test
@@ -0,0 +1,72 @@
+-- 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
new file mode 100644
index 0000000..2444ce7
--- /dev/null
+++ b/test-data/unit/check-modules.test
@@ -0,0 +1,1408 @@
+-- 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
new file mode 100644
index 0000000..678ccad
--- /dev/null
+++ b/test-data/unit/check-multiple-inheritance.test
@@ -0,0 +1,242 @@
+-- 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
new file mode 100644
index 0000000..71a058b
--- /dev/null
+++ b/test-data/unit/check-namedtuple.test
@@ -0,0 +1,429 @@
+[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
new file mode 100644
index 0000000..b2a2662
--- /dev/null
+++ b/test-data/unit/check-newsyntax.test
@@ -0,0 +1,87 @@
+[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
new file mode 100644
index 0000000..880a00f
--- /dev/null
+++ b/test-data/unit/check-newtype.test
@@ -0,0 +1,319 @@
+-- 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
new file mode 100644
index 0000000..eca81bf
--- /dev/null
+++ b/test-data/unit/check-optional.test
@@ -0,0 +1,527 @@
+-- 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
new file mode 100644
index 0000000..e173fb2
--- /dev/null
+++ b/test-data/unit/check-overloading.test
@@ -0,0 +1,759 @@
+-- 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
new file mode 100644
index 0000000..99a55f0
--- /dev/null
+++ b/test-data/unit/check-python2.test
@@ -0,0 +1,221 @@
+-- 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
new file mode 100644
index 0000000..98bcfa1
--- /dev/null
+++ b/test-data/unit/check-selftype.test
@@ -0,0 +1,358 @@
+[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
new file mode 100644
index 0000000..0a07829
--- /dev/null
+++ b/test-data/unit/check-semanal-error.test
@@ -0,0 +1,81 @@
+-- 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
new file mode 100644
index 0000000..b945fd1
--- /dev/null
+++ b/test-data/unit/check-statements.test
@@ -0,0 +1,1322 @@
+-- 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
new file mode 100644
index 0000000..2993113
--- /dev/null
+++ b/test-data/unit/check-super.test
@@ -0,0 +1,109 @@
+-- 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
new file mode 100644
index 0000000..50d6a2d
--- /dev/null
+++ b/test-data/unit/check-tuples.test
@@ -0,0 +1,927 @@
+-- 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
new file mode 100644
index 0000000..20022cc
--- /dev/null
+++ b/test-data/unit/check-type-aliases.test
@@ -0,0 +1,74 @@
+[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
new file mode 100644
index 0000000..c4905a7
--- /dev/null
+++ b/test-data/unit/check-type-checks.test
@@ -0,0 +1,113 @@
+-- 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
new file mode 100644
index 0000000..0a39996
--- /dev/null
+++ b/test-data/unit/check-type-promotion.test
@@ -0,0 +1,39 @@
+-- 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
new file mode 100644
index 0000000..424c8b2
--- /dev/null
+++ b/test-data/unit/check-typeddict.test
@@ -0,0 +1,462 @@
+-- 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
new file mode 100644
index 0000000..26e56a5
--- /dev/null
+++ b/test-data/unit/check-typevar-values.test
@@ -0,0 +1,505 @@
+-- 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
new file mode 100644
index 0000000..a1d88cb
--- /dev/null
+++ b/test-data/unit/check-underscores.test
@@ -0,0 +1,16 @@
+[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
new file mode 100644
index 0000000..8c979d7
--- /dev/null
+++ b/test-data/unit/check-unions.test
@@ -0,0 +1,140 @@
+-- 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
new file mode 100644
index 0000000..a18a42b
--- /dev/null
+++ b/test-data/unit/check-unreachable-code.test
@@ -0,0 +1,459 @@
+-- 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
new file mode 100644
index 0000000..7f36e69
--- /dev/null
+++ b/test-data/unit/check-unsupported.test
@@ -0,0 +1,15 @@
+-- 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
new file mode 100644
index 0000000..89120bf
--- /dev/null
+++ b/test-data/unit/check-varargs.test
@@ -0,0 +1,590 @@
+-- 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
new file mode 100644
index 0000000..ab5f66b
--- /dev/null
+++ b/test-data/unit/check-warnings.test
@@ -0,0 +1,132 @@
+-- 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
new file mode 100644
index 0000000..9a17285
--- /dev/null
+++ b/test-data/unit/cmdline.test
@@ -0,0 +1,479 @@
+-- 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
new file mode 100644
index 0000000..4e2cc57
--- /dev/null
+++ b/test-data/unit/fixtures/__new__.pyi
@@ -0,0 +1,14 @@
+# 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
new file mode 100644
index 0000000..5909cb6
--- /dev/null
+++ b/test-data/unit/fixtures/alias.pyi
@@ -0,0 +1,12 @@
+# 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
new file mode 100644
index 0000000..e4a6ffe
--- /dev/null
+++ b/test-data/unit/fixtures/args.pyi
@@ -0,0 +1,29 @@
+# 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
new file mode 100644
index 0000000..7a166a0
--- /dev/null
+++ b/test-data/unit/fixtures/async_await.pyi
@@ -0,0 +1,9 @@
+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
new file mode 100644
index 0000000..8ec3fdd
--- /dev/null
+++ b/test-data/unit/fixtures/bool.pyi
@@ -0,0 +1,14 @@
+# 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
new file mode 100644
index 0000000..ae58648
--- /dev/null
+++ b/test-data/unit/fixtures/callable.pyi
@@ -0,0 +1,26 @@
+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
new file mode 100644
index 0000000..282839d
--- /dev/null
+++ b/test-data/unit/fixtures/classmethod.pyi
@@ -0,0 +1,22 @@
+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
new file mode 100644
index 0000000..d4135be
--- /dev/null
+++ b/test-data/unit/fixtures/complex.pyi
@@ -0,0 +1,11 @@
+# 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
new file mode 100644
index 0000000..5a78864
--- /dev/null
+++ b/test-data/unit/fixtures/dict.pyi
@@ -0,0 +1,34 @@
+# 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
new file mode 100644
index 0000000..05015ec
--- /dev/null
+++ b/test-data/unit/fixtures/exception.pyi
@@ -0,0 +1,12 @@
+
+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
new file mode 100644
index 0000000..4762806
--- /dev/null
+++ b/test-data/unit/fixtures/for.pyi
@@ -0,0 +1,19 @@
+# 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
new file mode 100644
index 0000000..768ca90
--- /dev/null
+++ b/test-data/unit/fixtures/function.pyi
@@ -0,0 +1,10 @@
+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
new file mode 100644
index 0000000..c155a97
--- /dev/null
+++ b/test-data/unit/fixtures/isinstance.pyi
@@ -0,0 +1,22 @@
+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
new file mode 100644
index 0000000..4b35698
--- /dev/null
+++ b/test-data/unit/fixtures/isinstancelist.pyi
@@ -0,0 +1,44 @@
+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
new file mode 100644
index 0000000..9413cf7
--- /dev/null
+++ b/test-data/unit/fixtures/list.pyi
@@ -0,0 +1,30 @@
+# 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
new file mode 100644
index 0000000..fb2a4c2
--- /dev/null
+++ b/test-data/unit/fixtures/module.pyi
@@ -0,0 +1,18 @@
+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
new file mode 100644
index 0000000..cc1b552
--- /dev/null
+++ b/test-data/unit/fixtures/module_all.pyi
@@ -0,0 +1,15 @@
+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
new file mode 100644
index 0000000..ed17d4d
--- /dev/null
+++ b/test-data/unit/fixtures/module_all_python2.pyi
@@ -0,0 +1,16 @@
+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
new file mode 100644
index 0000000..a647ff1
--- /dev/null
+++ b/test-data/unit/fixtures/ops.pyi
@@ -0,0 +1,56 @@
+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
new file mode 100644
index 0000000..b6ec4d4
--- /dev/null
+++ b/test-data/unit/fixtures/primitives.pyi
@@ -0,0 +1,17 @@
+# 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
new file mode 100644
index 0000000..b2e747b
--- /dev/null
+++ b/test-data/unit/fixtures/property.pyi
@@ -0,0 +1,17 @@
+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
new file mode 100644
index 0000000..61e48be
--- /dev/null
+++ b/test-data/unit/fixtures/python2.pyi
@@ -0,0 +1,18 @@
+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
new file mode 100644
index 0000000..cb8bbcf
--- /dev/null
+++ b/test-data/unit/fixtures/set.pyi
@@ -0,0 +1,21 @@
+# 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
new file mode 100644
index 0000000..c01ffbb
--- /dev/null
+++ b/test-data/unit/fixtures/slice.pyi
@@ -0,0 +1,13 @@
+# 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
new file mode 100644
index 0000000..139acee
--- /dev/null
+++ b/test-data/unit/fixtures/staticmethod.pyi
@@ -0,0 +1,18 @@
+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
new file mode 100644
index 0000000..afdc2bf
--- /dev/null
+++ b/test-data/unit/fixtures/transform.pyi
@@ -0,0 +1,30 @@
+# 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
new file mode 100644
index 0000000..b195dfa
--- /dev/null
+++ b/test-data/unit/fixtures/tuple-simple.pyi
@@ -0,0 +1,20 @@
+# 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
new file mode 100644
index 0000000..6fe63b6
--- /dev/null
+++ b/test-data/unit/fixtures/tuple.pyi
@@ -0,0 +1,28 @@
+# 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
new file mode 100644
index 0000000..78a41f9
--- /dev/null
+++ b/test-data/unit/fixtures/union.pyi
@@ -0,0 +1,18 @@
+# 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
new file mode 100644
index 0000000..eec6228
--- /dev/null
+++ b/test-data/unit/lib-stub/__builtin__.pyi
@@ -0,0 +1,27 @@
+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
new file mode 100644
index 0000000..4afe734
--- /dev/null
+++ b/test-data/unit/lib-stub/abc.pyi
@@ -0,0 +1,3 @@
+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
new file mode 100644
index 0000000..9a636bf
--- /dev/null
+++ b/test-data/unit/lib-stub/builtins.pyi
@@ -0,0 +1,23 @@
+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
new file mode 100644
index 0000000..00b7cea
--- /dev/null
+++ b/test-data/unit/lib-stub/collections.pyi
@@ -0,0 +1,3 @@
+import typing
+
+namedtuple = object()
diff --git a/test-data/unit/lib-stub/mypy_extensions.pyi b/test-data/unit/lib-stub/mypy_extensions.pyi
new file mode 100644
index 0000000..2bfc072
--- /dev/null
+++ b/test-data/unit/lib-stub/mypy_extensions.pyi
@@ -0,0 +1,6 @@
+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
new file mode 100644
index 0000000..3959cb0
--- /dev/null
+++ b/test-data/unit/lib-stub/sys.pyi
@@ -0,0 +1,2 @@
+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
new file mode 100644
index 0000000..aa0a19f
--- /dev/null
+++ b/test-data/unit/lib-stub/types.pyi
@@ -0,0 +1,4 @@
+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
new file mode 100644
index 0000000..77a7b34
--- /dev/null
+++ b/test-data/unit/lib-stub/typing.pyi
@@ -0,0 +1,90 @@
+# 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
new file mode 100644
index 0000000..f2251a9
--- /dev/null
+++ b/test-data/unit/parse-errors.test
@@ -0,0 +1,496 @@
+-- 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
new file mode 100644
index 0000000..7d4931e
--- /dev/null
+++ b/test-data/unit/parse-python2.test
@@ -0,0 +1,399 @@
+-- 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
new file mode 100644
index 0000000..0dec0f3
--- /dev/null
+++ b/test-data/unit/parse.test
@@ -0,0 +1,3401 @@
+-- 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
new file mode 100644
index 0000000..12fa5a6
--- /dev/null
+++ b/test-data/unit/python2eval.test
@@ -0,0 +1,471 @@
+-- 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
new file mode 100644
index 0000000..6d16903
--- /dev/null
+++ b/test-data/unit/pythoneval-asyncio.test
@@ -0,0 +1,486 @@
+-- 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
new file mode 100644
index 0000000..3ae2df5
--- /dev/null
+++ b/test-data/unit/pythoneval-enum.test
@@ -0,0 +1,134 @@
+-- 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
new file mode 100644
index 0000000..7945fe5
--- /dev/null
+++ b/test-data/unit/pythoneval.test
@@ -0,0 +1,1214 @@
+-- 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
new file mode 100644
index 0000000..b5147bd
--- /dev/null
+++ b/test-data/unit/semanal-abstractclasses.test
@@ -0,0 +1,119 @@
+[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
new file mode 100644
index 0000000..3c11da8
--- /dev/null
+++ b/test-data/unit/semanal-basic.test
@@ -0,0 +1,459 @@
+[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
new file mode 100644
index 0000000..431261f
--- /dev/null
+++ b/test-data/unit/semanal-classes.test
@@ -0,0 +1,623 @@
+-- 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
new file mode 100644
index 0000000..06fd3d0
--- /dev/null
+++ b/test-data/unit/semanal-errors.test
@@ -0,0 +1,1323 @@
+[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
new file mode 100644
index 0000000..7c5728b
--- /dev/null
+++ b/test-data/unit/semanal-expressions.test
@@ -0,0 +1,395 @@
+[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
new file mode 100644
index 0000000..7a00e66
--- /dev/null
+++ b/test-data/unit/semanal-modules.test
@@ -0,0 +1,877 @@
+-- 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
new file mode 100644
index 0000000..a820a07
--- /dev/null
+++ b/test-data/unit/semanal-namedtuple.test
@@ -0,0 +1,177 @@
+-- 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
new file mode 100644
index 0000000..97264a5
--- /dev/null
+++ b/test-data/unit/semanal-python2.test
@@ -0,0 +1,76 @@
+-- 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
new file mode 100644
index 0000000..8825c8e
--- /dev/null
+++ b/test-data/unit/semanal-statements.test
@@ -0,0 +1,925 @@
+[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
new file mode 100644
index 0000000..4821635
--- /dev/null
+++ b/test-data/unit/semanal-symtable.test
@@ -0,0 +1,52 @@
+[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
new file mode 100644
index 0000000..5178a71
--- /dev/null
+++ b/test-data/unit/semanal-typealiases.test
@@ -0,0 +1,440 @@
+[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
new file mode 100644
index 0000000..a0229d8
--- /dev/null
+++ b/test-data/unit/semanal-typeddict.test
@@ -0,0 +1,81 @@
+-- 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
new file mode 100644
index 0000000..6bb62e1
--- /dev/null
+++ b/test-data/unit/semanal-typeinfo.test
@@ -0,0 +1,80 @@
+[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
new file mode 100644
index 0000000..927ab85
--- /dev/null
+++ b/test-data/unit/semanal-types.test
@@ -0,0 +1,1476 @@
+[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
new file mode 100644
index 0000000..baa5be5
--- /dev/null
+++ b/test-data/unit/stubgen.test
@@ -0,0 +1,565 @@
+[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
new file mode 100644
index 0000000..e7915cc
--- /dev/null
+++ b/test-data/unit/typexport-basic.test
@@ -0,0 +1,1159 @@
+-- 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
new file mode 100644
index 0000000..5ce8f80
--- /dev/null
+++ b/test-requirements.txt
@@ -0,0 +1,9 @@
+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
new file mode 100644
index 0000000..e6579d8
--- /dev/null
+++ b/tmp-test-dirs/.gitignore
@@ -0,0 +1,4 @@
+# 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
deleted file mode 100644
index 8bb34b8..0000000
--- a/typeshed/stdlib/2/BaseHTTPServer.pyi
+++ /dev/null
@@ -1,47 +0,0 @@
-# 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
deleted file mode 100644
index ae6915e..0000000
--- a/typeshed/stdlib/2/ConfigParser.pyi
+++ /dev/null
@@ -1,96 +0,0 @@
-from typing import Any, Tuple, IO
-
-__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: 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
deleted file mode 100644
index f42cafc..0000000
--- a/typeshed/stdlib/2/Cookie.pyi
+++ /dev/null
@@ -1,44 +0,0 @@
-# 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
deleted file mode 100644
index c6b8a96..0000000
--- a/typeshed/stdlib/2/HTMLParser.pyi
+++ /dev/null
@@ -1,31 +0,0 @@
-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
\ No newline at end of file
diff --git a/typeshed/stdlib/2/Queue.pyi b/typeshed/stdlib/2/Queue.pyi
deleted file mode 100644
index e1e41fb..0000000
--- a/typeshed/stdlib/2/Queue.pyi
+++ /dev/null
@@ -1,29 +0,0 @@
-# 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
deleted file mode 100644
index 14a739b..0000000
--- a/typeshed/stdlib/2/SocketServer.pyi
+++ /dev/null
@@ -1,93 +0,0 @@
-# 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
deleted file mode 100644
index 17fe7a1..0000000
--- a/typeshed/stdlib/2/StringIO.pyi
+++ /dev/null
@@ -1,30 +0,0 @@
-# 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
deleted file mode 100644
index 10525fe..0000000
--- a/typeshed/stdlib/2/UserDict.pyi
+++ /dev/null
@@ -1,38 +0,0 @@
-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
deleted file mode 100644
index 4f31b93..0000000
--- a/typeshed/stdlib/2/UserList.pyi
+++ /dev/null
@@ -1,3 +0,0 @@
-import collections
-
-class UserList(collections.MutableSequence): ...
diff --git a/typeshed/stdlib/2/UserString.pyi b/typeshed/stdlib/2/UserString.pyi
deleted file mode 100644
index d2a33c3..0000000
--- a/typeshed/stdlib/2/UserString.pyi
+++ /dev/null
@@ -1,4 +0,0 @@
-import collections
-
-class UserString(collections.Sequence): ...
-class MutableString(UserString, collections.MutableSequence): ...
\ No newline at end of file
diff --git a/typeshed/stdlib/2/__builtin__.pyi b/typeshed/stdlib/2/__builtin__.pyi
deleted file mode 100644
index bedc1c4..0000000
--- a/typeshed/stdlib/2/__builtin__.pyi
+++ /dev/null
@@ -1,940 +0,0 @@
-# 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, Sized, Reversible, SupportsInt, SupportsFloat, SupportsAbs,
- SupportsRound, IO, BinaryIO, Union, AnyStr, MutableSequence, MutableMapping,
- MutableSet, ItemsView, KeysView, ValuesView, Optional, Container,
-)
-from abc import abstractmethod, ABCMeta
-
-_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
-
- 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: ...
-
-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: ...
- def __format__(self, format_spec: AnyStr) -> str: ...
-
-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(AbstractSet[_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 = ...) -> None: ...
-def filter(function: Callable[[_T], Any],
- iterable: Iterable[_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: ...
- def with_traceback(self, tb: Any) -> BaseException: ...
-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
deleted file mode 100644
index 2414069..0000000
--- a/typeshed/stdlib/2/__future__.pyi
+++ /dev/null
@@ -1,13 +0,0 @@
-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
deleted file mode 100644
index 26f9ce1..0000000
--- a/typeshed/stdlib/2/_ast.pyi
+++ /dev/null
@@ -1,328 +0,0 @@
-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
deleted file mode 100644
index 45a18de..0000000
--- a/typeshed/stdlib/2/_codecs.pyi
+++ /dev/null
@@ -1,55 +0,0 @@
-"""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
deleted file mode 100644
index 156cda0..0000000
--- a/typeshed/stdlib/2/_collections.pyi
+++ /dev/null
@@ -1,41 +0,0 @@
-"""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
deleted file mode 100644
index 555d3e1..0000000
--- a/typeshed/stdlib/2/_functools.pyi
+++ /dev/null
@@ -1,20 +0,0 @@
-"""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
deleted file mode 100644
index 8a9c8d7..0000000
--- a/typeshed/stdlib/2/_hotshot.pyi
+++ /dev/null
@@ -1,34 +0,0 @@
-"""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
deleted file mode 100644
index e85da33..0000000
--- a/typeshed/stdlib/2/_io.pyi
+++ /dev/null
@@ -1,107 +0,0 @@
-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
deleted file mode 100644
index dbf621d..0000000
--- a/typeshed/stdlib/2/_json.pyi
+++ /dev/null
@@ -1,19 +0,0 @@
-"""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
deleted file mode 100644
index 862b68f..0000000
--- a/typeshed/stdlib/2/_md5.pyi
+++ /dev/null
@@ -1,13 +0,0 @@
-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
deleted file mode 100644
index 060dcd2..0000000
--- a/typeshed/stdlib/2/_random.pyi
+++ /dev/null
@@ -1,13 +0,0 @@
-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
deleted file mode 100644
index eb750e0..0000000
--- a/typeshed/stdlib/2/_sha.pyi
+++ /dev/null
@@ -1,15 +0,0 @@
-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
deleted file mode 100644
index 4cf40c1..0000000
--- a/typeshed/stdlib/2/_sha256.pyi
+++ /dev/null
@@ -1,23 +0,0 @@
-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
deleted file mode 100644
index f9e4928..0000000
--- a/typeshed/stdlib/2/_sha512.pyi
+++ /dev/null
@@ -1,23 +0,0 @@
-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
deleted file mode 100644
index cfd615e..0000000
--- a/typeshed/stdlib/2/_socket.pyi
+++ /dev/null
@@ -1,287 +0,0 @@
-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
deleted file mode 100644
index 2f1500f..0000000
--- a/typeshed/stdlib/2/_sre.pyi
+++ /dev/null
@@ -1,53 +0,0 @@
-"""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
deleted file mode 100644
index 9aea0a9..0000000
--- a/typeshed/stdlib/2/_struct.pyi
+++ /dev/null
@@ -1,22 +0,0 @@
-"""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
deleted file mode 100644
index fd596d2..0000000
--- a/typeshed/stdlib/2/_symtable.pyi
+++ /dev/null
@@ -1,41 +0,0 @@
-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
deleted file mode 100644
index 0b24966..0000000
--- a/typeshed/stdlib/2/_warnings.pyi
+++ /dev/null
@@ -1,11 +0,0 @@
-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
deleted file mode 100644
index 9ed024e..0000000
--- a/typeshed/stdlib/2/_weakref.pyi
+++ /dev/null
@@ -1,21 +0,0 @@
-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
deleted file mode 100644
index 27aade6..0000000
--- a/typeshed/stdlib/2/_weakrefset.pyi
+++ /dev/null
@@ -1,14 +0,0 @@
-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
deleted file mode 100644
index 3ae3b52..0000000
--- a/typeshed/stdlib/2/abc.pyi
+++ /dev/null
@@ -1,37 +0,0 @@
-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
deleted file mode 100644
index 3ff4081..0000000
--- a/typeshed/stdlib/2/array.pyi
+++ /dev/null
@@ -1,56 +0,0 @@
-"""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
deleted file mode 100644
index 5bad0bc..0000000
--- a/typeshed/stdlib/2/ast.pyi
+++ /dev/null
@@ -1,43 +0,0 @@
-# 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
deleted file mode 100644
index 13d2602..0000000
--- a/typeshed/stdlib/2/atexit.pyi
+++ /dev/null
@@ -1,5 +0,0 @@
-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
deleted file mode 100644
index d593fa8..0000000
--- a/typeshed/stdlib/2/base64.pyi
+++ /dev/null
@@ -1,25 +0,0 @@
-# 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
deleted file mode 100644
index f8b85b6..0000000
--- a/typeshed/stdlib/2/binascii.pyi
+++ /dev/null
@@ -1,21 +0,0 @@
-"""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
deleted file mode 100644
index bedc1c4..0000000
--- a/typeshed/stdlib/2/builtins.pyi
+++ /dev/null
@@ -1,940 +0,0 @@
-# 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, Sized, Reversible, SupportsInt, SupportsFloat, SupportsAbs,
- SupportsRound, IO, BinaryIO, Union, AnyStr, MutableSequence, MutableMapping,
- MutableSet, ItemsView, KeysView, ValuesView, Optional, Container,
-)
-from abc import abstractmethod, ABCMeta
-
-_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
-
- 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: ...
-
-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: ...
- def __format__(self, format_spec: AnyStr) -> str: ...
-
-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(AbstractSet[_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 = ...) -> None: ...
-def filter(function: Callable[[_T], Any],
- iterable: Iterable[_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: ...
- def with_traceback(self, tb: Any) -> BaseException: ...
-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
deleted file mode 100644
index fb129d1..0000000
--- a/typeshed/stdlib/2/cPickle.pyi
+++ /dev/null
@@ -1,32 +0,0 @@
-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
deleted file mode 100644
index 5b4ad25..0000000
--- a/typeshed/stdlib/2/cStringIO.pyi
+++ /dev/null
@@ -1,50 +0,0 @@
-# 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
deleted file mode 100644
index 045e912..0000000
--- a/typeshed/stdlib/2/calendar.pyi
+++ /dev/null
@@ -1,86 +0,0 @@
-from typing import Any, Iterable, Optional, Tuple
-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: ...
-
-# 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
deleted file mode 100644
index 3ae1b16..0000000
--- a/typeshed/stdlib/2/codecs.pyi
+++ /dev/null
@@ -1,202 +0,0 @@
-# Better codecs stubs hand-written by o11c.
-# https://docs.python.org/2/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
-# 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 = ...) -> '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
deleted file mode 100644
index 398d753..0000000
--- a/typeshed/stdlib/2/collections.pyi
+++ /dev/null
@@ -1,108 +0,0 @@
-# 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, Dict, Generic, TypeVar, Iterable, Tuple, Callable, Mapping, overload, Iterator, Type,
- Sized, Optional, List, Set, Sequence, Union, Reversible, MutableMapping, MutableSequence,
- Container
-)
-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/compileall.pyi b/typeshed/stdlib/2/compileall.pyi
deleted file mode 100644
index 103d622..0000000
--- a/typeshed/stdlib/2/compileall.pyi
+++ /dev/null
@@ -1,7 +0,0 @@
-# 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
deleted file mode 100644
index f7389df..0000000
--- a/typeshed/stdlib/2/cookielib.pyi
+++ /dev/null
@@ -1,110 +0,0 @@
-# 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
deleted file mode 100644
index 0661cb7..0000000
--- a/typeshed/stdlib/2/copy.pyi
+++ /dev/null
@@ -1,10 +0,0 @@
-# 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
deleted file mode 100644
index c91d330..0000000
--- a/typeshed/stdlib/2/csv.pyi
+++ /dev/null
@@ -1,88 +0,0 @@
-# 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
deleted file mode 100644
index e7f4b44..0000000
--- a/typeshed/stdlib/2/datetime.pyi
+++ /dev/null
@@ -1,212 +0,0 @@
-# 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
deleted file mode 100644
index 134505c..0000000
--- a/typeshed/stdlib/2/decimal.pyi
+++ /dev/null
@@ -1,245 +0,0 @@
-# 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
deleted file mode 100644
index e0809f8..0000000
--- a/typeshed/stdlib/2/difflib.pyi
+++ /dev/null
@@ -1,64 +0,0 @@
-# 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/typeshed/stdlib/2/distutils/emxccompiler.pyi b/typeshed/stdlib/2/distutils/emxccompiler.pyi
deleted file mode 100644
index 97e4a29..0000000
--- a/typeshed/stdlib/2/distutils/emxccompiler.pyi
+++ /dev/null
@@ -1,5 +0,0 @@
-# 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
deleted file mode 100644
index ab88328..0000000
--- a/typeshed/stdlib/2/doctest.pyi
+++ /dev/null
@@ -1,9 +0,0 @@
-# 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
deleted file mode 100644
index a15eb1d..0000000
--- a/typeshed/stdlib/2/email/MIMEText.pyi
+++ /dev/null
@@ -1,8 +0,0 @@
-# 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
deleted file mode 100644
index 384d956..0000000
--- a/typeshed/stdlib/2/email/__init__.pyi
+++ /dev/null
@@ -1,6 +0,0 @@
-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
deleted file mode 100644
index dcb59d1..0000000
--- a/typeshed/stdlib/2/email/_parseaddr.pyi
+++ /dev/null
@@ -1,44 +0,0 @@
-# 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/typeshed/stdlib/2/email/mime/base.pyi b/typeshed/stdlib/2/email/mime/base.pyi
deleted file mode 100644
index 82554da..0000000
--- a/typeshed/stdlib/2/email/mime/base.pyi
+++ /dev/null
@@ -1,10 +0,0 @@
-# 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
deleted file mode 100644
index 2bc5a9e..0000000
--- a/typeshed/stdlib/2/email/mime/multipart.pyi
+++ /dev/null
@@ -1,8 +0,0 @@
-# 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
deleted file mode 100644
index b0894ab..0000000
--- a/typeshed/stdlib/2/email/mime/nonmultipart.pyi
+++ /dev/null
@@ -1,8 +0,0 @@
-# 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
deleted file mode 100644
index b6ec4c8..0000000
--- a/typeshed/stdlib/2/email/mime/text.pyi
+++ /dev/null
@@ -1,8 +0,0 @@
-# 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
deleted file mode 100644
index 48d2aa3..0000000
--- a/typeshed/stdlib/2/email/utils.pyi
+++ /dev/null
@@ -1,22 +0,0 @@
-# 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
deleted file mode 100644
index 2ae6c0a..0000000
--- a/typeshed/stdlib/2/encodings/__init__.pyi
+++ /dev/null
@@ -1,6 +0,0 @@
-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
deleted file mode 100644
index 3be496a..0000000
--- a/typeshed/stdlib/2/encodings/utf_8.pyi
+++ /dev/null
@@ -1,14 +0,0 @@
-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
deleted file mode 100644
index 9b00e34..0000000
--- a/typeshed/stdlib/2/exceptions.pyi
+++ /dev/null
@@ -1,80 +0,0 @@
-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
deleted file mode 100644
index 5e7da7f..0000000
--- a/typeshed/stdlib/2/fcntl.pyi
+++ /dev/null
@@ -1,87 +0,0 @@
-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
deleted file mode 100644
index e61b41f..0000000
--- a/typeshed/stdlib/2/fileinput.pyi
+++ /dev/null
@@ -1,46 +0,0 @@
-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
deleted file mode 100644
index 23b5978..0000000
--- a/typeshed/stdlib/2/fnmatch.pyi
+++ /dev/null
@@ -1,6 +0,0 @@
-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
deleted file mode 100644
index 8840765..0000000
--- a/typeshed/stdlib/2/functools.pyi
+++ /dev/null
@@ -1,34 +0,0 @@
-# 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
deleted file mode 100644
index a9b25b2..0000000
--- a/typeshed/stdlib/2/future_builtins.pyi
+++ /dev/null
@@ -1,14 +0,0 @@
-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
deleted file mode 100644
index 74dc445..0000000
--- a/typeshed/stdlib/2/gc.pyi
+++ /dev/null
@@ -1,29 +0,0 @@
-# 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
deleted file mode 100644
index 85f1c0f..0000000
--- a/typeshed/stdlib/2/genericpath.pyi
+++ /dev/null
@@ -1,14 +0,0 @@
-# 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
deleted file mode 100644
index 0a8fa0c..0000000
--- a/typeshed/stdlib/2/getopt.pyi
+++ /dev/null
@@ -1,17 +0,0 @@
-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
deleted file mode 100644
index 011fc8e..0000000
--- a/typeshed/stdlib/2/getpass.pyi
+++ /dev/null
@@ -1,8 +0,0 @@
-# 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
deleted file mode 100644
index 51dd523..0000000
--- a/typeshed/stdlib/2/gettext.pyi
+++ /dev/null
@@ -1,43 +0,0 @@
-# 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
deleted file mode 100644
index 9b70e5c..0000000
--- a/typeshed/stdlib/2/glob.pyi
+++ /dev/null
@@ -1,4 +0,0 @@
-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
deleted file mode 100644
index 6a1f758..0000000
--- a/typeshed/stdlib/2/grp.pyi
+++ /dev/null
@@ -1,11 +0,0 @@
-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
deleted file mode 100644
index 56caeb8..0000000
--- a/typeshed/stdlib/2/gzip.pyi
+++ /dev/null
@@ -1,41 +0,0 @@
-# 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
deleted file mode 100644
index 95f2b82..0000000
--- a/typeshed/stdlib/2/hashlib.pyi
+++ /dev/null
@@ -1,27 +0,0 @@
-# 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
deleted file mode 100644
index 4a7a65f..0000000
--- a/typeshed/stdlib/2/heapq.pyi
+++ /dev/null
@@ -1,15 +0,0 @@
-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
deleted file mode 100644
index 1b9bddd..0000000
--- a/typeshed/stdlib/2/htmlentitydefs.pyi
+++ /dev/null
@@ -1,9 +0,0 @@
-# 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
deleted file mode 100644
index 6607954..0000000
--- a/typeshed/stdlib/2/httplib.pyi
+++ /dev/null
@@ -1,189 +0,0 @@
-# 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
deleted file mode 100644
index ffb1ad3..0000000
--- a/typeshed/stdlib/2/imp.pyi
+++ /dev/null
@@ -1,35 +0,0 @@
-"""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
deleted file mode 100644
index afa073d..0000000
--- a/typeshed/stdlib/2/importlib.pyi
+++ /dev/null
@@ -1,3 +0,0 @@
-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
deleted file mode 100644
index 3c10712..0000000
--- a/typeshed/stdlib/2/inspect.pyi
+++ /dev/null
@@ -1,83 +0,0 @@
-# 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
deleted file mode 100644
index add0bfb..0000000
--- a/typeshed/stdlib/2/io.pyi
+++ /dev/null
@@ -1,105 +0,0 @@
-# Stubs for io
-
-# Based on https://docs.python.org/2/library/io.html
-
-# Only a subset of functionality is included.
-
-DEFAULT_BUFFER_SIZE = 0
-
-from typing import List, BinaryIO, TextIO, IO, overload, Iterator, Iterable, Any, Union
-
-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
deleted file mode 100644
index 2d275e7..0000000
--- a/typeshed/stdlib/2/itertools.pyi
+++ /dev/null
@@ -1,87 +0,0 @@
-# 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
deleted file mode 100644
index 7547250..0000000
--- a/typeshed/stdlib/2/json.pyi
+++ /dev/null
@@ -1,98 +0,0 @@
-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: 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: 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: ...
-
- 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
deleted file mode 100644
index 9859788..0000000
--- a/typeshed/stdlib/2/linecache.pyi
+++ /dev/null
@@ -1,7 +0,0 @@
-# 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
deleted file mode 100644
index 129b49b..0000000
--- a/typeshed/stdlib/2/markupbase.pyi
+++ /dev/null
@@ -1,9 +0,0 @@
-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
deleted file mode 100644
index 3488466..0000000
--- a/typeshed/stdlib/2/md5.pyi
+++ /dev/null
@@ -1,11 +0,0 @@
-# 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
deleted file mode 100644
index 62aa50b..0000000
--- a/typeshed/stdlib/2/mimetools.pyi
+++ /dev/null
@@ -1,31 +0,0 @@
-# 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
deleted file mode 100644
index 91754a3..0000000
--- a/typeshed/stdlib/2/multiprocessing/__init__.pyi
+++ /dev/null
@@ -1,32 +0,0 @@
-# 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(): ...
-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
deleted file mode 100644
index a4650cf..0000000
--- a/typeshed/stdlib/2/multiprocessing/process.pyi
+++ /dev/null
@@ -1,39 +0,0 @@
-# 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
deleted file mode 100644
index d52860c..0000000
--- a/typeshed/stdlib/2/multiprocessing/util.pyi
+++ /dev/null
@@ -1,33 +0,0 @@
-# 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
deleted file mode 100644
index eb753b2..0000000
--- a/typeshed/stdlib/2/optparse.pyi
+++ /dev/null
@@ -1,250 +0,0 @@
-# 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
deleted file mode 100644
index 8b81870..0000000
--- a/typeshed/stdlib/2/os/__init__.pyi
+++ /dev/null
@@ -1,302 +0,0 @@
-# created from https://docs.python.org/2/library/os.html
-
-from typing import (
- List, Tuple, Union, Sequence, Mapping, IO, Any, Optional, AnyStr, Iterator,
- MutableMapping, NamedTuple, overload
-)
-from . import path
-
-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) -> None: ...
-
-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
deleted file mode 100644
index 99b29e5..0000000
--- a/typeshed/stdlib/2/os/path.pyi
+++ /dev/null
@@ -1,65 +0,0 @@
-# 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
deleted file mode 100644
index 1c375fe..0000000
--- a/typeshed/stdlib/2/pdb.pyi
+++ /dev/null
@@ -1,30 +0,0 @@
-# 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
deleted file mode 100644
index 1b5b1d6..0000000
--- a/typeshed/stdlib/2/pickle.pyi
+++ /dev/null
@@ -1,38 +0,0 @@
-# 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
deleted file mode 100644
index d5f5291..0000000
--- a/typeshed/stdlib/2/pipes.pyi
+++ /dev/null
@@ -1,13 +0,0 @@
-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
deleted file mode 100644
index a8c6693..0000000
--- a/typeshed/stdlib/2/platform.pyi
+++ /dev/null
@@ -1,45 +0,0 @@
-# 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
deleted file mode 100644
index dc8ae5d..0000000
--- a/typeshed/stdlib/2/posix.pyi
+++ /dev/null
@@ -1,206 +0,0 @@
-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
deleted file mode 100644
index 933f504..0000000
--- a/typeshed/stdlib/2/posixpath.pyi
+++ /dev/null
@@ -1,50 +0,0 @@
-# Stubs for posixpath (Python 2)
-#
-# NOTE: This dynamically typed stub was automatically generated by stubgen.
-
-from typing import Any, AnyStr, List
-from genericpath import *
-
-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
deleted file mode 100644
index 5275d03..0000000
--- a/typeshed/stdlib/2/pprint.pyi
+++ /dev/null
@@ -1,24 +0,0 @@
-# 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
deleted file mode 100644
index facd9db..0000000
--- a/typeshed/stdlib/2/pwd.pyi
+++ /dev/null
@@ -1,18 +0,0 @@
-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
deleted file mode 100644
index 93ac393..0000000
--- a/typeshed/stdlib/2/quopri.pyi
+++ /dev/null
@@ -1,8 +0,0 @@
-# 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
deleted file mode 100644
index e8800c8..0000000
--- a/typeshed/stdlib/2/random.pyi
+++ /dev/null
@@ -1,76 +0,0 @@
-# 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
deleted file mode 100644
index 4c69094..0000000
--- a/typeshed/stdlib/2/re.pyi
+++ /dev/null
@@ -1,99 +0,0 @@
-# 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
deleted file mode 100644
index 8d094ef..0000000
--- a/typeshed/stdlib/2/resource.pyi
+++ /dev/null
@@ -1,33 +0,0 @@
-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
deleted file mode 100644
index 636a985..0000000
--- a/typeshed/stdlib/2/rfc822.pyi
+++ /dev/null
@@ -1,79 +0,0 @@
-# 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
deleted file mode 100644
index 403039a..0000000
--- a/typeshed/stdlib/2/robotparser.pyi
+++ /dev/null
@@ -1,7 +0,0 @@
-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
deleted file mode 100644
index ecc7f47..0000000
--- a/typeshed/stdlib/2/runpy.pyi
+++ /dev/null
@@ -1,21 +0,0 @@
-# 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
deleted file mode 100644
index 32c3cae..0000000
--- a/typeshed/stdlib/2/select.pyi
+++ /dev/null
@@ -1,100 +0,0 @@
-"""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
deleted file mode 100644
index 8e4d49a..0000000
--- a/typeshed/stdlib/2/sha.pyi
+++ /dev/null
@@ -1,12 +0,0 @@
-# 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
deleted file mode 100644
index f5a92b9..0000000
--- a/typeshed/stdlib/2/shelve.pyi
+++ /dev/null
@@ -1,33 +0,0 @@
-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
deleted file mode 100644
index 8130090..0000000
--- a/typeshed/stdlib/2/shlex.pyi
+++ /dev/null
@@ -1,27 +0,0 @@
-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
deleted file mode 100644
index a826a09..0000000
--- a/typeshed/stdlib/2/shutil.pyi
+++ /dev/null
@@ -1,30 +0,0 @@
-# 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, 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: 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
deleted file mode 100644
index 1c9481b..0000000
--- a/typeshed/stdlib/2/signal.pyi
+++ /dev/null
@@ -1,62 +0,0 @@
-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/simplejson/__init__.pyi b/typeshed/stdlib/2/simplejson/__init__.pyi
deleted file mode 100644
index d34e42b..0000000
--- a/typeshed/stdlib/2/simplejson/__init__.pyi
+++ /dev/null
@@ -1,10 +0,0 @@
-from typing import Any, IO
-
-def dumps(obj: 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: ...
-
-from simplejson.scanner import JSONDecodeError
-from simplejson.decoder import JSONDecoder
-from simplejson.encoder import JSONEncoder, JSONEncoderForHTML
diff --git a/typeshed/stdlib/2/simplejson/decoder.pyi b/typeshed/stdlib/2/simplejson/decoder.pyi
deleted file mode 100644
index 59111ce..0000000
--- a/typeshed/stdlib/2/simplejson/decoder.pyi
+++ /dev/null
@@ -1,6 +0,0 @@
-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/stdlib/2/simplejson/encoder.pyi b/typeshed/stdlib/2/simplejson/encoder.pyi
deleted file mode 100644
index 0e31806..0000000
--- a/typeshed/stdlib/2/simplejson/encoder.pyi
+++ /dev/null
@@ -1,9 +0,0 @@
-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/stdlib/2/simplejson/scanner.pyi b/typeshed/stdlib/2/simplejson/scanner.pyi
deleted file mode 100644
index 760b24d..0000000
--- a/typeshed/stdlib/2/simplejson/scanner.pyi
+++ /dev/null
@@ -1,7 +0,0 @@
-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/stdlib/2/smtplib.pyi b/typeshed/stdlib/2/smtplib.pyi
deleted file mode 100644
index 5bf994b..0000000
--- a/typeshed/stdlib/2/smtplib.pyi
+++ /dev/null
@@ -1,90 +0,0 @@
-# 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
deleted file mode 100644
index 4975c85..0000000
--- a/typeshed/stdlib/2/socket.pyi
+++ /dev/null
@@ -1,362 +0,0 @@
-# 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
deleted file mode 100644
index ee09838..0000000
--- a/typeshed/stdlib/2/spwd.pyi
+++ /dev/null
@@ -1,15 +0,0 @@
-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
deleted file mode 100644
index 28bc3ba..0000000
--- a/typeshed/stdlib/2/sqlite3/__init__.pyi
+++ /dev/null
@@ -1,5 +0,0 @@
-# Stubs for sqlite3 (Python 3.5)
-#
-# NOTE: This dynamically typed stub was automatically generated by stubgen.
-
-from sqlite3.dbapi2 import *
diff --git a/typeshed/stdlib/2/sqlite3/dbapi2.pyi b/typeshed/stdlib/2/sqlite3/dbapi2.pyi
deleted file mode 100644
index 5ef3a3c..0000000
--- a/typeshed/stdlib/2/sqlite3/dbapi2.pyi
+++ /dev/null
@@ -1,255 +0,0 @@
-# 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
-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): ...
- # 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:
- 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[tuple]: ...
- def fetchmany(self, size: Integral = ...) -> List[tuple]: ...
- def fetchone(self) -> Union[tuple, None]: ...
- def setinputsizes(self, *args, **kwargs): ...
- def setoutputsize(self, *args, **kwargs): ...
- def __iter__(self): ...
- def __next__(self): ...
-
-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
deleted file mode 100644
index c9fafba..0000000
--- a/typeshed/stdlib/2/ssl.pyi
+++ /dev/null
@@ -1,204 +0,0 @@
-# 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
deleted file mode 100644
index dd3418d..0000000
--- a/typeshed/stdlib/2/stat.pyi
+++ /dev/null
@@ -1,59 +0,0 @@
-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
deleted file mode 100644
index 4bbfb48..0000000
--- a/typeshed/stdlib/2/string.pyi
+++ /dev/null
@@ -1,74 +0,0 @@
-# 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
deleted file mode 100644
index e37abe9..0000000
--- a/typeshed/stdlib/2/strop.pyi
+++ /dev/null
@@ -1,73 +0,0 @@
-"""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
deleted file mode 100644
index c1b3283..0000000
--- a/typeshed/stdlib/2/struct.pyi
+++ /dev/null
@@ -1,28 +0,0 @@
-# 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
deleted file mode 100644
index 8286e83..0000000
--- a/typeshed/stdlib/2/subprocess.pyi
+++ /dev/null
@@ -1,109 +0,0 @@
-# Stubs for subprocess
-
-# Based on http://docs.python.org/2/library/subprocess.html and Python 3 stub
-
-from typing import Sequence, Any, 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: Union[bytes, unicode] = ...) -> 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
deleted file mode 100644
index e373328..0000000
--- a/typeshed/stdlib/2/sys.pyi
+++ /dev/null
@@ -1,136 +0,0 @@
-"""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
-
-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 = ...) -> None:
- 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
deleted file mode 100644
index 82e0b9a..0000000
--- a/typeshed/stdlib/2/syslog.pyi
+++ /dev/null
@@ -1,38 +0,0 @@
-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
deleted file mode 100644
index 5f252e7..0000000
--- a/typeshed/stdlib/2/tempfile.pyi
+++ /dev/null
@@ -1,98 +0,0 @@
-# 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
deleted file mode 100644
index 6ed6356..0000000
--- a/typeshed/stdlib/2/textwrap.pyi
+++ /dev/null
@@ -1,33 +0,0 @@
-# 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
deleted file mode 100644
index a54a946..0000000
--- a/typeshed/stdlib/2/thread.pyi
+++ /dev/null
@@ -1,33 +0,0 @@
-"""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
deleted file mode 100644
index 6f234f2..0000000
--- a/typeshed/stdlib/2/time.pyi
+++ /dev/null
@@ -1,51 +0,0 @@
-"""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
deleted file mode 100644
index 1c14dc4..0000000
--- a/typeshed/stdlib/2/token.pyi
+++ /dev/null
@@ -1,62 +0,0 @@
-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
deleted file mode 100644
index 159adf9..0000000
--- a/typeshed/stdlib/2/tokenize.pyi
+++ /dev/null
@@ -1,143 +0,0 @@
-# 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
deleted file mode 100644
index c3b66f4..0000000
--- a/typeshed/stdlib/2/types.pyi
+++ /dev/null
@@ -1,161 +0,0 @@
-# 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
deleted file mode 100644
index e3ad6bd..0000000
--- a/typeshed/stdlib/2/typing.pyi
+++ /dev/null
@@ -1,359 +0,0 @@
-# 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()
-
-# 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], Generic[_T]): ...
-
-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
deleted file mode 100644
index 196f142..0000000
--- a/typeshed/stdlib/2/unicodedata.pyi
+++ /dev/null
@@ -1,40 +0,0 @@
-"""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
deleted file mode 100644
index 7de3be2..0000000
--- a/typeshed/stdlib/2/unittest.pyi
+++ /dev/null
@@ -1,176 +0,0 @@
-# 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, Iterable, Tuple, List, TextIO, Sequence,
- overload, 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
deleted file mode 100644
index 8b129cf..0000000
--- a/typeshed/stdlib/2/urllib.pyi
+++ /dev/null
@@ -1,135 +0,0 @@
-# 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
deleted file mode 100644
index 0ce8a7a..0000000
--- a/typeshed/stdlib/2/urllib2.pyi
+++ /dev/null
@@ -1,160 +0,0 @@
-
-from typing import AnyStr, Dict, 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
deleted file mode 100644
index 823fd5d..0000000
--- a/typeshed/stdlib/2/urlparse.pyi
+++ /dev/null
@@ -1,56 +0,0 @@
-# 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
deleted file mode 100644
index ed3db1c..0000000
--- a/typeshed/stdlib/2/uuid.pyi
+++ /dev/null
@@ -1,36 +0,0 @@
-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
deleted file mode 100644
index a68242b..0000000
--- a/typeshed/stdlib/2/weakref.pyi
+++ /dev/null
@@ -1,47 +0,0 @@
-# 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/typeshed/stdlib/2/wsgiref/validate.pyi b/typeshed/stdlib/2/wsgiref/validate.pyi
deleted file mode 100644
index 1fb10b4..0000000
--- a/typeshed/stdlib/2/wsgiref/validate.pyi
+++ /dev/null
@@ -1,47 +0,0 @@
-# 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/typeshed/stdlib/2/xml/etree/ElementInclude.pyi b/typeshed/stdlib/2/xml/etree/ElementInclude.pyi
deleted file mode 100644
index 09acc8f..0000000
--- a/typeshed/stdlib/2/xml/etree/ElementInclude.pyi
+++ /dev/null
@@ -1,19 +0,0 @@
-# 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
deleted file mode 100644
index e057b88..0000000
--- a/typeshed/stdlib/2/xml/etree/ElementPath.pyi
+++ /dev/null
@@ -1,35 +0,0 @@
-# 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
deleted file mode 100644
index d7c68ac..0000000
--- a/typeshed/stdlib/2/xml/etree/ElementTree.pyi
+++ /dev/null
@@ -1,116 +0,0 @@
-# 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/typeshed/stdlib/2/xml/etree/cElementTree.pyi b/typeshed/stdlib/2/xml/etree/cElementTree.pyi
deleted file mode 100644
index a6f4274..0000000
--- a/typeshed/stdlib/2/xml/etree/cElementTree.pyi
+++ /dev/null
@@ -1,5 +0,0 @@
-# Stubs for xml.etree.cElementTree (Python 3.4)
-#
-# NOTE: This dynamically typed stub was automatically generated by stubgen.
-
-from xml.etree.ElementTree import *
diff --git a/typeshed/stdlib/2/xxsubtype.pyi b/typeshed/stdlib/2/xxsubtype.pyi
deleted file mode 100644
index 8612890..0000000
--- a/typeshed/stdlib/2/xxsubtype.pyi
+++ /dev/null
@@ -1,17 +0,0 @@
-"""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
deleted file mode 100644
index d3c479e..0000000
--- a/typeshed/stdlib/2/zlib.pyi
+++ /dev/null
@@ -1,42 +0,0 @@
-# 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
deleted file mode 100644
index 4b6ad96..0000000
--- a/typeshed/stdlib/2and3/_bisect.pyi
+++ /dev/null
@@ -1,11 +0,0 @@
-"""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
deleted file mode 100644
index 8b7f6ea..0000000
--- a/typeshed/stdlib/2and3/_heapq.pyi
+++ /dev/null
@@ -1,15 +0,0 @@
-"""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
deleted file mode 100644
index 627426d..0000000
--- a/typeshed/stdlib/2and3/argparse.pyi
+++ /dev/null
@@ -1,155 +0,0 @@
-# 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
deleted file mode 100644
index f4a57a4..0000000
--- a/typeshed/stdlib/2and3/asynchat.pyi
+++ /dev/null
@@ -1,41 +0,0 @@
-from typing import Union, Tuple, Sequence
-from abc import abstractmethod
-
-import asyncore
-import socket
-
-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: ...
-
-import sys
-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
deleted file mode 100644
index 86af4a5..0000000
--- a/typeshed/stdlib/2and3/asyncore.pyi
+++ /dev/null
@@ -1,127 +0,0 @@
-from typing import Tuple, Union, Optional, Any, Dict, overload
-
-import select, socket, sys, time, warnings, os
-
-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
deleted file mode 100644
index 51ffc9b..0000000
--- a/typeshed/stdlib/2and3/bisect.pyi
+++ /dev/null
@@ -1,22 +0,0 @@
-# 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
deleted file mode 100644
index 31db7b7..0000000
--- a/typeshed/stdlib/2and3/bz2.pyi
+++ /dev/null
@@ -1,6 +0,0 @@
-# Stubs for bz2
-
-# TODO: This stub is incomplete
-
-def compress(data: bytes, compresslevel: int = ...) -> bytes: ...
-def decompress(data: bytes) -> bytes: ...
diff --git a/typeshed/stdlib/2and3/cmath.pyi b/typeshed/stdlib/2and3/cmath.pyi
deleted file mode 100644
index 7e7389c..0000000
--- a/typeshed/stdlib/2and3/cmath.pyi
+++ /dev/null
@@ -1,34 +0,0 @@
-"""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
deleted file mode 100644
index e775851..0000000
--- a/typeshed/stdlib/2and3/code.pyi
+++ /dev/null
@@ -1,27 +0,0 @@
-# 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
deleted file mode 100644
index ee17ba9..0000000
--- a/typeshed/stdlib/2and3/colorsys.pyi
+++ /dev/null
@@ -1,15 +0,0 @@
-# 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
deleted file mode 100644
index 0f14afa..0000000
--- a/typeshed/stdlib/2and3/contextlib.pyi
+++ /dev/null
@@ -1,53 +0,0 @@
-# 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/typeshed/stdlib/2and3/distutils/__init__.pyi b/typeshed/stdlib/2and3/distutils/__init__.pyi
deleted file mode 100644
index e69de29..0000000
diff --git a/typeshed/stdlib/2and3/distutils/archive_util.pyi b/typeshed/stdlib/2and3/distutils/archive_util.pyi
deleted file mode 100644
index 12172f3..0000000
--- a/typeshed/stdlib/2and3/distutils/archive_util.pyi
+++ /dev/null
@@ -1,12 +0,0 @@
-# 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
deleted file mode 100644
index 9f27a0a..0000000
--- a/typeshed/stdlib/2and3/distutils/bcppcompiler.pyi
+++ /dev/null
@@ -1,6 +0,0 @@
-# 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
deleted file mode 100644
index 94fad8b..0000000
--- a/typeshed/stdlib/2and3/distutils/ccompiler.pyi
+++ /dev/null
@@ -1,119 +0,0 @@
-# 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
deleted file mode 100644
index 126ef15..0000000
--- a/typeshed/stdlib/2and3/distutils/cmd.pyi
+++ /dev/null
@@ -1,15 +0,0 @@
-# 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/typeshed/stdlib/2and3/distutils/command/__init__.pyi b/typeshed/stdlib/2and3/distutils/command/__init__.pyi
deleted file mode 100644
index e69de29..0000000
diff --git a/typeshed/stdlib/2and3/distutils/command/bdist.pyi b/typeshed/stdlib/2and3/distutils/command/bdist.pyi
deleted file mode 100644
index e69de29..0000000
diff --git a/typeshed/stdlib/2and3/distutils/command/bdist_dumb.pyi b/typeshed/stdlib/2and3/distutils/command/bdist_dumb.pyi
deleted file mode 100644
index e69de29..0000000
diff --git a/typeshed/stdlib/2and3/distutils/command/bdist_msi.pyi b/typeshed/stdlib/2and3/distutils/command/bdist_msi.pyi
deleted file mode 100644
index 3813699..0000000
--- a/typeshed/stdlib/2and3/distutils/command/bdist_msi.pyi
+++ /dev/null
@@ -1,5 +0,0 @@
-# Stubs for distutils.command.bdist_msi
-
-from distutils.cmd import Command
-
-class bdist_msi(Command): ...
diff --git a/typeshed/stdlib/2and3/distutils/command/bdist_packager.pyi b/typeshed/stdlib/2and3/distutils/command/bdist_packager.pyi
deleted file mode 100644
index e69de29..0000000
diff --git a/typeshed/stdlib/2and3/distutils/command/bdist_rpm.pyi b/typeshed/stdlib/2and3/distutils/command/bdist_rpm.pyi
deleted file mode 100644
index e69de29..0000000
diff --git a/typeshed/stdlib/2and3/distutils/command/bdist_wininst.pyi b/typeshed/stdlib/2and3/distutils/command/bdist_wininst.pyi
deleted file mode 100644
index e69de29..0000000
diff --git a/typeshed/stdlib/2and3/distutils/command/build.pyi b/typeshed/stdlib/2and3/distutils/command/build.pyi
deleted file mode 100644
index e69de29..0000000
diff --git a/typeshed/stdlib/2and3/distutils/command/build_clib.pyi b/typeshed/stdlib/2and3/distutils/command/build_clib.pyi
deleted file mode 100644
index e69de29..0000000
diff --git a/typeshed/stdlib/2and3/distutils/command/build_ext.pyi b/typeshed/stdlib/2and3/distutils/command/build_ext.pyi
deleted file mode 100644
index e69de29..0000000
diff --git a/typeshed/stdlib/2and3/distutils/command/build_py.pyi b/typeshed/stdlib/2and3/distutils/command/build_py.pyi
deleted file mode 100644
index 23b3f9e..0000000
--- a/typeshed/stdlib/2and3/distutils/command/build_py.pyi
+++ /dev/null
@@ -1,8 +0,0 @@
-# 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/typeshed/stdlib/2and3/distutils/command/build_scripts.pyi b/typeshed/stdlib/2and3/distutils/command/build_scripts.pyi
deleted file mode 100644
index e69de29..0000000
diff --git a/typeshed/stdlib/2and3/distutils/command/check.pyi b/typeshed/stdlib/2and3/distutils/command/check.pyi
deleted file mode 100644
index e69de29..0000000
diff --git a/typeshed/stdlib/2and3/distutils/command/clean.pyi b/typeshed/stdlib/2and3/distutils/command/clean.pyi
deleted file mode 100644
index e69de29..0000000
diff --git a/typeshed/stdlib/2and3/distutils/command/config.pyi b/typeshed/stdlib/2and3/distutils/command/config.pyi
deleted file mode 100644
index e69de29..0000000
diff --git a/typeshed/stdlib/2and3/distutils/command/install.pyi b/typeshed/stdlib/2and3/distutils/command/install.pyi
deleted file mode 100644
index e69de29..0000000
diff --git a/typeshed/stdlib/2and3/distutils/command/install_data.pyi b/typeshed/stdlib/2and3/distutils/command/install_data.pyi
deleted file mode 100644
index e69de29..0000000
diff --git a/typeshed/stdlib/2and3/distutils/command/install_headers.pyi b/typeshed/stdlib/2and3/distutils/command/install_headers.pyi
deleted file mode 100644
index e69de29..0000000
diff --git a/typeshed/stdlib/2and3/distutils/command/install_lib.pyi b/typeshed/stdlib/2and3/distutils/command/install_lib.pyi
deleted file mode 100644
index e69de29..0000000
diff --git a/typeshed/stdlib/2and3/distutils/command/install_scripts.pyi b/typeshed/stdlib/2and3/distutils/command/install_scripts.pyi
deleted file mode 100644
index e69de29..0000000
diff --git a/typeshed/stdlib/2and3/distutils/command/register.pyi b/typeshed/stdlib/2and3/distutils/command/register.pyi
deleted file mode 100644
index e69de29..0000000
diff --git a/typeshed/stdlib/2and3/distutils/command/sdist.pyi b/typeshed/stdlib/2and3/distutils/command/sdist.pyi
deleted file mode 100644
index e69de29..0000000
diff --git a/typeshed/stdlib/2and3/distutils/core.pyi b/typeshed/stdlib/2and3/distutils/core.pyi
deleted file mode 100644
index 38d6a1a..0000000
--- a/typeshed/stdlib/2and3/distutils/core.pyi
+++ /dev/null
@@ -1,35 +0,0 @@
-# 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
deleted file mode 100644
index 1bfab90..0000000
--- a/typeshed/stdlib/2and3/distutils/cygwinccompiler.pyi
+++ /dev/null
@@ -1,7 +0,0 @@
-# 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
deleted file mode 100644
index c3a1849..0000000
--- a/typeshed/stdlib/2and3/distutils/debug.pyi
+++ /dev/null
@@ -1,3 +0,0 @@
-# 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
deleted file mode 100644
index 7df5847..0000000
--- a/typeshed/stdlib/2and3/distutils/dep_util.pyi
+++ /dev/null
@@ -1,8 +0,0 @@
-# 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
deleted file mode 100644
index 667ac2f..0000000
--- a/typeshed/stdlib/2and3/distutils/dir_util.pyi
+++ /dev/null
@@ -1,15 +0,0 @@
-# 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
deleted file mode 100644
index 2d9c162..0000000
--- a/typeshed/stdlib/2and3/distutils/dist.pyi
+++ /dev/null
@@ -1,7 +0,0 @@
-# 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
deleted file mode 100644
index 49ca06f..0000000
--- a/typeshed/stdlib/2and3/distutils/errors.pyi
+++ /dev/null
@@ -1,4 +0,0 @@
-# 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
deleted file mode 100644
index 5aa070e..0000000
--- a/typeshed/stdlib/2and3/distutils/extension.pyi
+++ /dev/null
@@ -1,39 +0,0 @@
-# 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
deleted file mode 100644
index aa7e964..0000000
--- a/typeshed/stdlib/2and3/distutils/fancy_getopt.pyi
+++ /dev/null
@@ -1,27 +0,0 @@
-# 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
deleted file mode 100644
index 6324d63..0000000
--- a/typeshed/stdlib/2and3/distutils/file_util.pyi
+++ /dev/null
@@ -1,12 +0,0 @@
-# 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
deleted file mode 100644
index 4ecaeba..0000000
--- a/typeshed/stdlib/2and3/distutils/filelist.pyi
+++ /dev/null
@@ -1,3 +0,0 @@
-# Stubs for distutils.filelist
-
-class FileList: ...
diff --git a/typeshed/stdlib/2and3/distutils/log.pyi b/typeshed/stdlib/2and3/distutils/log.pyi
deleted file mode 100644
index e69de29..0000000
diff --git a/typeshed/stdlib/2and3/distutils/msvccompiler.pyi b/typeshed/stdlib/2and3/distutils/msvccompiler.pyi
deleted file mode 100644
index ffc9e44..0000000
--- a/typeshed/stdlib/2and3/distutils/msvccompiler.pyi
+++ /dev/null
@@ -1,6 +0,0 @@
-# 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
deleted file mode 100644
index f8acb8a..0000000
--- a/typeshed/stdlib/2and3/distutils/spawn.pyi
+++ /dev/null
@@ -1,8 +0,0 @@
-# Stubs for distutils.spawn
-
-from typing import 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
deleted file mode 100644
index f87cd46..0000000
--- a/typeshed/stdlib/2and3/distutils/sysconfig.pyi
+++ /dev/null
@@ -1,19 +0,0 @@
-# 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
deleted file mode 100644
index b4fcb59..0000000
--- a/typeshed/stdlib/2and3/distutils/text_file.pyi
+++ /dev/null
@@ -1,18 +0,0 @@
-# Stubs for distutils.text_file
-
-from typing import IO, 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
deleted file mode 100644
index 7ab7298..0000000
--- a/typeshed/stdlib/2and3/distutils/unixccompiler.pyi
+++ /dev/null
@@ -1,6 +0,0 @@
-# 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
deleted file mode 100644
index 97db9e0..0000000
--- a/typeshed/stdlib/2and3/distutils/util.pyi
+++ /dev/null
@@ -1,20 +0,0 @@
-# Stubs for distutils.util
-
-from typing import Any, Callable, 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
deleted file mode 100644
index 6b6efbf..0000000
--- a/typeshed/stdlib/2and3/distutils/version.pyi
+++ /dev/null
@@ -1,35 +0,0 @@
-# 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
deleted file mode 100644
index 8f6ce18..0000000
--- a/typeshed/stdlib/2and3/errno.pyi
+++ /dev/null
@@ -1,129 +0,0 @@
-# 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
deleted file mode 100644
index 66408fb..0000000
--- a/typeshed/stdlib/2and3/fractions.pyi
+++ /dev/null
@@ -1,94 +0,0 @@
-# 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
deleted file mode 100644
index 59aaf36..0000000
--- a/typeshed/stdlib/2and3/hmac.pyi
+++ /dev/null
@@ -1,35 +0,0 @@
-# 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
deleted file mode 100644
index 6e0fb5f..0000000
--- a/typeshed/stdlib/2and3/keyword.pyi
+++ /dev/null
@@ -1,6 +0,0 @@
-# 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
deleted file mode 100644
index 9ad00e7..0000000
--- a/typeshed/stdlib/2and3/locale.pyi
+++ /dev/null
@@ -1,104 +0,0 @@
-# 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
deleted file mode 100644
index b10f2c6..0000000
--- a/typeshed/stdlib/2and3/logging/__init__.pyi
+++ /dev/null
@@ -1,355 +0,0 @@
-## Stubs for logging (Python 3.4)
-
-from typing import (
- Any, Callable, Iterable, Mapping, MutableMapping, Optional, IO, Tuple,
- Text, Union,
- overload,
-)
-from types import TracebackType
-import sys
-
-_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) -> None: ...
- 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 Handler:
- 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:
- 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) -> None: ...
- 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):
- pass
-
-root = ... # type: RootLogger
diff --git a/typeshed/stdlib/2and3/logging/config.pyi b/typeshed/stdlib/2and3/logging/config.pyi
deleted file mode 100644
index d4665d7..0000000
--- a/typeshed/stdlib/2and3/logging/config.pyi
+++ /dev/null
@@ -1,25 +0,0 @@
-# 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
deleted file mode 100644
index 7aedcb2..0000000
--- a/typeshed/stdlib/2and3/logging/handlers.pyi
+++ /dev/null
@@ -1,200 +0,0 @@
-## Stubs for logging.handlers (Python 2.4)
-
-from typing import Any, Callable, Optional, Tuple, Union, overload
-from logging import Handler, FileHandler, LogRecord
-import datetime
-if sys.version_info >= (3,):
- from queue import Queue
-else:
- from Queue import Queue
-from socket import SocketType
-# TODO update socket stubs to add SocketKind
-SocketKind = int
-import ssl
-import sys
-
-
-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
deleted file mode 100644
index eb2d57a..0000000
--- a/typeshed/stdlib/2and3/marshal.pyi
+++ /dev/null
@@ -1,8 +0,0 @@
-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
deleted file mode 100644
index db5f6a9..0000000
--- a/typeshed/stdlib/2and3/math.pyi
+++ /dev/null
@@ -1,64 +0,0 @@
-# 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
-
-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
deleted file mode 100644
index ee1540f..0000000
--- a/typeshed/stdlib/2and3/mimetypes.pyi
+++ /dev/null
@@ -1,38 +0,0 @@
-# Stubs for mimetypes
-
-from typing import Dict, IO, Optional, Sequence, Tuple
-import sys
-
-def guess_type(url: str,
- 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
deleted file mode 100644
index de5b402..0000000
--- a/typeshed/stdlib/2and3/mmap.pyi
+++ /dev/null
@@ -1,80 +0,0 @@
-# Stubs for mmap
-
-from typing import (Optional, Sequence, Union, Generic, TypeVar, overload,
- Iterable, Container, Sized, Reversible)
-import sys
-
-
-_T = TypeVar('_T', str, bytes)
-
-# TODO already in PEP, have to get added to mypy
-from typing import Type
-from types import TracebackType
-_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
deleted file mode 100644
index e4f7603..0000000
--- a/typeshed/stdlib/2and3/numbers.pyi
+++ /dev/null
@@ -1,140 +0,0 @@
-# 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
deleted file mode 100644
index adce212..0000000
--- a/typeshed/stdlib/2and3/operator.pyi
+++ /dev/null
@@ -1,227 +0,0 @@
-# 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
deleted file mode 100644
index 42619db..0000000
--- a/typeshed/stdlib/2and3/pkgutil.pyi
+++ /dev/null
@@ -1,31 +0,0 @@
-# Stubs for pkgutil
-
-from typing import Any, Callable, Generator, IO, Iterable, 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
deleted file mode 100644
index 2790199..0000000
--- a/typeshed/stdlib/2and3/plistlib.pyi
+++ /dev/null
@@ -1,60 +0,0 @@
-# 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/readline.pyi b/typeshed/stdlib/2and3/readline.pyi
deleted file mode 100644
index aff2deb..0000000
--- a/typeshed/stdlib/2and3/readline.pyi
+++ /dev/null
@@ -1,41 +0,0 @@
-# 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
deleted file mode 100644
index 17e98c6..0000000
--- a/typeshed/stdlib/2and3/rlcompleter.pyi
+++ /dev/null
@@ -1,13 +0,0 @@
-# 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
deleted file mode 100644
index 411677a..0000000
--- a/typeshed/stdlib/2and3/site.pyi
+++ /dev/null
@@ -1,17 +0,0 @@
-# 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
deleted file mode 100644
index 4ab1c41..0000000
--- a/typeshed/stdlib/2and3/tarfile.pyi
+++ /dev/null
@@ -1,178 +0,0 @@
-## Stubs for tarfile
-
-from typing import (
- Callable, IO, 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:
- 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
deleted file mode 100644
index aff13b5..0000000
--- a/typeshed/stdlib/2and3/termios.pyi
+++ /dev/null
@@ -1,246 +0,0 @@
-# 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
deleted file mode 100644
index 6d0e4a6..0000000
--- a/typeshed/stdlib/2and3/threading.pyi
+++ /dev/null
@@ -1,191 +0,0 @@
-# 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
deleted file mode 100644
index 1bd8ff1..0000000
--- a/typeshed/stdlib/2and3/traceback.pyi
+++ /dev/null
@@ -1,100 +0,0 @@
-# Stubs for traceback
-
-from typing import Generator, IO, Iterator, 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
deleted file mode 100644
index a3890cf..0000000
--- a/typeshed/stdlib/2and3/warnings.pyi
+++ /dev/null
@@ -1,39 +0,0 @@
-# Stubs for warnings
-
-from typing import Any, Dict, 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
deleted file mode 100644
index 93cbaca..0000000
--- a/typeshed/stdlib/2and3/webbrowser.pyi
+++ /dev/null
@@ -1,100 +0,0 @@
-# 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
deleted file mode 100644
index a0a0a89..0000000
--- a/typeshed/stdlib/2and3/xml/__init__.pyi
+++ /dev/null
@@ -1,20 +0,0 @@
-# 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
deleted file mode 100644
index 8d93a24..0000000
--- a/typeshed/stdlib/2and3/xml/sax/__init__.pyi
+++ /dev/null
@@ -1,32 +0,0 @@
-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
deleted file mode 100644
index 935a5a3..0000000
--- a/typeshed/stdlib/2and3/xml/sax/handler.pyi
+++ /dev/null
@@ -1,50 +0,0 @@
-# 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
deleted file mode 100644
index 7ff053a..0000000
--- a/typeshed/stdlib/2and3/xml/sax/saxutils.pyi
+++ /dev/null
@@ -1,58 +0,0 @@
-# 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
deleted file mode 100644
index a5f5553..0000000
--- a/typeshed/stdlib/2and3/xml/sax/xmlreader.pyi
+++ /dev/null
@@ -1,75 +0,0 @@
-# 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
deleted file mode 100644
index 693aad3..0000000
--- a/typeshed/stdlib/2and3/zipfile.pyi
+++ /dev/null
@@ -1,94 +0,0 @@
-# Stubs for zipfile
-
-from typing import Callable, IO, 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
deleted file mode 100644
index 2408d10..0000000
--- a/typeshed/stdlib/2and3/zipimport.pyi
+++ /dev/null
@@ -1,19 +0,0 @@
-"""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/typeshed/stdlib/3.2/xml/__init__.pyi b/typeshed/stdlib/3.2/xml/__init__.pyi
deleted file mode 100644
index e69de29..0000000
diff --git a/typeshed/stdlib/3.2/xml/etree/ElementInclude.pyi b/typeshed/stdlib/3.2/xml/etree/ElementInclude.pyi
deleted file mode 100644
index a9e04f2..0000000
--- a/typeshed/stdlib/3.2/xml/etree/ElementInclude.pyi
+++ /dev/null
@@ -1,19 +0,0 @@
-# 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
deleted file mode 100644
index e17e5bb..0000000
--- a/typeshed/stdlib/3.2/xml/etree/ElementPath.pyi
+++ /dev/null
@@ -1,35 +0,0 @@
-# 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
deleted file mode 100644
index 19675b9..0000000
--- a/typeshed/stdlib/3.2/xml/etree/ElementTree.pyi
+++ /dev/null
@@ -1,120 +0,0 @@
-# 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/typeshed/stdlib/3.2/xml/etree/__init__.pyi b/typeshed/stdlib/3.2/xml/etree/__init__.pyi
deleted file mode 100644
index e69de29..0000000
diff --git a/typeshed/stdlib/3.2/xml/etree/cElementTree.pyi b/typeshed/stdlib/3.2/xml/etree/cElementTree.pyi
deleted file mode 100644
index a6f4274..0000000
--- a/typeshed/stdlib/3.2/xml/etree/cElementTree.pyi
+++ /dev/null
@@ -1,5 +0,0 @@
-# Stubs for xml.etree.cElementTree (Python 3.4)
-#
-# NOTE: This dynamically typed stub was automatically generated by stubgen.
-
-from xml.etree.ElementTree import *
diff --git a/typeshed/stdlib/3.3/ipaddress.pyi b/typeshed/stdlib/3.3/ipaddress.pyi
deleted file mode 100644
index e568032..0000000
--- a/typeshed/stdlib/3.3/ipaddress.pyi
+++ /dev/null
@@ -1,200 +0,0 @@
-# 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/typeshed/stdlib/3.3/xml/__init__.pyi b/typeshed/stdlib/3.3/xml/__init__.pyi
deleted file mode 100644
index e69de29..0000000
diff --git a/typeshed/stdlib/3.3/xml/etree/ElementInclude.pyi b/typeshed/stdlib/3.3/xml/etree/ElementInclude.pyi
deleted file mode 100644
index a9e04f2..0000000
--- a/typeshed/stdlib/3.3/xml/etree/ElementInclude.pyi
+++ /dev/null
@@ -1,19 +0,0 @@
-# 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
deleted file mode 100644
index e17e5bb..0000000
--- a/typeshed/stdlib/3.3/xml/etree/ElementPath.pyi
+++ /dev/null
@@ -1,35 +0,0 @@
-# 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
deleted file mode 100644
index cccf493..0000000
--- a/typeshed/stdlib/3.3/xml/etree/ElementTree.pyi
+++ /dev/null
@@ -1,113 +0,0 @@
-# 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/typeshed/stdlib/3.3/xml/etree/__init__.pyi b/typeshed/stdlib/3.3/xml/etree/__init__.pyi
deleted file mode 100644
index e69de29..0000000
diff --git a/typeshed/stdlib/3.3/xml/etree/cElementTree.pyi b/typeshed/stdlib/3.3/xml/etree/cElementTree.pyi
deleted file mode 100644
index a6f4274..0000000
--- a/typeshed/stdlib/3.3/xml/etree/cElementTree.pyi
+++ /dev/null
@@ -1,5 +0,0 @@
-# Stubs for xml.etree.cElementTree (Python 3.4)
-#
-# NOTE: This dynamically typed stub was automatically generated by stubgen.
-
-from xml.etree.ElementTree import *
diff --git a/typeshed/stdlib/3.4/_stat.pyi b/typeshed/stdlib/3.4/_stat.pyi
deleted file mode 100644
index b68e176..0000000
--- a/typeshed/stdlib/3.4/_stat.pyi
+++ /dev/null
@@ -1,69 +0,0 @@
-"""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
deleted file mode 100644
index b1db5ab..0000000
--- a/typeshed/stdlib/3.4/_tracemalloc.pyi
+++ /dev/null
@@ -1,26 +0,0 @@
-"""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
deleted file mode 100644
index 7eb6e88..0000000
--- a/typeshed/stdlib/3.4/asyncio/__init__.pyi
+++ /dev/null
@@ -1,97 +0,0 @@
-"""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
deleted file mode 100644
index 668c83b..0000000
--- a/typeshed/stdlib/3.4/asyncio/coroutines.pyi
+++ /dev/null
@@ -1,9 +0,0 @@
-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
deleted file mode 100644
index 262758f..0000000
--- a/typeshed/stdlib/3.4/asyncio/events.pyi
+++ /dev/null
@@ -1,183 +0,0 @@
-from typing import Any, Awaitable, TypeVar, List, Callable, Tuple, Union, Dict, Generator, overload
-from abc import ABCMeta, abstractmethod
-from asyncio.futures import Future
-from asyncio.coroutines import coroutine
-
-__all__ = ... # type: str
-
-_T = TypeVar('_T')
-
-PIPE = ... # type: Any # from subprocess.PIPE
-
-AF_UNSPEC = 0 # from socket
-AI_PASSIVE = 0
-
-class Handle:
- __slots__ = ... # type: List[str]
- _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: ...
- # 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: ...
- # ?? check Any
- # return (Transport, Protocol)
- @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: ...
- # ?? check Any
- # return Server
- @abstractmethod
- def create_unix_connection(self, protocol_factory: Any, path: str, *,
- ssl: Any = ..., sock: Any = ...,
- server_hostname: str = ...) -> tuple: ...
- # ?? check Any
- # return tuple(Transport, Protocol)
- @abstractmethod
- def create_unix_server(self, protocol_factory: Any, path: str, *,
- sock: Any = ..., backlog: int = ..., ssl: Any = ...) -> Any: ...
- # ?? check Any
- # return Server
- @abstractmethod
- def create_datagram_endpoint(self, protocol_factory: Any,
- local_addr: str = ..., remote_addr: str = ..., *,
- family: int = ..., proto: int = ..., flags: int = ...) -> tuple: ...
- #?? check Any
- # return (Transport, Protocol)
- # Pipes and subprocesses.
- @abstractmethod
- def connect_read_pipe(self, protocol_factory: Any, pipe: Any) -> tuple: ...
- #?? check Any
- # return (Transport, Protocol)
- @abstractmethod
- def connect_write_pipe(self, protocol_factory: Any, pipe: Any) -> tuple: ...
- #?? check Any
- # return (Transport, Protocol)
- @abstractmethod
- def subprocess_shell(self, protocol_factory: Any, cmd: Union[bytes, str], *, stdin: Any = ...,
- stdout: Any = ..., stderr: Any = ...,
- **kwargs: Any) -> tuple: ...
- #?? check Any
- # return (Transport, Protocol)
- @abstractmethod
- def subprocess_exec(self, protocol_factory: Any, *args: List[Any], stdin: Any = ...,
- stdout: Any = ..., stderr: Any = ...,
- **kwargs: Any) -> tuple: ...
- #?? check Any
- # return (Transport, Protocol)
- @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
deleted file mode 100644
index 22d97bd..0000000
--- a/typeshed/stdlib/3.4/asyncio/futures.pyi
+++ /dev/null
@@ -1,47 +0,0 @@
-from typing import Any, Union, Callable, TypeVar, List, Generic, Iterable, Generator, Awaitable
-from .events import AbstractEventLoop
-
-__all__ = ... # type: str
-
-_T = TypeVar('_T')
-
-from concurrent.futures._base import (
- Error as Error,
-)
-from concurrent.futures import (
- CancelledError as CancelledError,
- TimeoutError as TimeoutError,
-)
-class InvalidStateError(Error): ...
-
-class _TracebackLogger:
- __slots__ = ... # type: List[str]
- 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
deleted file mode 100644
index 2467ffe..0000000
--- a/typeshed/stdlib/3.4/asyncio/locks.pyi
+++ /dev/null
@@ -1,59 +0,0 @@
-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
deleted file mode 100644
index 9ad7e4e..0000000
--- a/typeshed/stdlib/3.4/asyncio/protocols.pyi
+++ /dev/null
@@ -1,24 +0,0 @@
-from typing import AnyStr
-
-__all__ = ... # type: str
-
-from asyncio import transports
-
-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
deleted file mode 100644
index edbb183..0000000
--- a/typeshed/stdlib/3.4/asyncio/queues.pyi
+++ /dev/null
@@ -1,47 +0,0 @@
-from typing import TypeVar, Generic
-
-__all__ = ... # type: str
-
-from asyncio.events import AbstractEventLoop
-from .coroutines import coroutine
-from .futures import Future
-
-
-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
deleted file mode 100644
index 00fe38e..0000000
--- a/typeshed/stdlib/3.4/asyncio/streams.pyi
+++ /dev/null
@@ -1,101 +0,0 @@
-from typing import Any, Callable, Generator, Iterable, Tuple
-
-ClientConnectedCallback = Callable[[Tuple[StreamReader, StreamWriter]], None]
-import socket
-
-from . import coroutines
-from . import events
-from . import protocols
-from . import transports
-
-__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
deleted file mode 100644
index 4ea6deb..0000000
--- a/typeshed/stdlib/3.4/asyncio/subprocess.pyi
+++ /dev/null
@@ -1,60 +0,0 @@
-from typing import Any, AnyStr, Tuple, Union
-
-__all__ = ... # type: str
-
-from asyncio import events
-from asyncio import protocols
-from asyncio import streams
-from asyncio import transports
-from asyncio.coroutines import coroutine
-
-
-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
deleted file mode 100644
index 8d6d7fb..0000000
--- a/typeshed/stdlib/3.4/asyncio/tasks.pyi
+++ /dev/null
@@ -1,57 +0,0 @@
-from typing import (Any, TypeVar, Set, Dict, List, TextIO, Union, Tuple, Generic, Callable,
- Coroutine, Generator, Iterable, Awaitable, overload, Sequence, Iterator,
- Optional)
-import concurrent.futures
-
-__all__ = ... # type: str
-
-from .events import AbstractEventLoop
-from .futures import Future
-
-_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
deleted file mode 100644
index b2f2191..0000000
--- a/typeshed/stdlib/3.4/asyncio/transports.pyi
+++ /dev/null
@@ -1,37 +0,0 @@
-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
deleted file mode 100644
index ac04a4a..0000000
--- a/typeshed/stdlib/3.4/enum.pyi
+++ /dev/null
@@ -1,20 +0,0 @@
-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):
- value = ... # type: int
-
-_T = TypeVar('_T')
-
-def unique(enumeration: _T) -> _T: ...
diff --git a/typeshed/stdlib/3.4/pathlib.pyi b/typeshed/stdlib/3.4/pathlib.pyi
deleted file mode 100644
index b66e628..0000000
--- a/typeshed/stdlib/3.4/pathlib.pyi
+++ /dev/null
@@ -1,72 +0,0 @@
-# Stubs for pathlib (Python 3.4)
-
-from typing import Any, Generator, IO, Optional, Sequence, Tuple, Union
-import os
-
-class PurePath:
- parts = ... # type: Tuple[str, ...]
- drive = ... # type: str
- root = ... # type: str
- anchor = ... # type: str
- parents = ... # type: Sequence[PurePath]
- parent = ... # type: PurePath
- name = ... # type: str
- suffix = ... # type: str
- suffixes = ... # type: List[str]
- stem = ... # type: str
- def __init__(self, *pathsegments: str) -> None: ...
- 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, key: Union[str, PurePath]) -> PurePath: ...
- 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, *other: str) -> PurePath: ...
- def with_name(self, name: str) -> PurePath: ...
- def with_suffix(self, suffix: str) -> PurePath: ...
- def joinpath(self, *other: Union[str, PurePath]) -> PurePath: ...
-
-class PurePosixPath(PurePath): ...
-class PureWindowsPath(PurePath): ...
-
-class Path(PurePath):
- @classmethod
- def cwd(cls) -> Path: ...
- 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: ...
- def mkdir(self, mode: int = ..., parents: 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, Path]) -> None: ...
- def replace(self, target: Union[str, Path]) -> None: ...
- def resolve(self) -> Path: ...
- 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: ...
-
-class PosixPath(Path, PurePosixPath): ...
-class WindowsPath(Path, PureWindowsPath): ...
diff --git a/typeshed/stdlib/3.4/selectors.pyi b/typeshed/stdlib/3.4/selectors.pyi
deleted file mode 100644
index 832212b..0000000
--- a/typeshed/stdlib/3.4/selectors.pyi
+++ /dev/null
@@ -1,90 +0,0 @@
-# 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/typeshed/stdlib/3.4/xml/__init__.pyi b/typeshed/stdlib/3.4/xml/__init__.pyi
deleted file mode 100644
index e69de29..0000000
diff --git a/typeshed/stdlib/3.4/xml/etree/ElementInclude.pyi b/typeshed/stdlib/3.4/xml/etree/ElementInclude.pyi
deleted file mode 100644
index a9e04f2..0000000
--- a/typeshed/stdlib/3.4/xml/etree/ElementInclude.pyi
+++ /dev/null
@@ -1,19 +0,0 @@
-# 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
deleted file mode 100644
index e17e5bb..0000000
--- a/typeshed/stdlib/3.4/xml/etree/ElementPath.pyi
+++ /dev/null
@@ -1,35 +0,0 @@
-# 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
deleted file mode 100644
index 74e8084..0000000
--- a/typeshed/stdlib/3.4/xml/etree/ElementTree.pyi
+++ /dev/null
@@ -1,118 +0,0 @@
-# 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/typeshed/stdlib/3.4/xml/etree/__init__.pyi b/typeshed/stdlib/3.4/xml/etree/__init__.pyi
deleted file mode 100644
index e69de29..0000000
diff --git a/typeshed/stdlib/3.4/xml/etree/cElementTree.pyi b/typeshed/stdlib/3.4/xml/etree/cElementTree.pyi
deleted file mode 100644
index a6f4274..0000000
--- a/typeshed/stdlib/3.4/xml/etree/cElementTree.pyi
+++ /dev/null
@@ -1,5 +0,0 @@
-# Stubs for xml.etree.cElementTree (Python 3.4)
-#
-# NOTE: This dynamically typed stub was automatically generated by stubgen.
-
-from xml.etree.ElementTree import *
diff --git a/typeshed/stdlib/3.5/pathlib.pyi b/typeshed/stdlib/3.5/pathlib.pyi
deleted file mode 100644
index 493692b..0000000
--- a/typeshed/stdlib/3.5/pathlib.pyi
+++ /dev/null
@@ -1,88 +0,0 @@
-# Stubs for pathlib (Python 3.5)
-
-from typing import Any, Generator, IO, Optional, Sequence, Tuple, Type, TypeVar, Union
-import os
-
-_P = TypeVar('_P', 'PurePath')
-
-class PurePath:
- 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
- def __new__(cls: Type[_P], *args: Union[str, PurePath]) -> _P: ...
- 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 __rtruediv__(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: ...
- def parents(self: _P) -> Sequence[_P]: ...
- def parent(self: _P) -> _P: ...
-
-class PurePosixPath(PurePath): ...
-class PureWindowsPath(PurePath): ...
-
-class Path(PurePath):
- @classmethod
- def cwd(cls: Type[_P]) -> _P: ...
- @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 stat(self) -> os.stat_result: ...
- def chmod(self, mode: int) -> None: ...
- def exists(self) -> bool: ...
- def expanduser(self: _P) -> _P: ...
- 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: ...
- 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 read_bytes(self) -> bytes: ...
- def read_text(self, encoding: Optional[str] = ...,
- errors: Optional[str] = ...) -> str: ...
- def rename(self, target: Union[str, PurePath]) -> None: ...
- def replace(self, target: Union[str, PurePath]) -> None: ...
- def resolve(self: _P) -> _P: ...
- def rglob(self, pattern: str) -> Generator[Path, None, None]: ...
- def rmdir(self) -> None: ...
- def samefile(self, other_path: Union[str, bytes, int, Path]) -> bool: ...
- def symlink_to(self, target: Union[str, PurePath],
- target_is_directory: bool = ...) -> None: ...
- def touch(self, mode: int = ..., exist_ok: bool = ...) -> None: ...
- def unlink(self) -> None: ...
- 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.5/xml/__init__.pyi b/typeshed/stdlib/3.5/xml/__init__.pyi
deleted file mode 100644
index e69de29..0000000
diff --git a/typeshed/stdlib/3.5/xml/etree/ElementInclude.pyi b/typeshed/stdlib/3.5/xml/etree/ElementInclude.pyi
deleted file mode 100644
index a9e04f2..0000000
--- a/typeshed/stdlib/3.5/xml/etree/ElementInclude.pyi
+++ /dev/null
@@ -1,19 +0,0 @@
-# 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
deleted file mode 100644
index e17e5bb..0000000
--- a/typeshed/stdlib/3.5/xml/etree/ElementPath.pyi
+++ /dev/null
@@ -1,35 +0,0 @@
-# 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
deleted file mode 100644
index 74e8084..0000000
--- a/typeshed/stdlib/3.5/xml/etree/ElementTree.pyi
+++ /dev/null
@@ -1,118 +0,0 @@
-# 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/typeshed/stdlib/3.5/xml/etree/__init__.pyi b/typeshed/stdlib/3.5/xml/etree/__init__.pyi
deleted file mode 100644
index e69de29..0000000
diff --git a/typeshed/stdlib/3.5/xml/etree/cElementTree.pyi b/typeshed/stdlib/3.5/xml/etree/cElementTree.pyi
deleted file mode 100644
index a6f4274..0000000
--- a/typeshed/stdlib/3.5/xml/etree/cElementTree.pyi
+++ /dev/null
@@ -1,5 +0,0 @@
-# Stubs for xml.etree.cElementTree (Python 3.4)
-#
-# NOTE: This dynamically typed stub was automatically generated by stubgen.
-
-from xml.etree.ElementTree import *
diff --git a/typeshed/stdlib/3/__future__.pyi b/typeshed/stdlib/3/__future__.pyi
deleted file mode 100644
index f59753c..0000000
--- a/typeshed/stdlib/3/__future__.pyi
+++ /dev/null
@@ -1,16 +0,0 @@
-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
deleted file mode 100644
index 0c39156..0000000
--- a/typeshed/stdlib/3/_ast.pyi
+++ /dev/null
@@ -1,358 +0,0 @@
-# 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
deleted file mode 100644
index 23fcd82..0000000
--- a/typeshed/stdlib/3/_codecs.pyi
+++ /dev/null
@@ -1,51 +0,0 @@
-"""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
deleted file mode 100644
index 16893b9..0000000
--- a/typeshed/stdlib/3/_compression.pyi
+++ /dev/null
@@ -1,20 +0,0 @@
-# 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
deleted file mode 100644
index 11f3a7c..0000000
--- a/typeshed/stdlib/3/_curses.pyi
+++ /dev/null
@@ -1,295 +0,0 @@
-# Stubs for _curses (Python 3.5)
-#
-# NOTE: This dynamically typed stub was automatically generated by stubgen.
-
-from typing import Any
-
-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(*args, **kwargs): ...
-def beep(*args, **kwargs): ...
-def can_change_color(*args, **kwargs): ...
-def cbreak(*args, **kwargs): ...
-def color_content(*args, **kwargs): ...
-def color_pair(*args, **kwargs): ...
-def curs_set(*args, **kwargs): ...
-def def_prog_mode(*args, **kwargs): ...
-def def_shell_mode(*args, **kwargs): ...
-def delay_output(*args, **kwargs): ...
-def doupdate(*args, **kwargs): ...
-def echo(*args, **kwargs): ...
-def endwin(*args, **kwargs): ...
-def erasechar(*args, **kwargs): ...
-def filter(*args, **kwargs): ...
-def flash(*args, **kwargs): ...
-def flushinp(*args, **kwargs): ...
-def getmouse(*args, **kwargs): ...
-def getsyx(*args, **kwargs): ...
-def getwin(*args, **kwargs): ...
-def halfdelay(*args, **kwargs): ...
-def has_colors(*args, **kwargs): ...
-def has_ic(*args, **kwargs): ...
-def has_il(*args, **kwargs): ...
-def has_key(*args, **kwargs): ...
-def init_color(*args, **kwargs): ...
-def init_pair(*args, **kwargs): ...
-def initscr(*args, **kwargs): ...
-def intrflush(*args, **kwargs): ...
-def is_term_resized(*args, **kwargs): ...
-def isendwin(*args, **kwargs): ...
-def keyname(*args, **kwargs): ...
-def killchar(*args, **kwargs): ...
-def longname(*args, **kwargs): ...
-def meta(*args, **kwargs): ...
-def mouseinterval(*args, **kwargs): ...
-def mousemask(*args, **kwargs): ...
-def napms(*args, **kwargs): ...
-def newpad(*args, **kwargs): ...
-def newwin(*args, **kwargs): ...
-def nl(*args, **kwargs): ...
-def nocbreak(*args, **kwargs): ...
-def noecho(*args, **kwargs): ...
-def nonl(*args, **kwargs): ...
-def noqiflush(*args, **kwargs): ...
-def noraw(*args, **kwargs): ...
-def pair_content(*args, **kwargs): ...
-def pair_number(*args, **kwargs): ...
-def putp(*args, **kwargs): ...
-def qiflush(*args, **kwargs): ...
-def raw(*args, **kwargs): ...
-def reset_prog_mode(*args, **kwargs): ...
-def reset_shell_mode(*args, **kwargs): ...
-def resetty(*args, **kwargs): ...
-def resize_term(*args, **kwargs): ...
-def resizeterm(*args, **kwargs): ...
-def savetty(*args, **kwargs): ...
-def setsyx(*args, **kwargs): ...
-def setupterm(*args, **kwargs): ...
-def start_color(*args, **kwargs): ...
-def termattrs(*args, **kwargs): ...
-def termname(*args, **kwargs): ...
-def tigetflag(*args, **kwargs): ...
-def tigetnum(*args, **kwargs): ...
-def tigetstr(*args, **kwargs): ...
-def tparm(*args, **kwargs): ...
-def typeahead(*args, **kwargs): ...
-def unctrl(*args, **kwargs): ...
-def unget_wch(*args, **kwargs): ...
-def ungetch(*args, **kwargs): ...
-def ungetmouse(*args, **kwargs): ...
-def update_lines_cols(*args, **kwargs): ...
-def use_default_colors(*args, **kwargs): ...
-def use_env(*args, **kwargs): ...
-
-class error(Exception): ...
diff --git a/typeshed/stdlib/3/_dummy_thread.pyi b/typeshed/stdlib/3/_dummy_thread.pyi
deleted file mode 100644
index a4ff81c..0000000
--- a/typeshed/stdlib/3/_dummy_thread.pyi
+++ /dev/null
@@ -1,11 +0,0 @@
-# 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
deleted file mode 100644
index d0b4e26..0000000
--- a/typeshed/stdlib/3/_importlib_modulespec.pyi
+++ /dev/null
@@ -1,43 +0,0 @@
-# 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
deleted file mode 100644
index adfff55..0000000
--- a/typeshed/stdlib/3/_json.pyi
+++ /dev/null
@@ -1,30 +0,0 @@
-"""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
deleted file mode 100644
index 129b49b..0000000
--- a/typeshed/stdlib/3/_markupbase.pyi
+++ /dev/null
@@ -1,9 +0,0 @@
-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
deleted file mode 100644
index 0f64f95..0000000
--- a/typeshed/stdlib/3/_operator.pyi
+++ /dev/null
@@ -1,71 +0,0 @@
-# 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
deleted file mode 100644
index a048a10..0000000
--- a/typeshed/stdlib/3/_posixsubprocess.pyi
+++ /dev/null
@@ -1,13 +0,0 @@
-# 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
deleted file mode 100644
index b3fcdb4..0000000
--- a/typeshed/stdlib/3/_random.pyi
+++ /dev/null
@@ -1,12 +0,0 @@
-# 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
deleted file mode 100644
index 76967b9..0000000
--- a/typeshed/stdlib/3/_subprocess.pyi
+++ /dev/null
@@ -1,38 +0,0 @@
-# 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
deleted file mode 100644
index fb45d93..0000000
--- a/typeshed/stdlib/3/_thread.pyi
+++ /dev/null
@@ -1,14 +0,0 @@
-# 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: ...
diff --git a/typeshed/stdlib/3/_warnings.pyi b/typeshed/stdlib/3/_warnings.pyi
deleted file mode 100644
index 03f1be1..0000000
--- a/typeshed/stdlib/3/_warnings.pyi
+++ /dev/null
@@ -1,11 +0,0 @@
-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
deleted file mode 100644
index 80287e1..0000000
--- a/typeshed/stdlib/3/abc.pyi
+++ /dev/null
@@ -1,13 +0,0 @@
-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
deleted file mode 100644
index 77ed052..0000000
--- a/typeshed/stdlib/3/array.pyi
+++ /dev/null
@@ -1,49 +0,0 @@
-# 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
deleted file mode 100644
index 86a8431..0000000
--- a/typeshed/stdlib/3/ast.pyi
+++ /dev/null
@@ -1,40 +0,0 @@
-# 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
deleted file mode 100644
index 24f9389..0000000
--- a/typeshed/stdlib/3/atexit.pyi
+++ /dev/null
@@ -1,9 +0,0 @@
-"""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
deleted file mode 100644
index 2b5367f..0000000
--- a/typeshed/stdlib/3/base64.pyi
+++ /dev/null
@@ -1,25 +0,0 @@
-# Stubs for base64
-
-# Based on http://docs.python.org/3.2/library/base64.html
-
-from typing import IO
-
-def b64encode(s: bytes, altchars: bytes = ...) -> bytes: ...
-def b64decode(s: bytes, altchars: bytes = ...,
- validate: bool = ...) -> bytes: ...
-def standard_b64encode(s: bytes) -> bytes: ...
-def standard_b64decode(s: bytes) -> bytes: ...
-def urlsafe_b64encode(s: bytes) -> bytes: ...
-def urlsafe_b64decode(s: bytes) -> bytes: ...
-def b32encode(s: bytes) -> bytes: ...
-def b32decode(s: bytes, casefold: bool = ...,
- map01: bytes = ...) -> bytes: ...
-def b16encode(s: bytes) -> bytes: ...
-def b16decode(s: bytes, casefold: bool = ...) -> 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
deleted file mode 100644
index edbd970..0000000
--- a/typeshed/stdlib/3/binascii.pyi
+++ /dev/null
@@ -1,26 +0,0 @@
-# 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
deleted file mode 100644
index 8c75706..0000000
--- a/typeshed/stdlib/3/builtins.pyi
+++ /dev/null
@@ -1,898 +0,0 @@
-# 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, 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
-
-# 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]
-
- 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: ...
-
-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: ...
- def __format__(self, format_spec: str) -> str: ...
-
-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(AbstractSet[_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]: ...
- # TODO __getattribute__
-
-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) -> None: ...
-def filter(function: Callable[[_T], Any], iterable: Iterable[_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
deleted file mode 100644
index 3901170..0000000
--- a/typeshed/stdlib/3/calendar.pyi
+++ /dev/null
@@ -1,86 +0,0 @@
-from typing import Any, Iterable, Optional, Tuple
-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: ...
-
-# 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
deleted file mode 100644
index 1e8f31f..0000000
--- a/typeshed/stdlib/3/cgi.pyi
+++ /dev/null
@@ -1,4 +0,0 @@
-from typing import 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
deleted file mode 100644
index 3f1a546..0000000
--- a/typeshed/stdlib/3/codecs.pyi
+++ /dev/null
@@ -1,194 +0,0 @@
-# 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
deleted file mode 100644
index f9bd402..0000000
--- a/typeshed/stdlib/3/collections/__init__.pyi
+++ /dev/null
@@ -1,163 +0,0 @@
-# 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, Iterable, Generic, Iterator, Dict, overload,
- Mapping, List, Tuple, Callable, Sized, Any, Type,
- Optional, Union
-)
-# These are exported.
-# TODO reexport more.
-from typing import (
- Container as Container,
- 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
deleted file mode 100644
index 07b99ad..0000000
--- a/typeshed/stdlib/3/collections/abc.pyi
+++ /dev/null
@@ -1,14 +0,0 @@
-# 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,
- MutableMapping as MutableMapping,
- Sequence as Sequence,
- MutableSequence as MutableSequence,
- Set as Set,
- MutableSet as MutableSet,
- )
diff --git a/typeshed/stdlib/3/concurrent/__init__.pyi b/typeshed/stdlib/3/concurrent/__init__.pyi
deleted file mode 100644
index e69de29..0000000
diff --git a/typeshed/stdlib/3/concurrent/futures/__init__.pyi b/typeshed/stdlib/3/concurrent/futures/__init__.pyi
deleted file mode 100644
index 5b6ab81..0000000
--- a/typeshed/stdlib/3/concurrent/futures/__init__.pyi
+++ /dev/null
@@ -1,3 +0,0 @@
-from ._base import *
-from .thread import *
-from .process import *
diff --git a/typeshed/stdlib/3/concurrent/futures/_base.pyi b/typeshed/stdlib/3/concurrent/futures/_base.pyi
deleted file mode 100644
index 461c56a..0000000
--- a/typeshed/stdlib/3/concurrent/futures/_base.pyi
+++ /dev/null
@@ -1,44 +0,0 @@
-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
deleted file mode 100644
index d3da982..0000000
--- a/typeshed/stdlib/3/concurrent/futures/process.pyi
+++ /dev/null
@@ -1,15 +0,0 @@
-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
deleted file mode 100644
index 65885fd..0000000
--- a/typeshed/stdlib/3/concurrent/futures/thread.pyi
+++ /dev/null
@@ -1,11 +0,0 @@
-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
deleted file mode 100644
index a4f2301..0000000
--- a/typeshed/stdlib/3/configparser.pyi
+++ /dev/null
@@ -1,185 +0,0 @@
-# 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
- ...
-
- 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
deleted file mode 100644
index 0661cb7..0000000
--- a/typeshed/stdlib/3/copy.pyi
+++ /dev/null
@@ -1,10 +0,0 @@
-# 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
deleted file mode 100644
index 7b41cc8..0000000
--- a/typeshed/stdlib/3/csv.pyi
+++ /dev/null
@@ -1,77 +0,0 @@
-# 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
deleted file mode 100644
index d7cb787..0000000
--- a/typeshed/stdlib/3/curses/__init__.pyi
+++ /dev/null
@@ -1,12 +0,0 @@
-# Stubs for curses (Python 3.5)
-#
-# NOTE: This dynamically typed stub was automatically generated by stubgen.
-
-from _curses import *
-# 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
deleted file mode 100644
index df7ed9f..0000000
--- a/typeshed/stdlib/3/datetime.pyi
+++ /dev/null
@@ -1,223 +0,0 @@
-# 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[timezone] = ...) -> 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
deleted file mode 100644
index a7d88af..0000000
--- a/typeshed/stdlib/3/decimal.pyi
+++ /dev/null
@@ -1,256 +0,0 @@
-# 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
deleted file mode 100644
index eaf068e..0000000
--- a/typeshed/stdlib/3/difflib.pyi
+++ /dev/null
@@ -1,62 +0,0 @@
-# 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
deleted file mode 100644
index 4777614..0000000
--- a/typeshed/stdlib/3/dis.pyi
+++ /dev/null
@@ -1,60 +0,0 @@
-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 = ...) -> None: ...
-def distb(tb: types.TracebackType = ..., *, file: IO[str] = ...) -> None: ...
-def disassemble(co: _have_code, lasti: int = ..., *, file = ...) -> None: ...
-def show_code(co: _have_code, *, file: IO[str]=...) -> 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
deleted file mode 100644
index 5cbdc1f..0000000
--- a/typeshed/stdlib/3/doctest.pyi
+++ /dev/null
@@ -1,9 +0,0 @@
-# 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
deleted file mode 100644
index d42a901..0000000
--- a/typeshed/stdlib/3/email/__init__.pyi
+++ /dev/null
@@ -1,46 +0,0 @@
-# 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
deleted file mode 100644
index cd6b6a5..0000000
--- a/typeshed/stdlib/3/email/charset.pyi
+++ /dev/null
@@ -1,27 +0,0 @@
-# Stubs for email.charset (Python 3.4)
-
-from typing import 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
deleted file mode 100644
index 6f37fba..0000000
--- a/typeshed/stdlib/3/email/contentmanager.pyi
+++ /dev/null
@@ -1,22 +0,0 @@
-# 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
deleted file mode 100644
index bb5c84c..0000000
--- a/typeshed/stdlib/3/email/encoders.pyi
+++ /dev/null
@@ -1,8 +0,0 @@
-# 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
deleted file mode 100644
index b51d7d3..0000000
--- a/typeshed/stdlib/3/email/errors.pyi
+++ /dev/null
@@ -1,22 +0,0 @@
-# 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
deleted file mode 100644
index a86032d..0000000
--- a/typeshed/stdlib/3/email/feedparser.pyi
+++ /dev/null
@@ -1,28 +0,0 @@
-# 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
deleted file mode 100644
index 4be36d1..0000000
--- a/typeshed/stdlib/3/email/generator.pyi
+++ /dev/null
@@ -1,45 +0,0 @@
-# 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
deleted file mode 100644
index f446d4a..0000000
--- a/typeshed/stdlib/3/email/header.pyi
+++ /dev/null
@@ -1,25 +0,0 @@
-# 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
deleted file mode 100644
index 40b57d4..0000000
--- a/typeshed/stdlib/3/email/headerregistry.pyi
+++ /dev/null
@@ -1,102 +0,0 @@
-# Stubs for email.headerregistry (Python 3.4)
-
-import datetime as dt
-import sys
-from typing import 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
deleted file mode 100644
index 6a69f39..0000000
--- a/typeshed/stdlib/3/email/iterators.pyi
+++ /dev/null
@@ -1,8 +0,0 @@
-# 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
deleted file mode 100644
index 3162c03..0000000
--- a/typeshed/stdlib/3/email/message.pyi
+++ /dev/null
@@ -1,130 +0,0 @@
-# Stubs for email.message (Python 3.4)
-
-from typing import (
- 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/typeshed/stdlib/3/email/mime/application.pyi b/typeshed/stdlib/3/email/mime/application.pyi
deleted file mode 100644
index 1aa0580..0000000
--- a/typeshed/stdlib/3/email/mime/application.pyi
+++ /dev/null
@@ -1,11 +0,0 @@
-# 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
deleted file mode 100644
index 2d2c90c..0000000
--- a/typeshed/stdlib/3/email/mime/audio.pyi
+++ /dev/null
@@ -1,11 +0,0 @@
-# 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
deleted file mode 100644
index 448d34b..0000000
--- a/typeshed/stdlib/3/email/mime/base.pyi
+++ /dev/null
@@ -1,10 +0,0 @@
-# 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
deleted file mode 100644
index 9ec5deb..0000000
--- a/typeshed/stdlib/3/email/mime/image.pyi
+++ /dev/null
@@ -1,11 +0,0 @@
-# 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
deleted file mode 100644
index 561e8c3..0000000
--- a/typeshed/stdlib/3/email/mime/message.pyi
+++ /dev/null
@@ -1,7 +0,0 @@
-# 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
deleted file mode 100644
index ea5eba1..0000000
--- a/typeshed/stdlib/3/email/mime/multipart.pyi
+++ /dev/null
@@ -1,12 +0,0 @@
-# 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
deleted file mode 100644
index 1fd3ea9..0000000
--- a/typeshed/stdlib/3/email/mime/nonmultipart.pyi
+++ /dev/null
@@ -1,5 +0,0 @@
-# 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
deleted file mode 100644
index 73adaf5..0000000
--- a/typeshed/stdlib/3/email/mime/text.pyi
+++ /dev/null
@@ -1,8 +0,0 @@
-# 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
deleted file mode 100644
index 02c4ab6..0000000
--- a/typeshed/stdlib/3/email/parser.pyi
+++ /dev/null
@@ -1,62 +0,0 @@
-# Stubs for email.parser (Python 3.4)
-
-from typing import Callable, Optional, TextIO, BinaryIO
-import email.feedparser
-from email.message import Message
-if sys.version_info >= (3, 3):
- from email.policy import Policy
-import sys
-
-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
deleted file mode 100644
index c34ee58..0000000
--- a/typeshed/stdlib/3/email/policy.pyi
+++ /dev/null
@@ -1,69 +0,0 @@
-# Stubs for email.policy (Python 3.4)
-
-from typing import Any, 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
-from abc import abstractmethod
-
-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
deleted file mode 100644
index 9292500..0000000
--- a/typeshed/stdlib/3/email/utils.pyi
+++ /dev/null
@@ -1,32 +0,0 @@
-# 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
deleted file mode 100644
index 2ae6c0a..0000000
--- a/typeshed/stdlib/3/encodings/__init__.pyi
+++ /dev/null
@@ -1,6 +0,0 @@
-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
deleted file mode 100644
index 3be496a..0000000
--- a/typeshed/stdlib/3/encodings/utf_8.pyi
+++ /dev/null
@@ -1,14 +0,0 @@
-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
deleted file mode 100644
index a50fa0d..0000000
--- a/typeshed/stdlib/3/fcntl.pyi
+++ /dev/null
@@ -1,96 +0,0 @@
-# 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
deleted file mode 100644
index 7d68c27..0000000
--- a/typeshed/stdlib/3/fileinput.pyi
+++ /dev/null
@@ -1,48 +0,0 @@
-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
deleted file mode 100644
index 4f99b4a..0000000
--- a/typeshed/stdlib/3/fnmatch.pyi
+++ /dev/null
@@ -1,11 +0,0 @@
-# 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
deleted file mode 100644
index c24faf8..0000000
--- a/typeshed/stdlib/3/functools.pyi
+++ /dev/null
@@ -1,50 +0,0 @@
-# Stubs for functools (Python 3)
-
-# NOTE: These are incomplete!
-
-from abc import ABCMeta, abstractmethod
-from typing import Any, Callable, Generic, Dict, Iterable, 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)])):
- pass
-
-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:
- pass
- 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 = ... # 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/3/gc.pyi b/typeshed/stdlib/3/gc.pyi
deleted file mode 100644
index 4d00dbe..0000000
--- a/typeshed/stdlib/3/gc.pyi
+++ /dev/null
@@ -1,28 +0,0 @@
-# Stubs for gc
-
-from typing import Any, 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
deleted file mode 100644
index dc75699..0000000
--- a/typeshed/stdlib/3/getopt.pyi
+++ /dev/null
@@ -1,19 +0,0 @@
-# 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
deleted file mode 100644
index 73c0cb9..0000000
--- a/typeshed/stdlib/3/getpass.pyi
+++ /dev/null
@@ -1,13 +0,0 @@
-# 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
deleted file mode 100644
index fef481a..0000000
--- a/typeshed/stdlib/3/gettext.pyi
+++ /dev/null
@@ -1,44 +0,0 @@
-# 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
deleted file mode 100644
index ab58e9a..0000000
--- a/typeshed/stdlib/3/glob.pyi
+++ /dev/null
@@ -1,15 +0,0 @@
-# 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
deleted file mode 100644
index ad14951..0000000
--- a/typeshed/stdlib/3/grp.pyi
+++ /dev/null
@@ -1,13 +0,0 @@
-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
deleted file mode 100644
index 9d771fc..0000000
--- a/typeshed/stdlib/3/gzip.pyi
+++ /dev/null
@@ -1,51 +0,0 @@
-# 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
deleted file mode 100644
index 4d3709b..0000000
--- a/typeshed/stdlib/3/hashlib.pyi
+++ /dev/null
@@ -1,40 +0,0 @@
-# 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
deleted file mode 100644
index f56ae72..0000000
--- a/typeshed/stdlib/3/heapq.pyi
+++ /dev/null
@@ -1,23 +0,0 @@
-# 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
deleted file mode 100644
index af2a800..0000000
--- a/typeshed/stdlib/3/html/__init__.pyi
+++ /dev/null
@@ -1,4 +0,0 @@
-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
deleted file mode 100644
index 7cc90b4..0000000
--- a/typeshed/stdlib/3/html/entities.pyi
+++ /dev/null
@@ -1,10 +0,0 @@
-# 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
deleted file mode 100644
index a72d194..0000000
--- a/typeshed/stdlib/3/html/parser.pyi
+++ /dev/null
@@ -1,33 +0,0 @@
-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
deleted file mode 100644
index a9a77da..0000000
--- a/typeshed/stdlib/3/http/__init__.pyi
+++ /dev/null
@@ -1,68 +0,0 @@
-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
deleted file mode 100644
index f11ab99..0000000
--- a/typeshed/stdlib/3/http/client.pyi
+++ /dev/null
@@ -1,192 +0,0 @@
-# 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
deleted file mode 100644
index 38de5a3..0000000
--- a/typeshed/stdlib/3/http/cookiejar.pyi
+++ /dev/null
@@ -1,112 +0,0 @@
-# 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
deleted file mode 100644
index 50bc0ab..0000000
--- a/typeshed/stdlib/3/http/cookies.pyi
+++ /dev/null
@@ -1,31 +0,0 @@
-# Stubs for http.cookies (Python 3.5)
-
-from typing import Generic, 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
deleted file mode 100644
index 2f1d0c2..0000000
--- a/typeshed/stdlib/3/http/server.pyi
+++ /dev/null
@@ -1,63 +0,0 @@
-# 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
deleted file mode 100644
index 678b0c1..0000000
--- a/typeshed/stdlib/3/imp.pyi
+++ /dev/null
@@ -1,10 +0,0 @@
-# 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
deleted file mode 100644
index 7969a3c..0000000
--- a/typeshed/stdlib/3/importlib/__init__.pyi
+++ /dev/null
@@ -1,18 +0,0 @@
-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
deleted file mode 100644
index 3318417..0000000
--- a/typeshed/stdlib/3/importlib/abc.pyi
+++ /dev/null
@@ -1,85 +0,0 @@
-from abc import ABCMeta, abstractmethod
-if sys.version_info >= (3, 4):
- from _importlib_modulespec import ModuleSpec
-import sys
-import types
-from typing import Any, Mapping, Optional, Sequence, Tuple, Union
-
-_Path = Union[bytes, str]
-
-# 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
-
-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
deleted file mode 100644
index 2305e36..0000000
--- a/typeshed/stdlib/3/importlib/machinery.pyi
+++ /dev/null
@@ -1,178 +0,0 @@
-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
deleted file mode 100644
index 6928035..0000000
--- a/typeshed/stdlib/3/importlib/util.pyi
+++ /dev/null
@@ -1,47 +0,0 @@
-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
deleted file mode 100644
index 5fc5b19..0000000
--- a/typeshed/stdlib/3/inspect.pyi
+++ /dev/null
@@ -1,289 +0,0 @@
-# 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
deleted file mode 100644
index b9c9833..0000000
--- a/typeshed/stdlib/3/io.pyi
+++ /dev/null
@@ -1,252 +0,0 @@
-# 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
deleted file mode 100644
index 5432470..0000000
--- a/typeshed/stdlib/3/itertools.pyi
+++ /dev/null
@@ -1,63 +0,0 @@
-# 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
deleted file mode 100644
index d73245a..0000000
--- a/typeshed/stdlib/3/json.pyi
+++ /dev/null
@@ -1,88 +0,0 @@
-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: 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: 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) -> Tuple[Any, int]: ...
diff --git a/typeshed/stdlib/3/linecache.pyi b/typeshed/stdlib/3/linecache.pyi
deleted file mode 100644
index 70967db..0000000
--- a/typeshed/stdlib/3/linecache.pyi
+++ /dev/null
@@ -1,5 +0,0 @@
-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
deleted file mode 100644
index bcab64c..0000000
--- a/typeshed/stdlib/3/msvcrt.pyi
+++ /dev/null
@@ -1,8 +0,0 @@
-# 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
deleted file mode 100644
index bf30ab5..0000000
--- a/typeshed/stdlib/3/multiprocessing/__init__.pyi
+++ /dev/null
@@ -1,98 +0,0 @@
-# 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: ...
diff --git a/typeshed/stdlib/3/multiprocessing/managers.pyi b/typeshed/stdlib/3/multiprocessing/managers.pyi
deleted file mode 100644
index c5d053e..0000000
--- a/typeshed/stdlib/3/multiprocessing/managers.pyi
+++ /dev/null
@@ -1,10 +0,0 @@
-# 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
deleted file mode 100644
index 7d181c3..0000000
--- a/typeshed/stdlib/3/multiprocessing/pool.pyi
+++ /dev/null
@@ -1,58 +0,0 @@
-# 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
deleted file mode 100644
index e1a43f5..0000000
--- a/typeshed/stdlib/3/multiprocessing/process.pyi
+++ /dev/null
@@ -1,4 +0,0 @@
-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
deleted file mode 100644
index e577a9f..0000000
--- a/typeshed/stdlib/3/opcode.pyi
+++ /dev/null
@@ -1,18 +0,0 @@
-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
deleted file mode 100644
index bbfd044..0000000
--- a/typeshed/stdlib/3/os/__init__.pyi
+++ /dev/null
@@ -1,382 +0,0 @@
-# Stubs for os
-# Ron Murawski <ron at horizonchess.com>
-
-# based on http://docs.python.org/3.2/library/os.html
-
-from typing import (
- Mapping, MutableMapping, Dict, List, Any, Tuple, Iterator, overload, Union, AnyStr,
- Optional, Generic, Set, Callable
-)
-import sys
-from builtins import OSError as error
-from . import path
-
-# ----- 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, 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) -> None: ...
-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?
-
-from io import TextIOWrapper as _TextIOWrapper
-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
deleted file mode 100644
index 305e059..0000000
--- a/typeshed/stdlib/3/os/path.pyi
+++ /dev/null
@@ -1,61 +0,0 @@
-# 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 overload, List, Any, AnyStr, 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: ...
-
-# 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
deleted file mode 100644
index 1c375fe..0000000
--- a/typeshed/stdlib/3/pdb.pyi
+++ /dev/null
@@ -1,30 +0,0 @@
-# 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
deleted file mode 100644
index e6a14b2..0000000
--- a/typeshed/stdlib/3/pickle.pyi
+++ /dev/null
@@ -1,67 +0,0 @@
-# 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
deleted file mode 100644
index 62163d6..0000000
--- a/typeshed/stdlib/3/pipes.pyi
+++ /dev/null
@@ -1,19 +0,0 @@
-# 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
deleted file mode 100644
index 794d4c5..0000000
--- a/typeshed/stdlib/3/platform.pyi
+++ /dev/null
@@ -1,35 +0,0 @@
-# Stubs for platform (Python 3.5)
-
-from typing import Tuple, NamedTuple
-
-from os import devnull as DEV_NULL
-
-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]: ...
-from os import popen
-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
deleted file mode 100644
index 3debbbf..0000000
--- a/typeshed/stdlib/3/posix.pyi
+++ /dev/null
@@ -1,7 +0,0 @@
-# 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
deleted file mode 100644
index 5d6285c..0000000
--- a/typeshed/stdlib/3/posixpath.pyi
+++ /dev/null
@@ -1,46 +0,0 @@
-# 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
deleted file mode 100644
index b846ff9..0000000
--- a/typeshed/stdlib/3/pprint.pyi
+++ /dev/null
@@ -1,23 +0,0 @@
-# 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
deleted file mode 100644
index a5a8171..0000000
--- a/typeshed/stdlib/3/pwd.pyi
+++ /dev/null
@@ -1,18 +0,0 @@
-# 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
deleted file mode 100644
index 03c83f9..0000000
--- a/typeshed/stdlib/3/pyclbr.pyi
+++ /dev/null
@@ -1,40 +0,0 @@
-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
deleted file mode 100644
index f85490d..0000000
--- a/typeshed/stdlib/3/queue.pyi
+++ /dev/null
@@ -1,24 +0,0 @@
-# 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
deleted file mode 100644
index f40d973..0000000
--- a/typeshed/stdlib/3/random.pyi
+++ /dev/null
@@ -1,67 +0,0 @@
-# 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
deleted file mode 100644
index 5bdd083..0000000
--- a/typeshed/stdlib/3/re.pyi
+++ /dev/null
@@ -1,106 +0,0 @@
-# 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
deleted file mode 100644
index bde5498..0000000
--- a/typeshed/stdlib/3/resource.pyi
+++ /dev/null
@@ -1,32 +0,0 @@
-# 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
deleted file mode 100644
index f7c257a..0000000
--- a/typeshed/stdlib/3/runpy.pyi
+++ /dev/null
@@ -1,21 +0,0 @@
-# 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
deleted file mode 100644
index 83446f0..0000000
--- a/typeshed/stdlib/3/select.pyi
+++ /dev/null
@@ -1,27 +0,0 @@
-# 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
deleted file mode 100644
index ab6b2d9..0000000
--- a/typeshed/stdlib/3/shelve.pyi
+++ /dev/null
@@ -1,31 +0,0 @@
-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
deleted file mode 100644
index db99fc6..0000000
--- a/typeshed/stdlib/3/shlex.pyi
+++ /dev/null
@@ -1,39 +0,0 @@
-# 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
deleted file mode 100644
index 1307597..0000000
--- a/typeshed/stdlib/3/shutil.pyi
+++ /dev/null
@@ -1,51 +0,0 @@
-# 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
-
-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: 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 = ...): ...
diff --git a/typeshed/stdlib/3/signal.pyi b/typeshed/stdlib/3/signal.pyi
deleted file mode 100644
index 9e599f9..0000000
--- a/typeshed/stdlib/3/signal.pyi
+++ /dev/null
@@ -1,180 +0,0 @@
-"""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
deleted file mode 100644
index fc786e4..0000000
--- a/typeshed/stdlib/3/smtplib.pyi
+++ /dev/null
@@ -1,94 +0,0 @@
-# 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
deleted file mode 100644
index 8451cfb..0000000
--- a/typeshed/stdlib/3/socket.pyi
+++ /dev/null
@@ -1,361 +0,0 @@
-# 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
deleted file mode 100644
index 14a739b..0000000
--- a/typeshed/stdlib/3/socketserver.pyi
+++ /dev/null
@@ -1,93 +0,0 @@
-# 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
deleted file mode 100644
index 28bc3ba..0000000
--- a/typeshed/stdlib/3/sqlite3/__init__.pyi
+++ /dev/null
@@ -1,5 +0,0 @@
-# Stubs for sqlite3 (Python 3.5)
-#
-# NOTE: This dynamically typed stub was automatically generated by stubgen.
-
-from sqlite3.dbapi2 import *
diff --git a/typeshed/stdlib/3/sqlite3/dbapi2.pyi b/typeshed/stdlib/3/sqlite3/dbapi2.pyi
deleted file mode 100644
index b75a0f8..0000000
--- a/typeshed/stdlib/3/sqlite3/dbapi2.pyi
+++ /dev/null
@@ -1,255 +0,0 @@
-# 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
-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= Union[type, None]) -> 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): ...
- # 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:
- 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[tuple]: ...
- def fetchmany(self, size: Integral = ...) -> List[tuple]: ...
- def fetchone(self) -> Union[tuple, None]: ...
- def setinputsizes(self, *args, **kwargs): ...
- def setoutputsize(self, *args, **kwargs): ...
- def __iter__(self): ...
- def __next__(self): ...
-
-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
deleted file mode 100644
index ce77002..0000000
--- a/typeshed/stdlib/3/ssl.pyi
+++ /dev/null
@@ -1,285 +0,0 @@
-# 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
deleted file mode 100644
index 60600ed..0000000
--- a/typeshed/stdlib/3/stat.pyi
+++ /dev/null
@@ -1,73 +0,0 @@
-# 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
deleted file mode 100644
index 365449e..0000000
--- a/typeshed/stdlib/3/string.pyi
+++ /dev/null
@@ -1,42 +0,0 @@
-# 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
deleted file mode 100644
index f539610..0000000
--- a/typeshed/stdlib/3/struct.pyi
+++ /dev/null
@@ -1,30 +0,0 @@
-# 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
deleted file mode 100644
index 11b108f..0000000
--- a/typeshed/stdlib/3/subprocess.pyi
+++ /dev/null
@@ -1,249 +0,0 @@
-# Stubs for subprocess
-
-# Based on http://docs.python.org/3.5/library/subprocess.html
-import sys
-from typing import Sequence, Any, 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: Union[str, bytes]
- stderr = ... # type: Union[str, bytes]
- 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: Union[str, bytes] = ..., timeout: float = ...) -> Tuple[Any, Any]: ...
- else:
- def communicate(self, input: Union[str, bytes] = ...) -> 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
deleted file mode 100644
index 28b23a5..0000000
--- a/typeshed/stdlib/3/sys.pyi
+++ /dev/null
@@ -1,162 +0,0 @@
-# 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
-
-_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 = ...) -> None:
- 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
deleted file mode 100644
index 8d7ab2c..0000000
--- a/typeshed/stdlib/3/sysconfig.pyi
+++ /dev/null
@@ -1,8 +0,0 @@
-# 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
deleted file mode 100644
index 4398b41..0000000
--- a/typeshed/stdlib/3/tempfile.pyi
+++ /dev/null
@@ -1,48 +0,0 @@
-# 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
deleted file mode 100644
index babb45e..0000000
--- a/typeshed/stdlib/3/textwrap.pyi
+++ /dev/null
@@ -1,121 +0,0 @@
-# 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
deleted file mode 100644
index 72140c3..0000000
--- a/typeshed/stdlib/3/time.pyi
+++ /dev/null
@@ -1,75 +0,0 @@
-# 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 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
-
-
-# ----- classes/methods -----
-class struct_time:
- # this is supposed to be a namedtuple object
- # namedtuple is not yet implemented (see file: mypy/stubs/collections.py)
- # see: http://docs.python.org/3.2/library/time.html#time.struct_time
- # see: http://nullege.com/codes/search/time.struct_time
- # TODO: namedtuple() object problem
- #namedtuple __init__(self, int, int, int, int, int, int, int, int, int):
- # ...
- tm_year = 0
- tm_mon = 0
- tm_mday = 0
- tm_hour = 0
- tm_min = 0
- tm_sec = 0
- tm_wday = 0
- tm_yday = 0
- tm_isdst = 0
- if sys.version_info >= (3, 3):
- tm_gmtoff = 0
- tm_zone = 'GMT'
-
-# ----- 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
deleted file mode 100644
index 782932d..0000000
--- a/typeshed/stdlib/3/tkinter/__init__.pyi
+++ /dev/null
@@ -1,660 +0,0 @@
-# Stubs for tkinter (Python 3.5)
-#
-# NOTE: This dynamically typed stub was automatically generated by stubgen.
-
-from typing import Any
-from tkinter.constants import *
-
-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
deleted file mode 100644
index 6a6deae..0000000
--- a/typeshed/stdlib/3/tkinter/constants.pyi
+++ /dev/null
@@ -1,83 +0,0 @@
-# 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
deleted file mode 100644
index 099f308..0000000
--- a/typeshed/stdlib/3/tkinter/ttk.pyi
+++ /dev/null
@@ -1,158 +0,0 @@
-# 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
deleted file mode 100644
index a2a5b59..0000000
--- a/typeshed/stdlib/3/token.pyi
+++ /dev/null
@@ -1,63 +0,0 @@
-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
deleted file mode 100644
index 947c195..0000000
--- a/typeshed/stdlib/3/tokenize.pyi
+++ /dev/null
@@ -1,99 +0,0 @@
-# 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 *
-
-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
deleted file mode 100644
index 4a0da75..0000000
--- a/typeshed/stdlib/3/types.pyi
+++ /dev/null
@@ -1,149 +0,0 @@
-# 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
-)
-
-_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: ...
-
-class SimpleNamespace(Any): ...
-
-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
-
-# 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
-
-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
deleted file mode 100644
index 96b09be..0000000
--- a/typeshed/stdlib/3/typing.pyi
+++ /dev/null
@@ -1,448 +0,0 @@
-# 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()
-
-# 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], Generic[_T]): ...
-
-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
deleted file mode 100644
index 08ad413..0000000
--- a/typeshed/stdlib/3/unicodedata.pyi
+++ /dev/null
@@ -1,37 +0,0 @@
-# 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.pyi b/typeshed/stdlib/3/unittest.pyi
deleted file mode 100644
index ff64944..0000000
--- a/typeshed/stdlib/3/unittest.pyi
+++ /dev/null
@@ -1,330 +0,0 @@
-## Stubs for unittest
-
-from typing import (
- Any, Callable, Iterable, Iterator, List, Optional, Pattern, Sequence,
- 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[Any], Tuple[Type[Any], ...]],
- msg: Any = ...) -> None: ...
- def assertNotIsInstance(self, obj: Any,
- cls: Union[Type[Any], Tuple[Type[Any], ...]],
- 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]
-
-# not really documented
-class TestRunner:
- def run(self, test: Union[TestSuite, TestCase]) -> None: ...
-
-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: ...
-def removeHandler(function: Optional[_FT]) -> _FT: ...
diff --git a/typeshed/stdlib/3/urllib/__init__.pyi b/typeshed/stdlib/3/urllib/__init__.pyi
deleted file mode 100644
index e69de29..0000000
diff --git a/typeshed/stdlib/3/urllib/error.pyi b/typeshed/stdlib/3/urllib/error.pyi
deleted file mode 100644
index fe4dbb1..0000000
--- a/typeshed/stdlib/3/urllib/error.pyi
+++ /dev/null
@@ -1,11 +0,0 @@
-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
deleted file mode 100644
index 3e5433f..0000000
--- a/typeshed/stdlib/3/urllib/parse.pyi
+++ /dev/null
@@ -1,139 +0,0 @@
-# Stubs for urllib.parse
-from typing import List, Dict, Tuple, AnyStr, Generic, overload, Sequence, Mapping
-
-__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
-
-class _SplitResultBase(tuple, Generic[AnyStr]):
- scheme = ... # type: AnyStr
- netloc = ... # type: AnyStr
- path = ... # type: AnyStr
- query = ... # type: AnyStr
- fragment = ... # type: AnyStr
-
-class _ParseResultBase(tuple, Generic[AnyStr]):
- scheme = ... # type: AnyStr
- netloc = ... # type: AnyStr
- path = ... # type: AnyStr
- params = ... # type: AnyStr
- query = ... # type: AnyStr
- fragment = ... # type: AnyStr
-
-# Structured result objects for string data
-class DefragResult(_DefragResultBase[str], _ResultMixinStr): ...
-
-class SplitResult(_SplitResultBase[str], _NetlocResultMixinStr): ...
-
-class ParseResult(_ParseResultBase[str], _NetlocResultMixinStr): ...
-
-# Structured result objects for bytes data
-class DefragResultBytes(_DefragResultBase[bytes], _ResultMixinBytes): ...
-
-class SplitResultBytes(_SplitResultBase[bytes], _NetlocResultMixinBytes): ...
-
-class ParseResultBytes(_ParseResultBase[bytes], _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: ...
-
- at overload
-def urlencode(query: Mapping[AnyStr, AnyStr], doseq: bool = ..., safe: AnyStr = ..., encoding: str = ..., errors: str = ...) -> str: ...
- at overload
-def urlencode(query: Sequence[Tuple[AnyStr, AnyStr]], 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_framgents: bool = ...) -> ParseResult: ...
- at overload
-def urlparse(url: bytes, scheme: bytes = ..., allow_framgents: 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
deleted file mode 100644
index 4efa4aa..0000000
--- a/typeshed/stdlib/3/urllib/request.pyi
+++ /dev/null
@@ -1,199 +0,0 @@
-# Stubs for urllib.request (Python 3.4)
-
-from typing import (
- Any, Callable, 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
deleted file mode 100644
index 033bbaa..0000000
--- a/typeshed/stdlib/3/urllib/response.pyi
+++ /dev/null
@@ -1,8 +0,0 @@
-# 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
deleted file mode 100644
index 11ead4f..0000000
--- a/typeshed/stdlib/3/urllib/robotparser.pyi
+++ /dev/null
@@ -1,18 +0,0 @@
-# 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(useragent: str) -> Optional[str]: ...
- def request_rate(useragent: str) -> Optional[_RequestRate]: ...
diff --git a/typeshed/stdlib/3/uuid.pyi b/typeshed/stdlib/3/uuid.pyi
deleted file mode 100644
index 8c51d99..0000000
--- a/typeshed/stdlib/3/uuid.pyi
+++ /dev/null
@@ -1,73 +0,0 @@
-# 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
deleted file mode 100644
index 6e62f0b..0000000
--- a/typeshed/stdlib/3/weakref.pyi
+++ /dev/null
@@ -1,120 +0,0 @@
-# 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__(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/typeshed/stdlib/3/wsgiref/__init__.pyi b/typeshed/stdlib/3/wsgiref/__init__.pyi
deleted file mode 100644
index e69de29..0000000
diff --git a/typeshed/stdlib/3/wsgiref/validate.pyi b/typeshed/stdlib/3/wsgiref/validate.pyi
deleted file mode 100644
index ecdb252..0000000
--- a/typeshed/stdlib/3/wsgiref/validate.pyi
+++ /dev/null
@@ -1,47 +0,0 @@
-# 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
deleted file mode 100644
index 11198ce..0000000
--- a/typeshed/stdlib/3/xml/etree/ElementInclude.pyi
+++ /dev/null
@@ -1,19 +0,0 @@
-# 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
deleted file mode 100644
index e0cb256..0000000
--- a/typeshed/stdlib/3/xml/etree/ElementPath.pyi
+++ /dev/null
@@ -1,25 +0,0 @@
-# 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
deleted file mode 100644
index e4be890..0000000
--- a/typeshed/stdlib/3/xml/etree/ElementTree.pyi
+++ /dev/null
@@ -1,98 +0,0 @@
-# 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/typeshed/stdlib/3/xml/etree/__init__.pyi b/typeshed/stdlib/3/xml/etree/__init__.pyi
deleted file mode 100644
index e69de29..0000000
diff --git a/typeshed/stdlib/3/xml/etree/cElementTree.pyi b/typeshed/stdlib/3/xml/etree/cElementTree.pyi
deleted file mode 100644
index a6f4274..0000000
--- a/typeshed/stdlib/3/xml/etree/cElementTree.pyi
+++ /dev/null
@@ -1,5 +0,0 @@
-# Stubs for xml.etree.cElementTree (Python 3.4)
-#
-# NOTE: This dynamically typed stub was automatically generated by stubgen.
-
-from xml.etree.ElementTree import *
diff --git a/typeshed/stdlib/3/zlib.pyi b/typeshed/stdlib/3/zlib.pyi
deleted file mode 100644
index 6dda282..0000000
--- a/typeshed/stdlib/3/zlib.pyi
+++ /dev/null
@@ -1,46 +0,0 @@
-# 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
deleted file mode 100755
index 90dd737..0000000
--- a/typeshed/tests/mypy_test.py
+++ /dev/null
@@ -1,148 +0,0 @@
-#!/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, 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')
- ##flags.append('--fast-parser') # Travis CI doesn't have typed_ast yet.
- ##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
deleted file mode 100755
index 078ef55..0000000
--- a/typeshed/tests/pytype_test.py
+++ /dev/null
@@ -1,109 +0,0 @@
-#!/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\.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/typeshed/third_party/2/Crypto/Cipher/AES.pyi b/typeshed/third_party/2/Crypto/Cipher/AES.pyi
deleted file mode 100644
index e69de29..0000000
diff --git a/typeshed/third_party/2/Crypto/Cipher/__init__.pyi b/typeshed/third_party/2/Crypto/Cipher/__init__.pyi
deleted file mode 100644
index b6e2a04..0000000
--- a/typeshed/third_party/2/Crypto/Cipher/__init__.pyi
+++ /dev/null
@@ -1,15 +0,0 @@
-# Stubs for Crypto.Cipher (Python 2)
-#
-# 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/2/Crypto/Random/__init__.pyi b/typeshed/third_party/2/Crypto/Random/__init__.pyi
deleted file mode 100644
index c13ab82..0000000
--- a/typeshed/third_party/2/Crypto/Random/__init__.pyi
+++ /dev/null
@@ -1,5 +0,0 @@
-# Stubs for Crypto.Random (Python 2)
-#
-# NOTE: This dynamically typed stub was automatically generated by stubgen.
-
-def get_random_bytes(n: int) -> str: ...
diff --git a/typeshed/third_party/2/Crypto/Random/random.pyi b/typeshed/third_party/2/Crypto/Random/random.pyi
deleted file mode 100644
index 76f2780..0000000
--- a/typeshed/third_party/2/Crypto/Random/random.pyi
+++ /dev/null
@@ -1,3 +0,0 @@
-# very stubby version of Crypto.Random
-
-def randint(min: int, max: int) -> int: ...
diff --git a/typeshed/third_party/2/Crypto/__init__.pyi b/typeshed/third_party/2/Crypto/__init__.pyi
deleted file mode 100644
index e69de29..0000000
diff --git a/typeshed/third_party/2/OpenSSL/__init__.pyi b/typeshed/third_party/2/OpenSSL/__init__.pyi
deleted file mode 100644
index e69de29..0000000
diff --git a/typeshed/third_party/2/OpenSSL/crypto.pyi b/typeshed/third_party/2/OpenSSL/crypto.pyi
deleted file mode 100644
index ef352ac..0000000
--- a/typeshed/third_party/2/OpenSSL/crypto.pyi
+++ /dev/null
@@ -1,6 +0,0 @@
-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/typeshed/third_party/2/boto/__init__.pyi b/typeshed/third_party/2/boto/__init__.pyi
deleted file mode 100644
index bb0631f..0000000
--- a/typeshed/third_party/2/boto/__init__.pyi
+++ /dev/null
@@ -1,78 +0,0 @@
-# Stubs for boto (Python 2)
-#
-# NOTE: This dynamically typed stub was automatically generated by stubgen.
-
-from typing import Any
-import logging
-
-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=..., format_string=...): ...
-def set_stream_logger(name, level=..., format_string=...): ...
-def connect_sqs(aws_access_key_id=..., aws_secret_access_key=..., **kwargs): ...
-def connect_s3(aws_access_key_id=..., aws_secret_access_key=..., **kwargs): ...
-def connect_gs(gs_access_key_id=..., gs_secret_access_key=..., **kwargs): ...
-def connect_ec2(aws_access_key_id=..., aws_secret_access_key=..., **kwargs): ...
-def connect_elb(aws_access_key_id=..., aws_secret_access_key=..., **kwargs): ...
-def connect_autoscale(aws_access_key_id=..., aws_secret_access_key=..., **kwargs): ...
-def connect_cloudwatch(aws_access_key_id=..., aws_secret_access_key=..., **kwargs): ...
-def connect_sdb(aws_access_key_id=..., aws_secret_access_key=..., **kwargs): ...
-def connect_fps(aws_access_key_id=..., aws_secret_access_key=..., **kwargs): ...
-def connect_mturk(aws_access_key_id=..., aws_secret_access_key=..., **kwargs): ...
-def connect_cloudfront(aws_access_key_id=..., aws_secret_access_key=..., **kwargs): ...
-def connect_vpc(aws_access_key_id=..., aws_secret_access_key=..., **kwargs): ...
-def connect_rds(aws_access_key_id=..., aws_secret_access_key=..., **kwargs): ...
-def connect_rds2(aws_access_key_id=..., aws_secret_access_key=..., **kwargs): ...
-def connect_emr(aws_access_key_id=..., aws_secret_access_key=..., **kwargs): ...
-def connect_sns(aws_access_key_id=..., aws_secret_access_key=..., **kwargs): ...
-def connect_iam(aws_access_key_id=..., aws_secret_access_key=..., **kwargs): ...
-def connect_route53(aws_access_key_id=..., aws_secret_access_key=..., **kwargs): ...
-def connect_cloudformation(aws_access_key_id=..., aws_secret_access_key=..., **kwargs): ...
-def connect_euca(host=..., aws_access_key_id=..., aws_secret_access_key=..., port=..., path=..., is_secure=..., **kwargs): ...
-def connect_glacier(aws_access_key_id=..., aws_secret_access_key=..., **kwargs): ...
-def connect_ec2_endpoint(url, aws_access_key_id=..., aws_secret_access_key=..., **kwargs): ...
-def connect_walrus(host=..., aws_access_key_id=..., aws_secret_access_key=..., port=..., path=..., is_secure=..., **kwargs): ...
-def connect_ses(aws_access_key_id=..., aws_secret_access_key=..., **kwargs): ...
-def connect_sts(aws_access_key_id=..., aws_secret_access_key=..., **kwargs): ...
-def connect_ia(ia_access_key_id=..., ia_secret_access_key=..., is_secure=..., **kwargs): ...
-def connect_dynamodb(aws_access_key_id=..., aws_secret_access_key=..., **kwargs): ...
-def connect_swf(aws_access_key_id=..., aws_secret_access_key=..., **kwargs): ...
-def connect_cloudsearch(aws_access_key_id=..., aws_secret_access_key=..., **kwargs): ...
-def connect_cloudsearch2(aws_access_key_id=..., aws_secret_access_key=..., sign_request=..., **kwargs): ...
-def connect_cloudsearchdomain(aws_access_key_id=..., aws_secret_access_key=..., **kwargs): ...
-def connect_beanstalk(aws_access_key_id=..., aws_secret_access_key=..., **kwargs): ...
-def connect_elastictranscoder(aws_access_key_id=..., aws_secret_access_key=..., **kwargs): ...
-def connect_opsworks(aws_access_key_id=..., aws_secret_access_key=..., **kwargs): ...
-def connect_redshift(aws_access_key_id=..., aws_secret_access_key=..., **kwargs): ...
-def connect_support(aws_access_key_id=..., aws_secret_access_key=..., **kwargs): ...
-def connect_cloudtrail(aws_access_key_id=..., aws_secret_access_key=..., **kwargs): ...
-def connect_directconnect(aws_access_key_id=..., aws_secret_access_key=..., **kwargs): ...
-def connect_kinesis(aws_access_key_id=..., aws_secret_access_key=..., **kwargs): ...
-def connect_logs(aws_access_key_id=..., aws_secret_access_key=..., **kwargs): ...
-def connect_route53domains(aws_access_key_id=..., aws_secret_access_key=..., **kwargs): ...
-def connect_cognito_identity(aws_access_key_id=..., aws_secret_access_key=..., **kwargs): ...
-def connect_cognito_sync(aws_access_key_id=..., aws_secret_access_key=..., **kwargs): ...
-def connect_kms(aws_access_key_id=..., aws_secret_access_key=..., **kwargs): ...
-def connect_awslambda(aws_access_key_id=..., aws_secret_access_key=..., **kwargs): ...
-def connect_codedeploy(aws_access_key_id=..., aws_secret_access_key=..., **kwargs): ...
-def connect_configservice(aws_access_key_id=..., aws_secret_access_key=..., **kwargs): ...
-def connect_cloudhsm(aws_access_key_id=..., aws_secret_access_key=..., **kwargs): ...
-def connect_ec2containerservice(aws_access_key_id=..., aws_secret_access_key=..., **kwargs): ...
-def connect_machinelearning(aws_access_key_id=..., aws_secret_access_key=..., **kwargs): ...
-def storage_uri(uri_str, default_scheme=..., debug=..., validate=..., bucket_storage_uri_class=..., suppress_consec_slashes=..., is_latest=...): ...
-def storage_uri_for_key(key): ...
diff --git a/typeshed/third_party/2/boto/connection.pyi b/typeshed/third_party/2/boto/connection.pyi
deleted file mode 100644
index 871cb57..0000000
--- a/typeshed/third_party/2/boto/connection.pyi
+++ /dev/null
@@ -1,108 +0,0 @@
-# Stubs for boto.connection (Python 2)
-#
-# NOTE: This dynamically typed stub was automatically generated by stubgen.
-
-from typing import Any
-
-HAVE_HTTPS_CONNECTION = ... # type: Any
-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: Any
- STALE_DURATION = ... # type: Any
- host_to_pool = ... # type: Any
- last_clean_time = ... # type: Any
- 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 AWSAuthConnection:
- suppress_consec_slashes = ... # type: Any
- num_retries = ... # type: Any
- 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: Any
- 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=..., aws_secret_access_key=..., is_secure=..., port=..., proxy=..., proxy_port=..., proxy_user=..., proxy_pass=..., debug=..., https_connection_factory=..., path=..., provider=..., security_token=..., suppress_consec_slashes=..., validate_certs=..., profile_name=...) -> None: ...
- auth_region_name = ... # type: Any
- def connection(self): ...
- def aws_access_key_id(self): ...
- gs_access_key_id = ... # type: Any
- access_key = ... # type: Any
- def aws_secret_access_key(self): ...
- gs_secret_access_key = ... # type: Any
- secret_key = ... # type: Any
- def profile_name(self): ...
- def get_path(self, path=...): ...
- def server_name(self, port=...): ...
- 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=..., port=...): ...
- def prefix_proxy_to_path(self, path, host=...): ...
- 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=..., headers=..., data=..., host=...): ...
- def make_request(self, method, path, headers=..., data=..., host=..., auth_path=..., sender=..., override_num_retries=..., params=..., retry_handler=...): ...
- def close(self): ...
-
-class AWSQueryConnection(AWSAuthConnection):
- APIVersion = ... # type: Any
- ResponseError = ... # type: Any
- def __init__(self, aws_access_key_id=..., aws_secret_access_key=..., is_secure=..., port=..., proxy=..., proxy_port=..., proxy_user=..., proxy_pass=..., host=..., debug=..., https_connection_factory=..., path=..., security_token=..., validate_certs=..., profile_name=..., provider=...) -> None: ...
- def get_utf8_value(self, value): ...
- def make_request(self, action, params=..., path=..., verb=...): ...
- 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=..., parent=..., verb=...): ...
- def get_object(self, action, params, cls, path=..., parent=..., verb=...): ...
- def get_status(self, action, params, path=..., parent=..., verb=...): ...
diff --git a/typeshed/third_party/2/boto/ec2/__init__.pyi b/typeshed/third_party/2/boto/ec2/__init__.pyi
deleted file mode 100644
index 67908a5..0000000
--- a/typeshed/third_party/2/boto/ec2/__init__.pyi
+++ /dev/null
@@ -1,11 +0,0 @@
-# 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/2/boto/ec2/elb/__init__.pyi b/typeshed/third_party/2/boto/ec2/elb/__init__.pyi
deleted file mode 100644
index fcad2fa..0000000
--- a/typeshed/third_party/2/boto/ec2/elb/__init__.pyi
+++ /dev/null
@@ -1,43 +0,0 @@
-# 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/2/boto/exception.pyi b/typeshed/third_party/2/boto/exception.pyi
deleted file mode 100644
index 2a20228..0000000
--- a/typeshed/third_party/2/boto/exception.pyi
+++ /dev/null
@@ -1,149 +0,0 @@
-# Stubs for boto.exception (Python 2)
-#
-# NOTE: This dynamically typed stub was automatically generated by stubgen.
-
-from typing import Any
-
-class BotoClientError(StandardError):
- reason = ... # type: Any
- def __init__(self, reason, *args): ...
-
-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: Any
- box_usage = ... # type: Any
- def __init__(self, status, reason, body=None, *args): ...
- 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=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=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=None): ...
- def startElement(self, name, attrs, connection): ...
- def endElement(self, name, value, connection): ...
-
-class SQSDecodeError(BotoClientError):
- message = ... # type: Any
- def __init__(self, reason, message): ...
-
-class StorageResponseError(BotoServerError):
- resource = ... # type: Any
- def __init__(self, status, reason, body=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=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=None, *args): ...
-
-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=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): ...
-
-class InvalidAclError(Exception):
- message = ... # type: Any
- def __init__(self, message): ...
-
-class InvalidCorsError(Exception):
- message = ... # type: Any
- def __init__(self, message): ...
-
-class NoAuthHandlerFound(Exception): ...
-
-class InvalidLifecycleConfigError(Exception):
- message = ... # type: Any
- def __init__(self, message): ...
-
-class ResumableTransferDisposition:
- START_OVER = ... # type: Any
- WAIT_BEFORE_RETRY = ... # type: Any
- ABORT_CUR_PROCESS = ... # type: Any
- ABORT = ... # type: Any
-
-class ResumableUploadException(Exception):
- message = ... # type: Any
- disposition = ... # type: Any
- def __init__(self, message, disposition): ...
-
-class ResumableDownloadException(Exception):
- message = ... # type: Any
- disposition = ... # type: Any
- def __init__(self, message, disposition): ...
-
-class TooManyRecordsException(Exception):
- message = ... # type: Any
- def __init__(self, message): ...
-
-class PleaseRetryException(Exception):
- message = ... # type: Any
- response = ... # type: Any
- def __init__(self, message, response=None): ...
-
-class InvalidInstanceMetadataError(Exception):
- MSG = ... # type: Any
- def __init__(self, msg): ...
diff --git a/typeshed/third_party/2/concurrent/__init__.pyi b/typeshed/third_party/2/concurrent/__init__.pyi
deleted file mode 100644
index e69de29..0000000
diff --git a/typeshed/third_party/2/concurrent/futures/__init__.pyi b/typeshed/third_party/2/concurrent/futures/__init__.pyi
deleted file mode 100644
index e2f7455..0000000
--- a/typeshed/third_party/2/concurrent/futures/__init__.pyi
+++ /dev/null
@@ -1,37 +0,0 @@
-from typing import TypeVar, Generic, Any, Iterable, Iterator, Callable, Tuple
-
-_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: 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
deleted file mode 100644
index 01f344b..0000000
--- a/typeshed/third_party/2/croniter.pyi
+++ /dev/null
@@ -1,27 +0,0 @@
-# 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/typeshed/third_party/2/dateutil/__init__.pyi b/typeshed/third_party/2/dateutil/__init__.pyi
deleted file mode 100644
index e69de29..0000000
diff --git a/typeshed/third_party/2/dateutil/parser.pyi b/typeshed/third_party/2/dateutil/parser.pyi
deleted file mode 100644
index 4962b8a..0000000
--- a/typeshed/third_party/2/dateutil/parser.pyi
+++ /dev/null
@@ -1,39 +0,0 @@
-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
deleted file mode 100644
index b37ef5d..0000000
--- a/typeshed/third_party/2/dateutil/relativedelta.pyi
+++ /dev/null
@@ -1,86 +0,0 @@
-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
deleted file mode 100644
index 4032e81..0000000
--- a/typeshed/third_party/2/enum.pyi
+++ /dev/null
@@ -1,19 +0,0 @@
-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
deleted file mode 100644
index 0394fdb..0000000
--- a/typeshed/third_party/2/fb303/FacebookService.pyi
+++ /dev/null
@@ -1,301 +0,0 @@
-# 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/typeshed/third_party/2/fb303/__init__.pyi b/typeshed/third_party/2/fb303/__init__.pyi
deleted file mode 100644
index e69de29..0000000
diff --git a/typeshed/third_party/2/gflags.pyi b/typeshed/third_party/2/gflags.pyi
deleted file mode 100644
index a91cee5..0000000
--- a/typeshed/third_party/2/gflags.pyi
+++ /dev/null
@@ -1,216 +0,0 @@
-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/typeshed/third_party/2/google/__init__.pyi b/typeshed/third_party/2/google/__init__.pyi
deleted file mode 100644
index e69de29..0000000
diff --git a/typeshed/third_party/2/google/protobuf/__init__.pyi b/typeshed/third_party/2/google/protobuf/__init__.pyi
deleted file mode 100644
index d232164..0000000
--- a/typeshed/third_party/2/google/protobuf/__init__.pyi
+++ /dev/null
@@ -1 +0,0 @@
-__version__ = ... # type: str
diff --git a/typeshed/third_party/2/google/protobuf/descriptor.pyi b/typeshed/third_party/2/google/protobuf/descriptor.pyi
deleted file mode 100644
index f75d11c..0000000
--- a/typeshed/third_party/2/google/protobuf/descriptor.pyi
+++ /dev/null
@@ -1,163 +0,0 @@
-# Stubs for google.protobuf.descriptor (Python 2.7)
-#
-# NOTE: This dynamically typed stub was automatically generated by stubgen.
-
-from typing import Any
-
-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, string): ...
diff --git a/typeshed/third_party/2/google/protobuf/descriptor_pb2.pyi b/typeshed/third_party/2/google/protobuf/descriptor_pb2.pyi
deleted file mode 100644
index 4ac2e4c..0000000
--- a/typeshed/third_party/2/google/protobuf/descriptor_pb2.pyi
+++ /dev/null
@@ -1,2 +0,0 @@
-class FileOptions(object): ...
-class FieldOptions(object): ...
diff --git a/typeshed/third_party/2/google/protobuf/internal/__init__.pyi b/typeshed/third_party/2/google/protobuf/internal/__init__.pyi
deleted file mode 100644
index e69de29..0000000
diff --git a/typeshed/third_party/2/google/protobuf/internal/decoder.pyi b/typeshed/third_party/2/google/protobuf/internal/decoder.pyi
deleted file mode 100644
index b6b990f..0000000
--- a/typeshed/third_party/2/google/protobuf/internal/decoder.pyi
+++ /dev/null
@@ -1,34 +0,0 @@
-# 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
deleted file mode 100644
index b04534d..0000000
--- a/typeshed/third_party/2/google/protobuf/internal/encoder.pyi
+++ /dev/null
@@ -1,38 +0,0 @@
-# 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
deleted file mode 100644
index ced66b8..0000000
--- a/typeshed/third_party/2/google/protobuf/internal/enum_type_wrapper.pyi
+++ /dev/null
@@ -1,11 +0,0 @@
-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
deleted file mode 100644
index e9fbef3..0000000
--- a/typeshed/third_party/2/google/protobuf/internal/wire_format.pyi
+++ /dev/null
@@ -1,54 +0,0 @@
-# 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
deleted file mode 100644
index 9b14a7d..0000000
--- a/typeshed/third_party/2/google/protobuf/message.pyi
+++ /dev/null
@@ -1,36 +0,0 @@
-# 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/reflection.pyi b/typeshed/third_party/2/google/protobuf/reflection.pyi
deleted file mode 100644
index 3d3e76b..0000000
--- a/typeshed/third_party/2/google/protobuf/reflection.pyi
+++ /dev/null
@@ -1,10 +0,0 @@
-# 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/itsdangerous.pyi b/typeshed/third_party/2/itsdangerous.pyi
deleted file mode 100644
index 186d531..0000000
--- a/typeshed/third_party/2/itsdangerous.pyi
+++ /dev/null
@@ -1,153 +0,0 @@
-# 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, **kwargs) -> Any: ...
- 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
deleted file mode 100644
index 70b8648..0000000
--- a/typeshed/third_party/2/kazoo/__init__.pyi
+++ /dev/null
@@ -1,4 +0,0 @@
-# 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
deleted file mode 100644
index b174940..0000000
--- a/typeshed/third_party/2/kazoo/client.pyi
+++ /dev/null
@@ -1,100 +0,0 @@
-# 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
deleted file mode 100644
index 1450e81..0000000
--- a/typeshed/third_party/2/kazoo/exceptions.pyi
+++ /dev/null
@@ -1,62 +0,0 @@
-# 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
deleted file mode 100644
index 04a7fa2..0000000
--- a/typeshed/third_party/2/kazoo/recipe/__init__.pyi
+++ /dev/null
@@ -1,4 +0,0 @@
-# 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
deleted file mode 100644
index 554e6ee..0000000
--- a/typeshed/third_party/2/kazoo/recipe/watchers.pyi
+++ /dev/null
@@ -1,25 +0,0 @@
-# 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
deleted file mode 100644
index 2194fad..0000000
--- a/typeshed/third_party/2/pycurl.pyi
+++ /dev/null
@@ -1,81 +0,0 @@
-# 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: ...
-
-CAINFO = ... # type: int
-CONNECTTIMEOUT_MS = ... # type: int
-CUSTOMREQUEST = ... # type: int
-ENCODING = ... # type: int
-E_CALL_MULTI_PERFORM = ... # type: int
-E_OPERATION_TIMEOUTED = ... # type: int
-FOLLOWLOCATION = ... # type: int
-HEADERFUNCTION = ... # type: int
-HTTPGET = ... # type: int
-HTTPHEADER = ... # type: int
-HTTP_CODE = ... # type: int
-INFILESIE_LARGE = ... # type: int
-INFILESIZE_LARGE = ... # type: int
-NOBODY = ... # type: int
-NOPROGRESS = ... # type: int
-NOSIGNAL = ... # type: int
-POST = ... # type: int
-POSTFIELDS = ... # type: int
-POSTFIELDSIZE = ... # type: int
-PRIMARY_IP = ... # type: int
-PROGRESSFUNCTION = ... # type: int
-PROXY = ... # type: int
-READFUNCTION = ... # type: int
-RESPONSE_CODE = ... # type: int
-SSLCERT = ... # type: int
-SSLCERTPASSWD = ... # type: int
-SSLKEY = ... # type: int
-SSLKEYPASSWD = ... # type: int
-SSL_VERIFYHOST = ... # type: int
-SSL_VERIFYPEER = ... # type: int
-TIMEOUT_MS = ... # type: int
-UPLOAD = ... # type: int
-URL = ... # type: int
-WRITEFUNCTION = ... # type: int
diff --git a/typeshed/third_party/2/pymssql.pyi b/typeshed/third_party/2/pymssql.pyi
deleted file mode 100644
index 3f697ab..0000000
--- a/typeshed/third_party/2/pymssql.pyi
+++ /dev/null
@@ -1,48 +0,0 @@
-from datetime import datetime, date, time
-
-from typing import Any, 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
deleted file mode 100644
index f1bc24e..0000000
--- a/typeshed/third_party/2/redis/__init__.pyi
+++ /dev/null
@@ -1,28 +0,0 @@
-# Stubs for redis (Python 2)
-#
-# NOTE: This dynamically typed stub was automatically generated by stubgen.
-
-import redis.client
-import redis.connection
-import redis.utils
-import redis.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
deleted file mode 100644
index 6a55f80..0000000
--- a/typeshed/third_party/2/redis/client.pyi
+++ /dev/null
@@ -1,293 +0,0 @@
-# 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
deleted file mode 100644
index f17c062..0000000
--- a/typeshed/third_party/2/redis/connection.pyi
+++ /dev/null
@@ -1,135 +0,0 @@
-# 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
deleted file mode 100644
index 97a11f5..0000000
--- a/typeshed/third_party/2/redis/exceptions.pyi
+++ /dev/null
@@ -1,21 +0,0 @@
-# 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
deleted file mode 100644
index 9cabf0d..0000000
--- a/typeshed/third_party/2/redis/utils.pyi
+++ /dev/null
@@ -1,12 +0,0 @@
-# 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
deleted file mode 100644
index a42d186..0000000
--- a/typeshed/third_party/2/requests/__init__.pyi
+++ /dev/null
@@ -1,39 +0,0 @@
-# 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
deleted file mode 100644
index 00cc000..0000000
--- a/typeshed/third_party/2/requests/adapters.pyi
+++ /dev/null
@@ -1,72 +0,0 @@
-# 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
deleted file mode 100644
index 0f13779..0000000
--- a/typeshed/third_party/2/requests/api.pyi
+++ /dev/null
@@ -1,15 +0,0 @@
-# Stubs for requests.api (Python 3)
-
-from typing import Union
-
-from .models import Response
-
-def request(method: str, url: str, **kwargs) -> Response: ...
-def get(url: Union[str, unicode], **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
deleted file mode 100644
index 8eea2b0..0000000
--- a/typeshed/third_party/2/requests/auth.pyi
+++ /dev/null
@@ -1,41 +0,0 @@
-# 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
deleted file mode 100644
index 63b92f6..0000000
--- a/typeshed/third_party/2/requests/compat.pyi
+++ /dev/null
@@ -1,6 +0,0 @@
-# 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
deleted file mode 100644
index 6f56c82..0000000
--- a/typeshed/third_party/2/requests/cookies.pyi
+++ /dev/null
@@ -1,61 +0,0 @@
-# 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
deleted file mode 100644
index ff0c328..0000000
--- a/typeshed/third_party/2/requests/exceptions.pyi
+++ /dev/null
@@ -1,26 +0,0 @@
-# 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
deleted file mode 100644
index 3367d9a..0000000
--- a/typeshed/third_party/2/requests/hooks.pyi
+++ /dev/null
@@ -1,8 +0,0 @@
-# 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
deleted file mode 100644
index d400d4a..0000000
--- a/typeshed/third_party/2/requests/models.pyi
+++ /dev/null
@@ -1,133 +0,0 @@
-# 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
-
-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: Any
- url = ... # type: Any
- headers = ... # type: Any
- body = ... # type: Any
- 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
deleted file mode 100644
index 2b1bff8..0000000
--- a/typeshed/third_party/2/requests/packages/__init__.pyi
+++ /dev/null
@@ -1,8 +0,0 @@
-# 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
deleted file mode 100644
index 38cf672..0000000
--- a/typeshed/third_party/2/requests/packages/urllib3/__init__.pyi
+++ /dev/null
@@ -1,12 +0,0 @@
-# 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
deleted file mode 100644
index 58aa944..0000000
--- a/typeshed/third_party/2/requests/packages/urllib3/_collections.pyi
+++ /dev/null
@@ -1,51 +0,0 @@
-# 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
deleted file mode 100644
index 289fd18..0000000
--- a/typeshed/third_party/2/requests/packages/urllib3/connection.pyi
+++ /dev/null
@@ -1,51 +0,0 @@
-# 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
deleted file mode 100644
index 03c3140..0000000
--- a/typeshed/third_party/2/requests/packages/urllib3/connectionpool.pyi
+++ /dev/null
@@ -1,87 +0,0 @@
-# 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
deleted file mode 100644
index 17d26bb..0000000
--- a/typeshed/third_party/2/requests/packages/urllib3/contrib/__init__.pyi
+++ /dev/null
@@ -1,4 +0,0 @@
-# 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
deleted file mode 100644
index 3e7d0f6..0000000
--- a/typeshed/third_party/2/requests/packages/urllib3/exceptions.pyi
+++ /dev/null
@@ -1,54 +0,0 @@
-# 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
deleted file mode 100644
index cdc7734..0000000
--- a/typeshed/third_party/2/requests/packages/urllib3/fields.pyi
+++ /dev/null
@@ -1,16 +0,0 @@
-# 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
deleted file mode 100644
index c6fefa6..0000000
--- a/typeshed/third_party/2/requests/packages/urllib3/filepost.pyi
+++ /dev/null
@@ -1,19 +0,0 @@
-# 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
deleted file mode 100644
index 2314636..0000000
--- a/typeshed/third_party/2/requests/packages/urllib3/packages/__init__.pyi
+++ /dev/null
@@ -1,4 +0,0 @@
-# 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
deleted file mode 100644
index 05c03dc..0000000
--- a/typeshed/third_party/2/requests/packages/urllib3/packages/ssl_match_hostname/__init__.pyi
+++ /dev/null
@@ -1 +0,0 @@
-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
deleted file mode 100644
index 5abbc9d..0000000
--- a/typeshed/third_party/2/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.pyi
+++ /dev/null
@@ -1,7 +0,0 @@
-# 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
deleted file mode 100644
index a65f664..0000000
--- a/typeshed/third_party/2/requests/packages/urllib3/poolmanager.pyi
+++ /dev/null
@@ -1,31 +0,0 @@
-# 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
deleted file mode 100644
index 788c759..0000000
--- a/typeshed/third_party/2/requests/packages/urllib3/request.pyi
+++ /dev/null
@@ -1,13 +0,0 @@
-# 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
deleted file mode 100644
index c84f7e9..0000000
--- a/typeshed/third_party/2/requests/packages/urllib3/response.pyi
+++ /dev/null
@@ -1,58 +0,0 @@
-# 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
deleted file mode 100644
index eca2ea9..0000000
--- a/typeshed/third_party/2/requests/packages/urllib3/util/__init__.pyi
+++ /dev/null
@@ -1,7 +0,0 @@
-# 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
deleted file mode 100644
index cd67309..0000000
--- a/typeshed/third_party/2/requests/packages/urllib3/util/connection.pyi
+++ /dev/null
@@ -1,11 +0,0 @@
-# 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
deleted file mode 100644
index 20a6ea2..0000000
--- a/typeshed/third_party/2/requests/packages/urllib3/util/request.pyi
+++ /dev/null
@@ -1,12 +0,0 @@
-# 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
deleted file mode 100644
index 761a006..0000000
--- a/typeshed/third_party/2/requests/packages/urllib3/util/response.pyi
+++ /dev/null
@@ -1,5 +0,0 @@
-# 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
deleted file mode 100644
index e958d90..0000000
--- a/typeshed/third_party/2/requests/packages/urllib3/util/retry.pyi
+++ /dev/null
@@ -1,36 +0,0 @@
-# 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
deleted file mode 100644
index 0a7653c..0000000
--- a/typeshed/third_party/2/requests/packages/urllib3/util/timeout.pyi
+++ /dev/null
@@ -1,24 +0,0 @@
-# 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
deleted file mode 100644
index 9877b4a..0000000
--- a/typeshed/third_party/2/requests/packages/urllib3/util/url.pyi
+++ /dev/null
@@ -1,26 +0,0 @@
-# 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
deleted file mode 100644
index 9387f77..0000000
--- a/typeshed/third_party/2/requests/sessions.pyi
+++ /dev/null
@@ -1,106 +0,0 @@
-# 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
deleted file mode 100644
index e3035eb..0000000
--- a/typeshed/third_party/2/requests/status_codes.pyi
+++ /dev/null
@@ -1,8 +0,0 @@
-# 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
deleted file mode 100644
index 837cf25..0000000
--- a/typeshed/third_party/2/requests/structures.pyi
+++ /dev/null
@@ -1,21 +0,0 @@
-# Stubs for requests.structures (Python 3)
-
-from typing import Any
-import collections
-
-class CaseInsensitiveDict(collections.MutableMapping):
- def __init__(self, data=..., **kwargs) -> None: ...
- def __setitem__(self, key, value): ...
- def __getitem__(self, key): ...
- def __delitem__(self, key): ...
- def __iter__(self): ...
- def __len__(self): ...
- def lower_items(self): ...
- def __eq__(self, other): ...
- def copy(self): ...
-
-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
deleted file mode 100644
index 945277a..0000000
--- a/typeshed/third_party/2/requests/utils.pyi
+++ /dev/null
@@ -1,52 +0,0 @@
-# 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
deleted file mode 100644
index a82bf13..0000000
--- a/typeshed/third_party/2/routes/__init__.pyi
+++ /dev/null
@@ -1,19 +0,0 @@
-# Stubs for routes (Python 2)
-#
-# NOTE: This dynamically typed stub was automatically generated by stubgen.
-
-import routes.mapper
-import routes.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
deleted file mode 100644
index 5e99364..0000000
--- a/typeshed/third_party/2/routes/mapper.pyi
+++ /dev/null
@@ -1,70 +0,0 @@
-# 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
deleted file mode 100644
index 87af6f3..0000000
--- a/typeshed/third_party/2/routes/util.pyi
+++ /dev/null
@@ -1,24 +0,0 @@
-# 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/typeshed/third_party/2/scribe/__init__.pyi b/typeshed/third_party/2/scribe/__init__.pyi
deleted file mode 100644
index e69de29..0000000
diff --git a/typeshed/third_party/2/scribe/scribe.pyi b/typeshed/third_party/2/scribe/scribe.pyi
deleted file mode 100644
index 0988889..0000000
--- a/typeshed/third_party/2/scribe/scribe.pyi
+++ /dev/null
@@ -1,43 +0,0 @@
-# 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 *
-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
deleted file mode 100644
index 3629e99..0000000
--- a/typeshed/third_party/2/scribe/ttypes.pyi
+++ /dev/null
@@ -1,22 +0,0 @@
-# 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
deleted file mode 100644
index 6706cf6..0000000
--- a/typeshed/third_party/2/selenium/webdriver/remote/webdriver.pyi
+++ /dev/null
@@ -1,111 +0,0 @@
-# Stubs for selenium.webdriver.remote.webdriver (Python 2)
-#
-# NOTE: This dynamically typed stub was automatically generated by stubgen.
-
-from typing import Any, Dict, List
-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
deleted file mode 100644
index 05dfae0..0000000
--- a/typeshed/third_party/2/selenium/webdriver/remote/webelement.pyi
+++ /dev/null
@@ -1,65 +0,0 @@
-# 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/six/__init__.pyi b/typeshed/third_party/2/six/__init__.pyi
deleted file mode 100644
index aadf056..0000000
--- a/typeshed/third_party/2/six/__init__.pyi
+++ /dev/null
@@ -1,89 +0,0 @@
-# Stubs for six (Python 2.7)
-
-from __future__ import print_function
-
-from typing import (
- Any, AnyStr, Callable, Iterable, Mapping, Optional,
- Pattern, Tuple, TypeVar, Union, overload, ValuesView, KeysView, ItemsView
-)
-import typing
-
-import unittest
-import types
-
-_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: ...
-from __builtin__ import unichr as unichr
-int2byte = chr
-def byte2int(bs: binary_type) -> int: ...
-def indexbytes(buf: binary_type, i: int) -> int: ...
-def iterbytes(buf: binary_type) -> typing.Iterator[int]: ...
-from StringIO import StringIO as StringIO, StringIO as BytesIO
-
-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: type, value: Optional[BaseException], tb: Optional[types.TracebackType] = ...) -> None: ...
-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
-
-from functools import wraps as wraps
-
-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
deleted file mode 100644
index 072b4d6..0000000
--- a/typeshed/third_party/2/six/moves/__init__.pyi
+++ /dev/null
@@ -1,32 +0,0 @@
-# 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
deleted file mode 100644
index a3c3414..0000000
--- a/typeshed/third_party/2/six/moves/cPickle.pyi
+++ /dev/null
@@ -1,6 +0,0 @@
-# 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 *
diff --git a/typeshed/third_party/2/six/moves/urllib/__init__.pyi b/typeshed/third_party/2/six/moves/urllib/__init__.pyi
deleted file mode 100644
index 71523cd..0000000
--- a/typeshed/third_party/2/six/moves/urllib/__init__.pyi
+++ /dev/null
@@ -1,10 +0,0 @@
-# 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
deleted file mode 100644
index 05eda84..0000000
--- a/typeshed/third_party/2/six/moves/urllib/error.pyi
+++ /dev/null
@@ -1,8 +0,0 @@
-# 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
deleted file mode 100644
index 25351fb..0000000
--- a/typeshed/third_party/2/six/moves/urllib/parse.pyi
+++ /dev/null
@@ -1,30 +0,0 @@
-# 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
deleted file mode 100644
index 109cda8..0000000
--- a/typeshed/third_party/2/six/moves/urllib/request.pyi
+++ /dev/null
@@ -1,38 +0,0 @@
-# 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
deleted file mode 100644
index d778514..0000000
--- a/typeshed/third_party/2/six/moves/urllib/response.pyi
+++ /dev/null
@@ -1,9 +0,0 @@
-# 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
deleted file mode 100644
index 3b33758..0000000
--- a/typeshed/third_party/2/six/moves/urllib/robotparser.pyi
+++ /dev/null
@@ -1,6 +0,0 @@
-# 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
deleted file mode 100644
index 4872659..0000000
--- a/typeshed/third_party/2/six/moves/urllib_error.pyi
+++ /dev/null
@@ -1,10 +0,0 @@
-# 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
deleted file mode 100644
index 2416b96..0000000
--- a/typeshed/third_party/2/six/moves/urllib_parse.pyi
+++ /dev/null
@@ -1,28 +0,0 @@
-# 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
deleted file mode 100644
index 832055a..0000000
--- a/typeshed/third_party/2/six/moves/urllib_request.pyi
+++ /dev/null
@@ -1,40 +0,0 @@
-# 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
deleted file mode 100644
index ca00492..0000000
--- a/typeshed/third_party/2/six/moves/urllib_response.pyi
+++ /dev/null
@@ -1,11 +0,0 @@
-# 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
deleted file mode 100644
index d990bb5..0000000
--- a/typeshed/third_party/2/six/moves/urllib_robotparser.pyi
+++ /dev/null
@@ -1,8 +0,0 @@
-# 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
deleted file mode 100644
index 717082c..0000000
--- a/typeshed/third_party/2/sqlalchemy/__init__.pyi
+++ /dev/null
@@ -1,124 +0,0 @@
-# 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
deleted file mode 100644
index b1ac4a4..0000000
--- a/typeshed/third_party/2/sqlalchemy/databases/__init__.pyi
+++ /dev/null
@@ -1,12 +0,0 @@
-# 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
deleted file mode 100644
index c218c50..0000000
--- a/typeshed/third_party/2/sqlalchemy/databases/mysql.pyi
+++ /dev/null
@@ -1 +0,0 @@
-from sqlalchemy.dialects.mysql.base import *
diff --git a/typeshed/third_party/2/sqlalchemy/dialects/__init__.pyi b/typeshed/third_party/2/sqlalchemy/dialects/__init__.pyi
deleted file mode 100644
index 2d261de..0000000
--- a/typeshed/third_party/2/sqlalchemy/dialects/__init__.pyi
+++ /dev/null
@@ -1,12 +0,0 @@
-# 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
deleted file mode 100644
index 846c3b4..0000000
--- a/typeshed/third_party/2/sqlalchemy/dialects/mysql/__init__.pyi
+++ /dev/null
@@ -1,40 +0,0 @@
-# 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
deleted file mode 100644
index ac967d8..0000000
--- a/typeshed/third_party/2/sqlalchemy/dialects/mysql/base.pyi
+++ /dev/null
@@ -1,413 +0,0 @@
-# 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
deleted file mode 100644
index 49eca6d..0000000
--- a/typeshed/third_party/2/sqlalchemy/engine/__init__.pyi
+++ /dev/null
@@ -1,11 +0,0 @@
-# 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
deleted file mode 100644
index 71f6e19..0000000
--- a/typeshed/third_party/2/sqlalchemy/engine/base.pyi
+++ /dev/null
@@ -1,21 +0,0 @@
-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
deleted file mode 100644
index 372643c..0000000
--- a/typeshed/third_party/2/sqlalchemy/engine/strategies.pyi
+++ /dev/null
@@ -1,39 +0,0 @@
-# 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
deleted file mode 100644
index b422ec9..0000000
--- a/typeshed/third_party/2/sqlalchemy/engine/url.pyi
+++ /dev/null
@@ -1,27 +0,0 @@
-# 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
deleted file mode 100644
index 310770d..0000000
--- a/typeshed/third_party/2/sqlalchemy/exc.pyi
+++ /dev/null
@@ -1,77 +0,0 @@
-# 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
deleted file mode 100644
index 2d550cd..0000000
--- a/typeshed/third_party/2/sqlalchemy/inspection.pyi
+++ /dev/null
@@ -1,5 +0,0 @@
-# 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
deleted file mode 100644
index 8a5b3bf..0000000
--- a/typeshed/third_party/2/sqlalchemy/log.pyi
+++ /dev/null
@@ -1,14 +0,0 @@
-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
deleted file mode 100644
index bc1fe4b..0000000
--- a/typeshed/third_party/2/sqlalchemy/orm/__init__.pyi
+++ /dev/null
@@ -1,95 +0,0 @@
-# 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
deleted file mode 100644
index dcdf8b0..0000000
--- a/typeshed/third_party/2/sqlalchemy/orm/session.pyi
+++ /dev/null
@@ -1,93 +0,0 @@
-# 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
deleted file mode 100644
index 7161dc5..0000000
--- a/typeshed/third_party/2/sqlalchemy/pool.pyi
+++ /dev/null
@@ -1,118 +0,0 @@
-# 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
deleted file mode 100644
index f788897..0000000
--- a/typeshed/third_party/2/sqlalchemy/schema.pyi
+++ /dev/null
@@ -1,50 +0,0 @@
-# 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
deleted file mode 100644
index 91d06d8..0000000
--- a/typeshed/third_party/2/sqlalchemy/sql/__init__.pyi
+++ /dev/null
@@ -1,66 +0,0 @@
-# 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
deleted file mode 100644
index ba0aba4..0000000
--- a/typeshed/third_party/2/sqlalchemy/sql/annotation.pyi
+++ /dev/null
@@ -1,11 +0,0 @@
-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
deleted file mode 100644
index 48e68c7..0000000
--- a/typeshed/third_party/2/sqlalchemy/sql/base.pyi
+++ /dev/null
@@ -1,42 +0,0 @@
-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
deleted file mode 100644
index 06ac96a..0000000
--- a/typeshed/third_party/2/sqlalchemy/sql/ddl.pyi
+++ /dev/null
@@ -1,25 +0,0 @@
-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
deleted file mode 100644
index 79cb201..0000000
--- a/typeshed/third_party/2/sqlalchemy/sql/dml.pyi
+++ /dev/null
@@ -1,20 +0,0 @@
-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
deleted file mode 100644
index e2a8d38..0000000
--- a/typeshed/third_party/2/sqlalchemy/sql/elements.pyi
+++ /dev/null
@@ -1,60 +0,0 @@
-
-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
deleted file mode 100644
index fd24299..0000000
--- a/typeshed/third_party/2/sqlalchemy/sql/expression.pyi
+++ /dev/null
@@ -1,87 +0,0 @@
-# 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
-
-func = functions.func # type: functions._FunctionGenerator
-modifier = functions.modifier # type: functions._FunctionGenerator
-
-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
-
-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
deleted file mode 100644
index 4be9907..0000000
--- a/typeshed/third_party/2/sqlalchemy/sql/functions.pyi
+++ /dev/null
@@ -1,47 +0,0 @@
-
-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
deleted file mode 100644
index d9172c4..0000000
--- a/typeshed/third_party/2/sqlalchemy/sql/naming.pyi
+++ /dev/null
@@ -1 +0,0 @@
-class ConventionDict(object): ...
diff --git a/typeshed/third_party/2/sqlalchemy/sql/operators.pyi b/typeshed/third_party/2/sqlalchemy/sql/operators.pyi
deleted file mode 100644
index 5ae39cd..0000000
--- a/typeshed/third_party/2/sqlalchemy/sql/operators.pyi
+++ /dev/null
@@ -1,99 +0,0 @@
-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
deleted file mode 100644
index 4e03ff2..0000000
--- a/typeshed/third_party/2/sqlalchemy/sql/schema.pyi
+++ /dev/null
@@ -1,126 +0,0 @@
-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
deleted file mode 100644
index a3b1925..0000000
--- a/typeshed/third_party/2/sqlalchemy/sql/selectable.pyi
+++ /dev/null
@@ -1,74 +0,0 @@
-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
deleted file mode 100644
index 9c9806a..0000000
--- a/typeshed/third_party/2/sqlalchemy/sql/sqltypes.pyi
+++ /dev/null
@@ -1,62 +0,0 @@
-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): ...
- def literal_processor(self, dialect): ...
- def bind_processor(self, dialect): ...
- def result_processor(self, dialect, coltype): ...
- @property
- def python_type(self): ...
- def get_dbapi_type(self, dbapi): ...
-
-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): ...
-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
deleted file mode 100644
index ccc0870..0000000
--- a/typeshed/third_party/2/sqlalchemy/sql/type_api.pyi
+++ /dev/null
@@ -1,9 +0,0 @@
-from .. import util
-from .visitors import Visitable, VisitableType
-
-class TypeEngine(Visitable): ...
-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
deleted file mode 100644
index 3b549b4..0000000
--- a/typeshed/third_party/2/sqlalchemy/sql/visitors.pyi
+++ /dev/null
@@ -1,33 +0,0 @@
-# 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
deleted file mode 100644
index 7aa160c..0000000
--- a/typeshed/third_party/2/sqlalchemy/types.pyi
+++ /dev/null
@@ -1,51 +0,0 @@
-# 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
deleted file mode 100644
index a42c2ce..0000000
--- a/typeshed/third_party/2/sqlalchemy/util/__init__.pyi
+++ /dev/null
@@ -1,133 +0,0 @@
-# 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
deleted file mode 100644
index a25c7e9..0000000
--- a/typeshed/third_party/2/sqlalchemy/util/_collections.pyi
+++ /dev/null
@@ -1,214 +0,0 @@
-# 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
deleted file mode 100644
index ee10636..0000000
--- a/typeshed/third_party/2/sqlalchemy/util/compat.pyi
+++ /dev/null
@@ -1,67 +0,0 @@
-# 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
deleted file mode 100644
index 49940cf..0000000
--- a/typeshed/third_party/2/sqlalchemy/util/deprecations.pyi
+++ /dev/null
@@ -1,13 +0,0 @@
-# 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
deleted file mode 100644
index c688ba3..0000000
--- a/typeshed/third_party/2/sqlalchemy/util/langhelpers.pyi
+++ /dev/null
@@ -1,134 +0,0 @@
-# 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
deleted file mode 100644
index 78a61d6..0000000
--- a/typeshed/third_party/2/thrift/Thrift.pyi
+++ /dev/null
@@ -1,55 +0,0 @@
-# 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/typeshed/third_party/2/thrift/__init__.pyi b/typeshed/third_party/2/thrift/__init__.pyi
deleted file mode 100644
index e69de29..0000000
diff --git a/typeshed/third_party/2/thrift/protocol/TBinaryProtocol.pyi b/typeshed/third_party/2/thrift/protocol/TBinaryProtocol.pyi
deleted file mode 100644
index 1815457..0000000
--- a/typeshed/third_party/2/thrift/protocol/TBinaryProtocol.pyi
+++ /dev/null
@@ -1,65 +0,0 @@
-# Stubs for thrift.protocol.TBinaryProtocol (Python 2)
-#
-# NOTE: This dynamically typed stub was automatically generated by stubgen.
-
-from typing import Any
-
-from .TProtocol import *
-
-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
deleted file mode 100644
index 8ec1029..0000000
--- a/typeshed/third_party/2/thrift/protocol/TProtocol.pyi
+++ /dev/null
@@ -1,79 +0,0 @@
-# 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 *
-
-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
deleted file mode 100644
index f98118b..0000000
--- a/typeshed/third_party/2/thrift/protocol/__init__.pyi
+++ /dev/null
@@ -1,11 +0,0 @@
-# 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
deleted file mode 100644
index b26c04e..0000000
--- a/typeshed/third_party/2/thrift/transport/TSocket.pyi
+++ /dev/null
@@ -1,32 +0,0 @@
-# Stubs for thrift.transport.TSocket (Python 2)
-#
-# NOTE: This dynamically typed stub was automatically generated by stubgen.
-
-from typing import Any
-
-from .TTransport import *
-
-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
deleted file mode 100644
index c2ffa9f..0000000
--- a/typeshed/third_party/2/thrift/transport/TTransport.pyi
+++ /dev/null
@@ -1,111 +0,0 @@
-# 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
deleted file mode 100644
index ce02c61..0000000
--- a/typeshed/third_party/2/thrift/transport/__init__.pyi
+++ /dev/null
@@ -1,9 +0,0 @@
-# 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/typeshed/third_party/2/tornado/__init__.pyi b/typeshed/third_party/2/tornado/__init__.pyi
deleted file mode 100644
index e69de29..0000000
diff --git a/typeshed/third_party/2/tornado/concurrent.pyi b/typeshed/third_party/2/tornado/concurrent.pyi
deleted file mode 100644
index f807f06..0000000
--- a/typeshed/third_party/2/tornado/concurrent.pyi
+++ /dev/null
@@ -1,47 +0,0 @@
-# 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
deleted file mode 100644
index 1e16521..0000000
--- a/typeshed/third_party/2/tornado/gen.pyi
+++ /dev/null
@@ -1,113 +0,0 @@
-# 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
deleted file mode 100644
index e24b528..0000000
--- a/typeshed/third_party/2/tornado/httpclient.pyi
+++ /dev/null
@@ -1,112 +0,0 @@
-# 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
deleted file mode 100644
index eb20bf3..0000000
--- a/typeshed/third_party/2/tornado/httpserver.pyi
+++ /dev/null
@@ -1,45 +0,0 @@
-# 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
deleted file mode 100644
index 5d89414..0000000
--- a/typeshed/third_party/2/tornado/httputil.pyi
+++ /dev/null
@@ -1,93 +0,0 @@
-# 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
deleted file mode 100644
index 667d98f..0000000
--- a/typeshed/third_party/2/tornado/ioloop.pyi
+++ /dev/null
@@ -1,88 +0,0 @@
-# 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
deleted file mode 100644
index 3ad107c..0000000
--- a/typeshed/third_party/2/tornado/locks.pyi
+++ /dev/null
@@ -1,50 +0,0 @@
-# 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
deleted file mode 100644
index 135450e..0000000
--- a/typeshed/third_party/2/tornado/netutil.pyi
+++ /dev/null
@@ -1,49 +0,0 @@
-# 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
deleted file mode 100644
index 3c032e1..0000000
--- a/typeshed/third_party/2/tornado/tcpserver.pyi
+++ /dev/null
@@ -1,21 +0,0 @@
-# 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
deleted file mode 100644
index f32ca85..0000000
--- a/typeshed/third_party/2/tornado/testing.pyi
+++ /dev/null
@@ -1,64 +0,0 @@
-# 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
deleted file mode 100644
index fdc48c9..0000000
--- a/typeshed/third_party/2/tornado/util.pyi
+++ /dev/null
@@ -1,50 +0,0 @@
-# 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
deleted file mode 100644
index ab61ff4..0000000
--- a/typeshed/third_party/2/tornado/web.pyi
+++ /dev/null
@@ -1,261 +0,0 @@
-# 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/yaml/__init__.pyi b/typeshed/third_party/2/yaml/__init__.pyi
deleted file mode 100644
index 9d0e915..0000000
--- a/typeshed/third_party/2/yaml/__init__.pyi
+++ /dev/null
@@ -1,51 +0,0 @@
-# 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
deleted file mode 100644
index a6f21b4..0000000
--- a/typeshed/third_party/2/yaml/composer.pyi
+++ /dev/null
@@ -1,21 +0,0 @@
-# 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
deleted file mode 100644
index cb043a5..0000000
--- a/typeshed/third_party/2/yaml/constructor.pyi
+++ /dev/null
@@ -1,70 +0,0 @@
-# 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
deleted file mode 100644
index 85b75fb..0000000
--- a/typeshed/third_party/2/yaml/dumper.pyi
+++ /dev/null
@@ -1,17 +0,0 @@
-# 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
deleted file mode 100644
index 37cb581..0000000
--- a/typeshed/third_party/2/yaml/emitter.pyi
+++ /dev/null
@@ -1,110 +0,0 @@
-# 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
deleted file mode 100644
index 0e1f625..0000000
--- a/typeshed/third_party/2/yaml/error.pyi
+++ /dev/null
@@ -1,25 +0,0 @@
-# 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
deleted file mode 100644
index d00d55c..0000000
--- a/typeshed/third_party/2/yaml/events.pyi
+++ /dev/null
@@ -1,66 +0,0 @@
-# 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
deleted file mode 100644
index 6d3b4c1..0000000
--- a/typeshed/third_party/2/yaml/loader.pyi
+++ /dev/null
@@ -1,19 +0,0 @@
-# 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
deleted file mode 100644
index 2deb1bd..0000000
--- a/typeshed/third_party/2/yaml/nodes.pyi
+++ /dev/null
@@ -1,35 +0,0 @@
-# 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
deleted file mode 100644
index a14486b..0000000
--- a/typeshed/third_party/2/yaml/parser.pyi
+++ /dev/null
@@ -1,48 +0,0 @@
-# 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
deleted file mode 100644
index c3e84d6..0000000
--- a/typeshed/third_party/2/yaml/reader.pyi
+++ /dev/null
@@ -1,38 +0,0 @@
-# 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
deleted file mode 100644
index eaa0133..0000000
--- a/typeshed/third_party/2/yaml/representer.pyi
+++ /dev/null
@@ -1,56 +0,0 @@
-# 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
deleted file mode 100644
index 70a33b2..0000000
--- a/typeshed/third_party/2/yaml/resolver.pyi
+++ /dev/null
@@ -1,26 +0,0 @@
-# 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
deleted file mode 100644
index 226ec83..0000000
--- a/typeshed/third_party/2/yaml/scanner.pyi
+++ /dev/null
@@ -1,100 +0,0 @@
-# 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
deleted file mode 100644
index b40c64c..0000000
--- a/typeshed/third_party/2/yaml/serializer.pyi
+++ /dev/null
@@ -1,27 +0,0 @@
-# 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
deleted file mode 100644
index 19f70a1..0000000
--- a/typeshed/third_party/2/yaml/tokens.pyi
+++ /dev/null
@@ -1,97 +0,0 @@
-# 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/backports/__init__.pyi b/typeshed/third_party/2and3/backports/__init__.pyi
deleted file mode 100644
index e69de29..0000000
diff --git a/typeshed/third_party/2and3/backports/ssl_match_hostname.pyi b/typeshed/third_party/2and3/backports/ssl_match_hostname.pyi
deleted file mode 100644
index c219980..0000000
--- a/typeshed/third_party/2and3/backports/ssl_match_hostname.pyi
+++ /dev/null
@@ -1,3 +0,0 @@
-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
deleted file mode 100644
index a82293f..0000000
--- a/typeshed/third_party/2and3/backports_abc.pyi
+++ /dev/null
@@ -1,19 +0,0 @@
-# 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/certifi.pyi b/typeshed/third_party/2and3/certifi.pyi
deleted file mode 100644
index c809e6d..0000000
--- a/typeshed/third_party/2and3/certifi.pyi
+++ /dev/null
@@ -1,2 +0,0 @@
-def where() -> str: ...
-def old_where() -> str: ...
diff --git a/typeshed/third_party/2and3/mypy_extensions.pyi b/typeshed/third_party/2and3/mypy_extensions.pyi
deleted file mode 100644
index 6c57954..0000000
--- a/typeshed/third_party/2and3/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]: ...
diff --git a/typeshed/third_party/2and3/pytz/__init__.pyi b/typeshed/third_party/2and3/pytz/__init__.pyi
deleted file mode 100644
index dc9c8fc..0000000
--- a/typeshed/third_party/2and3/pytz/__init__.pyi
+++ /dev/null
@@ -1,25 +0,0 @@
-# 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 UTC(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: UTC
-
-def timezone(zone: str) -> UTC: ...
diff --git a/typeshed/third_party/2and3/pytz/lazy.pyi b/typeshed/third_party/2and3/pytz/lazy.pyi
deleted file mode 100644
index 3618333..0000000
--- a/typeshed/third_party/2and3/pytz/lazy.pyi
+++ /dev/null
@@ -1,13 +0,0 @@
-# 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
deleted file mode 100644
index dac3cea..0000000
--- a/typeshed/third_party/2and3/singledispatch.pyi
+++ /dev/null
@@ -1,5 +0,0 @@
-# Stubs for singledispatch (Python 3.5)
-#
-# NOTE: This dynamically typed stub was automatically generated by stubgen.
-
-def singledispatch(func): ...
diff --git a/typeshed/third_party/2and3/ujson.pyi b/typeshed/third_party/2and3/ujson.pyi
deleted file mode 100644
index 37697af..0000000
--- a/typeshed/third_party/2and3/ujson.pyi
+++ /dev/null
@@ -1,45 +0,0 @@
-# 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/dateutil/__init__.pyi b/typeshed/third_party/3/dateutil/__init__.pyi
deleted file mode 100644
index e69de29..0000000
diff --git a/typeshed/third_party/3/dateutil/parser.pyi b/typeshed/third_party/3/dateutil/parser.pyi
deleted file mode 100644
index 34c314e..0000000
--- a/typeshed/third_party/3/dateutil/parser.pyi
+++ /dev/null
@@ -1,52 +0,0 @@
-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 =...,
- ) -> 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
deleted file mode 100644
index b37ef5d..0000000
--- a/typeshed/third_party/3/dateutil/relativedelta.pyi
+++ /dev/null
@@ -1,86 +0,0 @@
-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/3/docutils/__init__.pyi b/typeshed/third_party/3/docutils/__init__.pyi
deleted file mode 100644
index eb1ae45..0000000
--- a/typeshed/third_party/3/docutils/__init__.pyi
+++ /dev/null
@@ -1 +0,0 @@
-...
diff --git a/typeshed/third_party/3/docutils/examples.pyi b/typeshed/third_party/3/docutils/examples.pyi
deleted file mode 100644
index 0abfc7b..0000000
--- a/typeshed/third_party/3/docutils/examples.pyi
+++ /dev/null
@@ -1,3 +0,0 @@
-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
deleted file mode 100644
index f747fb1..0000000
--- a/typeshed/third_party/3/docutils/nodes.pyi
+++ /dev/null
@@ -1,8 +0,0 @@
-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
deleted file mode 100644
index eb1ae45..0000000
--- a/typeshed/third_party/3/docutils/parsers/__init__.pyi
+++ /dev/null
@@ -1 +0,0 @@
-...
diff --git a/typeshed/third_party/3/docutils/parsers/rst/__init__.pyi b/typeshed/third_party/3/docutils/parsers/rst/__init__.pyi
deleted file mode 100644
index e69de29..0000000
diff --git a/typeshed/third_party/3/docutils/parsers/rst/nodes.pyi b/typeshed/third_party/3/docutils/parsers/rst/nodes.pyi
deleted file mode 100644
index eb1ae45..0000000
--- a/typeshed/third_party/3/docutils/parsers/rst/nodes.pyi
+++ /dev/null
@@ -1 +0,0 @@
-...
diff --git a/typeshed/third_party/3/docutils/parsers/rst/roles.pyi b/typeshed/third_party/3/docutils/parsers/rst/roles.pyi
deleted file mode 100644
index 7307e58..0000000
--- a/typeshed/third_party/3/docutils/parsers/rst/roles.pyi
+++ /dev/null
@@ -1,10 +0,0 @@
-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
deleted file mode 100644
index e39d2bc..0000000
--- a/typeshed/third_party/3/docutils/parsers/rst/states.pyi
+++ /dev/null
@@ -1,5 +0,0 @@
-import typing
-
-class Inliner:
- def __init__(self) -> None:
- ...
diff --git a/typeshed/third_party/3/enum.pyi b/typeshed/third_party/3/enum.pyi
deleted file mode 100644
index ac04a4a..0000000
--- a/typeshed/third_party/3/enum.pyi
+++ /dev/null
@@ -1,20 +0,0 @@
-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):
- value = ... # type: int
-
-_T = TypeVar('_T')
-
-def unique(enumeration: _T) -> _T: ...
diff --git a/typeshed/third_party/3/itsdangerous.pyi b/typeshed/third_party/3/itsdangerous.pyi
deleted file mode 100644
index 067fbdd..0000000
--- a/typeshed/third_party/3/itsdangerous.pyi
+++ /dev/null
@@ -1,156 +0,0 @@
-# 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, **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/typeshed/third_party/3/lxml/__init__.pyi b/typeshed/third_party/3/lxml/__init__.pyi
deleted file mode 100644
index e69de29..0000000
diff --git a/typeshed/third_party/3/lxml/etree.pyi b/typeshed/third_party/3/lxml/etree.pyi
deleted file mode 100644
index bf7b150..0000000
--- a/typeshed/third_party/3/lxml/etree.pyi
+++ /dev/null
@@ -1,169 +0,0 @@
-# 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
deleted file mode 100644
index 74293c4..0000000
--- a/typeshed/third_party/3/lxml/objectify.pyi
+++ /dev/null
@@ -1,13 +0,0 @@
-# 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
deleted file mode 100644
index 58ef738..0000000
--- a/typeshed/third_party/3/pkg_resources.pyi
+++ /dev/null
@@ -1,310 +0,0 @@
-# Stubs for pkg_resources (Python 3.4)
-
-from typing import (
- Any, Callable, Dict, IO, Iterable, Generator, Optional, Sequence, Tuple,
- 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) -> str: ...
-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) -> str: ...
- 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
deleted file mode 100644
index a89d4a0..0000000
--- a/typeshed/third_party/3/requests/__init__.pyi
+++ /dev/null
@@ -1,39 +0,0 @@
-# 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
deleted file mode 100644
index d896f1a..0000000
--- a/typeshed/third_party/3/requests/adapters.pyi
+++ /dev/null
@@ -1,72 +0,0 @@
-# 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
deleted file mode 100644
index 7b04128..0000000
--- a/typeshed/third_party/3/requests/api.pyi
+++ /dev/null
@@ -1,14 +0,0 @@
-# Stubs for requests.api (Python 3)
-
-import typing
-
-from .models import Response
-
-def request(method: str, url: str, **kwargs) -> Response: ...
-def get(url: str, **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
deleted file mode 100644
index 8eea2b0..0000000
--- a/typeshed/third_party/3/requests/auth.pyi
+++ /dev/null
@@ -1,41 +0,0 @@
-# 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
deleted file mode 100644
index 63b92f6..0000000
--- a/typeshed/third_party/3/requests/compat.pyi
+++ /dev/null
@@ -1,6 +0,0 @@
-# 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
deleted file mode 100644
index 7b147d0..0000000
--- a/typeshed/third_party/3/requests/cookies.pyi
+++ /dev/null
@@ -1,65 +0,0 @@
-# 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
deleted file mode 100644
index ff0c328..0000000
--- a/typeshed/third_party/3/requests/exceptions.pyi
+++ /dev/null
@@ -1,26 +0,0 @@
-# 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
deleted file mode 100644
index 3367d9a..0000000
--- a/typeshed/third_party/3/requests/hooks.pyi
+++ /dev/null
@@ -1,8 +0,0 @@
-# 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
deleted file mode 100644
index 025ebc8..0000000
--- a/typeshed/third_party/3/requests/models.pyi
+++ /dev/null
@@ -1,134 +0,0 @@
-# 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
-
-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: Any
- url = ... # type: Any
- headers = ... # type: Any
- body = ... # type: Any
- 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
deleted file mode 100644
index 2b1bff8..0000000
--- a/typeshed/third_party/3/requests/packages/__init__.pyi
+++ /dev/null
@@ -1,8 +0,0 @@
-# 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
deleted file mode 100644
index 61a1c5f..0000000
--- a/typeshed/third_party/3/requests/packages/urllib3/__init__.pyi
+++ /dev/null
@@ -1,35 +0,0 @@
-# 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
deleted file mode 100644
index 58aa944..0000000
--- a/typeshed/third_party/3/requests/packages/urllib3/_collections.pyi
+++ /dev/null
@@ -1,51 +0,0 @@
-# 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
deleted file mode 100644
index 577bc85..0000000
--- a/typeshed/third_party/3/requests/packages/urllib3/connection.pyi
+++ /dev/null
@@ -1,64 +0,0 @@
-# Stubs for requests.packages.urllib3.connection (Python 3.4)
-
-from typing import Any
-from . import packages
-from http.client import HTTPConnection as _HTTPConnection
-# 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: ...
-
-import ssl
-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
deleted file mode 100644
index 778bb7c..0000000
--- a/typeshed/third_party/3/requests/packages/urllib3/connectionpool.pyi
+++ /dev/null
@@ -1,89 +0,0 @@
-# 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
deleted file mode 100644
index 17d26bb..0000000
--- a/typeshed/third_party/3/requests/packages/urllib3/contrib/__init__.pyi
+++ /dev/null
@@ -1,4 +0,0 @@
-# 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
deleted file mode 100644
index 3e7d0f6..0000000
--- a/typeshed/third_party/3/requests/packages/urllib3/exceptions.pyi
+++ /dev/null
@@ -1,54 +0,0 @@
-# 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
deleted file mode 100644
index cdc7734..0000000
--- a/typeshed/third_party/3/requests/packages/urllib3/fields.pyi
+++ /dev/null
@@ -1,16 +0,0 @@
-# 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
deleted file mode 100644
index c6fefa6..0000000
--- a/typeshed/third_party/3/requests/packages/urllib3/filepost.pyi
+++ /dev/null
@@ -1,19 +0,0 @@
-# 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
deleted file mode 100644
index 2314636..0000000
--- a/typeshed/third_party/3/requests/packages/urllib3/packages/__init__.pyi
+++ /dev/null
@@ -1,4 +0,0 @@
-# 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
deleted file mode 100644
index 9efeac0..0000000
--- a/typeshed/third_party/3/requests/packages/urllib3/packages/ssl_match_hostname/__init__.pyi
+++ /dev/null
@@ -1,8 +0,0 @@
-# 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
deleted file mode 100644
index 5abbc9d..0000000
--- a/typeshed/third_party/3/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.pyi
+++ /dev/null
@@ -1,7 +0,0 @@
-# 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
deleted file mode 100644
index a65f664..0000000
--- a/typeshed/third_party/3/requests/packages/urllib3/poolmanager.pyi
+++ /dev/null
@@ -1,31 +0,0 @@
-# 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
deleted file mode 100644
index 788c759..0000000
--- a/typeshed/third_party/3/requests/packages/urllib3/request.pyi
+++ /dev/null
@@ -1,13 +0,0 @@
-# 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
deleted file mode 100644
index 62cdaf4..0000000
--- a/typeshed/third_party/3/requests/packages/urllib3/response.pyi
+++ /dev/null
@@ -1,58 +0,0 @@
-# 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
deleted file mode 100644
index e4a0e13..0000000
--- a/typeshed/third_party/3/requests/packages/urllib3/util/__init__.pyi
+++ /dev/null
@@ -1,29 +0,0 @@
-# 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
deleted file mode 100644
index cd67309..0000000
--- a/typeshed/third_party/3/requests/packages/urllib3/util/connection.pyi
+++ /dev/null
@@ -1,11 +0,0 @@
-# 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
deleted file mode 100644
index 20a6ea2..0000000
--- a/typeshed/third_party/3/requests/packages/urllib3/util/request.pyi
+++ /dev/null
@@ -1,12 +0,0 @@
-# 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
deleted file mode 100644
index 761a006..0000000
--- a/typeshed/third_party/3/requests/packages/urllib3/util/response.pyi
+++ /dev/null
@@ -1,5 +0,0 @@
-# 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
deleted file mode 100644
index e958d90..0000000
--- a/typeshed/third_party/3/requests/packages/urllib3/util/retry.pyi
+++ /dev/null
@@ -1,36 +0,0 @@
-# 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
deleted file mode 100644
index c7db0ac..0000000
--- a/typeshed/third_party/3/requests/packages/urllib3/util/ssl_.pyi
+++ /dev/null
@@ -1,24 +0,0 @@
-# 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
deleted file mode 100644
index 0a7653c..0000000
--- a/typeshed/third_party/3/requests/packages/urllib3/util/timeout.pyi
+++ /dev/null
@@ -1,24 +0,0 @@
-# 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
deleted file mode 100644
index 9877b4a..0000000
--- a/typeshed/third_party/3/requests/packages/urllib3/util/url.pyi
+++ /dev/null
@@ -1,26 +0,0 @@
-# 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
deleted file mode 100644
index d81191c..0000000
--- a/typeshed/third_party/3/requests/sessions.pyi
+++ /dev/null
@@ -1,108 +0,0 @@
-# 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
deleted file mode 100644
index e3035eb..0000000
--- a/typeshed/third_party/3/requests/status_codes.pyi
+++ /dev/null
@@ -1,8 +0,0 @@
-# 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
deleted file mode 100644
index 837cf25..0000000
--- a/typeshed/third_party/3/requests/structures.pyi
+++ /dev/null
@@ -1,21 +0,0 @@
-# Stubs for requests.structures (Python 3)
-
-from typing import Any
-import collections
-
-class CaseInsensitiveDict(collections.MutableMapping):
- def __init__(self, data=..., **kwargs) -> None: ...
- def __setitem__(self, key, value): ...
- def __getitem__(self, key): ...
- def __delitem__(self, key): ...
- def __iter__(self): ...
- def __len__(self): ...
- def lower_items(self): ...
- def __eq__(self, other): ...
- def copy(self): ...
-
-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
deleted file mode 100644
index 945277a..0000000
--- a/typeshed/third_party/3/requests/utils.pyi
+++ /dev/null
@@ -1,52 +0,0 @@
-# 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
deleted file mode 100644
index 0e7eb93..0000000
--- a/typeshed/third_party/3/six/__init__.pyi
+++ /dev/null
@@ -1,103 +0,0 @@
-# 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,
- TypeVar,
- Union,
- ValuesView,
- overload,
-)
-import typing
-
-import unittest
-import types
-
-_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
-
-from builtins import next as advance_iterator
-next = advance_iterator
-
-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]: ...
-from io import StringIO as StringIO, BytesIO as BytesIO
-
-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: type, value: Optional[BaseException], tb: Optional[types.TracebackType] = None) -> None: ...
-def raise_from(value: BaseException, from_value: BaseException) -> None: ...
-
-print_ = print
-
-from functools import wraps as wraps
-
-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
deleted file mode 100644
index 859a7eb..0000000
--- a/typeshed/third_party/3/six/moves/__init__.pyi
+++ /dev/null
@@ -1,34 +0,0 @@
-# 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
deleted file mode 100644
index aa9f2bc..0000000
--- a/typeshed/third_party/3/six/moves/cPickle.pyi
+++ /dev/null
@@ -1,6 +0,0 @@
-# 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 *
diff --git a/typeshed/third_party/3/six/moves/urllib/__init__.pyi b/typeshed/third_party/3/six/moves/urllib/__init__.pyi
deleted file mode 100644
index 298b049..0000000
--- a/typeshed/third_party/3/six/moves/urllib/__init__.pyi
+++ /dev/null
@@ -1,10 +0,0 @@
-# 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
deleted file mode 100644
index a45b0f7..0000000
--- a/typeshed/third_party/3/six/moves/urllib/error.pyi
+++ /dev/null
@@ -1,8 +0,0 @@
-# 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
deleted file mode 100644
index c640af2..0000000
--- a/typeshed/third_party/3/six/moves/urllib/parse.pyi
+++ /dev/null
@@ -1,22 +0,0 @@
-# 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
deleted file mode 100644
index b15ced7..0000000
--- a/typeshed/third_party/3/six/moves/urllib/request.pyi
+++ /dev/null
@@ -1,40 +0,0 @@
-# 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
deleted file mode 100644
index c3b34a8..0000000
--- a/typeshed/third_party/3/six/moves/urllib/response.pyi
+++ /dev/null
@@ -1 +0,0 @@
-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
deleted file mode 100644
index 6690355..0000000
--- a/typeshed/third_party/3/six/moves/urllib/robotparser.pyi
+++ /dev/null
@@ -1,6 +0,0 @@
-# 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
deleted file mode 100644
index 1368664..0000000
--- a/typeshed/third_party/3/six/moves/urllib_error.pyi
+++ /dev/null
@@ -1,10 +0,0 @@
-# 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
deleted file mode 100644
index 96f6207..0000000
--- a/typeshed/third_party/3/six/moves/urllib_parse.pyi
+++ /dev/null
@@ -1,20 +0,0 @@
-# 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
deleted file mode 100644
index 168f635..0000000
--- a/typeshed/third_party/3/six/moves/urllib_request.pyi
+++ /dev/null
@@ -1,41 +0,0 @@
-# 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
deleted file mode 100644
index 1574d7d..0000000
--- a/typeshed/third_party/3/six/moves/urllib_response.pyi
+++ /dev/null
@@ -1 +0,0 @@
-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
deleted file mode 100644
index 8b4ca73..0000000
--- a/typeshed/third_party/3/six/moves/urllib_robotparser.pyi
+++ /dev/null
@@ -1,8 +0,0 @@
-# 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
deleted file mode 100644
index 92e1216..0000000
--- a/typeshed/third_party/3/typed_ast/__init__.pyi
+++ /dev/null
@@ -1,2 +0,0 @@
-# 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
deleted file mode 100644
index dd26314..0000000
--- a/typeshed/third_party/3/typed_ast/ast27.pyi
+++ /dev/null
@@ -1,360 +0,0 @@
-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
deleted file mode 100644
index 2a18ff7..0000000
--- a/typeshed/third_party/3/typed_ast/ast35.pyi
+++ /dev/null
@@ -1,392 +0,0 @@
-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
deleted file mode 100644
index 53fcc32..0000000
--- a/typeshed/third_party/3/typed_ast/conversions.pyi
+++ /dev/null
@@ -1,4 +0,0 @@
-from . import ast27
-from . import ast35
-
-def py2to3(ast: ast27.AST) -> ast35.AST: ...
--
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