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/report.py ADDED
@@ -0,0 +1,924 @@
1
+ """Classes for producing HTML reports about imprecision."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import collections
6
+ import itertools
7
+ import json
8
+ import os
9
+ import shutil
10
+ import sys
11
+ import time
12
+ import tokenize
13
+ from abc import ABCMeta, abstractmethod
14
+ from operator import attrgetter
15
+ from typing import Any, Callable, Dict, Final, Iterator, Tuple
16
+ from typing_extensions import TypeAlias as _TypeAlias
17
+ from urllib.request import pathname2url
18
+
19
+ from mypy import stats
20
+ from mypy.defaults import REPORTER_NAMES
21
+ from mypy.nodes import Expression, FuncDef, MypyFile
22
+ from mypy.options import Options
23
+ from mypy.traverser import TraverserVisitor
24
+ from mypy.types import Type, TypeOfAny
25
+ from mypy.version import __version__
26
+
27
+ try:
28
+ from lxml import etree # type: ignore[import-untyped]
29
+
30
+ LXML_INSTALLED = True
31
+ except ImportError:
32
+ LXML_INSTALLED = False
33
+
34
+ type_of_any_name_map: Final[collections.OrderedDict[int, str]] = collections.OrderedDict(
35
+ [
36
+ (TypeOfAny.unannotated, "Unannotated"),
37
+ (TypeOfAny.explicit, "Explicit"),
38
+ (TypeOfAny.from_unimported_type, "Unimported"),
39
+ (TypeOfAny.from_omitted_generics, "Omitted Generics"),
40
+ (TypeOfAny.from_error, "Error"),
41
+ (TypeOfAny.special_form, "Special Form"),
42
+ (TypeOfAny.implementation_artifact, "Implementation Artifact"),
43
+ ]
44
+ )
45
+
46
+ ReporterClasses: _TypeAlias = Dict[
47
+ str, Tuple[Callable[["Reports", str], "AbstractReporter"], bool]
48
+ ]
49
+
50
+ reporter_classes: Final[ReporterClasses] = {}
51
+
52
+
53
+ class Reports:
54
+ def __init__(self, data_dir: str, report_dirs: dict[str, str]) -> None:
55
+ self.data_dir = data_dir
56
+ self.reporters: list[AbstractReporter] = []
57
+ self.named_reporters: dict[str, AbstractReporter] = {}
58
+
59
+ for report_type, report_dir in sorted(report_dirs.items()):
60
+ self.add_report(report_type, report_dir)
61
+
62
+ def add_report(self, report_type: str, report_dir: str) -> AbstractReporter:
63
+ try:
64
+ return self.named_reporters[report_type]
65
+ except KeyError:
66
+ pass
67
+ reporter_cls, needs_lxml = reporter_classes[report_type]
68
+ if needs_lxml and not LXML_INSTALLED:
69
+ print(
70
+ (
71
+ "You must install the lxml package before you can run mypy"
72
+ " with `--{}-report`.\n"
73
+ "You can do this with `python3 -m pip install lxml`."
74
+ ).format(report_type),
75
+ file=sys.stderr,
76
+ )
77
+ raise ImportError
78
+ reporter = reporter_cls(self, report_dir)
79
+ self.reporters.append(reporter)
80
+ self.named_reporters[report_type] = reporter
81
+ return reporter
82
+
83
+ def file(
84
+ self,
85
+ tree: MypyFile,
86
+ modules: dict[str, MypyFile],
87
+ type_map: dict[Expression, Type],
88
+ options: Options,
89
+ ) -> None:
90
+ for reporter in self.reporters:
91
+ reporter.on_file(tree, modules, type_map, options)
92
+
93
+ def finish(self) -> None:
94
+ for reporter in self.reporters:
95
+ reporter.on_finish()
96
+
97
+
98
+ class AbstractReporter(metaclass=ABCMeta):
99
+ def __init__(self, reports: Reports, output_dir: str) -> None:
100
+ self.output_dir = output_dir
101
+ if output_dir != "<memory>":
102
+ os.makedirs(output_dir, exist_ok=True)
103
+
104
+ @abstractmethod
105
+ def on_file(
106
+ self,
107
+ tree: MypyFile,
108
+ modules: dict[str, MypyFile],
109
+ type_map: dict[Expression, Type],
110
+ options: Options,
111
+ ) -> None:
112
+ pass
113
+
114
+ @abstractmethod
115
+ def on_finish(self) -> None:
116
+ pass
117
+
118
+
119
+ def register_reporter(
120
+ report_name: str,
121
+ reporter: Callable[[Reports, str], AbstractReporter],
122
+ needs_lxml: bool = False,
123
+ ) -> None:
124
+ reporter_classes[report_name] = (reporter, needs_lxml)
125
+
126
+
127
+ def alias_reporter(source_reporter: str, target_reporter: str) -> None:
128
+ reporter_classes[target_reporter] = reporter_classes[source_reporter]
129
+
130
+
131
+ def should_skip_path(path: str) -> bool:
132
+ if stats.is_special_module(path):
133
+ return True
134
+ if path.startswith(".."):
135
+ return True
136
+ if "stubs" in path.split("/") or "stubs" in path.split(os.sep):
137
+ return True
138
+ return False
139
+
140
+
141
+ def iterate_python_lines(path: str) -> Iterator[tuple[int, str]]:
142
+ """Return an iterator over (line number, line text) from a Python file."""
143
+ try:
144
+ with tokenize.open(path) as input_file:
145
+ yield from enumerate(input_file, 1)
146
+ except IsADirectoryError:
147
+ # can happen with namespace packages
148
+ pass
149
+
150
+
151
+ class FuncCounterVisitor(TraverserVisitor):
152
+ def __init__(self) -> None:
153
+ super().__init__()
154
+ self.counts = [0, 0]
155
+
156
+ def visit_func_def(self, defn: FuncDef) -> None:
157
+ self.counts[defn.type is not None] += 1
158
+
159
+
160
+ class LineCountReporter(AbstractReporter):
161
+ def __init__(self, reports: Reports, output_dir: str) -> None:
162
+ super().__init__(reports, output_dir)
163
+ self.counts: dict[str, tuple[int, int, int, int]] = {}
164
+
165
+ def on_file(
166
+ self,
167
+ tree: MypyFile,
168
+ modules: dict[str, MypyFile],
169
+ type_map: dict[Expression, Type],
170
+ options: Options,
171
+ ) -> None:
172
+ # Count physical lines. This assumes the file's encoding is a
173
+ # superset of ASCII (or at least uses \n in its line endings).
174
+ try:
175
+ with open(tree.path, "rb") as f:
176
+ physical_lines = len(f.readlines())
177
+ except IsADirectoryError:
178
+ # can happen with namespace packages
179
+ physical_lines = 0
180
+
181
+ func_counter = FuncCounterVisitor()
182
+ tree.accept(func_counter)
183
+ unannotated_funcs, annotated_funcs = func_counter.counts
184
+ total_funcs = annotated_funcs + unannotated_funcs
185
+
186
+ # Don't count lines or functions as annotated if they have their errors ignored.
187
+ if options.ignore_errors:
188
+ annotated_funcs = 0
189
+
190
+ imputed_annotated_lines = (
191
+ physical_lines * annotated_funcs // total_funcs if total_funcs else physical_lines
192
+ )
193
+
194
+ self.counts[tree._fullname] = (
195
+ imputed_annotated_lines,
196
+ physical_lines,
197
+ annotated_funcs,
198
+ total_funcs,
199
+ )
200
+
201
+ def on_finish(self) -> None:
202
+ counts: list[tuple[tuple[int, int, int, int], str]] = sorted(
203
+ ((c, p) for p, c in self.counts.items()), reverse=True
204
+ )
205
+ total_counts = tuple(sum(c[i] for c, p in counts) for i in range(4))
206
+ with open(os.path.join(self.output_dir, "linecount.txt"), "w") as f:
207
+ f.write("{:7} {:7} {:6} {:6} total\n".format(*total_counts))
208
+ for c, p in counts:
209
+ f.write(f"{c[0]:7} {c[1]:7} {c[2]:6} {c[3]:6} {p}\n")
210
+
211
+
212
+ register_reporter("linecount", LineCountReporter)
213
+
214
+
215
+ class AnyExpressionsReporter(AbstractReporter):
216
+ """Report frequencies of different kinds of Any types."""
217
+
218
+ def __init__(self, reports: Reports, output_dir: str) -> None:
219
+ super().__init__(reports, output_dir)
220
+ self.counts: dict[str, tuple[int, int]] = {}
221
+ self.any_types_counter: dict[str, collections.Counter[int]] = {}
222
+
223
+ def on_file(
224
+ self,
225
+ tree: MypyFile,
226
+ modules: dict[str, MypyFile],
227
+ type_map: dict[Expression, Type],
228
+ options: Options,
229
+ ) -> None:
230
+ visitor = stats.StatisticsVisitor(
231
+ inferred=True,
232
+ filename=tree.fullname,
233
+ modules=modules,
234
+ typemap=type_map,
235
+ all_nodes=True,
236
+ visit_untyped_defs=False,
237
+ )
238
+ tree.accept(visitor)
239
+ self.any_types_counter[tree.fullname] = visitor.type_of_any_counter
240
+ num_unanalyzed_lines = list(visitor.line_map.values()).count(stats.TYPE_UNANALYZED)
241
+ # count each line of dead code as one expression of type "Any"
242
+ num_any = visitor.num_any_exprs + num_unanalyzed_lines
243
+ num_total = visitor.num_imprecise_exprs + visitor.num_precise_exprs + num_any
244
+ if num_total > 0:
245
+ self.counts[tree.fullname] = (num_any, num_total)
246
+
247
+ def on_finish(self) -> None:
248
+ self._report_any_exprs()
249
+ self._report_types_of_anys()
250
+
251
+ def _write_out_report(
252
+ self, filename: str, header: list[str], rows: list[list[str]], footer: list[str]
253
+ ) -> None:
254
+ row_len = len(header)
255
+ assert all(len(row) == row_len for row in rows + [header, footer])
256
+ min_column_distance = 3 # minimum distance between numbers in two columns
257
+ widths = [-1] * row_len
258
+ for row in rows + [header, footer]:
259
+ for i, value in enumerate(row):
260
+ widths[i] = max(widths[i], len(value))
261
+ for i, w in enumerate(widths):
262
+ # Do not add min_column_distance to the first column.
263
+ if i > 0:
264
+ widths[i] = w + min_column_distance
265
+ with open(os.path.join(self.output_dir, filename), "w") as f:
266
+ header_str = ("{:>{}}" * len(widths)).format(*itertools.chain(*zip(header, widths)))
267
+ separator = "-" * len(header_str)
268
+ f.write(header_str + "\n")
269
+ f.write(separator + "\n")
270
+ for row_values in rows:
271
+ r = ("{:>{}}" * len(widths)).format(*itertools.chain(*zip(row_values, widths)))
272
+ f.write(r + "\n")
273
+ f.write(separator + "\n")
274
+ footer_str = ("{:>{}}" * len(widths)).format(*itertools.chain(*zip(footer, widths)))
275
+ f.write(footer_str + "\n")
276
+
277
+ def _report_any_exprs(self) -> None:
278
+ total_any = sum(num_any for num_any, _ in self.counts.values())
279
+ total_expr = sum(total for _, total in self.counts.values())
280
+ total_coverage = 100.0
281
+ if total_expr > 0:
282
+ total_coverage = (float(total_expr - total_any) / float(total_expr)) * 100
283
+
284
+ column_names = ["Name", "Anys", "Exprs", "Coverage"]
285
+ rows: list[list[str]] = []
286
+ for filename in sorted(self.counts):
287
+ (num_any, num_total) = self.counts[filename]
288
+ coverage = (float(num_total - num_any) / float(num_total)) * 100
289
+ coverage_str = f"{coverage:.2f}%"
290
+ rows.append([filename, str(num_any), str(num_total), coverage_str])
291
+ rows.sort(key=lambda x: x[0])
292
+ total_row = ["Total", str(total_any), str(total_expr), f"{total_coverage:.2f}%"]
293
+ self._write_out_report("any-exprs.txt", column_names, rows, total_row)
294
+
295
+ def _report_types_of_anys(self) -> None:
296
+ total_counter: collections.Counter[int] = collections.Counter()
297
+ for counter in self.any_types_counter.values():
298
+ for any_type, value in counter.items():
299
+ total_counter[any_type] += value
300
+ file_column_name = "Name"
301
+ total_row_name = "Total"
302
+ column_names = [file_column_name] + list(type_of_any_name_map.values())
303
+ rows: list[list[str]] = []
304
+ for filename, counter in self.any_types_counter.items():
305
+ rows.append([filename] + [str(counter[typ]) for typ in type_of_any_name_map])
306
+ rows.sort(key=lambda x: x[0])
307
+ total_row = [total_row_name] + [str(total_counter[typ]) for typ in type_of_any_name_map]
308
+ self._write_out_report("types-of-anys.txt", column_names, rows, total_row)
309
+
310
+
311
+ register_reporter("any-exprs", AnyExpressionsReporter)
312
+
313
+
314
+ class LineCoverageVisitor(TraverserVisitor):
315
+ def __init__(self, source: list[str]) -> None:
316
+ self.source = source
317
+
318
+ # For each line of source, we maintain a pair of
319
+ # * the indentation level of the surrounding function
320
+ # (-1 if not inside a function), and
321
+ # * whether the surrounding function is typed.
322
+ # Initially, everything is covered at indentation level -1.
323
+ self.lines_covered = [(-1, True) for l in source]
324
+
325
+ # The Python AST has position information for the starts of
326
+ # elements, but not for their ends. Fortunately the
327
+ # indentation-based syntax makes it pretty easy to find where a
328
+ # block ends without doing any real parsing.
329
+
330
+ # TODO: Handle line continuations (explicit and implicit) and
331
+ # multi-line string literals. (But at least line continuations
332
+ # are normally more indented than their surrounding block anyways,
333
+ # by PEP 8.)
334
+
335
+ def indentation_level(self, line_number: int) -> int | None:
336
+ """Return the indentation of a line of the source (specified by
337
+ zero-indexed line number). Returns None for blank lines or comments."""
338
+ line = self.source[line_number]
339
+ indent = 0
340
+ for char in list(line):
341
+ if char == " ":
342
+ indent += 1
343
+ elif char == "\t":
344
+ indent = 8 * ((indent + 8) // 8)
345
+ elif char == "#":
346
+ # Line is a comment; ignore it
347
+ return None
348
+ elif char == "\n":
349
+ # Line is entirely whitespace; ignore it
350
+ return None
351
+ # TODO line continuation (\)
352
+ else:
353
+ # Found a non-whitespace character
354
+ return indent
355
+ # Line is entirely whitespace, and at end of file
356
+ # with no trailing newline; ignore it
357
+ return None
358
+
359
+ def visit_func_def(self, defn: FuncDef) -> None:
360
+ start_line = defn.line - 1
361
+ start_indent = None
362
+ # When a function is decorated, sometimes the start line will point to
363
+ # whitespace or comments between the decorator and the function, so
364
+ # we have to look for the start.
365
+ while start_line < len(self.source):
366
+ start_indent = self.indentation_level(start_line)
367
+ if start_indent is not None:
368
+ break
369
+ start_line += 1
370
+ # If we can't find the function give up and don't annotate anything.
371
+ # Our line numbers are not reliable enough to be asserting on.
372
+ if start_indent is None:
373
+ return
374
+
375
+ cur_line = start_line + 1
376
+ end_line = cur_line
377
+ # After this loop, function body will be lines [start_line, end_line)
378
+ while cur_line < len(self.source):
379
+ cur_indent = self.indentation_level(cur_line)
380
+ if cur_indent is None:
381
+ # Consume the line, but don't mark it as belonging to the function yet.
382
+ cur_line += 1
383
+ elif cur_indent > start_indent:
384
+ # A non-blank line that belongs to the function.
385
+ cur_line += 1
386
+ end_line = cur_line
387
+ else:
388
+ # We reached a line outside the function definition.
389
+ break
390
+
391
+ is_typed = defn.type is not None
392
+ for line in range(start_line, end_line):
393
+ old_indent, _ = self.lines_covered[line]
394
+ # If there was an old indent level for this line, and the new
395
+ # level isn't increasing the indentation, ignore it.
396
+ # This is to be defensive against funniness in our line numbers,
397
+ # which are not always reliable.
398
+ if old_indent <= start_indent:
399
+ self.lines_covered[line] = (start_indent, is_typed)
400
+
401
+ # Visit the body, in case there are nested functions
402
+ super().visit_func_def(defn)
403
+
404
+
405
+ class LineCoverageReporter(AbstractReporter):
406
+ """Exact line coverage reporter.
407
+
408
+ This reporter writes a JSON dictionary with one field 'lines' to
409
+ the file 'coverage.json' in the specified report directory. The
410
+ value of that field is a dictionary which associates to each
411
+ source file's absolute pathname the list of line numbers that
412
+ belong to typed functions in that file.
413
+ """
414
+
415
+ def __init__(self, reports: Reports, output_dir: str) -> None:
416
+ super().__init__(reports, output_dir)
417
+ self.lines_covered: dict[str, list[int]] = {}
418
+
419
+ def on_file(
420
+ self,
421
+ tree: MypyFile,
422
+ modules: dict[str, MypyFile],
423
+ type_map: dict[Expression, Type],
424
+ options: Options,
425
+ ) -> None:
426
+ with open(tree.path) as f:
427
+ tree_source = f.readlines()
428
+
429
+ coverage_visitor = LineCoverageVisitor(tree_source)
430
+ tree.accept(coverage_visitor)
431
+
432
+ covered_lines = []
433
+ for line_number, (_, typed) in enumerate(coverage_visitor.lines_covered):
434
+ if typed:
435
+ covered_lines.append(line_number + 1)
436
+
437
+ self.lines_covered[os.path.abspath(tree.path)] = covered_lines
438
+
439
+ def on_finish(self) -> None:
440
+ with open(os.path.join(self.output_dir, "coverage.json"), "w") as f:
441
+ json.dump({"lines": self.lines_covered}, f)
442
+
443
+
444
+ register_reporter("linecoverage", LineCoverageReporter)
445
+
446
+
447
+ class FileInfo:
448
+ def __init__(self, name: str, module: str) -> None:
449
+ self.name = name
450
+ self.module = module
451
+ self.counts = [0] * len(stats.precision_names)
452
+
453
+ def total(self) -> int:
454
+ return sum(self.counts)
455
+
456
+ def attrib(self) -> dict[str, str]:
457
+ return {name: str(val) for name, val in sorted(zip(stats.precision_names, self.counts))}
458
+
459
+
460
+ class MemoryXmlReporter(AbstractReporter):
461
+ """Internal reporter that generates XML in memory.
462
+
463
+ This is used by all other XML-based reporters to avoid duplication.
464
+ """
465
+
466
+ def __init__(self, reports: Reports, output_dir: str) -> None:
467
+ super().__init__(reports, output_dir)
468
+
469
+ self.xslt_html_path = os.path.join(reports.data_dir, "xml", "mypy-html.xslt")
470
+ self.xslt_txt_path = os.path.join(reports.data_dir, "xml", "mypy-txt.xslt")
471
+ self.css_html_path = os.path.join(reports.data_dir, "xml", "mypy-html.css")
472
+ xsd_path = os.path.join(reports.data_dir, "xml", "mypy.xsd")
473
+ self.schema = etree.XMLSchema(etree.parse(xsd_path))
474
+ self.last_xml: Any | None = None
475
+ self.files: list[FileInfo] = []
476
+
477
+ # XML doesn't like control characters, but they are sometimes
478
+ # legal in source code (e.g. comments, string literals).
479
+ # Tabs (#x09) are allowed in XML content.
480
+ control_fixer: Final = str.maketrans("".join(chr(i) for i in range(32) if i != 9), "?" * 31)
481
+
482
+ def on_file(
483
+ self,
484
+ tree: MypyFile,
485
+ modules: dict[str, MypyFile],
486
+ type_map: dict[Expression, Type],
487
+ options: Options,
488
+ ) -> None:
489
+ self.last_xml = None
490
+
491
+ try:
492
+ path = os.path.relpath(tree.path)
493
+ except ValueError:
494
+ return
495
+
496
+ if should_skip_path(path) or os.path.isdir(path):
497
+ return # `path` can sometimes be a directory, see #11334
498
+
499
+ visitor = stats.StatisticsVisitor(
500
+ inferred=True,
501
+ filename=tree.fullname,
502
+ modules=modules,
503
+ typemap=type_map,
504
+ all_nodes=True,
505
+ )
506
+ tree.accept(visitor)
507
+
508
+ root = etree.Element("mypy-report-file", name=path, module=tree._fullname)
509
+ doc = etree.ElementTree(root)
510
+ file_info = FileInfo(path, tree._fullname)
511
+
512
+ for lineno, line_text in iterate_python_lines(path):
513
+ status = visitor.line_map.get(lineno, stats.TYPE_EMPTY)
514
+ file_info.counts[status] += 1
515
+ etree.SubElement(
516
+ root,
517
+ "line",
518
+ any_info=self._get_any_info_for_line(visitor, lineno),
519
+ content=line_text.rstrip("\n").translate(self.control_fixer),
520
+ number=str(lineno),
521
+ precision=stats.precision_names[status],
522
+ )
523
+ # Assumes a layout similar to what XmlReporter uses.
524
+ xslt_path = os.path.relpath("mypy-html.xslt", path)
525
+ transform_pi = etree.ProcessingInstruction(
526
+ "xml-stylesheet", f'type="text/xsl" href="{pathname2url(xslt_path)}"'
527
+ )
528
+ root.addprevious(transform_pi)
529
+ self.schema.assertValid(doc)
530
+
531
+ self.last_xml = doc
532
+ self.files.append(file_info)
533
+
534
+ @staticmethod
535
+ def _get_any_info_for_line(visitor: stats.StatisticsVisitor, lineno: int) -> str:
536
+ if lineno in visitor.any_line_map:
537
+ result = "Any Types on this line: "
538
+ counter: collections.Counter[int] = collections.Counter()
539
+ for typ in visitor.any_line_map[lineno]:
540
+ counter[typ.type_of_any] += 1
541
+ for any_type, occurrences in counter.items():
542
+ result += f"\n{type_of_any_name_map[any_type]} (x{occurrences})"
543
+ return result
544
+ else:
545
+ return "No Anys on this line!"
546
+
547
+ def on_finish(self) -> None:
548
+ self.last_xml = None
549
+ # index_path = os.path.join(self.output_dir, 'index.xml')
550
+ output_files = sorted(self.files, key=lambda x: x.module)
551
+
552
+ root = etree.Element("mypy-report-index", name="index")
553
+ doc = etree.ElementTree(root)
554
+
555
+ for file_info in output_files:
556
+ etree.SubElement(
557
+ root,
558
+ "file",
559
+ file_info.attrib(),
560
+ module=file_info.module,
561
+ name=pathname2url(file_info.name),
562
+ total=str(file_info.total()),
563
+ )
564
+ xslt_path = os.path.relpath("mypy-html.xslt", ".")
565
+ transform_pi = etree.ProcessingInstruction(
566
+ "xml-stylesheet", f'type="text/xsl" href="{pathname2url(xslt_path)}"'
567
+ )
568
+ root.addprevious(transform_pi)
569
+ self.schema.assertValid(doc)
570
+
571
+ self.last_xml = doc
572
+
573
+
574
+ register_reporter("memory-xml", MemoryXmlReporter, needs_lxml=True)
575
+
576
+
577
+ def get_line_rate(covered_lines: int, total_lines: int) -> str:
578
+ if total_lines == 0:
579
+ return str(1.0)
580
+ else:
581
+ return f"{covered_lines / total_lines:.4f}"
582
+
583
+
584
+ class CoberturaPackage:
585
+ """Container for XML and statistics mapping python modules to Cobertura package."""
586
+
587
+ def __init__(self, name: str) -> None:
588
+ self.name = name
589
+ self.classes: dict[str, Any] = {}
590
+ self.packages: dict[str, CoberturaPackage] = {}
591
+ self.total_lines = 0
592
+ self.covered_lines = 0
593
+
594
+ def as_xml(self) -> Any:
595
+ package_element = etree.Element("package", complexity="1.0", name=self.name)
596
+ package_element.attrib["branch-rate"] = "0"
597
+ package_element.attrib["line-rate"] = get_line_rate(self.covered_lines, self.total_lines)
598
+ classes_element = etree.SubElement(package_element, "classes")
599
+ for class_name in sorted(self.classes):
600
+ classes_element.append(self.classes[class_name])
601
+ self.add_packages(package_element)
602
+ return package_element
603
+
604
+ def add_packages(self, parent_element: Any) -> None:
605
+ if self.packages:
606
+ packages_element = etree.SubElement(parent_element, "packages")
607
+ for package in sorted(self.packages.values(), key=attrgetter("name")):
608
+ packages_element.append(package.as_xml())
609
+
610
+
611
+ class CoberturaXmlReporter(AbstractReporter):
612
+ """Reporter for generating Cobertura compliant XML."""
613
+
614
+ def __init__(self, reports: Reports, output_dir: str) -> None:
615
+ super().__init__(reports, output_dir)
616
+
617
+ self.root = etree.Element("coverage", timestamp=str(int(time.time())), version=__version__)
618
+ self.doc = etree.ElementTree(self.root)
619
+ self.root_package = CoberturaPackage(".")
620
+
621
+ def on_file(
622
+ self,
623
+ tree: MypyFile,
624
+ modules: dict[str, MypyFile],
625
+ type_map: dict[Expression, Type],
626
+ options: Options,
627
+ ) -> None:
628
+ path = os.path.relpath(tree.path)
629
+ visitor = stats.StatisticsVisitor(
630
+ inferred=True,
631
+ filename=tree.fullname,
632
+ modules=modules,
633
+ typemap=type_map,
634
+ all_nodes=True,
635
+ )
636
+ tree.accept(visitor)
637
+
638
+ class_name = os.path.basename(path)
639
+ file_info = FileInfo(path, tree._fullname)
640
+ class_element = etree.Element("class", complexity="1.0", filename=path, name=class_name)
641
+ etree.SubElement(class_element, "methods")
642
+ lines_element = etree.SubElement(class_element, "lines")
643
+
644
+ class_lines_covered = 0
645
+ class_total_lines = 0
646
+ for lineno, _ in iterate_python_lines(path):
647
+ status = visitor.line_map.get(lineno, stats.TYPE_EMPTY)
648
+ hits = 0
649
+ branch = False
650
+ if status == stats.TYPE_EMPTY:
651
+ continue
652
+ class_total_lines += 1
653
+ if status != stats.TYPE_ANY:
654
+ class_lines_covered += 1
655
+ hits = 1
656
+ if status == stats.TYPE_IMPRECISE:
657
+ branch = True
658
+ file_info.counts[status] += 1
659
+ line_element = etree.SubElement(
660
+ lines_element,
661
+ "line",
662
+ branch=str(branch).lower(),
663
+ hits=str(hits),
664
+ number=str(lineno),
665
+ precision=stats.precision_names[status],
666
+ )
667
+ if branch:
668
+ line_element.attrib["condition-coverage"] = "50% (1/2)"
669
+ class_element.attrib["branch-rate"] = "0"
670
+ class_element.attrib["line-rate"] = get_line_rate(class_lines_covered, class_total_lines)
671
+ # parent_module is set to whichever module contains this file. For most files, we want
672
+ # to simply strip the last element off of the module. But for __init__.py files,
673
+ # the module == the parent module.
674
+ parent_module = file_info.module.rsplit(".", 1)[0]
675
+ if file_info.name.endswith("__init__.py"):
676
+ parent_module = file_info.module
677
+
678
+ if parent_module not in self.root_package.packages:
679
+ self.root_package.packages[parent_module] = CoberturaPackage(parent_module)
680
+ current_package = self.root_package.packages[parent_module]
681
+ packages_to_update = [self.root_package, current_package]
682
+ for package in packages_to_update:
683
+ package.total_lines += class_total_lines
684
+ package.covered_lines += class_lines_covered
685
+ current_package.classes[class_name] = class_element
686
+
687
+ def on_finish(self) -> None:
688
+ self.root.attrib["line-rate"] = get_line_rate(
689
+ self.root_package.covered_lines, self.root_package.total_lines
690
+ )
691
+ self.root.attrib["branch-rate"] = "0"
692
+ sources = etree.SubElement(self.root, "sources")
693
+ source_element = etree.SubElement(sources, "source")
694
+ source_element.text = os.getcwd()
695
+ self.root_package.add_packages(self.root)
696
+ out_path = os.path.join(self.output_dir, "cobertura.xml")
697
+ self.doc.write(out_path, encoding="utf-8", pretty_print=True)
698
+ print("Generated Cobertura report:", os.path.abspath(out_path))
699
+
700
+
701
+ register_reporter("cobertura-xml", CoberturaXmlReporter, needs_lxml=True)
702
+
703
+
704
+ class AbstractXmlReporter(AbstractReporter):
705
+ """Internal abstract class for reporters that work via XML."""
706
+
707
+ def __init__(self, reports: Reports, output_dir: str) -> None:
708
+ super().__init__(reports, output_dir)
709
+
710
+ memory_reporter = reports.add_report("memory-xml", "<memory>")
711
+ assert isinstance(memory_reporter, MemoryXmlReporter)
712
+ # The dependency will be called first.
713
+ self.memory_xml = memory_reporter
714
+
715
+
716
+ class XmlReporter(AbstractXmlReporter):
717
+ """Public reporter that exports XML.
718
+
719
+ The produced XML files contain a reference to the absolute path
720
+ of the html transform, so they will be locally viewable in a browser.
721
+
722
+ However, there is a bug in Chrome and all other WebKit-based browsers
723
+ that makes it fail from file:// URLs but work on http:// URLs.
724
+ """
725
+
726
+ def on_file(
727
+ self,
728
+ tree: MypyFile,
729
+ modules: dict[str, MypyFile],
730
+ type_map: dict[Expression, Type],
731
+ options: Options,
732
+ ) -> None:
733
+ last_xml = self.memory_xml.last_xml
734
+ if last_xml is None:
735
+ return
736
+ path = os.path.relpath(tree.path)
737
+ if path.startswith(".."):
738
+ return
739
+ out_path = os.path.join(self.output_dir, "xml", path + ".xml")
740
+ os.makedirs(os.path.dirname(out_path), exist_ok=True)
741
+ last_xml.write(out_path, encoding="utf-8")
742
+
743
+ def on_finish(self) -> None:
744
+ last_xml = self.memory_xml.last_xml
745
+ assert last_xml is not None
746
+ out_path = os.path.join(self.output_dir, "index.xml")
747
+ out_xslt = os.path.join(self.output_dir, "mypy-html.xslt")
748
+ out_css = os.path.join(self.output_dir, "mypy-html.css")
749
+ last_xml.write(out_path, encoding="utf-8")
750
+ shutil.copyfile(self.memory_xml.xslt_html_path, out_xslt)
751
+ shutil.copyfile(self.memory_xml.css_html_path, out_css)
752
+ print("Generated XML report:", os.path.abspath(out_path))
753
+
754
+
755
+ register_reporter("xml", XmlReporter, needs_lxml=True)
756
+
757
+
758
+ class XsltHtmlReporter(AbstractXmlReporter):
759
+ """Public reporter that exports HTML via XSLT.
760
+
761
+ This is slightly different than running `xsltproc` on the .xml files,
762
+ because it passes a parameter to rewrite the links.
763
+ """
764
+
765
+ def __init__(self, reports: Reports, output_dir: str) -> None:
766
+ super().__init__(reports, output_dir)
767
+
768
+ self.xslt_html = etree.XSLT(etree.parse(self.memory_xml.xslt_html_path))
769
+ self.param_html = etree.XSLT.strparam("html")
770
+
771
+ def on_file(
772
+ self,
773
+ tree: MypyFile,
774
+ modules: dict[str, MypyFile],
775
+ type_map: dict[Expression, Type],
776
+ options: Options,
777
+ ) -> None:
778
+ last_xml = self.memory_xml.last_xml
779
+ if last_xml is None:
780
+ return
781
+ path = os.path.relpath(tree.path)
782
+ if path.startswith(".."):
783
+ return
784
+ out_path = os.path.join(self.output_dir, "html", path + ".html")
785
+ os.makedirs(os.path.dirname(out_path), exist_ok=True)
786
+ transformed_html = bytes(self.xslt_html(last_xml, ext=self.param_html))
787
+ with open(out_path, "wb") as out_file:
788
+ out_file.write(transformed_html)
789
+
790
+ def on_finish(self) -> None:
791
+ last_xml = self.memory_xml.last_xml
792
+ assert last_xml is not None
793
+ out_path = os.path.join(self.output_dir, "index.html")
794
+ out_css = os.path.join(self.output_dir, "mypy-html.css")
795
+ transformed_html = bytes(self.xslt_html(last_xml, ext=self.param_html))
796
+ with open(out_path, "wb") as out_file:
797
+ out_file.write(transformed_html)
798
+ shutil.copyfile(self.memory_xml.css_html_path, out_css)
799
+ print("Generated HTML report (via XSLT):", os.path.abspath(out_path))
800
+
801
+
802
+ register_reporter("xslt-html", XsltHtmlReporter, needs_lxml=True)
803
+
804
+
805
+ class XsltTxtReporter(AbstractXmlReporter):
806
+ """Public reporter that exports TXT via XSLT.
807
+
808
+ Currently this only does the summary, not the individual reports.
809
+ """
810
+
811
+ def __init__(self, reports: Reports, output_dir: str) -> None:
812
+ super().__init__(reports, output_dir)
813
+
814
+ self.xslt_txt = etree.XSLT(etree.parse(self.memory_xml.xslt_txt_path))
815
+
816
+ def on_file(
817
+ self,
818
+ tree: MypyFile,
819
+ modules: dict[str, MypyFile],
820
+ type_map: dict[Expression, Type],
821
+ options: Options,
822
+ ) -> None:
823
+ pass
824
+
825
+ def on_finish(self) -> None:
826
+ last_xml = self.memory_xml.last_xml
827
+ assert last_xml is not None
828
+ out_path = os.path.join(self.output_dir, "index.txt")
829
+ transformed_txt = bytes(self.xslt_txt(last_xml))
830
+ with open(out_path, "wb") as out_file:
831
+ out_file.write(transformed_txt)
832
+ print("Generated TXT report (via XSLT):", os.path.abspath(out_path))
833
+
834
+
835
+ register_reporter("xslt-txt", XsltTxtReporter, needs_lxml=True)
836
+
837
+ alias_reporter("xslt-html", "html")
838
+ alias_reporter("xslt-txt", "txt")
839
+
840
+
841
+ class LinePrecisionReporter(AbstractReporter):
842
+ """Report per-module line counts for typing precision.
843
+
844
+ Each line is classified into one of these categories:
845
+
846
+ * precise (fully type checked)
847
+ * imprecise (Any types in a type component, such as List[Any])
848
+ * any (something with an Any type, implicit or explicit)
849
+ * empty (empty line, comment or docstring)
850
+ * unanalyzed (mypy considers line unreachable)
851
+
852
+ The meaning of these categories varies slightly depending on
853
+ context.
854
+ """
855
+
856
+ def __init__(self, reports: Reports, output_dir: str) -> None:
857
+ super().__init__(reports, output_dir)
858
+ self.files: list[FileInfo] = []
859
+
860
+ def on_file(
861
+ self,
862
+ tree: MypyFile,
863
+ modules: dict[str, MypyFile],
864
+ type_map: dict[Expression, Type],
865
+ options: Options,
866
+ ) -> None:
867
+ try:
868
+ path = os.path.relpath(tree.path)
869
+ except ValueError:
870
+ return
871
+
872
+ if should_skip_path(path):
873
+ return
874
+
875
+ visitor = stats.StatisticsVisitor(
876
+ inferred=True,
877
+ filename=tree.fullname,
878
+ modules=modules,
879
+ typemap=type_map,
880
+ all_nodes=True,
881
+ )
882
+ tree.accept(visitor)
883
+
884
+ file_info = FileInfo(path, tree._fullname)
885
+ for lineno, _ in iterate_python_lines(path):
886
+ status = visitor.line_map.get(lineno, stats.TYPE_EMPTY)
887
+ file_info.counts[status] += 1
888
+
889
+ self.files.append(file_info)
890
+
891
+ def on_finish(self) -> None:
892
+ if not self.files:
893
+ # Nothing to do.
894
+ return
895
+ output_files = sorted(self.files, key=lambda x: x.module)
896
+ report_file = os.path.join(self.output_dir, "lineprecision.txt")
897
+ width = max(4, max(len(info.module) for info in output_files))
898
+ titles = ("Lines", "Precise", "Imprecise", "Any", "Empty", "Unanalyzed")
899
+ widths = (width,) + tuple(len(t) for t in titles)
900
+ fmt = "{:%d} {:%d} {:%d} {:%d} {:%d} {:%d} {:%d}\n" % widths
901
+ with open(report_file, "w") as f:
902
+ f.write(fmt.format("Name", *titles))
903
+ f.write("-" * (width + 51) + "\n")
904
+ for file_info in output_files:
905
+ counts = file_info.counts
906
+ f.write(
907
+ fmt.format(
908
+ file_info.module.ljust(width),
909
+ file_info.total(),
910
+ counts[stats.TYPE_PRECISE],
911
+ counts[stats.TYPE_IMPRECISE],
912
+ counts[stats.TYPE_ANY],
913
+ counts[stats.TYPE_EMPTY],
914
+ counts[stats.TYPE_UNANALYZED],
915
+ )
916
+ )
917
+
918
+
919
+ register_reporter("lineprecision", LinePrecisionReporter)
920
+
921
+
922
+ # Reporter class names are defined twice to speed up mypy startup, as this
923
+ # module is slow to import. Ensure that the two definitions match.
924
+ assert set(reporter_classes) == set(REPORTER_NAMES)