@rowstile/cli-win32-x64 0.1.0-alpha.2

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 (759) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +5 -0
  3. package/package.json +23 -0
  4. package/python/DLLs/_asyncio.pyd +0 -0
  5. package/python/DLLs/_bz2.pyd +0 -0
  6. package/python/DLLs/_ctypes.pyd +0 -0
  7. package/python/DLLs/_ctypes_test.pyd +0 -0
  8. package/python/DLLs/_decimal.pyd +0 -0
  9. package/python/DLLs/_elementtree.pyd +0 -0
  10. package/python/DLLs/_hashlib.pyd +0 -0
  11. package/python/DLLs/_lzma.pyd +0 -0
  12. package/python/DLLs/_multiprocessing.pyd +0 -0
  13. package/python/DLLs/_overlapped.pyd +0 -0
  14. package/python/DLLs/_queue.pyd +0 -0
  15. package/python/DLLs/_socket.pyd +0 -0
  16. package/python/DLLs/_sqlite3.pyd +0 -0
  17. package/python/DLLs/_ssl.pyd +0 -0
  18. package/python/DLLs/_testbuffer.pyd +0 -0
  19. package/python/DLLs/_testcapi.pyd +0 -0
  20. package/python/DLLs/_testclinic.pyd +0 -0
  21. package/python/DLLs/_testclinic_limited.pyd +0 -0
  22. package/python/DLLs/_testconsole.pyd +0 -0
  23. package/python/DLLs/_testimportmultiple.pyd +0 -0
  24. package/python/DLLs/_testinternalcapi.pyd +0 -0
  25. package/python/DLLs/_testlimitedcapi.pyd +0 -0
  26. package/python/DLLs/_testmultiphase.pyd +0 -0
  27. package/python/DLLs/_testsinglephase.pyd +0 -0
  28. package/python/DLLs/_uuid.pyd +0 -0
  29. package/python/DLLs/_wmi.pyd +0 -0
  30. package/python/DLLs/_zoneinfo.pyd +0 -0
  31. package/python/DLLs/libcrypto-3-x64.dll +0 -0
  32. package/python/DLLs/libffi-8.dll +0 -0
  33. package/python/DLLs/libssl-3-x64.dll +0 -0
  34. package/python/DLLs/pyexpat.pyd +0 -0
  35. package/python/DLLs/select.pyd +0 -0
  36. package/python/DLLs/sqlite3.dll +0 -0
  37. package/python/DLLs/unicodedata.pyd +0 -0
  38. package/python/DLLs/winsound.pyd +0 -0
  39. package/python/DLLs/zlib1.dll +0 -0
  40. package/python/LICENSE.txt +445 -0
  41. package/python/Lib/__future__.py +147 -0
  42. package/python/Lib/__hello__.py +16 -0
  43. package/python/Lib/__pycache__/__future__.cpython-313.pyc +0 -0
  44. package/python/Lib/__pycache__/_colorize.cpython-313.pyc +0 -0
  45. package/python/Lib/__pycache__/_compat_pickle.cpython-313.pyc +0 -0
  46. package/python/Lib/__pycache__/_compression.cpython-313.pyc +0 -0
  47. package/python/Lib/__pycache__/_markupbase.cpython-313.pyc +0 -0
  48. package/python/Lib/__pycache__/_opcode_metadata.cpython-313.pyc +0 -0
  49. package/python/Lib/__pycache__/_weakrefset.cpython-313.pyc +0 -0
  50. package/python/Lib/__pycache__/ast.cpython-313.pyc +0 -0
  51. package/python/Lib/__pycache__/base64.cpython-313.pyc +0 -0
  52. package/python/Lib/__pycache__/bisect.cpython-313.pyc +0 -0
  53. package/python/Lib/__pycache__/bz2.cpython-313.pyc +0 -0
  54. package/python/Lib/__pycache__/calendar.cpython-313.pyc +0 -0
  55. package/python/Lib/__pycache__/colorsys.cpython-313.pyc +0 -0
  56. package/python/Lib/__pycache__/compileall.cpython-313.pyc +0 -0
  57. package/python/Lib/__pycache__/configparser.cpython-313.pyc +0 -0
  58. package/python/Lib/__pycache__/contextlib.cpython-313.pyc +0 -0
  59. package/python/Lib/__pycache__/copy.cpython-313.pyc +0 -0
  60. package/python/Lib/__pycache__/copyreg.cpython-313.pyc +0 -0
  61. package/python/Lib/__pycache__/csv.cpython-313.pyc +0 -0
  62. package/python/Lib/__pycache__/dataclasses.cpython-313.pyc +0 -0
  63. package/python/Lib/__pycache__/datetime.cpython-313.pyc +0 -0
  64. package/python/Lib/__pycache__/decimal.cpython-313.pyc +0 -0
  65. package/python/Lib/__pycache__/dis.cpython-313.pyc +0 -0
  66. package/python/Lib/__pycache__/enum.cpython-313.pyc +0 -0
  67. package/python/Lib/__pycache__/filecmp.cpython-313.pyc +0 -0
  68. package/python/Lib/__pycache__/fnmatch.cpython-313.pyc +0 -0
  69. package/python/Lib/__pycache__/fractions.cpython-313.pyc +0 -0
  70. package/python/Lib/__pycache__/functools.cpython-313.pyc +0 -0
  71. package/python/Lib/__pycache__/getpass.cpython-313.pyc +0 -0
  72. package/python/Lib/__pycache__/gettext.cpython-313.pyc +0 -0
  73. package/python/Lib/__pycache__/glob.cpython-313.pyc +0 -0
  74. package/python/Lib/__pycache__/gzip.cpython-313.pyc +0 -0
  75. package/python/Lib/__pycache__/hashlib.cpython-313.pyc +0 -0
  76. package/python/Lib/__pycache__/heapq.cpython-313.pyc +0 -0
  77. package/python/Lib/__pycache__/hmac.cpython-313.pyc +0 -0
  78. package/python/Lib/__pycache__/inspect.cpython-313.pyc +0 -0
  79. package/python/Lib/__pycache__/ipaddress.cpython-313.pyc +0 -0
  80. package/python/Lib/__pycache__/keyword.cpython-313.pyc +0 -0
  81. package/python/Lib/__pycache__/linecache.cpython-313.pyc +0 -0
  82. package/python/Lib/__pycache__/locale.cpython-313.pyc +0 -0
  83. package/python/Lib/__pycache__/lzma.cpython-313.pyc +0 -0
  84. package/python/Lib/__pycache__/mimetypes.cpython-313.pyc +0 -0
  85. package/python/Lib/__pycache__/nturl2path.cpython-313.pyc +0 -0
  86. package/python/Lib/__pycache__/numbers.cpython-313.pyc +0 -0
  87. package/python/Lib/__pycache__/opcode.cpython-313.pyc +0 -0
  88. package/python/Lib/__pycache__/operator.cpython-313.pyc +0 -0
  89. package/python/Lib/__pycache__/optparse.cpython-313.pyc +0 -0
  90. package/python/Lib/__pycache__/pickle.cpython-313.pyc +0 -0
  91. package/python/Lib/__pycache__/pkgutil.cpython-313.pyc +0 -0
  92. package/python/Lib/__pycache__/platform.cpython-313.pyc +0 -0
  93. package/python/Lib/__pycache__/py_compile.cpython-313.pyc +0 -0
  94. package/python/Lib/__pycache__/queue.cpython-313.pyc +0 -0
  95. package/python/Lib/__pycache__/quopri.cpython-313.pyc +0 -0
  96. package/python/Lib/__pycache__/random.cpython-313.pyc +0 -0
  97. package/python/Lib/__pycache__/reprlib.cpython-313.pyc +0 -0
  98. package/python/Lib/__pycache__/selectors.cpython-313.pyc +0 -0
  99. package/python/Lib/__pycache__/shlex.cpython-313.pyc +0 -0
  100. package/python/Lib/__pycache__/shutil.cpython-313.pyc +0 -0
  101. package/python/Lib/__pycache__/signal.cpython-313.pyc +0 -0
  102. package/python/Lib/__pycache__/socket.cpython-313.pyc +0 -0
  103. package/python/Lib/__pycache__/socketserver.cpython-313.pyc +0 -0
  104. package/python/Lib/__pycache__/ssl.cpython-313.pyc +0 -0
  105. package/python/Lib/__pycache__/string.cpython-313.pyc +0 -0
  106. package/python/Lib/__pycache__/stringprep.cpython-313.pyc +0 -0
  107. package/python/Lib/__pycache__/struct.cpython-313.pyc +0 -0
  108. package/python/Lib/__pycache__/subprocess.cpython-313.pyc +0 -0
  109. package/python/Lib/__pycache__/tarfile.cpython-313.pyc +0 -0
  110. package/python/Lib/__pycache__/tempfile.cpython-313.pyc +0 -0
  111. package/python/Lib/__pycache__/textwrap.cpython-313.pyc +0 -0
  112. package/python/Lib/__pycache__/threading.cpython-313.pyc +0 -0
  113. package/python/Lib/__pycache__/token.cpython-313.pyc +0 -0
  114. package/python/Lib/__pycache__/tokenize.cpython-313.pyc +0 -0
  115. package/python/Lib/__pycache__/traceback.cpython-313.pyc +0 -0
  116. package/python/Lib/__pycache__/types.cpython-313.pyc +0 -0
  117. package/python/Lib/__pycache__/typing.cpython-313.pyc +0 -0
  118. package/python/Lib/__pycache__/uuid.cpython-313.pyc +0 -0
  119. package/python/Lib/__pycache__/warnings.cpython-313.pyc +0 -0
  120. package/python/Lib/__pycache__/weakref.cpython-313.pyc +0 -0
  121. package/python/Lib/_aix_support.py +108 -0
  122. package/python/Lib/_android_support.py +192 -0
  123. package/python/Lib/_apple_support.py +66 -0
  124. package/python/Lib/_collections_abc.py +1187 -0
  125. package/python/Lib/_colorize.py +119 -0
  126. package/python/Lib/_compat_pickle.py +251 -0
  127. package/python/Lib/_compression.py +162 -0
  128. package/python/Lib/_ios_support.py +71 -0
  129. package/python/Lib/_markupbase.py +396 -0
  130. package/python/Lib/_opcode_metadata.py +343 -0
  131. package/python/Lib/_osx_support.py +579 -0
  132. package/python/Lib/_py_abc.py +147 -0
  133. package/python/Lib/_pydatetime.py +2640 -0
  134. package/python/Lib/_pydecimal.py +6356 -0
  135. package/python/Lib/_pyio.py +2714 -0
  136. package/python/Lib/_pylong.py +363 -0
  137. package/python/Lib/_pyrepl/__init__.py +19 -0
  138. package/python/Lib/_pyrepl/__main__.py +10 -0
  139. package/python/Lib/_pyrepl/_minimal_curses.py +68 -0
  140. package/python/Lib/_pyrepl/_threading_handler.py +74 -0
  141. package/python/Lib/_pyrepl/base_eventqueue.py +110 -0
  142. package/python/Lib/_pyrepl/commands.py +492 -0
  143. package/python/Lib/_pyrepl/completing_reader.py +295 -0
  144. package/python/Lib/_pyrepl/console.py +229 -0
  145. package/python/Lib/_pyrepl/curses.py +33 -0
  146. package/python/Lib/_pyrepl/fancy_termios.py +82 -0
  147. package/python/Lib/_pyrepl/historical_reader.py +419 -0
  148. package/python/Lib/_pyrepl/input.py +114 -0
  149. package/python/Lib/_pyrepl/keymap.py +213 -0
  150. package/python/Lib/_pyrepl/main.py +59 -0
  151. package/python/Lib/_pyrepl/mypy.ini +29 -0
  152. package/python/Lib/_pyrepl/pager.py +175 -0
  153. package/python/Lib/_pyrepl/reader.py +764 -0
  154. package/python/Lib/_pyrepl/readline.py +599 -0
  155. package/python/Lib/_pyrepl/simple_interact.py +180 -0
  156. package/python/Lib/_pyrepl/trace.py +21 -0
  157. package/python/Lib/_pyrepl/types.py +10 -0
  158. package/python/Lib/_pyrepl/unix_console.py +852 -0
  159. package/python/Lib/_pyrepl/unix_eventqueue.py +76 -0
  160. package/python/Lib/_pyrepl/utils.py +83 -0
  161. package/python/Lib/_pyrepl/windows_console.py +687 -0
  162. package/python/Lib/_pyrepl/windows_eventqueue.py +42 -0
  163. package/python/Lib/_sitebuiltins.py +91 -0
  164. package/python/Lib/_strptime.py +800 -0
  165. package/python/Lib/_threading_local.py +120 -0
  166. package/python/Lib/_weakrefset.py +205 -0
  167. package/python/Lib/abc.py +188 -0
  168. package/python/Lib/antigravity.py +17 -0
  169. package/python/Lib/argparse.py +2690 -0
  170. package/python/Lib/ast.py +1865 -0
  171. package/python/Lib/asyncio/__init__.py +47 -0
  172. package/python/Lib/asyncio/__main__.py +211 -0
  173. package/python/Lib/asyncio/base_events.py +2086 -0
  174. package/python/Lib/asyncio/base_futures.py +67 -0
  175. package/python/Lib/asyncio/base_subprocess.py +312 -0
  176. package/python/Lib/asyncio/base_tasks.py +94 -0
  177. package/python/Lib/asyncio/constants.py +41 -0
  178. package/python/Lib/asyncio/coroutines.py +109 -0
  179. package/python/Lib/asyncio/events.py +885 -0
  180. package/python/Lib/asyncio/exceptions.py +62 -0
  181. package/python/Lib/asyncio/format_helpers.py +84 -0
  182. package/python/Lib/asyncio/futures.py +425 -0
  183. package/python/Lib/asyncio/locks.py +617 -0
  184. package/python/Lib/asyncio/log.py +7 -0
  185. package/python/Lib/asyncio/mixins.py +21 -0
  186. package/python/Lib/asyncio/proactor_events.py +891 -0
  187. package/python/Lib/asyncio/protocols.py +216 -0
  188. package/python/Lib/asyncio/queues.py +309 -0
  189. package/python/Lib/asyncio/runners.py +217 -0
  190. package/python/Lib/asyncio/selector_events.py +1328 -0
  191. package/python/Lib/asyncio/sslproto.py +929 -0
  192. package/python/Lib/asyncio/staggered.py +174 -0
  193. package/python/Lib/asyncio/streams.py +787 -0
  194. package/python/Lib/asyncio/subprocess.py +229 -0
  195. package/python/Lib/asyncio/taskgroups.py +278 -0
  196. package/python/Lib/asyncio/tasks.py +1121 -0
  197. package/python/Lib/asyncio/threads.py +26 -0
  198. package/python/Lib/asyncio/timeouts.py +185 -0
  199. package/python/Lib/asyncio/transports.py +337 -0
  200. package/python/Lib/asyncio/trsock.py +98 -0
  201. package/python/Lib/asyncio/unix_events.py +1550 -0
  202. package/python/Lib/asyncio/windows_events.py +906 -0
  203. package/python/Lib/asyncio/windows_utils.py +181 -0
  204. package/python/Lib/base64.py +628 -0
  205. package/python/Lib/bdb.py +973 -0
  206. package/python/Lib/bisect.py +118 -0
  207. package/python/Lib/bz2.py +352 -0
  208. package/python/Lib/cProfile.py +197 -0
  209. package/python/Lib/calendar.py +813 -0
  210. package/python/Lib/cmd.py +409 -0
  211. package/python/Lib/code.py +386 -0
  212. package/python/Lib/codecs.py +1132 -0
  213. package/python/Lib/codeop.py +155 -0
  214. package/python/Lib/collections/__init__.py +1603 -0
  215. package/python/Lib/collections/__pycache__/__init__.cpython-313.pyc +0 -0
  216. package/python/Lib/colorsys.py +166 -0
  217. package/python/Lib/compileall.py +470 -0
  218. package/python/Lib/concurrent/__init__.py +1 -0
  219. package/python/Lib/concurrent/futures/__init__.py +54 -0
  220. package/python/Lib/concurrent/futures/_base.py +660 -0
  221. package/python/Lib/concurrent/futures/process.py +892 -0
  222. package/python/Lib/concurrent/futures/thread.py +240 -0
  223. package/python/Lib/configparser.py +1396 -0
  224. package/python/Lib/contextlib.py +814 -0
  225. package/python/Lib/contextvars.py +4 -0
  226. package/python/Lib/copy.py +306 -0
  227. package/python/Lib/copyreg.py +217 -0
  228. package/python/Lib/csv.py +527 -0
  229. package/python/Lib/ctypes/__init__.py +602 -0
  230. package/python/Lib/ctypes/__pycache__/__init__.cpython-313.pyc +0 -0
  231. package/python/Lib/ctypes/__pycache__/_endian.cpython-313.pyc +0 -0
  232. package/python/Lib/ctypes/__pycache__/wintypes.cpython-313.pyc +0 -0
  233. package/python/Lib/ctypes/_aix.py +327 -0
  234. package/python/Lib/ctypes/_endian.py +78 -0
  235. package/python/Lib/ctypes/macholib/README.ctypes +7 -0
  236. package/python/Lib/ctypes/macholib/__init__.py +9 -0
  237. package/python/Lib/ctypes/macholib/dyld.py +165 -0
  238. package/python/Lib/ctypes/macholib/dylib.py +42 -0
  239. package/python/Lib/ctypes/macholib/fetch_macholib +2 -0
  240. package/python/Lib/ctypes/macholib/fetch_macholib.bat +1 -0
  241. package/python/Lib/ctypes/macholib/framework.py +42 -0
  242. package/python/Lib/ctypes/util.py +387 -0
  243. package/python/Lib/ctypes/wintypes.py +202 -0
  244. package/python/Lib/curses/__init__.py +101 -0
  245. package/python/Lib/curses/ascii.py +99 -0
  246. package/python/Lib/curses/has_key.py +192 -0
  247. package/python/Lib/curses/panel.py +6 -0
  248. package/python/Lib/curses/textpad.py +236 -0
  249. package/python/Lib/dataclasses.py +1679 -0
  250. package/python/Lib/datetime.py +9 -0
  251. package/python/Lib/dbm/__init__.py +194 -0
  252. package/python/Lib/dbm/dumb.py +319 -0
  253. package/python/Lib/dbm/gnu.py +3 -0
  254. package/python/Lib/dbm/ndbm.py +3 -0
  255. package/python/Lib/dbm/sqlite3.py +144 -0
  256. package/python/Lib/decimal.py +109 -0
  257. package/python/Lib/difflib.py +2058 -0
  258. package/python/Lib/dis.py +1075 -0
  259. package/python/Lib/doctest.py +2919 -0
  260. package/python/Lib/email/__init__.py +61 -0
  261. package/python/Lib/email/__pycache__/__init__.cpython-313.pyc +0 -0
  262. package/python/Lib/email/__pycache__/_encoded_words.cpython-313.pyc +0 -0
  263. package/python/Lib/email/__pycache__/_parseaddr.cpython-313.pyc +0 -0
  264. package/python/Lib/email/__pycache__/_policybase.cpython-313.pyc +0 -0
  265. package/python/Lib/email/__pycache__/base64mime.cpython-313.pyc +0 -0
  266. package/python/Lib/email/__pycache__/charset.cpython-313.pyc +0 -0
  267. package/python/Lib/email/__pycache__/encoders.cpython-313.pyc +0 -0
  268. package/python/Lib/email/__pycache__/errors.cpython-313.pyc +0 -0
  269. package/python/Lib/email/__pycache__/feedparser.cpython-313.pyc +0 -0
  270. package/python/Lib/email/__pycache__/header.cpython-313.pyc +0 -0
  271. package/python/Lib/email/__pycache__/iterators.cpython-313.pyc +0 -0
  272. package/python/Lib/email/__pycache__/message.cpython-313.pyc +0 -0
  273. package/python/Lib/email/__pycache__/parser.cpython-313.pyc +0 -0
  274. package/python/Lib/email/__pycache__/quoprimime.cpython-313.pyc +0 -0
  275. package/python/Lib/email/__pycache__/utils.cpython-313.pyc +0 -0
  276. package/python/Lib/email/_encoded_words.py +233 -0
  277. package/python/Lib/email/_header_value_parser.py +3153 -0
  278. package/python/Lib/email/_parseaddr.py +563 -0
  279. package/python/Lib/email/_policybase.py +382 -0
  280. package/python/Lib/email/architecture.rst +216 -0
  281. package/python/Lib/email/base64mime.py +115 -0
  282. package/python/Lib/email/charset.py +396 -0
  283. package/python/Lib/email/contentmanager.py +254 -0
  284. package/python/Lib/email/encoders.py +65 -0
  285. package/python/Lib/email/errors.py +117 -0
  286. package/python/Lib/email/feedparser.py +536 -0
  287. package/python/Lib/email/generator.py +530 -0
  288. package/python/Lib/email/header.py +582 -0
  289. package/python/Lib/email/headerregistry.py +618 -0
  290. package/python/Lib/email/iterators.py +68 -0
  291. package/python/Lib/email/message.py +1217 -0
  292. package/python/Lib/email/mime/__init__.py +0 -0
  293. package/python/Lib/email/mime/application.py +37 -0
  294. package/python/Lib/email/mime/audio.py +97 -0
  295. package/python/Lib/email/mime/base.py +29 -0
  296. package/python/Lib/email/mime/image.py +152 -0
  297. package/python/Lib/email/mime/message.py +33 -0
  298. package/python/Lib/email/mime/multipart.py +47 -0
  299. package/python/Lib/email/mime/nonmultipart.py +21 -0
  300. package/python/Lib/email/mime/text.py +40 -0
  301. package/python/Lib/email/parser.py +127 -0
  302. package/python/Lib/email/policy.py +232 -0
  303. package/python/Lib/email/quoprimime.py +300 -0
  304. package/python/Lib/email/utils.py +497 -0
  305. package/python/Lib/encodings/__init__.py +179 -0
  306. package/python/Lib/encodings/__pycache__/__init__.cpython-313.pyc +0 -0
  307. package/python/Lib/encodings/__pycache__/aliases.cpython-313.pyc +0 -0
  308. package/python/Lib/encodings/__pycache__/cp1252.cpython-313.pyc +0 -0
  309. package/python/Lib/encodings/__pycache__/cp437.cpython-313.pyc +0 -0
  310. package/python/Lib/encodings/__pycache__/hex_codec.cpython-313.pyc +0 -0
  311. package/python/Lib/encodings/__pycache__/idna.cpython-313.pyc +0 -0
  312. package/python/Lib/encodings/__pycache__/utf_8.cpython-313.pyc +0 -0
  313. package/python/Lib/encodings/aliases.py +560 -0
  314. package/python/Lib/encodings/ascii.py +50 -0
  315. package/python/Lib/encodings/base64_codec.py +55 -0
  316. package/python/Lib/encodings/big5.py +39 -0
  317. package/python/Lib/encodings/big5hkscs.py +39 -0
  318. package/python/Lib/encodings/bz2_codec.py +78 -0
  319. package/python/Lib/encodings/charmap.py +69 -0
  320. package/python/Lib/encodings/cp037.py +307 -0
  321. package/python/Lib/encodings/cp1006.py +307 -0
  322. package/python/Lib/encodings/cp1026.py +307 -0
  323. package/python/Lib/encodings/cp1125.py +698 -0
  324. package/python/Lib/encodings/cp1140.py +307 -0
  325. package/python/Lib/encodings/cp1250.py +307 -0
  326. package/python/Lib/encodings/cp1251.py +307 -0
  327. package/python/Lib/encodings/cp1252.py +307 -0
  328. package/python/Lib/encodings/cp1253.py +307 -0
  329. package/python/Lib/encodings/cp1254.py +307 -0
  330. package/python/Lib/encodings/cp1255.py +307 -0
  331. package/python/Lib/encodings/cp1256.py +307 -0
  332. package/python/Lib/encodings/cp1257.py +307 -0
  333. package/python/Lib/encodings/cp1258.py +307 -0
  334. package/python/Lib/encodings/cp273.py +307 -0
  335. package/python/Lib/encodings/cp424.py +307 -0
  336. package/python/Lib/encodings/cp437.py +698 -0
  337. package/python/Lib/encodings/cp500.py +307 -0
  338. package/python/Lib/encodings/cp720.py +309 -0
  339. package/python/Lib/encodings/cp737.py +698 -0
  340. package/python/Lib/encodings/cp775.py +697 -0
  341. package/python/Lib/encodings/cp850.py +698 -0
  342. package/python/Lib/encodings/cp852.py +698 -0
  343. package/python/Lib/encodings/cp855.py +698 -0
  344. package/python/Lib/encodings/cp856.py +307 -0
  345. package/python/Lib/encodings/cp857.py +694 -0
  346. package/python/Lib/encodings/cp858.py +698 -0
  347. package/python/Lib/encodings/cp860.py +698 -0
  348. package/python/Lib/encodings/cp861.py +698 -0
  349. package/python/Lib/encodings/cp862.py +698 -0
  350. package/python/Lib/encodings/cp863.py +698 -0
  351. package/python/Lib/encodings/cp864.py +690 -0
  352. package/python/Lib/encodings/cp865.py +698 -0
  353. package/python/Lib/encodings/cp866.py +698 -0
  354. package/python/Lib/encodings/cp869.py +689 -0
  355. package/python/Lib/encodings/cp874.py +307 -0
  356. package/python/Lib/encodings/cp875.py +307 -0
  357. package/python/Lib/encodings/cp932.py +39 -0
  358. package/python/Lib/encodings/cp949.py +39 -0
  359. package/python/Lib/encodings/cp950.py +39 -0
  360. package/python/Lib/encodings/euc_jis_2004.py +39 -0
  361. package/python/Lib/encodings/euc_jisx0213.py +39 -0
  362. package/python/Lib/encodings/euc_jp.py +39 -0
  363. package/python/Lib/encodings/euc_kr.py +39 -0
  364. package/python/Lib/encodings/gb18030.py +39 -0
  365. package/python/Lib/encodings/gb2312.py +39 -0
  366. package/python/Lib/encodings/gbk.py +39 -0
  367. package/python/Lib/encodings/hex_codec.py +55 -0
  368. package/python/Lib/encodings/hp_roman8.py +314 -0
  369. package/python/Lib/encodings/hz.py +39 -0
  370. package/python/Lib/encodings/idna.py +387 -0
  371. package/python/Lib/encodings/iso2022_jp.py +39 -0
  372. package/python/Lib/encodings/iso2022_jp_1.py +39 -0
  373. package/python/Lib/encodings/iso2022_jp_2.py +39 -0
  374. package/python/Lib/encodings/iso2022_jp_2004.py +39 -0
  375. package/python/Lib/encodings/iso2022_jp_3.py +39 -0
  376. package/python/Lib/encodings/iso2022_jp_ext.py +39 -0
  377. package/python/Lib/encodings/iso2022_kr.py +39 -0
  378. package/python/Lib/encodings/iso8859_1.py +307 -0
  379. package/python/Lib/encodings/iso8859_10.py +307 -0
  380. package/python/Lib/encodings/iso8859_11.py +307 -0
  381. package/python/Lib/encodings/iso8859_13.py +307 -0
  382. package/python/Lib/encodings/iso8859_14.py +307 -0
  383. package/python/Lib/encodings/iso8859_15.py +307 -0
  384. package/python/Lib/encodings/iso8859_16.py +307 -0
  385. package/python/Lib/encodings/iso8859_2.py +307 -0
  386. package/python/Lib/encodings/iso8859_3.py +307 -0
  387. package/python/Lib/encodings/iso8859_4.py +307 -0
  388. package/python/Lib/encodings/iso8859_5.py +307 -0
  389. package/python/Lib/encodings/iso8859_6.py +307 -0
  390. package/python/Lib/encodings/iso8859_7.py +307 -0
  391. package/python/Lib/encodings/iso8859_8.py +307 -0
  392. package/python/Lib/encodings/iso8859_9.py +307 -0
  393. package/python/Lib/encodings/johab.py +39 -0
  394. package/python/Lib/encodings/koi8_r.py +307 -0
  395. package/python/Lib/encodings/koi8_t.py +308 -0
  396. package/python/Lib/encodings/koi8_u.py +307 -0
  397. package/python/Lib/encodings/kz1048.py +307 -0
  398. package/python/Lib/encodings/latin_1.py +50 -0
  399. package/python/Lib/encodings/mac_arabic.py +698 -0
  400. package/python/Lib/encodings/mac_croatian.py +307 -0
  401. package/python/Lib/encodings/mac_cyrillic.py +307 -0
  402. package/python/Lib/encodings/mac_farsi.py +307 -0
  403. package/python/Lib/encodings/mac_greek.py +307 -0
  404. package/python/Lib/encodings/mac_iceland.py +307 -0
  405. package/python/Lib/encodings/mac_latin2.py +312 -0
  406. package/python/Lib/encodings/mac_roman.py +307 -0
  407. package/python/Lib/encodings/mac_romanian.py +307 -0
  408. package/python/Lib/encodings/mac_turkish.py +307 -0
  409. package/python/Lib/encodings/mbcs.py +47 -0
  410. package/python/Lib/encodings/oem.py +41 -0
  411. package/python/Lib/encodings/palmos.py +308 -0
  412. package/python/Lib/encodings/ptcp154.py +312 -0
  413. package/python/Lib/encodings/punycode.py +253 -0
  414. package/python/Lib/encodings/quopri_codec.py +56 -0
  415. package/python/Lib/encodings/raw_unicode_escape.py +46 -0
  416. package/python/Lib/encodings/rot_13.py +113 -0
  417. package/python/Lib/encodings/shift_jis.py +39 -0
  418. package/python/Lib/encodings/shift_jis_2004.py +39 -0
  419. package/python/Lib/encodings/shift_jisx0213.py +39 -0
  420. package/python/Lib/encodings/tis_620.py +307 -0
  421. package/python/Lib/encodings/undefined.py +49 -0
  422. package/python/Lib/encodings/unicode_escape.py +46 -0
  423. package/python/Lib/encodings/utf_16.py +155 -0
  424. package/python/Lib/encodings/utf_16_be.py +42 -0
  425. package/python/Lib/encodings/utf_16_le.py +42 -0
  426. package/python/Lib/encodings/utf_32.py +150 -0
  427. package/python/Lib/encodings/utf_32_be.py +37 -0
  428. package/python/Lib/encodings/utf_32_le.py +37 -0
  429. package/python/Lib/encodings/utf_7.py +38 -0
  430. package/python/Lib/encodings/utf_8.py +42 -0
  431. package/python/Lib/encodings/utf_8_sig.py +130 -0
  432. package/python/Lib/encodings/uu_codec.py +103 -0
  433. package/python/Lib/encodings/zlib_codec.py +77 -0
  434. package/python/Lib/enum.py +2183 -0
  435. package/python/Lib/filecmp.py +320 -0
  436. package/python/Lib/fileinput.py +442 -0
  437. package/python/Lib/fnmatch.py +192 -0
  438. package/python/Lib/fractions.py +1043 -0
  439. package/python/Lib/ftplib.py +975 -0
  440. package/python/Lib/functools.py +1036 -0
  441. package/python/Lib/genericpath.py +200 -0
  442. package/python/Lib/getopt.py +215 -0
  443. package/python/Lib/getpass.py +192 -0
  444. package/python/Lib/gettext.py +657 -0
  445. package/python/Lib/glob.py +572 -0
  446. package/python/Lib/graphlib.py +250 -0
  447. package/python/Lib/gzip.py +693 -0
  448. package/python/Lib/hashlib.py +255 -0
  449. package/python/Lib/heapq.py +603 -0
  450. package/python/Lib/hmac.py +220 -0
  451. package/python/Lib/html/__init__.py +132 -0
  452. package/python/Lib/html/__pycache__/__init__.cpython-313.pyc +0 -0
  453. package/python/Lib/html/__pycache__/entities.cpython-313.pyc +0 -0
  454. package/python/Lib/html/__pycache__/parser.cpython-313.pyc +0 -0
  455. package/python/Lib/html/entities.py +2513 -0
  456. package/python/Lib/html/parser.py +583 -0
  457. package/python/Lib/http/__init__.py +202 -0
  458. package/python/Lib/http/__pycache__/__init__.cpython-313.pyc +0 -0
  459. package/python/Lib/http/__pycache__/client.cpython-313.pyc +0 -0
  460. package/python/Lib/http/__pycache__/cookiejar.cpython-313.pyc +0 -0
  461. package/python/Lib/http/__pycache__/cookies.cpython-313.pyc +0 -0
  462. package/python/Lib/http/client.py +1598 -0
  463. package/python/Lib/http/cookiejar.py +2122 -0
  464. package/python/Lib/http/cookies.py +635 -0
  465. package/python/Lib/http/server.py +1355 -0
  466. package/python/Lib/imaplib.py +1769 -0
  467. package/python/Lib/importlib/__init__.py +136 -0
  468. package/python/Lib/importlib/__pycache__/__init__.cpython-313.pyc +0 -0
  469. package/python/Lib/importlib/__pycache__/_abc.cpython-313.pyc +0 -0
  470. package/python/Lib/importlib/__pycache__/abc.cpython-313.pyc +0 -0
  471. package/python/Lib/importlib/__pycache__/readers.cpython-313.pyc +0 -0
  472. package/python/Lib/importlib/_abc.py +39 -0
  473. package/python/Lib/importlib/_bootstrap.py +1559 -0
  474. package/python/Lib/importlib/_bootstrap_external.py +1826 -0
  475. package/python/Lib/importlib/abc.py +243 -0
  476. package/python/Lib/importlib/machinery.py +21 -0
  477. package/python/Lib/importlib/metadata/__init__.py +1093 -0
  478. package/python/Lib/importlib/metadata/__pycache__/__init__.cpython-313.pyc +0 -0
  479. package/python/Lib/importlib/metadata/__pycache__/_adapters.cpython-313.pyc +0 -0
  480. package/python/Lib/importlib/metadata/__pycache__/_collections.cpython-313.pyc +0 -0
  481. package/python/Lib/importlib/metadata/__pycache__/_functools.cpython-313.pyc +0 -0
  482. package/python/Lib/importlib/metadata/__pycache__/_itertools.cpython-313.pyc +0 -0
  483. package/python/Lib/importlib/metadata/__pycache__/_meta.cpython-313.pyc +0 -0
  484. package/python/Lib/importlib/metadata/__pycache__/_text.cpython-313.pyc +0 -0
  485. package/python/Lib/importlib/metadata/_adapters.py +89 -0
  486. package/python/Lib/importlib/metadata/_collections.py +30 -0
  487. package/python/Lib/importlib/metadata/_functools.py +104 -0
  488. package/python/Lib/importlib/metadata/_itertools.py +73 -0
  489. package/python/Lib/importlib/metadata/_meta.py +67 -0
  490. package/python/Lib/importlib/metadata/_text.py +99 -0
  491. package/python/Lib/importlib/metadata/diagnose.py +21 -0
  492. package/python/Lib/importlib/readers.py +12 -0
  493. package/python/Lib/importlib/resources/__init__.py +43 -0
  494. package/python/Lib/importlib/resources/__pycache__/__init__.cpython-313.pyc +0 -0
  495. package/python/Lib/importlib/resources/__pycache__/_adapters.cpython-313.pyc +0 -0
  496. package/python/Lib/importlib/resources/__pycache__/_common.cpython-313.pyc +0 -0
  497. package/python/Lib/importlib/resources/__pycache__/_functional.cpython-313.pyc +0 -0
  498. package/python/Lib/importlib/resources/__pycache__/_itertools.cpython-313.pyc +0 -0
  499. package/python/Lib/importlib/resources/__pycache__/abc.cpython-313.pyc +0 -0
  500. package/python/Lib/importlib/resources/__pycache__/readers.cpython-313.pyc +0 -0
  501. package/python/Lib/importlib/resources/_adapters.py +168 -0
  502. package/python/Lib/importlib/resources/_common.py +211 -0
  503. package/python/Lib/importlib/resources/_functional.py +81 -0
  504. package/python/Lib/importlib/resources/_itertools.py +38 -0
  505. package/python/Lib/importlib/resources/abc.py +173 -0
  506. package/python/Lib/importlib/resources/readers.py +203 -0
  507. package/python/Lib/importlib/resources/simple.py +106 -0
  508. package/python/Lib/importlib/simple.py +14 -0
  509. package/python/Lib/importlib/util.py +274 -0
  510. package/python/Lib/inspect.py +3479 -0
  511. package/python/Lib/io.py +99 -0
  512. package/python/Lib/ipaddress.py +2440 -0
  513. package/python/Lib/json/__init__.py +365 -0
  514. package/python/Lib/json/__pycache__/__init__.cpython-313.pyc +0 -0
  515. package/python/Lib/json/__pycache__/decoder.cpython-313.pyc +0 -0
  516. package/python/Lib/json/__pycache__/encoder.cpython-313.pyc +0 -0
  517. package/python/Lib/json/__pycache__/scanner.cpython-313.pyc +0 -0
  518. package/python/Lib/json/decoder.py +364 -0
  519. package/python/Lib/json/encoder.py +446 -0
  520. package/python/Lib/json/scanner.py +73 -0
  521. package/python/Lib/json/tool.py +90 -0
  522. package/python/Lib/keyword.py +64 -0
  523. package/python/Lib/linecache.py +236 -0
  524. package/python/Lib/locale.py +1987 -0
  525. package/python/Lib/logging/__init__.py +2330 -0
  526. package/python/Lib/logging/__pycache__/__init__.cpython-313.pyc +0 -0
  527. package/python/Lib/logging/__pycache__/config.cpython-313.pyc +0 -0
  528. package/python/Lib/logging/__pycache__/handlers.cpython-313.pyc +0 -0
  529. package/python/Lib/logging/config.py +1080 -0
  530. package/python/Lib/logging/handlers.py +1629 -0
  531. package/python/Lib/lzma.py +364 -0
  532. package/python/Lib/mailbox.py +2219 -0
  533. package/python/Lib/mimetypes.py +679 -0
  534. package/python/Lib/modulefinder.py +671 -0
  535. package/python/Lib/multiprocessing/__init__.py +37 -0
  536. package/python/Lib/multiprocessing/connection.py +1216 -0
  537. package/python/Lib/multiprocessing/context.py +383 -0
  538. package/python/Lib/multiprocessing/dummy/__init__.py +126 -0
  539. package/python/Lib/multiprocessing/dummy/connection.py +75 -0
  540. package/python/Lib/multiprocessing/forkserver.py +373 -0
  541. package/python/Lib/multiprocessing/heap.py +337 -0
  542. package/python/Lib/multiprocessing/managers.py +1397 -0
  543. package/python/Lib/multiprocessing/pool.py +957 -0
  544. package/python/Lib/multiprocessing/popen_fork.py +97 -0
  545. package/python/Lib/multiprocessing/popen_forkserver.py +74 -0
  546. package/python/Lib/multiprocessing/popen_spawn_posix.py +76 -0
  547. package/python/Lib/multiprocessing/popen_spawn_win32.py +147 -0
  548. package/python/Lib/multiprocessing/process.py +436 -0
  549. package/python/Lib/multiprocessing/queues.py +399 -0
  550. package/python/Lib/multiprocessing/reduction.py +281 -0
  551. package/python/Lib/multiprocessing/resource_sharer.py +154 -0
  552. package/python/Lib/multiprocessing/resource_tracker.py +499 -0
  553. package/python/Lib/multiprocessing/shared_memory.py +544 -0
  554. package/python/Lib/multiprocessing/sharedctypes.py +240 -0
  555. package/python/Lib/multiprocessing/spawn.py +307 -0
  556. package/python/Lib/multiprocessing/synchronize.py +404 -0
  557. package/python/Lib/multiprocessing/util.py +562 -0
  558. package/python/Lib/netrc.py +199 -0
  559. package/python/Lib/ntpath.py +872 -0
  560. package/python/Lib/nturl2path.py +69 -0
  561. package/python/Lib/numbers.py +427 -0
  562. package/python/Lib/opcode.py +115 -0
  563. package/python/Lib/operator.py +467 -0
  564. package/python/Lib/optparse.py +1681 -0
  565. package/python/Lib/os.py +1184 -0
  566. package/python/Lib/pathlib/__init__.py +12 -0
  567. package/python/Lib/pathlib/__pycache__/__init__.cpython-313.pyc +0 -0
  568. package/python/Lib/pathlib/__pycache__/_abc.cpython-313.pyc +0 -0
  569. package/python/Lib/pathlib/__pycache__/_local.cpython-313.pyc +0 -0
  570. package/python/Lib/pathlib/_abc.py +930 -0
  571. package/python/Lib/pathlib/_local.py +861 -0
  572. package/python/Lib/pdb.py +2550 -0
  573. package/python/Lib/pickle.py +1860 -0
  574. package/python/Lib/pickletools.py +2904 -0
  575. package/python/Lib/pkgutil.py +529 -0
  576. package/python/Lib/platform.py +1454 -0
  577. package/python/Lib/plistlib.py +948 -0
  578. package/python/Lib/poplib.py +477 -0
  579. package/python/Lib/posixpath.py +578 -0
  580. package/python/Lib/pprint.py +658 -0
  581. package/python/Lib/profile.py +616 -0
  582. package/python/Lib/pstats.py +778 -0
  583. package/python/Lib/pty.py +211 -0
  584. package/python/Lib/py_compile.py +212 -0
  585. package/python/Lib/pyclbr.py +314 -0
  586. package/python/Lib/pydoc.py +2861 -0
  587. package/python/Lib/queue.py +383 -0
  588. package/python/Lib/quopri.py +237 -0
  589. package/python/Lib/random.py +1078 -0
  590. package/python/Lib/re/__init__.py +428 -0
  591. package/python/Lib/re/__pycache__/__init__.cpython-313.pyc +0 -0
  592. package/python/Lib/re/__pycache__/_casefix.cpython-313.pyc +0 -0
  593. package/python/Lib/re/__pycache__/_compiler.cpython-313.pyc +0 -0
  594. package/python/Lib/re/__pycache__/_constants.cpython-313.pyc +0 -0
  595. package/python/Lib/re/__pycache__/_parser.cpython-313.pyc +0 -0
  596. package/python/Lib/re/_casefix.py +106 -0
  597. package/python/Lib/re/_compiler.py +768 -0
  598. package/python/Lib/re/_constants.py +222 -0
  599. package/python/Lib/re/_parser.py +1081 -0
  600. package/python/Lib/reprlib.py +230 -0
  601. package/python/Lib/rlcompleter.py +222 -0
  602. package/python/Lib/runpy.py +326 -0
  603. package/python/Lib/sched.py +167 -0
  604. package/python/Lib/secrets.py +71 -0
  605. package/python/Lib/selectors.py +603 -0
  606. package/python/Lib/shelve.py +250 -0
  607. package/python/Lib/shlex.py +345 -0
  608. package/python/Lib/shutil.py +1569 -0
  609. package/python/Lib/signal.py +94 -0
  610. package/python/Lib/site.py +773 -0
  611. package/python/Lib/smtplib.py +1123 -0
  612. package/python/Lib/socket.py +988 -0
  613. package/python/Lib/socketserver.py +863 -0
  614. package/python/Lib/sqlite3/__init__.py +70 -0
  615. package/python/Lib/sqlite3/__main__.py +139 -0
  616. package/python/Lib/sqlite3/dbapi2.py +108 -0
  617. package/python/Lib/sqlite3/dump.py +118 -0
  618. package/python/Lib/sre_compile.py +7 -0
  619. package/python/Lib/sre_constants.py +7 -0
  620. package/python/Lib/sre_parse.py +7 -0
  621. package/python/Lib/ssl.py +1529 -0
  622. package/python/Lib/stat.py +212 -0
  623. package/python/Lib/statistics.py +1817 -0
  624. package/python/Lib/string.py +314 -0
  625. package/python/Lib/stringprep.py +272 -0
  626. package/python/Lib/struct.py +15 -0
  627. package/python/Lib/subprocess.py +2258 -0
  628. package/python/Lib/symtable.py +414 -0
  629. package/python/Lib/sysconfig/__init__.py +734 -0
  630. package/python/Lib/sysconfig/__main__.py +248 -0
  631. package/python/Lib/sysconfig/__pycache__/__init__.cpython-313.pyc +0 -0
  632. package/python/Lib/tabnanny.py +340 -0
  633. package/python/Lib/tarfile.py +3136 -0
  634. package/python/Lib/tempfile.py +958 -0
  635. package/python/Lib/textwrap.py +497 -0
  636. package/python/Lib/this.py +28 -0
  637. package/python/Lib/threading.py +1602 -0
  638. package/python/Lib/timeit.py +381 -0
  639. package/python/Lib/token.py +141 -0
  640. package/python/Lib/tokenize.py +592 -0
  641. package/python/Lib/tomllib/__init__.py +10 -0
  642. package/python/Lib/tomllib/__pycache__/__init__.cpython-313.pyc +0 -0
  643. package/python/Lib/tomllib/__pycache__/_parser.cpython-313.pyc +0 -0
  644. package/python/Lib/tomllib/__pycache__/_re.cpython-313.pyc +0 -0
  645. package/python/Lib/tomllib/__pycache__/_types.cpython-313.pyc +0 -0
  646. package/python/Lib/tomllib/_parser.py +703 -0
  647. package/python/Lib/tomllib/_re.py +107 -0
  648. package/python/Lib/tomllib/_types.py +10 -0
  649. package/python/Lib/tomllib/mypy.ini +15 -0
  650. package/python/Lib/trace.py +754 -0
  651. package/python/Lib/traceback.py +1639 -0
  652. package/python/Lib/tracemalloc.py +560 -0
  653. package/python/Lib/tty.py +73 -0
  654. package/python/Lib/types.py +346 -0
  655. package/python/Lib/typing.py +3846 -0
  656. package/python/Lib/unittest/__init__.py +80 -0
  657. package/python/Lib/unittest/__main__.py +18 -0
  658. package/python/Lib/unittest/_log.py +86 -0
  659. package/python/Lib/unittest/async_case.py +146 -0
  660. package/python/Lib/unittest/case.py +1478 -0
  661. package/python/Lib/unittest/loader.py +460 -0
  662. package/python/Lib/unittest/main.py +280 -0
  663. package/python/Lib/unittest/mock.py +3189 -0
  664. package/python/Lib/unittest/result.py +256 -0
  665. package/python/Lib/unittest/runner.py +292 -0
  666. package/python/Lib/unittest/signals.py +71 -0
  667. package/python/Lib/unittest/suite.py +379 -0
  668. package/python/Lib/unittest/util.py +170 -0
  669. package/python/Lib/urllib/__init__.py +0 -0
  670. package/python/Lib/urllib/__pycache__/__init__.cpython-313.pyc +0 -0
  671. package/python/Lib/urllib/__pycache__/error.cpython-313.pyc +0 -0
  672. package/python/Lib/urllib/__pycache__/parse.cpython-313.pyc +0 -0
  673. package/python/Lib/urllib/__pycache__/request.cpython-313.pyc +0 -0
  674. package/python/Lib/urllib/__pycache__/response.cpython-313.pyc +0 -0
  675. package/python/Lib/urllib/error.py +74 -0
  676. package/python/Lib/urllib/parse.py +1264 -0
  677. package/python/Lib/urllib/request.py +2796 -0
  678. package/python/Lib/urllib/response.py +84 -0
  679. package/python/Lib/urllib/robotparser.py +363 -0
  680. package/python/Lib/uuid.py +784 -0
  681. package/python/Lib/warnings.py +735 -0
  682. package/python/Lib/wave.py +665 -0
  683. package/python/Lib/weakref.py +674 -0
  684. package/python/Lib/webbrowser.py +724 -0
  685. package/python/Lib/wsgiref/__init__.py +25 -0
  686. package/python/Lib/wsgiref/handlers.py +575 -0
  687. package/python/Lib/wsgiref/headers.py +192 -0
  688. package/python/Lib/wsgiref/simple_server.py +161 -0
  689. package/python/Lib/wsgiref/types.py +54 -0
  690. package/python/Lib/wsgiref/util.py +159 -0
  691. package/python/Lib/wsgiref/validate.py +438 -0
  692. package/python/Lib/xml/__init__.py +20 -0
  693. package/python/Lib/xml/__pycache__/__init__.cpython-313.pyc +0 -0
  694. package/python/Lib/xml/dom/NodeFilter.py +27 -0
  695. package/python/Lib/xml/dom/__init__.py +140 -0
  696. package/python/Lib/xml/dom/domreg.py +99 -0
  697. package/python/Lib/xml/dom/expatbuilder.py +962 -0
  698. package/python/Lib/xml/dom/minicompat.py +109 -0
  699. package/python/Lib/xml/dom/minidom.py +2024 -0
  700. package/python/Lib/xml/dom/pulldom.py +336 -0
  701. package/python/Lib/xml/dom/xmlbuilder.py +389 -0
  702. package/python/Lib/xml/etree/ElementInclude.py +186 -0
  703. package/python/Lib/xml/etree/ElementPath.py +430 -0
  704. package/python/Lib/xml/etree/ElementTree.py +2116 -0
  705. package/python/Lib/xml/etree/__init__.py +33 -0
  706. package/python/Lib/xml/etree/cElementTree.py +3 -0
  707. package/python/Lib/xml/parsers/__init__.py +8 -0
  708. package/python/Lib/xml/parsers/__pycache__/__init__.cpython-313.pyc +0 -0
  709. package/python/Lib/xml/parsers/__pycache__/expat.cpython-313.pyc +0 -0
  710. package/python/Lib/xml/parsers/expat.py +8 -0
  711. package/python/Lib/xml/sax/__init__.py +94 -0
  712. package/python/Lib/xml/sax/_exceptions.py +127 -0
  713. package/python/Lib/xml/sax/expatreader.py +454 -0
  714. package/python/Lib/xml/sax/handler.py +387 -0
  715. package/python/Lib/xml/sax/saxutils.py +369 -0
  716. package/python/Lib/xml/sax/xmlreader.py +378 -0
  717. package/python/Lib/xmlrpc/__init__.py +1 -0
  718. package/python/Lib/xmlrpc/__pycache__/__init__.cpython-313.pyc +0 -0
  719. package/python/Lib/xmlrpc/__pycache__/client.cpython-313.pyc +0 -0
  720. package/python/Lib/xmlrpc/client.py +1503 -0
  721. package/python/Lib/xmlrpc/server.py +1002 -0
  722. package/python/Lib/zipapp.py +229 -0
  723. package/python/Lib/zipfile/__init__.py +2391 -0
  724. package/python/Lib/zipfile/__main__.py +4 -0
  725. package/python/Lib/zipfile/__pycache__/__init__.cpython-313.pyc +0 -0
  726. package/python/Lib/zipfile/_path/__init__.py +452 -0
  727. package/python/Lib/zipfile/_path/__pycache__/__init__.cpython-313.pyc +0 -0
  728. package/python/Lib/zipfile/_path/__pycache__/glob.cpython-313.pyc +0 -0
  729. package/python/Lib/zipfile/_path/glob.py +113 -0
  730. package/python/Lib/zipimport.py +803 -0
  731. package/python/Lib/zoneinfo/__init__.py +34 -0
  732. package/python/Lib/zoneinfo/_common.py +172 -0
  733. package/python/Lib/zoneinfo/_tzpath.py +189 -0
  734. package/python/Lib/zoneinfo/_zoneinfo.py +779 -0
  735. package/python/licenses/LICENSE.bdb.txt +126 -0
  736. package/python/licenses/LICENSE.bzip2.txt +37 -0
  737. package/python/licenses/LICENSE.cpython.txt +771 -0
  738. package/python/licenses/LICENSE.expat.txt +21 -0
  739. package/python/licenses/LICENSE.libX11.txt +942 -0
  740. package/python/licenses/LICENSE.libXau.txt +21 -0
  741. package/python/licenses/LICENSE.libedit.txt +29 -0
  742. package/python/licenses/LICENSE.libffi.txt +21 -0
  743. package/python/licenses/LICENSE.liblzma.txt +13 -0
  744. package/python/licenses/LICENSE.libuuid.txt +27 -0
  745. package/python/licenses/LICENSE.libxcb.txt +30 -0
  746. package/python/licenses/LICENSE.mpdecimal.txt +24 -0
  747. package/python/licenses/LICENSE.ncurses.txt +29 -0
  748. package/python/licenses/LICENSE.openssl-1.1.txt +124 -0
  749. package/python/licenses/LICENSE.openssl-3.txt +177 -0
  750. package/python/licenses/LICENSE.sqlite.txt +23 -0
  751. package/python/licenses/LICENSE.tcl.txt +40 -0
  752. package/python/licenses/LICENSE.tix.txt +54 -0
  753. package/python/licenses/LICENSE.zlib.txt +21 -0
  754. package/python/python.exe +0 -0
  755. package/python/python3.dll +0 -0
  756. package/python/python313.dll +0 -0
  757. package/python/pythonw.exe +0 -0
  758. package/python/vcruntime140.dll +0 -0
  759. package/python/vcruntime140_1.dll +0 -0
@@ -0,0 +1,1328 @@
1
+ """Event loop using a selector and related classes.
2
+
3
+ A selector is a "notify-when-ready" multiplexer. For a subclass which
4
+ also includes support for signal handling, see the unix_events sub-module.
5
+ """
6
+
7
+ __all__ = 'BaseSelectorEventLoop',
8
+
9
+ import collections
10
+ import errno
11
+ import functools
12
+ import itertools
13
+ import os
14
+ import selectors
15
+ import socket
16
+ import warnings
17
+ import weakref
18
+ try:
19
+ import ssl
20
+ except ImportError: # pragma: no cover
21
+ ssl = None
22
+
23
+ from . import base_events
24
+ from . import constants
25
+ from . import events
26
+ from . import futures
27
+ from . import protocols
28
+ from . import sslproto
29
+ from . import transports
30
+ from . import trsock
31
+ from .log import logger
32
+
33
+ _HAS_SENDMSG = hasattr(socket.socket, 'sendmsg')
34
+
35
+ if _HAS_SENDMSG:
36
+ try:
37
+ SC_IOV_MAX = os.sysconf('SC_IOV_MAX')
38
+ except OSError:
39
+ # Fallback to send
40
+ _HAS_SENDMSG = False
41
+
42
+ def _test_selector_event(selector, fd, event):
43
+ # Test if the selector is monitoring 'event' events
44
+ # for the file descriptor 'fd'.
45
+ try:
46
+ key = selector.get_key(fd)
47
+ except KeyError:
48
+ return False
49
+ else:
50
+ return bool(key.events & event)
51
+
52
+
53
+ class BaseSelectorEventLoop(base_events.BaseEventLoop):
54
+ """Selector event loop.
55
+
56
+ See events.EventLoop for API specification.
57
+ """
58
+
59
+ def __init__(self, selector=None):
60
+ super().__init__()
61
+
62
+ if selector is None:
63
+ selector = selectors.DefaultSelector()
64
+ logger.debug('Using selector: %s', selector.__class__.__name__)
65
+ self._selector = selector
66
+ self._make_self_pipe()
67
+ self._transports = weakref.WeakValueDictionary()
68
+
69
+ def _make_socket_transport(self, sock, protocol, waiter=None, *,
70
+ extra=None, server=None):
71
+ self._ensure_fd_no_transport(sock)
72
+ return _SelectorSocketTransport(self, sock, protocol, waiter,
73
+ extra, server)
74
+
75
+ def _make_ssl_transport(
76
+ self, rawsock, protocol, sslcontext, waiter=None,
77
+ *, server_side=False, server_hostname=None,
78
+ extra=None, server=None,
79
+ ssl_handshake_timeout=constants.SSL_HANDSHAKE_TIMEOUT,
80
+ ssl_shutdown_timeout=constants.SSL_SHUTDOWN_TIMEOUT,
81
+ ):
82
+ self._ensure_fd_no_transport(rawsock)
83
+ ssl_protocol = sslproto.SSLProtocol(
84
+ self, protocol, sslcontext, waiter,
85
+ server_side, server_hostname,
86
+ ssl_handshake_timeout=ssl_handshake_timeout,
87
+ ssl_shutdown_timeout=ssl_shutdown_timeout
88
+ )
89
+ _SelectorSocketTransport(self, rawsock, ssl_protocol,
90
+ extra=extra, server=server)
91
+ return ssl_protocol._app_transport
92
+
93
+ def _make_datagram_transport(self, sock, protocol,
94
+ address=None, waiter=None, extra=None):
95
+ self._ensure_fd_no_transport(sock)
96
+ return _SelectorDatagramTransport(self, sock, protocol,
97
+ address, waiter, extra)
98
+
99
+ def close(self):
100
+ if self.is_running():
101
+ raise RuntimeError("Cannot close a running event loop")
102
+ if self.is_closed():
103
+ return
104
+ self._close_self_pipe()
105
+ super().close()
106
+ if self._selector is not None:
107
+ self._selector.close()
108
+ self._selector = None
109
+
110
+ def _close_self_pipe(self):
111
+ self._remove_reader(self._ssock.fileno())
112
+ self._ssock.close()
113
+ self._ssock = None
114
+ self._csock.close()
115
+ self._csock = None
116
+ self._internal_fds -= 1
117
+
118
+ def _make_self_pipe(self):
119
+ # A self-socket, really. :-)
120
+ self._ssock, self._csock = socket.socketpair()
121
+ self._ssock.setblocking(False)
122
+ self._csock.setblocking(False)
123
+ self._internal_fds += 1
124
+ self._add_reader(self._ssock.fileno(), self._read_from_self)
125
+
126
+ def _process_self_data(self, data):
127
+ pass
128
+
129
+ def _read_from_self(self):
130
+ while True:
131
+ try:
132
+ data = self._ssock.recv(4096)
133
+ if not data:
134
+ break
135
+ self._process_self_data(data)
136
+ except InterruptedError:
137
+ continue
138
+ except BlockingIOError:
139
+ break
140
+
141
+ def _write_to_self(self):
142
+ # This may be called from a different thread, possibly after
143
+ # _close_self_pipe() has been called or even while it is
144
+ # running. Guard for self._csock being None or closed. When
145
+ # a socket is closed, send() raises OSError (with errno set to
146
+ # EBADF, but let's not rely on the exact error code).
147
+ csock = self._csock
148
+ if csock is None:
149
+ return
150
+
151
+ try:
152
+ csock.send(b'\0')
153
+ except OSError:
154
+ if self._debug:
155
+ logger.debug("Fail to write a null byte into the "
156
+ "self-pipe socket",
157
+ exc_info=True)
158
+
159
+ def _start_serving(self, protocol_factory, sock,
160
+ sslcontext=None, server=None, backlog=100,
161
+ ssl_handshake_timeout=constants.SSL_HANDSHAKE_TIMEOUT,
162
+ ssl_shutdown_timeout=constants.SSL_SHUTDOWN_TIMEOUT):
163
+ self._add_reader(sock.fileno(), self._accept_connection,
164
+ protocol_factory, sock, sslcontext, server, backlog,
165
+ ssl_handshake_timeout, ssl_shutdown_timeout)
166
+
167
+ def _accept_connection(
168
+ self, protocol_factory, sock,
169
+ sslcontext=None, server=None, backlog=100,
170
+ ssl_handshake_timeout=constants.SSL_HANDSHAKE_TIMEOUT,
171
+ ssl_shutdown_timeout=constants.SSL_SHUTDOWN_TIMEOUT):
172
+ # This method is only called once for each event loop tick where the
173
+ # listening socket has triggered an EVENT_READ. There may be multiple
174
+ # connections waiting for an .accept() so it is called in a loop.
175
+ # See https://bugs.python.org/issue27906 for more details.
176
+ for _ in range(backlog + 1):
177
+ try:
178
+ conn, addr = sock.accept()
179
+ if self._debug:
180
+ logger.debug("%r got a new connection from %r: %r",
181
+ server, addr, conn)
182
+ conn.setblocking(False)
183
+ except ConnectionAbortedError:
184
+ # Discard connections that were aborted before accept().
185
+ continue
186
+ except (BlockingIOError, InterruptedError):
187
+ # Early exit because of a signal or
188
+ # the socket accept buffer is empty.
189
+ return
190
+ except OSError as exc:
191
+ # There's nowhere to send the error, so just log it.
192
+ if exc.errno in (errno.EMFILE, errno.ENFILE,
193
+ errno.ENOBUFS, errno.ENOMEM):
194
+ # Some platforms (e.g. Linux keep reporting the FD as
195
+ # ready, so we remove the read handler temporarily.
196
+ # We'll try again in a while.
197
+ self.call_exception_handler({
198
+ 'message': 'socket.accept() out of system resource',
199
+ 'exception': exc,
200
+ 'socket': trsock.TransportSocket(sock),
201
+ })
202
+ self._remove_reader(sock.fileno())
203
+ self.call_later(constants.ACCEPT_RETRY_DELAY,
204
+ self._start_serving,
205
+ protocol_factory, sock, sslcontext, server,
206
+ backlog, ssl_handshake_timeout,
207
+ ssl_shutdown_timeout)
208
+ else:
209
+ raise # The event loop will catch, log and ignore it.
210
+ else:
211
+ extra = {'peername': addr}
212
+ accept = self._accept_connection2(
213
+ protocol_factory, conn, extra, sslcontext, server,
214
+ ssl_handshake_timeout, ssl_shutdown_timeout)
215
+ self.create_task(accept)
216
+
217
+ async def _accept_connection2(
218
+ self, protocol_factory, conn, extra,
219
+ sslcontext=None, server=None,
220
+ ssl_handshake_timeout=constants.SSL_HANDSHAKE_TIMEOUT,
221
+ ssl_shutdown_timeout=constants.SSL_SHUTDOWN_TIMEOUT):
222
+ protocol = None
223
+ transport = None
224
+ try:
225
+ protocol = protocol_factory()
226
+ waiter = self.create_future()
227
+ if sslcontext:
228
+ transport = self._make_ssl_transport(
229
+ conn, protocol, sslcontext, waiter=waiter,
230
+ server_side=True, extra=extra, server=server,
231
+ ssl_handshake_timeout=ssl_handshake_timeout,
232
+ ssl_shutdown_timeout=ssl_shutdown_timeout)
233
+ else:
234
+ transport = self._make_socket_transport(
235
+ conn, protocol, waiter=waiter, extra=extra,
236
+ server=server)
237
+
238
+ try:
239
+ await waiter
240
+ except BaseException:
241
+ transport.close()
242
+ # gh-109534: When an exception is raised by the SSLProtocol object the
243
+ # exception set in this future can keep the protocol object alive and
244
+ # cause a reference cycle.
245
+ waiter = None
246
+ raise
247
+ # It's now up to the protocol to handle the connection.
248
+
249
+ except (SystemExit, KeyboardInterrupt):
250
+ raise
251
+ except BaseException as exc:
252
+ if self._debug:
253
+ context = {
254
+ 'message':
255
+ 'Error on transport creation for incoming connection',
256
+ 'exception': exc,
257
+ }
258
+ if protocol is not None:
259
+ context['protocol'] = protocol
260
+ if transport is not None:
261
+ context['transport'] = transport
262
+ self.call_exception_handler(context)
263
+
264
+ def _ensure_fd_no_transport(self, fd):
265
+ fileno = fd
266
+ if not isinstance(fileno, int):
267
+ try:
268
+ fileno = int(fileno.fileno())
269
+ except (AttributeError, TypeError, ValueError):
270
+ # This code matches selectors._fileobj_to_fd function.
271
+ raise ValueError(f"Invalid file object: {fd!r}") from None
272
+ transport = self._transports.get(fileno)
273
+ if transport and not transport.is_closing():
274
+ raise RuntimeError(
275
+ f'File descriptor {fd!r} is used by transport '
276
+ f'{transport!r}')
277
+
278
+ def _add_reader(self, fd, callback, *args):
279
+ self._check_closed()
280
+ handle = events.Handle(callback, args, self, None)
281
+ key = self._selector.get_map().get(fd)
282
+ if key is None:
283
+ self._selector.register(fd, selectors.EVENT_READ,
284
+ (handle, None))
285
+ else:
286
+ mask, (reader, writer) = key.events, key.data
287
+ self._selector.modify(fd, mask | selectors.EVENT_READ,
288
+ (handle, writer))
289
+ if reader is not None:
290
+ reader.cancel()
291
+ return handle
292
+
293
+ def _remove_reader(self, fd):
294
+ if self.is_closed():
295
+ return False
296
+ key = self._selector.get_map().get(fd)
297
+ if key is None:
298
+ return False
299
+ mask, (reader, writer) = key.events, key.data
300
+ mask &= ~selectors.EVENT_READ
301
+ if not mask:
302
+ self._selector.unregister(fd)
303
+ else:
304
+ self._selector.modify(fd, mask, (None, writer))
305
+
306
+ if reader is not None:
307
+ reader.cancel()
308
+ return True
309
+ else:
310
+ return False
311
+
312
+ def _add_writer(self, fd, callback, *args):
313
+ self._check_closed()
314
+ handle = events.Handle(callback, args, self, None)
315
+ key = self._selector.get_map().get(fd)
316
+ if key is None:
317
+ self._selector.register(fd, selectors.EVENT_WRITE,
318
+ (None, handle))
319
+ else:
320
+ mask, (reader, writer) = key.events, key.data
321
+ self._selector.modify(fd, mask | selectors.EVENT_WRITE,
322
+ (reader, handle))
323
+ if writer is not None:
324
+ writer.cancel()
325
+ return handle
326
+
327
+ def _remove_writer(self, fd):
328
+ """Remove a writer callback."""
329
+ if self.is_closed():
330
+ return False
331
+ key = self._selector.get_map().get(fd)
332
+ if key is None:
333
+ return False
334
+ mask, (reader, writer) = key.events, key.data
335
+ # Remove both writer and connector.
336
+ mask &= ~selectors.EVENT_WRITE
337
+ if not mask:
338
+ self._selector.unregister(fd)
339
+ else:
340
+ self._selector.modify(fd, mask, (reader, None))
341
+
342
+ if writer is not None:
343
+ writer.cancel()
344
+ return True
345
+ else:
346
+ return False
347
+
348
+ def add_reader(self, fd, callback, *args):
349
+ """Add a reader callback."""
350
+ self._ensure_fd_no_transport(fd)
351
+ self._add_reader(fd, callback, *args)
352
+
353
+ def remove_reader(self, fd):
354
+ """Remove a reader callback."""
355
+ self._ensure_fd_no_transport(fd)
356
+ return self._remove_reader(fd)
357
+
358
+ def add_writer(self, fd, callback, *args):
359
+ """Add a writer callback.."""
360
+ self._ensure_fd_no_transport(fd)
361
+ self._add_writer(fd, callback, *args)
362
+
363
+ def remove_writer(self, fd):
364
+ """Remove a writer callback."""
365
+ self._ensure_fd_no_transport(fd)
366
+ return self._remove_writer(fd)
367
+
368
+ async def sock_recv(self, sock, n):
369
+ """Receive data from the socket.
370
+
371
+ The return value is a bytes object representing the data received.
372
+ The maximum amount of data to be received at once is specified by
373
+ nbytes.
374
+ """
375
+ base_events._check_ssl_socket(sock)
376
+ if self._debug and sock.gettimeout() != 0:
377
+ raise ValueError("the socket must be non-blocking")
378
+ try:
379
+ return sock.recv(n)
380
+ except (BlockingIOError, InterruptedError):
381
+ pass
382
+ fut = self.create_future()
383
+ fd = sock.fileno()
384
+ self._ensure_fd_no_transport(fd)
385
+ handle = self._add_reader(fd, self._sock_recv, fut, sock, n)
386
+ fut.add_done_callback(
387
+ functools.partial(self._sock_read_done, fd, handle=handle))
388
+ return await fut
389
+
390
+ def _sock_read_done(self, fd, fut, handle=None):
391
+ if handle is None or not handle.cancelled():
392
+ self.remove_reader(fd)
393
+
394
+ def _sock_recv(self, fut, sock, n):
395
+ # _sock_recv() can add itself as an I/O callback if the operation can't
396
+ # be done immediately. Don't use it directly, call sock_recv().
397
+ if fut.done():
398
+ return
399
+ try:
400
+ data = sock.recv(n)
401
+ except (BlockingIOError, InterruptedError):
402
+ return # try again next time
403
+ except (SystemExit, KeyboardInterrupt):
404
+ raise
405
+ except BaseException as exc:
406
+ fut.set_exception(exc)
407
+ else:
408
+ fut.set_result(data)
409
+
410
+ async def sock_recv_into(self, sock, buf):
411
+ """Receive data from the socket.
412
+
413
+ The received data is written into *buf* (a writable buffer).
414
+ The return value is the number of bytes written.
415
+ """
416
+ base_events._check_ssl_socket(sock)
417
+ if self._debug and sock.gettimeout() != 0:
418
+ raise ValueError("the socket must be non-blocking")
419
+ try:
420
+ return sock.recv_into(buf)
421
+ except (BlockingIOError, InterruptedError):
422
+ pass
423
+ fut = self.create_future()
424
+ fd = sock.fileno()
425
+ self._ensure_fd_no_transport(fd)
426
+ handle = self._add_reader(fd, self._sock_recv_into, fut, sock, buf)
427
+ fut.add_done_callback(
428
+ functools.partial(self._sock_read_done, fd, handle=handle))
429
+ return await fut
430
+
431
+ def _sock_recv_into(self, fut, sock, buf):
432
+ # _sock_recv_into() can add itself as an I/O callback if the operation
433
+ # can't be done immediately. Don't use it directly, call
434
+ # sock_recv_into().
435
+ if fut.done():
436
+ return
437
+ try:
438
+ nbytes = sock.recv_into(buf)
439
+ except (BlockingIOError, InterruptedError):
440
+ return # try again next time
441
+ except (SystemExit, KeyboardInterrupt):
442
+ raise
443
+ except BaseException as exc:
444
+ fut.set_exception(exc)
445
+ else:
446
+ fut.set_result(nbytes)
447
+
448
+ async def sock_recvfrom(self, sock, bufsize):
449
+ """Receive a datagram from a datagram socket.
450
+
451
+ The return value is a tuple of (bytes, address) representing the
452
+ datagram received and the address it came from.
453
+ The maximum amount of data to be received at once is specified by
454
+ nbytes.
455
+ """
456
+ base_events._check_ssl_socket(sock)
457
+ if self._debug and sock.gettimeout() != 0:
458
+ raise ValueError("the socket must be non-blocking")
459
+ try:
460
+ return sock.recvfrom(bufsize)
461
+ except (BlockingIOError, InterruptedError):
462
+ pass
463
+ fut = self.create_future()
464
+ fd = sock.fileno()
465
+ self._ensure_fd_no_transport(fd)
466
+ handle = self._add_reader(fd, self._sock_recvfrom, fut, sock, bufsize)
467
+ fut.add_done_callback(
468
+ functools.partial(self._sock_read_done, fd, handle=handle))
469
+ return await fut
470
+
471
+ def _sock_recvfrom(self, fut, sock, bufsize):
472
+ # _sock_recvfrom() can add itself as an I/O callback if the operation
473
+ # can't be done immediately. Don't use it directly, call
474
+ # sock_recvfrom().
475
+ if fut.done():
476
+ return
477
+ try:
478
+ result = sock.recvfrom(bufsize)
479
+ except (BlockingIOError, InterruptedError):
480
+ return # try again next time
481
+ except (SystemExit, KeyboardInterrupt):
482
+ raise
483
+ except BaseException as exc:
484
+ fut.set_exception(exc)
485
+ else:
486
+ fut.set_result(result)
487
+
488
+ async def sock_recvfrom_into(self, sock, buf, nbytes=0):
489
+ """Receive data from the socket.
490
+
491
+ The received data is written into *buf* (a writable buffer).
492
+ The return value is a tuple of (number of bytes written, address).
493
+ """
494
+ base_events._check_ssl_socket(sock)
495
+ if self._debug and sock.gettimeout() != 0:
496
+ raise ValueError("the socket must be non-blocking")
497
+ if not nbytes:
498
+ nbytes = len(buf)
499
+
500
+ try:
501
+ return sock.recvfrom_into(buf, nbytes)
502
+ except (BlockingIOError, InterruptedError):
503
+ pass
504
+ fut = self.create_future()
505
+ fd = sock.fileno()
506
+ self._ensure_fd_no_transport(fd)
507
+ handle = self._add_reader(fd, self._sock_recvfrom_into, fut, sock, buf,
508
+ nbytes)
509
+ fut.add_done_callback(
510
+ functools.partial(self._sock_read_done, fd, handle=handle))
511
+ return await fut
512
+
513
+ def _sock_recvfrom_into(self, fut, sock, buf, bufsize):
514
+ # _sock_recv_into() can add itself as an I/O callback if the operation
515
+ # can't be done immediately. Don't use it directly, call
516
+ # sock_recv_into().
517
+ if fut.done():
518
+ return
519
+ try:
520
+ result = sock.recvfrom_into(buf, bufsize)
521
+ except (BlockingIOError, InterruptedError):
522
+ return # try again next time
523
+ except (SystemExit, KeyboardInterrupt):
524
+ raise
525
+ except BaseException as exc:
526
+ fut.set_exception(exc)
527
+ else:
528
+ fut.set_result(result)
529
+
530
+ async def sock_sendall(self, sock, data):
531
+ """Send data to the socket.
532
+
533
+ The socket must be connected to a remote socket. This method
534
+ continues to send data from data until either all data has been
535
+ sent or an error occurs. None is returned on success. On error,
536
+ an exception is raised, and there is no way to determine how much
537
+ data, if any, was successfully processed by the receiving end of
538
+ the connection.
539
+ """
540
+ base_events._check_ssl_socket(sock)
541
+ if self._debug and sock.gettimeout() != 0:
542
+ raise ValueError("the socket must be non-blocking")
543
+ try:
544
+ n = sock.send(data)
545
+ except (BlockingIOError, InterruptedError):
546
+ n = 0
547
+
548
+ if n == len(data):
549
+ # all data sent
550
+ return
551
+
552
+ fut = self.create_future()
553
+ fd = sock.fileno()
554
+ self._ensure_fd_no_transport(fd)
555
+ # use a trick with a list in closure to store a mutable state
556
+ handle = self._add_writer(fd, self._sock_sendall, fut, sock,
557
+ memoryview(data), [n])
558
+ fut.add_done_callback(
559
+ functools.partial(self._sock_write_done, fd, handle=handle))
560
+ return await fut
561
+
562
+ def _sock_sendall(self, fut, sock, view, pos):
563
+ if fut.done():
564
+ # Future cancellation can be scheduled on previous loop iteration
565
+ return
566
+ start = pos[0]
567
+ try:
568
+ n = sock.send(view[start:])
569
+ except (BlockingIOError, InterruptedError):
570
+ return
571
+ except (SystemExit, KeyboardInterrupt):
572
+ raise
573
+ except BaseException as exc:
574
+ fut.set_exception(exc)
575
+ return
576
+
577
+ start += n
578
+
579
+ if start == len(view):
580
+ fut.set_result(None)
581
+ else:
582
+ pos[0] = start
583
+
584
+ async def sock_sendto(self, sock, data, address):
585
+ """Send a datagram from sock to address.
586
+
587
+ The socket does not have to be connected. This method sends the
588
+ whole datagram in a single call. Return the number of bytes sent.
589
+ """
590
+ base_events._check_ssl_socket(sock)
591
+ if self._debug and sock.gettimeout() != 0:
592
+ raise ValueError("the socket must be non-blocking")
593
+ try:
594
+ return sock.sendto(data, address)
595
+ except (BlockingIOError, InterruptedError):
596
+ pass
597
+
598
+ fut = self.create_future()
599
+ fd = sock.fileno()
600
+ self._ensure_fd_no_transport(fd)
601
+ # use a trick with a list in closure to store a mutable state
602
+ handle = self._add_writer(fd, self._sock_sendto, fut, sock, data,
603
+ address)
604
+ fut.add_done_callback(
605
+ functools.partial(self._sock_write_done, fd, handle=handle))
606
+ return await fut
607
+
608
+ def _sock_sendto(self, fut, sock, data, address):
609
+ if fut.done():
610
+ # Future cancellation can be scheduled on previous loop iteration
611
+ return
612
+ try:
613
+ n = sock.sendto(data, 0, address)
614
+ except (BlockingIOError, InterruptedError):
615
+ return
616
+ except (SystemExit, KeyboardInterrupt):
617
+ raise
618
+ except BaseException as exc:
619
+ fut.set_exception(exc)
620
+ else:
621
+ fut.set_result(n)
622
+
623
+ async def sock_connect(self, sock, address):
624
+ """Connect to a remote socket at address.
625
+
626
+ This method is a coroutine.
627
+ """
628
+ base_events._check_ssl_socket(sock)
629
+ if self._debug and sock.gettimeout() != 0:
630
+ raise ValueError("the socket must be non-blocking")
631
+
632
+ if sock.family == socket.AF_INET or (
633
+ base_events._HAS_IPv6 and sock.family == socket.AF_INET6):
634
+ resolved = await self._ensure_resolved(
635
+ address, family=sock.family, type=sock.type, proto=sock.proto,
636
+ loop=self,
637
+ )
638
+ _, _, _, _, address = resolved[0]
639
+
640
+ fut = self.create_future()
641
+ self._sock_connect(fut, sock, address)
642
+ try:
643
+ return await fut
644
+ finally:
645
+ # Needed to break cycles when an exception occurs.
646
+ fut = None
647
+
648
+ def _sock_connect(self, fut, sock, address):
649
+ fd = sock.fileno()
650
+ try:
651
+ sock.connect(address)
652
+ except (BlockingIOError, InterruptedError):
653
+ # Issue #23618: When the C function connect() fails with EINTR, the
654
+ # connection runs in background. We have to wait until the socket
655
+ # becomes writable to be notified when the connection succeed or
656
+ # fails.
657
+ self._ensure_fd_no_transport(fd)
658
+ handle = self._add_writer(
659
+ fd, self._sock_connect_cb, fut, sock, address)
660
+ fut.add_done_callback(
661
+ functools.partial(self._sock_write_done, fd, handle=handle))
662
+ except (SystemExit, KeyboardInterrupt):
663
+ raise
664
+ except BaseException as exc:
665
+ fut.set_exception(exc)
666
+ else:
667
+ fut.set_result(None)
668
+ finally:
669
+ fut = None
670
+
671
+ def _sock_write_done(self, fd, fut, handle=None):
672
+ if handle is None or not handle.cancelled():
673
+ self.remove_writer(fd)
674
+
675
+ def _sock_connect_cb(self, fut, sock, address):
676
+ if fut.done():
677
+ return
678
+
679
+ try:
680
+ err = sock.getsockopt(socket.SOL_SOCKET, socket.SO_ERROR)
681
+ if err != 0:
682
+ # Jump to any except clause below.
683
+ raise OSError(err, f'Connect call failed {address}')
684
+ except (BlockingIOError, InterruptedError):
685
+ # socket is still registered, the callback will be retried later
686
+ pass
687
+ except (SystemExit, KeyboardInterrupt):
688
+ raise
689
+ except BaseException as exc:
690
+ fut.set_exception(exc)
691
+ else:
692
+ fut.set_result(None)
693
+ finally:
694
+ fut = None
695
+
696
+ async def sock_accept(self, sock):
697
+ """Accept a connection.
698
+
699
+ The socket must be bound to an address and listening for
700
+ connections. The return value is a pair (conn, address) where
701
+ conn is a new socket object usable to send and receive data on the
702
+ connection, and address is the address bound to the socket on the
703
+ other end of the connection.
704
+ """
705
+ base_events._check_ssl_socket(sock)
706
+ if self._debug and sock.gettimeout() != 0:
707
+ raise ValueError("the socket must be non-blocking")
708
+ fut = self.create_future()
709
+ self._sock_accept(fut, sock)
710
+ return await fut
711
+
712
+ def _sock_accept(self, fut, sock):
713
+ # gh-153761: _sock_accept must not scheduled with already cancelled future
714
+ if fut.done():
715
+ return
716
+ fd = sock.fileno()
717
+ try:
718
+ conn, address = sock.accept()
719
+ conn.setblocking(False)
720
+ except (BlockingIOError, InterruptedError):
721
+ self._ensure_fd_no_transport(fd)
722
+ handle = self._add_reader(fd, self._sock_accept, fut, sock)
723
+ fut.add_done_callback(
724
+ functools.partial(self._sock_read_done, fd, handle=handle))
725
+ except (SystemExit, KeyboardInterrupt):
726
+ raise
727
+ except BaseException as exc:
728
+ fut.set_exception(exc)
729
+ else:
730
+ fut.set_result((conn, address))
731
+
732
+ async def _sendfile_native(self, transp, file, offset, count):
733
+ del self._transports[transp._sock_fd]
734
+ resume_reading = transp.is_reading()
735
+ transp.pause_reading()
736
+ await transp._make_empty_waiter()
737
+ try:
738
+ return await self.sock_sendfile(transp._sock, file, offset, count,
739
+ fallback=False)
740
+ finally:
741
+ transp._reset_empty_waiter()
742
+ if resume_reading:
743
+ transp.resume_reading()
744
+ self._transports[transp._sock_fd] = transp
745
+
746
+ def _process_events(self, event_list):
747
+ for key, mask in event_list:
748
+ fileobj, (reader, writer) = key.fileobj, key.data
749
+ if mask & selectors.EVENT_READ and reader is not None:
750
+ if reader._cancelled:
751
+ self._remove_reader(fileobj)
752
+ else:
753
+ self._add_callback(reader)
754
+ if mask & selectors.EVENT_WRITE and writer is not None:
755
+ if writer._cancelled:
756
+ self._remove_writer(fileobj)
757
+ else:
758
+ self._add_callback(writer)
759
+
760
+ def _stop_serving(self, sock):
761
+ self._remove_reader(sock.fileno())
762
+ sock.close()
763
+
764
+
765
+ class _SelectorTransport(transports._FlowControlMixin,
766
+ transports.Transport):
767
+
768
+ max_size = 256 * 1024 # Buffer size passed to recv().
769
+
770
+ # Attribute used in the destructor: it must be set even if the constructor
771
+ # is not called (see _SelectorSslTransport which may start by raising an
772
+ # exception)
773
+ _sock = None
774
+
775
+ def __init__(self, loop, sock, protocol, extra=None, server=None):
776
+ super().__init__(extra, loop)
777
+ self._extra['socket'] = trsock.TransportSocket(sock)
778
+ try:
779
+ self._extra['sockname'] = sock.getsockname()
780
+ except OSError:
781
+ self._extra['sockname'] = None
782
+ if 'peername' not in self._extra:
783
+ try:
784
+ self._extra['peername'] = sock.getpeername()
785
+ except socket.error:
786
+ self._extra['peername'] = None
787
+ self._sock = sock
788
+ self._sock_fd = sock.fileno()
789
+
790
+ self._protocol_connected = False
791
+ self.set_protocol(protocol)
792
+
793
+ self._server = server
794
+ self._buffer = collections.deque()
795
+ self._conn_lost = 0 # Set when call to connection_lost scheduled.
796
+ self._closing = False # Set when close() called.
797
+ self._paused = False # Set when pause_reading() called
798
+
799
+ if self._server is not None:
800
+ self._server._attach(self)
801
+ loop._transports[self._sock_fd] = self
802
+
803
+ def __repr__(self):
804
+ info = [self.__class__.__name__]
805
+ if self._sock is None:
806
+ info.append('closed')
807
+ elif self._closing:
808
+ info.append('closing')
809
+ info.append(f'fd={self._sock_fd}')
810
+ # test if the transport was closed
811
+ if self._loop is not None and not self._loop.is_closed():
812
+ polling = _test_selector_event(self._loop._selector,
813
+ self._sock_fd, selectors.EVENT_READ)
814
+ if polling:
815
+ info.append('read=polling')
816
+ else:
817
+ info.append('read=idle')
818
+
819
+ polling = _test_selector_event(self._loop._selector,
820
+ self._sock_fd,
821
+ selectors.EVENT_WRITE)
822
+ if polling:
823
+ state = 'polling'
824
+ else:
825
+ state = 'idle'
826
+
827
+ bufsize = self.get_write_buffer_size()
828
+ info.append(f'write=<{state}, bufsize={bufsize}>')
829
+ return '<{}>'.format(' '.join(info))
830
+
831
+ def abort(self):
832
+ self._force_close(None)
833
+
834
+ def set_protocol(self, protocol):
835
+ self._protocol = protocol
836
+ self._protocol_connected = True
837
+
838
+ def get_protocol(self):
839
+ return self._protocol
840
+
841
+ def is_closing(self):
842
+ return self._closing
843
+
844
+ def is_reading(self):
845
+ return not self.is_closing() and not self._paused
846
+
847
+ def pause_reading(self):
848
+ if not self.is_reading():
849
+ return
850
+ self._paused = True
851
+ self._loop._remove_reader(self._sock_fd)
852
+ if self._loop.get_debug():
853
+ logger.debug("%r pauses reading", self)
854
+
855
+ def resume_reading(self):
856
+ if self._closing or not self._paused:
857
+ return
858
+ self._paused = False
859
+ self._add_reader(self._sock_fd, self._read_ready)
860
+ if self._loop.get_debug():
861
+ logger.debug("%r resumes reading", self)
862
+
863
+ def close(self):
864
+ if self._closing:
865
+ return
866
+ self._closing = True
867
+ self._loop._remove_reader(self._sock_fd)
868
+ if not self._buffer:
869
+ self._conn_lost += 1
870
+ self._loop._remove_writer(self._sock_fd)
871
+ self._loop.call_soon(self._call_connection_lost, None)
872
+
873
+ def __del__(self, _warn=warnings.warn):
874
+ if self._sock is not None:
875
+ _warn(f"unclosed transport {self!r}", ResourceWarning, source=self)
876
+ self._sock.close()
877
+ if self._server is not None:
878
+ self._server._detach(self)
879
+
880
+ def _fatal_error(self, exc, message='Fatal error on transport'):
881
+ # Should be called from exception handler only.
882
+ if isinstance(exc, OSError):
883
+ if self._loop.get_debug():
884
+ logger.debug("%r: %s", self, message, exc_info=True)
885
+ else:
886
+ self._loop.call_exception_handler({
887
+ 'message': message,
888
+ 'exception': exc,
889
+ 'transport': self,
890
+ 'protocol': self._protocol,
891
+ })
892
+ self._force_close(exc)
893
+
894
+ def _force_close(self, exc):
895
+ if self._conn_lost:
896
+ return
897
+ if self._buffer:
898
+ self._buffer.clear()
899
+ self._loop._remove_writer(self._sock_fd)
900
+ if not self._closing:
901
+ self._closing = True
902
+ self._loop._remove_reader(self._sock_fd)
903
+ self._conn_lost += 1
904
+ self._loop.call_soon(self._call_connection_lost, exc)
905
+
906
+ def _call_connection_lost(self, exc):
907
+ try:
908
+ if self._protocol_connected:
909
+ self._protocol.connection_lost(exc)
910
+ finally:
911
+ self._sock.close()
912
+ self._sock = None
913
+ self._protocol = None
914
+ self._loop = None
915
+ server = self._server
916
+ if server is not None:
917
+ server._detach(self)
918
+ self._server = None
919
+
920
+ def get_write_buffer_size(self):
921
+ return sum(map(len, self._buffer))
922
+
923
+ def _add_reader(self, fd, callback, *args):
924
+ if not self.is_reading():
925
+ return
926
+ self._loop._add_reader(fd, callback, *args)
927
+
928
+
929
+ class _SelectorSocketTransport(_SelectorTransport):
930
+
931
+ _start_tls_compatible = True
932
+ _sendfile_compatible = constants._SendfileMode.TRY_NATIVE
933
+
934
+ def __init__(self, loop, sock, protocol, waiter=None,
935
+ extra=None, server=None):
936
+
937
+ self._read_ready_cb = None
938
+ super().__init__(loop, sock, protocol, extra, server)
939
+ self._eof = False
940
+ self._empty_waiter = None
941
+ if _HAS_SENDMSG:
942
+ self._write_ready = self._write_sendmsg
943
+ else:
944
+ self._write_ready = self._write_send
945
+ # Disable the Nagle algorithm -- small writes will be
946
+ # sent without waiting for the TCP ACK. This generally
947
+ # decreases the latency (in some cases significantly.)
948
+ base_events._set_nodelay(self._sock)
949
+
950
+ self._loop.call_soon(self._protocol.connection_made, self)
951
+ # only start reading when connection_made() has been called
952
+ self._loop.call_soon(self._add_reader,
953
+ self._sock_fd, self._read_ready)
954
+ if waiter is not None:
955
+ # only wake up the waiter when connection_made() has been called
956
+ self._loop.call_soon(futures._set_result_unless_cancelled,
957
+ waiter, None)
958
+
959
+ def set_protocol(self, protocol):
960
+ if isinstance(protocol, protocols.BufferedProtocol):
961
+ self._read_ready_cb = self._read_ready__get_buffer
962
+ else:
963
+ self._read_ready_cb = self._read_ready__data_received
964
+
965
+ super().set_protocol(protocol)
966
+
967
+ def _read_ready(self):
968
+ self._read_ready_cb()
969
+
970
+ def _read_ready__get_buffer(self):
971
+ if self._conn_lost:
972
+ return
973
+
974
+ try:
975
+ buf = self._protocol.get_buffer(-1)
976
+ if not len(buf):
977
+ raise RuntimeError('get_buffer() returned an empty buffer')
978
+ except (SystemExit, KeyboardInterrupt):
979
+ raise
980
+ except BaseException as exc:
981
+ self._fatal_error(
982
+ exc, 'Fatal error: protocol.get_buffer() call failed.')
983
+ return
984
+
985
+ try:
986
+ nbytes = self._sock.recv_into(buf)
987
+ except (BlockingIOError, InterruptedError):
988
+ return
989
+ except (SystemExit, KeyboardInterrupt):
990
+ raise
991
+ except BaseException as exc:
992
+ self._fatal_error(exc, 'Fatal read error on socket transport')
993
+ return
994
+
995
+ if not nbytes:
996
+ self._read_ready__on_eof()
997
+ return
998
+
999
+ try:
1000
+ self._protocol.buffer_updated(nbytes)
1001
+ except (SystemExit, KeyboardInterrupt):
1002
+ raise
1003
+ except BaseException as exc:
1004
+ self._fatal_error(
1005
+ exc, 'Fatal error: protocol.buffer_updated() call failed.')
1006
+
1007
+ def _read_ready__data_received(self):
1008
+ if self._conn_lost:
1009
+ return
1010
+ try:
1011
+ data = self._sock.recv(self.max_size)
1012
+ except (BlockingIOError, InterruptedError):
1013
+ return
1014
+ except (SystemExit, KeyboardInterrupt):
1015
+ raise
1016
+ except BaseException as exc:
1017
+ self._fatal_error(exc, 'Fatal read error on socket transport')
1018
+ return
1019
+
1020
+ if not data:
1021
+ self._read_ready__on_eof()
1022
+ return
1023
+
1024
+ try:
1025
+ self._protocol.data_received(data)
1026
+ except (SystemExit, KeyboardInterrupt):
1027
+ raise
1028
+ except BaseException as exc:
1029
+ self._fatal_error(
1030
+ exc, 'Fatal error: protocol.data_received() call failed.')
1031
+
1032
+ def _read_ready__on_eof(self):
1033
+ if self._loop.get_debug():
1034
+ logger.debug("%r received EOF", self)
1035
+
1036
+ try:
1037
+ keep_open = self._protocol.eof_received()
1038
+ except (SystemExit, KeyboardInterrupt):
1039
+ raise
1040
+ except BaseException as exc:
1041
+ self._fatal_error(
1042
+ exc, 'Fatal error: protocol.eof_received() call failed.')
1043
+ return
1044
+
1045
+ if keep_open:
1046
+ # We're keeping the connection open so the
1047
+ # protocol can write more, but we still can't
1048
+ # receive more, so remove the reader callback.
1049
+ self._loop._remove_reader(self._sock_fd)
1050
+ else:
1051
+ self.close()
1052
+
1053
+ def write(self, data):
1054
+ if not isinstance(data, (bytes, bytearray, memoryview)):
1055
+ raise TypeError(f'data argument must be a bytes, bytearray, or memoryview '
1056
+ f'object, not {type(data).__name__!r}')
1057
+ if self._eof:
1058
+ raise RuntimeError('Cannot call write() after write_eof()')
1059
+ if self._empty_waiter is not None:
1060
+ raise RuntimeError('unable to write; sendfile is in progress')
1061
+ if not data:
1062
+ return
1063
+
1064
+ if self._conn_lost:
1065
+ if self._conn_lost >= constants.LOG_THRESHOLD_FOR_CONNLOST_WRITES:
1066
+ logger.warning('socket.send() raised exception.')
1067
+ self._conn_lost += 1
1068
+ return
1069
+
1070
+ if not self._buffer:
1071
+ # Optimization: try to send now.
1072
+ try:
1073
+ n = self._sock.send(data)
1074
+ except (BlockingIOError, InterruptedError):
1075
+ pass
1076
+ except (SystemExit, KeyboardInterrupt):
1077
+ raise
1078
+ except BaseException as exc:
1079
+ self._fatal_error(exc, 'Fatal write error on socket transport')
1080
+ return
1081
+ else:
1082
+ data = memoryview(data)[n:]
1083
+ if not data:
1084
+ return
1085
+ # Not all was written; register write handler.
1086
+ self._loop._add_writer(self._sock_fd, self._write_ready)
1087
+
1088
+ # Add it to the buffer.
1089
+ self._buffer.append(data)
1090
+ self._maybe_pause_protocol()
1091
+
1092
+ def _get_sendmsg_buffer(self):
1093
+ return itertools.islice(self._buffer, SC_IOV_MAX)
1094
+
1095
+ def _write_sendmsg(self):
1096
+ assert self._buffer, 'Data should not be empty'
1097
+ if self._conn_lost:
1098
+ return
1099
+ try:
1100
+ nbytes = self._sock.sendmsg(self._get_sendmsg_buffer())
1101
+ self._adjust_leftover_buffer(nbytes)
1102
+ except (BlockingIOError, InterruptedError):
1103
+ pass
1104
+ except (SystemExit, KeyboardInterrupt):
1105
+ raise
1106
+ except BaseException as exc:
1107
+ self._loop._remove_writer(self._sock_fd)
1108
+ self._buffer.clear()
1109
+ self._fatal_error(exc, 'Fatal write error on socket transport')
1110
+ if self._empty_waiter is not None:
1111
+ self._empty_waiter.set_exception(exc)
1112
+ else:
1113
+ self._maybe_resume_protocol() # May append to buffer.
1114
+ if not self._buffer:
1115
+ self._loop._remove_writer(self._sock_fd)
1116
+ if self._empty_waiter is not None:
1117
+ self._empty_waiter.set_result(None)
1118
+ if self._closing:
1119
+ self._call_connection_lost(None)
1120
+ elif self._eof:
1121
+ self._sock.shutdown(socket.SHUT_WR)
1122
+
1123
+ def _adjust_leftover_buffer(self, nbytes: int) -> None:
1124
+ buffer = self._buffer
1125
+ while nbytes:
1126
+ b = buffer.popleft()
1127
+ b_len = len(b)
1128
+ if b_len <= nbytes:
1129
+ nbytes -= b_len
1130
+ else:
1131
+ buffer.appendleft(b[nbytes:])
1132
+ break
1133
+
1134
+ def _write_send(self):
1135
+ assert self._buffer, 'Data should not be empty'
1136
+ if self._conn_lost:
1137
+ return
1138
+ try:
1139
+ buffer = self._buffer.popleft()
1140
+ n = self._sock.send(buffer)
1141
+ if n != len(buffer):
1142
+ # Not all data was written
1143
+ self._buffer.appendleft(buffer[n:])
1144
+ except (BlockingIOError, InterruptedError):
1145
+ pass
1146
+ except (SystemExit, KeyboardInterrupt):
1147
+ raise
1148
+ except BaseException as exc:
1149
+ self._loop._remove_writer(self._sock_fd)
1150
+ self._buffer.clear()
1151
+ self._fatal_error(exc, 'Fatal write error on socket transport')
1152
+ if self._empty_waiter is not None:
1153
+ self._empty_waiter.set_exception(exc)
1154
+ else:
1155
+ self._maybe_resume_protocol() # May append to buffer.
1156
+ if not self._buffer:
1157
+ self._loop._remove_writer(self._sock_fd)
1158
+ if self._empty_waiter is not None:
1159
+ self._empty_waiter.set_result(None)
1160
+ if self._closing:
1161
+ self._call_connection_lost(None)
1162
+ elif self._eof:
1163
+ self._sock.shutdown(socket.SHUT_WR)
1164
+
1165
+ def write_eof(self):
1166
+ if self._closing or self._eof:
1167
+ return
1168
+ self._eof = True
1169
+ if not self._buffer:
1170
+ self._sock.shutdown(socket.SHUT_WR)
1171
+
1172
+ def writelines(self, list_of_data):
1173
+ if self._eof:
1174
+ raise RuntimeError('Cannot call writelines() after write_eof()')
1175
+ if self._empty_waiter is not None:
1176
+ raise RuntimeError('unable to writelines; sendfile is in progress')
1177
+ if not list_of_data:
1178
+ return
1179
+
1180
+ if self._conn_lost:
1181
+ if self._conn_lost >= constants.LOG_THRESHOLD_FOR_CONNLOST_WRITES:
1182
+ logger.warning('socket.send() raised exception.')
1183
+ self._conn_lost += 1
1184
+ return
1185
+
1186
+ self._buffer.extend([memoryview(data) for data in list_of_data])
1187
+ self._write_ready()
1188
+ # If the entire buffer couldn't be written, register a write handler
1189
+ if self._buffer:
1190
+ self._loop._add_writer(self._sock_fd, self._write_ready)
1191
+ self._maybe_pause_protocol()
1192
+
1193
+ def can_write_eof(self):
1194
+ return True
1195
+
1196
+ def _call_connection_lost(self, exc):
1197
+ try:
1198
+ super()._call_connection_lost(exc)
1199
+ finally:
1200
+ self._write_ready = None
1201
+ if self._empty_waiter is not None:
1202
+ self._empty_waiter.set_exception(
1203
+ ConnectionError("Connection is closed by peer"))
1204
+
1205
+ def _make_empty_waiter(self):
1206
+ if self._empty_waiter is not None:
1207
+ raise RuntimeError("Empty waiter is already set")
1208
+ self._empty_waiter = self._loop.create_future()
1209
+ if not self._buffer:
1210
+ self._empty_waiter.set_result(None)
1211
+ return self._empty_waiter
1212
+
1213
+ def _reset_empty_waiter(self):
1214
+ self._empty_waiter = None
1215
+
1216
+ def close(self):
1217
+ self._read_ready_cb = None
1218
+ super().close()
1219
+
1220
+
1221
+ class _SelectorDatagramTransport(_SelectorTransport, transports.DatagramTransport):
1222
+
1223
+ _buffer_factory = collections.deque
1224
+ _header_size = 8
1225
+
1226
+ def __init__(self, loop, sock, protocol, address=None,
1227
+ waiter=None, extra=None):
1228
+ super().__init__(loop, sock, protocol, extra)
1229
+ self._address = address
1230
+ self._buffer_size = 0
1231
+ self._loop.call_soon(self._protocol.connection_made, self)
1232
+ # only start reading when connection_made() has been called
1233
+ self._loop.call_soon(self._add_reader,
1234
+ self._sock_fd, self._read_ready)
1235
+ if waiter is not None:
1236
+ # only wake up the waiter when connection_made() has been called
1237
+ self._loop.call_soon(futures._set_result_unless_cancelled,
1238
+ waiter, None)
1239
+
1240
+ def get_write_buffer_size(self):
1241
+ return self._buffer_size
1242
+
1243
+ def _read_ready(self):
1244
+ if self._conn_lost:
1245
+ return
1246
+ try:
1247
+ data, addr = self._sock.recvfrom(self.max_size)
1248
+ except (BlockingIOError, InterruptedError):
1249
+ pass
1250
+ except OSError as exc:
1251
+ self._protocol.error_received(exc)
1252
+ except (SystemExit, KeyboardInterrupt):
1253
+ raise
1254
+ except BaseException as exc:
1255
+ self._fatal_error(exc, 'Fatal read error on datagram transport')
1256
+ else:
1257
+ self._protocol.datagram_received(data, addr)
1258
+
1259
+ def sendto(self, data, addr=None):
1260
+ if not isinstance(data, (bytes, bytearray, memoryview)):
1261
+ raise TypeError(f'data argument must be a bytes-like object, '
1262
+ f'not {type(data).__name__!r}')
1263
+
1264
+ if self._address:
1265
+ if addr not in (None, self._address):
1266
+ raise ValueError(
1267
+ f'Invalid address: must be None or {self._address}')
1268
+ addr = self._address
1269
+
1270
+ if self._conn_lost and self._address:
1271
+ if self._conn_lost >= constants.LOG_THRESHOLD_FOR_CONNLOST_WRITES:
1272
+ logger.warning('socket.send() raised exception.')
1273
+ self._conn_lost += 1
1274
+ return
1275
+
1276
+ if not self._buffer:
1277
+ # Attempt to send it right away first.
1278
+ try:
1279
+ if self._extra['peername']:
1280
+ self._sock.send(data)
1281
+ else:
1282
+ self._sock.sendto(data, addr)
1283
+ return
1284
+ except (BlockingIOError, InterruptedError):
1285
+ self._loop._add_writer(self._sock_fd, self._sendto_ready)
1286
+ except OSError as exc:
1287
+ self._protocol.error_received(exc)
1288
+ return
1289
+ except (SystemExit, KeyboardInterrupt):
1290
+ raise
1291
+ except BaseException as exc:
1292
+ self._fatal_error(
1293
+ exc, 'Fatal write error on datagram transport')
1294
+ return
1295
+
1296
+ # Ensure that what we buffer is immutable.
1297
+ self._buffer.append((bytes(data), addr))
1298
+ self._buffer_size += len(data) + self._header_size
1299
+ self._maybe_pause_protocol()
1300
+
1301
+ def _sendto_ready(self):
1302
+ while self._buffer:
1303
+ data, addr = self._buffer.popleft()
1304
+ self._buffer_size -= len(data) + self._header_size
1305
+ try:
1306
+ if self._extra['peername']:
1307
+ self._sock.send(data)
1308
+ else:
1309
+ self._sock.sendto(data, addr)
1310
+ except (BlockingIOError, InterruptedError):
1311
+ self._buffer.appendleft((data, addr)) # Try again later.
1312
+ self._buffer_size += len(data) + self._header_size
1313
+ break
1314
+ except OSError as exc:
1315
+ self._protocol.error_received(exc)
1316
+ return
1317
+ except (SystemExit, KeyboardInterrupt):
1318
+ raise
1319
+ except BaseException as exc:
1320
+ self._fatal_error(
1321
+ exc, 'Fatal write error on datagram transport')
1322
+ return
1323
+
1324
+ self._maybe_resume_protocol() # May append to buffer.
1325
+ if not self._buffer:
1326
+ self._loop._remove_writer(self._sock_fd)
1327
+ if self._closing:
1328
+ self._call_connection_lost(None)