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/test/data.py ADDED
@@ -0,0 +1,823 @@
1
+ """Utilities for processing .test files containing test case descriptions."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import os
6
+ import os.path
7
+ import posixpath
8
+ import re
9
+ import shutil
10
+ import sys
11
+ import tempfile
12
+ from abc import abstractmethod
13
+ from dataclasses import dataclass
14
+ from pathlib import Path
15
+ from typing import Any, Final, Iterator, NamedTuple, NoReturn, Pattern, Union
16
+ from typing_extensions import TypeAlias as _TypeAlias
17
+
18
+ import pytest
19
+
20
+ from mypy import defaults
21
+ from mypy.test.config import PREFIX, test_data_prefix, test_temp_dir
22
+
23
+ root_dir = os.path.normpath(PREFIX)
24
+
25
+ # Debuggers that we support for debugging mypyc run tests
26
+ # implementation of using each of these debuggers is in test_run.py
27
+ # TODO: support more debuggers
28
+ SUPPORTED_DEBUGGERS: Final = ["gdb", "lldb"]
29
+
30
+
31
+ # File modify/create operation: copy module contents from source_path.
32
+ class UpdateFile(NamedTuple):
33
+ module: str
34
+ content: str
35
+ target_path: str
36
+
37
+
38
+ # File delete operation: delete module file.
39
+ class DeleteFile(NamedTuple):
40
+ module: str
41
+ path: str
42
+
43
+
44
+ FileOperation: _TypeAlias = Union[UpdateFile, DeleteFile]
45
+
46
+
47
+ def _file_arg_to_module(filename: str) -> str:
48
+ filename, _ = os.path.splitext(filename)
49
+ parts = filename.split("/") # not os.sep since it comes from test data
50
+ if parts[-1] == "__init__":
51
+ parts.pop()
52
+ return ".".join(parts)
53
+
54
+
55
+ def parse_test_case(case: DataDrivenTestCase) -> None:
56
+ """Parse and prepare a single case from suite with test case descriptions.
57
+
58
+ This method is part of the setup phase, just before the test case is run.
59
+ """
60
+ test_items = parse_test_data(case.data, case.name)
61
+ base_path = case.suite.base_path
62
+ if case.suite.native_sep:
63
+ join = os.path.join
64
+ else:
65
+ join = posixpath.join
66
+
67
+ out_section_missing = case.suite.required_out_section
68
+
69
+ files: list[tuple[str, str]] = [] # path and contents
70
+ output_files: list[tuple[str, str | Pattern[str]]] = [] # output path and contents
71
+ output: list[str] = [] # Regular output errors
72
+ output2: dict[int, list[str]] = {} # Output errors for incremental, runs 2+
73
+ deleted_paths: dict[int, set[str]] = {} # from run number of paths
74
+ stale_modules: dict[int, set[str]] = {} # from run number to module names
75
+ rechecked_modules: dict[int, set[str]] = {} # from run number module names
76
+ triggered: list[str] = [] # Active triggers (one line per incremental step)
77
+ targets: dict[int, list[str]] = {} # Fine-grained targets (per fine-grained update)
78
+ test_modules: list[str] = [] # Modules which are deemed "test" (vs "fixture")
79
+
80
+ def _case_fail(msg: str) -> NoReturn:
81
+ pytest.fail(f"{case.file}:{case.line}: {msg}", pytrace=False)
82
+
83
+ # Process the parsed items. Each item has a header of form [id args],
84
+ # optionally followed by lines of text.
85
+ item = first_item = test_items[0]
86
+ test_modules.append("__main__")
87
+ for item in test_items[1:]:
88
+
89
+ def _item_fail(msg: str) -> NoReturn:
90
+ item_abs_line = case.line + item.line - 2
91
+ pytest.fail(f"{case.file}:{item_abs_line}: {msg}", pytrace=False)
92
+
93
+ if item.id in {"file", "fixture", "outfile", "outfile-re"}:
94
+ # Record an extra file needed for the test case.
95
+ assert item.arg is not None
96
+ contents = expand_variables("\n".join(item.data))
97
+ path = join(base_path, item.arg)
98
+ if item.id != "fixture":
99
+ test_modules.append(_file_arg_to_module(item.arg))
100
+ if item.id in {"file", "fixture"}:
101
+ files.append((path, contents))
102
+ elif item.id == "outfile-re":
103
+ output_files.append((path, re.compile(contents.rstrip(), re.S)))
104
+ elif item.id == "outfile":
105
+ output_files.append((path, contents))
106
+ elif item.id == "builtins":
107
+ # Use an alternative stub file for the builtins module.
108
+ assert item.arg is not None
109
+ mpath = join(os.path.dirname(case.file), item.arg)
110
+ with open(mpath, encoding="utf8") as f:
111
+ files.append((join(base_path, "builtins.pyi"), f.read()))
112
+ elif item.id == "typing":
113
+ # Use an alternative stub file for the typing module.
114
+ assert item.arg is not None
115
+ src_path = join(os.path.dirname(case.file), item.arg)
116
+ with open(src_path, encoding="utf8") as f:
117
+ files.append((join(base_path, "typing.pyi"), f.read()))
118
+ elif item.id == "_typeshed":
119
+ # Use an alternative stub file for the _typeshed module.
120
+ assert item.arg is not None
121
+ src_path = join(os.path.dirname(case.file), item.arg)
122
+ with open(src_path, encoding="utf8") as f:
123
+ files.append((join(base_path, "_typeshed.pyi"), f.read()))
124
+ elif re.match(r"stale[0-9]*$", item.id):
125
+ passnum = 1 if item.id == "stale" else int(item.id[len("stale") :])
126
+ assert passnum > 0
127
+ modules = set() if item.arg is None else {t.strip() for t in item.arg.split(",")}
128
+ stale_modules[passnum] = modules
129
+ elif re.match(r"rechecked[0-9]*$", item.id):
130
+ passnum = 1 if item.id == "rechecked" else int(item.id[len("rechecked") :])
131
+ assert passnum > 0
132
+ modules = set() if item.arg is None else {t.strip() for t in item.arg.split(",")}
133
+ rechecked_modules[passnum] = modules
134
+ elif re.match(r"targets[0-9]*$", item.id):
135
+ passnum = 1 if item.id == "targets" else int(item.id[len("targets") :])
136
+ assert passnum > 0
137
+ reprocessed = [] if item.arg is None else [t.strip() for t in item.arg.split(",")]
138
+ targets[passnum] = reprocessed
139
+ elif item.id == "delete":
140
+ # File/directory to delete during a multi-step test case
141
+ assert item.arg is not None
142
+ m = re.match(r"(.*)\.([0-9]+)$", item.arg)
143
+ if m is None:
144
+ _item_fail(f"Invalid delete section {item.arg!r}")
145
+ num = int(m.group(2))
146
+ if num < 2:
147
+ _item_fail(f"Can't delete during step {num}")
148
+ full = join(base_path, m.group(1))
149
+ deleted_paths.setdefault(num, set()).add(full)
150
+ elif re.match(r"out[0-9]*$", item.id):
151
+ if item.arg is None:
152
+ args = []
153
+ else:
154
+ args = item.arg.split(",")
155
+
156
+ version_check = True
157
+ for arg in args:
158
+ if arg.startswith("version"):
159
+ compare_op = arg[7:9]
160
+ if compare_op not in {">=", "=="}:
161
+ _item_fail("Only >= and == version checks are currently supported")
162
+ version_str = arg[9:]
163
+ try:
164
+ version = tuple(int(x) for x in version_str.split("."))
165
+ except ValueError:
166
+ _item_fail(f"{version_str!r} is not a valid python version")
167
+ if compare_op == ">=":
168
+ if version <= defaults.PYTHON3_VERSION:
169
+ _item_fail(
170
+ f"{arg} always true since minimum runtime version is {defaults.PYTHON3_VERSION}"
171
+ )
172
+ version_check = sys.version_info >= version
173
+ elif compare_op == "==":
174
+ if version < defaults.PYTHON3_VERSION:
175
+ _item_fail(
176
+ f"{arg} always false since minimum runtime version is {defaults.PYTHON3_VERSION}"
177
+ )
178
+ if not 1 < len(version) < 4:
179
+ _item_fail(
180
+ f'Only minor or patch version checks are currently supported with "==": {version_str!r}'
181
+ )
182
+ version_check = sys.version_info[: len(version)] == version
183
+ if version_check:
184
+ tmp_output = [expand_variables(line) for line in item.data]
185
+ if os.path.sep == "\\" and case.normalize_output:
186
+ tmp_output = [fix_win_path(line) for line in tmp_output]
187
+ if item.id == "out" or item.id == "out1":
188
+ output = tmp_output
189
+ else:
190
+ passnum = int(item.id[len("out") :])
191
+ assert passnum > 1
192
+ output2[passnum] = tmp_output
193
+ out_section_missing = False
194
+ elif item.id == "triggered" and item.arg is None:
195
+ triggered = item.data
196
+ else:
197
+ section_str = item.id + (f" {item.arg}" if item.arg else "")
198
+ _item_fail(f"Invalid section header [{section_str}] in case {case.name!r}")
199
+
200
+ if out_section_missing:
201
+ _case_fail(f"Required output section not found in case {case.name!r}")
202
+
203
+ for passnum in stale_modules.keys():
204
+ if passnum not in rechecked_modules:
205
+ # If the set of rechecked modules isn't specified, make it the same as the set
206
+ # of modules with a stale public interface.
207
+ rechecked_modules[passnum] = stale_modules[passnum]
208
+ if (
209
+ passnum in stale_modules
210
+ and passnum in rechecked_modules
211
+ and not stale_modules[passnum].issubset(rechecked_modules[passnum])
212
+ ):
213
+ _case_fail(f"Stale modules after pass {passnum} must be a subset of rechecked modules")
214
+
215
+ output_inline_start = len(output)
216
+ input = first_item.data
217
+ expand_errors(input, output, "main")
218
+ for file_path, contents in files:
219
+ expand_errors(contents.split("\n"), output, file_path)
220
+
221
+ seen_files = set()
222
+ for file, _ in files:
223
+ if file in seen_files:
224
+ _case_fail(f"Duplicated filename {file}. Did you include it multiple times?")
225
+
226
+ seen_files.add(file)
227
+
228
+ case.input = input
229
+ case.output = output
230
+ case.output_inline_start = output_inline_start
231
+ case.output2 = output2
232
+ case.last_line = case.line + item.line + len(item.data) - 2
233
+ case.files = files
234
+ case.output_files = output_files
235
+ case.expected_stale_modules = stale_modules
236
+ case.expected_rechecked_modules = rechecked_modules
237
+ case.deleted_paths = deleted_paths
238
+ case.triggered = triggered or []
239
+ case.expected_fine_grained_targets = targets
240
+ case.test_modules = test_modules
241
+
242
+
243
+ class DataDrivenTestCase(pytest.Item):
244
+ """Holds parsed data-driven test cases, and handles directory setup and teardown."""
245
+
246
+ # Override parent member type
247
+ parent: DataSuiteCollector
248
+
249
+ input: list[str]
250
+ output: list[str] # Output for the first pass
251
+ output_inline_start: int
252
+ output2: dict[int, list[str]] # Output for runs 2+, indexed by run number
253
+
254
+ # full path of test suite
255
+ file = ""
256
+ line = 0
257
+
258
+ # (file path, file content) tuples
259
+ files: list[tuple[str, str]]
260
+ # Modules which is to be considered "test" rather than "fixture"
261
+ test_modules: list[str]
262
+ expected_stale_modules: dict[int, set[str]]
263
+ expected_rechecked_modules: dict[int, set[str]]
264
+ expected_fine_grained_targets: dict[int, list[str]]
265
+
266
+ # Whether or not we should normalize the output to standardize things like
267
+ # forward vs backward slashes in file paths for Windows vs Linux.
268
+ normalize_output: bool
269
+
270
+ # Extra attributes used by some tests.
271
+ last_line: int
272
+ output_files: list[tuple[str, str | Pattern[str]]] # Path and contents for output files
273
+ deleted_paths: dict[int, set[str]] # Mapping run number -> paths
274
+ triggered: list[str] # Active triggers (one line per incremental step)
275
+
276
+ def __init__(
277
+ self,
278
+ parent: DataSuiteCollector,
279
+ suite: DataSuite,
280
+ *,
281
+ file: str,
282
+ name: str,
283
+ writescache: bool,
284
+ only_when: str,
285
+ normalize_output: bool,
286
+ platform: str | None,
287
+ skip: bool,
288
+ xfail: bool,
289
+ data: str,
290
+ line: int,
291
+ ) -> None:
292
+ super().__init__(name, parent)
293
+ self.suite = suite
294
+ self.file = file
295
+ self.writescache = writescache
296
+ self.only_when = only_when
297
+ self.normalize_output = normalize_output
298
+ if (platform == "windows" and sys.platform != "win32") or (
299
+ platform == "posix" and sys.platform == "win32"
300
+ ):
301
+ skip = True
302
+ self.skip = skip
303
+ self.xfail = xfail
304
+ self.data = data
305
+ self.line = line
306
+ self.old_cwd: str | None = None
307
+ self.tmpdir: tempfile.TemporaryDirectory[str] | None = None
308
+
309
+ def runtest(self) -> None:
310
+ if self.skip:
311
+ pytest.skip()
312
+ # TODO: add a better error message for when someone uses skip and xfail at the same time
313
+ elif self.xfail:
314
+ self.add_marker(pytest.mark.xfail)
315
+ parent = self.getparent(DataSuiteCollector)
316
+ assert parent is not None, "Should not happen"
317
+ suite = parent.obj()
318
+ suite.setup()
319
+ try:
320
+ suite.run_case(self)
321
+ except Exception:
322
+ # As a debugging aid, support copying the contents of the tmp directory somewhere
323
+ save_dir: str | None = self.config.getoption("--save-failures-to", None)
324
+ if save_dir:
325
+ assert self.tmpdir is not None
326
+ target_dir = os.path.join(save_dir, os.path.basename(self.tmpdir.name))
327
+ print(f"Copying data from test {self.name} to {target_dir}")
328
+ if not os.path.isabs(target_dir):
329
+ assert self.old_cwd
330
+ target_dir = os.path.join(self.old_cwd, target_dir)
331
+ shutil.copytree(self.tmpdir.name, target_dir)
332
+ raise
333
+
334
+ def setup(self) -> None:
335
+ parse_test_case(case=self)
336
+ self.old_cwd = os.getcwd()
337
+ self.tmpdir = tempfile.TemporaryDirectory(prefix="mypy-test-")
338
+ os.chdir(self.tmpdir.name)
339
+ os.mkdir(test_temp_dir)
340
+
341
+ # Precalculate steps for find_steps()
342
+ steps: dict[int, list[FileOperation]] = {}
343
+
344
+ for path, content in self.files:
345
+ m = re.match(r".*\.([0-9]+)$", path)
346
+ if m:
347
+ # Skip writing subsequent incremental steps - rather
348
+ # store them as operations.
349
+ num = int(m.group(1))
350
+ assert num >= 2
351
+ target_path = re.sub(r"\.[0-9]+$", "", path)
352
+ module = module_from_path(target_path)
353
+ operation = UpdateFile(module, content, target_path)
354
+ steps.setdefault(num, []).append(operation)
355
+ else:
356
+ # Write the first incremental steps
357
+ dir = os.path.dirname(path)
358
+ os.makedirs(dir, exist_ok=True)
359
+ with open(path, "w", encoding="utf8") as f:
360
+ f.write(content)
361
+
362
+ for num, paths in self.deleted_paths.items():
363
+ assert num >= 2
364
+ for path in paths:
365
+ module = module_from_path(path)
366
+ steps.setdefault(num, []).append(DeleteFile(module, path))
367
+ max_step = max(steps) if steps else 2
368
+ self.steps = [steps.get(num, []) for num in range(2, max_step + 1)]
369
+
370
+ def teardown(self) -> None:
371
+ if self.old_cwd is not None:
372
+ os.chdir(self.old_cwd)
373
+ if self.tmpdir is not None:
374
+ try:
375
+ self.tmpdir.cleanup()
376
+ except OSError:
377
+ pass
378
+ self.old_cwd = None
379
+ self.tmpdir = None
380
+
381
+ def reportinfo(self) -> tuple[str, int, str]:
382
+ return self.file, self.line, self.name
383
+
384
+ def repr_failure(
385
+ self, excinfo: pytest.ExceptionInfo[BaseException], style: Any | None = None
386
+ ) -> str:
387
+ excrepr: object
388
+ if isinstance(excinfo.value, SystemExit):
389
+ # We assume that before doing exit() (which raises SystemExit) we've printed
390
+ # enough context about what happened so that a stack trace is not useful.
391
+ # In particular, uncaught exceptions during semantic analysis or type checking
392
+ # call exit() and they already print out a stack trace.
393
+ excrepr = excinfo.exconly()
394
+ elif isinstance(excinfo.value, pytest.fail.Exception) and not excinfo.value.pytrace:
395
+ excrepr = excinfo.exconly()
396
+ else:
397
+ excinfo.traceback = self.parent._traceback_filter(excinfo)
398
+ excrepr = excinfo.getrepr(style="short")
399
+
400
+ return f"data: {self.file}:{self.line}:\n{excrepr}"
401
+
402
+ def find_steps(self) -> list[list[FileOperation]]:
403
+ """Return a list of descriptions of file operations for each incremental step.
404
+
405
+ The first list item corresponds to the first incremental step, the second for the
406
+ second step, etc. Each operation can either be a file modification/creation (UpdateFile)
407
+ or deletion (DeleteFile).
408
+
409
+ Defaults to having two steps if there aern't any operations.
410
+ """
411
+ return self.steps
412
+
413
+
414
+ def module_from_path(path: str) -> str:
415
+ path = re.sub(r"\.pyi?$", "", path)
416
+ # We can have a mix of Unix-style and Windows-style separators.
417
+ parts = re.split(r"[/\\]", path)
418
+ del parts[0]
419
+ module = ".".join(parts)
420
+ module = re.sub(r"\.__init__$", "", module)
421
+ return module
422
+
423
+
424
+ @dataclass
425
+ class TestItem:
426
+ """Parsed test caseitem.
427
+
428
+ An item is of the form
429
+ [id arg]
430
+ .. data ..
431
+ """
432
+
433
+ id: str
434
+ arg: str | None
435
+ # Processed, collapsed text data
436
+ data: list[str]
437
+ # Start line: 1-based, inclusive, relative to testcase
438
+ line: int
439
+ # End line: 1-based, exclusive, relative to testcase; not same as `line + len(test_item.data)` due to collapsing
440
+ end_line: int
441
+
442
+ @property
443
+ def trimmed_newlines(self) -> int: # compensates for strip_list
444
+ return self.end_line - self.line - len(self.data)
445
+
446
+
447
+ def parse_test_data(raw_data: str, name: str) -> list[TestItem]:
448
+ """Parse a list of lines that represent a sequence of test items."""
449
+
450
+ lines = ["", "[case " + name + "]"] + raw_data.split("\n")
451
+ ret: list[TestItem] = []
452
+ data: list[str] = []
453
+
454
+ id: str | None = None
455
+ arg: str | None = None
456
+
457
+ i = 0
458
+ i0 = 0
459
+ while i < len(lines):
460
+ s = lines[i].strip()
461
+
462
+ if lines[i].startswith("[") and s.endswith("]"):
463
+ if id:
464
+ data = collapse_line_continuation(data)
465
+ data = strip_list(data)
466
+ ret.append(TestItem(id, arg, data, i0 + 1, i))
467
+
468
+ i0 = i
469
+ id = s[1:-1]
470
+ arg = None
471
+ if " " in id:
472
+ arg = id[id.index(" ") + 1 :]
473
+ id = id[: id.index(" ")]
474
+ data = []
475
+ elif lines[i].startswith("\\["):
476
+ data.append(lines[i][1:])
477
+ elif not lines[i].startswith("--"):
478
+ data.append(lines[i])
479
+ elif lines[i].startswith("----"):
480
+ data.append(lines[i][2:])
481
+ i += 1
482
+
483
+ # Process the last item.
484
+ if id:
485
+ data = collapse_line_continuation(data)
486
+ data = strip_list(data)
487
+ ret.append(TestItem(id, arg, data, i0 + 1, i - 1))
488
+
489
+ return ret
490
+
491
+
492
+ def strip_list(l: list[str]) -> list[str]:
493
+ """Return a stripped copy of l.
494
+
495
+ Strip whitespace at the end of all lines, and strip all empty
496
+ lines from the end of the array.
497
+ """
498
+
499
+ r: list[str] = []
500
+ for s in l:
501
+ # Strip spaces at end of line
502
+ r.append(re.sub(r"\s+$", "", s))
503
+
504
+ while r and r[-1] == "":
505
+ r.pop()
506
+
507
+ return r
508
+
509
+
510
+ def collapse_line_continuation(l: list[str]) -> list[str]:
511
+ r: list[str] = []
512
+ cont = False
513
+ for s in l:
514
+ ss = re.sub(r"\\$", "", s)
515
+ if cont:
516
+ r[-1] += re.sub("^ +", "", ss)
517
+ else:
518
+ r.append(ss)
519
+ cont = s.endswith("\\")
520
+ return r
521
+
522
+
523
+ def expand_variables(s: str) -> str:
524
+ return s.replace("<ROOT>", root_dir)
525
+
526
+
527
+ def expand_errors(input: list[str], output: list[str], fnam: str) -> None:
528
+ """Transform comments such as '# E: message' or
529
+ '# E:3: message' in input.
530
+
531
+ The result is lines like 'fnam:line: error: message'.
532
+ """
533
+
534
+ for i in range(len(input)):
535
+ # The first in the split things isn't a comment
536
+ for possible_err_comment in input[i].split(" # ")[1:]:
537
+ m = re.search(
538
+ r"^([ENW]):((?P<col>\d+):)? (?P<message>.*)$", possible_err_comment.strip()
539
+ )
540
+ if m:
541
+ if m.group(1) == "E":
542
+ severity = "error"
543
+ elif m.group(1) == "N":
544
+ severity = "note"
545
+ elif m.group(1) == "W":
546
+ severity = "warning"
547
+ col = m.group("col")
548
+ message = m.group("message")
549
+ message = message.replace("\\#", "#") # adds back escaped # character
550
+ if col is None:
551
+ output.append(f"{fnam}:{i + 1}: {severity}: {message}")
552
+ else:
553
+ output.append(f"{fnam}:{i + 1}:{col}: {severity}: {message}")
554
+
555
+
556
+ def fix_win_path(line: str) -> str:
557
+ r"""Changes Windows paths to Linux paths in error messages.
558
+
559
+ E.g. foo\bar.py -> foo/bar.py.
560
+ """
561
+ line = line.replace(root_dir, root_dir.replace("\\", "/"))
562
+ m = re.match(r"^([\S/]+):(\d+:)?(\s+.*)", line)
563
+ if not m:
564
+ return line
565
+ else:
566
+ filename, lineno, message = m.groups()
567
+ return "{}:{}{}".format(filename.replace("\\", "/"), lineno or "", message)
568
+
569
+
570
+ def fix_cobertura_filename(line: str) -> str:
571
+ r"""Changes filename paths to Linux paths in Cobertura output files.
572
+
573
+ E.g. filename="pkg\subpkg\a.py" -> filename="pkg/subpkg/a.py".
574
+ """
575
+ m = re.search(r'<class .* filename="(?P<filename>.*?)"', line)
576
+ if not m:
577
+ return line
578
+ return "{}{}{}".format(
579
+ line[: m.start(1)], m.group("filename").replace("\\", "/"), line[m.end(1) :]
580
+ )
581
+
582
+
583
+ ##
584
+ #
585
+ # pytest setup
586
+ #
587
+ ##
588
+
589
+
590
+ # This function name is special to pytest. See
591
+ # https://docs.pytest.org/en/latest/reference.html#initialization-hooks
592
+ def pytest_addoption(parser: Any) -> None:
593
+ group = parser.getgroup("mypy")
594
+ group.addoption(
595
+ "--update-data",
596
+ action="store_true",
597
+ default=False,
598
+ help="Update test data to reflect actual output (supported only for certain tests)",
599
+ )
600
+ group.addoption(
601
+ "--save-failures-to",
602
+ default=None,
603
+ help="Copy the temp directories from failing tests to a target directory",
604
+ )
605
+ group.addoption(
606
+ "--mypy-verbose", action="count", help="Set the verbose flag when creating mypy Options"
607
+ )
608
+ group.addoption(
609
+ "--mypyc-showc",
610
+ action="store_true",
611
+ default=False,
612
+ help="Display C code on mypyc test failures",
613
+ )
614
+ group.addoption(
615
+ "--mypyc-debug",
616
+ default=None,
617
+ dest="debugger",
618
+ choices=SUPPORTED_DEBUGGERS,
619
+ help="Run the first mypyc run test with the specified debugger",
620
+ )
621
+
622
+
623
+ def pytest_configure(config: pytest.Config) -> None:
624
+ if config.getoption("--update-data") and config.getoption("--numprocesses", default=1) > 1:
625
+ raise pytest.UsageError(
626
+ "--update-data incompatible with parallelized tests; re-run with -n 1"
627
+ )
628
+
629
+
630
+ # This function name is special to pytest. See
631
+ # https://doc.pytest.org/en/latest/how-to/writing_plugins.html#collection-hooks
632
+ def pytest_pycollect_makeitem(collector: Any, name: str, obj: object) -> Any | None:
633
+ """Called by pytest on each object in modules configured in conftest.py files.
634
+
635
+ collector is pytest.Collector, returns Optional[pytest.Class]
636
+ """
637
+ if isinstance(obj, type):
638
+ # Only classes derived from DataSuite contain test cases, not the DataSuite class itself
639
+ if issubclass(obj, DataSuite) and obj is not DataSuite:
640
+ # Non-None result means this obj is a test case.
641
+ # The collect method of the returned DataSuiteCollector instance will be called later,
642
+ # with self.obj being obj.
643
+ return DataSuiteCollector.from_parent( # type: ignore[no-untyped-call]
644
+ parent=collector, name=name
645
+ )
646
+ return None
647
+
648
+
649
+ _case_name_pattern = re.compile(
650
+ r"(?P<name>[a-zA-Z_0-9]+)"
651
+ r"(?P<writescache>-writescache)?"
652
+ r"(?P<only_when>-only_when_cache|-only_when_nocache)?"
653
+ r"(?P<skip_path_normalization>-skip_path_normalization)?"
654
+ r"(-(?P<platform>posix|windows))?"
655
+ r"(?P<skip>-skip)?"
656
+ r"(?P<xfail>-xfail)?"
657
+ )
658
+
659
+
660
+ def split_test_cases(
661
+ parent: DataFileCollector, suite: DataSuite, file: str
662
+ ) -> Iterator[DataDrivenTestCase]:
663
+ """Iterate over raw test cases in file, at collection time, ignoring sub items.
664
+
665
+ The collection phase is slow, so any heavy processing should be deferred to after
666
+ uninteresting tests are filtered (when using -k PATTERN switch).
667
+ """
668
+ with open(file, encoding="utf-8") as f:
669
+ data = f.read()
670
+ cases = re.split(r"^\[case ([^]+)]+)\][ \t]*$\n", data, flags=re.DOTALL | re.MULTILINE)
671
+ cases_iter = iter(cases)
672
+ line_no = next(cases_iter).count("\n") + 1
673
+ test_names = set()
674
+ for case_id in cases_iter:
675
+ data = next(cases_iter)
676
+
677
+ m = _case_name_pattern.fullmatch(case_id)
678
+ if not m:
679
+ raise RuntimeError(f"Invalid testcase id {case_id!r}")
680
+ name = m.group("name")
681
+ if name in test_names:
682
+ raise RuntimeError(
683
+ 'Found a duplicate test name "{}" in {} on line {}'.format(
684
+ name, parent.name, line_no
685
+ )
686
+ )
687
+ yield DataDrivenTestCase.from_parent(
688
+ parent=parent,
689
+ suite=suite,
690
+ file=file,
691
+ name=add_test_name_suffix(name, suite.test_name_suffix),
692
+ writescache=bool(m.group("writescache")),
693
+ only_when=m.group("only_when"),
694
+ platform=m.group("platform"),
695
+ skip=bool(m.group("skip")),
696
+ xfail=bool(m.group("xfail")),
697
+ normalize_output=not m.group("skip_path_normalization"),
698
+ data=data,
699
+ line=line_no,
700
+ )
701
+ line_no += data.count("\n") + 1
702
+
703
+ # Record existing tests to prevent duplicates:
704
+ test_names.update({name})
705
+
706
+
707
+ class DataSuiteCollector(pytest.Class):
708
+ def collect(self) -> Iterator[DataFileCollector]:
709
+ """Called by pytest on each of the object returned from pytest_pycollect_makeitem"""
710
+
711
+ # obj is the object for which pytest_pycollect_makeitem returned self.
712
+ suite: DataSuite = self.obj
713
+
714
+ assert os.path.isdir(
715
+ suite.data_prefix
716
+ ), f"Test data prefix ({suite.data_prefix}) not set correctly"
717
+
718
+ for data_file in suite.files:
719
+ yield DataFileCollector.from_parent(parent=self, name=data_file)
720
+
721
+
722
+ class DataFileFix(NamedTuple):
723
+ lineno: int # 1-offset, inclusive
724
+ end_lineno: int # 1-offset, exclusive
725
+ lines: list[str]
726
+
727
+
728
+ class DataFileCollector(pytest.Collector):
729
+ """Represents a single `.test` data driven test file.
730
+
731
+ More context: https://github.com/python/mypy/issues/11662
732
+ """
733
+
734
+ parent: DataSuiteCollector
735
+
736
+ _fixes: list[DataFileFix]
737
+
738
+ @classmethod # We have to fight with pytest here:
739
+ def from_parent(
740
+ cls, parent: DataSuiteCollector, *, name: str # type: ignore[override]
741
+ ) -> DataFileCollector:
742
+ collector = super().from_parent(parent, name=name)
743
+ assert isinstance(collector, DataFileCollector)
744
+ return collector
745
+
746
+ def collect(self) -> Iterator[DataDrivenTestCase]:
747
+ yield from split_test_cases(
748
+ parent=self,
749
+ suite=self.parent.obj,
750
+ file=os.path.join(self.parent.obj.data_prefix, self.name),
751
+ )
752
+
753
+ def setup(self) -> None:
754
+ super().setup()
755
+ self._fixes = []
756
+
757
+ def teardown(self) -> None:
758
+ super().teardown()
759
+ self._apply_fixes()
760
+
761
+ def enqueue_fix(self, fix: DataFileFix) -> None:
762
+ self._fixes.append(fix)
763
+
764
+ def _apply_fixes(self) -> None:
765
+ if not self._fixes:
766
+ return
767
+ data_path = Path(self.parent.obj.data_prefix) / self.name
768
+ lines = data_path.read_text().split("\n")
769
+ # start from end to prevent line offsets from shifting as we update
770
+ for fix in sorted(self._fixes, reverse=True):
771
+ lines[fix.lineno - 1 : fix.end_lineno - 1] = fix.lines
772
+ data_path.write_text("\n".join(lines))
773
+
774
+
775
+ def add_test_name_suffix(name: str, suffix: str) -> str:
776
+ # Find magic suffix of form "-foobar" (used for things like "-skip").
777
+ m = re.search(r"-[-A-Za-z0-9]+$", name)
778
+ if m:
779
+ # Insert suite-specific test name suffix before the magic suffix
780
+ # which must be the last thing in the test case name since we
781
+ # are using endswith() checks.
782
+ magic_suffix = m.group(0)
783
+ return name[: -len(magic_suffix)] + suffix + magic_suffix
784
+ else:
785
+ return name + suffix
786
+
787
+
788
+ def is_incremental(testcase: DataDrivenTestCase) -> bool:
789
+ return "incremental" in testcase.name.lower() or "incremental" in testcase.file
790
+
791
+
792
+ def has_stable_flags(testcase: DataDrivenTestCase) -> bool:
793
+ if any(re.match(r"# flags[2-9]:", line) for line in testcase.input):
794
+ return False
795
+ for filename, contents in testcase.files:
796
+ if os.path.basename(filename).startswith("mypy.ini."):
797
+ return False
798
+ return True
799
+
800
+
801
+ class DataSuite:
802
+ # option fields - class variables
803
+ files: list[str]
804
+
805
+ base_path = test_temp_dir
806
+
807
+ # Allow external users of the test code to override the data prefix
808
+ data_prefix = test_data_prefix
809
+
810
+ required_out_section = False
811
+
812
+ native_sep = False
813
+
814
+ # Name suffix automatically added to each test case in the suite (can be
815
+ # used to distinguish test cases in suites that share data files)
816
+ test_name_suffix = ""
817
+
818
+ def setup(self) -> None:
819
+ """Setup fixtures (ad-hoc)"""
820
+
821
+ @abstractmethod
822
+ def run_case(self, testcase: DataDrivenTestCase) -> None:
823
+ raise NotImplementedError