mypy-dev 1.9.0.dev0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- mypy/__init__.py +1 -0
- mypy/__main__.py +37 -0
- mypy/api.py +94 -0
- mypy/applytype.py +156 -0
- mypy/argmap.py +268 -0
- mypy/binder.py +538 -0
- mypy/bogus_type.py +27 -0
- mypy/build.py +3562 -0
- mypy/checker.py +8372 -0
- mypy/checkexpr.py +6615 -0
- mypy/checkmember.py +1356 -0
- mypy/checkpattern.py +801 -0
- mypy/checkstrformat.py +1109 -0
- mypy/config_parser.py +670 -0
- mypy/constant_fold.py +187 -0
- mypy/constraints.py +1624 -0
- mypy/copytype.py +133 -0
- mypy/defaults.py +46 -0
- mypy/dmypy/__init__.py +0 -0
- mypy/dmypy/__main__.py +6 -0
- mypy/dmypy/client.py +749 -0
- mypy/dmypy_os.py +42 -0
- mypy/dmypy_server.py +1107 -0
- mypy/dmypy_util.py +117 -0
- mypy/erasetype.py +278 -0
- mypy/errorcodes.py +285 -0
- mypy/errors.py +1280 -0
- mypy/evalexpr.py +205 -0
- mypy/expandtype.py +510 -0
- mypy/exprtotype.py +206 -0
- mypy/fastparse.py +2147 -0
- mypy/find_sources.py +243 -0
- mypy/fixup.py +426 -0
- mypy/freetree.py +23 -0
- mypy/fscache.py +309 -0
- mypy/fswatcher.py +106 -0
- mypy/gclogger.py +47 -0
- mypy/git.py +34 -0
- mypy/graph_utils.py +112 -0
- mypy/indirection.py +121 -0
- mypy/infer.py +75 -0
- mypy/inspections.py +627 -0
- mypy/ipc.py +310 -0
- mypy/join.py +866 -0
- mypy/literals.py +306 -0
- mypy/lookup.py +61 -0
- mypy/main.py +1574 -0
- mypy/maptype.py +106 -0
- mypy/meet.py +1140 -0
- mypy/memprofile.py +121 -0
- mypy/message_registry.py +326 -0
- mypy/messages.py +3171 -0
- mypy/metastore.py +225 -0
- mypy/mixedtraverser.py +112 -0
- mypy/modulefinder.py +875 -0
- mypy/moduleinspect.py +184 -0
- mypy/mro.py +62 -0
- mypy/nodes.py +4112 -0
- mypy/operators.py +126 -0
- mypy/options.py +556 -0
- mypy/parse.py +30 -0
- mypy/partially_defined.py +675 -0
- mypy/patterns.py +150 -0
- mypy/plugin.py +901 -0
- mypy/plugins/__init__.py +0 -0
- mypy/plugins/attrs.py +1152 -0
- mypy/plugins/common.py +440 -0
- mypy/plugins/ctypes.py +245 -0
- mypy/plugins/dataclasses.py +1101 -0
- mypy/plugins/default.py +518 -0
- mypy/plugins/enums.py +259 -0
- mypy/plugins/functools.py +104 -0
- mypy/plugins/proper_plugin.py +175 -0
- mypy/plugins/singledispatch.py +224 -0
- mypy/py.typed +1 -0
- mypy/pyinfo.py +78 -0
- mypy/reachability.py +362 -0
- mypy/refinfo.py +92 -0
- mypy/renaming.py +568 -0
- mypy/report.py +924 -0
- mypy/scope.py +125 -0
- mypy/semanal.py +7023 -0
- mypy/semanal_classprop.py +187 -0
- mypy/semanal_enum.py +253 -0
- mypy/semanal_infer.py +128 -0
- mypy/semanal_main.py +511 -0
- mypy/semanal_namedtuple.py +670 -0
- mypy/semanal_newtype.py +273 -0
- mypy/semanal_pass1.py +156 -0
- mypy/semanal_shared.py +490 -0
- mypy/semanal_typeargs.py +265 -0
- mypy/semanal_typeddict.py +575 -0
- mypy/server/__init__.py +0 -0
- mypy/server/astdiff.py +518 -0
- mypy/server/astmerge.py +562 -0
- mypy/server/aststrip.py +281 -0
- mypy/server/deps.py +1137 -0
- mypy/server/mergecheck.py +83 -0
- mypy/server/objgraph.py +101 -0
- mypy/server/subexpr.py +198 -0
- mypy/server/target.py +11 -0
- mypy/server/trigger.py +26 -0
- mypy/server/update.py +1339 -0
- mypy/sharedparse.py +112 -0
- mypy/solve.py +562 -0
- mypy/split_namespace.py +35 -0
- mypy/state.py +28 -0
- mypy/stats.py +489 -0
- mypy/strconv.py +641 -0
- mypy/stubdoc.py +491 -0
- mypy/stubgen.py +1873 -0
- mypy/stubgenc.py +993 -0
- mypy/stubinfo.py +173 -0
- mypy/stubtest.py +2079 -0
- mypy/stubutil.py +807 -0
- mypy/subtypes.py +1967 -0
- mypy/suggestions.py +1046 -0
- mypy/test/__init__.py +0 -0
- mypy/test/config.py +28 -0
- mypy/test/data.py +823 -0
- mypy/test/helpers.py +476 -0
- mypy/test/meta/__init__.py +0 -0
- mypy/test/meta/_pytest.py +72 -0
- mypy/test/meta/test_diff_helper.py +47 -0
- mypy/test/meta/test_parse_data.py +73 -0
- mypy/test/meta/test_update_data.py +135 -0
- mypy/test/test_find_sources.py +376 -0
- mypy/test/test_ref_info.py +45 -0
- mypy/test/testapi.py +45 -0
- mypy/test/testargs.py +77 -0
- mypy/test/testcheck.py +322 -0
- mypy/test/testcmdline.py +152 -0
- mypy/test/testconstraints.py +134 -0
- mypy/test/testdaemon.py +132 -0
- mypy/test/testdeps.py +77 -0
- mypy/test/testdiff.py +67 -0
- mypy/test/testerrorstream.py +46 -0
- mypy/test/testfinegrained.py +438 -0
- mypy/test/testfinegrainedcache.py +18 -0
- mypy/test/testformatter.py +85 -0
- mypy/test/testfscache.py +101 -0
- mypy/test/testgraph.py +83 -0
- mypy/test/testinfer.py +373 -0
- mypy/test/testipc.py +119 -0
- mypy/test/testmerge.py +238 -0
- mypy/test/testmodulefinder.py +278 -0
- mypy/test/testmypyc.py +14 -0
- mypy/test/testparse.py +107 -0
- mypy/test/testpep561.py +211 -0
- mypy/test/testpythoneval.py +117 -0
- mypy/test/testreports.py +55 -0
- mypy/test/testsemanal.py +209 -0
- mypy/test/testsolve.py +285 -0
- mypy/test/teststubgen.py +1412 -0
- mypy/test/teststubinfo.py +12 -0
- mypy/test/teststubtest.py +2492 -0
- mypy/test/testsubtypes.py +303 -0
- mypy/test/testtransform.py +64 -0
- mypy/test/testtypegen.py +83 -0
- mypy/test/testtypes.py +1551 -0
- mypy/test/testutil.py +111 -0
- mypy/test/typefixture.py +415 -0
- mypy/test/update_data.py +87 -0
- mypy/test/visitors.py +63 -0
- mypy/traverser.py +961 -0
- mypy/treetransform.py +800 -0
- mypy/tvar_scope.py +147 -0
- mypy/type_visitor.py +564 -0
- mypy/typeanal.py +2510 -0
- mypy/typeops.py +1082 -0
- mypy/types.py +3686 -0
- mypy/types_utils.py +166 -0
- mypy/typeshed/LICENSE +237 -0
- mypy/typeshed/stdlib/VERSIONS +308 -0
- mypy/typeshed/stdlib/__future__.pyi +36 -0
- mypy/typeshed/stdlib/__main__.pyi +3 -0
- mypy/typeshed/stdlib/_ast.pyi +587 -0
- mypy/typeshed/stdlib/_bisect.pyi +84 -0
- mypy/typeshed/stdlib/_bootlocale.pyi +1 -0
- mypy/typeshed/stdlib/_codecs.pyi +133 -0
- mypy/typeshed/stdlib/_collections_abc.pyi +94 -0
- mypy/typeshed/stdlib/_compat_pickle.pyi +8 -0
- mypy/typeshed/stdlib/_compression.pyi +25 -0
- mypy/typeshed/stdlib/_csv.pyi +90 -0
- mypy/typeshed/stdlib/_ctypes.pyi +205 -0
- mypy/typeshed/stdlib/_curses.pyi +557 -0
- mypy/typeshed/stdlib/_decimal.pyi +281 -0
- mypy/typeshed/stdlib/_dummy_thread.pyi +27 -0
- mypy/typeshed/stdlib/_dummy_threading.pyi +164 -0
- mypy/typeshed/stdlib/_heapq.pyi +11 -0
- mypy/typeshed/stdlib/_imp.pyi +28 -0
- mypy/typeshed/stdlib/_json.pyi +49 -0
- mypy/typeshed/stdlib/_locale.pyi +100 -0
- mypy/typeshed/stdlib/_markupbase.pyi +16 -0
- mypy/typeshed/stdlib/_msi.pyi +91 -0
- mypy/typeshed/stdlib/_operator.pyi +147 -0
- mypy/typeshed/stdlib/_osx_support.pyi +34 -0
- mypy/typeshed/stdlib/_posixsubprocess.pyi +32 -0
- mypy/typeshed/stdlib/_py_abc.pyi +14 -0
- mypy/typeshed/stdlib/_pydecimal.pyi +43 -0
- mypy/typeshed/stdlib/_random.pyi +12 -0
- mypy/typeshed/stdlib/_sitebuiltins.pyi +16 -0
- mypy/typeshed/stdlib/_socket.pyi +802 -0
- mypy/typeshed/stdlib/_stat.pyi +103 -0
- mypy/typeshed/stdlib/_thread.pyi +52 -0
- mypy/typeshed/stdlib/_threading_local.pyi +17 -0
- mypy/typeshed/stdlib/_tkinter.pyi +120 -0
- mypy/typeshed/stdlib/_tracemalloc.pyi +17 -0
- mypy/typeshed/stdlib/_typeshed/__init__.pyi +347 -0
- mypy/typeshed/stdlib/_typeshed/dbapi.pyi +37 -0
- mypy/typeshed/stdlib/_typeshed/wsgi.pyi +44 -0
- mypy/typeshed/stdlib/_typeshed/xml.pyi +9 -0
- mypy/typeshed/stdlib/_warnings.pyi +55 -0
- mypy/typeshed/stdlib/_weakref.pyi +41 -0
- mypy/typeshed/stdlib/_weakrefset.pyi +51 -0
- mypy/typeshed/stdlib/_winapi.pyi +251 -0
- mypy/typeshed/stdlib/abc.pyi +49 -0
- mypy/typeshed/stdlib/aifc.pyi +91 -0
- mypy/typeshed/stdlib/antigravity.pyi +3 -0
- mypy/typeshed/stdlib/argparse.pyi +571 -0
- mypy/typeshed/stdlib/array.pyi +92 -0
- mypy/typeshed/stdlib/ast.pyi +277 -0
- mypy/typeshed/stdlib/asynchat.pyi +21 -0
- mypy/typeshed/stdlib/asyncio/__init__.pyi +41 -0
- mypy/typeshed/stdlib/asyncio/base_events.pyi +440 -0
- mypy/typeshed/stdlib/asyncio/base_futures.pyi +19 -0
- mypy/typeshed/stdlib/asyncio/base_subprocess.pyi +63 -0
- mypy/typeshed/stdlib/asyncio/base_tasks.pyi +9 -0
- mypy/typeshed/stdlib/asyncio/constants.pyi +20 -0
- mypy/typeshed/stdlib/asyncio/coroutines.pyi +26 -0
- mypy/typeshed/stdlib/asyncio/events.pyi +574 -0
- mypy/typeshed/stdlib/asyncio/exceptions.pyi +43 -0
- mypy/typeshed/stdlib/asyncio/format_helpers.pyi +20 -0
- mypy/typeshed/stdlib/asyncio/futures.pyi +57 -0
- mypy/typeshed/stdlib/asyncio/locks.pyi +121 -0
- mypy/typeshed/stdlib/asyncio/log.pyi +3 -0
- mypy/typeshed/stdlib/asyncio/mixins.pyi +9 -0
- mypy/typeshed/stdlib/asyncio/proactor_events.pyi +64 -0
- mypy/typeshed/stdlib/asyncio/protocols.pyi +34 -0
- mypy/typeshed/stdlib/asyncio/queues.pyi +47 -0
- mypy/typeshed/stdlib/asyncio/runners.pyi +32 -0
- mypy/typeshed/stdlib/asyncio/selector_events.pyi +8 -0
- mypy/typeshed/stdlib/asyncio/sslproto.pyi +163 -0
- mypy/typeshed/stdlib/asyncio/staggered.pyi +10 -0
- mypy/typeshed/stdlib/asyncio/streams.pyi +148 -0
- mypy/typeshed/stdlib/asyncio/subprocess.pyi +229 -0
- mypy/typeshed/stdlib/asyncio/taskgroups.pyi +25 -0
- mypy/typeshed/stdlib/asyncio/tasks.pyi +477 -0
- mypy/typeshed/stdlib/asyncio/threads.pyi +9 -0
- mypy/typeshed/stdlib/asyncio/timeouts.pyi +19 -0
- mypy/typeshed/stdlib/asyncio/transports.pyi +47 -0
- mypy/typeshed/stdlib/asyncio/trsock.pyi +98 -0
- mypy/typeshed/stdlib/asyncio/unix_events.pyi +173 -0
- mypy/typeshed/stdlib/asyncio/windows_events.pyi +83 -0
- mypy/typeshed/stdlib/asyncio/windows_utils.pyi +49 -0
- mypy/typeshed/stdlib/asyncore.pyi +90 -0
- mypy/typeshed/stdlib/atexit.pyi +12 -0
- mypy/typeshed/stdlib/audioop.pyi +42 -0
- mypy/typeshed/stdlib/base64.pyi +59 -0
- mypy/typeshed/stdlib/bdb.pyi +102 -0
- mypy/typeshed/stdlib/binascii.pyi +36 -0
- mypy/typeshed/stdlib/binhex.pyi +45 -0
- mypy/typeshed/stdlib/bisect.pyi +4 -0
- mypy/typeshed/stdlib/builtins.pyi +1937 -0
- mypy/typeshed/stdlib/bz2.pyi +146 -0
- mypy/typeshed/stdlib/cProfile.pyi +35 -0
- mypy/typeshed/stdlib/calendar.pyi +206 -0
- mypy/typeshed/stdlib/cgi.pyi +118 -0
- mypy/typeshed/stdlib/cgitb.pyi +32 -0
- mypy/typeshed/stdlib/chunk.pyi +20 -0
- mypy/typeshed/stdlib/cmath.pyi +36 -0
- mypy/typeshed/stdlib/cmd.pyi +45 -0
- mypy/typeshed/stdlib/code.pyi +33 -0
- mypy/typeshed/stdlib/codecs.pyi +285 -0
- mypy/typeshed/stdlib/codeop.pyi +13 -0
- mypy/typeshed/stdlib/collections/__init__.pyi +477 -0
- mypy/typeshed/stdlib/collections/abc.pyi +2 -0
- mypy/typeshed/stdlib/colorsys.pyi +13 -0
- mypy/typeshed/stdlib/compileall.pyi +111 -0
- mypy/typeshed/stdlib/concurrent/__init__.pyi +0 -0
- mypy/typeshed/stdlib/concurrent/futures/__init__.pyi +32 -0
- mypy/typeshed/stdlib/concurrent/futures/_base.pyi +120 -0
- mypy/typeshed/stdlib/concurrent/futures/process.pyi +233 -0
- mypy/typeshed/stdlib/concurrent/futures/thread.pyi +80 -0
- mypy/typeshed/stdlib/configparser.pyi +313 -0
- mypy/typeshed/stdlib/contextlib.pyi +207 -0
- mypy/typeshed/stdlib/contextvars.pyi +63 -0
- mypy/typeshed/stdlib/copy.pyi +16 -0
- mypy/typeshed/stdlib/copyreg.pyi +21 -0
- mypy/typeshed/stdlib/crypt.pyi +12 -0
- mypy/typeshed/stdlib/csv.pyi +147 -0
- mypy/typeshed/stdlib/ctypes/__init__.pyi +187 -0
- mypy/typeshed/stdlib/ctypes/_endian.pyi +19 -0
- mypy/typeshed/stdlib/ctypes/util.pyi +6 -0
- mypy/typeshed/stdlib/ctypes/wintypes.pyi +298 -0
- mypy/typeshed/stdlib/curses/__init__.pyi +21 -0
- mypy/typeshed/stdlib/curses/ascii.pyi +63 -0
- mypy/typeshed/stdlib/curses/has_key.pyi +4 -0
- mypy/typeshed/stdlib/curses/panel.pyi +25 -0
- mypy/typeshed/stdlib/curses/textpad.pyi +13 -0
- mypy/typeshed/stdlib/dataclasses.pyi +313 -0
- mypy/typeshed/stdlib/datetime.pyi +295 -0
- mypy/typeshed/stdlib/dbm/__init__.pyi +95 -0
- mypy/typeshed/stdlib/dbm/dumb.pyi +31 -0
- mypy/typeshed/stdlib/dbm/gnu.pyi +40 -0
- mypy/typeshed/stdlib/dbm/ndbm.pyi +36 -0
- mypy/typeshed/stdlib/decimal.pyi +2 -0
- mypy/typeshed/stdlib/difflib.pyi +140 -0
- mypy/typeshed/stdlib/dis.pyi +144 -0
- mypy/typeshed/stdlib/distutils/__init__.pyi +5 -0
- mypy/typeshed/stdlib/distutils/archive_util.pyi +20 -0
- mypy/typeshed/stdlib/distutils/bcppcompiler.pyi +3 -0
- mypy/typeshed/stdlib/distutils/ccompiler.pyi +152 -0
- mypy/typeshed/stdlib/distutils/cmd.pyi +66 -0
- mypy/typeshed/stdlib/distutils/command/__init__.pyi +0 -0
- mypy/typeshed/stdlib/distutils/command/bdist.pyi +25 -0
- mypy/typeshed/stdlib/distutils/command/bdist_dumb.pyi +21 -0
- mypy/typeshed/stdlib/distutils/command/bdist_msi.pyi +45 -0
- mypy/typeshed/stdlib/distutils/command/bdist_packager.pyi +0 -0
- mypy/typeshed/stdlib/distutils/command/bdist_rpm.pyi +52 -0
- mypy/typeshed/stdlib/distutils/command/bdist_wininst.pyi +16 -0
- mypy/typeshed/stdlib/distutils/command/build.pyi +31 -0
- mypy/typeshed/stdlib/distutils/command/build_clib.pyi +27 -0
- mypy/typeshed/stdlib/distutils/command/build_ext.pyi +50 -0
- mypy/typeshed/stdlib/distutils/command/build_py.pyi +44 -0
- mypy/typeshed/stdlib/distutils/command/build_scripts.pyi +24 -0
- mypy/typeshed/stdlib/distutils/command/check.pyi +39 -0
- mypy/typeshed/stdlib/distutils/command/clean.pyi +17 -0
- mypy/typeshed/stdlib/distutils/command/config.pyi +83 -0
- mypy/typeshed/stdlib/distutils/command/install.pyi +63 -0
- mypy/typeshed/stdlib/distutils/command/install_data.pyi +19 -0
- mypy/typeshed/stdlib/distutils/command/install_egg_info.pyi +18 -0
- mypy/typeshed/stdlib/distutils/command/install_headers.pyi +16 -0
- mypy/typeshed/stdlib/distutils/command/install_lib.pyi +25 -0
- mypy/typeshed/stdlib/distutils/command/install_scripts.pyi +18 -0
- mypy/typeshed/stdlib/distutils/command/register.pyi +18 -0
- mypy/typeshed/stdlib/distutils/command/sdist.pyi +42 -0
- mypy/typeshed/stdlib/distutils/command/upload.pyi +17 -0
- mypy/typeshed/stdlib/distutils/config.pyi +17 -0
- mypy/typeshed/stdlib/distutils/core.pyi +57 -0
- mypy/typeshed/stdlib/distutils/cygwinccompiler.pyi +20 -0
- mypy/typeshed/stdlib/distutils/debug.pyi +1 -0
- mypy/typeshed/stdlib/distutils/dep_util.pyi +3 -0
- mypy/typeshed/stdlib/distutils/dir_util.pyi +13 -0
- mypy/typeshed/stdlib/distutils/dist.pyi +146 -0
- mypy/typeshed/stdlib/distutils/errors.pyi +19 -0
- mypy/typeshed/stdlib/distutils/extension.pyi +36 -0
- mypy/typeshed/stdlib/distutils/fancy_getopt.pyi +34 -0
- mypy/typeshed/stdlib/distutils/file_util.pyi +14 -0
- mypy/typeshed/stdlib/distutils/filelist.pyi +50 -0
- mypy/typeshed/stdlib/distutils/log.pyi +25 -0
- mypy/typeshed/stdlib/distutils/msvccompiler.pyi +3 -0
- mypy/typeshed/stdlib/distutils/spawn.pyi +2 -0
- mypy/typeshed/stdlib/distutils/sysconfig.pyi +22 -0
- mypy/typeshed/stdlib/distutils/text_file.pyi +21 -0
- mypy/typeshed/stdlib/distutils/unixccompiler.pyi +3 -0
- mypy/typeshed/stdlib/distutils/util.pyi +46 -0
- mypy/typeshed/stdlib/distutils/version.pyi +36 -0
- mypy/typeshed/stdlib/doctest.pyi +248 -0
- mypy/typeshed/stdlib/dummy_threading.pyi +2 -0
- mypy/typeshed/stdlib/email/__init__.pyi +29 -0
- mypy/typeshed/stdlib/email/_header_value_parser.pyi +392 -0
- mypy/typeshed/stdlib/email/_policybase.pyi +51 -0
- mypy/typeshed/stdlib/email/base64mime.pyi +13 -0
- mypy/typeshed/stdlib/email/charset.pyi +34 -0
- mypy/typeshed/stdlib/email/contentmanager.pyi +11 -0
- mypy/typeshed/stdlib/email/encoders.pyi +8 -0
- mypy/typeshed/stdlib/email/errors.pyi +39 -0
- mypy/typeshed/stdlib/email/feedparser.pyi +23 -0
- mypy/typeshed/stdlib/email/generator.pyi +40 -0
- mypy/typeshed/stdlib/email/header.pyi +31 -0
- mypy/typeshed/stdlib/email/headerregistry.pyi +178 -0
- mypy/typeshed/stdlib/email/iterators.pyi +12 -0
- mypy/typeshed/stdlib/email/message.pyi +161 -0
- mypy/typeshed/stdlib/email/mime/__init__.pyi +0 -0
- mypy/typeshed/stdlib/email/mime/application.pyi +17 -0
- mypy/typeshed/stdlib/email/mime/audio.pyi +17 -0
- mypy/typeshed/stdlib/email/mime/base.pyi +8 -0
- mypy/typeshed/stdlib/email/mime/image.pyi +17 -0
- mypy/typeshed/stdlib/email/mime/message.pyi +8 -0
- mypy/typeshed/stdlib/email/mime/multipart.pyi +18 -0
- mypy/typeshed/stdlib/email/mime/nonmultipart.pyi +5 -0
- mypy/typeshed/stdlib/email/mime/text.pyi +9 -0
- mypy/typeshed/stdlib/email/parser.pyi +26 -0
- mypy/typeshed/stdlib/email/policy.pyi +38 -0
- mypy/typeshed/stdlib/email/quoprimime.pyi +28 -0
- mypy/typeshed/stdlib/email/utils.pyi +66 -0
- mypy/typeshed/stdlib/encodings/__init__.pyi +10 -0
- mypy/typeshed/stdlib/encodings/utf_8.pyi +21 -0
- mypy/typeshed/stdlib/encodings/utf_8_sig.pyi +22 -0
- mypy/typeshed/stdlib/ensurepip/__init__.pyi +12 -0
- mypy/typeshed/stdlib/enum.pyi +317 -0
- mypy/typeshed/stdlib/errno.pyi +222 -0
- mypy/typeshed/stdlib/faulthandler.pyi +13 -0
- mypy/typeshed/stdlib/fcntl.pyi +127 -0
- mypy/typeshed/stdlib/filecmp.pyi +57 -0
- mypy/typeshed/stdlib/fileinput.pyi +213 -0
- mypy/typeshed/stdlib/fnmatch.pyi +9 -0
- mypy/typeshed/stdlib/formatter.pyi +88 -0
- mypy/typeshed/stdlib/fractions.pyi +150 -0
- mypy/typeshed/stdlib/ftplib.pyi +178 -0
- mypy/typeshed/stdlib/functools.pyi +200 -0
- mypy/typeshed/stdlib/gc.pyi +37 -0
- mypy/typeshed/stdlib/genericpath.pyi +52 -0
- mypy/typeshed/stdlib/getopt.pyi +11 -0
- mypy/typeshed/stdlib/getpass.pyi +8 -0
- mypy/typeshed/stdlib/gettext.pyi +169 -0
- mypy/typeshed/stdlib/glob.pyi +42 -0
- mypy/typeshed/stdlib/graphlib.pyi +28 -0
- mypy/typeshed/stdlib/grp.pyi +21 -0
- mypy/typeshed/stdlib/gzip.pyi +160 -0
- mypy/typeshed/stdlib/hashlib.pyi +165 -0
- mypy/typeshed/stdlib/heapq.pyi +17 -0
- mypy/typeshed/stdlib/hmac.pyi +38 -0
- mypy/typeshed/stdlib/html/__init__.pyi +6 -0
- mypy/typeshed/stdlib/html/entities.pyi +6 -0
- mypy/typeshed/stdlib/html/parser.pyi +34 -0
- mypy/typeshed/stdlib/http/__init__.pyi +105 -0
- mypy/typeshed/stdlib/http/client.pyi +259 -0
- mypy/typeshed/stdlib/http/cookiejar.pyi +159 -0
- mypy/typeshed/stdlib/http/cookies.pyi +60 -0
- mypy/typeshed/stdlib/http/server.pyi +83 -0
- mypy/typeshed/stdlib/imaplib.pyi +168 -0
- mypy/typeshed/stdlib/imghdr.pyi +17 -0
- mypy/typeshed/stdlib/imp.pyi +62 -0
- mypy/typeshed/stdlib/importlib/__init__.pyi +24 -0
- mypy/typeshed/stdlib/importlib/_abc.pyi +15 -0
- mypy/typeshed/stdlib/importlib/abc.pyi +172 -0
- mypy/typeshed/stdlib/importlib/machinery.pyi +179 -0
- mypy/typeshed/stdlib/importlib/metadata/__init__.pyi +276 -0
- mypy/typeshed/stdlib/importlib/metadata/_meta.pyi +40 -0
- mypy/typeshed/stdlib/importlib/readers.pyi +68 -0
- mypy/typeshed/stdlib/importlib/resources/__init__.pyi +46 -0
- mypy/typeshed/stdlib/importlib/resources/abc.pyi +12 -0
- mypy/typeshed/stdlib/importlib/resources/readers.pyi +14 -0
- mypy/typeshed/stdlib/importlib/resources/simple.pyi +49 -0
- mypy/typeshed/stdlib/importlib/simple.pyi +11 -0
- mypy/typeshed/stdlib/importlib/util.pyi +43 -0
- mypy/typeshed/stdlib/inspect.pyi +631 -0
- mypy/typeshed/stdlib/io.pyi +204 -0
- mypy/typeshed/stdlib/ipaddress.pyi +208 -0
- mypy/typeshed/stdlib/itertools.pyi +293 -0
- mypy/typeshed/stdlib/json/__init__.pyi +61 -0
- mypy/typeshed/stdlib/json/decoder.pyi +32 -0
- mypy/typeshed/stdlib/json/encoder.pyi +38 -0
- mypy/typeshed/stdlib/json/tool.pyi +1 -0
- mypy/typeshed/stdlib/keyword.pyi +21 -0
- mypy/typeshed/stdlib/lib2to3/__init__.pyi +0 -0
- mypy/typeshed/stdlib/lib2to3/btm_matcher.pyi +28 -0
- mypy/typeshed/stdlib/lib2to3/fixer_base.pyi +42 -0
- mypy/typeshed/stdlib/lib2to3/fixes/__init__.pyi +0 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_apply.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_asserts.pyi +10 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_basestring.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_buffer.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_dict.pyi +16 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_except.pyi +14 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_exec.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_execfile.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_exitfunc.pyi +13 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_filter.pyi +9 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_funcattrs.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_future.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_getcwdu.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_has_key.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_idioms.pyi +15 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_import.pyi +16 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_imports.pyi +21 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_imports2.pyi +6 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_input.pyi +11 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_intern.pyi +9 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_isinstance.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_itertools.pyi +9 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_itertools_imports.pyi +7 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_long.pyi +7 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_map.pyi +9 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_metaclass.pyi +17 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_methodattrs.pyi +10 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_ne.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_next.pyi +19 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_nonzero.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_numliterals.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_operator.pyi +12 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_paren.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_print.pyi +12 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_raise.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_raw_input.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_reduce.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_reload.pyi +9 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_renames.pyi +17 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_repr.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_set_literal.pyi +7 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_standarderror.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_sys_exc.pyi +9 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_throw.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_tuple_params.pyi +17 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_types.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_unicode.pyi +12 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_urllib.pyi +15 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_ws_comma.pyi +12 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_xrange.pyi +20 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_xreadlines.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_zip.pyi +9 -0
- mypy/typeshed/stdlib/lib2to3/main.pyi +42 -0
- mypy/typeshed/stdlib/lib2to3/pgen2/__init__.pyi +9 -0
- mypy/typeshed/stdlib/lib2to3/pgen2/driver.pyi +27 -0
- mypy/typeshed/stdlib/lib2to3/pgen2/grammar.pyi +24 -0
- mypy/typeshed/stdlib/lib2to3/pgen2/literals.pyi +7 -0
- mypy/typeshed/stdlib/lib2to3/pgen2/parse.pyi +30 -0
- mypy/typeshed/stdlib/lib2to3/pgen2/pgen.pyi +50 -0
- mypy/typeshed/stdlib/lib2to3/pgen2/token.pyi +67 -0
- mypy/typeshed/stdlib/lib2to3/pgen2/tokenize.pyi +96 -0
- mypy/typeshed/stdlib/lib2to3/pygram.pyi +114 -0
- mypy/typeshed/stdlib/lib2to3/pytree.pyi +117 -0
- mypy/typeshed/stdlib/lib2to3/refactor.pyi +82 -0
- mypy/typeshed/stdlib/linecache.pyi +23 -0
- mypy/typeshed/stdlib/locale.pyi +152 -0
- mypy/typeshed/stdlib/logging/__init__.pyi +655 -0
- mypy/typeshed/stdlib/logging/config.pyi +134 -0
- mypy/typeshed/stdlib/logging/handlers.pyi +275 -0
- mypy/typeshed/stdlib/lzma.pyi +197 -0
- mypy/typeshed/stdlib/mailbox.pyi +256 -0
- mypy/typeshed/stdlib/mailcap.pyi +11 -0
- mypy/typeshed/stdlib/marshal.pyi +33 -0
- mypy/typeshed/stdlib/math.pyi +125 -0
- mypy/typeshed/stdlib/mimetypes.pyi +46 -0
- mypy/typeshed/stdlib/mmap.pyi +113 -0
- mypy/typeshed/stdlib/modulefinder.pyi +66 -0
- mypy/typeshed/stdlib/msilib/__init__.pyi +176 -0
- mypy/typeshed/stdlib/msilib/schema.pyi +94 -0
- mypy/typeshed/stdlib/msilib/sequence.pyi +13 -0
- mypy/typeshed/stdlib/msilib/text.pyi +7 -0
- mypy/typeshed/stdlib/msvcrt.pyi +32 -0
- mypy/typeshed/stdlib/multiprocessing/__init__.pyi +90 -0
- mypy/typeshed/stdlib/multiprocessing/connection.pyi +75 -0
- mypy/typeshed/stdlib/multiprocessing/context.pyi +187 -0
- mypy/typeshed/stdlib/multiprocessing/dummy/__init__.pyi +77 -0
- mypy/typeshed/stdlib/multiprocessing/dummy/connection.pyi +39 -0
- mypy/typeshed/stdlib/multiprocessing/forkserver.pyi +31 -0
- mypy/typeshed/stdlib/multiprocessing/heap.pyi +36 -0
- mypy/typeshed/stdlib/multiprocessing/managers.pyi +212 -0
- mypy/typeshed/stdlib/multiprocessing/pool.pyi +103 -0
- mypy/typeshed/stdlib/multiprocessing/popen_fork.pyi +23 -0
- mypy/typeshed/stdlib/multiprocessing/popen_forkserver.pyi +16 -0
- mypy/typeshed/stdlib/multiprocessing/popen_spawn_posix.pyi +20 -0
- mypy/typeshed/stdlib/multiprocessing/popen_spawn_win32.pyi +30 -0
- mypy/typeshed/stdlib/multiprocessing/process.pyi +39 -0
- mypy/typeshed/stdlib/multiprocessing/queues.pyi +41 -0
- mypy/typeshed/stdlib/multiprocessing/reduction.pyi +89 -0
- mypy/typeshed/stdlib/multiprocessing/resource_sharer.pyi +20 -0
- mypy/typeshed/stdlib/multiprocessing/resource_tracker.pyi +18 -0
- mypy/typeshed/stdlib/multiprocessing/shared_memory.pyi +40 -0
- mypy/typeshed/stdlib/multiprocessing/sharedctypes.pyi +101 -0
- mypy/typeshed/stdlib/multiprocessing/spawn.pyi +32 -0
- mypy/typeshed/stdlib/multiprocessing/synchronize.pyi +54 -0
- mypy/typeshed/stdlib/multiprocessing/util.pyi +79 -0
- mypy/typeshed/stdlib/netrc.pyi +23 -0
- mypy/typeshed/stdlib/nis.pyi +9 -0
- mypy/typeshed/stdlib/nntplib.pyi +125 -0
- mypy/typeshed/stdlib/nt.pyi +111 -0
- mypy/typeshed/stdlib/ntpath.pyi +119 -0
- mypy/typeshed/stdlib/nturl2path.pyi +2 -0
- mypy/typeshed/stdlib/numbers.pyi +154 -0
- mypy/typeshed/stdlib/opcode.pyi +59 -0
- mypy/typeshed/stdlib/operator.pyi +110 -0
- mypy/typeshed/stdlib/optparse.pyi +252 -0
- mypy/typeshed/stdlib/os/__init__.pyi +1139 -0
- mypy/typeshed/stdlib/os/path.pyi +8 -0
- mypy/typeshed/stdlib/ossaudiodev.pyi +131 -0
- mypy/typeshed/stdlib/parser.pyi +24 -0
- mypy/typeshed/stdlib/pathlib.pyi +232 -0
- mypy/typeshed/stdlib/pdb.pyi +181 -0
- mypy/typeshed/stdlib/pickle.pyi +270 -0
- mypy/typeshed/stdlib/pickletools.pyi +167 -0
- mypy/typeshed/stdlib/pipes.pyi +16 -0
- mypy/typeshed/stdlib/pkgutil.pyi +53 -0
- mypy/typeshed/stdlib/platform.pyi +42 -0
- mypy/typeshed/stdlib/plistlib.pyi +113 -0
- mypy/typeshed/stdlib/poplib.pyi +71 -0
- mypy/typeshed/stdlib/posix.pyi +359 -0
- mypy/typeshed/stdlib/posixpath.pyi +161 -0
- mypy/typeshed/stdlib/pprint.pyi +112 -0
- mypy/typeshed/stdlib/profile.pyi +31 -0
- mypy/typeshed/stdlib/pstats.pyi +78 -0
- mypy/typeshed/stdlib/pty.pyi +19 -0
- mypy/typeshed/stdlib/pwd.pyi +27 -0
- mypy/typeshed/stdlib/py_compile.pyi +34 -0
- mypy/typeshed/stdlib/pyclbr.pyi +74 -0
- mypy/typeshed/stdlib/pydoc.pyi +261 -0
- mypy/typeshed/stdlib/pydoc_data/__init__.pyi +0 -0
- mypy/typeshed/stdlib/pydoc_data/topics.pyi +1 -0
- mypy/typeshed/stdlib/pyexpat/__init__.pyi +80 -0
- mypy/typeshed/stdlib/pyexpat/errors.pyi +49 -0
- mypy/typeshed/stdlib/pyexpat/model.pyi +11 -0
- mypy/typeshed/stdlib/queue.pyi +58 -0
- mypy/typeshed/stdlib/quopri.pyi +11 -0
- mypy/typeshed/stdlib/random.pyi +138 -0
- mypy/typeshed/stdlib/re.pyi +290 -0
- mypy/typeshed/stdlib/readline.pyi +36 -0
- mypy/typeshed/stdlib/reprlib.pyi +65 -0
- mypy/typeshed/stdlib/resource.pyi +92 -0
- mypy/typeshed/stdlib/rlcompleter.pyi +9 -0
- mypy/typeshed/stdlib/runpy.pyi +24 -0
- mypy/typeshed/stdlib/sched.pyi +42 -0
- mypy/typeshed/stdlib/secrets.pyi +15 -0
- mypy/typeshed/stdlib/select.pyi +151 -0
- mypy/typeshed/stdlib/selectors.pyi +67 -0
- mypy/typeshed/stdlib/shelve.pyi +46 -0
- mypy/typeshed/stdlib/shlex.pyi +43 -0
- mypy/typeshed/stdlib/shutil.pyi +189 -0
- mypy/typeshed/stdlib/signal.pyi +189 -0
- mypy/typeshed/stdlib/site.pyi +27 -0
- mypy/typeshed/stdlib/smtpd.pyi +91 -0
- mypy/typeshed/stdlib/smtplib.pyi +204 -0
- mypy/typeshed/stdlib/sndhdr.pyi +14 -0
- mypy/typeshed/stdlib/socket.pyi +825 -0
- mypy/typeshed/stdlib/socketserver.pyi +168 -0
- mypy/typeshed/stdlib/spwd.pyi +40 -0
- mypy/typeshed/stdlib/sqlite3/__init__.pyi +1 -0
- mypy/typeshed/stdlib/sqlite3/dbapi2.pyi +469 -0
- mypy/typeshed/stdlib/sre_compile.pyi +11 -0
- mypy/typeshed/stdlib/sre_constants.pyi +130 -0
- mypy/typeshed/stdlib/sre_parse.pyi +104 -0
- mypy/typeshed/stdlib/ssl.pyi +529 -0
- mypy/typeshed/stdlib/stat.pyi +1 -0
- mypy/typeshed/stdlib/statistics.pyi +132 -0
- mypy/typeshed/stdlib/string.pyi +83 -0
- mypy/typeshed/stdlib/stringprep.pyi +27 -0
- mypy/typeshed/stdlib/struct.pyi +26 -0
- mypy/typeshed/stdlib/subprocess.pyi +2614 -0
- mypy/typeshed/stdlib/sunau.pyi +86 -0
- mypy/typeshed/stdlib/symbol.pyi +93 -0
- mypy/typeshed/stdlib/symtable.pyi +58 -0
- mypy/typeshed/stdlib/sys/__init__.pyi +373 -0
- mypy/typeshed/stdlib/sys/_monitoring.pyi +52 -0
- mypy/typeshed/stdlib/sysconfig.pyi +43 -0
- mypy/typeshed/stdlib/syslog.pyi +46 -0
- mypy/typeshed/stdlib/tabnanny.pyi +16 -0
- mypy/typeshed/stdlib/tarfile.pyi +438 -0
- mypy/typeshed/stdlib/telnetlib.pyi +122 -0
- mypy/typeshed/stdlib/tempfile.pyi +477 -0
- mypy/typeshed/stdlib/termios.pyi +267 -0
- mypy/typeshed/stdlib/textwrap.pyi +103 -0
- mypy/typeshed/stdlib/this.pyi +2 -0
- mypy/typeshed/stdlib/threading.pyi +187 -0
- mypy/typeshed/stdlib/time.pyi +107 -0
- mypy/typeshed/stdlib/timeit.pyi +32 -0
- mypy/typeshed/stdlib/tkinter/__init__.pyi +3641 -0
- mypy/typeshed/stdlib/tkinter/colorchooser.pyi +20 -0
- mypy/typeshed/stdlib/tkinter/commondialog.pyi +14 -0
- mypy/typeshed/stdlib/tkinter/constants.pyi +80 -0
- mypy/typeshed/stdlib/tkinter/dialog.pyi +16 -0
- mypy/typeshed/stdlib/tkinter/dnd.pyi +20 -0
- mypy/typeshed/stdlib/tkinter/filedialog.pyi +151 -0
- mypy/typeshed/stdlib/tkinter/font.pyi +116 -0
- mypy/typeshed/stdlib/tkinter/messagebox.pyi +44 -0
- mypy/typeshed/stdlib/tkinter/scrolledtext.pyi +10 -0
- mypy/typeshed/stdlib/tkinter/simpledialog.pyi +54 -0
- mypy/typeshed/stdlib/tkinter/tix.pyi +299 -0
- mypy/typeshed/stdlib/tkinter/ttk.pyi +1191 -0
- mypy/typeshed/stdlib/token.pyi +159 -0
- mypy/typeshed/stdlib/tokenize.pyi +177 -0
- mypy/typeshed/stdlib/tomllib.pyi +10 -0
- mypy/typeshed/stdlib/trace.pyi +79 -0
- mypy/typeshed/stdlib/traceback.pyi +260 -0
- mypy/typeshed/stdlib/tracemalloc.pyi +124 -0
- mypy/typeshed/stdlib/tty.pyi +30 -0
- mypy/typeshed/stdlib/turtle.pyi +713 -0
- mypy/typeshed/stdlib/types.pyi +605 -0
- mypy/typeshed/stdlib/typing.pyi +968 -0
- mypy/typeshed/stdlib/typing_extensions.pyi +503 -0
- mypy/typeshed/stdlib/unicodedata.pyi +71 -0
- mypy/typeshed/stdlib/unittest/__init__.pyi +67 -0
- mypy/typeshed/stdlib/unittest/_log.pyi +27 -0
- mypy/typeshed/stdlib/unittest/async_case.pyi +21 -0
- mypy/typeshed/stdlib/unittest/case.pyi +342 -0
- mypy/typeshed/stdlib/unittest/loader.pyi +51 -0
- mypy/typeshed/stdlib/unittest/main.pyi +69 -0
- mypy/typeshed/stdlib/unittest/mock.pyi +430 -0
- mypy/typeshed/stdlib/unittest/result.pyi +46 -0
- mypy/typeshed/stdlib/unittest/runner.pyi +72 -0
- mypy/typeshed/stdlib/unittest/signals.pyi +15 -0
- mypy/typeshed/stdlib/unittest/suite.pyi +22 -0
- mypy/typeshed/stdlib/unittest/util.pyi +23 -0
- mypy/typeshed/stdlib/urllib/__init__.pyi +0 -0
- mypy/typeshed/stdlib/urllib/error.pyi +23 -0
- mypy/typeshed/stdlib/urllib/parse.pyi +210 -0
- mypy/typeshed/stdlib/urllib/request.pyi +399 -0
- mypy/typeshed/stdlib/urllib/response.pyi +43 -0
- mypy/typeshed/stdlib/urllib/robotparser.pyi +20 -0
- mypy/typeshed/stdlib/uu.pyi +13 -0
- mypy/typeshed/stdlib/uuid.pyi +100 -0
- mypy/typeshed/stdlib/venv/__init__.pyi +79 -0
- mypy/typeshed/stdlib/warnings.pyi +112 -0
- mypy/typeshed/stdlib/wave.pyi +85 -0
- mypy/typeshed/stdlib/weakref.pyi +150 -0
- mypy/typeshed/stdlib/webbrowser.pyi +74 -0
- mypy/typeshed/stdlib/winreg.pyi +103 -0
- mypy/typeshed/stdlib/winsound.pyi +28 -0
- mypy/typeshed/stdlib/wsgiref/__init__.pyi +0 -0
- mypy/typeshed/stdlib/wsgiref/handlers.pyi +91 -0
- mypy/typeshed/stdlib/wsgiref/headers.pyi +26 -0
- mypy/typeshed/stdlib/wsgiref/simple_server.pyi +37 -0
- mypy/typeshed/stdlib/wsgiref/types.pyi +32 -0
- mypy/typeshed/stdlib/wsgiref/util.pyi +24 -0
- mypy/typeshed/stdlib/wsgiref/validate.pyi +50 -0
- mypy/typeshed/stdlib/xdrlib.pyi +57 -0
- mypy/typeshed/stdlib/xml/__init__.pyi +1 -0
- mypy/typeshed/stdlib/xml/dom/NodeFilter.pyi +19 -0
- mypy/typeshed/stdlib/xml/dom/__init__.pyi +69 -0
- mypy/typeshed/stdlib/xml/dom/domreg.pyi +8 -0
- mypy/typeshed/stdlib/xml/dom/expatbuilder.pyi +100 -0
- mypy/typeshed/stdlib/xml/dom/minicompat.pyi +22 -0
- mypy/typeshed/stdlib/xml/dom/minidom.pyi +404 -0
- mypy/typeshed/stdlib/xml/dom/pulldom.pyi +94 -0
- mypy/typeshed/stdlib/xml/dom/xmlbuilder.pyi +108 -0
- mypy/typeshed/stdlib/xml/etree/ElementInclude.pyi +28 -0
- mypy/typeshed/stdlib/xml/etree/ElementPath.pyi +34 -0
- mypy/typeshed/stdlib/xml/etree/ElementTree.pyi +321 -0
- mypy/typeshed/stdlib/xml/etree/__init__.pyi +0 -0
- mypy/typeshed/stdlib/xml/etree/cElementTree.pyi +1 -0
- mypy/typeshed/stdlib/xml/parsers/__init__.pyi +1 -0
- mypy/typeshed/stdlib/xml/parsers/expat/__init__.pyi +1 -0
- mypy/typeshed/stdlib/xml/parsers/expat/errors.pyi +1 -0
- mypy/typeshed/stdlib/xml/parsers/expat/model.pyi +1 -0
- mypy/typeshed/stdlib/xml/sax/__init__.pyi +25 -0
- mypy/typeshed/stdlib/xml/sax/_exceptions.pyi +19 -0
- mypy/typeshed/stdlib/xml/sax/handler.pyi +55 -0
- mypy/typeshed/stdlib/xml/sax/saxutils.pyi +60 -0
- mypy/typeshed/stdlib/xml/sax/xmlreader.pyi +87 -0
- mypy/typeshed/stdlib/xmlrpc/__init__.pyi +0 -0
- mypy/typeshed/stdlib/xmlrpc/client.pyi +296 -0
- mypy/typeshed/stdlib/xmlrpc/server.pyi +143 -0
- mypy/typeshed/stdlib/xxlimited.pyi +22 -0
- mypy/typeshed/stdlib/zipapp.pyi +20 -0
- mypy/typeshed/stdlib/zipfile/__init__.pyi +306 -0
- mypy/typeshed/stdlib/zipfile/_path.pyi +95 -0
- mypy/typeshed/stdlib/zipimport.pyi +32 -0
- mypy/typeshed/stdlib/zlib.pyi +56 -0
- mypy/typeshed/stdlib/zoneinfo/__init__.pyi +38 -0
- mypy/typeshed/stubs/mypy-extensions/mypy_extensions.pyi +218 -0
- mypy/typestate.py +323 -0
- mypy/typetraverser.py +142 -0
- mypy/typevars.py +93 -0
- mypy/typevartuples.py +32 -0
- mypy/util.py +869 -0
- mypy/version.py +1 -0
- mypy/visitor.py +621 -0
- mypy/xml/mypy-html.css +104 -0
- mypy/xml/mypy-html.xslt +81 -0
- mypy/xml/mypy-txt.xslt +100 -0
- mypy/xml/mypy.xsd +50 -0
- mypy_dev-1.9.0.dev0.dist-info/LICENSE +229 -0
- mypy_dev-1.9.0.dev0.dist-info/METADATA +39 -0
- mypy_dev-1.9.0.dev0.dist-info/RECORD +1018 -0
- mypy_dev-1.9.0.dev0.dist-info/WHEEL +5 -0
- mypy_dev-1.9.0.dev0.dist-info/entry_points.txt +6 -0
- mypy_dev-1.9.0.dev0.dist-info/top_level.txt +2 -0
- mypyc/README.md +133 -0
- mypyc/__init__.py +0 -0
- mypyc/__main__.py +57 -0
- mypyc/analysis/__init__.py +0 -0
- mypyc/analysis/attrdefined.py +436 -0
- mypyc/analysis/blockfreq.py +32 -0
- mypyc/analysis/dataflow.py +624 -0
- mypyc/analysis/ircheck.py +429 -0
- mypyc/analysis/selfleaks.py +207 -0
- mypyc/build.py +616 -0
- mypyc/codegen/__init__.py +0 -0
- mypyc/codegen/cstring.py +54 -0
- mypyc/codegen/emit.py +1193 -0
- mypyc/codegen/emitclass.py +1060 -0
- mypyc/codegen/emitfunc.py +846 -0
- mypyc/codegen/emitmodule.py +1131 -0
- mypyc/codegen/emitwrapper.py +979 -0
- mypyc/codegen/literals.py +302 -0
- mypyc/common.py +136 -0
- mypyc/crash.py +31 -0
- mypyc/doc/Makefile +20 -0
- mypyc/doc/bool_operations.rst +27 -0
- mypyc/doc/compilation_units.rst +20 -0
- mypyc/doc/conf.py +59 -0
- mypyc/doc/cpython-timings.md +25 -0
- mypyc/doc/dev-intro.md +548 -0
- mypyc/doc/dict_operations.rst +59 -0
- mypyc/doc/differences_from_python.rst +332 -0
- mypyc/doc/float_operations.rst +50 -0
- mypyc/doc/future.md +42 -0
- mypyc/doc/getting_started.rst +240 -0
- mypyc/doc/index.rst +61 -0
- mypyc/doc/int_operations.rst +162 -0
- mypyc/doc/introduction.rst +150 -0
- mypyc/doc/list_operations.rst +65 -0
- mypyc/doc/make.bat +35 -0
- mypyc/doc/native_classes.rst +206 -0
- mypyc/doc/native_operations.rst +55 -0
- mypyc/doc/performance_tips_and_tricks.rst +244 -0
- mypyc/doc/set_operations.rst +47 -0
- mypyc/doc/str_operations.rst +35 -0
- mypyc/doc/tuple_operations.rst +33 -0
- mypyc/doc/using_type_annotations.rst +398 -0
- mypyc/errors.py +29 -0
- mypyc/external/googletest/LICENSE +28 -0
- mypyc/external/googletest/README.md +280 -0
- mypyc/external/googletest/include/gtest/gtest-death-test.h +294 -0
- mypyc/external/googletest/include/gtest/gtest-message.h +250 -0
- mypyc/external/googletest/include/gtest/gtest-param-test.h +1444 -0
- mypyc/external/googletest/include/gtest/gtest-param-test.h.pump +510 -0
- mypyc/external/googletest/include/gtest/gtest-printers.h +993 -0
- mypyc/external/googletest/include/gtest/gtest-spi.h +232 -0
- mypyc/external/googletest/include/gtest/gtest-test-part.h +179 -0
- mypyc/external/googletest/include/gtest/gtest-typed-test.h +263 -0
- mypyc/external/googletest/include/gtest/gtest.h +2236 -0
- mypyc/external/googletest/include/gtest/gtest_pred_impl.h +358 -0
- mypyc/external/googletest/include/gtest/gtest_prod.h +58 -0
- mypyc/external/googletest/include/gtest/internal/custom/gtest-port.h +69 -0
- mypyc/external/googletest/include/gtest/internal/custom/gtest-printers.h +42 -0
- mypyc/external/googletest/include/gtest/internal/custom/gtest.h +41 -0
- mypyc/external/googletest/include/gtest/internal/gtest-death-test-internal.h +319 -0
- mypyc/external/googletest/include/gtest/internal/gtest-filepath.h +206 -0
- mypyc/external/googletest/include/gtest/internal/gtest-internal.h +1238 -0
- mypyc/external/googletest/include/gtest/internal/gtest-linked_ptr.h +243 -0
- mypyc/external/googletest/include/gtest/internal/gtest-param-util-generated.h +5146 -0
- mypyc/external/googletest/include/gtest/internal/gtest-param-util-generated.h.pump +286 -0
- mypyc/external/googletest/include/gtest/internal/gtest-param-util.h +731 -0
- mypyc/external/googletest/include/gtest/internal/gtest-port-arch.h +93 -0
- mypyc/external/googletest/include/gtest/internal/gtest-port.h +2560 -0
- mypyc/external/googletest/include/gtest/internal/gtest-string.h +167 -0
- mypyc/external/googletest/include/gtest/internal/gtest-tuple.h +1020 -0
- mypyc/external/googletest/include/gtest/internal/gtest-tuple.h.pump +347 -0
- mypyc/external/googletest/include/gtest/internal/gtest-type-util.h +3331 -0
- mypyc/external/googletest/include/gtest/internal/gtest-type-util.h.pump +297 -0
- mypyc/external/googletest/make/Makefile +61 -0
- mypyc/external/googletest/src/gtest-all.cc +48 -0
- mypyc/external/googletest/src/gtest-death-test.cc +1342 -0
- mypyc/external/googletest/src/gtest-filepath.cc +387 -0
- mypyc/external/googletest/src/gtest-internal-inl.h +1183 -0
- mypyc/external/googletest/src/gtest-port.cc +1259 -0
- mypyc/external/googletest/src/gtest-printers.cc +373 -0
- mypyc/external/googletest/src/gtest-test-part.cc +110 -0
- mypyc/external/googletest/src/gtest-typed-test.cc +118 -0
- mypyc/external/googletest/src/gtest.cc +5388 -0
- mypyc/external/googletest/src/gtest_main.cc +38 -0
- mypyc/ir/__init__.py +0 -0
- mypyc/ir/class_ir.py +499 -0
- mypyc/ir/func_ir.py +370 -0
- mypyc/ir/module_ir.py +88 -0
- mypyc/ir/ops.py +1642 -0
- mypyc/ir/pprint.py +496 -0
- mypyc/ir/rtypes.py +1038 -0
- mypyc/irbuild/__init__.py +0 -0
- mypyc/irbuild/ast_helpers.py +120 -0
- mypyc/irbuild/builder.py +1398 -0
- mypyc/irbuild/callable_class.py +173 -0
- mypyc/irbuild/classdef.py +850 -0
- mypyc/irbuild/constant_fold.py +95 -0
- mypyc/irbuild/context.py +186 -0
- mypyc/irbuild/env_class.py +223 -0
- mypyc/irbuild/expression.py +1067 -0
- mypyc/irbuild/for_helpers.py +1046 -0
- mypyc/irbuild/format_str_tokenizer.py +250 -0
- mypyc/irbuild/function.py +1089 -0
- mypyc/irbuild/generator.py +346 -0
- mypyc/irbuild/ll_builder.py +2407 -0
- mypyc/irbuild/main.py +153 -0
- mypyc/irbuild/mapper.py +221 -0
- mypyc/irbuild/match.py +355 -0
- mypyc/irbuild/nonlocalcontrol.py +197 -0
- mypyc/irbuild/prebuildvisitor.py +203 -0
- mypyc/irbuild/prepare.py +609 -0
- mypyc/irbuild/specialize.py +822 -0
- mypyc/irbuild/statement.py +1017 -0
- mypyc/irbuild/targets.py +57 -0
- mypyc/irbuild/util.py +189 -0
- mypyc/irbuild/visitor.py +401 -0
- mypyc/irbuild/vtable.py +82 -0
- mypyc/lib-rt/CPy.h +643 -0
- mypyc/lib-rt/bytes_ops.c +143 -0
- mypyc/lib-rt/dict_ops.c +446 -0
- mypyc/lib-rt/exc_ops.c +259 -0
- mypyc/lib-rt/float_ops.c +192 -0
- mypyc/lib-rt/generic_ops.c +64 -0
- mypyc/lib-rt/getargs.c +450 -0
- mypyc/lib-rt/getargsfast.c +569 -0
- mypyc/lib-rt/init.c +13 -0
- mypyc/lib-rt/int_ops.c +803 -0
- mypyc/lib-rt/list_ops.c +335 -0
- mypyc/lib-rt/misc_ops.c +942 -0
- mypyc/lib-rt/module_shim.tmpl +18 -0
- mypyc/lib-rt/mypyc_util.h +118 -0
- mypyc/lib-rt/pythoncapi_compat.h +497 -0
- mypyc/lib-rt/pythonsupport.h +548 -0
- mypyc/lib-rt/set_ops.c +17 -0
- mypyc/lib-rt/setup.py +70 -0
- mypyc/lib-rt/str_ops.c +241 -0
- mypyc/lib-rt/test_capi.cc +585 -0
- mypyc/lib-rt/tuple_ops.c +61 -0
- mypyc/namegen.py +115 -0
- mypyc/options.py +32 -0
- mypyc/primitives/__init__.py +0 -0
- mypyc/primitives/bytes_ops.py +101 -0
- mypyc/primitives/dict_ops.py +325 -0
- mypyc/primitives/exc_ops.py +101 -0
- mypyc/primitives/float_ops.py +168 -0
- mypyc/primitives/generic_ops.py +384 -0
- mypyc/primitives/int_ops.py +304 -0
- mypyc/primitives/list_ops.py +300 -0
- mypyc/primitives/misc_ops.py +241 -0
- mypyc/primitives/registry.py +323 -0
- mypyc/primitives/set_ops.py +121 -0
- mypyc/primitives/str_ops.py +229 -0
- mypyc/primitives/tuple_ops.py +83 -0
- mypyc/rt_subtype.py +77 -0
- mypyc/sametype.py +83 -0
- mypyc/subtype.py +88 -0
- mypyc/test/__init__.py +0 -0
- mypyc/test/config.py +13 -0
- mypyc/test/test_alwaysdefined.py +46 -0
- mypyc/test/test_analysis.py +77 -0
- mypyc/test/test_cheader.py +45 -0
- mypyc/test/test_commandline.py +82 -0
- mypyc/test/test_emit.py +69 -0
- mypyc/test/test_emitclass.py +35 -0
- mypyc/test/test_emitfunc.py +926 -0
- mypyc/test/test_emitwrapper.py +60 -0
- mypyc/test/test_exceptions.py +56 -0
- mypyc/test/test_external.py +49 -0
- mypyc/test/test_irbuild.py +87 -0
- mypyc/test/test_ircheck.py +199 -0
- mypyc/test/test_literals.py +90 -0
- mypyc/test/test_namegen.py +48 -0
- mypyc/test/test_pprint.py +42 -0
- mypyc/test/test_rarray.py +48 -0
- mypyc/test/test_refcount.py +59 -0
- mypyc/test/test_run.py +426 -0
- mypyc/test/test_serialization.py +108 -0
- mypyc/test/test_struct.py +112 -0
- mypyc/test/test_tuplename.py +33 -0
- mypyc/test/test_typeops.py +97 -0
- mypyc/test/testutil.py +283 -0
- mypyc/test-data/alwaysdefined.test +732 -0
- mypyc/test-data/analysis.test +603 -0
- mypyc/test-data/commandline.test +245 -0
- mypyc/test-data/driver/driver.py +48 -0
- mypyc/test-data/exceptions-freq.test +125 -0
- mypyc/test-data/exceptions.test +713 -0
- mypyc/test-data/fixtures/ir.py +373 -0
- mypyc/test-data/fixtures/testutil.py +103 -0
- mypyc/test-data/fixtures/typing-full.pyi +169 -0
- mypyc/test-data/irbuild-any.test +238 -0
- mypyc/test-data/irbuild-basic.test +3690 -0
- mypyc/test-data/irbuild-bool.test +463 -0
- mypyc/test-data/irbuild-bytes.test +184 -0
- mypyc/test-data/irbuild-classes.test +1303 -0
- mypyc/test-data/irbuild-constant-fold.test +480 -0
- mypyc/test-data/irbuild-dict.test +585 -0
- mypyc/test-data/irbuild-dunders.test +223 -0
- mypyc/test-data/irbuild-float.test +497 -0
- mypyc/test-data/irbuild-generics.test +151 -0
- mypyc/test-data/irbuild-glue-methods.test +437 -0
- mypyc/test-data/irbuild-i16.test +526 -0
- mypyc/test-data/irbuild-i32.test +598 -0
- mypyc/test-data/irbuild-i64.test +2164 -0
- mypyc/test-data/irbuild-int.test +235 -0
- mypyc/test-data/irbuild-isinstance.test +109 -0
- mypyc/test-data/irbuild-lists.test +547 -0
- mypyc/test-data/irbuild-match.test +1708 -0
- mypyc/test-data/irbuild-math.test +64 -0
- mypyc/test-data/irbuild-nested.test +807 -0
- mypyc/test-data/irbuild-optional.test +536 -0
- mypyc/test-data/irbuild-set.test +838 -0
- mypyc/test-data/irbuild-singledispatch.test +257 -0
- mypyc/test-data/irbuild-statements.test +1149 -0
- mypyc/test-data/irbuild-str.test +314 -0
- mypyc/test-data/irbuild-strip-asserts.test +12 -0
- mypyc/test-data/irbuild-try.test +523 -0
- mypyc/test-data/irbuild-tuple.test +462 -0
- mypyc/test-data/irbuild-u8.test +543 -0
- mypyc/test-data/irbuild-unreachable.test +241 -0
- mypyc/test-data/irbuild-vectorcall.test +153 -0
- mypyc/test-data/refcount.test +1588 -0
- mypyc/test-data/run-async.test +145 -0
- mypyc/test-data/run-attrs.test +318 -0
- mypyc/test-data/run-bench.test +196 -0
- mypyc/test-data/run-bools.test +229 -0
- mypyc/test-data/run-bytes.test +302 -0
- mypyc/test-data/run-classes.test +2505 -0
- mypyc/test-data/run-dicts.test +334 -0
- mypyc/test-data/run-dunders.test +945 -0
- mypyc/test-data/run-exceptions.test +448 -0
- mypyc/test-data/run-floats.test +516 -0
- mypyc/test-data/run-functions.test +1310 -0
- mypyc/test-data/run-generators.test +681 -0
- mypyc/test-data/run-i16.test +338 -0
- mypyc/test-data/run-i32.test +336 -0
- mypyc/test-data/run-i64.test +1519 -0
- mypyc/test-data/run-imports.test +265 -0
- mypyc/test-data/run-integers.test +540 -0
- mypyc/test-data/run-lists.test +411 -0
- mypyc/test-data/run-loops.test +485 -0
- mypyc/test-data/run-match.test +283 -0
- mypyc/test-data/run-math.test +106 -0
- mypyc/test-data/run-misc.test +1168 -0
- mypyc/test-data/run-multimodule.test +887 -0
- mypyc/test-data/run-mypy-sim.test +138 -0
- mypyc/test-data/run-primitives.test +375 -0
- mypyc/test-data/run-python37.test +159 -0
- mypyc/test-data/run-python38.test +88 -0
- mypyc/test-data/run-sets.test +150 -0
- mypyc/test-data/run-singledispatch.test +698 -0
- mypyc/test-data/run-strings.test +641 -0
- mypyc/test-data/run-traits.test +411 -0
- mypyc/test-data/run-tuples.test +258 -0
- mypyc/test-data/run-u8.test +303 -0
- mypyc/transform/__init__.py +0 -0
- mypyc/transform/exceptions.py +182 -0
- mypyc/transform/refcount.py +294 -0
- mypyc/transform/uninit.py +190 -0
mypy/fscache.py
ADDED
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
"""Interface for accessing the file system with automatic caching.
|
|
2
|
+
|
|
3
|
+
The idea is to cache the results of any file system state reads during
|
|
4
|
+
a single transaction. This has two main benefits:
|
|
5
|
+
|
|
6
|
+
* This avoids redundant syscalls, as we won't perform the same OS
|
|
7
|
+
operations multiple times.
|
|
8
|
+
|
|
9
|
+
* This makes it easier to reason about concurrent FS updates, as different
|
|
10
|
+
operations targeting the same paths can't report different state during
|
|
11
|
+
a transaction.
|
|
12
|
+
|
|
13
|
+
Note that this only deals with reading state, not writing.
|
|
14
|
+
|
|
15
|
+
Properties maintained by the API:
|
|
16
|
+
|
|
17
|
+
* The contents of the file are always from the same or later time compared
|
|
18
|
+
to the reported mtime of the file, even if mtime is queried after reading
|
|
19
|
+
a file.
|
|
20
|
+
|
|
21
|
+
* Repeating an operation produces the same result as the first one during
|
|
22
|
+
a transaction.
|
|
23
|
+
|
|
24
|
+
* Call flush() to start a new transaction (flush the caches).
|
|
25
|
+
|
|
26
|
+
The API is a bit limited. It's easy to add new cached operations, however.
|
|
27
|
+
You should perform all file system reads through the API to actually take
|
|
28
|
+
advantage of the benefits.
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
from __future__ import annotations
|
|
32
|
+
|
|
33
|
+
import os
|
|
34
|
+
import stat
|
|
35
|
+
|
|
36
|
+
from mypy_extensions import mypyc_attr
|
|
37
|
+
|
|
38
|
+
from mypy.util import hash_digest
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
@mypyc_attr(allow_interpreted_subclasses=True) # for tests
|
|
42
|
+
class FileSystemCache:
|
|
43
|
+
def __init__(self) -> None:
|
|
44
|
+
# The package root is not flushed with the caches.
|
|
45
|
+
# It is set by set_package_root() below.
|
|
46
|
+
self.package_root: list[str] = []
|
|
47
|
+
self.flush()
|
|
48
|
+
|
|
49
|
+
def set_package_root(self, package_root: list[str]) -> None:
|
|
50
|
+
self.package_root = package_root
|
|
51
|
+
|
|
52
|
+
def flush(self) -> None:
|
|
53
|
+
"""Start another transaction and empty all caches."""
|
|
54
|
+
self.stat_cache: dict[str, os.stat_result] = {}
|
|
55
|
+
self.stat_error_cache: dict[str, OSError] = {}
|
|
56
|
+
self.listdir_cache: dict[str, list[str]] = {}
|
|
57
|
+
self.listdir_error_cache: dict[str, OSError] = {}
|
|
58
|
+
self.isfile_case_cache: dict[str, bool] = {}
|
|
59
|
+
self.exists_case_cache: dict[str, bool] = {}
|
|
60
|
+
self.read_cache: dict[str, bytes] = {}
|
|
61
|
+
self.read_error_cache: dict[str, Exception] = {}
|
|
62
|
+
self.hash_cache: dict[str, str] = {}
|
|
63
|
+
self.fake_package_cache: set[str] = set()
|
|
64
|
+
|
|
65
|
+
def stat(self, path: str) -> os.stat_result:
|
|
66
|
+
if path in self.stat_cache:
|
|
67
|
+
return self.stat_cache[path]
|
|
68
|
+
if path in self.stat_error_cache:
|
|
69
|
+
raise copy_os_error(self.stat_error_cache[path])
|
|
70
|
+
try:
|
|
71
|
+
st = os.stat(path)
|
|
72
|
+
except OSError as err:
|
|
73
|
+
if self.init_under_package_root(path):
|
|
74
|
+
try:
|
|
75
|
+
return self._fake_init(path)
|
|
76
|
+
except OSError:
|
|
77
|
+
pass
|
|
78
|
+
# Take a copy to get rid of associated traceback and frame objects.
|
|
79
|
+
# Just assigning to __traceback__ doesn't free them.
|
|
80
|
+
self.stat_error_cache[path] = copy_os_error(err)
|
|
81
|
+
raise err
|
|
82
|
+
self.stat_cache[path] = st
|
|
83
|
+
return st
|
|
84
|
+
|
|
85
|
+
def init_under_package_root(self, path: str) -> bool:
|
|
86
|
+
"""Is this path an __init__.py under a package root?
|
|
87
|
+
|
|
88
|
+
This is used to detect packages that don't contain __init__.py
|
|
89
|
+
files, which is needed to support Bazel. The function should
|
|
90
|
+
only be called for non-existing files.
|
|
91
|
+
|
|
92
|
+
It will return True if it refers to a __init__.py file that
|
|
93
|
+
Bazel would create, so that at runtime Python would think the
|
|
94
|
+
directory containing it is a package. For this to work you
|
|
95
|
+
must pass one or more package roots using the --package-root
|
|
96
|
+
flag.
|
|
97
|
+
|
|
98
|
+
As an exceptional case, any directory that is a package root
|
|
99
|
+
itself will not be considered to contain a __init__.py file.
|
|
100
|
+
This is different from the rules Bazel itself applies, but is
|
|
101
|
+
necessary for mypy to properly distinguish packages from other
|
|
102
|
+
directories.
|
|
103
|
+
|
|
104
|
+
See https://docs.bazel.build/versions/master/be/python.html,
|
|
105
|
+
where this behavior is described under legacy_create_init.
|
|
106
|
+
"""
|
|
107
|
+
if not self.package_root:
|
|
108
|
+
return False
|
|
109
|
+
dirname, basename = os.path.split(path)
|
|
110
|
+
if basename != "__init__.py":
|
|
111
|
+
return False
|
|
112
|
+
if not os.path.basename(dirname).isidentifier():
|
|
113
|
+
# Can't put an __init__.py in a place that's not an identifier
|
|
114
|
+
return False
|
|
115
|
+
try:
|
|
116
|
+
st = self.stat(dirname)
|
|
117
|
+
except OSError:
|
|
118
|
+
return False
|
|
119
|
+
else:
|
|
120
|
+
if not stat.S_ISDIR(st.st_mode):
|
|
121
|
+
return False
|
|
122
|
+
ok = False
|
|
123
|
+
drive, path = os.path.splitdrive(path) # Ignore Windows drive name
|
|
124
|
+
if os.path.isabs(path):
|
|
125
|
+
path = os.path.relpath(path)
|
|
126
|
+
path = os.path.normpath(path)
|
|
127
|
+
for root in self.package_root:
|
|
128
|
+
if path.startswith(root):
|
|
129
|
+
if path == root + basename:
|
|
130
|
+
# A package root itself is never a package.
|
|
131
|
+
ok = False
|
|
132
|
+
break
|
|
133
|
+
else:
|
|
134
|
+
ok = True
|
|
135
|
+
return ok
|
|
136
|
+
|
|
137
|
+
def _fake_init(self, path: str) -> os.stat_result:
|
|
138
|
+
"""Prime the cache with a fake __init__.py file.
|
|
139
|
+
|
|
140
|
+
This makes code that looks for path believe an empty file by
|
|
141
|
+
that name exists. Should only be called after
|
|
142
|
+
init_under_package_root() returns True.
|
|
143
|
+
"""
|
|
144
|
+
dirname, basename = os.path.split(path)
|
|
145
|
+
assert basename == "__init__.py", path
|
|
146
|
+
assert not os.path.exists(path), path # Not cached!
|
|
147
|
+
dirname = os.path.normpath(dirname)
|
|
148
|
+
st = self.stat(dirname) # May raise OSError
|
|
149
|
+
# Get stat result as a list so we can modify it.
|
|
150
|
+
seq: list[float] = list(st)
|
|
151
|
+
seq[stat.ST_MODE] = stat.S_IFREG | 0o444
|
|
152
|
+
seq[stat.ST_INO] = 1
|
|
153
|
+
seq[stat.ST_NLINK] = 1
|
|
154
|
+
seq[stat.ST_SIZE] = 0
|
|
155
|
+
st = os.stat_result(seq)
|
|
156
|
+
self.stat_cache[path] = st
|
|
157
|
+
# Make listdir() and read() also pretend this file exists.
|
|
158
|
+
self.fake_package_cache.add(dirname)
|
|
159
|
+
return st
|
|
160
|
+
|
|
161
|
+
def listdir(self, path: str) -> list[str]:
|
|
162
|
+
path = os.path.normpath(path)
|
|
163
|
+
if path in self.listdir_cache:
|
|
164
|
+
res = self.listdir_cache[path]
|
|
165
|
+
# Check the fake cache.
|
|
166
|
+
if path in self.fake_package_cache and "__init__.py" not in res:
|
|
167
|
+
res.append("__init__.py") # Updates the result as well as the cache
|
|
168
|
+
return res
|
|
169
|
+
if path in self.listdir_error_cache:
|
|
170
|
+
raise copy_os_error(self.listdir_error_cache[path])
|
|
171
|
+
try:
|
|
172
|
+
results = os.listdir(path)
|
|
173
|
+
except OSError as err:
|
|
174
|
+
# Like above, take a copy to reduce memory use.
|
|
175
|
+
self.listdir_error_cache[path] = copy_os_error(err)
|
|
176
|
+
raise err
|
|
177
|
+
self.listdir_cache[path] = results
|
|
178
|
+
# Check the fake cache.
|
|
179
|
+
if path in self.fake_package_cache and "__init__.py" not in results:
|
|
180
|
+
results.append("__init__.py")
|
|
181
|
+
return results
|
|
182
|
+
|
|
183
|
+
def isfile(self, path: str) -> bool:
|
|
184
|
+
try:
|
|
185
|
+
st = self.stat(path)
|
|
186
|
+
except OSError:
|
|
187
|
+
return False
|
|
188
|
+
return stat.S_ISREG(st.st_mode)
|
|
189
|
+
|
|
190
|
+
def isfile_case(self, path: str, prefix: str) -> bool:
|
|
191
|
+
"""Return whether path exists and is a file.
|
|
192
|
+
|
|
193
|
+
On case-insensitive filesystems (like Mac or Windows) this returns
|
|
194
|
+
False if the case of path's last component does not exactly match
|
|
195
|
+
the case found in the filesystem.
|
|
196
|
+
|
|
197
|
+
We check also the case of other path components up to prefix.
|
|
198
|
+
For example, if path is 'user-stubs/pack/mod.pyi' and prefix is 'user-stubs',
|
|
199
|
+
we check that the case of 'pack' and 'mod.py' matches exactly, 'user-stubs' will be
|
|
200
|
+
case insensitive on case insensitive filesystems.
|
|
201
|
+
|
|
202
|
+
The caller must ensure that prefix is a valid file system prefix of path.
|
|
203
|
+
"""
|
|
204
|
+
if not self.isfile(path):
|
|
205
|
+
# Fast path
|
|
206
|
+
return False
|
|
207
|
+
if path in self.isfile_case_cache:
|
|
208
|
+
return self.isfile_case_cache[path]
|
|
209
|
+
head, tail = os.path.split(path)
|
|
210
|
+
if not tail:
|
|
211
|
+
self.isfile_case_cache[path] = False
|
|
212
|
+
return False
|
|
213
|
+
try:
|
|
214
|
+
names = self.listdir(head)
|
|
215
|
+
# This allows one to check file name case sensitively in
|
|
216
|
+
# case-insensitive filesystems.
|
|
217
|
+
res = tail in names
|
|
218
|
+
except OSError:
|
|
219
|
+
res = False
|
|
220
|
+
if res:
|
|
221
|
+
# Also recursively check the other path components in case sensitive way.
|
|
222
|
+
res = self.exists_case(head, prefix)
|
|
223
|
+
self.isfile_case_cache[path] = res
|
|
224
|
+
return res
|
|
225
|
+
|
|
226
|
+
def exists_case(self, path: str, prefix: str) -> bool:
|
|
227
|
+
"""Return whether path exists - checking path components in case sensitive
|
|
228
|
+
fashion, up to prefix.
|
|
229
|
+
"""
|
|
230
|
+
if path in self.exists_case_cache:
|
|
231
|
+
return self.exists_case_cache[path]
|
|
232
|
+
head, tail = os.path.split(path)
|
|
233
|
+
if not head.startswith(prefix) or not tail:
|
|
234
|
+
# Only perform the check for paths under prefix.
|
|
235
|
+
self.exists_case_cache[path] = True
|
|
236
|
+
return True
|
|
237
|
+
try:
|
|
238
|
+
names = self.listdir(head)
|
|
239
|
+
# This allows one to check file name case sensitively in
|
|
240
|
+
# case-insensitive filesystems.
|
|
241
|
+
res = tail in names
|
|
242
|
+
except OSError:
|
|
243
|
+
res = False
|
|
244
|
+
if res:
|
|
245
|
+
# Also recursively check other path components.
|
|
246
|
+
res = self.exists_case(head, prefix)
|
|
247
|
+
self.exists_case_cache[path] = res
|
|
248
|
+
return res
|
|
249
|
+
|
|
250
|
+
def isdir(self, path: str) -> bool:
|
|
251
|
+
try:
|
|
252
|
+
st = self.stat(path)
|
|
253
|
+
except OSError:
|
|
254
|
+
return False
|
|
255
|
+
return stat.S_ISDIR(st.st_mode)
|
|
256
|
+
|
|
257
|
+
def exists(self, path: str) -> bool:
|
|
258
|
+
try:
|
|
259
|
+
self.stat(path)
|
|
260
|
+
except FileNotFoundError:
|
|
261
|
+
return False
|
|
262
|
+
return True
|
|
263
|
+
|
|
264
|
+
def read(self, path: str) -> bytes:
|
|
265
|
+
if path in self.read_cache:
|
|
266
|
+
return self.read_cache[path]
|
|
267
|
+
if path in self.read_error_cache:
|
|
268
|
+
raise self.read_error_cache[path]
|
|
269
|
+
|
|
270
|
+
# Need to stat first so that the contents of file are from no
|
|
271
|
+
# earlier instant than the mtime reported by self.stat().
|
|
272
|
+
self.stat(path)
|
|
273
|
+
|
|
274
|
+
dirname, basename = os.path.split(path)
|
|
275
|
+
dirname = os.path.normpath(dirname)
|
|
276
|
+
# Check the fake cache.
|
|
277
|
+
if basename == "__init__.py" and dirname in self.fake_package_cache:
|
|
278
|
+
data = b""
|
|
279
|
+
else:
|
|
280
|
+
try:
|
|
281
|
+
with open(path, "rb") as f:
|
|
282
|
+
data = f.read()
|
|
283
|
+
except OSError as err:
|
|
284
|
+
self.read_error_cache[path] = err
|
|
285
|
+
raise
|
|
286
|
+
|
|
287
|
+
self.read_cache[path] = data
|
|
288
|
+
self.hash_cache[path] = hash_digest(data)
|
|
289
|
+
return data
|
|
290
|
+
|
|
291
|
+
def hash_digest(self, path: str) -> str:
|
|
292
|
+
if path not in self.hash_cache:
|
|
293
|
+
self.read(path)
|
|
294
|
+
return self.hash_cache[path]
|
|
295
|
+
|
|
296
|
+
def samefile(self, f1: str, f2: str) -> bool:
|
|
297
|
+
s1 = self.stat(f1)
|
|
298
|
+
s2 = self.stat(f2)
|
|
299
|
+
return os.path.samestat(s1, s2)
|
|
300
|
+
|
|
301
|
+
|
|
302
|
+
def copy_os_error(e: OSError) -> OSError:
|
|
303
|
+
new = OSError(*e.args)
|
|
304
|
+
new.errno = e.errno
|
|
305
|
+
new.strerror = e.strerror
|
|
306
|
+
new.filename = e.filename
|
|
307
|
+
if e.filename2:
|
|
308
|
+
new.filename2 = e.filename2
|
|
309
|
+
return new
|
mypy/fswatcher.py
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"""Watch parts of the file system for changes."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import AbstractSet, Iterable, NamedTuple
|
|
6
|
+
|
|
7
|
+
from mypy.fscache import FileSystemCache
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class FileData(NamedTuple):
|
|
11
|
+
st_mtime: float
|
|
12
|
+
st_size: int
|
|
13
|
+
hash: str
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class FileSystemWatcher:
|
|
17
|
+
"""Watcher for file system changes among specific paths.
|
|
18
|
+
|
|
19
|
+
All file system access is performed using FileSystemCache. We
|
|
20
|
+
detect changed files by stat()ing them all and comparing hashes
|
|
21
|
+
of potentially changed files. If a file has both size and mtime
|
|
22
|
+
unmodified, the file is assumed to be unchanged.
|
|
23
|
+
|
|
24
|
+
An important goal of this class is to make it easier to eventually
|
|
25
|
+
use file system events to detect file changes.
|
|
26
|
+
|
|
27
|
+
Note: This class doesn't flush the file system cache. If you don't
|
|
28
|
+
manually flush it, changes won't be seen.
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
# TODO: Watching directories?
|
|
32
|
+
# TODO: Handle non-files
|
|
33
|
+
|
|
34
|
+
def __init__(self, fs: FileSystemCache) -> None:
|
|
35
|
+
self.fs = fs
|
|
36
|
+
self._paths: set[str] = set()
|
|
37
|
+
self._file_data: dict[str, FileData | None] = {}
|
|
38
|
+
|
|
39
|
+
def dump_file_data(self) -> dict[str, tuple[float, int, str]]:
|
|
40
|
+
return {k: v for k, v in self._file_data.items() if v is not None}
|
|
41
|
+
|
|
42
|
+
def set_file_data(self, path: str, data: FileData) -> None:
|
|
43
|
+
self._file_data[path] = data
|
|
44
|
+
|
|
45
|
+
def add_watched_paths(self, paths: Iterable[str]) -> None:
|
|
46
|
+
for path in paths:
|
|
47
|
+
if path not in self._paths:
|
|
48
|
+
# By storing None this path will get reported as changed by
|
|
49
|
+
# find_changed if it exists.
|
|
50
|
+
self._file_data[path] = None
|
|
51
|
+
self._paths |= set(paths)
|
|
52
|
+
|
|
53
|
+
def remove_watched_paths(self, paths: Iterable[str]) -> None:
|
|
54
|
+
for path in paths:
|
|
55
|
+
if path in self._file_data:
|
|
56
|
+
del self._file_data[path]
|
|
57
|
+
self._paths -= set(paths)
|
|
58
|
+
|
|
59
|
+
def _update(self, path: str) -> None:
|
|
60
|
+
st = self.fs.stat(path)
|
|
61
|
+
hash_digest = self.fs.hash_digest(path)
|
|
62
|
+
self._file_data[path] = FileData(st.st_mtime, st.st_size, hash_digest)
|
|
63
|
+
|
|
64
|
+
def _find_changed(self, paths: Iterable[str]) -> AbstractSet[str]:
|
|
65
|
+
changed = set()
|
|
66
|
+
for path in paths:
|
|
67
|
+
old = self._file_data[path]
|
|
68
|
+
try:
|
|
69
|
+
st = self.fs.stat(path)
|
|
70
|
+
except FileNotFoundError:
|
|
71
|
+
if old is not None:
|
|
72
|
+
# File was deleted.
|
|
73
|
+
changed.add(path)
|
|
74
|
+
self._file_data[path] = None
|
|
75
|
+
else:
|
|
76
|
+
if old is None:
|
|
77
|
+
# File is new.
|
|
78
|
+
changed.add(path)
|
|
79
|
+
self._update(path)
|
|
80
|
+
# Round mtimes down, to match the mtimes we write to meta files
|
|
81
|
+
elif st.st_size != old.st_size or int(st.st_mtime) != int(old.st_mtime):
|
|
82
|
+
# Only look for changes if size or mtime has changed as an
|
|
83
|
+
# optimization, since calculating hash is expensive.
|
|
84
|
+
new_hash = self.fs.hash_digest(path)
|
|
85
|
+
self._update(path)
|
|
86
|
+
if st.st_size != old.st_size or new_hash != old.hash:
|
|
87
|
+
# Changed file.
|
|
88
|
+
changed.add(path)
|
|
89
|
+
return changed
|
|
90
|
+
|
|
91
|
+
def find_changed(self) -> AbstractSet[str]:
|
|
92
|
+
"""Return paths that have changes since the last call, in the watched set."""
|
|
93
|
+
return self._find_changed(self._paths)
|
|
94
|
+
|
|
95
|
+
def update_changed(self, remove: list[str], update: list[str]) -> AbstractSet[str]:
|
|
96
|
+
"""Alternative to find_changed() given explicit changes.
|
|
97
|
+
|
|
98
|
+
This only calls self.fs.stat() on added or updated files, not
|
|
99
|
+
on all files. It believes all other files are unchanged!
|
|
100
|
+
|
|
101
|
+
Implies add_watched_paths() for add and update, and
|
|
102
|
+
remove_watched_paths() for remove.
|
|
103
|
+
"""
|
|
104
|
+
self.remove_watched_paths(remove)
|
|
105
|
+
self.add_watched_paths(update)
|
|
106
|
+
return self._find_changed(update)
|
mypy/gclogger.py
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import gc
|
|
4
|
+
import time
|
|
5
|
+
from typing import Mapping
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class GcLogger:
|
|
9
|
+
"""Context manager to log GC stats and overall time."""
|
|
10
|
+
|
|
11
|
+
def __enter__(self) -> GcLogger:
|
|
12
|
+
self.gc_start_time: float | None = None
|
|
13
|
+
self.gc_time = 0.0
|
|
14
|
+
self.gc_calls = 0
|
|
15
|
+
self.gc_collected = 0
|
|
16
|
+
self.gc_uncollectable = 0
|
|
17
|
+
gc.callbacks.append(self.gc_callback)
|
|
18
|
+
self.start_time = time.time()
|
|
19
|
+
return self
|
|
20
|
+
|
|
21
|
+
def gc_callback(self, phase: str, info: Mapping[str, int]) -> None:
|
|
22
|
+
if phase == "start":
|
|
23
|
+
assert self.gc_start_time is None, "Start phase out of sequence"
|
|
24
|
+
self.gc_start_time = time.time()
|
|
25
|
+
elif phase == "stop":
|
|
26
|
+
assert self.gc_start_time is not None, "Stop phase out of sequence"
|
|
27
|
+
self.gc_calls += 1
|
|
28
|
+
self.gc_time += time.time() - self.gc_start_time
|
|
29
|
+
self.gc_start_time = None
|
|
30
|
+
self.gc_collected += info["collected"]
|
|
31
|
+
self.gc_uncollectable += info["uncollectable"]
|
|
32
|
+
else:
|
|
33
|
+
assert False, f"Unrecognized gc phase ({phase!r})"
|
|
34
|
+
|
|
35
|
+
def __exit__(self, *args: object) -> None:
|
|
36
|
+
while self.gc_callback in gc.callbacks:
|
|
37
|
+
gc.callbacks.remove(self.gc_callback)
|
|
38
|
+
|
|
39
|
+
def get_stats(self) -> Mapping[str, float]:
|
|
40
|
+
end_time = time.time()
|
|
41
|
+
result = {}
|
|
42
|
+
result["gc_time"] = self.gc_time
|
|
43
|
+
result["gc_calls"] = self.gc_calls
|
|
44
|
+
result["gc_collected"] = self.gc_collected
|
|
45
|
+
result["gc_uncollectable"] = self.gc_uncollectable
|
|
46
|
+
result["build_time"] = end_time - self.start_time
|
|
47
|
+
return result
|
mypy/git.py
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"""Git utilities."""
|
|
2
|
+
|
|
3
|
+
# Used also from setup.py, so don't pull in anything additional here (like mypy or typing):
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
import os
|
|
7
|
+
import subprocess
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def is_git_repo(dir: str) -> bool:
|
|
11
|
+
"""Is the given directory version-controlled with git?"""
|
|
12
|
+
return os.path.exists(os.path.join(dir, ".git"))
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def have_git() -> bool:
|
|
16
|
+
"""Can we run the git executable?"""
|
|
17
|
+
try:
|
|
18
|
+
subprocess.check_output(["git", "--help"])
|
|
19
|
+
return True
|
|
20
|
+
except subprocess.CalledProcessError:
|
|
21
|
+
return False
|
|
22
|
+
except OSError:
|
|
23
|
+
return False
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def git_revision(dir: str) -> bytes:
|
|
27
|
+
"""Get the SHA-1 of the HEAD of a git repository."""
|
|
28
|
+
return subprocess.check_output(["git", "rev-parse", "HEAD"], cwd=dir).strip()
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def is_dirty(dir: str) -> bool:
|
|
32
|
+
"""Check whether a git repository has uncommitted changes."""
|
|
33
|
+
output = subprocess.check_output(["git", "status", "-uno", "--porcelain"], cwd=dir)
|
|
34
|
+
return output.strip() != b""
|
mypy/graph_utils.py
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"""Helpers for manipulations with graphs."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import AbstractSet, Iterable, Iterator, TypeVar
|
|
6
|
+
|
|
7
|
+
T = TypeVar("T")
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def strongly_connected_components(
|
|
11
|
+
vertices: AbstractSet[T], edges: dict[T, list[T]]
|
|
12
|
+
) -> Iterator[set[T]]:
|
|
13
|
+
"""Compute Strongly Connected Components of a directed graph.
|
|
14
|
+
|
|
15
|
+
Args:
|
|
16
|
+
vertices: the labels for the vertices
|
|
17
|
+
edges: for each vertex, gives the target vertices of its outgoing edges
|
|
18
|
+
|
|
19
|
+
Returns:
|
|
20
|
+
An iterator yielding strongly connected components, each
|
|
21
|
+
represented as a set of vertices. Each input vertex will occur
|
|
22
|
+
exactly once; vertices not part of a SCC are returned as
|
|
23
|
+
singleton sets.
|
|
24
|
+
|
|
25
|
+
From https://code.activestate.com/recipes/578507/.
|
|
26
|
+
"""
|
|
27
|
+
identified: set[T] = set()
|
|
28
|
+
stack: list[T] = []
|
|
29
|
+
index: dict[T, int] = {}
|
|
30
|
+
boundaries: list[int] = []
|
|
31
|
+
|
|
32
|
+
def dfs(v: T) -> Iterator[set[T]]:
|
|
33
|
+
index[v] = len(stack)
|
|
34
|
+
stack.append(v)
|
|
35
|
+
boundaries.append(index[v])
|
|
36
|
+
|
|
37
|
+
for w in edges[v]:
|
|
38
|
+
if w not in index:
|
|
39
|
+
yield from dfs(w)
|
|
40
|
+
elif w not in identified:
|
|
41
|
+
while index[w] < boundaries[-1]:
|
|
42
|
+
boundaries.pop()
|
|
43
|
+
|
|
44
|
+
if boundaries[-1] == index[v]:
|
|
45
|
+
boundaries.pop()
|
|
46
|
+
scc = set(stack[index[v] :])
|
|
47
|
+
del stack[index[v] :]
|
|
48
|
+
identified.update(scc)
|
|
49
|
+
yield scc
|
|
50
|
+
|
|
51
|
+
for v in vertices:
|
|
52
|
+
if v not in index:
|
|
53
|
+
yield from dfs(v)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def prepare_sccs(
|
|
57
|
+
sccs: list[set[T]], edges: dict[T, list[T]]
|
|
58
|
+
) -> dict[AbstractSet[T], set[AbstractSet[T]]]:
|
|
59
|
+
"""Use original edges to organize SCCs in a graph by dependencies between them."""
|
|
60
|
+
sccsmap = {v: frozenset(scc) for scc in sccs for v in scc}
|
|
61
|
+
data: dict[AbstractSet[T], set[AbstractSet[T]]] = {}
|
|
62
|
+
for scc in sccs:
|
|
63
|
+
deps: set[AbstractSet[T]] = set()
|
|
64
|
+
for v in scc:
|
|
65
|
+
deps.update(sccsmap[x] for x in edges[v])
|
|
66
|
+
data[frozenset(scc)] = deps
|
|
67
|
+
return data
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def topsort(data: dict[T, set[T]]) -> Iterable[set[T]]:
|
|
71
|
+
"""Topological sort.
|
|
72
|
+
|
|
73
|
+
Args:
|
|
74
|
+
data: A map from vertices to all vertices that it has an edge
|
|
75
|
+
connecting it to. NOTE: This data structure
|
|
76
|
+
is modified in place -- for normalization purposes,
|
|
77
|
+
self-dependencies are removed and entries representing
|
|
78
|
+
orphans are added.
|
|
79
|
+
|
|
80
|
+
Returns:
|
|
81
|
+
An iterator yielding sets of vertices that have an equivalent
|
|
82
|
+
ordering.
|
|
83
|
+
|
|
84
|
+
Example:
|
|
85
|
+
Suppose the input has the following structure:
|
|
86
|
+
|
|
87
|
+
{A: {B, C}, B: {D}, C: {D}}
|
|
88
|
+
|
|
89
|
+
This is normalized to:
|
|
90
|
+
|
|
91
|
+
{A: {B, C}, B: {D}, C: {D}, D: {}}
|
|
92
|
+
|
|
93
|
+
The algorithm will yield the following values:
|
|
94
|
+
|
|
95
|
+
{D}
|
|
96
|
+
{B, C}
|
|
97
|
+
{A}
|
|
98
|
+
|
|
99
|
+
From https://code.activestate.com/recipes/577413/.
|
|
100
|
+
"""
|
|
101
|
+
# TODO: Use a faster algorithm?
|
|
102
|
+
for k, v in data.items():
|
|
103
|
+
v.discard(k) # Ignore self dependencies.
|
|
104
|
+
for item in set.union(*data.values()) - set(data.keys()):
|
|
105
|
+
data[item] = set()
|
|
106
|
+
while True:
|
|
107
|
+
ready = {item for item, dep in data.items() if not dep}
|
|
108
|
+
if not ready:
|
|
109
|
+
break
|
|
110
|
+
yield ready
|
|
111
|
+
data = {item: (dep - ready) for item, dep in data.items() if item not in ready}
|
|
112
|
+
assert not data, f"A cyclic dependency exists amongst {data!r}"
|