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.
Files changed (1018) hide show
  1. mypy/__init__.py +1 -0
  2. mypy/__main__.py +37 -0
  3. mypy/api.py +94 -0
  4. mypy/applytype.py +156 -0
  5. mypy/argmap.py +268 -0
  6. mypy/binder.py +538 -0
  7. mypy/bogus_type.py +27 -0
  8. mypy/build.py +3562 -0
  9. mypy/checker.py +8372 -0
  10. mypy/checkexpr.py +6615 -0
  11. mypy/checkmember.py +1356 -0
  12. mypy/checkpattern.py +801 -0
  13. mypy/checkstrformat.py +1109 -0
  14. mypy/config_parser.py +670 -0
  15. mypy/constant_fold.py +187 -0
  16. mypy/constraints.py +1624 -0
  17. mypy/copytype.py +133 -0
  18. mypy/defaults.py +46 -0
  19. mypy/dmypy/__init__.py +0 -0
  20. mypy/dmypy/__main__.py +6 -0
  21. mypy/dmypy/client.py +749 -0
  22. mypy/dmypy_os.py +42 -0
  23. mypy/dmypy_server.py +1107 -0
  24. mypy/dmypy_util.py +117 -0
  25. mypy/erasetype.py +278 -0
  26. mypy/errorcodes.py +285 -0
  27. mypy/errors.py +1280 -0
  28. mypy/evalexpr.py +205 -0
  29. mypy/expandtype.py +510 -0
  30. mypy/exprtotype.py +206 -0
  31. mypy/fastparse.py +2147 -0
  32. mypy/find_sources.py +243 -0
  33. mypy/fixup.py +426 -0
  34. mypy/freetree.py +23 -0
  35. mypy/fscache.py +309 -0
  36. mypy/fswatcher.py +106 -0
  37. mypy/gclogger.py +47 -0
  38. mypy/git.py +34 -0
  39. mypy/graph_utils.py +112 -0
  40. mypy/indirection.py +121 -0
  41. mypy/infer.py +75 -0
  42. mypy/inspections.py +627 -0
  43. mypy/ipc.py +310 -0
  44. mypy/join.py +866 -0
  45. mypy/literals.py +306 -0
  46. mypy/lookup.py +61 -0
  47. mypy/main.py +1574 -0
  48. mypy/maptype.py +106 -0
  49. mypy/meet.py +1140 -0
  50. mypy/memprofile.py +121 -0
  51. mypy/message_registry.py +326 -0
  52. mypy/messages.py +3171 -0
  53. mypy/metastore.py +225 -0
  54. mypy/mixedtraverser.py +112 -0
  55. mypy/modulefinder.py +875 -0
  56. mypy/moduleinspect.py +184 -0
  57. mypy/mro.py +62 -0
  58. mypy/nodes.py +4112 -0
  59. mypy/operators.py +126 -0
  60. mypy/options.py +556 -0
  61. mypy/parse.py +30 -0
  62. mypy/partially_defined.py +675 -0
  63. mypy/patterns.py +150 -0
  64. mypy/plugin.py +901 -0
  65. mypy/plugins/__init__.py +0 -0
  66. mypy/plugins/attrs.py +1152 -0
  67. mypy/plugins/common.py +440 -0
  68. mypy/plugins/ctypes.py +245 -0
  69. mypy/plugins/dataclasses.py +1101 -0
  70. mypy/plugins/default.py +518 -0
  71. mypy/plugins/enums.py +259 -0
  72. mypy/plugins/functools.py +104 -0
  73. mypy/plugins/proper_plugin.py +175 -0
  74. mypy/plugins/singledispatch.py +224 -0
  75. mypy/py.typed +1 -0
  76. mypy/pyinfo.py +78 -0
  77. mypy/reachability.py +362 -0
  78. mypy/refinfo.py +92 -0
  79. mypy/renaming.py +568 -0
  80. mypy/report.py +924 -0
  81. mypy/scope.py +125 -0
  82. mypy/semanal.py +7023 -0
  83. mypy/semanal_classprop.py +187 -0
  84. mypy/semanal_enum.py +253 -0
  85. mypy/semanal_infer.py +128 -0
  86. mypy/semanal_main.py +511 -0
  87. mypy/semanal_namedtuple.py +670 -0
  88. mypy/semanal_newtype.py +273 -0
  89. mypy/semanal_pass1.py +156 -0
  90. mypy/semanal_shared.py +490 -0
  91. mypy/semanal_typeargs.py +265 -0
  92. mypy/semanal_typeddict.py +575 -0
  93. mypy/server/__init__.py +0 -0
  94. mypy/server/astdiff.py +518 -0
  95. mypy/server/astmerge.py +562 -0
  96. mypy/server/aststrip.py +281 -0
  97. mypy/server/deps.py +1137 -0
  98. mypy/server/mergecheck.py +83 -0
  99. mypy/server/objgraph.py +101 -0
  100. mypy/server/subexpr.py +198 -0
  101. mypy/server/target.py +11 -0
  102. mypy/server/trigger.py +26 -0
  103. mypy/server/update.py +1339 -0
  104. mypy/sharedparse.py +112 -0
  105. mypy/solve.py +562 -0
  106. mypy/split_namespace.py +35 -0
  107. mypy/state.py +28 -0
  108. mypy/stats.py +489 -0
  109. mypy/strconv.py +641 -0
  110. mypy/stubdoc.py +491 -0
  111. mypy/stubgen.py +1873 -0
  112. mypy/stubgenc.py +993 -0
  113. mypy/stubinfo.py +173 -0
  114. mypy/stubtest.py +2079 -0
  115. mypy/stubutil.py +807 -0
  116. mypy/subtypes.py +1967 -0
  117. mypy/suggestions.py +1046 -0
  118. mypy/test/__init__.py +0 -0
  119. mypy/test/config.py +28 -0
  120. mypy/test/data.py +823 -0
  121. mypy/test/helpers.py +476 -0
  122. mypy/test/meta/__init__.py +0 -0
  123. mypy/test/meta/_pytest.py +72 -0
  124. mypy/test/meta/test_diff_helper.py +47 -0
  125. mypy/test/meta/test_parse_data.py +73 -0
  126. mypy/test/meta/test_update_data.py +135 -0
  127. mypy/test/test_find_sources.py +376 -0
  128. mypy/test/test_ref_info.py +45 -0
  129. mypy/test/testapi.py +45 -0
  130. mypy/test/testargs.py +77 -0
  131. mypy/test/testcheck.py +322 -0
  132. mypy/test/testcmdline.py +152 -0
  133. mypy/test/testconstraints.py +134 -0
  134. mypy/test/testdaemon.py +132 -0
  135. mypy/test/testdeps.py +77 -0
  136. mypy/test/testdiff.py +67 -0
  137. mypy/test/testerrorstream.py +46 -0
  138. mypy/test/testfinegrained.py +438 -0
  139. mypy/test/testfinegrainedcache.py +18 -0
  140. mypy/test/testformatter.py +85 -0
  141. mypy/test/testfscache.py +101 -0
  142. mypy/test/testgraph.py +83 -0
  143. mypy/test/testinfer.py +373 -0
  144. mypy/test/testipc.py +119 -0
  145. mypy/test/testmerge.py +238 -0
  146. mypy/test/testmodulefinder.py +278 -0
  147. mypy/test/testmypyc.py +14 -0
  148. mypy/test/testparse.py +107 -0
  149. mypy/test/testpep561.py +211 -0
  150. mypy/test/testpythoneval.py +117 -0
  151. mypy/test/testreports.py +55 -0
  152. mypy/test/testsemanal.py +209 -0
  153. mypy/test/testsolve.py +285 -0
  154. mypy/test/teststubgen.py +1412 -0
  155. mypy/test/teststubinfo.py +12 -0
  156. mypy/test/teststubtest.py +2492 -0
  157. mypy/test/testsubtypes.py +303 -0
  158. mypy/test/testtransform.py +64 -0
  159. mypy/test/testtypegen.py +83 -0
  160. mypy/test/testtypes.py +1551 -0
  161. mypy/test/testutil.py +111 -0
  162. mypy/test/typefixture.py +415 -0
  163. mypy/test/update_data.py +87 -0
  164. mypy/test/visitors.py +63 -0
  165. mypy/traverser.py +961 -0
  166. mypy/treetransform.py +800 -0
  167. mypy/tvar_scope.py +147 -0
  168. mypy/type_visitor.py +564 -0
  169. mypy/typeanal.py +2510 -0
  170. mypy/typeops.py +1082 -0
  171. mypy/types.py +3686 -0
  172. mypy/types_utils.py +166 -0
  173. mypy/typeshed/LICENSE +237 -0
  174. mypy/typeshed/stdlib/VERSIONS +308 -0
  175. mypy/typeshed/stdlib/__future__.pyi +36 -0
  176. mypy/typeshed/stdlib/__main__.pyi +3 -0
  177. mypy/typeshed/stdlib/_ast.pyi +587 -0
  178. mypy/typeshed/stdlib/_bisect.pyi +84 -0
  179. mypy/typeshed/stdlib/_bootlocale.pyi +1 -0
  180. mypy/typeshed/stdlib/_codecs.pyi +133 -0
  181. mypy/typeshed/stdlib/_collections_abc.pyi +94 -0
  182. mypy/typeshed/stdlib/_compat_pickle.pyi +8 -0
  183. mypy/typeshed/stdlib/_compression.pyi +25 -0
  184. mypy/typeshed/stdlib/_csv.pyi +90 -0
  185. mypy/typeshed/stdlib/_ctypes.pyi +205 -0
  186. mypy/typeshed/stdlib/_curses.pyi +557 -0
  187. mypy/typeshed/stdlib/_decimal.pyi +281 -0
  188. mypy/typeshed/stdlib/_dummy_thread.pyi +27 -0
  189. mypy/typeshed/stdlib/_dummy_threading.pyi +164 -0
  190. mypy/typeshed/stdlib/_heapq.pyi +11 -0
  191. mypy/typeshed/stdlib/_imp.pyi +28 -0
  192. mypy/typeshed/stdlib/_json.pyi +49 -0
  193. mypy/typeshed/stdlib/_locale.pyi +100 -0
  194. mypy/typeshed/stdlib/_markupbase.pyi +16 -0
  195. mypy/typeshed/stdlib/_msi.pyi +91 -0
  196. mypy/typeshed/stdlib/_operator.pyi +147 -0
  197. mypy/typeshed/stdlib/_osx_support.pyi +34 -0
  198. mypy/typeshed/stdlib/_posixsubprocess.pyi +32 -0
  199. mypy/typeshed/stdlib/_py_abc.pyi +14 -0
  200. mypy/typeshed/stdlib/_pydecimal.pyi +43 -0
  201. mypy/typeshed/stdlib/_random.pyi +12 -0
  202. mypy/typeshed/stdlib/_sitebuiltins.pyi +16 -0
  203. mypy/typeshed/stdlib/_socket.pyi +802 -0
  204. mypy/typeshed/stdlib/_stat.pyi +103 -0
  205. mypy/typeshed/stdlib/_thread.pyi +52 -0
  206. mypy/typeshed/stdlib/_threading_local.pyi +17 -0
  207. mypy/typeshed/stdlib/_tkinter.pyi +120 -0
  208. mypy/typeshed/stdlib/_tracemalloc.pyi +17 -0
  209. mypy/typeshed/stdlib/_typeshed/__init__.pyi +347 -0
  210. mypy/typeshed/stdlib/_typeshed/dbapi.pyi +37 -0
  211. mypy/typeshed/stdlib/_typeshed/wsgi.pyi +44 -0
  212. mypy/typeshed/stdlib/_typeshed/xml.pyi +9 -0
  213. mypy/typeshed/stdlib/_warnings.pyi +55 -0
  214. mypy/typeshed/stdlib/_weakref.pyi +41 -0
  215. mypy/typeshed/stdlib/_weakrefset.pyi +51 -0
  216. mypy/typeshed/stdlib/_winapi.pyi +251 -0
  217. mypy/typeshed/stdlib/abc.pyi +49 -0
  218. mypy/typeshed/stdlib/aifc.pyi +91 -0
  219. mypy/typeshed/stdlib/antigravity.pyi +3 -0
  220. mypy/typeshed/stdlib/argparse.pyi +571 -0
  221. mypy/typeshed/stdlib/array.pyi +92 -0
  222. mypy/typeshed/stdlib/ast.pyi +277 -0
  223. mypy/typeshed/stdlib/asynchat.pyi +21 -0
  224. mypy/typeshed/stdlib/asyncio/__init__.pyi +41 -0
  225. mypy/typeshed/stdlib/asyncio/base_events.pyi +440 -0
  226. mypy/typeshed/stdlib/asyncio/base_futures.pyi +19 -0
  227. mypy/typeshed/stdlib/asyncio/base_subprocess.pyi +63 -0
  228. mypy/typeshed/stdlib/asyncio/base_tasks.pyi +9 -0
  229. mypy/typeshed/stdlib/asyncio/constants.pyi +20 -0
  230. mypy/typeshed/stdlib/asyncio/coroutines.pyi +26 -0
  231. mypy/typeshed/stdlib/asyncio/events.pyi +574 -0
  232. mypy/typeshed/stdlib/asyncio/exceptions.pyi +43 -0
  233. mypy/typeshed/stdlib/asyncio/format_helpers.pyi +20 -0
  234. mypy/typeshed/stdlib/asyncio/futures.pyi +57 -0
  235. mypy/typeshed/stdlib/asyncio/locks.pyi +121 -0
  236. mypy/typeshed/stdlib/asyncio/log.pyi +3 -0
  237. mypy/typeshed/stdlib/asyncio/mixins.pyi +9 -0
  238. mypy/typeshed/stdlib/asyncio/proactor_events.pyi +64 -0
  239. mypy/typeshed/stdlib/asyncio/protocols.pyi +34 -0
  240. mypy/typeshed/stdlib/asyncio/queues.pyi +47 -0
  241. mypy/typeshed/stdlib/asyncio/runners.pyi +32 -0
  242. mypy/typeshed/stdlib/asyncio/selector_events.pyi +8 -0
  243. mypy/typeshed/stdlib/asyncio/sslproto.pyi +163 -0
  244. mypy/typeshed/stdlib/asyncio/staggered.pyi +10 -0
  245. mypy/typeshed/stdlib/asyncio/streams.pyi +148 -0
  246. mypy/typeshed/stdlib/asyncio/subprocess.pyi +229 -0
  247. mypy/typeshed/stdlib/asyncio/taskgroups.pyi +25 -0
  248. mypy/typeshed/stdlib/asyncio/tasks.pyi +477 -0
  249. mypy/typeshed/stdlib/asyncio/threads.pyi +9 -0
  250. mypy/typeshed/stdlib/asyncio/timeouts.pyi +19 -0
  251. mypy/typeshed/stdlib/asyncio/transports.pyi +47 -0
  252. mypy/typeshed/stdlib/asyncio/trsock.pyi +98 -0
  253. mypy/typeshed/stdlib/asyncio/unix_events.pyi +173 -0
  254. mypy/typeshed/stdlib/asyncio/windows_events.pyi +83 -0
  255. mypy/typeshed/stdlib/asyncio/windows_utils.pyi +49 -0
  256. mypy/typeshed/stdlib/asyncore.pyi +90 -0
  257. mypy/typeshed/stdlib/atexit.pyi +12 -0
  258. mypy/typeshed/stdlib/audioop.pyi +42 -0
  259. mypy/typeshed/stdlib/base64.pyi +59 -0
  260. mypy/typeshed/stdlib/bdb.pyi +102 -0
  261. mypy/typeshed/stdlib/binascii.pyi +36 -0
  262. mypy/typeshed/stdlib/binhex.pyi +45 -0
  263. mypy/typeshed/stdlib/bisect.pyi +4 -0
  264. mypy/typeshed/stdlib/builtins.pyi +1937 -0
  265. mypy/typeshed/stdlib/bz2.pyi +146 -0
  266. mypy/typeshed/stdlib/cProfile.pyi +35 -0
  267. mypy/typeshed/stdlib/calendar.pyi +206 -0
  268. mypy/typeshed/stdlib/cgi.pyi +118 -0
  269. mypy/typeshed/stdlib/cgitb.pyi +32 -0
  270. mypy/typeshed/stdlib/chunk.pyi +20 -0
  271. mypy/typeshed/stdlib/cmath.pyi +36 -0
  272. mypy/typeshed/stdlib/cmd.pyi +45 -0
  273. mypy/typeshed/stdlib/code.pyi +33 -0
  274. mypy/typeshed/stdlib/codecs.pyi +285 -0
  275. mypy/typeshed/stdlib/codeop.pyi +13 -0
  276. mypy/typeshed/stdlib/collections/__init__.pyi +477 -0
  277. mypy/typeshed/stdlib/collections/abc.pyi +2 -0
  278. mypy/typeshed/stdlib/colorsys.pyi +13 -0
  279. mypy/typeshed/stdlib/compileall.pyi +111 -0
  280. mypy/typeshed/stdlib/concurrent/__init__.pyi +0 -0
  281. mypy/typeshed/stdlib/concurrent/futures/__init__.pyi +32 -0
  282. mypy/typeshed/stdlib/concurrent/futures/_base.pyi +120 -0
  283. mypy/typeshed/stdlib/concurrent/futures/process.pyi +233 -0
  284. mypy/typeshed/stdlib/concurrent/futures/thread.pyi +80 -0
  285. mypy/typeshed/stdlib/configparser.pyi +313 -0
  286. mypy/typeshed/stdlib/contextlib.pyi +207 -0
  287. mypy/typeshed/stdlib/contextvars.pyi +63 -0
  288. mypy/typeshed/stdlib/copy.pyi +16 -0
  289. mypy/typeshed/stdlib/copyreg.pyi +21 -0
  290. mypy/typeshed/stdlib/crypt.pyi +12 -0
  291. mypy/typeshed/stdlib/csv.pyi +147 -0
  292. mypy/typeshed/stdlib/ctypes/__init__.pyi +187 -0
  293. mypy/typeshed/stdlib/ctypes/_endian.pyi +19 -0
  294. mypy/typeshed/stdlib/ctypes/util.pyi +6 -0
  295. mypy/typeshed/stdlib/ctypes/wintypes.pyi +298 -0
  296. mypy/typeshed/stdlib/curses/__init__.pyi +21 -0
  297. mypy/typeshed/stdlib/curses/ascii.pyi +63 -0
  298. mypy/typeshed/stdlib/curses/has_key.pyi +4 -0
  299. mypy/typeshed/stdlib/curses/panel.pyi +25 -0
  300. mypy/typeshed/stdlib/curses/textpad.pyi +13 -0
  301. mypy/typeshed/stdlib/dataclasses.pyi +313 -0
  302. mypy/typeshed/stdlib/datetime.pyi +295 -0
  303. mypy/typeshed/stdlib/dbm/__init__.pyi +95 -0
  304. mypy/typeshed/stdlib/dbm/dumb.pyi +31 -0
  305. mypy/typeshed/stdlib/dbm/gnu.pyi +40 -0
  306. mypy/typeshed/stdlib/dbm/ndbm.pyi +36 -0
  307. mypy/typeshed/stdlib/decimal.pyi +2 -0
  308. mypy/typeshed/stdlib/difflib.pyi +140 -0
  309. mypy/typeshed/stdlib/dis.pyi +144 -0
  310. mypy/typeshed/stdlib/distutils/__init__.pyi +5 -0
  311. mypy/typeshed/stdlib/distutils/archive_util.pyi +20 -0
  312. mypy/typeshed/stdlib/distutils/bcppcompiler.pyi +3 -0
  313. mypy/typeshed/stdlib/distutils/ccompiler.pyi +152 -0
  314. mypy/typeshed/stdlib/distutils/cmd.pyi +66 -0
  315. mypy/typeshed/stdlib/distutils/command/__init__.pyi +0 -0
  316. mypy/typeshed/stdlib/distutils/command/bdist.pyi +25 -0
  317. mypy/typeshed/stdlib/distutils/command/bdist_dumb.pyi +21 -0
  318. mypy/typeshed/stdlib/distutils/command/bdist_msi.pyi +45 -0
  319. mypy/typeshed/stdlib/distutils/command/bdist_packager.pyi +0 -0
  320. mypy/typeshed/stdlib/distutils/command/bdist_rpm.pyi +52 -0
  321. mypy/typeshed/stdlib/distutils/command/bdist_wininst.pyi +16 -0
  322. mypy/typeshed/stdlib/distutils/command/build.pyi +31 -0
  323. mypy/typeshed/stdlib/distutils/command/build_clib.pyi +27 -0
  324. mypy/typeshed/stdlib/distutils/command/build_ext.pyi +50 -0
  325. mypy/typeshed/stdlib/distutils/command/build_py.pyi +44 -0
  326. mypy/typeshed/stdlib/distutils/command/build_scripts.pyi +24 -0
  327. mypy/typeshed/stdlib/distutils/command/check.pyi +39 -0
  328. mypy/typeshed/stdlib/distutils/command/clean.pyi +17 -0
  329. mypy/typeshed/stdlib/distutils/command/config.pyi +83 -0
  330. mypy/typeshed/stdlib/distutils/command/install.pyi +63 -0
  331. mypy/typeshed/stdlib/distutils/command/install_data.pyi +19 -0
  332. mypy/typeshed/stdlib/distutils/command/install_egg_info.pyi +18 -0
  333. mypy/typeshed/stdlib/distutils/command/install_headers.pyi +16 -0
  334. mypy/typeshed/stdlib/distutils/command/install_lib.pyi +25 -0
  335. mypy/typeshed/stdlib/distutils/command/install_scripts.pyi +18 -0
  336. mypy/typeshed/stdlib/distutils/command/register.pyi +18 -0
  337. mypy/typeshed/stdlib/distutils/command/sdist.pyi +42 -0
  338. mypy/typeshed/stdlib/distutils/command/upload.pyi +17 -0
  339. mypy/typeshed/stdlib/distutils/config.pyi +17 -0
  340. mypy/typeshed/stdlib/distutils/core.pyi +57 -0
  341. mypy/typeshed/stdlib/distutils/cygwinccompiler.pyi +20 -0
  342. mypy/typeshed/stdlib/distutils/debug.pyi +1 -0
  343. mypy/typeshed/stdlib/distutils/dep_util.pyi +3 -0
  344. mypy/typeshed/stdlib/distutils/dir_util.pyi +13 -0
  345. mypy/typeshed/stdlib/distutils/dist.pyi +146 -0
  346. mypy/typeshed/stdlib/distutils/errors.pyi +19 -0
  347. mypy/typeshed/stdlib/distutils/extension.pyi +36 -0
  348. mypy/typeshed/stdlib/distutils/fancy_getopt.pyi +34 -0
  349. mypy/typeshed/stdlib/distutils/file_util.pyi +14 -0
  350. mypy/typeshed/stdlib/distutils/filelist.pyi +50 -0
  351. mypy/typeshed/stdlib/distutils/log.pyi +25 -0
  352. mypy/typeshed/stdlib/distutils/msvccompiler.pyi +3 -0
  353. mypy/typeshed/stdlib/distutils/spawn.pyi +2 -0
  354. mypy/typeshed/stdlib/distutils/sysconfig.pyi +22 -0
  355. mypy/typeshed/stdlib/distutils/text_file.pyi +21 -0
  356. mypy/typeshed/stdlib/distutils/unixccompiler.pyi +3 -0
  357. mypy/typeshed/stdlib/distutils/util.pyi +46 -0
  358. mypy/typeshed/stdlib/distutils/version.pyi +36 -0
  359. mypy/typeshed/stdlib/doctest.pyi +248 -0
  360. mypy/typeshed/stdlib/dummy_threading.pyi +2 -0
  361. mypy/typeshed/stdlib/email/__init__.pyi +29 -0
  362. mypy/typeshed/stdlib/email/_header_value_parser.pyi +392 -0
  363. mypy/typeshed/stdlib/email/_policybase.pyi +51 -0
  364. mypy/typeshed/stdlib/email/base64mime.pyi +13 -0
  365. mypy/typeshed/stdlib/email/charset.pyi +34 -0
  366. mypy/typeshed/stdlib/email/contentmanager.pyi +11 -0
  367. mypy/typeshed/stdlib/email/encoders.pyi +8 -0
  368. mypy/typeshed/stdlib/email/errors.pyi +39 -0
  369. mypy/typeshed/stdlib/email/feedparser.pyi +23 -0
  370. mypy/typeshed/stdlib/email/generator.pyi +40 -0
  371. mypy/typeshed/stdlib/email/header.pyi +31 -0
  372. mypy/typeshed/stdlib/email/headerregistry.pyi +178 -0
  373. mypy/typeshed/stdlib/email/iterators.pyi +12 -0
  374. mypy/typeshed/stdlib/email/message.pyi +161 -0
  375. mypy/typeshed/stdlib/email/mime/__init__.pyi +0 -0
  376. mypy/typeshed/stdlib/email/mime/application.pyi +17 -0
  377. mypy/typeshed/stdlib/email/mime/audio.pyi +17 -0
  378. mypy/typeshed/stdlib/email/mime/base.pyi +8 -0
  379. mypy/typeshed/stdlib/email/mime/image.pyi +17 -0
  380. mypy/typeshed/stdlib/email/mime/message.pyi +8 -0
  381. mypy/typeshed/stdlib/email/mime/multipart.pyi +18 -0
  382. mypy/typeshed/stdlib/email/mime/nonmultipart.pyi +5 -0
  383. mypy/typeshed/stdlib/email/mime/text.pyi +9 -0
  384. mypy/typeshed/stdlib/email/parser.pyi +26 -0
  385. mypy/typeshed/stdlib/email/policy.pyi +38 -0
  386. mypy/typeshed/stdlib/email/quoprimime.pyi +28 -0
  387. mypy/typeshed/stdlib/email/utils.pyi +66 -0
  388. mypy/typeshed/stdlib/encodings/__init__.pyi +10 -0
  389. mypy/typeshed/stdlib/encodings/utf_8.pyi +21 -0
  390. mypy/typeshed/stdlib/encodings/utf_8_sig.pyi +22 -0
  391. mypy/typeshed/stdlib/ensurepip/__init__.pyi +12 -0
  392. mypy/typeshed/stdlib/enum.pyi +317 -0
  393. mypy/typeshed/stdlib/errno.pyi +222 -0
  394. mypy/typeshed/stdlib/faulthandler.pyi +13 -0
  395. mypy/typeshed/stdlib/fcntl.pyi +127 -0
  396. mypy/typeshed/stdlib/filecmp.pyi +57 -0
  397. mypy/typeshed/stdlib/fileinput.pyi +213 -0
  398. mypy/typeshed/stdlib/fnmatch.pyi +9 -0
  399. mypy/typeshed/stdlib/formatter.pyi +88 -0
  400. mypy/typeshed/stdlib/fractions.pyi +150 -0
  401. mypy/typeshed/stdlib/ftplib.pyi +178 -0
  402. mypy/typeshed/stdlib/functools.pyi +200 -0
  403. mypy/typeshed/stdlib/gc.pyi +37 -0
  404. mypy/typeshed/stdlib/genericpath.pyi +52 -0
  405. mypy/typeshed/stdlib/getopt.pyi +11 -0
  406. mypy/typeshed/stdlib/getpass.pyi +8 -0
  407. mypy/typeshed/stdlib/gettext.pyi +169 -0
  408. mypy/typeshed/stdlib/glob.pyi +42 -0
  409. mypy/typeshed/stdlib/graphlib.pyi +28 -0
  410. mypy/typeshed/stdlib/grp.pyi +21 -0
  411. mypy/typeshed/stdlib/gzip.pyi +160 -0
  412. mypy/typeshed/stdlib/hashlib.pyi +165 -0
  413. mypy/typeshed/stdlib/heapq.pyi +17 -0
  414. mypy/typeshed/stdlib/hmac.pyi +38 -0
  415. mypy/typeshed/stdlib/html/__init__.pyi +6 -0
  416. mypy/typeshed/stdlib/html/entities.pyi +6 -0
  417. mypy/typeshed/stdlib/html/parser.pyi +34 -0
  418. mypy/typeshed/stdlib/http/__init__.pyi +105 -0
  419. mypy/typeshed/stdlib/http/client.pyi +259 -0
  420. mypy/typeshed/stdlib/http/cookiejar.pyi +159 -0
  421. mypy/typeshed/stdlib/http/cookies.pyi +60 -0
  422. mypy/typeshed/stdlib/http/server.pyi +83 -0
  423. mypy/typeshed/stdlib/imaplib.pyi +168 -0
  424. mypy/typeshed/stdlib/imghdr.pyi +17 -0
  425. mypy/typeshed/stdlib/imp.pyi +62 -0
  426. mypy/typeshed/stdlib/importlib/__init__.pyi +24 -0
  427. mypy/typeshed/stdlib/importlib/_abc.pyi +15 -0
  428. mypy/typeshed/stdlib/importlib/abc.pyi +172 -0
  429. mypy/typeshed/stdlib/importlib/machinery.pyi +179 -0
  430. mypy/typeshed/stdlib/importlib/metadata/__init__.pyi +276 -0
  431. mypy/typeshed/stdlib/importlib/metadata/_meta.pyi +40 -0
  432. mypy/typeshed/stdlib/importlib/readers.pyi +68 -0
  433. mypy/typeshed/stdlib/importlib/resources/__init__.pyi +46 -0
  434. mypy/typeshed/stdlib/importlib/resources/abc.pyi +12 -0
  435. mypy/typeshed/stdlib/importlib/resources/readers.pyi +14 -0
  436. mypy/typeshed/stdlib/importlib/resources/simple.pyi +49 -0
  437. mypy/typeshed/stdlib/importlib/simple.pyi +11 -0
  438. mypy/typeshed/stdlib/importlib/util.pyi +43 -0
  439. mypy/typeshed/stdlib/inspect.pyi +631 -0
  440. mypy/typeshed/stdlib/io.pyi +204 -0
  441. mypy/typeshed/stdlib/ipaddress.pyi +208 -0
  442. mypy/typeshed/stdlib/itertools.pyi +293 -0
  443. mypy/typeshed/stdlib/json/__init__.pyi +61 -0
  444. mypy/typeshed/stdlib/json/decoder.pyi +32 -0
  445. mypy/typeshed/stdlib/json/encoder.pyi +38 -0
  446. mypy/typeshed/stdlib/json/tool.pyi +1 -0
  447. mypy/typeshed/stdlib/keyword.pyi +21 -0
  448. mypy/typeshed/stdlib/lib2to3/__init__.pyi +0 -0
  449. mypy/typeshed/stdlib/lib2to3/btm_matcher.pyi +28 -0
  450. mypy/typeshed/stdlib/lib2to3/fixer_base.pyi +42 -0
  451. mypy/typeshed/stdlib/lib2to3/fixes/__init__.pyi +0 -0
  452. mypy/typeshed/stdlib/lib2to3/fixes/fix_apply.pyi +8 -0
  453. mypy/typeshed/stdlib/lib2to3/fixes/fix_asserts.pyi +10 -0
  454. mypy/typeshed/stdlib/lib2to3/fixes/fix_basestring.pyi +8 -0
  455. mypy/typeshed/stdlib/lib2to3/fixes/fix_buffer.pyi +8 -0
  456. mypy/typeshed/stdlib/lib2to3/fixes/fix_dict.pyi +16 -0
  457. mypy/typeshed/stdlib/lib2to3/fixes/fix_except.pyi +14 -0
  458. mypy/typeshed/stdlib/lib2to3/fixes/fix_exec.pyi +8 -0
  459. mypy/typeshed/stdlib/lib2to3/fixes/fix_execfile.pyi +8 -0
  460. mypy/typeshed/stdlib/lib2to3/fixes/fix_exitfunc.pyi +13 -0
  461. mypy/typeshed/stdlib/lib2to3/fixes/fix_filter.pyi +9 -0
  462. mypy/typeshed/stdlib/lib2to3/fixes/fix_funcattrs.pyi +8 -0
  463. mypy/typeshed/stdlib/lib2to3/fixes/fix_future.pyi +8 -0
  464. mypy/typeshed/stdlib/lib2to3/fixes/fix_getcwdu.pyi +8 -0
  465. mypy/typeshed/stdlib/lib2to3/fixes/fix_has_key.pyi +8 -0
  466. mypy/typeshed/stdlib/lib2to3/fixes/fix_idioms.pyi +15 -0
  467. mypy/typeshed/stdlib/lib2to3/fixes/fix_import.pyi +16 -0
  468. mypy/typeshed/stdlib/lib2to3/fixes/fix_imports.pyi +21 -0
  469. mypy/typeshed/stdlib/lib2to3/fixes/fix_imports2.pyi +6 -0
  470. mypy/typeshed/stdlib/lib2to3/fixes/fix_input.pyi +11 -0
  471. mypy/typeshed/stdlib/lib2to3/fixes/fix_intern.pyi +9 -0
  472. mypy/typeshed/stdlib/lib2to3/fixes/fix_isinstance.pyi +8 -0
  473. mypy/typeshed/stdlib/lib2to3/fixes/fix_itertools.pyi +9 -0
  474. mypy/typeshed/stdlib/lib2to3/fixes/fix_itertools_imports.pyi +7 -0
  475. mypy/typeshed/stdlib/lib2to3/fixes/fix_long.pyi +7 -0
  476. mypy/typeshed/stdlib/lib2to3/fixes/fix_map.pyi +9 -0
  477. mypy/typeshed/stdlib/lib2to3/fixes/fix_metaclass.pyi +17 -0
  478. mypy/typeshed/stdlib/lib2to3/fixes/fix_methodattrs.pyi +10 -0
  479. mypy/typeshed/stdlib/lib2to3/fixes/fix_ne.pyi +8 -0
  480. mypy/typeshed/stdlib/lib2to3/fixes/fix_next.pyi +19 -0
  481. mypy/typeshed/stdlib/lib2to3/fixes/fix_nonzero.pyi +8 -0
  482. mypy/typeshed/stdlib/lib2to3/fixes/fix_numliterals.pyi +8 -0
  483. mypy/typeshed/stdlib/lib2to3/fixes/fix_operator.pyi +12 -0
  484. mypy/typeshed/stdlib/lib2to3/fixes/fix_paren.pyi +8 -0
  485. mypy/typeshed/stdlib/lib2to3/fixes/fix_print.pyi +12 -0
  486. mypy/typeshed/stdlib/lib2to3/fixes/fix_raise.pyi +8 -0
  487. mypy/typeshed/stdlib/lib2to3/fixes/fix_raw_input.pyi +8 -0
  488. mypy/typeshed/stdlib/lib2to3/fixes/fix_reduce.pyi +8 -0
  489. mypy/typeshed/stdlib/lib2to3/fixes/fix_reload.pyi +9 -0
  490. mypy/typeshed/stdlib/lib2to3/fixes/fix_renames.pyi +17 -0
  491. mypy/typeshed/stdlib/lib2to3/fixes/fix_repr.pyi +8 -0
  492. mypy/typeshed/stdlib/lib2to3/fixes/fix_set_literal.pyi +7 -0
  493. mypy/typeshed/stdlib/lib2to3/fixes/fix_standarderror.pyi +8 -0
  494. mypy/typeshed/stdlib/lib2to3/fixes/fix_sys_exc.pyi +9 -0
  495. mypy/typeshed/stdlib/lib2to3/fixes/fix_throw.pyi +8 -0
  496. mypy/typeshed/stdlib/lib2to3/fixes/fix_tuple_params.pyi +17 -0
  497. mypy/typeshed/stdlib/lib2to3/fixes/fix_types.pyi +8 -0
  498. mypy/typeshed/stdlib/lib2to3/fixes/fix_unicode.pyi +12 -0
  499. mypy/typeshed/stdlib/lib2to3/fixes/fix_urllib.pyi +15 -0
  500. mypy/typeshed/stdlib/lib2to3/fixes/fix_ws_comma.pyi +12 -0
  501. mypy/typeshed/stdlib/lib2to3/fixes/fix_xrange.pyi +20 -0
  502. mypy/typeshed/stdlib/lib2to3/fixes/fix_xreadlines.pyi +8 -0
  503. mypy/typeshed/stdlib/lib2to3/fixes/fix_zip.pyi +9 -0
  504. mypy/typeshed/stdlib/lib2to3/main.pyi +42 -0
  505. mypy/typeshed/stdlib/lib2to3/pgen2/__init__.pyi +9 -0
  506. mypy/typeshed/stdlib/lib2to3/pgen2/driver.pyi +27 -0
  507. mypy/typeshed/stdlib/lib2to3/pgen2/grammar.pyi +24 -0
  508. mypy/typeshed/stdlib/lib2to3/pgen2/literals.pyi +7 -0
  509. mypy/typeshed/stdlib/lib2to3/pgen2/parse.pyi +30 -0
  510. mypy/typeshed/stdlib/lib2to3/pgen2/pgen.pyi +50 -0
  511. mypy/typeshed/stdlib/lib2to3/pgen2/token.pyi +67 -0
  512. mypy/typeshed/stdlib/lib2to3/pgen2/tokenize.pyi +96 -0
  513. mypy/typeshed/stdlib/lib2to3/pygram.pyi +114 -0
  514. mypy/typeshed/stdlib/lib2to3/pytree.pyi +117 -0
  515. mypy/typeshed/stdlib/lib2to3/refactor.pyi +82 -0
  516. mypy/typeshed/stdlib/linecache.pyi +23 -0
  517. mypy/typeshed/stdlib/locale.pyi +152 -0
  518. mypy/typeshed/stdlib/logging/__init__.pyi +655 -0
  519. mypy/typeshed/stdlib/logging/config.pyi +134 -0
  520. mypy/typeshed/stdlib/logging/handlers.pyi +275 -0
  521. mypy/typeshed/stdlib/lzma.pyi +197 -0
  522. mypy/typeshed/stdlib/mailbox.pyi +256 -0
  523. mypy/typeshed/stdlib/mailcap.pyi +11 -0
  524. mypy/typeshed/stdlib/marshal.pyi +33 -0
  525. mypy/typeshed/stdlib/math.pyi +125 -0
  526. mypy/typeshed/stdlib/mimetypes.pyi +46 -0
  527. mypy/typeshed/stdlib/mmap.pyi +113 -0
  528. mypy/typeshed/stdlib/modulefinder.pyi +66 -0
  529. mypy/typeshed/stdlib/msilib/__init__.pyi +176 -0
  530. mypy/typeshed/stdlib/msilib/schema.pyi +94 -0
  531. mypy/typeshed/stdlib/msilib/sequence.pyi +13 -0
  532. mypy/typeshed/stdlib/msilib/text.pyi +7 -0
  533. mypy/typeshed/stdlib/msvcrt.pyi +32 -0
  534. mypy/typeshed/stdlib/multiprocessing/__init__.pyi +90 -0
  535. mypy/typeshed/stdlib/multiprocessing/connection.pyi +75 -0
  536. mypy/typeshed/stdlib/multiprocessing/context.pyi +187 -0
  537. mypy/typeshed/stdlib/multiprocessing/dummy/__init__.pyi +77 -0
  538. mypy/typeshed/stdlib/multiprocessing/dummy/connection.pyi +39 -0
  539. mypy/typeshed/stdlib/multiprocessing/forkserver.pyi +31 -0
  540. mypy/typeshed/stdlib/multiprocessing/heap.pyi +36 -0
  541. mypy/typeshed/stdlib/multiprocessing/managers.pyi +212 -0
  542. mypy/typeshed/stdlib/multiprocessing/pool.pyi +103 -0
  543. mypy/typeshed/stdlib/multiprocessing/popen_fork.pyi +23 -0
  544. mypy/typeshed/stdlib/multiprocessing/popen_forkserver.pyi +16 -0
  545. mypy/typeshed/stdlib/multiprocessing/popen_spawn_posix.pyi +20 -0
  546. mypy/typeshed/stdlib/multiprocessing/popen_spawn_win32.pyi +30 -0
  547. mypy/typeshed/stdlib/multiprocessing/process.pyi +39 -0
  548. mypy/typeshed/stdlib/multiprocessing/queues.pyi +41 -0
  549. mypy/typeshed/stdlib/multiprocessing/reduction.pyi +89 -0
  550. mypy/typeshed/stdlib/multiprocessing/resource_sharer.pyi +20 -0
  551. mypy/typeshed/stdlib/multiprocessing/resource_tracker.pyi +18 -0
  552. mypy/typeshed/stdlib/multiprocessing/shared_memory.pyi +40 -0
  553. mypy/typeshed/stdlib/multiprocessing/sharedctypes.pyi +101 -0
  554. mypy/typeshed/stdlib/multiprocessing/spawn.pyi +32 -0
  555. mypy/typeshed/stdlib/multiprocessing/synchronize.pyi +54 -0
  556. mypy/typeshed/stdlib/multiprocessing/util.pyi +79 -0
  557. mypy/typeshed/stdlib/netrc.pyi +23 -0
  558. mypy/typeshed/stdlib/nis.pyi +9 -0
  559. mypy/typeshed/stdlib/nntplib.pyi +125 -0
  560. mypy/typeshed/stdlib/nt.pyi +111 -0
  561. mypy/typeshed/stdlib/ntpath.pyi +119 -0
  562. mypy/typeshed/stdlib/nturl2path.pyi +2 -0
  563. mypy/typeshed/stdlib/numbers.pyi +154 -0
  564. mypy/typeshed/stdlib/opcode.pyi +59 -0
  565. mypy/typeshed/stdlib/operator.pyi +110 -0
  566. mypy/typeshed/stdlib/optparse.pyi +252 -0
  567. mypy/typeshed/stdlib/os/__init__.pyi +1139 -0
  568. mypy/typeshed/stdlib/os/path.pyi +8 -0
  569. mypy/typeshed/stdlib/ossaudiodev.pyi +131 -0
  570. mypy/typeshed/stdlib/parser.pyi +24 -0
  571. mypy/typeshed/stdlib/pathlib.pyi +232 -0
  572. mypy/typeshed/stdlib/pdb.pyi +181 -0
  573. mypy/typeshed/stdlib/pickle.pyi +270 -0
  574. mypy/typeshed/stdlib/pickletools.pyi +167 -0
  575. mypy/typeshed/stdlib/pipes.pyi +16 -0
  576. mypy/typeshed/stdlib/pkgutil.pyi +53 -0
  577. mypy/typeshed/stdlib/platform.pyi +42 -0
  578. mypy/typeshed/stdlib/plistlib.pyi +113 -0
  579. mypy/typeshed/stdlib/poplib.pyi +71 -0
  580. mypy/typeshed/stdlib/posix.pyi +359 -0
  581. mypy/typeshed/stdlib/posixpath.pyi +161 -0
  582. mypy/typeshed/stdlib/pprint.pyi +112 -0
  583. mypy/typeshed/stdlib/profile.pyi +31 -0
  584. mypy/typeshed/stdlib/pstats.pyi +78 -0
  585. mypy/typeshed/stdlib/pty.pyi +19 -0
  586. mypy/typeshed/stdlib/pwd.pyi +27 -0
  587. mypy/typeshed/stdlib/py_compile.pyi +34 -0
  588. mypy/typeshed/stdlib/pyclbr.pyi +74 -0
  589. mypy/typeshed/stdlib/pydoc.pyi +261 -0
  590. mypy/typeshed/stdlib/pydoc_data/__init__.pyi +0 -0
  591. mypy/typeshed/stdlib/pydoc_data/topics.pyi +1 -0
  592. mypy/typeshed/stdlib/pyexpat/__init__.pyi +80 -0
  593. mypy/typeshed/stdlib/pyexpat/errors.pyi +49 -0
  594. mypy/typeshed/stdlib/pyexpat/model.pyi +11 -0
  595. mypy/typeshed/stdlib/queue.pyi +58 -0
  596. mypy/typeshed/stdlib/quopri.pyi +11 -0
  597. mypy/typeshed/stdlib/random.pyi +138 -0
  598. mypy/typeshed/stdlib/re.pyi +290 -0
  599. mypy/typeshed/stdlib/readline.pyi +36 -0
  600. mypy/typeshed/stdlib/reprlib.pyi +65 -0
  601. mypy/typeshed/stdlib/resource.pyi +92 -0
  602. mypy/typeshed/stdlib/rlcompleter.pyi +9 -0
  603. mypy/typeshed/stdlib/runpy.pyi +24 -0
  604. mypy/typeshed/stdlib/sched.pyi +42 -0
  605. mypy/typeshed/stdlib/secrets.pyi +15 -0
  606. mypy/typeshed/stdlib/select.pyi +151 -0
  607. mypy/typeshed/stdlib/selectors.pyi +67 -0
  608. mypy/typeshed/stdlib/shelve.pyi +46 -0
  609. mypy/typeshed/stdlib/shlex.pyi +43 -0
  610. mypy/typeshed/stdlib/shutil.pyi +189 -0
  611. mypy/typeshed/stdlib/signal.pyi +189 -0
  612. mypy/typeshed/stdlib/site.pyi +27 -0
  613. mypy/typeshed/stdlib/smtpd.pyi +91 -0
  614. mypy/typeshed/stdlib/smtplib.pyi +204 -0
  615. mypy/typeshed/stdlib/sndhdr.pyi +14 -0
  616. mypy/typeshed/stdlib/socket.pyi +825 -0
  617. mypy/typeshed/stdlib/socketserver.pyi +168 -0
  618. mypy/typeshed/stdlib/spwd.pyi +40 -0
  619. mypy/typeshed/stdlib/sqlite3/__init__.pyi +1 -0
  620. mypy/typeshed/stdlib/sqlite3/dbapi2.pyi +469 -0
  621. mypy/typeshed/stdlib/sre_compile.pyi +11 -0
  622. mypy/typeshed/stdlib/sre_constants.pyi +130 -0
  623. mypy/typeshed/stdlib/sre_parse.pyi +104 -0
  624. mypy/typeshed/stdlib/ssl.pyi +529 -0
  625. mypy/typeshed/stdlib/stat.pyi +1 -0
  626. mypy/typeshed/stdlib/statistics.pyi +132 -0
  627. mypy/typeshed/stdlib/string.pyi +83 -0
  628. mypy/typeshed/stdlib/stringprep.pyi +27 -0
  629. mypy/typeshed/stdlib/struct.pyi +26 -0
  630. mypy/typeshed/stdlib/subprocess.pyi +2614 -0
  631. mypy/typeshed/stdlib/sunau.pyi +86 -0
  632. mypy/typeshed/stdlib/symbol.pyi +93 -0
  633. mypy/typeshed/stdlib/symtable.pyi +58 -0
  634. mypy/typeshed/stdlib/sys/__init__.pyi +373 -0
  635. mypy/typeshed/stdlib/sys/_monitoring.pyi +52 -0
  636. mypy/typeshed/stdlib/sysconfig.pyi +43 -0
  637. mypy/typeshed/stdlib/syslog.pyi +46 -0
  638. mypy/typeshed/stdlib/tabnanny.pyi +16 -0
  639. mypy/typeshed/stdlib/tarfile.pyi +438 -0
  640. mypy/typeshed/stdlib/telnetlib.pyi +122 -0
  641. mypy/typeshed/stdlib/tempfile.pyi +477 -0
  642. mypy/typeshed/stdlib/termios.pyi +267 -0
  643. mypy/typeshed/stdlib/textwrap.pyi +103 -0
  644. mypy/typeshed/stdlib/this.pyi +2 -0
  645. mypy/typeshed/stdlib/threading.pyi +187 -0
  646. mypy/typeshed/stdlib/time.pyi +107 -0
  647. mypy/typeshed/stdlib/timeit.pyi +32 -0
  648. mypy/typeshed/stdlib/tkinter/__init__.pyi +3641 -0
  649. mypy/typeshed/stdlib/tkinter/colorchooser.pyi +20 -0
  650. mypy/typeshed/stdlib/tkinter/commondialog.pyi +14 -0
  651. mypy/typeshed/stdlib/tkinter/constants.pyi +80 -0
  652. mypy/typeshed/stdlib/tkinter/dialog.pyi +16 -0
  653. mypy/typeshed/stdlib/tkinter/dnd.pyi +20 -0
  654. mypy/typeshed/stdlib/tkinter/filedialog.pyi +151 -0
  655. mypy/typeshed/stdlib/tkinter/font.pyi +116 -0
  656. mypy/typeshed/stdlib/tkinter/messagebox.pyi +44 -0
  657. mypy/typeshed/stdlib/tkinter/scrolledtext.pyi +10 -0
  658. mypy/typeshed/stdlib/tkinter/simpledialog.pyi +54 -0
  659. mypy/typeshed/stdlib/tkinter/tix.pyi +299 -0
  660. mypy/typeshed/stdlib/tkinter/ttk.pyi +1191 -0
  661. mypy/typeshed/stdlib/token.pyi +159 -0
  662. mypy/typeshed/stdlib/tokenize.pyi +177 -0
  663. mypy/typeshed/stdlib/tomllib.pyi +10 -0
  664. mypy/typeshed/stdlib/trace.pyi +79 -0
  665. mypy/typeshed/stdlib/traceback.pyi +260 -0
  666. mypy/typeshed/stdlib/tracemalloc.pyi +124 -0
  667. mypy/typeshed/stdlib/tty.pyi +30 -0
  668. mypy/typeshed/stdlib/turtle.pyi +713 -0
  669. mypy/typeshed/stdlib/types.pyi +605 -0
  670. mypy/typeshed/stdlib/typing.pyi +968 -0
  671. mypy/typeshed/stdlib/typing_extensions.pyi +503 -0
  672. mypy/typeshed/stdlib/unicodedata.pyi +71 -0
  673. mypy/typeshed/stdlib/unittest/__init__.pyi +67 -0
  674. mypy/typeshed/stdlib/unittest/_log.pyi +27 -0
  675. mypy/typeshed/stdlib/unittest/async_case.pyi +21 -0
  676. mypy/typeshed/stdlib/unittest/case.pyi +342 -0
  677. mypy/typeshed/stdlib/unittest/loader.pyi +51 -0
  678. mypy/typeshed/stdlib/unittest/main.pyi +69 -0
  679. mypy/typeshed/stdlib/unittest/mock.pyi +430 -0
  680. mypy/typeshed/stdlib/unittest/result.pyi +46 -0
  681. mypy/typeshed/stdlib/unittest/runner.pyi +72 -0
  682. mypy/typeshed/stdlib/unittest/signals.pyi +15 -0
  683. mypy/typeshed/stdlib/unittest/suite.pyi +22 -0
  684. mypy/typeshed/stdlib/unittest/util.pyi +23 -0
  685. mypy/typeshed/stdlib/urllib/__init__.pyi +0 -0
  686. mypy/typeshed/stdlib/urllib/error.pyi +23 -0
  687. mypy/typeshed/stdlib/urllib/parse.pyi +210 -0
  688. mypy/typeshed/stdlib/urllib/request.pyi +399 -0
  689. mypy/typeshed/stdlib/urllib/response.pyi +43 -0
  690. mypy/typeshed/stdlib/urllib/robotparser.pyi +20 -0
  691. mypy/typeshed/stdlib/uu.pyi +13 -0
  692. mypy/typeshed/stdlib/uuid.pyi +100 -0
  693. mypy/typeshed/stdlib/venv/__init__.pyi +79 -0
  694. mypy/typeshed/stdlib/warnings.pyi +112 -0
  695. mypy/typeshed/stdlib/wave.pyi +85 -0
  696. mypy/typeshed/stdlib/weakref.pyi +150 -0
  697. mypy/typeshed/stdlib/webbrowser.pyi +74 -0
  698. mypy/typeshed/stdlib/winreg.pyi +103 -0
  699. mypy/typeshed/stdlib/winsound.pyi +28 -0
  700. mypy/typeshed/stdlib/wsgiref/__init__.pyi +0 -0
  701. mypy/typeshed/stdlib/wsgiref/handlers.pyi +91 -0
  702. mypy/typeshed/stdlib/wsgiref/headers.pyi +26 -0
  703. mypy/typeshed/stdlib/wsgiref/simple_server.pyi +37 -0
  704. mypy/typeshed/stdlib/wsgiref/types.pyi +32 -0
  705. mypy/typeshed/stdlib/wsgiref/util.pyi +24 -0
  706. mypy/typeshed/stdlib/wsgiref/validate.pyi +50 -0
  707. mypy/typeshed/stdlib/xdrlib.pyi +57 -0
  708. mypy/typeshed/stdlib/xml/__init__.pyi +1 -0
  709. mypy/typeshed/stdlib/xml/dom/NodeFilter.pyi +19 -0
  710. mypy/typeshed/stdlib/xml/dom/__init__.pyi +69 -0
  711. mypy/typeshed/stdlib/xml/dom/domreg.pyi +8 -0
  712. mypy/typeshed/stdlib/xml/dom/expatbuilder.pyi +100 -0
  713. mypy/typeshed/stdlib/xml/dom/minicompat.pyi +22 -0
  714. mypy/typeshed/stdlib/xml/dom/minidom.pyi +404 -0
  715. mypy/typeshed/stdlib/xml/dom/pulldom.pyi +94 -0
  716. mypy/typeshed/stdlib/xml/dom/xmlbuilder.pyi +108 -0
  717. mypy/typeshed/stdlib/xml/etree/ElementInclude.pyi +28 -0
  718. mypy/typeshed/stdlib/xml/etree/ElementPath.pyi +34 -0
  719. mypy/typeshed/stdlib/xml/etree/ElementTree.pyi +321 -0
  720. mypy/typeshed/stdlib/xml/etree/__init__.pyi +0 -0
  721. mypy/typeshed/stdlib/xml/etree/cElementTree.pyi +1 -0
  722. mypy/typeshed/stdlib/xml/parsers/__init__.pyi +1 -0
  723. mypy/typeshed/stdlib/xml/parsers/expat/__init__.pyi +1 -0
  724. mypy/typeshed/stdlib/xml/parsers/expat/errors.pyi +1 -0
  725. mypy/typeshed/stdlib/xml/parsers/expat/model.pyi +1 -0
  726. mypy/typeshed/stdlib/xml/sax/__init__.pyi +25 -0
  727. mypy/typeshed/stdlib/xml/sax/_exceptions.pyi +19 -0
  728. mypy/typeshed/stdlib/xml/sax/handler.pyi +55 -0
  729. mypy/typeshed/stdlib/xml/sax/saxutils.pyi +60 -0
  730. mypy/typeshed/stdlib/xml/sax/xmlreader.pyi +87 -0
  731. mypy/typeshed/stdlib/xmlrpc/__init__.pyi +0 -0
  732. mypy/typeshed/stdlib/xmlrpc/client.pyi +296 -0
  733. mypy/typeshed/stdlib/xmlrpc/server.pyi +143 -0
  734. mypy/typeshed/stdlib/xxlimited.pyi +22 -0
  735. mypy/typeshed/stdlib/zipapp.pyi +20 -0
  736. mypy/typeshed/stdlib/zipfile/__init__.pyi +306 -0
  737. mypy/typeshed/stdlib/zipfile/_path.pyi +95 -0
  738. mypy/typeshed/stdlib/zipimport.pyi +32 -0
  739. mypy/typeshed/stdlib/zlib.pyi +56 -0
  740. mypy/typeshed/stdlib/zoneinfo/__init__.pyi +38 -0
  741. mypy/typeshed/stubs/mypy-extensions/mypy_extensions.pyi +218 -0
  742. mypy/typestate.py +323 -0
  743. mypy/typetraverser.py +142 -0
  744. mypy/typevars.py +93 -0
  745. mypy/typevartuples.py +32 -0
  746. mypy/util.py +869 -0
  747. mypy/version.py +1 -0
  748. mypy/visitor.py +621 -0
  749. mypy/xml/mypy-html.css +104 -0
  750. mypy/xml/mypy-html.xslt +81 -0
  751. mypy/xml/mypy-txt.xslt +100 -0
  752. mypy/xml/mypy.xsd +50 -0
  753. mypy_dev-1.9.0.dev0.dist-info/LICENSE +229 -0
  754. mypy_dev-1.9.0.dev0.dist-info/METADATA +39 -0
  755. mypy_dev-1.9.0.dev0.dist-info/RECORD +1018 -0
  756. mypy_dev-1.9.0.dev0.dist-info/WHEEL +5 -0
  757. mypy_dev-1.9.0.dev0.dist-info/entry_points.txt +6 -0
  758. mypy_dev-1.9.0.dev0.dist-info/top_level.txt +2 -0
  759. mypyc/README.md +133 -0
  760. mypyc/__init__.py +0 -0
  761. mypyc/__main__.py +57 -0
  762. mypyc/analysis/__init__.py +0 -0
  763. mypyc/analysis/attrdefined.py +436 -0
  764. mypyc/analysis/blockfreq.py +32 -0
  765. mypyc/analysis/dataflow.py +624 -0
  766. mypyc/analysis/ircheck.py +429 -0
  767. mypyc/analysis/selfleaks.py +207 -0
  768. mypyc/build.py +616 -0
  769. mypyc/codegen/__init__.py +0 -0
  770. mypyc/codegen/cstring.py +54 -0
  771. mypyc/codegen/emit.py +1193 -0
  772. mypyc/codegen/emitclass.py +1060 -0
  773. mypyc/codegen/emitfunc.py +846 -0
  774. mypyc/codegen/emitmodule.py +1131 -0
  775. mypyc/codegen/emitwrapper.py +979 -0
  776. mypyc/codegen/literals.py +302 -0
  777. mypyc/common.py +136 -0
  778. mypyc/crash.py +31 -0
  779. mypyc/doc/Makefile +20 -0
  780. mypyc/doc/bool_operations.rst +27 -0
  781. mypyc/doc/compilation_units.rst +20 -0
  782. mypyc/doc/conf.py +59 -0
  783. mypyc/doc/cpython-timings.md +25 -0
  784. mypyc/doc/dev-intro.md +548 -0
  785. mypyc/doc/dict_operations.rst +59 -0
  786. mypyc/doc/differences_from_python.rst +332 -0
  787. mypyc/doc/float_operations.rst +50 -0
  788. mypyc/doc/future.md +42 -0
  789. mypyc/doc/getting_started.rst +240 -0
  790. mypyc/doc/index.rst +61 -0
  791. mypyc/doc/int_operations.rst +162 -0
  792. mypyc/doc/introduction.rst +150 -0
  793. mypyc/doc/list_operations.rst +65 -0
  794. mypyc/doc/make.bat +35 -0
  795. mypyc/doc/native_classes.rst +206 -0
  796. mypyc/doc/native_operations.rst +55 -0
  797. mypyc/doc/performance_tips_and_tricks.rst +244 -0
  798. mypyc/doc/set_operations.rst +47 -0
  799. mypyc/doc/str_operations.rst +35 -0
  800. mypyc/doc/tuple_operations.rst +33 -0
  801. mypyc/doc/using_type_annotations.rst +398 -0
  802. mypyc/errors.py +29 -0
  803. mypyc/external/googletest/LICENSE +28 -0
  804. mypyc/external/googletest/README.md +280 -0
  805. mypyc/external/googletest/include/gtest/gtest-death-test.h +294 -0
  806. mypyc/external/googletest/include/gtest/gtest-message.h +250 -0
  807. mypyc/external/googletest/include/gtest/gtest-param-test.h +1444 -0
  808. mypyc/external/googletest/include/gtest/gtest-param-test.h.pump +510 -0
  809. mypyc/external/googletest/include/gtest/gtest-printers.h +993 -0
  810. mypyc/external/googletest/include/gtest/gtest-spi.h +232 -0
  811. mypyc/external/googletest/include/gtest/gtest-test-part.h +179 -0
  812. mypyc/external/googletest/include/gtest/gtest-typed-test.h +263 -0
  813. mypyc/external/googletest/include/gtest/gtest.h +2236 -0
  814. mypyc/external/googletest/include/gtest/gtest_pred_impl.h +358 -0
  815. mypyc/external/googletest/include/gtest/gtest_prod.h +58 -0
  816. mypyc/external/googletest/include/gtest/internal/custom/gtest-port.h +69 -0
  817. mypyc/external/googletest/include/gtest/internal/custom/gtest-printers.h +42 -0
  818. mypyc/external/googletest/include/gtest/internal/custom/gtest.h +41 -0
  819. mypyc/external/googletest/include/gtest/internal/gtest-death-test-internal.h +319 -0
  820. mypyc/external/googletest/include/gtest/internal/gtest-filepath.h +206 -0
  821. mypyc/external/googletest/include/gtest/internal/gtest-internal.h +1238 -0
  822. mypyc/external/googletest/include/gtest/internal/gtest-linked_ptr.h +243 -0
  823. mypyc/external/googletest/include/gtest/internal/gtest-param-util-generated.h +5146 -0
  824. mypyc/external/googletest/include/gtest/internal/gtest-param-util-generated.h.pump +286 -0
  825. mypyc/external/googletest/include/gtest/internal/gtest-param-util.h +731 -0
  826. mypyc/external/googletest/include/gtest/internal/gtest-port-arch.h +93 -0
  827. mypyc/external/googletest/include/gtest/internal/gtest-port.h +2560 -0
  828. mypyc/external/googletest/include/gtest/internal/gtest-string.h +167 -0
  829. mypyc/external/googletest/include/gtest/internal/gtest-tuple.h +1020 -0
  830. mypyc/external/googletest/include/gtest/internal/gtest-tuple.h.pump +347 -0
  831. mypyc/external/googletest/include/gtest/internal/gtest-type-util.h +3331 -0
  832. mypyc/external/googletest/include/gtest/internal/gtest-type-util.h.pump +297 -0
  833. mypyc/external/googletest/make/Makefile +61 -0
  834. mypyc/external/googletest/src/gtest-all.cc +48 -0
  835. mypyc/external/googletest/src/gtest-death-test.cc +1342 -0
  836. mypyc/external/googletest/src/gtest-filepath.cc +387 -0
  837. mypyc/external/googletest/src/gtest-internal-inl.h +1183 -0
  838. mypyc/external/googletest/src/gtest-port.cc +1259 -0
  839. mypyc/external/googletest/src/gtest-printers.cc +373 -0
  840. mypyc/external/googletest/src/gtest-test-part.cc +110 -0
  841. mypyc/external/googletest/src/gtest-typed-test.cc +118 -0
  842. mypyc/external/googletest/src/gtest.cc +5388 -0
  843. mypyc/external/googletest/src/gtest_main.cc +38 -0
  844. mypyc/ir/__init__.py +0 -0
  845. mypyc/ir/class_ir.py +499 -0
  846. mypyc/ir/func_ir.py +370 -0
  847. mypyc/ir/module_ir.py +88 -0
  848. mypyc/ir/ops.py +1642 -0
  849. mypyc/ir/pprint.py +496 -0
  850. mypyc/ir/rtypes.py +1038 -0
  851. mypyc/irbuild/__init__.py +0 -0
  852. mypyc/irbuild/ast_helpers.py +120 -0
  853. mypyc/irbuild/builder.py +1398 -0
  854. mypyc/irbuild/callable_class.py +173 -0
  855. mypyc/irbuild/classdef.py +850 -0
  856. mypyc/irbuild/constant_fold.py +95 -0
  857. mypyc/irbuild/context.py +186 -0
  858. mypyc/irbuild/env_class.py +223 -0
  859. mypyc/irbuild/expression.py +1067 -0
  860. mypyc/irbuild/for_helpers.py +1046 -0
  861. mypyc/irbuild/format_str_tokenizer.py +250 -0
  862. mypyc/irbuild/function.py +1089 -0
  863. mypyc/irbuild/generator.py +346 -0
  864. mypyc/irbuild/ll_builder.py +2407 -0
  865. mypyc/irbuild/main.py +153 -0
  866. mypyc/irbuild/mapper.py +221 -0
  867. mypyc/irbuild/match.py +355 -0
  868. mypyc/irbuild/nonlocalcontrol.py +197 -0
  869. mypyc/irbuild/prebuildvisitor.py +203 -0
  870. mypyc/irbuild/prepare.py +609 -0
  871. mypyc/irbuild/specialize.py +822 -0
  872. mypyc/irbuild/statement.py +1017 -0
  873. mypyc/irbuild/targets.py +57 -0
  874. mypyc/irbuild/util.py +189 -0
  875. mypyc/irbuild/visitor.py +401 -0
  876. mypyc/irbuild/vtable.py +82 -0
  877. mypyc/lib-rt/CPy.h +643 -0
  878. mypyc/lib-rt/bytes_ops.c +143 -0
  879. mypyc/lib-rt/dict_ops.c +446 -0
  880. mypyc/lib-rt/exc_ops.c +259 -0
  881. mypyc/lib-rt/float_ops.c +192 -0
  882. mypyc/lib-rt/generic_ops.c +64 -0
  883. mypyc/lib-rt/getargs.c +450 -0
  884. mypyc/lib-rt/getargsfast.c +569 -0
  885. mypyc/lib-rt/init.c +13 -0
  886. mypyc/lib-rt/int_ops.c +803 -0
  887. mypyc/lib-rt/list_ops.c +335 -0
  888. mypyc/lib-rt/misc_ops.c +942 -0
  889. mypyc/lib-rt/module_shim.tmpl +18 -0
  890. mypyc/lib-rt/mypyc_util.h +118 -0
  891. mypyc/lib-rt/pythoncapi_compat.h +497 -0
  892. mypyc/lib-rt/pythonsupport.h +548 -0
  893. mypyc/lib-rt/set_ops.c +17 -0
  894. mypyc/lib-rt/setup.py +70 -0
  895. mypyc/lib-rt/str_ops.c +241 -0
  896. mypyc/lib-rt/test_capi.cc +585 -0
  897. mypyc/lib-rt/tuple_ops.c +61 -0
  898. mypyc/namegen.py +115 -0
  899. mypyc/options.py +32 -0
  900. mypyc/primitives/__init__.py +0 -0
  901. mypyc/primitives/bytes_ops.py +101 -0
  902. mypyc/primitives/dict_ops.py +325 -0
  903. mypyc/primitives/exc_ops.py +101 -0
  904. mypyc/primitives/float_ops.py +168 -0
  905. mypyc/primitives/generic_ops.py +384 -0
  906. mypyc/primitives/int_ops.py +304 -0
  907. mypyc/primitives/list_ops.py +300 -0
  908. mypyc/primitives/misc_ops.py +241 -0
  909. mypyc/primitives/registry.py +323 -0
  910. mypyc/primitives/set_ops.py +121 -0
  911. mypyc/primitives/str_ops.py +229 -0
  912. mypyc/primitives/tuple_ops.py +83 -0
  913. mypyc/rt_subtype.py +77 -0
  914. mypyc/sametype.py +83 -0
  915. mypyc/subtype.py +88 -0
  916. mypyc/test/__init__.py +0 -0
  917. mypyc/test/config.py +13 -0
  918. mypyc/test/test_alwaysdefined.py +46 -0
  919. mypyc/test/test_analysis.py +77 -0
  920. mypyc/test/test_cheader.py +45 -0
  921. mypyc/test/test_commandline.py +82 -0
  922. mypyc/test/test_emit.py +69 -0
  923. mypyc/test/test_emitclass.py +35 -0
  924. mypyc/test/test_emitfunc.py +926 -0
  925. mypyc/test/test_emitwrapper.py +60 -0
  926. mypyc/test/test_exceptions.py +56 -0
  927. mypyc/test/test_external.py +49 -0
  928. mypyc/test/test_irbuild.py +87 -0
  929. mypyc/test/test_ircheck.py +199 -0
  930. mypyc/test/test_literals.py +90 -0
  931. mypyc/test/test_namegen.py +48 -0
  932. mypyc/test/test_pprint.py +42 -0
  933. mypyc/test/test_rarray.py +48 -0
  934. mypyc/test/test_refcount.py +59 -0
  935. mypyc/test/test_run.py +426 -0
  936. mypyc/test/test_serialization.py +108 -0
  937. mypyc/test/test_struct.py +112 -0
  938. mypyc/test/test_tuplename.py +33 -0
  939. mypyc/test/test_typeops.py +97 -0
  940. mypyc/test/testutil.py +283 -0
  941. mypyc/test-data/alwaysdefined.test +732 -0
  942. mypyc/test-data/analysis.test +603 -0
  943. mypyc/test-data/commandline.test +245 -0
  944. mypyc/test-data/driver/driver.py +48 -0
  945. mypyc/test-data/exceptions-freq.test +125 -0
  946. mypyc/test-data/exceptions.test +713 -0
  947. mypyc/test-data/fixtures/ir.py +373 -0
  948. mypyc/test-data/fixtures/testutil.py +103 -0
  949. mypyc/test-data/fixtures/typing-full.pyi +169 -0
  950. mypyc/test-data/irbuild-any.test +238 -0
  951. mypyc/test-data/irbuild-basic.test +3690 -0
  952. mypyc/test-data/irbuild-bool.test +463 -0
  953. mypyc/test-data/irbuild-bytes.test +184 -0
  954. mypyc/test-data/irbuild-classes.test +1303 -0
  955. mypyc/test-data/irbuild-constant-fold.test +480 -0
  956. mypyc/test-data/irbuild-dict.test +585 -0
  957. mypyc/test-data/irbuild-dunders.test +223 -0
  958. mypyc/test-data/irbuild-float.test +497 -0
  959. mypyc/test-data/irbuild-generics.test +151 -0
  960. mypyc/test-data/irbuild-glue-methods.test +437 -0
  961. mypyc/test-data/irbuild-i16.test +526 -0
  962. mypyc/test-data/irbuild-i32.test +598 -0
  963. mypyc/test-data/irbuild-i64.test +2164 -0
  964. mypyc/test-data/irbuild-int.test +235 -0
  965. mypyc/test-data/irbuild-isinstance.test +109 -0
  966. mypyc/test-data/irbuild-lists.test +547 -0
  967. mypyc/test-data/irbuild-match.test +1708 -0
  968. mypyc/test-data/irbuild-math.test +64 -0
  969. mypyc/test-data/irbuild-nested.test +807 -0
  970. mypyc/test-data/irbuild-optional.test +536 -0
  971. mypyc/test-data/irbuild-set.test +838 -0
  972. mypyc/test-data/irbuild-singledispatch.test +257 -0
  973. mypyc/test-data/irbuild-statements.test +1149 -0
  974. mypyc/test-data/irbuild-str.test +314 -0
  975. mypyc/test-data/irbuild-strip-asserts.test +12 -0
  976. mypyc/test-data/irbuild-try.test +523 -0
  977. mypyc/test-data/irbuild-tuple.test +462 -0
  978. mypyc/test-data/irbuild-u8.test +543 -0
  979. mypyc/test-data/irbuild-unreachable.test +241 -0
  980. mypyc/test-data/irbuild-vectorcall.test +153 -0
  981. mypyc/test-data/refcount.test +1588 -0
  982. mypyc/test-data/run-async.test +145 -0
  983. mypyc/test-data/run-attrs.test +318 -0
  984. mypyc/test-data/run-bench.test +196 -0
  985. mypyc/test-data/run-bools.test +229 -0
  986. mypyc/test-data/run-bytes.test +302 -0
  987. mypyc/test-data/run-classes.test +2505 -0
  988. mypyc/test-data/run-dicts.test +334 -0
  989. mypyc/test-data/run-dunders.test +945 -0
  990. mypyc/test-data/run-exceptions.test +448 -0
  991. mypyc/test-data/run-floats.test +516 -0
  992. mypyc/test-data/run-functions.test +1310 -0
  993. mypyc/test-data/run-generators.test +681 -0
  994. mypyc/test-data/run-i16.test +338 -0
  995. mypyc/test-data/run-i32.test +336 -0
  996. mypyc/test-data/run-i64.test +1519 -0
  997. mypyc/test-data/run-imports.test +265 -0
  998. mypyc/test-data/run-integers.test +540 -0
  999. mypyc/test-data/run-lists.test +411 -0
  1000. mypyc/test-data/run-loops.test +485 -0
  1001. mypyc/test-data/run-match.test +283 -0
  1002. mypyc/test-data/run-math.test +106 -0
  1003. mypyc/test-data/run-misc.test +1168 -0
  1004. mypyc/test-data/run-multimodule.test +887 -0
  1005. mypyc/test-data/run-mypy-sim.test +138 -0
  1006. mypyc/test-data/run-primitives.test +375 -0
  1007. mypyc/test-data/run-python37.test +159 -0
  1008. mypyc/test-data/run-python38.test +88 -0
  1009. mypyc/test-data/run-sets.test +150 -0
  1010. mypyc/test-data/run-singledispatch.test +698 -0
  1011. mypyc/test-data/run-strings.test +641 -0
  1012. mypyc/test-data/run-traits.test +411 -0
  1013. mypyc/test-data/run-tuples.test +258 -0
  1014. mypyc/test-data/run-u8.test +303 -0
  1015. mypyc/transform/__init__.py +0 -0
  1016. mypyc/transform/exceptions.py +182 -0
  1017. mypyc/transform/refcount.py +294 -0
  1018. mypyc/transform/uninit.py +190 -0
mypy/modulefinder.py ADDED
@@ -0,0 +1,875 @@
1
+ """Low-level infrastructure to find modules.
2
+
3
+ This builds on fscache.py; find_sources.py builds on top of this.
4
+ """
5
+
6
+ from __future__ import annotations
7
+
8
+ import ast
9
+ import collections
10
+ import functools
11
+ import os
12
+ import re
13
+ import subprocess
14
+ import sys
15
+ from enum import Enum, unique
16
+ from typing import Dict, Final, List, NamedTuple, Optional, Tuple, Union
17
+ from typing_extensions import TypeAlias as _TypeAlias
18
+
19
+ from mypy import pyinfo
20
+ from mypy.errors import CompileError
21
+ from mypy.fscache import FileSystemCache
22
+ from mypy.nodes import MypyFile
23
+ from mypy.options import Options
24
+ from mypy.stubinfo import approved_stub_package_exists
25
+
26
+
27
+ # Paths to be searched in find_module().
28
+ class SearchPaths(NamedTuple):
29
+ python_path: tuple[str, ...] # where user code is found
30
+ mypy_path: tuple[str, ...] # from $MYPYPATH or config variable
31
+ package_path: tuple[str, ...] # from get_site_packages_dirs()
32
+ typeshed_path: tuple[str, ...] # paths in typeshed
33
+
34
+
35
+ # Package dirs are a two-tuple of path to search and whether to verify the module
36
+ OnePackageDir = Tuple[str, bool]
37
+ PackageDirs = List[OnePackageDir]
38
+
39
+ # Minimum and maximum Python versions for modules in stdlib as (major, minor)
40
+ StdlibVersions: _TypeAlias = Dict[str, Tuple[Tuple[int, int], Optional[Tuple[int, int]]]]
41
+
42
+ PYTHON_EXTENSIONS: Final = [".pyi", ".py"]
43
+
44
+
45
+ # TODO: Consider adding more reasons here?
46
+ # E.g. if we deduce a module would likely be found if the user were
47
+ # to set the --namespace-packages flag.
48
+ @unique
49
+ class ModuleNotFoundReason(Enum):
50
+ # The module was not found: we found neither stubs nor a plausible code
51
+ # implementation (with or without a py.typed file).
52
+ NOT_FOUND = 0
53
+
54
+ # The implementation for this module plausibly exists (e.g. we
55
+ # found a matching folder or *.py file), but either the parent package
56
+ # did not contain a py.typed file or we were unable to find a
57
+ # corresponding *-stubs package.
58
+ FOUND_WITHOUT_TYPE_HINTS = 1
59
+
60
+ # The module was not found in the current working directory, but
61
+ # was able to be found in the parent directory.
62
+ WRONG_WORKING_DIRECTORY = 2
63
+
64
+ # Stub PyPI package (typically types-pkgname) known to exist but not installed.
65
+ APPROVED_STUBS_NOT_INSTALLED = 3
66
+
67
+ def error_message_templates(self, daemon: bool) -> tuple[str, list[str]]:
68
+ doc_link = "See https://mypy.readthedocs.io/en/stable/running_mypy.html#missing-imports"
69
+ if self is ModuleNotFoundReason.NOT_FOUND:
70
+ msg = 'Cannot find implementation or library stub for module named "{module}"'
71
+ notes = [doc_link]
72
+ elif self is ModuleNotFoundReason.WRONG_WORKING_DIRECTORY:
73
+ msg = 'Cannot find implementation or library stub for module named "{module}"'
74
+ notes = [
75
+ "You may be running mypy in a subpackage, "
76
+ "mypy should be run on the package root"
77
+ ]
78
+ elif self is ModuleNotFoundReason.FOUND_WITHOUT_TYPE_HINTS:
79
+ msg = (
80
+ 'Skipping analyzing "{module}": module is installed, but missing library stubs '
81
+ "or py.typed marker"
82
+ )
83
+ notes = [doc_link]
84
+ elif self is ModuleNotFoundReason.APPROVED_STUBS_NOT_INSTALLED:
85
+ msg = 'Library stubs not installed for "{module}"'
86
+ notes = ['Hint: "python3 -m pip install {stub_dist}"']
87
+ if not daemon:
88
+ notes.append(
89
+ '(or run "mypy --install-types" to install all missing stub packages)'
90
+ )
91
+ notes.append(doc_link)
92
+ else:
93
+ assert False
94
+ return msg, notes
95
+
96
+
97
+ # If we found the module, returns the path to the module as a str.
98
+ # Otherwise, returns the reason why the module wasn't found.
99
+ ModuleSearchResult = Union[str, ModuleNotFoundReason]
100
+
101
+
102
+ class BuildSource:
103
+ """A single source file."""
104
+
105
+ def __init__(
106
+ self,
107
+ path: str | None,
108
+ module: str | None,
109
+ text: str | None = None,
110
+ base_dir: str | None = None,
111
+ followed: bool = False,
112
+ ) -> None:
113
+ self.path = path # File where it's found (e.g. 'xxx/yyy/foo/bar.py')
114
+ self.module = module or "__main__" # Module name (e.g. 'foo.bar')
115
+ self.text = text # Source code, if initially supplied, else None
116
+ self.base_dir = base_dir # Directory where the package is rooted (e.g. 'xxx/yyy')
117
+ self.followed = followed # Was this found by following imports?
118
+
119
+ def __repr__(self) -> str:
120
+ return (
121
+ "BuildSource(path={!r}, module={!r}, has_text={}, base_dir={!r}, followed={})".format(
122
+ self.path, self.module, self.text is not None, self.base_dir, self.followed
123
+ )
124
+ )
125
+
126
+
127
+ class BuildSourceSet:
128
+ """Helper to efficiently test a file's membership in a set of build sources."""
129
+
130
+ def __init__(self, sources: list[BuildSource]) -> None:
131
+ self.source_text_present = False
132
+ self.source_modules: dict[str, str] = {}
133
+ self.source_paths: set[str] = set()
134
+
135
+ for source in sources:
136
+ if source.text is not None:
137
+ self.source_text_present = True
138
+ if source.path:
139
+ self.source_paths.add(source.path)
140
+ if source.module:
141
+ self.source_modules[source.module] = source.path or ""
142
+
143
+ def is_source(self, file: MypyFile) -> bool:
144
+ return (
145
+ (file.path and file.path in self.source_paths)
146
+ or file._fullname in self.source_modules
147
+ or self.source_text_present
148
+ )
149
+
150
+
151
+ class FindModuleCache:
152
+ """Module finder with integrated cache.
153
+
154
+ Module locations and some intermediate results are cached internally
155
+ and can be cleared with the clear() method.
156
+
157
+ All file system accesses are performed through a FileSystemCache,
158
+ which is not ever cleared by this class. If necessary it must be
159
+ cleared by client code.
160
+ """
161
+
162
+ def __init__(
163
+ self,
164
+ search_paths: SearchPaths,
165
+ fscache: FileSystemCache | None,
166
+ options: Options | None,
167
+ stdlib_py_versions: StdlibVersions | None = None,
168
+ source_set: BuildSourceSet | None = None,
169
+ ) -> None:
170
+ self.search_paths = search_paths
171
+ self.source_set = source_set
172
+ self.fscache = fscache or FileSystemCache()
173
+ # Cache for get_toplevel_possibilities:
174
+ # search_paths -> (toplevel_id -> list(package_dirs))
175
+ self.initial_components: dict[tuple[str, ...], dict[str, list[str]]] = {}
176
+ # Cache find_module: id -> result
177
+ self.results: dict[str, ModuleSearchResult] = {}
178
+ self.ns_ancestors: dict[str, str] = {}
179
+ self.options = options
180
+ custom_typeshed_dir = None
181
+ if options:
182
+ custom_typeshed_dir = options.custom_typeshed_dir
183
+ self.stdlib_py_versions = stdlib_py_versions or load_stdlib_py_versions(
184
+ custom_typeshed_dir
185
+ )
186
+
187
+ def clear(self) -> None:
188
+ self.results.clear()
189
+ self.initial_components.clear()
190
+ self.ns_ancestors.clear()
191
+
192
+ def find_module_via_source_set(self, id: str) -> ModuleSearchResult | None:
193
+ """Fast path to find modules by looking through the input sources
194
+
195
+ This is only used when --fast-module-lookup is passed on the command line."""
196
+ if not self.source_set:
197
+ return None
198
+
199
+ p = self.source_set.source_modules.get(id, None)
200
+ if p and self.fscache.isfile(p):
201
+ # We need to make sure we still have __init__.py all the way up
202
+ # otherwise we might have false positives compared to slow path
203
+ # in case of deletion of init files, which is covered by some tests.
204
+ # TODO: are there some combination of flags in which this check should be skipped?
205
+ d = os.path.dirname(p)
206
+ for _ in range(id.count(".")):
207
+ if not any(
208
+ self.fscache.isfile(os.path.join(d, "__init__" + x)) for x in PYTHON_EXTENSIONS
209
+ ):
210
+ return None
211
+ d = os.path.dirname(d)
212
+ return p
213
+
214
+ idx = id.rfind(".")
215
+ if idx != -1:
216
+ # When we're looking for foo.bar.baz and can't find a matching module
217
+ # in the source set, look up for a foo.bar module.
218
+ parent = self.find_module_via_source_set(id[:idx])
219
+ if parent is None or not isinstance(parent, str):
220
+ return None
221
+
222
+ basename, ext = os.path.splitext(parent)
223
+ if not any(parent.endswith("__init__" + x) for x in PYTHON_EXTENSIONS) and (
224
+ ext in PYTHON_EXTENSIONS and not self.fscache.isdir(basename)
225
+ ):
226
+ # If we do find such a *module* (and crucially, we don't want a package,
227
+ # hence the filtering out of __init__ files, and checking for the presence
228
+ # of a folder with a matching name), then we can be pretty confident that
229
+ # 'baz' will either be a top-level variable in foo.bar, or will not exist.
230
+ #
231
+ # Either way, spelunking in other search paths for another 'foo.bar.baz'
232
+ # module should be avoided because:
233
+ # 1. in the unlikely event that one were found, it's highly likely that
234
+ # it would be unrelated to the source being typechecked and therefore
235
+ # more likely to lead to erroneous results
236
+ # 2. as described in _find_module, in some cases the search itself could
237
+ # potentially waste significant amounts of time
238
+ return ModuleNotFoundReason.NOT_FOUND
239
+ return None
240
+
241
+ def find_lib_path_dirs(self, id: str, lib_path: tuple[str, ...]) -> PackageDirs:
242
+ """Find which elements of a lib_path have the directory a module needs to exist.
243
+
244
+ This is run for the python_path, mypy_path, and typeshed_path search paths.
245
+ """
246
+ components = id.split(".")
247
+ dir_chain = os.sep.join(components[:-1]) # e.g., 'foo/bar'
248
+
249
+ dirs = []
250
+ for pathitem in self.get_toplevel_possibilities(lib_path, components[0]):
251
+ # e.g., '/usr/lib/python3.4/foo/bar'
252
+ dir = os.path.normpath(os.path.join(pathitem, dir_chain))
253
+ if self.fscache.isdir(dir):
254
+ dirs.append((dir, True))
255
+ return dirs
256
+
257
+ def get_toplevel_possibilities(self, lib_path: tuple[str, ...], id: str) -> list[str]:
258
+ """Find which elements of lib_path could contain a particular top-level module.
259
+
260
+ In practice, almost all modules can be routed to the correct entry in
261
+ lib_path by looking at just the first component of the module name.
262
+
263
+ We take advantage of this by enumerating the contents of all of the
264
+ directories on the lib_path and building a map of which entries in
265
+ the lib_path could contain each potential top-level module that appears.
266
+ """
267
+
268
+ if lib_path in self.initial_components:
269
+ return self.initial_components[lib_path].get(id, [])
270
+
271
+ # Enumerate all the files in the directories on lib_path and produce the map
272
+ components: dict[str, list[str]] = {}
273
+ for dir in lib_path:
274
+ try:
275
+ contents = self.fscache.listdir(dir)
276
+ except OSError:
277
+ contents = []
278
+ # False positives are fine for correctness here, since we will check
279
+ # precisely later, so we only look at the root of every filename without
280
+ # any concern for the exact details.
281
+ for name in contents:
282
+ name = os.path.splitext(name)[0]
283
+ components.setdefault(name, []).append(dir)
284
+
285
+ self.initial_components[lib_path] = components
286
+ return components.get(id, [])
287
+
288
+ def find_module(self, id: str, *, fast_path: bool = False) -> ModuleSearchResult:
289
+ """Return the path of the module source file or why it wasn't found.
290
+
291
+ If fast_path is True, prioritize performance over generating detailed
292
+ error descriptions.
293
+ """
294
+ if id not in self.results:
295
+ top_level = id.partition(".")[0]
296
+ use_typeshed = True
297
+ if id in self.stdlib_py_versions:
298
+ use_typeshed = self._typeshed_has_version(id)
299
+ elif top_level in self.stdlib_py_versions:
300
+ use_typeshed = self._typeshed_has_version(top_level)
301
+ self.results[id] = self._find_module(id, use_typeshed)
302
+ if (
303
+ not (fast_path or (self.options is not None and self.options.fast_module_lookup))
304
+ and self.results[id] is ModuleNotFoundReason.NOT_FOUND
305
+ and self._can_find_module_in_parent_dir(id)
306
+ ):
307
+ self.results[id] = ModuleNotFoundReason.WRONG_WORKING_DIRECTORY
308
+ return self.results[id]
309
+
310
+ def _typeshed_has_version(self, module: str) -> bool:
311
+ if not self.options:
312
+ return True
313
+ version = typeshed_py_version(self.options)
314
+ min_version, max_version = self.stdlib_py_versions[module]
315
+ return version >= min_version and (max_version is None or version <= max_version)
316
+
317
+ def _find_module_non_stub_helper(
318
+ self, components: list[str], pkg_dir: str
319
+ ) -> OnePackageDir | ModuleNotFoundReason:
320
+ plausible_match = False
321
+ dir_path = pkg_dir
322
+ for index, component in enumerate(components):
323
+ dir_path = os.path.join(dir_path, component)
324
+ if self.fscache.isfile(os.path.join(dir_path, "py.typed")):
325
+ return os.path.join(pkg_dir, *components[:-1]), index == 0
326
+ elif not plausible_match and (
327
+ self.fscache.isdir(dir_path) or self.fscache.isfile(dir_path + ".py")
328
+ ):
329
+ plausible_match = True
330
+ # If this is not a directory then we can't traverse further into it
331
+ if not self.fscache.isdir(dir_path):
332
+ break
333
+ for i in range(len(components), 0, -1):
334
+ if approved_stub_package_exists(".".join(components[:i])):
335
+ return ModuleNotFoundReason.APPROVED_STUBS_NOT_INSTALLED
336
+ if plausible_match:
337
+ return ModuleNotFoundReason.FOUND_WITHOUT_TYPE_HINTS
338
+ else:
339
+ return ModuleNotFoundReason.NOT_FOUND
340
+
341
+ def _update_ns_ancestors(self, components: list[str], match: tuple[str, bool]) -> None:
342
+ path, verify = match
343
+ for i in range(1, len(components)):
344
+ pkg_id = ".".join(components[:-i])
345
+ if pkg_id not in self.ns_ancestors and self.fscache.isdir(path):
346
+ self.ns_ancestors[pkg_id] = path
347
+ path = os.path.dirname(path)
348
+
349
+ def _can_find_module_in_parent_dir(self, id: str) -> bool:
350
+ """Test if a module can be found by checking the parent directories
351
+ of the current working directory.
352
+ """
353
+ working_dir = os.getcwd()
354
+ parent_search = FindModuleCache(
355
+ SearchPaths((), (), (), ()),
356
+ self.fscache,
357
+ self.options,
358
+ stdlib_py_versions=self.stdlib_py_versions,
359
+ )
360
+ while any(is_init_file(file) for file in os.listdir(working_dir)):
361
+ working_dir = os.path.dirname(working_dir)
362
+ parent_search.search_paths = SearchPaths((working_dir,), (), (), ())
363
+ if not isinstance(parent_search._find_module(id, False), ModuleNotFoundReason):
364
+ return True
365
+ return False
366
+
367
+ def _find_module(self, id: str, use_typeshed: bool) -> ModuleSearchResult:
368
+ fscache = self.fscache
369
+
370
+ # Fast path for any modules in the current source set.
371
+ # This is particularly important when there are a large number of search
372
+ # paths which share the first (few) component(s) due to the use of namespace
373
+ # packages, for instance:
374
+ # foo/
375
+ # company/
376
+ # __init__.py
377
+ # foo/
378
+ # bar/
379
+ # company/
380
+ # __init__.py
381
+ # bar/
382
+ # baz/
383
+ # company/
384
+ # __init__.py
385
+ # baz/
386
+ #
387
+ # mypy gets [foo/company/foo, bar/company/bar, baz/company/baz, ...] as input
388
+ # and computes [foo, bar, baz, ...] as the module search path.
389
+ #
390
+ # This would result in O(n) search for every import of company.*, leading to
391
+ # O(n**2) behavior in load_graph as such imports are unsurprisingly present
392
+ # at least once, and usually many more times than that, in each and every file
393
+ # being parsed.
394
+ #
395
+ # Thankfully, such cases are efficiently handled by looking up the module path
396
+ # via BuildSourceSet.
397
+ p = (
398
+ self.find_module_via_source_set(id)
399
+ if (self.options is not None and self.options.fast_module_lookup)
400
+ else None
401
+ )
402
+ if p:
403
+ return p
404
+
405
+ # If we're looking for a module like 'foo.bar.baz', it's likely that most of the
406
+ # many elements of lib_path don't even have a subdirectory 'foo/bar'. Discover
407
+ # that only once and cache it for when we look for modules like 'foo.bar.blah'
408
+ # that will require the same subdirectory.
409
+ components = id.split(".")
410
+ dir_chain = os.sep.join(components[:-1]) # e.g., 'foo/bar'
411
+
412
+ # We have two sets of folders so that we collect *all* stubs folders and
413
+ # put them in the front of the search path
414
+ third_party_inline_dirs: PackageDirs = []
415
+ third_party_stubs_dirs: PackageDirs = []
416
+ found_possible_third_party_missing_type_hints = False
417
+ need_installed_stubs = False
418
+ # Third-party stub/typed packages
419
+ for pkg_dir in self.search_paths.package_path:
420
+ stub_name = components[0] + "-stubs"
421
+ stub_dir = os.path.join(pkg_dir, stub_name)
422
+ if fscache.isdir(stub_dir):
423
+ stub_typed_file = os.path.join(stub_dir, "py.typed")
424
+ stub_components = [stub_name] + components[1:]
425
+ path = os.path.join(pkg_dir, *stub_components[:-1])
426
+ if fscache.isdir(path):
427
+ if fscache.isfile(stub_typed_file):
428
+ # Stub packages can have a py.typed file, which must include
429
+ # 'partial\n' to make the package partial
430
+ # Partial here means that mypy should look at the runtime
431
+ # package if installed.
432
+ if fscache.read(stub_typed_file).decode().strip() == "partial":
433
+ runtime_path = os.path.join(pkg_dir, dir_chain)
434
+ third_party_inline_dirs.append((runtime_path, True))
435
+ # if the package is partial, we don't verify the module, as
436
+ # the partial stub package may not have a __init__.pyi
437
+ third_party_stubs_dirs.append((path, False))
438
+ else:
439
+ # handle the edge case where people put a py.typed file
440
+ # in a stub package, but it isn't partial
441
+ third_party_stubs_dirs.append((path, True))
442
+ else:
443
+ third_party_stubs_dirs.append((path, True))
444
+ non_stub_match = self._find_module_non_stub_helper(components, pkg_dir)
445
+ if isinstance(non_stub_match, ModuleNotFoundReason):
446
+ if non_stub_match is ModuleNotFoundReason.FOUND_WITHOUT_TYPE_HINTS:
447
+ found_possible_third_party_missing_type_hints = True
448
+ elif non_stub_match is ModuleNotFoundReason.APPROVED_STUBS_NOT_INSTALLED:
449
+ need_installed_stubs = True
450
+ else:
451
+ third_party_inline_dirs.append(non_stub_match)
452
+ self._update_ns_ancestors(components, non_stub_match)
453
+ if self.options and self.options.use_builtins_fixtures:
454
+ # Everything should be in fixtures.
455
+ third_party_inline_dirs.clear()
456
+ third_party_stubs_dirs.clear()
457
+ found_possible_third_party_missing_type_hints = False
458
+ python_mypy_path = self.search_paths.mypy_path + self.search_paths.python_path
459
+ candidate_base_dirs = self.find_lib_path_dirs(id, python_mypy_path)
460
+ if use_typeshed:
461
+ # Search for stdlib stubs in typeshed before installed
462
+ # stubs to avoid picking up backports (dataclasses, for
463
+ # example) when the library is included in stdlib.
464
+ candidate_base_dirs += self.find_lib_path_dirs(id, self.search_paths.typeshed_path)
465
+ candidate_base_dirs += third_party_stubs_dirs + third_party_inline_dirs
466
+
467
+ # If we're looking for a module like 'foo.bar.baz', then candidate_base_dirs now
468
+ # contains just the subdirectories 'foo/bar' that actually exist under the
469
+ # elements of lib_path. This is probably much shorter than lib_path itself.
470
+ # Now just look for 'baz.pyi', 'baz/__init__.py', etc., inside those directories.
471
+ seplast = os.sep + components[-1] # so e.g. '/baz'
472
+ sepinit = os.sep + "__init__"
473
+ near_misses = [] # Collect near misses for namespace mode (see below).
474
+ for base_dir, verify in candidate_base_dirs:
475
+ base_path = base_dir + seplast # so e.g. '/usr/lib/python3.4/foo/bar/baz'
476
+ has_init = False
477
+ dir_prefix = base_dir
478
+ for _ in range(len(components) - 1):
479
+ dir_prefix = os.path.dirname(dir_prefix)
480
+ # Prefer package over module, i.e. baz/__init__.py* over baz.py*.
481
+ for extension in PYTHON_EXTENSIONS:
482
+ path = base_path + sepinit + extension
483
+ path_stubs = base_path + "-stubs" + sepinit + extension
484
+ if fscache.isfile_case(path, dir_prefix):
485
+ has_init = True
486
+ if verify and not verify_module(fscache, id, path, dir_prefix):
487
+ near_misses.append((path, dir_prefix))
488
+ continue
489
+ return path
490
+ elif fscache.isfile_case(path_stubs, dir_prefix):
491
+ if verify and not verify_module(fscache, id, path_stubs, dir_prefix):
492
+ near_misses.append((path_stubs, dir_prefix))
493
+ continue
494
+ return path_stubs
495
+
496
+ # In namespace mode, register a potential namespace package
497
+ if self.options and self.options.namespace_packages:
498
+ if (
499
+ not has_init
500
+ and fscache.exists_case(base_path, dir_prefix)
501
+ and not fscache.isfile_case(base_path, dir_prefix)
502
+ ):
503
+ near_misses.append((base_path, dir_prefix))
504
+
505
+ # No package, look for module.
506
+ for extension in PYTHON_EXTENSIONS:
507
+ path = base_path + extension
508
+ if fscache.isfile_case(path, dir_prefix):
509
+ if verify and not verify_module(fscache, id, path, dir_prefix):
510
+ near_misses.append((path, dir_prefix))
511
+ continue
512
+ return path
513
+
514
+ # In namespace mode, re-check those entries that had 'verify'.
515
+ # Assume search path entries xxx, yyy and zzz, and we're
516
+ # looking for foo.bar.baz. Suppose near_misses has:
517
+ #
518
+ # - xxx/foo/bar/baz.py
519
+ # - yyy/foo/bar/baz/__init__.py
520
+ # - zzz/foo/bar/baz.pyi
521
+ #
522
+ # If any of the foo directories has __init__.py[i], it wins.
523
+ # Else, we look for foo/bar/__init__.py[i], etc. If there are
524
+ # none, the first hit wins. Note that this does not take into
525
+ # account whether the lowest-level module is a file (baz.py),
526
+ # a package (baz/__init__.py), or a stub file (baz.pyi) -- for
527
+ # these the first one encountered along the search path wins.
528
+ #
529
+ # The helper function highest_init_level() returns an int that
530
+ # indicates the highest level at which a __init__.py[i] file
531
+ # is found; if no __init__ was found it returns 0, if we find
532
+ # only foo/bar/__init__.py it returns 1, and if we have
533
+ # foo/__init__.py it returns 2 (regardless of what's in
534
+ # foo/bar). It doesn't look higher than that.
535
+ if self.options and self.options.namespace_packages and near_misses:
536
+ levels = [
537
+ highest_init_level(fscache, id, path, dir_prefix)
538
+ for path, dir_prefix in near_misses
539
+ ]
540
+ index = levels.index(max(levels))
541
+ return near_misses[index][0]
542
+
543
+ # Finally, we may be asked to produce an ancestor for an
544
+ # installed package with a py.typed marker that is a
545
+ # subpackage of a namespace package. We only fess up to these
546
+ # if we would otherwise return "not found".
547
+ ancestor = self.ns_ancestors.get(id)
548
+ if ancestor is not None:
549
+ return ancestor
550
+
551
+ if need_installed_stubs:
552
+ return ModuleNotFoundReason.APPROVED_STUBS_NOT_INSTALLED
553
+ elif found_possible_third_party_missing_type_hints:
554
+ return ModuleNotFoundReason.FOUND_WITHOUT_TYPE_HINTS
555
+ else:
556
+ return ModuleNotFoundReason.NOT_FOUND
557
+
558
+ def find_modules_recursive(self, module: str) -> list[BuildSource]:
559
+ module_path = self.find_module(module)
560
+ if isinstance(module_path, ModuleNotFoundReason):
561
+ return []
562
+ sources = [BuildSource(module_path, module, None)]
563
+
564
+ package_path = None
565
+ if is_init_file(module_path):
566
+ package_path = os.path.dirname(module_path)
567
+ elif self.fscache.isdir(module_path):
568
+ package_path = module_path
569
+ if package_path is None:
570
+ return sources
571
+
572
+ # This logic closely mirrors that in find_sources. One small but important difference is
573
+ # that we do not sort names with keyfunc. The recursive call to find_modules_recursive
574
+ # calls find_module, which will handle the preference between packages, pyi and py.
575
+ # Another difference is it doesn't handle nested search paths / package roots.
576
+
577
+ seen: set[str] = set()
578
+ names = sorted(self.fscache.listdir(package_path))
579
+ for name in names:
580
+ # Skip certain names altogether
581
+ if name in ("__pycache__", "site-packages", "node_modules") or name.startswith("."):
582
+ continue
583
+ subpath = os.path.join(package_path, name)
584
+
585
+ if self.options and matches_exclude(
586
+ subpath, self.options.exclude, self.fscache, self.options.verbosity >= 2
587
+ ):
588
+ continue
589
+
590
+ if self.fscache.isdir(subpath):
591
+ # Only recurse into packages
592
+ if (self.options and self.options.namespace_packages) or (
593
+ self.fscache.isfile(os.path.join(subpath, "__init__.py"))
594
+ or self.fscache.isfile(os.path.join(subpath, "__init__.pyi"))
595
+ ):
596
+ seen.add(name)
597
+ sources.extend(self.find_modules_recursive(module + "." + name))
598
+ else:
599
+ stem, suffix = os.path.splitext(name)
600
+ if stem == "__init__":
601
+ continue
602
+ if stem not in seen and "." not in stem and suffix in PYTHON_EXTENSIONS:
603
+ # (If we sorted names by keyfunc) we could probably just make the BuildSource
604
+ # ourselves, but this ensures compatibility with find_module / the cache
605
+ seen.add(stem)
606
+ sources.extend(self.find_modules_recursive(module + "." + stem))
607
+ return sources
608
+
609
+
610
+ def matches_exclude(
611
+ subpath: str, excludes: list[str], fscache: FileSystemCache, verbose: bool
612
+ ) -> bool:
613
+ if not excludes:
614
+ return False
615
+ subpath_str = os.path.relpath(subpath).replace(os.sep, "/")
616
+ if fscache.isdir(subpath):
617
+ subpath_str += "/"
618
+ for exclude in excludes:
619
+ if re.search(exclude, subpath_str):
620
+ if verbose:
621
+ print(
622
+ f"TRACE: Excluding {subpath_str} (matches pattern {exclude})", file=sys.stderr
623
+ )
624
+ return True
625
+ return False
626
+
627
+
628
+ def is_init_file(path: str) -> bool:
629
+ return os.path.basename(path) in ("__init__.py", "__init__.pyi")
630
+
631
+
632
+ def verify_module(fscache: FileSystemCache, id: str, path: str, prefix: str) -> bool:
633
+ """Check that all packages containing id have a __init__ file."""
634
+ if is_init_file(path):
635
+ path = os.path.dirname(path)
636
+ for i in range(id.count(".")):
637
+ path = os.path.dirname(path)
638
+ if not any(
639
+ fscache.isfile_case(os.path.join(path, f"__init__{extension}"), prefix)
640
+ for extension in PYTHON_EXTENSIONS
641
+ ):
642
+ return False
643
+ return True
644
+
645
+
646
+ def highest_init_level(fscache: FileSystemCache, id: str, path: str, prefix: str) -> int:
647
+ """Compute the highest level where an __init__ file is found."""
648
+ if is_init_file(path):
649
+ path = os.path.dirname(path)
650
+ level = 0
651
+ for i in range(id.count(".")):
652
+ path = os.path.dirname(path)
653
+ if any(
654
+ fscache.isfile_case(os.path.join(path, f"__init__{extension}"), prefix)
655
+ for extension in PYTHON_EXTENSIONS
656
+ ):
657
+ level = i + 1
658
+ return level
659
+
660
+
661
+ def mypy_path() -> list[str]:
662
+ path_env = os.getenv("MYPYPATH")
663
+ if not path_env:
664
+ return []
665
+ return path_env.split(os.pathsep)
666
+
667
+
668
+ def default_lib_path(
669
+ data_dir: str, pyversion: tuple[int, int], custom_typeshed_dir: str | None
670
+ ) -> list[str]:
671
+ """Return default standard library search paths."""
672
+ path: list[str] = []
673
+
674
+ if custom_typeshed_dir:
675
+ typeshed_dir = os.path.join(custom_typeshed_dir, "stdlib")
676
+ mypy_extensions_dir = os.path.join(custom_typeshed_dir, "stubs", "mypy-extensions")
677
+ versions_file = os.path.join(typeshed_dir, "VERSIONS")
678
+ if not os.path.isdir(typeshed_dir) or not os.path.isfile(versions_file):
679
+ print(
680
+ "error: --custom-typeshed-dir does not point to a valid typeshed ({})".format(
681
+ custom_typeshed_dir
682
+ )
683
+ )
684
+ sys.exit(2)
685
+ else:
686
+ auto = os.path.join(data_dir, "stubs-auto")
687
+ if os.path.isdir(auto):
688
+ data_dir = auto
689
+ typeshed_dir = os.path.join(data_dir, "typeshed", "stdlib")
690
+ mypy_extensions_dir = os.path.join(data_dir, "typeshed", "stubs", "mypy-extensions")
691
+ path.append(typeshed_dir)
692
+
693
+ # Get mypy-extensions stubs from typeshed, since we treat it as an
694
+ # "internal" library, similar to typing and typing-extensions.
695
+ path.append(mypy_extensions_dir)
696
+
697
+ # Add fallback path that can be used if we have a broken installation.
698
+ if sys.platform != "win32":
699
+ path.append("/usr/local/lib/mypy")
700
+ if not path:
701
+ print(
702
+ "Could not resolve typeshed subdirectories. Your mypy install is broken.\n"
703
+ "Python executable is located at {}.\nMypy located at {}".format(
704
+ sys.executable, data_dir
705
+ ),
706
+ file=sys.stderr,
707
+ )
708
+ sys.exit(1)
709
+ return path
710
+
711
+
712
+ @functools.lru_cache(maxsize=None)
713
+ def get_search_dirs(python_executable: str | None) -> tuple[list[str], list[str]]:
714
+ """Find package directories for given python.
715
+
716
+ This runs a subprocess call, which generates a list of the directories in sys.path.
717
+ To avoid repeatedly calling a subprocess (which can be slow!) we
718
+ lru_cache the results.
719
+ """
720
+
721
+ if python_executable is None:
722
+ return ([], [])
723
+ elif python_executable == sys.executable:
724
+ # Use running Python's package dirs
725
+ sys_path, site_packages = pyinfo.getsearchdirs()
726
+ else:
727
+ # Use subprocess to get the package directory of given Python
728
+ # executable
729
+ env = {**dict(os.environ), "PYTHONSAFEPATH": "1"}
730
+ try:
731
+ sys_path, site_packages = ast.literal_eval(
732
+ subprocess.check_output(
733
+ [python_executable, pyinfo.__file__, "getsearchdirs"],
734
+ env=env,
735
+ stderr=subprocess.PIPE,
736
+ ).decode()
737
+ )
738
+ except subprocess.CalledProcessError as err:
739
+ print(err.stderr)
740
+ print(err.stdout)
741
+ raise
742
+ except OSError as err:
743
+ reason = os.strerror(err.errno)
744
+ raise CompileError(
745
+ [f"mypy: Invalid python executable '{python_executable}': {reason}"]
746
+ ) from err
747
+ return sys_path, site_packages
748
+
749
+
750
+ def compute_search_paths(
751
+ sources: list[BuildSource], options: Options, data_dir: str, alt_lib_path: str | None = None
752
+ ) -> SearchPaths:
753
+ """Compute the search paths as specified in PEP 561.
754
+
755
+ There are the following 4 members created:
756
+ - User code (from `sources`)
757
+ - MYPYPATH (set either via config or environment variable)
758
+ - installed package directories (which will later be split into stub-only and inline)
759
+ - typeshed
760
+ """
761
+ # Determine the default module search path.
762
+ lib_path = collections.deque(
763
+ default_lib_path(
764
+ data_dir, options.python_version, custom_typeshed_dir=options.custom_typeshed_dir
765
+ )
766
+ )
767
+
768
+ if options.use_builtins_fixtures:
769
+ # Use stub builtins (to speed up test cases and to make them easier to
770
+ # debug). This is a test-only feature, so assume our files are laid out
771
+ # as in the source tree.
772
+ # We also need to allow overriding where to look for it. Argh.
773
+ root_dir = os.getenv("MYPY_TEST_PREFIX", None)
774
+ if not root_dir:
775
+ root_dir = os.path.dirname(os.path.dirname(__file__))
776
+ lib_path.appendleft(os.path.join(root_dir, "test-data", "unit", "lib-stub"))
777
+ # alt_lib_path is used by some tests to bypass the normal lib_path mechanics.
778
+ # If we don't have one, grab directories of source files.
779
+ python_path: list[str] = []
780
+ if not alt_lib_path:
781
+ for source in sources:
782
+ # Include directory of the program file in the module search path.
783
+ if source.base_dir:
784
+ dir = source.base_dir
785
+ if dir not in python_path:
786
+ python_path.append(dir)
787
+
788
+ # Do this even if running as a file, for sanity (mainly because with
789
+ # multiple builds, there could be a mix of files/modules, so its easier
790
+ # to just define the semantics that we always add the current director
791
+ # to the lib_path
792
+ # TODO: Don't do this in some cases; for motivation see see
793
+ # https://github.com/python/mypy/issues/4195#issuecomment-341915031
794
+ if options.bazel:
795
+ dir = "."
796
+ else:
797
+ dir = os.getcwd()
798
+ if dir not in lib_path:
799
+ python_path.insert(0, dir)
800
+
801
+ # Start with a MYPYPATH environment variable at the front of the mypy_path, if defined.
802
+ mypypath = mypy_path()
803
+
804
+ # Add a config-defined mypy path.
805
+ mypypath.extend(options.mypy_path)
806
+
807
+ # If provided, insert the caller-supplied extra module path to the
808
+ # beginning (highest priority) of the search path.
809
+ if alt_lib_path:
810
+ mypypath.insert(0, alt_lib_path)
811
+
812
+ sys_path, site_packages = get_search_dirs(options.python_executable)
813
+ # We only use site packages for this check
814
+ for site in site_packages:
815
+ assert site not in lib_path
816
+ if (
817
+ site in mypypath
818
+ or any(p.startswith(site + os.path.sep) for p in mypypath)
819
+ or (os.path.altsep and any(p.startswith(site + os.path.altsep) for p in mypypath))
820
+ ):
821
+ print(f"{site} is in the MYPYPATH. Please remove it.", file=sys.stderr)
822
+ print(
823
+ "See https://mypy.readthedocs.io/en/stable/running_mypy.html"
824
+ "#how-mypy-handles-imports for more info",
825
+ file=sys.stderr,
826
+ )
827
+ sys.exit(1)
828
+
829
+ return SearchPaths(
830
+ python_path=tuple(reversed(python_path)),
831
+ mypy_path=tuple(mypypath),
832
+ package_path=tuple(sys_path + site_packages),
833
+ typeshed_path=tuple(lib_path),
834
+ )
835
+
836
+
837
+ def load_stdlib_py_versions(custom_typeshed_dir: str | None) -> StdlibVersions:
838
+ """Return dict with minimum and maximum Python versions of stdlib modules.
839
+
840
+ The contents look like
841
+ {..., 'secrets': ((3, 6), None), 'symbol': ((2, 7), (3, 9)), ...}
842
+
843
+ None means there is no maximum version.
844
+ """
845
+ typeshed_dir = custom_typeshed_dir or os.path.join(os.path.dirname(__file__), "typeshed")
846
+ stdlib_dir = os.path.join(typeshed_dir, "stdlib")
847
+ result = {}
848
+
849
+ versions_path = os.path.join(stdlib_dir, "VERSIONS")
850
+ assert os.path.isfile(versions_path), (custom_typeshed_dir, versions_path, __file__)
851
+ with open(versions_path) as f:
852
+ for line in f:
853
+ line = line.split("#")[0].strip()
854
+ if line == "":
855
+ continue
856
+ module, version_range = line.split(":")
857
+ versions = version_range.split("-")
858
+ min_version = parse_version(versions[0])
859
+ max_version = (
860
+ parse_version(versions[1]) if len(versions) >= 2 and versions[1].strip() else None
861
+ )
862
+ result[module] = min_version, max_version
863
+ return result
864
+
865
+
866
+ def parse_version(version: str) -> tuple[int, int]:
867
+ major, minor = version.strip().split(".")
868
+ return int(major), int(minor)
869
+
870
+
871
+ def typeshed_py_version(options: Options) -> tuple[int, int]:
872
+ """Return Python version used for checking whether module supports typeshed."""
873
+ # Typeshed no longer covers Python 3.x versions before 3.7, so 3.7 is
874
+ # the earliest we can support.
875
+ return max(options.python_version, (3, 7))