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/stubgenc.py ADDED
@@ -0,0 +1,993 @@
1
+ #!/usr/bin/env python3
2
+ """Stub generator for C modules.
3
+
4
+ The public interface is via the mypy.stubgen module.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ import glob
10
+ import importlib
11
+ import inspect
12
+ import keyword
13
+ import os.path
14
+ from types import FunctionType, ModuleType
15
+ from typing import Any, Mapping
16
+
17
+ from mypy.fastparse import parse_type_comment
18
+ from mypy.moduleinspect import is_c_module
19
+ from mypy.stubdoc import (
20
+ ArgSig,
21
+ FunctionSig,
22
+ Sig,
23
+ find_unique_signatures,
24
+ infer_arg_sig_from_anon_docstring,
25
+ infer_prop_type_from_docstring,
26
+ infer_ret_type_sig_from_anon_docstring,
27
+ infer_ret_type_sig_from_docstring,
28
+ infer_sig_from_docstring,
29
+ parse_all_signatures,
30
+ )
31
+ from mypy.stubutil import (
32
+ BaseStubGenerator,
33
+ ClassInfo,
34
+ FunctionContext,
35
+ SignatureGenerator,
36
+ infer_method_arg_types,
37
+ infer_method_ret_type,
38
+ )
39
+
40
+
41
+ class ExternalSignatureGenerator(SignatureGenerator):
42
+ def __init__(
43
+ self, func_sigs: dict[str, str] | None = None, class_sigs: dict[str, str] | None = None
44
+ ) -> None:
45
+ """
46
+ Takes a mapping of function/method names to signatures and class name to
47
+ class signatures (usually corresponds to __init__).
48
+ """
49
+ self.func_sigs = func_sigs or {}
50
+ self.class_sigs = class_sigs or {}
51
+
52
+ @classmethod
53
+ def from_doc_dir(cls, doc_dir: str) -> ExternalSignatureGenerator:
54
+ """Instantiate from a directory of .rst files."""
55
+ all_sigs: list[Sig] = []
56
+ all_class_sigs: list[Sig] = []
57
+ for path in glob.glob(f"{doc_dir}/*.rst"):
58
+ with open(path) as f:
59
+ loc_sigs, loc_class_sigs = parse_all_signatures(f.readlines())
60
+ all_sigs += loc_sigs
61
+ all_class_sigs += loc_class_sigs
62
+ sigs = dict(find_unique_signatures(all_sigs))
63
+ class_sigs = dict(find_unique_signatures(all_class_sigs))
64
+ return ExternalSignatureGenerator(sigs, class_sigs)
65
+
66
+ def get_function_sig(
67
+ self, default_sig: FunctionSig, ctx: FunctionContext
68
+ ) -> list[FunctionSig] | None:
69
+ # method:
70
+ if (
71
+ ctx.class_info
72
+ and ctx.name in ("__new__", "__init__")
73
+ and ctx.name not in self.func_sigs
74
+ and ctx.class_info.name in self.class_sigs
75
+ ):
76
+ return [
77
+ FunctionSig(
78
+ name=ctx.name,
79
+ args=infer_arg_sig_from_anon_docstring(self.class_sigs[ctx.class_info.name]),
80
+ ret_type=infer_method_ret_type(ctx.name),
81
+ )
82
+ ]
83
+
84
+ # function:
85
+ if ctx.name not in self.func_sigs:
86
+ return None
87
+
88
+ inferred = [
89
+ FunctionSig(
90
+ name=ctx.name,
91
+ args=infer_arg_sig_from_anon_docstring(self.func_sigs[ctx.name]),
92
+ ret_type=None,
93
+ )
94
+ ]
95
+ if ctx.class_info:
96
+ return self.remove_self_type(inferred, ctx.class_info.self_var)
97
+ else:
98
+ return inferred
99
+
100
+ def get_property_type(self, default_type: str | None, ctx: FunctionContext) -> str | None:
101
+ return None
102
+
103
+
104
+ class DocstringSignatureGenerator(SignatureGenerator):
105
+ def get_function_sig(
106
+ self, default_sig: FunctionSig, ctx: FunctionContext
107
+ ) -> list[FunctionSig] | None:
108
+ inferred = infer_sig_from_docstring(ctx.docstring, ctx.name)
109
+ if inferred:
110
+ assert ctx.docstring is not None
111
+ if is_pybind11_overloaded_function_docstring(ctx.docstring, ctx.name):
112
+ # Remove pybind11 umbrella (*args, **kwargs) for overloaded functions
113
+ del inferred[-1]
114
+
115
+ if ctx.class_info:
116
+ if not inferred and ctx.name == "__init__":
117
+ # look for class-level constructor signatures of the form <class_name>(<signature>)
118
+ inferred = infer_sig_from_docstring(ctx.class_info.docstring, ctx.class_info.name)
119
+ if inferred:
120
+ inferred = [sig._replace(name="__init__") for sig in inferred]
121
+ return self.remove_self_type(inferred, ctx.class_info.self_var)
122
+ else:
123
+ return inferred
124
+
125
+ def get_property_type(self, default_type: str | None, ctx: FunctionContext) -> str | None:
126
+ """Infer property type from docstring or docstring signature."""
127
+ if ctx.docstring is not None:
128
+ inferred = infer_ret_type_sig_from_anon_docstring(ctx.docstring)
129
+ if inferred:
130
+ return inferred
131
+ inferred = infer_ret_type_sig_from_docstring(ctx.docstring, ctx.name)
132
+ if inferred:
133
+ return inferred
134
+ inferred = infer_prop_type_from_docstring(ctx.docstring)
135
+ return inferred
136
+ else:
137
+ return None
138
+
139
+
140
+ def is_pybind11_overloaded_function_docstring(docstring: str, name: str) -> bool:
141
+ return docstring.startswith(f"{name}(*args, **kwargs)\nOverloaded function.\n\n")
142
+
143
+
144
+ def generate_stub_for_c_module(
145
+ module_name: str,
146
+ target: str,
147
+ known_modules: list[str],
148
+ doc_dir: str = "",
149
+ *,
150
+ include_private: bool = False,
151
+ export_less: bool = False,
152
+ include_docstrings: bool = False,
153
+ ) -> None:
154
+ """Generate stub for C module.
155
+
156
+ Signature generators are called in order until a list of signatures is returned. The order
157
+ is:
158
+ - signatures inferred from .rst documentation (if given)
159
+ - simple runtime introspection (looking for docstrings and attributes
160
+ with simple builtin types)
161
+ - fallback based special method names or "(*args, **kwargs)"
162
+
163
+ If directory for target doesn't exist it will be created. Existing stub
164
+ will be overwritten.
165
+ """
166
+ subdir = os.path.dirname(target)
167
+ if subdir and not os.path.isdir(subdir):
168
+ os.makedirs(subdir)
169
+
170
+ gen = InspectionStubGenerator(
171
+ module_name,
172
+ known_modules,
173
+ doc_dir,
174
+ include_private=include_private,
175
+ export_less=export_less,
176
+ include_docstrings=include_docstrings,
177
+ )
178
+ gen.generate_module()
179
+ output = gen.output()
180
+
181
+ with open(target, "w") as file:
182
+ file.write(output)
183
+
184
+
185
+ class CFunctionStub:
186
+ """
187
+ Class that mimics a C function in order to provide parseable docstrings.
188
+ """
189
+
190
+ def __init__(self, name: str, doc: str, is_abstract: bool = False) -> None:
191
+ self.__name__ = name
192
+ self.__doc__ = doc
193
+ self.__abstractmethod__ = is_abstract
194
+
195
+ @classmethod
196
+ def _from_sig(cls, sig: FunctionSig, is_abstract: bool = False) -> CFunctionStub:
197
+ return CFunctionStub(sig.name, sig.format_sig()[:-4], is_abstract)
198
+
199
+ @classmethod
200
+ def _from_sigs(cls, sigs: list[FunctionSig], is_abstract: bool = False) -> CFunctionStub:
201
+ return CFunctionStub(
202
+ sigs[0].name, "\n".join(sig.format_sig()[:-4] for sig in sigs), is_abstract
203
+ )
204
+
205
+ def __get__(self) -> None:
206
+ """
207
+ This exists to make this object look like a method descriptor and thus
208
+ return true for CStubGenerator.ismethod()
209
+ """
210
+ pass
211
+
212
+
213
+ class InspectionStubGenerator(BaseStubGenerator):
214
+ """Stub generator that does not parse code.
215
+
216
+ Generation is performed by inspecting the module's contents, and thus works
217
+ for highly dynamic modules, pyc files, and C modules (via the CStubGenerator
218
+ subclass).
219
+ """
220
+
221
+ def __init__(
222
+ self,
223
+ module_name: str,
224
+ known_modules: list[str],
225
+ doc_dir: str = "",
226
+ _all_: list[str] | None = None,
227
+ include_private: bool = False,
228
+ export_less: bool = False,
229
+ include_docstrings: bool = False,
230
+ module: ModuleType | None = None,
231
+ ) -> None:
232
+ self.doc_dir = doc_dir
233
+ if module is None:
234
+ self.module = importlib.import_module(module_name)
235
+ else:
236
+ self.module = module
237
+ self.is_c_module = is_c_module(self.module)
238
+ self.known_modules = known_modules
239
+ self.resort_members = self.is_c_module
240
+ super().__init__(_all_, include_private, export_less, include_docstrings)
241
+ self.module_name = module_name
242
+ if self.is_c_module:
243
+ # Add additional implicit imports.
244
+ # C-extensions are given more lattitude since they do not import the typing module.
245
+ self.known_imports.update(
246
+ {
247
+ "typing": [
248
+ "Any",
249
+ "Callable",
250
+ "ClassVar",
251
+ "Dict",
252
+ "Iterable",
253
+ "Iterator",
254
+ "List",
255
+ "NamedTuple",
256
+ "Optional",
257
+ "Tuple",
258
+ "Union",
259
+ ]
260
+ }
261
+ )
262
+
263
+ def get_default_function_sig(self, func: object, ctx: FunctionContext) -> FunctionSig:
264
+ argspec = None
265
+ if not self.is_c_module:
266
+ # Get the full argument specification of the function
267
+ try:
268
+ argspec = inspect.getfullargspec(func)
269
+ except TypeError:
270
+ # some callables cannot be inspected, e.g. functools.partial
271
+ pass
272
+ if argspec is None:
273
+ if ctx.class_info is not None:
274
+ # method:
275
+ return FunctionSig(
276
+ name=ctx.name,
277
+ args=infer_c_method_args(ctx.name, ctx.class_info.self_var),
278
+ ret_type=infer_method_ret_type(ctx.name),
279
+ )
280
+ else:
281
+ # function:
282
+ return FunctionSig(
283
+ name=ctx.name,
284
+ args=[ArgSig(name="*args"), ArgSig(name="**kwargs")],
285
+ ret_type=None,
286
+ )
287
+
288
+ # Extract the function arguments, defaults, and varargs
289
+ args = argspec.args
290
+ defaults = argspec.defaults
291
+ varargs = argspec.varargs
292
+ kwargs = argspec.varkw
293
+ annotations = argspec.annotations
294
+
295
+ def get_annotation(key: str) -> str | None:
296
+ if key not in annotations:
297
+ return None
298
+ argtype = annotations[key]
299
+ if argtype is None:
300
+ return "None"
301
+ if not isinstance(argtype, str):
302
+ return self.get_type_fullname(argtype)
303
+ return argtype
304
+
305
+ arglist: list[ArgSig] = []
306
+ # Add the arguments to the signature
307
+ for i, arg in enumerate(args):
308
+ # Check if the argument has a default value
309
+ if defaults and i >= len(args) - len(defaults):
310
+ default_value = defaults[i - (len(args) - len(defaults))]
311
+ if arg in annotations:
312
+ argtype = annotations[arg]
313
+ else:
314
+ argtype = self.get_type_annotation(default_value)
315
+ if argtype == "None":
316
+ # None is not a useful annotation, but we can infer that the arg
317
+ # is optional
318
+ incomplete = self.add_name("_typeshed.Incomplete")
319
+ argtype = f"{incomplete} | None"
320
+ arglist.append(ArgSig(arg, argtype, default=True))
321
+ else:
322
+ arglist.append(ArgSig(arg, get_annotation(arg), default=False))
323
+
324
+ # Add *args if present
325
+ if varargs:
326
+ arglist.append(ArgSig(f"*{varargs}", get_annotation(varargs)))
327
+
328
+ # Add **kwargs if present
329
+ if kwargs:
330
+ arglist.append(ArgSig(f"**{kwargs}", get_annotation(kwargs)))
331
+
332
+ # add types for known special methods
333
+ if ctx.class_info is not None and all(
334
+ arg.type is None and arg.default is False for arg in arglist
335
+ ):
336
+ new_args = infer_method_arg_types(
337
+ ctx.name, ctx.class_info.self_var, [arg.name for arg in arglist if arg.name]
338
+ )
339
+ if new_args is not None:
340
+ arglist = new_args
341
+
342
+ ret_type = get_annotation("return") or infer_method_ret_type(ctx.name)
343
+ return FunctionSig(ctx.name, arglist, ret_type)
344
+
345
+ def get_sig_generators(self) -> list[SignatureGenerator]:
346
+ if not self.is_c_module:
347
+ return []
348
+ else:
349
+ sig_generators: list[SignatureGenerator] = [DocstringSignatureGenerator()]
350
+ if self.doc_dir:
351
+ # Collect info from docs (if given). Always check these first.
352
+ sig_generators.insert(0, ExternalSignatureGenerator.from_doc_dir(self.doc_dir))
353
+ return sig_generators
354
+
355
+ def strip_or_import(self, type_name: str) -> str:
356
+ """Strips unnecessary module names from typ.
357
+
358
+ If typ represents a type that is inside module or is a type coming from builtins, remove
359
+ module declaration from it. Return stripped name of the type.
360
+
361
+ Arguments:
362
+ typ: name of the type
363
+ """
364
+ local_modules = ["builtins", self.module_name]
365
+ parsed_type = parse_type_comment(type_name, 0, 0, None)[1]
366
+ assert parsed_type is not None, type_name
367
+ return self.print_annotation(parsed_type, self.known_modules, local_modules)
368
+
369
+ def get_obj_module(self, obj: object) -> str | None:
370
+ """Return module name of the object."""
371
+ return getattr(obj, "__module__", None)
372
+
373
+ def is_defined_in_module(self, obj: object) -> bool:
374
+ """Check if object is considered defined in the current module."""
375
+ module = self.get_obj_module(obj)
376
+ return module is None or module == self.module_name
377
+
378
+ def generate_module(self) -> None:
379
+ all_items = self.get_members(self.module)
380
+ if self.resort_members:
381
+ all_items = sorted(all_items, key=lambda x: x[0])
382
+ items = []
383
+ for name, obj in all_items:
384
+ if inspect.ismodule(obj) and obj.__name__ in self.known_modules:
385
+ module_name = obj.__name__
386
+ if module_name.startswith(self.module_name + "."):
387
+ # from {.rel_name} import {mod_name} as {name}
388
+ pkg_name, mod_name = module_name.rsplit(".", 1)
389
+ rel_module = pkg_name[len(self.module_name) :] or "."
390
+ self.import_tracker.add_import_from(rel_module, [(mod_name, name)])
391
+ self.import_tracker.reexport(name)
392
+ else:
393
+ # import {module_name} as {name}
394
+ self.import_tracker.add_import(module_name, name)
395
+ self.import_tracker.reexport(name)
396
+ elif self.is_defined_in_module(obj) and not inspect.ismodule(obj):
397
+ # process this below
398
+ items.append((name, obj))
399
+ else:
400
+ # from {obj_module} import {obj_name}
401
+ obj_module_name = self.get_obj_module(obj)
402
+ if obj_module_name:
403
+ self.import_tracker.add_import_from(obj_module_name, [(name, None)])
404
+ if self.should_reexport(name, obj_module_name, name_is_alias=False):
405
+ self.import_tracker.reexport(name)
406
+
407
+ self.set_defined_names({name for name, obj in all_items if not inspect.ismodule(obj)})
408
+
409
+ if self.resort_members:
410
+ functions: list[str] = []
411
+ types: list[str] = []
412
+ variables: list[str] = []
413
+ else:
414
+ output: list[str] = []
415
+ functions = types = variables = output
416
+
417
+ for name, obj in items:
418
+ if self.is_function(obj):
419
+ self.generate_function_stub(name, obj, output=functions)
420
+ elif inspect.isclass(obj):
421
+ self.generate_class_stub(name, obj, output=types)
422
+ else:
423
+ self.generate_variable_stub(name, obj, output=variables)
424
+
425
+ self._output = []
426
+
427
+ if self.resort_members:
428
+ for line in variables:
429
+ self._output.append(line + "\n")
430
+ for line in types:
431
+ if line.startswith("class") and self._output and self._output[-1]:
432
+ self._output.append("\n")
433
+ self._output.append(line + "\n")
434
+ if self._output and functions:
435
+ self._output.append("\n")
436
+ for line in functions:
437
+ self._output.append(line + "\n")
438
+ else:
439
+ for i, line in enumerate(output):
440
+ if (
441
+ self._output
442
+ and line.startswith("class")
443
+ and (
444
+ not self._output[-1].startswith("class")
445
+ or (len(output) > i + 1 and output[i + 1].startswith(" "))
446
+ )
447
+ ) or (
448
+ self._output
449
+ and self._output[-1].startswith("def")
450
+ and not line.startswith("def")
451
+ ):
452
+ self._output.append("\n")
453
+ self._output.append(line + "\n")
454
+ self.check_undefined_names()
455
+
456
+ def is_skipped_attribute(self, attr: str) -> bool:
457
+ return (
458
+ attr
459
+ in (
460
+ "__class__",
461
+ "__getattribute__",
462
+ "__str__",
463
+ "__repr__",
464
+ "__doc__",
465
+ "__dict__",
466
+ "__module__",
467
+ "__weakref__",
468
+ "__annotations__",
469
+ )
470
+ or attr in self.IGNORED_DUNDERS
471
+ or is_pybind_skipped_attribute(attr) # For pickling
472
+ or keyword.iskeyword(attr)
473
+ )
474
+
475
+ def get_members(self, obj: object) -> list[tuple[str, Any]]:
476
+ obj_dict: Mapping[str, Any] = getattr(obj, "__dict__") # noqa: B009
477
+ results = []
478
+ for name in obj_dict:
479
+ if self.is_skipped_attribute(name):
480
+ continue
481
+ # Try to get the value via getattr
482
+ try:
483
+ value = getattr(obj, name)
484
+ except AttributeError:
485
+ continue
486
+ else:
487
+ results.append((name, value))
488
+ return results
489
+
490
+ def get_type_annotation(self, obj: object) -> str:
491
+ """
492
+ Given an instance, return a string representation of its type that is valid
493
+ to use as a type annotation.
494
+ """
495
+ if obj is None or obj is type(None):
496
+ return "None"
497
+ elif inspect.isclass(obj):
498
+ return "type[{}]".format(self.get_type_fullname(obj))
499
+ elif isinstance(obj, FunctionType):
500
+ return self.add_name("typing.Callable")
501
+ elif isinstance(obj, ModuleType):
502
+ return self.add_name("types.ModuleType", require=False)
503
+ else:
504
+ return self.get_type_fullname(type(obj))
505
+
506
+ def is_function(self, obj: object) -> bool:
507
+ if self.is_c_module:
508
+ return inspect.isbuiltin(obj)
509
+ else:
510
+ return inspect.isfunction(obj)
511
+
512
+ def is_method(self, class_info: ClassInfo, name: str, obj: object) -> bool:
513
+ if self.is_c_module:
514
+ return inspect.ismethoddescriptor(obj) or type(obj) in (
515
+ type(str.index),
516
+ type(str.__add__),
517
+ type(str.__new__),
518
+ )
519
+ else:
520
+ # this is valid because it is only called on members of a class
521
+ return inspect.isfunction(obj)
522
+
523
+ def is_classmethod(self, class_info: ClassInfo, name: str, obj: object) -> bool:
524
+ if self.is_c_module:
525
+ return inspect.isbuiltin(obj) or type(obj).__name__ in (
526
+ "classmethod",
527
+ "classmethod_descriptor",
528
+ )
529
+ else:
530
+ return inspect.ismethod(obj)
531
+
532
+ def is_staticmethod(self, class_info: ClassInfo | None, name: str, obj: object) -> bool:
533
+ if class_info is None:
534
+ return False
535
+ elif self.is_c_module:
536
+ raw_lookup: Mapping[str, Any] = getattr(class_info.cls, "__dict__") # noqa: B009
537
+ raw_value = raw_lookup.get(name, obj)
538
+ return isinstance(raw_value, staticmethod)
539
+ else:
540
+ return isinstance(inspect.getattr_static(class_info.cls, name), staticmethod)
541
+
542
+ @staticmethod
543
+ def is_abstract_method(obj: object) -> bool:
544
+ return getattr(obj, "__abstractmethod__", False)
545
+
546
+ @staticmethod
547
+ def is_property(class_info: ClassInfo, name: str, obj: object) -> bool:
548
+ return inspect.isdatadescriptor(obj) or hasattr(obj, "fget")
549
+
550
+ @staticmethod
551
+ def is_property_readonly(prop: Any) -> bool:
552
+ return hasattr(prop, "fset") and prop.fset is None
553
+
554
+ def is_static_property(self, obj: object) -> bool:
555
+ """For c-modules, whether the property behaves like an attribute"""
556
+ if self.is_c_module:
557
+ # StaticProperty is from boost-python
558
+ return type(obj).__name__ in ("pybind11_static_property", "StaticProperty")
559
+ else:
560
+ return False
561
+
562
+ def process_inferred_sigs(self, inferred: list[FunctionSig]) -> None:
563
+ for i, sig in enumerate(inferred):
564
+ for arg in sig.args:
565
+ if arg.type is not None:
566
+ arg.type = self.strip_or_import(arg.type)
567
+ if sig.ret_type is not None:
568
+ inferred[i] = sig._replace(ret_type=self.strip_or_import(sig.ret_type))
569
+
570
+ def generate_function_stub(
571
+ self, name: str, obj: object, *, output: list[str], class_info: ClassInfo | None = None
572
+ ) -> None:
573
+ """Generate stub for a single function or method.
574
+
575
+ The result (always a single line) will be appended to 'output'.
576
+ If necessary, any required names will be added to 'imports'.
577
+ The 'class_name' is used to find signature of __init__ or __new__ in
578
+ 'class_sigs'.
579
+ """
580
+ docstring: Any = getattr(obj, "__doc__", None)
581
+ if not isinstance(docstring, str):
582
+ docstring = None
583
+
584
+ ctx = FunctionContext(
585
+ self.module_name,
586
+ name,
587
+ docstring=docstring,
588
+ is_abstract=self.is_abstract_method(obj),
589
+ class_info=class_info,
590
+ )
591
+ if self.is_private_name(name, ctx.fullname) or self.is_not_in_all(name):
592
+ return
593
+
594
+ self.record_name(ctx.name)
595
+ default_sig = self.get_default_function_sig(obj, ctx)
596
+ inferred = self.get_signatures(default_sig, self.sig_generators, ctx)
597
+ self.process_inferred_sigs(inferred)
598
+
599
+ decorators = []
600
+ if len(inferred) > 1:
601
+ decorators.append("@{}".format(self.add_name("typing.overload")))
602
+
603
+ if ctx.is_abstract:
604
+ decorators.append("@{}".format(self.add_name("abc.abstractmethod")))
605
+
606
+ if class_info is not None:
607
+ if self.is_staticmethod(class_info, name, obj):
608
+ decorators.append("@staticmethod")
609
+ else:
610
+ for sig in inferred:
611
+ if not sig.args or sig.args[0].name not in ("self", "cls"):
612
+ sig.args.insert(0, ArgSig(name=class_info.self_var))
613
+ # a sig generator indicates @classmethod by specifying the cls arg.
614
+ if inferred[0].args and inferred[0].args[0].name == "cls":
615
+ decorators.append("@classmethod")
616
+
617
+ if docstring:
618
+ docstring = self._indent_docstring(docstring)
619
+ output.extend(self.format_func_def(inferred, decorators=decorators, docstring=docstring))
620
+ self._fix_iter(ctx, inferred, output)
621
+
622
+ def _indent_docstring(self, docstring: str) -> str:
623
+ """Fix indentation of docstring extracted from pybind11 or other binding generators."""
624
+ lines = docstring.splitlines(keepends=True)
625
+ indent = self._indent + " "
626
+ if len(lines) > 1:
627
+ if not all(line.startswith(indent) or not line.strip() for line in lines):
628
+ # if the docstring is not indented, then indent all but the first line
629
+ for i, line in enumerate(lines[1:]):
630
+ if line.strip():
631
+ lines[i + 1] = indent + line
632
+ # if there's a trailing newline, add a final line to visually indent the quoted docstring
633
+ if lines[-1].endswith("\n"):
634
+ if len(lines) > 1:
635
+ lines.append(indent)
636
+ else:
637
+ lines[-1] = lines[-1][:-1]
638
+ return "".join(lines)
639
+
640
+ def _fix_iter(
641
+ self, ctx: FunctionContext, inferred: list[FunctionSig], output: list[str]
642
+ ) -> None:
643
+ """Ensure that objects which implement old-style iteration via __getitem__
644
+ are considered iterable.
645
+ """
646
+ if (
647
+ ctx.class_info
648
+ and ctx.class_info.cls is not None
649
+ and ctx.name == "__getitem__"
650
+ and "__iter__" not in ctx.class_info.cls.__dict__
651
+ ):
652
+ item_type: str | None = None
653
+ for sig in inferred:
654
+ if sig.args and sig.args[-1].type == "int":
655
+ item_type = sig.ret_type
656
+ break
657
+ if item_type is None:
658
+ return
659
+ obj = CFunctionStub(
660
+ "__iter__", f"def __iter__(self) -> typing.Iterator[{item_type}]\n"
661
+ )
662
+ self.generate_function_stub("__iter__", obj, output=output, class_info=ctx.class_info)
663
+
664
+ def generate_property_stub(
665
+ self,
666
+ name: str,
667
+ raw_obj: object,
668
+ obj: object,
669
+ static_properties: list[str],
670
+ rw_properties: list[str],
671
+ ro_properties: list[str],
672
+ class_info: ClassInfo | None = None,
673
+ ) -> None:
674
+ """Generate property stub using introspection of 'obj'.
675
+
676
+ Try to infer type from docstring, append resulting lines to 'output'.
677
+
678
+ raw_obj : object before evaluation of descriptor (if any)
679
+ obj : object after evaluation of descriptor
680
+ """
681
+
682
+ docstring = getattr(raw_obj, "__doc__", None)
683
+ fget = getattr(raw_obj, "fget", None)
684
+ if fget:
685
+ alt_docstr = getattr(fget, "__doc__", None)
686
+ if alt_docstr and docstring:
687
+ docstring += "\n" + alt_docstr
688
+ elif alt_docstr:
689
+ docstring = alt_docstr
690
+
691
+ ctx = FunctionContext(
692
+ self.module_name, name, docstring=docstring, is_abstract=False, class_info=class_info
693
+ )
694
+
695
+ if self.is_private_name(name, ctx.fullname) or self.is_not_in_all(name):
696
+ return
697
+
698
+ self.record_name(ctx.name)
699
+ static = self.is_static_property(raw_obj)
700
+ readonly = self.is_property_readonly(raw_obj)
701
+ if static:
702
+ ret_type: str | None = self.strip_or_import(self.get_type_annotation(obj))
703
+ else:
704
+ default_sig = self.get_default_function_sig(raw_obj, ctx)
705
+ ret_type = default_sig.ret_type
706
+
707
+ inferred_type = self.get_property_type(ret_type, self.sig_generators, ctx)
708
+ if inferred_type is not None:
709
+ inferred_type = self.strip_or_import(inferred_type)
710
+
711
+ if static:
712
+ classvar = self.add_name("typing.ClassVar")
713
+ trailing_comment = " # read-only" if readonly else ""
714
+ if inferred_type is None:
715
+ inferred_type = self.add_name("_typeshed.Incomplete")
716
+
717
+ static_properties.append(
718
+ f"{self._indent}{name}: {classvar}[{inferred_type}] = ...{trailing_comment}"
719
+ )
720
+ else: # regular property
721
+ if readonly:
722
+ ro_properties.append(f"{self._indent}@property")
723
+ sig = FunctionSig(name, [ArgSig("self")], inferred_type)
724
+ ro_properties.append(sig.format_sig(indent=self._indent))
725
+ else:
726
+ if inferred_type is None:
727
+ inferred_type = self.add_name("_typeshed.Incomplete")
728
+
729
+ rw_properties.append(f"{self._indent}{name}: {inferred_type}")
730
+
731
+ def get_type_fullname(self, typ: type) -> str:
732
+ """Given a type, return a string representation"""
733
+ if typ is Any:
734
+ return "Any"
735
+ typename = getattr(typ, "__qualname__", typ.__name__)
736
+ module_name = self.get_obj_module(typ)
737
+ assert module_name is not None, typ
738
+ if module_name != "builtins":
739
+ typename = f"{module_name}.{typename}"
740
+ return typename
741
+
742
+ def get_base_types(self, obj: type) -> list[str]:
743
+ all_bases = type.mro(obj)
744
+ if all_bases[-1] is object:
745
+ # TODO: Is this always object?
746
+ del all_bases[-1]
747
+ # remove pybind11_object. All classes generated by pybind11 have pybind11_object in their MRO,
748
+ # which only overrides a few functions in object type
749
+ if all_bases and all_bases[-1].__name__ == "pybind11_object":
750
+ del all_bases[-1]
751
+ # remove the class itself
752
+ all_bases = all_bases[1:]
753
+ # Remove base classes of other bases as redundant.
754
+ bases: list[type] = []
755
+ for base in all_bases:
756
+ if not any(issubclass(b, base) for b in bases):
757
+ bases.append(base)
758
+ return [self.strip_or_import(self.get_type_fullname(base)) for base in bases]
759
+
760
+ def generate_class_stub(self, class_name: str, cls: type, output: list[str]) -> None:
761
+ """Generate stub for a single class using runtime introspection.
762
+
763
+ The result lines will be appended to 'output'. If necessary, any
764
+ required names will be added to 'imports'.
765
+ """
766
+ raw_lookup: Mapping[str, Any] = getattr(cls, "__dict__") # noqa: B009
767
+ items = self.get_members(cls)
768
+ if self.resort_members:
769
+ items = sorted(items, key=lambda x: method_name_sort_key(x[0]))
770
+ names = {x[0] for x in items}
771
+ methods: list[str] = []
772
+ types: list[str] = []
773
+ static_properties: list[str] = []
774
+ rw_properties: list[str] = []
775
+ ro_properties: list[str] = []
776
+ attrs: list[tuple[str, Any]] = []
777
+
778
+ self.record_name(class_name)
779
+ self.indent()
780
+
781
+ class_info = ClassInfo(class_name, "", getattr(cls, "__doc__", None), cls)
782
+
783
+ for attr, value in items:
784
+ # use unevaluated descriptors when dealing with property inspection
785
+ raw_value = raw_lookup.get(attr, value)
786
+ if self.is_method(class_info, attr, value) or self.is_classmethod(
787
+ class_info, attr, value
788
+ ):
789
+ if attr == "__new__":
790
+ # TODO: We should support __new__.
791
+ if "__init__" in names:
792
+ # Avoid duplicate functions if both are present.
793
+ # But is there any case where .__new__() has a
794
+ # better signature than __init__() ?
795
+ continue
796
+ attr = "__init__"
797
+ # FIXME: make this nicer
798
+ if self.is_staticmethod(class_info, attr, value):
799
+ class_info.self_var = ""
800
+ elif self.is_classmethod(class_info, attr, value):
801
+ class_info.self_var = "cls"
802
+ else:
803
+ class_info.self_var = "self"
804
+ self.generate_function_stub(attr, value, output=methods, class_info=class_info)
805
+ elif self.is_property(class_info, attr, raw_value):
806
+ self.generate_property_stub(
807
+ attr,
808
+ raw_value,
809
+ value,
810
+ static_properties,
811
+ rw_properties,
812
+ ro_properties,
813
+ class_info,
814
+ )
815
+ elif inspect.isclass(value) and self.is_defined_in_module(value):
816
+ self.generate_class_stub(attr, value, types)
817
+ else:
818
+ attrs.append((attr, value))
819
+
820
+ for attr, value in attrs:
821
+ if attr == "__hash__" and value is None:
822
+ # special case for __hash__
823
+ continue
824
+ prop_type_name = self.strip_or_import(self.get_type_annotation(value))
825
+ classvar = self.add_name("typing.ClassVar")
826
+ static_properties.append(f"{self._indent}{attr}: {classvar}[{prop_type_name}] = ...")
827
+
828
+ self.dedent()
829
+
830
+ bases = self.get_base_types(cls)
831
+ if bases:
832
+ bases_str = "(%s)" % ", ".join(bases)
833
+ else:
834
+ bases_str = ""
835
+ if types or static_properties or rw_properties or methods or ro_properties:
836
+ output.append(f"{self._indent}class {class_name}{bases_str}:")
837
+ for line in types:
838
+ if (
839
+ output
840
+ and output[-1]
841
+ and not output[-1].strip().startswith("class")
842
+ and line.strip().startswith("class")
843
+ ):
844
+ output.append("")
845
+ output.append(line)
846
+ for line in static_properties:
847
+ output.append(line)
848
+ for line in rw_properties:
849
+ output.append(line)
850
+ for line in methods:
851
+ output.append(line)
852
+ for line in ro_properties:
853
+ output.append(line)
854
+ else:
855
+ output.append(f"{self._indent}class {class_name}{bases_str}: ...")
856
+
857
+ def generate_variable_stub(self, name: str, obj: object, output: list[str]) -> None:
858
+ """Generate stub for a single variable using runtime introspection.
859
+
860
+ The result lines will be appended to 'output'. If necessary, any
861
+ required names will be added to 'imports'.
862
+ """
863
+ if self.is_private_name(name, f"{self.module_name}.{name}") or self.is_not_in_all(name):
864
+ return
865
+ self.record_name(name)
866
+ type_str = self.strip_or_import(self.get_type_annotation(obj))
867
+ output.append(f"{name}: {type_str}")
868
+
869
+
870
+ def method_name_sort_key(name: str) -> tuple[int, str]:
871
+ """Sort methods in classes in a typical order.
872
+
873
+ I.e.: constructor, normal methods, special methods.
874
+ """
875
+ if name in ("__new__", "__init__"):
876
+ return 0, name
877
+ if name.startswith("__") and name.endswith("__"):
878
+ return 2, name
879
+ return 1, name
880
+
881
+
882
+ def is_pybind_skipped_attribute(attr: str) -> bool:
883
+ return attr.startswith("__pybind11_module_local_")
884
+
885
+
886
+ def infer_c_method_args(
887
+ name: str, self_var: str = "self", arg_names: list[str] | None = None
888
+ ) -> list[ArgSig]:
889
+ args: list[ArgSig] | None = None
890
+ if name.startswith("__") and name.endswith("__"):
891
+ name = name[2:-2]
892
+ if name in (
893
+ "hash",
894
+ "iter",
895
+ "next",
896
+ "sizeof",
897
+ "copy",
898
+ "deepcopy",
899
+ "reduce",
900
+ "getinitargs",
901
+ "int",
902
+ "float",
903
+ "trunc",
904
+ "complex",
905
+ "bool",
906
+ "abs",
907
+ "bytes",
908
+ "dir",
909
+ "len",
910
+ "reversed",
911
+ "round",
912
+ "index",
913
+ "enter",
914
+ ):
915
+ args = []
916
+ elif name == "getitem":
917
+ args = [ArgSig(name="index")]
918
+ elif name == "setitem":
919
+ args = [ArgSig(name="index"), ArgSig(name="object")]
920
+ elif name in ("delattr", "getattr"):
921
+ args = [ArgSig(name="name")]
922
+ elif name == "setattr":
923
+ args = [ArgSig(name="name"), ArgSig(name="value")]
924
+ elif name == "getstate":
925
+ args = []
926
+ elif name == "setstate":
927
+ args = [ArgSig(name="state")]
928
+ elif name in ("eq", "ne", "lt", "le", "gt", "ge"):
929
+ args = [ArgSig(name="other", type="object")]
930
+ elif name in (
931
+ "add",
932
+ "radd",
933
+ "sub",
934
+ "rsub",
935
+ "mul",
936
+ "rmul",
937
+ "mod",
938
+ "rmod",
939
+ "floordiv",
940
+ "rfloordiv",
941
+ "truediv",
942
+ "rtruediv",
943
+ "divmod",
944
+ "rdivmod",
945
+ "pow",
946
+ "rpow",
947
+ "xor",
948
+ "rxor",
949
+ "or",
950
+ "ror",
951
+ "and",
952
+ "rand",
953
+ "lshift",
954
+ "rlshift",
955
+ "rshift",
956
+ "rrshift",
957
+ "contains",
958
+ "delitem",
959
+ "iadd",
960
+ "iand",
961
+ "ifloordiv",
962
+ "ilshift",
963
+ "imod",
964
+ "imul",
965
+ "ior",
966
+ "ipow",
967
+ "irshift",
968
+ "isub",
969
+ "itruediv",
970
+ "ixor",
971
+ ):
972
+ args = [ArgSig(name="other")]
973
+ elif name in ("neg", "pos", "invert"):
974
+ args = []
975
+ elif name == "get":
976
+ args = [ArgSig(name="instance"), ArgSig(name="owner")]
977
+ elif name == "set":
978
+ args = [ArgSig(name="instance"), ArgSig(name="value")]
979
+ elif name == "reduce_ex":
980
+ args = [ArgSig(name="protocol")]
981
+ elif name == "exit":
982
+ args = [
983
+ ArgSig(name="type", type="type[BaseException] | None"),
984
+ ArgSig(name="value", type="BaseException | None"),
985
+ ArgSig(name="traceback", type="types.TracebackType | None"),
986
+ ]
987
+ if args is None:
988
+ args = infer_method_arg_types(name, self_var, arg_names)
989
+ else:
990
+ args = [ArgSig(name=self_var)] + args
991
+ if args is None:
992
+ args = [ArgSig(name="*args"), ArgSig(name="**kwargs")]
993
+ return args