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/util.py ADDED
@@ -0,0 +1,869 @@
1
+ """Utility functions with no non-trivial dependencies."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import hashlib
6
+ import io
7
+ import os
8
+ import pathlib
9
+ import re
10
+ import shutil
11
+ import sys
12
+ import time
13
+ from importlib import resources as importlib_resources
14
+ from typing import IO, Callable, Container, Final, Iterable, Sequence, Sized, TypeVar
15
+ from typing_extensions import Literal
16
+
17
+ try:
18
+ import curses
19
+
20
+ import _curses # noqa: F401
21
+
22
+ CURSES_ENABLED = True
23
+ except ImportError:
24
+ CURSES_ENABLED = False
25
+
26
+ T = TypeVar("T")
27
+
28
+ if sys.version_info >= (3, 9):
29
+ TYPESHED_DIR: Final = str(importlib_resources.files("mypy") / "typeshed")
30
+ else:
31
+ with importlib_resources.path(
32
+ "mypy", # mypy-c doesn't support __package__
33
+ "py.typed", # a marker file for type information, we assume typeshed to live in the same dir
34
+ ) as _resource:
35
+ TYPESHED_DIR = str(_resource.parent / "typeshed")
36
+
37
+
38
+ ENCODING_RE: Final = re.compile(rb"([ \t\v]*#.*(\r\n?|\n))??[ \t\v]*#.*coding[:=][ \t]*([-\w.]+)")
39
+
40
+ DEFAULT_SOURCE_OFFSET: Final = 4
41
+ DEFAULT_COLUMNS: Final = 80
42
+
43
+ # At least this number of columns will be shown on each side of
44
+ # error location when printing source code snippet.
45
+ MINIMUM_WIDTH: Final = 20
46
+
47
+ # VT100 color code processing was added in Windows 10, but only the second major update,
48
+ # Threshold 2. Fortunately, everyone (even on LTSB, Long Term Support Branch) should
49
+ # have a version of Windows 10 newer than this. Note that Windows 8 and below are not
50
+ # supported, but are either going out of support, or make up only a few % of the market.
51
+ MINIMUM_WINDOWS_MAJOR_VT100: Final = 10
52
+ MINIMUM_WINDOWS_BUILD_VT100: Final = 10586
53
+
54
+ SPECIAL_DUNDERS: Final = frozenset(
55
+ ("__init__", "__new__", "__call__", "__init_subclass__", "__class_getitem__")
56
+ )
57
+
58
+
59
+ def is_dunder(name: str, exclude_special: bool = False) -> bool:
60
+ """Returns whether name is a dunder name.
61
+
62
+ Args:
63
+ exclude_special: Whether to return False for a couple special dunder methods.
64
+
65
+ """
66
+ if exclude_special and name in SPECIAL_DUNDERS:
67
+ return False
68
+ return name.startswith("__") and name.endswith("__")
69
+
70
+
71
+ def is_sunder(name: str) -> bool:
72
+ return not is_dunder(name) and name.startswith("_") and name.endswith("_")
73
+
74
+
75
+ def split_module_names(mod_name: str) -> list[str]:
76
+ """Return the module and all parent module names.
77
+
78
+ So, if `mod_name` is 'a.b.c', this function will return
79
+ ['a.b.c', 'a.b', and 'a'].
80
+ """
81
+ out = [mod_name]
82
+ while "." in mod_name:
83
+ mod_name = mod_name.rsplit(".", 1)[0]
84
+ out.append(mod_name)
85
+ return out
86
+
87
+
88
+ def module_prefix(modules: Iterable[str], target: str) -> str | None:
89
+ result = split_target(modules, target)
90
+ if result is None:
91
+ return None
92
+ return result[0]
93
+
94
+
95
+ def split_target(modules: Iterable[str], target: str) -> tuple[str, str] | None:
96
+ remaining: list[str] = []
97
+ while True:
98
+ if target in modules:
99
+ return target, ".".join(remaining)
100
+ components = target.rsplit(".", 1)
101
+ if len(components) == 1:
102
+ return None
103
+ target = components[0]
104
+ remaining.insert(0, components[1])
105
+
106
+
107
+ def short_type(obj: object) -> str:
108
+ """Return the last component of the type name of an object.
109
+
110
+ If obj is None, return 'nil'. For example, if obj is 1, return 'int'.
111
+ """
112
+ if obj is None:
113
+ return "nil"
114
+ t = str(type(obj))
115
+ return t.split(".")[-1].rstrip("'>")
116
+
117
+
118
+ def find_python_encoding(text: bytes) -> tuple[str, int]:
119
+ """PEP-263 for detecting Python file encoding"""
120
+ result = ENCODING_RE.match(text)
121
+ if result:
122
+ line = 2 if result.group(1) else 1
123
+ encoding = result.group(3).decode("ascii")
124
+ # Handle some aliases that Python is happy to accept and that are used in the wild.
125
+ if encoding.startswith(("iso-latin-1-", "latin-1-")) or encoding == "iso-latin-1":
126
+ encoding = "latin-1"
127
+ return encoding, line
128
+ else:
129
+ default_encoding = "utf8"
130
+ return default_encoding, -1
131
+
132
+
133
+ def bytes_to_human_readable_repr(b: bytes) -> str:
134
+ """Converts bytes into some human-readable representation. Unprintable
135
+ bytes such as the nul byte are escaped. For example:
136
+
137
+ >>> b = bytes([102, 111, 111, 10, 0])
138
+ >>> s = bytes_to_human_readable_repr(b)
139
+ >>> print(s)
140
+ foo\n\x00
141
+ >>> print(repr(s))
142
+ 'foo\\n\\x00'
143
+ """
144
+ return repr(b)[2:-1]
145
+
146
+
147
+ class DecodeError(Exception):
148
+ """Exception raised when a file cannot be decoded due to an unknown encoding type.
149
+
150
+ Essentially a wrapper for the LookupError raised by `bytearray.decode`
151
+ """
152
+
153
+
154
+ def decode_python_encoding(source: bytes) -> str:
155
+ """Read the Python file with while obeying PEP-263 encoding detection.
156
+
157
+ Returns the source as a string.
158
+ """
159
+ # check for BOM UTF-8 encoding and strip it out if present
160
+ if source.startswith(b"\xef\xbb\xbf"):
161
+ encoding = "utf8"
162
+ source = source[3:]
163
+ else:
164
+ # look at first two lines and check if PEP-263 coding is present
165
+ encoding, _ = find_python_encoding(source)
166
+
167
+ try:
168
+ source_text = source.decode(encoding)
169
+ except LookupError as lookuperr:
170
+ raise DecodeError(str(lookuperr)) from lookuperr
171
+ return source_text
172
+
173
+
174
+ def read_py_file(path: str, read: Callable[[str], bytes]) -> list[str] | None:
175
+ """Try reading a Python file as list of source lines.
176
+
177
+ Return None if something goes wrong.
178
+ """
179
+ try:
180
+ source = read(path)
181
+ except OSError:
182
+ return None
183
+ else:
184
+ try:
185
+ source_lines = decode_python_encoding(source).splitlines()
186
+ except DecodeError:
187
+ return None
188
+ return source_lines
189
+
190
+
191
+ def trim_source_line(line: str, max_len: int, col: int, min_width: int) -> tuple[str, int]:
192
+ """Trim a line of source code to fit into max_len.
193
+
194
+ Show 'min_width' characters on each side of 'col' (an error location). If either
195
+ start or end is trimmed, this is indicated by adding '...' there.
196
+ A typical result looks like this:
197
+ ...some_variable = function_to_call(one_arg, other_arg) or...
198
+
199
+ Return the trimmed string and the column offset to to adjust error location.
200
+ """
201
+ if max_len < 2 * min_width + 1:
202
+ # In case the window is too tiny it is better to still show something.
203
+ max_len = 2 * min_width + 1
204
+
205
+ # Trivial case: line already fits in.
206
+ if len(line) <= max_len:
207
+ return line, 0
208
+
209
+ # If column is not too large so that there is still min_width after it,
210
+ # the line doesn't need to be trimmed at the start.
211
+ if col + min_width < max_len:
212
+ return line[:max_len] + "...", 0
213
+
214
+ # Otherwise, if the column is not too close to the end, trim both sides.
215
+ if col < len(line) - min_width - 1:
216
+ offset = col - max_len + min_width + 1
217
+ return "..." + line[offset : col + min_width + 1] + "...", offset - 3
218
+
219
+ # Finally, if the column is near the end, just trim the start.
220
+ return "..." + line[-max_len:], len(line) - max_len - 3
221
+
222
+
223
+ def get_mypy_comments(source: str) -> list[tuple[int, str]]:
224
+ PREFIX = "# mypy: "
225
+ # Don't bother splitting up the lines unless we know it is useful
226
+ if PREFIX not in source:
227
+ return []
228
+ lines = source.split("\n")
229
+ results = []
230
+ for i, line in enumerate(lines):
231
+ if line.startswith(PREFIX):
232
+ results.append((i + 1, line[len(PREFIX) :]))
233
+
234
+ return results
235
+
236
+
237
+ JUNIT_HEADER_TEMPLATE: Final = """<?xml version="1.0" encoding="utf-8"?>
238
+ <testsuite errors="{errors}" failures="{failures}" name="mypy" skips="0" tests="{tests}" time="{time:.3f}">
239
+ """
240
+
241
+ JUNIT_TESTCASE_FAIL_TEMPLATE: Final = """ <testcase classname="mypy" file="{filename}" line="1" name="{name}" time="{time:.3f}">
242
+ <failure message="mypy produced messages">{text}</failure>
243
+ </testcase>
244
+ """
245
+
246
+ JUNIT_ERROR_TEMPLATE: Final = """ <testcase classname="mypy" file="mypy" line="1" name="mypy-py{ver}-{platform}" time="{time:.3f}">
247
+ <error message="mypy produced errors">{text}</error>
248
+ </testcase>
249
+ """
250
+
251
+ JUNIT_TESTCASE_PASS_TEMPLATE: Final = """ <testcase classname="mypy" file="mypy" line="1" name="mypy-py{ver}-{platform}" time="{time:.3f}">
252
+ </testcase>
253
+ """
254
+
255
+ JUNIT_FOOTER: Final = """</testsuite>
256
+ """
257
+
258
+
259
+ def _generate_junit_contents(
260
+ dt: float,
261
+ serious: bool,
262
+ messages_by_file: dict[str | None, list[str]],
263
+ version: str,
264
+ platform: str,
265
+ ) -> str:
266
+ from xml.sax.saxutils import escape
267
+
268
+ if serious:
269
+ failures = 0
270
+ errors = len(messages_by_file)
271
+ else:
272
+ failures = len(messages_by_file)
273
+ errors = 0
274
+
275
+ xml = JUNIT_HEADER_TEMPLATE.format(
276
+ errors=errors,
277
+ failures=failures,
278
+ time=dt,
279
+ # If there are no messages, we still write one "test" indicating success.
280
+ tests=len(messages_by_file) or 1,
281
+ )
282
+
283
+ if not messages_by_file:
284
+ xml += JUNIT_TESTCASE_PASS_TEMPLATE.format(time=dt, ver=version, platform=platform)
285
+ else:
286
+ for filename, messages in messages_by_file.items():
287
+ if filename is not None:
288
+ xml += JUNIT_TESTCASE_FAIL_TEMPLATE.format(
289
+ text=escape("\n".join(messages)),
290
+ filename=filename,
291
+ time=dt,
292
+ name="mypy-py{ver}-{platform} {filename}".format(
293
+ ver=version, platform=platform, filename=filename
294
+ ),
295
+ )
296
+ else:
297
+ xml += JUNIT_TESTCASE_FAIL_TEMPLATE.format(
298
+ text=escape("\n".join(messages)),
299
+ filename="mypy",
300
+ time=dt,
301
+ name="mypy-py{ver}-{platform}".format(ver=version, platform=platform),
302
+ )
303
+
304
+ xml += JUNIT_FOOTER
305
+
306
+ return xml
307
+
308
+
309
+ def write_junit_xml(
310
+ dt: float,
311
+ serious: bool,
312
+ messages_by_file: dict[str | None, list[str]],
313
+ path: str,
314
+ version: str,
315
+ platform: str,
316
+ ) -> None:
317
+ xml = _generate_junit_contents(dt, serious, messages_by_file, version, platform)
318
+
319
+ # creates folders if needed
320
+ xml_dirs = os.path.dirname(os.path.abspath(path))
321
+ os.makedirs(xml_dirs, exist_ok=True)
322
+
323
+ with open(path, "wb") as f:
324
+ f.write(xml.encode("utf-8"))
325
+
326
+
327
+ class IdMapper:
328
+ """Generate integer ids for objects.
329
+
330
+ Unlike id(), these start from 0 and increment by 1, and ids won't
331
+ get reused across the life-time of IdMapper.
332
+
333
+ Assume objects don't redefine __eq__ or __hash__.
334
+ """
335
+
336
+ def __init__(self) -> None:
337
+ self.id_map: dict[object, int] = {}
338
+ self.next_id = 0
339
+
340
+ def id(self, o: object) -> int:
341
+ if o not in self.id_map:
342
+ self.id_map[o] = self.next_id
343
+ self.next_id += 1
344
+ return self.id_map[o]
345
+
346
+
347
+ def get_prefix(fullname: str) -> str:
348
+ """Drop the final component of a qualified name (e.g. ('x.y' -> 'x')."""
349
+ return fullname.rsplit(".", 1)[0]
350
+
351
+
352
+ def correct_relative_import(
353
+ cur_mod_id: str, relative: int, target: str, is_cur_package_init_file: bool
354
+ ) -> tuple[str, bool]:
355
+ if relative == 0:
356
+ return target, True
357
+ parts = cur_mod_id.split(".")
358
+ rel = relative
359
+ if is_cur_package_init_file:
360
+ rel -= 1
361
+ ok = len(parts) >= rel
362
+ if rel != 0:
363
+ cur_mod_id = ".".join(parts[:-rel])
364
+ return cur_mod_id + (("." + target) if target else ""), ok
365
+
366
+
367
+ fields_cache: Final[dict[type[object], list[str]]] = {}
368
+
369
+
370
+ def get_class_descriptors(cls: type[object]) -> Sequence[str]:
371
+ import inspect # Lazy import for minor startup speed win
372
+
373
+ # Maintain a cache of type -> attributes defined by descriptors in the class
374
+ # (that is, attributes from __slots__ and C extension classes)
375
+ if cls not in fields_cache:
376
+ members = inspect.getmembers(
377
+ cls, lambda o: inspect.isgetsetdescriptor(o) or inspect.ismemberdescriptor(o)
378
+ )
379
+ fields_cache[cls] = [x for x, y in members if x != "__weakref__" and x != "__dict__"]
380
+ return fields_cache[cls]
381
+
382
+
383
+ def replace_object_state(
384
+ new: object, old: object, copy_dict: bool = False, skip_slots: tuple[str, ...] = ()
385
+ ) -> None:
386
+ """Copy state of old node to the new node.
387
+
388
+ This handles cases where there is __dict__ and/or attribute descriptors
389
+ (either from slots or because the type is defined in a C extension module).
390
+
391
+ Assume that both objects have the same __class__.
392
+ """
393
+ if hasattr(old, "__dict__"):
394
+ if copy_dict:
395
+ new.__dict__ = dict(old.__dict__)
396
+ else:
397
+ new.__dict__ = old.__dict__
398
+
399
+ for attr in get_class_descriptors(old.__class__):
400
+ if attr in skip_slots:
401
+ continue
402
+ try:
403
+ if hasattr(old, attr):
404
+ setattr(new, attr, getattr(old, attr))
405
+ elif hasattr(new, attr):
406
+ delattr(new, attr)
407
+ # There is no way to distinguish getsetdescriptors that allow
408
+ # writes from ones that don't (I think?), so we just ignore
409
+ # AttributeErrors if we need to.
410
+ # TODO: What about getsetdescriptors that act like properties???
411
+ except AttributeError:
412
+ pass
413
+
414
+
415
+ def is_sub_path(path1: str, path2: str) -> bool:
416
+ """Given two paths, return if path1 is a sub-path of path2."""
417
+ return pathlib.Path(path2) in pathlib.Path(path1).parents
418
+
419
+
420
+ def hard_exit(status: int = 0) -> None:
421
+ """Kill the current process without fully cleaning up.
422
+
423
+ This can be quite a bit faster than a normal exit() since objects are not freed.
424
+ """
425
+ sys.stdout.flush()
426
+ sys.stderr.flush()
427
+ os._exit(status)
428
+
429
+
430
+ def unmangle(name: str) -> str:
431
+ """Remove internal suffixes from a short name."""
432
+ return name.rstrip("'")
433
+
434
+
435
+ def get_unique_redefinition_name(name: str, existing: Container[str]) -> str:
436
+ """Get a simple redefinition name not present among existing.
437
+
438
+ For example, for name 'foo' we try 'foo-redefinition', 'foo-redefinition2',
439
+ 'foo-redefinition3', etc. until we find one that is not in existing.
440
+ """
441
+ r_name = name + "-redefinition"
442
+ if r_name not in existing:
443
+ return r_name
444
+
445
+ i = 2
446
+ while r_name + str(i) in existing:
447
+ i += 1
448
+ return r_name + str(i)
449
+
450
+
451
+ def check_python_version(program: str) -> None:
452
+ """Report issues with the Python used to run mypy, dmypy, or stubgen"""
453
+ # Check for known bad Python versions.
454
+ if sys.version_info[:2] < (3, 8): # noqa: UP036
455
+ sys.exit(
456
+ "Running {name} with Python 3.7 or lower is not supported; "
457
+ "please upgrade to 3.8 or newer".format(name=program)
458
+ )
459
+
460
+
461
+ def count_stats(messages: list[str]) -> tuple[int, int, int]:
462
+ """Count total number of errors, notes and error_files in message list."""
463
+ errors = [e for e in messages if ": error:" in e]
464
+ error_files = {e.split(":")[0] for e in errors}
465
+ notes = [e for e in messages if ": note:" in e]
466
+ return len(errors), len(notes), len(error_files)
467
+
468
+
469
+ def split_words(msg: str) -> list[str]:
470
+ """Split line of text into words (but not within quoted groups)."""
471
+ next_word = ""
472
+ res: list[str] = []
473
+ allow_break = True
474
+ for c in msg:
475
+ if c == " " and allow_break:
476
+ res.append(next_word)
477
+ next_word = ""
478
+ continue
479
+ if c == '"':
480
+ allow_break = not allow_break
481
+ next_word += c
482
+ res.append(next_word)
483
+ return res
484
+
485
+
486
+ def get_terminal_width() -> int:
487
+ """Get current terminal width if possible, otherwise return the default one."""
488
+ return (
489
+ int(os.getenv("MYPY_FORCE_TERMINAL_WIDTH", "0"))
490
+ or shutil.get_terminal_size().columns
491
+ or DEFAULT_COLUMNS
492
+ )
493
+
494
+
495
+ def soft_wrap(msg: str, max_len: int, first_offset: int, num_indent: int = 0) -> str:
496
+ """Wrap a long error message into few lines.
497
+
498
+ Breaks will only happen between words, and never inside a quoted group
499
+ (to avoid breaking types such as "Union[int, str]"). The 'first_offset' is
500
+ the width before the start of first line.
501
+
502
+ Pad every next line with 'num_indent' spaces. Every line will be at most 'max_len'
503
+ characters, except if it is a single word or quoted group.
504
+
505
+ For example:
506
+ first_offset
507
+ ------------------------
508
+ path/to/file: error: 58: Some very long error message
509
+ that needs to be split in separate lines.
510
+ "Long[Type, Names]" are never split.
511
+ ^^^^--------------------------------------------------
512
+ num_indent max_len
513
+ """
514
+ words = split_words(msg)
515
+ next_line = words.pop(0)
516
+ lines: list[str] = []
517
+ while words:
518
+ next_word = words.pop(0)
519
+ max_line_len = max_len - num_indent if lines else max_len - first_offset
520
+ # Add 1 to account for space between words.
521
+ if len(next_line) + len(next_word) + 1 <= max_line_len:
522
+ next_line += " " + next_word
523
+ else:
524
+ lines.append(next_line)
525
+ next_line = next_word
526
+ lines.append(next_line)
527
+ padding = "\n" + " " * num_indent
528
+ return padding.join(lines)
529
+
530
+
531
+ def hash_digest(data: bytes) -> str:
532
+ """Compute a hash digest of some data.
533
+
534
+ We use a cryptographic hash because we want a low probability of
535
+ accidental collision, but we don't really care about any of the
536
+ cryptographic properties.
537
+ """
538
+ # Once we drop Python 3.5 support, we should consider using
539
+ # blake2b, which is faster.
540
+ return hashlib.sha256(data).hexdigest()
541
+
542
+
543
+ def parse_gray_color(cup: bytes) -> str:
544
+ """Reproduce a gray color in ANSI escape sequence"""
545
+ if sys.platform == "win32":
546
+ assert False, "curses is not available on Windows"
547
+ set_color = "".join([cup[:-1].decode(), "m"])
548
+ gray = curses.tparm(set_color.encode("utf-8"), 1, 9).decode()
549
+ return gray
550
+
551
+
552
+ def should_force_color() -> bool:
553
+ env_var = os.getenv("MYPY_FORCE_COLOR", os.getenv("FORCE_COLOR", "0"))
554
+ try:
555
+ return bool(int(env_var))
556
+ except ValueError:
557
+ return bool(env_var)
558
+
559
+
560
+ class FancyFormatter:
561
+ """Apply color and bold font to terminal output.
562
+
563
+ This currently only works on Linux and Mac.
564
+ """
565
+
566
+ def __init__(self, f_out: IO[str], f_err: IO[str], hide_error_codes: bool) -> None:
567
+ self.hide_error_codes = hide_error_codes
568
+ # Check if we are in a human-facing terminal on a supported platform.
569
+ if sys.platform not in ("linux", "darwin", "win32", "emscripten"):
570
+ self.dummy_term = True
571
+ return
572
+ if not should_force_color() and (not f_out.isatty() or not f_err.isatty()):
573
+ self.dummy_term = True
574
+ return
575
+ if sys.platform == "win32":
576
+ self.dummy_term = not self.initialize_win_colors()
577
+ elif sys.platform == "emscripten":
578
+ self.dummy_term = not self.initialize_vt100_colors()
579
+ else:
580
+ self.dummy_term = not self.initialize_unix_colors()
581
+ if not self.dummy_term:
582
+ self.colors = {
583
+ "red": self.RED,
584
+ "green": self.GREEN,
585
+ "blue": self.BLUE,
586
+ "yellow": self.YELLOW,
587
+ "none": "",
588
+ }
589
+
590
+ def initialize_vt100_colors(self) -> bool:
591
+ """Return True if initialization was successful and we can use colors, False otherwise"""
592
+ # Windows and Emscripten can both use ANSI/VT100 escape sequences for color
593
+ assert sys.platform in ("win32", "emscripten")
594
+ self.BOLD = "\033[1m"
595
+ self.UNDER = "\033[4m"
596
+ self.BLUE = "\033[94m"
597
+ self.GREEN = "\033[92m"
598
+ self.RED = "\033[91m"
599
+ self.YELLOW = "\033[93m"
600
+ self.NORMAL = "\033[0m"
601
+ self.DIM = "\033[2m"
602
+ return True
603
+
604
+ def initialize_win_colors(self) -> bool:
605
+ """Return True if initialization was successful and we can use colors, False otherwise"""
606
+ # Windows ANSI escape sequences are only supported on Threshold 2 and above.
607
+ # we check with an assert at runtime and an if check for mypy, as asserts do not
608
+ # yet narrow platform
609
+ assert sys.platform == "win32"
610
+ if sys.platform == "win32":
611
+ winver = sys.getwindowsversion()
612
+ if (
613
+ winver.major < MINIMUM_WINDOWS_MAJOR_VT100
614
+ or winver.build < MINIMUM_WINDOWS_BUILD_VT100
615
+ ):
616
+ return False
617
+ import ctypes
618
+
619
+ kernel32 = ctypes.windll.kernel32
620
+ ENABLE_PROCESSED_OUTPUT = 0x1
621
+ ENABLE_WRAP_AT_EOL_OUTPUT = 0x2
622
+ ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x4
623
+ STD_OUTPUT_HANDLE = -11
624
+ kernel32.SetConsoleMode(
625
+ kernel32.GetStdHandle(STD_OUTPUT_HANDLE),
626
+ ENABLE_PROCESSED_OUTPUT
627
+ | ENABLE_WRAP_AT_EOL_OUTPUT
628
+ | ENABLE_VIRTUAL_TERMINAL_PROCESSING,
629
+ )
630
+ self.initialize_vt100_colors()
631
+ return True
632
+ return False
633
+
634
+ def initialize_unix_colors(self) -> bool:
635
+ """Return True if initialization was successful and we can use colors, False otherwise"""
636
+ if sys.platform == "win32" or not CURSES_ENABLED:
637
+ return False
638
+ try:
639
+ # setupterm wants a fd to potentially write an "initialization sequence".
640
+ # We override sys.stdout for the daemon API so if stdout doesn't have an fd,
641
+ # just give it /dev/null.
642
+ try:
643
+ fd = sys.stdout.fileno()
644
+ except io.UnsupportedOperation:
645
+ with open("/dev/null", "rb") as f:
646
+ curses.setupterm(fd=f.fileno())
647
+ else:
648
+ curses.setupterm(fd=fd)
649
+ except curses.error:
650
+ # Most likely terminfo not found.
651
+ return False
652
+ bold = curses.tigetstr("bold")
653
+ under = curses.tigetstr("smul")
654
+ set_color = curses.tigetstr("setaf")
655
+ set_eseq = curses.tigetstr("cup")
656
+ normal = curses.tigetstr("sgr0")
657
+
658
+ if not (bold and under and set_color and set_eseq and normal):
659
+ return False
660
+
661
+ self.NORMAL = normal.decode()
662
+ self.BOLD = bold.decode()
663
+ self.UNDER = under.decode()
664
+ self.DIM = parse_gray_color(set_eseq)
665
+ self.BLUE = curses.tparm(set_color, curses.COLOR_BLUE).decode()
666
+ self.GREEN = curses.tparm(set_color, curses.COLOR_GREEN).decode()
667
+ self.RED = curses.tparm(set_color, curses.COLOR_RED).decode()
668
+ self.YELLOW = curses.tparm(set_color, curses.COLOR_YELLOW).decode()
669
+ return True
670
+
671
+ def style(
672
+ self,
673
+ text: str,
674
+ color: Literal["red", "green", "blue", "yellow", "none"],
675
+ bold: bool = False,
676
+ underline: bool = False,
677
+ dim: bool = False,
678
+ ) -> str:
679
+ """Apply simple color and style (underlined or bold)."""
680
+ if self.dummy_term:
681
+ return text
682
+ if bold:
683
+ start = self.BOLD
684
+ else:
685
+ start = ""
686
+ if underline:
687
+ start += self.UNDER
688
+ if dim:
689
+ start += self.DIM
690
+ return start + self.colors[color] + text + self.NORMAL
691
+
692
+ def fit_in_terminal(
693
+ self, messages: list[str], fixed_terminal_width: int | None = None
694
+ ) -> list[str]:
695
+ """Improve readability by wrapping error messages and trimming source code."""
696
+ width = fixed_terminal_width or get_terminal_width()
697
+ new_messages = messages.copy()
698
+ for i, error in enumerate(messages):
699
+ if ": error:" in error:
700
+ loc, msg = error.split("error:", maxsplit=1)
701
+ msg = soft_wrap(msg, width, first_offset=len(loc) + len("error: "))
702
+ new_messages[i] = loc + "error:" + msg
703
+ if error.startswith(" " * DEFAULT_SOURCE_OFFSET) and "^" not in error:
704
+ # TODO: detecting source code highlights through an indent can be surprising.
705
+ # Restore original error message and error location.
706
+ error = error[DEFAULT_SOURCE_OFFSET:]
707
+ marker_line = messages[i + 1]
708
+ marker_column = marker_line.index("^")
709
+ column = marker_column - DEFAULT_SOURCE_OFFSET
710
+ if "~" not in marker_line:
711
+ marker = "^"
712
+ else:
713
+ # +1 because both ends are included
714
+ marker = marker_line[marker_column : marker_line.rindex("~") + 1]
715
+
716
+ # Let source have some space also on the right side, plus 6
717
+ # to accommodate ... on each side.
718
+ max_len = width - DEFAULT_SOURCE_OFFSET - 6
719
+ source_line, offset = trim_source_line(error, max_len, column, MINIMUM_WIDTH)
720
+
721
+ new_messages[i] = " " * DEFAULT_SOURCE_OFFSET + source_line
722
+ # Also adjust the error marker position and trim error marker is needed.
723
+ new_marker_line = " " * (DEFAULT_SOURCE_OFFSET + column - offset) + marker
724
+ if len(new_marker_line) > len(new_messages[i]) and len(marker) > 3:
725
+ new_marker_line = new_marker_line[: len(new_messages[i]) - 3] + "..."
726
+ new_messages[i + 1] = new_marker_line
727
+ return new_messages
728
+
729
+ def colorize(self, error: str) -> str:
730
+ """Colorize an output line by highlighting the status and error code."""
731
+ if ": error:" in error:
732
+ loc, msg = error.split("error:", maxsplit=1)
733
+ if self.hide_error_codes:
734
+ return (
735
+ loc + self.style("error:", "red", bold=True) + self.highlight_quote_groups(msg)
736
+ )
737
+ codepos = msg.rfind("[")
738
+ if codepos != -1:
739
+ code = msg[codepos:]
740
+ msg = msg[:codepos]
741
+ else:
742
+ code = "" # no error code specified
743
+ return (
744
+ loc
745
+ + self.style("error:", "red", bold=True)
746
+ + self.highlight_quote_groups(msg)
747
+ + self.style(code, "yellow")
748
+ )
749
+ elif ": note:" in error:
750
+ loc, msg = error.split("note:", maxsplit=1)
751
+ formatted = self.highlight_quote_groups(self.underline_link(msg))
752
+ return loc + self.style("note:", "blue") + formatted
753
+ elif error.startswith(" " * DEFAULT_SOURCE_OFFSET):
754
+ # TODO: detecting source code highlights through an indent can be surprising.
755
+ if "^" not in error:
756
+ return self.style(error, "none", dim=True)
757
+ return self.style(error, "red")
758
+ else:
759
+ return error
760
+
761
+ def highlight_quote_groups(self, msg: str) -> str:
762
+ """Make groups quoted with double quotes bold (including quotes).
763
+
764
+ This is used to highlight types, attribute names etc.
765
+ """
766
+ if msg.count('"') % 2:
767
+ # Broken error message, don't do any formatting.
768
+ return msg
769
+ parts = msg.split('"')
770
+ out = ""
771
+ for i, part in enumerate(parts):
772
+ if i % 2 == 0:
773
+ out += self.style(part, "none")
774
+ else:
775
+ out += self.style('"' + part + '"', "none", bold=True)
776
+ return out
777
+
778
+ def underline_link(self, note: str) -> str:
779
+ """Underline a link in a note message (if any).
780
+
781
+ This assumes there is at most one link in the message.
782
+ """
783
+ match = re.search(r"https?://\S*", note)
784
+ if not match:
785
+ return note
786
+ start = match.start()
787
+ end = match.end()
788
+ return note[:start] + self.style(note[start:end], "none", underline=True) + note[end:]
789
+
790
+ def format_success(self, n_sources: int, use_color: bool = True) -> str:
791
+ """Format short summary in case of success.
792
+
793
+ n_sources is total number of files passed directly on command line,
794
+ i.e. excluding stubs and followed imports.
795
+ """
796
+ msg = f"Success: no issues found in {n_sources} source file{plural_s(n_sources)}"
797
+ if not use_color:
798
+ return msg
799
+ return self.style(msg, "green", bold=True)
800
+
801
+ def format_error(
802
+ self,
803
+ n_errors: int,
804
+ n_files: int,
805
+ n_sources: int,
806
+ *,
807
+ blockers: bool = False,
808
+ use_color: bool = True,
809
+ ) -> str:
810
+ """Format a short summary in case of errors."""
811
+ msg = f"Found {n_errors} error{plural_s(n_errors)} in {n_files} file{plural_s(n_files)}"
812
+ if blockers:
813
+ msg += " (errors prevented further checking)"
814
+ else:
815
+ msg += f" (checked {n_sources} source file{plural_s(n_sources)})"
816
+ if not use_color:
817
+ return msg
818
+ return self.style(msg, "red", bold=True)
819
+
820
+
821
+ def is_typeshed_file(typeshed_dir: str | None, file: str) -> bool:
822
+ typeshed_dir = typeshed_dir if typeshed_dir is not None else TYPESHED_DIR
823
+ try:
824
+ return os.path.commonpath((typeshed_dir, os.path.abspath(file))) == typeshed_dir
825
+ except ValueError: # Different drives on Windows
826
+ return False
827
+
828
+
829
+ def is_stub_package_file(file: str) -> bool:
830
+ # Use hacky heuristics to check whether file is part of a PEP 561 stub package.
831
+ if not file.endswith(".pyi"):
832
+ return False
833
+ return any(component.endswith("-stubs") for component in os.path.split(os.path.abspath(file)))
834
+
835
+
836
+ def unnamed_function(name: str | None) -> bool:
837
+ return name is not None and name == "_"
838
+
839
+
840
+ time_ref = time.perf_counter_ns
841
+
842
+
843
+ def time_spent_us(t0: int) -> int:
844
+ return int((time.perf_counter_ns() - t0) / 1000)
845
+
846
+
847
+ def plural_s(s: int | Sized) -> str:
848
+ count = s if isinstance(s, int) else len(s)
849
+ if count != 1:
850
+ return "s"
851
+ else:
852
+ return ""
853
+
854
+
855
+ def quote_docstring(docstr: str) -> str:
856
+ """Returns docstring correctly encapsulated in a single or double quoted form."""
857
+ # Uses repr to get hint on the correct quotes and escape everything properly.
858
+ # Creating multiline string for prettier output.
859
+ docstr_repr = "\n".join(re.split(r"(?<=[^\\])\\n", repr(docstr)))
860
+
861
+ if docstr_repr.startswith("'"):
862
+ # Enforce double quotes when it's safe to do so.
863
+ # That is when double quotes are not in the string
864
+ # or when it doesn't end with a single quote.
865
+ if '"' not in docstr_repr[1:-1] and docstr_repr[-2] != "'":
866
+ return f'"""{docstr_repr[1:-1]}"""'
867
+ return f"''{docstr_repr}''"
868
+ else:
869
+ return f'""{docstr_repr}""'