@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,1396 @@
1
+ """Configuration file parser.
2
+
3
+ A configuration file consists of sections, lead by a "[section]" header,
4
+ and followed by "name: value" entries, with continuations and such in
5
+ the style of RFC 822.
6
+
7
+ Intrinsic defaults can be specified by passing them into the
8
+ ConfigParser constructor as a dictionary.
9
+
10
+ class:
11
+
12
+ ConfigParser -- responsible for parsing a list of
13
+ configuration files, and managing the parsed database.
14
+
15
+ methods:
16
+
17
+ __init__(defaults=None, dict_type=_default_dict, allow_no_value=False,
18
+ delimiters=('=', ':'), comment_prefixes=('#', ';'),
19
+ inline_comment_prefixes=None, strict=True,
20
+ empty_lines_in_values=True, default_section='DEFAULT',
21
+ interpolation=<unset>, converters=<unset>,
22
+ allow_unnamed_section=False):
23
+ Create the parser. When `defaults` is given, it is initialized into the
24
+ dictionary or intrinsic defaults. The keys must be strings, the values
25
+ must be appropriate for %()s string interpolation.
26
+
27
+ When `dict_type` is given, it will be used to create the dictionary
28
+ objects for the list of sections, for the options within a section, and
29
+ for the default values.
30
+
31
+ When `delimiters` is given, it will be used as the set of substrings
32
+ that divide keys from values.
33
+
34
+ When `comment_prefixes` is given, it will be used as the set of
35
+ substrings that prefix comments in empty lines. Comments can be
36
+ indented.
37
+
38
+ When `inline_comment_prefixes` is given, it will be used as the set of
39
+ substrings that prefix comments in non-empty lines.
40
+
41
+ When `strict` is True, the parser won't allow for any section or option
42
+ duplicates while reading from a single source (file, string or
43
+ dictionary). Default is True.
44
+
45
+ When `empty_lines_in_values` is False (default: True), each empty line
46
+ marks the end of an option. Otherwise, internal empty lines of
47
+ a multiline option are kept as part of the value.
48
+
49
+ When `allow_no_value` is True (default: False), options without
50
+ values are accepted; the value presented for these is None.
51
+
52
+ When `default_section` is given, the name of the special section is
53
+ named accordingly. By default it is called ``"DEFAULT"`` but this can
54
+ be customized to point to any other valid section name. Its current
55
+ value can be retrieved using the ``parser_instance.default_section``
56
+ attribute and may be modified at runtime.
57
+
58
+ When `interpolation` is given, it should be an Interpolation subclass
59
+ instance. It will be used as the handler for option value
60
+ pre-processing when using getters. RawConfigParser objects don't do
61
+ any sort of interpolation, whereas ConfigParser uses an instance of
62
+ BasicInterpolation. The library also provides a ``zc.buildout``
63
+ inspired ExtendedInterpolation implementation.
64
+
65
+ When `converters` is given, it should be a dictionary where each key
66
+ represents the name of a type converter and each value is a callable
67
+ implementing the conversion from string to the desired datatype. Every
68
+ converter gets its corresponding get*() method on the parser object and
69
+ section proxies.
70
+
71
+ When `allow_unnamed_section` is True (default: False), options
72
+ without section are accepted: the section for these is
73
+ ``configparser.UNNAMED_SECTION``.
74
+
75
+ sections()
76
+ Return all the configuration section names, sans DEFAULT.
77
+
78
+ has_section(section)
79
+ Return whether the given section exists.
80
+
81
+ has_option(section, option)
82
+ Return whether the given option exists in the given section.
83
+
84
+ options(section)
85
+ Return list of configuration options for the named section.
86
+
87
+ read(filenames, encoding=None)
88
+ Read and parse the iterable of named configuration files, given by
89
+ name. A single filename is also allowed. Non-existing files
90
+ are ignored. Return list of successfully read files.
91
+
92
+ read_file(f, filename=None)
93
+ Read and parse one configuration file, given as a file object.
94
+ The filename defaults to f.name; it is only used in error
95
+ messages (if f has no `name` attribute, the string `<???>` is used).
96
+
97
+ read_string(string)
98
+ Read configuration from a given string.
99
+
100
+ read_dict(dictionary)
101
+ Read configuration from a dictionary. Keys are section names,
102
+ values are dictionaries with keys and values that should be present
103
+ in the section. If the used dictionary type preserves order, sections
104
+ and their keys will be added in order. Values are automatically
105
+ converted to strings.
106
+
107
+ get(section, option, raw=False, vars=None, fallback=_UNSET)
108
+ Return a string value for the named option. All % interpolations are
109
+ expanded in the return values, based on the defaults passed into the
110
+ constructor and the DEFAULT section. Additional substitutions may be
111
+ provided using the `vars` argument, which must be a dictionary whose
112
+ contents override any pre-existing defaults. If `option` is a key in
113
+ `vars`, the value from `vars` is used.
114
+
115
+ getint(section, options, raw=False, vars=None, fallback=_UNSET)
116
+ Like get(), but convert value to an integer.
117
+
118
+ getfloat(section, options, raw=False, vars=None, fallback=_UNSET)
119
+ Like get(), but convert value to a float.
120
+
121
+ getboolean(section, options, raw=False, vars=None, fallback=_UNSET)
122
+ Like get(), but convert value to a boolean (currently case
123
+ insensitively defined as 0, false, no, off for False, and 1, true,
124
+ yes, on for True). Returns False or True.
125
+
126
+ items(section=_UNSET, raw=False, vars=None)
127
+ If section is given, return a list of tuples with (name, value) for
128
+ each option in the section. Otherwise, return a list of tuples with
129
+ (section_name, section_proxy) for each section, including DEFAULTSECT.
130
+
131
+ remove_section(section)
132
+ Remove the given file section and all its options.
133
+
134
+ remove_option(section, option)
135
+ Remove the given option from the given section.
136
+
137
+ set(section, option, value)
138
+ Set the given option.
139
+
140
+ write(fp, space_around_delimiters=True)
141
+ Write the configuration state in .ini format. If
142
+ `space_around_delimiters` is True (the default), delimiters
143
+ between keys and values are surrounded by spaces.
144
+ """
145
+
146
+ # Do not import dataclasses; overhead is unacceptable (gh-117703)
147
+
148
+ from collections.abc import Iterable, MutableMapping
149
+ from collections import ChainMap as _ChainMap
150
+ import contextlib
151
+ import functools
152
+ import io
153
+ import itertools
154
+ import os
155
+ import re
156
+ import sys
157
+ import types
158
+
159
+ __all__ = ("NoSectionError", "DuplicateOptionError", "DuplicateSectionError",
160
+ "NoOptionError", "InterpolationError", "InterpolationDepthError",
161
+ "InterpolationMissingOptionError", "InterpolationSyntaxError",
162
+ "ParsingError", "MissingSectionHeaderError",
163
+ "MultilineContinuationError",
164
+ "ConfigParser", "RawConfigParser",
165
+ "Interpolation", "BasicInterpolation", "ExtendedInterpolation",
166
+ "SectionProxy", "ConverterMapping",
167
+ "DEFAULTSECT", "MAX_INTERPOLATION_DEPTH", "UNNAMED_SECTION")
168
+
169
+ _default_dict = dict
170
+ DEFAULTSECT = "DEFAULT"
171
+
172
+ MAX_INTERPOLATION_DEPTH = 10
173
+
174
+
175
+
176
+ # exception classes
177
+ class Error(Exception):
178
+ """Base class for ConfigParser exceptions."""
179
+
180
+ def __init__(self, msg=''):
181
+ self.message = msg
182
+ Exception.__init__(self, msg)
183
+
184
+ def __repr__(self):
185
+ return self.message
186
+
187
+ __str__ = __repr__
188
+
189
+
190
+ class NoSectionError(Error):
191
+ """Raised when no section matches a requested option."""
192
+
193
+ def __init__(self, section):
194
+ Error.__init__(self, 'No section: %r' % (section,))
195
+ self.section = section
196
+ self.args = (section, )
197
+
198
+
199
+ class DuplicateSectionError(Error):
200
+ """Raised when a section is repeated in an input source.
201
+
202
+ Possible repetitions that raise this exception are: multiple creation
203
+ using the API or in strict parsers when a section is found more than once
204
+ in a single input file, string or dictionary.
205
+ """
206
+
207
+ def __init__(self, section, source=None, lineno=None):
208
+ msg = [repr(section), " already exists"]
209
+ if source is not None:
210
+ message = ["While reading from ", repr(source)]
211
+ if lineno is not None:
212
+ message.append(" [line {0:2d}]".format(lineno))
213
+ message.append(": section ")
214
+ message.extend(msg)
215
+ msg = message
216
+ else:
217
+ msg.insert(0, "Section ")
218
+ Error.__init__(self, "".join(msg))
219
+ self.section = section
220
+ self.source = source
221
+ self.lineno = lineno
222
+ self.args = (section, source, lineno)
223
+
224
+
225
+ class DuplicateOptionError(Error):
226
+ """Raised by strict parsers when an option is repeated in an input source.
227
+
228
+ Current implementation raises this exception only when an option is found
229
+ more than once in a single file, string or dictionary.
230
+ """
231
+
232
+ def __init__(self, section, option, source=None, lineno=None):
233
+ msg = [repr(option), " in section ", repr(section),
234
+ " already exists"]
235
+ if source is not None:
236
+ message = ["While reading from ", repr(source)]
237
+ if lineno is not None:
238
+ message.append(" [line {0:2d}]".format(lineno))
239
+ message.append(": option ")
240
+ message.extend(msg)
241
+ msg = message
242
+ else:
243
+ msg.insert(0, "Option ")
244
+ Error.__init__(self, "".join(msg))
245
+ self.section = section
246
+ self.option = option
247
+ self.source = source
248
+ self.lineno = lineno
249
+ self.args = (section, option, source, lineno)
250
+
251
+
252
+ class NoOptionError(Error):
253
+ """A requested option was not found."""
254
+
255
+ def __init__(self, option, section):
256
+ Error.__init__(self, "No option %r in section: %r" %
257
+ (option, section))
258
+ self.option = option
259
+ self.section = section
260
+ self.args = (option, section)
261
+
262
+
263
+ class InterpolationError(Error):
264
+ """Base class for interpolation-related exceptions."""
265
+
266
+ def __init__(self, option, section, msg):
267
+ Error.__init__(self, msg)
268
+ self.option = option
269
+ self.section = section
270
+ self.args = (option, section, msg)
271
+
272
+
273
+ class InterpolationMissingOptionError(InterpolationError):
274
+ """A string substitution required a setting which was not available."""
275
+
276
+ def __init__(self, option, section, rawval, reference):
277
+ msg = ("Bad value substitution: option {!r} in section {!r} contains "
278
+ "an interpolation key {!r} which is not a valid option name. "
279
+ "Raw value: {!r}".format(option, section, reference, rawval))
280
+ InterpolationError.__init__(self, option, section, msg)
281
+ self.reference = reference
282
+ self.args = (option, section, rawval, reference)
283
+
284
+
285
+ class InterpolationSyntaxError(InterpolationError):
286
+ """Raised when the source text contains invalid syntax.
287
+
288
+ Current implementation raises this exception when the source text into
289
+ which substitutions are made does not conform to the required syntax.
290
+ """
291
+
292
+
293
+ class InterpolationDepthError(InterpolationError):
294
+ """Raised when substitutions are nested too deeply."""
295
+
296
+ def __init__(self, option, section, rawval):
297
+ msg = ("Recursion limit exceeded in value substitution: option {!r} "
298
+ "in section {!r} contains an interpolation key which "
299
+ "cannot be substituted in {} steps. Raw value: {!r}"
300
+ "".format(option, section, MAX_INTERPOLATION_DEPTH,
301
+ rawval))
302
+ InterpolationError.__init__(self, option, section, msg)
303
+ self.args = (option, section, rawval)
304
+
305
+
306
+ class ParsingError(Error):
307
+ """Raised when a configuration file does not follow legal syntax."""
308
+
309
+ def __init__(self, source, *args):
310
+ super().__init__(f'Source contains parsing errors: {source!r}')
311
+ self.source = source
312
+ self.errors = []
313
+ self.args = (source, )
314
+ if args:
315
+ self.append(*args)
316
+
317
+ def append(self, lineno, line):
318
+ self.errors.append((lineno, line))
319
+ self.message += f'\n\t[line {lineno:2d}]: {line!r}'
320
+
321
+ def combine(self, others):
322
+ messages = [self.message]
323
+ for other in others:
324
+ for lineno, line in other.errors:
325
+ self.errors.append((lineno, line))
326
+ messages.append(f'\n\t[line {lineno:2d}]: {line!r}')
327
+ self.message = "".join(messages)
328
+ return self
329
+
330
+ @staticmethod
331
+ def _raise_all(exceptions: Iterable['ParsingError']):
332
+ """
333
+ Combine any number of ParsingErrors into one and raise it.
334
+ """
335
+ exceptions = iter(exceptions)
336
+ with contextlib.suppress(StopIteration):
337
+ raise next(exceptions).combine(exceptions)
338
+
339
+
340
+
341
+ class MissingSectionHeaderError(ParsingError):
342
+ """Raised when a key-value pair is found before any section header."""
343
+
344
+ def __init__(self, filename, lineno, line):
345
+ Error.__init__(
346
+ self,
347
+ 'File contains no section headers.\nfile: %r, line: %d\n%r' %
348
+ (filename, lineno, line))
349
+ self.source = filename
350
+ self.lineno = lineno
351
+ self.line = line
352
+ self.args = (filename, lineno, line)
353
+
354
+
355
+ class MultilineContinuationError(ParsingError):
356
+ """Raised when a key without value is followed by continuation line"""
357
+ def __init__(self, filename, lineno, line):
358
+ Error.__init__(
359
+ self,
360
+ "Key without value continued with an indented line.\n"
361
+ "file: %r, line: %d\n%r"
362
+ %(filename, lineno, line))
363
+ self.source = filename
364
+ self.lineno = lineno
365
+ self.line = line
366
+ self.args = (filename, lineno, line)
367
+
368
+ class _UnnamedSection:
369
+
370
+ def __repr__(self):
371
+ return "<UNNAMED_SECTION>"
372
+
373
+
374
+ UNNAMED_SECTION = _UnnamedSection()
375
+
376
+
377
+ # Used in parser getters to indicate the default behaviour when a specific
378
+ # option is not found it to raise an exception. Created to enable `None` as
379
+ # a valid fallback value.
380
+ _UNSET = object()
381
+
382
+
383
+ class Interpolation:
384
+ """Dummy interpolation that passes the value through with no changes."""
385
+
386
+ def before_get(self, parser, section, option, value, defaults):
387
+ return value
388
+
389
+ def before_set(self, parser, section, option, value):
390
+ return value
391
+
392
+ def before_read(self, parser, section, option, value):
393
+ return value
394
+
395
+ def before_write(self, parser, section, option, value):
396
+ return value
397
+
398
+
399
+ class BasicInterpolation(Interpolation):
400
+ """Interpolation as implemented in the classic ConfigParser.
401
+
402
+ The option values can contain format strings which refer to other values in
403
+ the same section, or values in the special default section.
404
+
405
+ For example:
406
+
407
+ something: %(dir)s/whatever
408
+
409
+ would resolve the "%(dir)s" to the value of dir. All reference
410
+ expansions are done late, on demand. If a user needs to use a bare % in
411
+ a configuration file, she can escape it by writing %%. Other % usage
412
+ is considered a user error and raises `InterpolationSyntaxError`."""
413
+
414
+ _KEYCRE = re.compile(r"%\(([^)]+)\)s")
415
+
416
+ def before_get(self, parser, section, option, value, defaults):
417
+ L = []
418
+ self._interpolate_some(parser, option, L, value, section, defaults, 1)
419
+ return ''.join(L)
420
+
421
+ def before_set(self, parser, section, option, value):
422
+ tmp_value = value.replace('%%', '') # escaped percent signs
423
+ tmp_value = self._KEYCRE.sub('', tmp_value) # valid syntax
424
+ if '%' in tmp_value:
425
+ raise ValueError("invalid interpolation syntax in %r at "
426
+ "position %d" % (value, tmp_value.find('%')))
427
+ return value
428
+
429
+ def _interpolate_some(self, parser, option, accum, rest, section, map,
430
+ depth):
431
+ rawval = parser.get(section, option, raw=True, fallback=rest)
432
+ if depth > MAX_INTERPOLATION_DEPTH:
433
+ raise InterpolationDepthError(option, section, rawval)
434
+ while rest:
435
+ p = rest.find("%")
436
+ if p < 0:
437
+ accum.append(rest)
438
+ return
439
+ if p > 0:
440
+ accum.append(rest[:p])
441
+ rest = rest[p:]
442
+ # p is no longer used
443
+ c = rest[1:2]
444
+ if c == "%":
445
+ accum.append("%")
446
+ rest = rest[2:]
447
+ elif c == "(":
448
+ m = self._KEYCRE.match(rest)
449
+ if m is None:
450
+ raise InterpolationSyntaxError(option, section,
451
+ "bad interpolation variable reference %r" % rest)
452
+ var = parser.optionxform(m.group(1))
453
+ rest = rest[m.end():]
454
+ try:
455
+ v = map[var]
456
+ except KeyError:
457
+ raise InterpolationMissingOptionError(
458
+ option, section, rawval, var) from None
459
+ if "%" in v:
460
+ self._interpolate_some(parser, option, accum, v,
461
+ section, map, depth + 1)
462
+ else:
463
+ accum.append(v)
464
+ else:
465
+ raise InterpolationSyntaxError(
466
+ option, section,
467
+ "'%%' must be followed by '%%' or '(', "
468
+ "found: %r" % (rest,))
469
+
470
+
471
+ class ExtendedInterpolation(Interpolation):
472
+ """Advanced variant of interpolation, supports the syntax used by
473
+ `zc.buildout`. Enables interpolation between sections."""
474
+
475
+ _KEYCRE = re.compile(r"\$\{([^}]+)\}")
476
+
477
+ def before_get(self, parser, section, option, value, defaults):
478
+ L = []
479
+ self._interpolate_some(parser, option, L, value, section, defaults, 1)
480
+ return ''.join(L)
481
+
482
+ def before_set(self, parser, section, option, value):
483
+ tmp_value = value.replace('$$', '') # escaped dollar signs
484
+ tmp_value = self._KEYCRE.sub('', tmp_value) # valid syntax
485
+ if '$' in tmp_value:
486
+ raise ValueError("invalid interpolation syntax in %r at "
487
+ "position %d" % (value, tmp_value.find('$')))
488
+ return value
489
+
490
+ def _interpolate_some(self, parser, option, accum, rest, section, map,
491
+ depth):
492
+ rawval = parser.get(section, option, raw=True, fallback=rest)
493
+ if depth > MAX_INTERPOLATION_DEPTH:
494
+ raise InterpolationDepthError(option, section, rawval)
495
+ while rest:
496
+ p = rest.find("$")
497
+ if p < 0:
498
+ accum.append(rest)
499
+ return
500
+ if p > 0:
501
+ accum.append(rest[:p])
502
+ rest = rest[p:]
503
+ # p is no longer used
504
+ c = rest[1:2]
505
+ if c == "$":
506
+ accum.append("$")
507
+ rest = rest[2:]
508
+ elif c == "{":
509
+ m = self._KEYCRE.match(rest)
510
+ if m is None:
511
+ raise InterpolationSyntaxError(option, section,
512
+ "bad interpolation variable reference %r" % rest)
513
+ path = m.group(1).split(':')
514
+ rest = rest[m.end():]
515
+ sect = section
516
+ opt = option
517
+ try:
518
+ if len(path) == 1:
519
+ opt = parser.optionxform(path[0])
520
+ v = map[opt]
521
+ elif len(path) == 2:
522
+ sect = path[0]
523
+ opt = parser.optionxform(path[1])
524
+ v = parser.get(sect, opt, raw=True)
525
+ else:
526
+ raise InterpolationSyntaxError(
527
+ option, section,
528
+ "More than one ':' found: %r" % (rest,))
529
+ except (KeyError, NoSectionError, NoOptionError):
530
+ raise InterpolationMissingOptionError(
531
+ option, section, rawval, ":".join(path)) from None
532
+ if v is None:
533
+ continue
534
+ if "$" in v:
535
+ self._interpolate_some(parser, opt, accum, v, sect,
536
+ dict(parser.items(sect, raw=True)),
537
+ depth + 1)
538
+ else:
539
+ accum.append(v)
540
+ else:
541
+ raise InterpolationSyntaxError(
542
+ option, section,
543
+ "'$' must be followed by '$' or '{', "
544
+ "found: %r" % (rest,))
545
+
546
+
547
+ class _ReadState:
548
+ elements_added : set[str]
549
+ cursect : dict[str, str] | None = None
550
+ sectname : str | None = None
551
+ optname : str | None = None
552
+ lineno : int = 0
553
+ indent_level : int = 0
554
+ errors : list[ParsingError]
555
+
556
+ def __init__(self):
557
+ self.elements_added = set()
558
+ self.errors = list()
559
+
560
+
561
+ class _Line(str):
562
+
563
+ def __new__(cls, val, *args, **kwargs):
564
+ return super().__new__(cls, val)
565
+
566
+ def __init__(self, val, prefixes):
567
+ self.prefixes = prefixes
568
+
569
+ @functools.cached_property
570
+ def clean(self):
571
+ return self._strip_full() and self._strip_inline()
572
+
573
+ @property
574
+ def has_comments(self):
575
+ return self.strip() != self.clean
576
+
577
+ def _strip_inline(self):
578
+ """
579
+ Search for the earliest prefix at the beginning of the line or following a space.
580
+ """
581
+ matcher = re.compile(
582
+ '|'.join(fr'(^|\s)({re.escape(prefix)})' for prefix in self.prefixes.inline)
583
+ # match nothing if no prefixes
584
+ or '(?!)'
585
+ )
586
+ match = matcher.search(self)
587
+ return self[:match.start() if match else None].strip()
588
+
589
+ def _strip_full(self):
590
+ return '' if any(map(self.strip().startswith, self.prefixes.full)) else True
591
+
592
+
593
+ class RawConfigParser(MutableMapping):
594
+ """ConfigParser that does not do interpolation."""
595
+
596
+ # Regular expressions for parsing section headers and options
597
+ _SECT_TMPL = r"""
598
+ \[ # [
599
+ (?P<header>.+) # very permissive!
600
+ \] # ]
601
+ """
602
+ _OPT_TMPL = r"""
603
+ (?P<option> # very permissive!
604
+ (?:(?!{delim})\S)* # non-delimiter non-whitespace
605
+ (?:\s+(?:(?!{delim})\S)+)*) # optionally more words
606
+ \s*(?P<vi>{delim})\s* # any number of space/tab,
607
+ # followed by any of the
608
+ # allowed delimiters,
609
+ # followed by any space/tab
610
+ (?P<value>.*)$ # everything up to eol
611
+ """
612
+ _OPT_NV_TMPL = r"""
613
+ (?P<option> # very permissive!
614
+ (?:(?!{delim})\S)* # non-delimiter non-whitespace
615
+ (?:\s+(?:(?!{delim})\S)+)*) # optionally more words
616
+ \s*(?: # any number of space/tab,
617
+ (?P<vi>{delim})\s* # optionally followed by
618
+ # any of the allowed
619
+ # delimiters, followed by any
620
+ # space/tab
621
+ (?P<value>.*))?$ # everything up to eol
622
+ """
623
+ # Interpolation algorithm to be used if the user does not specify another
624
+ _DEFAULT_INTERPOLATION = Interpolation()
625
+ # Compiled regular expression for matching sections
626
+ SECTCRE = re.compile(_SECT_TMPL, re.VERBOSE)
627
+ # Compiled regular expression for matching options with typical separators
628
+ OPTCRE = re.compile(_OPT_TMPL.format(delim="=|:"), re.VERBOSE)
629
+ # Compiled regular expression for matching options with optional values
630
+ # delimited using typical separators
631
+ OPTCRE_NV = re.compile(_OPT_NV_TMPL.format(delim="=|:"), re.VERBOSE)
632
+ # Compiled regular expression for matching leading whitespace in a line
633
+ NONSPACECRE = re.compile(r"\S")
634
+ # Possible boolean values in the configuration.
635
+ BOOLEAN_STATES = {'1': True, 'yes': True, 'true': True, 'on': True,
636
+ '0': False, 'no': False, 'false': False, 'off': False}
637
+
638
+ def __init__(self, defaults=None, dict_type=_default_dict,
639
+ allow_no_value=False, *, delimiters=('=', ':'),
640
+ comment_prefixes=('#', ';'), inline_comment_prefixes=None,
641
+ strict=True, empty_lines_in_values=True,
642
+ default_section=DEFAULTSECT,
643
+ interpolation=_UNSET, converters=_UNSET,
644
+ allow_unnamed_section=False,):
645
+
646
+ self._dict = dict_type
647
+ self._sections = self._dict()
648
+ self._defaults = self._dict()
649
+ self._converters = ConverterMapping(self)
650
+ self._proxies = self._dict()
651
+ self._proxies[default_section] = SectionProxy(self, default_section)
652
+ self._delimiters = tuple(delimiters)
653
+ if delimiters == ('=', ':'):
654
+ self._optcre = self.OPTCRE_NV if allow_no_value else self.OPTCRE
655
+ else:
656
+ d = "|".join(re.escape(d) for d in delimiters)
657
+ if allow_no_value:
658
+ self._optcre = re.compile(self._OPT_NV_TMPL.format(delim=d),
659
+ re.VERBOSE)
660
+ else:
661
+ self._optcre = re.compile(self._OPT_TMPL.format(delim=d),
662
+ re.VERBOSE)
663
+ self._prefixes = types.SimpleNamespace(
664
+ full=tuple(comment_prefixes or ()),
665
+ inline=tuple(inline_comment_prefixes or ()),
666
+ )
667
+ self._strict = strict
668
+ self._allow_no_value = allow_no_value
669
+ self._empty_lines_in_values = empty_lines_in_values
670
+ self.default_section=default_section
671
+ self._interpolation = interpolation
672
+ if self._interpolation is _UNSET:
673
+ self._interpolation = self._DEFAULT_INTERPOLATION
674
+ if self._interpolation is None:
675
+ self._interpolation = Interpolation()
676
+ if not isinstance(self._interpolation, Interpolation):
677
+ raise TypeError(
678
+ f"interpolation= must be None or an instance of Interpolation;"
679
+ f" got an object of type {type(self._interpolation)}"
680
+ )
681
+ if converters is not _UNSET:
682
+ self._converters.update(converters)
683
+ if defaults:
684
+ self._read_defaults(defaults)
685
+ self._allow_unnamed_section = allow_unnamed_section
686
+
687
+ def defaults(self):
688
+ return self._defaults
689
+
690
+ def sections(self):
691
+ """Return a list of section names, excluding [DEFAULT]"""
692
+ # self._sections will never have [DEFAULT] in it
693
+ return list(self._sections.keys())
694
+
695
+ def add_section(self, section):
696
+ """Create a new section in the configuration.
697
+
698
+ Raise DuplicateSectionError if a section by the specified name
699
+ already exists. Raise ValueError if name is DEFAULT.
700
+ """
701
+ if section == self.default_section:
702
+ raise ValueError('Invalid section name: %r' % section)
703
+
704
+ if section in self._sections:
705
+ raise DuplicateSectionError(section)
706
+ self._sections[section] = self._dict()
707
+ self._proxies[section] = SectionProxy(self, section)
708
+
709
+ def has_section(self, section):
710
+ """Indicate whether the named section is present in the configuration.
711
+
712
+ The DEFAULT section is not acknowledged.
713
+ """
714
+ return section in self._sections
715
+
716
+ def options(self, section):
717
+ """Return a list of option names for the given section name."""
718
+ try:
719
+ opts = self._sections[section].copy()
720
+ except KeyError:
721
+ raise NoSectionError(section) from None
722
+ opts.update(self._defaults)
723
+ return list(opts.keys())
724
+
725
+ def read(self, filenames, encoding=None):
726
+ """Read and parse a filename or an iterable of filenames.
727
+
728
+ Files that cannot be opened are silently ignored; this is
729
+ designed so that you can specify an iterable of potential
730
+ configuration file locations (e.g. current directory, user's
731
+ home directory, systemwide directory), and all existing
732
+ configuration files in the iterable will be read. A single
733
+ filename may also be given.
734
+
735
+ Return list of successfully read files.
736
+ """
737
+ if isinstance(filenames, (str, bytes, os.PathLike)):
738
+ filenames = [filenames]
739
+ encoding = io.text_encoding(encoding)
740
+ read_ok = []
741
+ for filename in filenames:
742
+ try:
743
+ with open(filename, encoding=encoding) as fp:
744
+ self._read(fp, filename)
745
+ except OSError:
746
+ continue
747
+ if isinstance(filename, os.PathLike):
748
+ filename = os.fspath(filename)
749
+ read_ok.append(filename)
750
+ return read_ok
751
+
752
+ def read_file(self, f, source=None):
753
+ """Like read() but the argument must be a file-like object.
754
+
755
+ The `f` argument must be iterable, returning one line at a time.
756
+ Optional second argument is the `source` specifying the name of the
757
+ file being read. If not given, it is taken from f.name. If `f` has no
758
+ `name` attribute, `<???>` is used.
759
+ """
760
+ if source is None:
761
+ try:
762
+ source = f.name
763
+ except AttributeError:
764
+ source = '<???>'
765
+ self._read(f, source)
766
+
767
+ def read_string(self, string, source='<string>'):
768
+ """Read configuration from a given string."""
769
+ sfile = io.StringIO(string)
770
+ self.read_file(sfile, source)
771
+
772
+ def read_dict(self, dictionary, source='<dict>'):
773
+ """Read configuration from a dictionary.
774
+
775
+ Keys are section names, values are dictionaries with keys and values
776
+ that should be present in the section. If the used dictionary type
777
+ preserves order, sections and their keys will be added in order.
778
+
779
+ All types held in the dictionary are converted to strings during
780
+ reading, including section names, option names and keys.
781
+
782
+ Optional second argument is the `source` specifying the name of the
783
+ dictionary being read.
784
+ """
785
+ elements_added = set()
786
+ for section, keys in dictionary.items():
787
+ section = str(section)
788
+ try:
789
+ self.add_section(section)
790
+ except (DuplicateSectionError, ValueError):
791
+ if self._strict and section in elements_added:
792
+ raise
793
+ elements_added.add(section)
794
+ for key, value in keys.items():
795
+ key = self.optionxform(str(key))
796
+ if value is not None:
797
+ value = str(value)
798
+ if self._strict and (section, key) in elements_added:
799
+ raise DuplicateOptionError(section, key, source)
800
+ elements_added.add((section, key))
801
+ self.set(section, key, value)
802
+
803
+ def get(self, section, option, *, raw=False, vars=None, fallback=_UNSET):
804
+ """Get an option value for a given section.
805
+
806
+ If `vars` is provided, it must be a dictionary. The option is looked up
807
+ in `vars` (if provided), `section`, and in `DEFAULTSECT` in that order.
808
+ If the key is not found and `fallback` is provided, it is used as
809
+ a fallback value. `None` can be provided as a `fallback` value.
810
+
811
+ If interpolation is enabled and the optional argument `raw` is False,
812
+ all interpolations are expanded in the return values.
813
+
814
+ Arguments `raw`, `vars`, and `fallback` are keyword only.
815
+
816
+ The section DEFAULT is special.
817
+ """
818
+ try:
819
+ d = self._unify_values(section, vars)
820
+ except NoSectionError:
821
+ if fallback is _UNSET:
822
+ raise
823
+ else:
824
+ return fallback
825
+ option = self.optionxform(option)
826
+ try:
827
+ value = d[option]
828
+ except KeyError:
829
+ if fallback is _UNSET:
830
+ raise NoOptionError(option, section)
831
+ else:
832
+ return fallback
833
+
834
+ if raw or value is None:
835
+ return value
836
+ else:
837
+ return self._interpolation.before_get(self, section, option, value,
838
+ d)
839
+
840
+ def _get(self, section, conv, option, **kwargs):
841
+ return conv(self.get(section, option, **kwargs))
842
+
843
+ def _get_conv(self, section, option, conv, *, raw=False, vars=None,
844
+ fallback=_UNSET, **kwargs):
845
+ try:
846
+ return self._get(section, conv, option, raw=raw, vars=vars,
847
+ **kwargs)
848
+ except (NoSectionError, NoOptionError):
849
+ if fallback is _UNSET:
850
+ raise
851
+ return fallback
852
+
853
+ # getint, getfloat and getboolean provided directly for backwards compat
854
+ def getint(self, section, option, *, raw=False, vars=None,
855
+ fallback=_UNSET, **kwargs):
856
+ return self._get_conv(section, option, int, raw=raw, vars=vars,
857
+ fallback=fallback, **kwargs)
858
+
859
+ def getfloat(self, section, option, *, raw=False, vars=None,
860
+ fallback=_UNSET, **kwargs):
861
+ return self._get_conv(section, option, float, raw=raw, vars=vars,
862
+ fallback=fallback, **kwargs)
863
+
864
+ def getboolean(self, section, option, *, raw=False, vars=None,
865
+ fallback=_UNSET, **kwargs):
866
+ return self._get_conv(section, option, self._convert_to_boolean,
867
+ raw=raw, vars=vars, fallback=fallback, **kwargs)
868
+
869
+ def items(self, section=_UNSET, raw=False, vars=None):
870
+ """Return a list of (name, value) tuples for each option in a section.
871
+
872
+ All % interpolations are expanded in the return values, based on the
873
+ defaults passed into the constructor, unless the optional argument
874
+ `raw` is true. Additional substitutions may be provided using the
875
+ `vars` argument, which must be a dictionary whose contents overrides
876
+ any pre-existing defaults.
877
+
878
+ The section DEFAULT is special.
879
+ """
880
+ if section is _UNSET:
881
+ return super().items()
882
+ d = self._defaults.copy()
883
+ try:
884
+ d.update(self._sections[section])
885
+ except KeyError:
886
+ if section != self.default_section:
887
+ raise NoSectionError(section)
888
+ orig_keys = list(d.keys())
889
+ # Update with the entry specific variables
890
+ if vars:
891
+ for key, value in vars.items():
892
+ d[self.optionxform(key)] = value
893
+ value_getter = lambda option: self._interpolation.before_get(self,
894
+ section, option, d[option], d)
895
+ if raw:
896
+ value_getter = lambda option: d[option]
897
+ return [(option, value_getter(option)) for option in orig_keys]
898
+
899
+ def popitem(self):
900
+ """Remove a section from the parser and return it as
901
+ a (section_name, section_proxy) tuple. If no section is present, raise
902
+ KeyError.
903
+
904
+ The section DEFAULT is never returned because it cannot be removed.
905
+ """
906
+ for key in self.sections():
907
+ value = self[key]
908
+ del self[key]
909
+ return key, value
910
+ raise KeyError
911
+
912
+ def optionxform(self, optionstr):
913
+ return optionstr.lower()
914
+
915
+ def has_option(self, section, option):
916
+ """Check for the existence of a given option in a given section.
917
+ If the specified `section` is None or an empty string, DEFAULT is
918
+ assumed. If the specified `section` does not exist, returns False."""
919
+ if not section or section == self.default_section:
920
+ option = self.optionxform(option)
921
+ return option in self._defaults
922
+ elif section not in self._sections:
923
+ return False
924
+ else:
925
+ option = self.optionxform(option)
926
+ return (option in self._sections[section]
927
+ or option in self._defaults)
928
+
929
+ def set(self, section, option, value=None):
930
+ """Set an option."""
931
+ if value:
932
+ value = self._interpolation.before_set(self, section, option,
933
+ value)
934
+ if not section or section == self.default_section:
935
+ sectdict = self._defaults
936
+ else:
937
+ try:
938
+ sectdict = self._sections[section]
939
+ except KeyError:
940
+ raise NoSectionError(section) from None
941
+ sectdict[self.optionxform(option)] = value
942
+
943
+ def write(self, fp, space_around_delimiters=True):
944
+ """Write an .ini-format representation of the configuration state.
945
+
946
+ If `space_around_delimiters` is True (the default), delimiters
947
+ between keys and values are surrounded by spaces.
948
+
949
+ Please note that comments in the original configuration file are not
950
+ preserved when writing the configuration back.
951
+ """
952
+ if space_around_delimiters:
953
+ d = " {} ".format(self._delimiters[0])
954
+ else:
955
+ d = self._delimiters[0]
956
+ if self._defaults:
957
+ self._write_section(fp, self.default_section,
958
+ self._defaults.items(), d)
959
+ if UNNAMED_SECTION in self._sections:
960
+ self._write_section(fp, UNNAMED_SECTION, self._sections[UNNAMED_SECTION].items(), d, unnamed=True)
961
+
962
+ for section in self._sections:
963
+ if section is UNNAMED_SECTION:
964
+ continue
965
+ self._write_section(fp, section,
966
+ self._sections[section].items(), d)
967
+
968
+ def _write_section(self, fp, section_name, section_items, delimiter, unnamed=False):
969
+ """Write a single section to the specified `fp'."""
970
+ if not unnamed:
971
+ fp.write("[{}]\n".format(section_name))
972
+ for key, value in section_items:
973
+ value = self._interpolation.before_write(self, section_name, key,
974
+ value)
975
+ if value is not None or not self._allow_no_value:
976
+ # Convert all possible line-endings into '\n\t'
977
+ value = (delimiter + str(value).replace('\r\n', '\n')
978
+ .replace('\r', '\n').replace('\n', '\n\t'))
979
+ else:
980
+ value = ""
981
+ fp.write("{}{}\n".format(key, value))
982
+ fp.write("\n")
983
+
984
+ def remove_option(self, section, option):
985
+ """Remove an option."""
986
+ if not section or section == self.default_section:
987
+ sectdict = self._defaults
988
+ else:
989
+ try:
990
+ sectdict = self._sections[section]
991
+ except KeyError:
992
+ raise NoSectionError(section) from None
993
+ option = self.optionxform(option)
994
+ existed = option in sectdict
995
+ if existed:
996
+ del sectdict[option]
997
+ return existed
998
+
999
+ def remove_section(self, section):
1000
+ """Remove a file section."""
1001
+ existed = section in self._sections
1002
+ if existed:
1003
+ del self._sections[section]
1004
+ del self._proxies[section]
1005
+ return existed
1006
+
1007
+ def __getitem__(self, key):
1008
+ if key != self.default_section and not self.has_section(key):
1009
+ raise KeyError(key)
1010
+ return self._proxies[key]
1011
+
1012
+ def __setitem__(self, key, value):
1013
+ # To conform with the mapping protocol, overwrites existing values in
1014
+ # the section.
1015
+ if key in self and self[key] is value:
1016
+ return
1017
+ # XXX this is not atomic if read_dict fails at any point. Then again,
1018
+ # no update method in configparser is atomic in this implementation.
1019
+ if key == self.default_section:
1020
+ self._defaults.clear()
1021
+ elif key in self._sections:
1022
+ self._sections[key].clear()
1023
+ self.read_dict({key: value})
1024
+
1025
+ def __delitem__(self, key):
1026
+ if key == self.default_section:
1027
+ raise ValueError("Cannot remove the default section.")
1028
+ if not self.has_section(key):
1029
+ raise KeyError(key)
1030
+ self.remove_section(key)
1031
+
1032
+ def __contains__(self, key):
1033
+ return key == self.default_section or self.has_section(key)
1034
+
1035
+ def __len__(self):
1036
+ return len(self._sections) + 1 # the default section
1037
+
1038
+ def __iter__(self):
1039
+ # XXX does it break when underlying container state changed?
1040
+ return itertools.chain((self.default_section,), self._sections.keys())
1041
+
1042
+ def _read(self, fp, fpname):
1043
+ """Parse a sectioned configuration file.
1044
+
1045
+ Each section in a configuration file contains a header, indicated by
1046
+ a name in square brackets (`[]`), plus key/value options, indicated by
1047
+ `name` and `value` delimited with a specific substring (`=` or `:` by
1048
+ default).
1049
+
1050
+ Values can span multiple lines, as long as they are indented deeper
1051
+ than the first line of the value. Depending on the parser's mode, blank
1052
+ lines may be treated as parts of multiline values or ignored.
1053
+
1054
+ Configuration files may include comments, prefixed by specific
1055
+ characters (`#` and `;` by default). Comments may appear on their own
1056
+ in an otherwise empty line or may be entered in lines holding values or
1057
+ section names. Please note that comments get stripped off when reading configuration files.
1058
+ """
1059
+
1060
+ try:
1061
+ ParsingError._raise_all(self._read_inner(fp, fpname))
1062
+ finally:
1063
+ self._join_multiline_values()
1064
+
1065
+ def _read_inner(self, fp, fpname):
1066
+ st = _ReadState()
1067
+
1068
+ Line = functools.partial(_Line, prefixes=self._prefixes)
1069
+ for st.lineno, line in enumerate(map(Line, fp), start=1):
1070
+ if not line.clean:
1071
+ if self._empty_lines_in_values:
1072
+ # add empty line to the value, but only if there was no
1073
+ # comment on the line
1074
+ if (not line.has_comments and
1075
+ st.cursect is not None and
1076
+ st.optname and
1077
+ st.cursect[st.optname] is not None):
1078
+ st.cursect[st.optname].append('') # newlines added at join
1079
+ else:
1080
+ # empty line marks end of value
1081
+ st.indent_level = sys.maxsize
1082
+ continue
1083
+
1084
+ first_nonspace = self.NONSPACECRE.search(line)
1085
+ st.cur_indent_level = first_nonspace.start() if first_nonspace else 0
1086
+
1087
+ if self._handle_continuation_line(st, line, fpname):
1088
+ continue
1089
+
1090
+ self._handle_rest(st, line, fpname)
1091
+
1092
+ return st.errors
1093
+
1094
+ def _handle_continuation_line(self, st, line, fpname):
1095
+ # continuation line?
1096
+ is_continue = (st.cursect is not None and st.optname and
1097
+ st.cur_indent_level > st.indent_level)
1098
+ if is_continue:
1099
+ if st.cursect[st.optname] is None:
1100
+ raise MultilineContinuationError(fpname, st.lineno, line)
1101
+ st.cursect[st.optname].append(line.clean)
1102
+ return is_continue
1103
+
1104
+ def _handle_rest(self, st, line, fpname):
1105
+ # a section header or option header?
1106
+ if self._allow_unnamed_section and st.cursect is None:
1107
+ self._handle_header(st, UNNAMED_SECTION, fpname)
1108
+
1109
+ st.indent_level = st.cur_indent_level
1110
+ # is it a section header?
1111
+ mo = self.SECTCRE.match(line.clean)
1112
+
1113
+ if not mo and st.cursect is None:
1114
+ raise MissingSectionHeaderError(fpname, st.lineno, line)
1115
+
1116
+ self._handle_header(st, mo.group('header'), fpname) if mo else self._handle_option(st, line, fpname)
1117
+
1118
+ def _handle_header(self, st, sectname, fpname):
1119
+ st.sectname = sectname
1120
+ if st.sectname in self._sections:
1121
+ if self._strict and st.sectname in st.elements_added:
1122
+ raise DuplicateSectionError(st.sectname, fpname,
1123
+ st.lineno)
1124
+ st.cursect = self._sections[st.sectname]
1125
+ st.elements_added.add(st.sectname)
1126
+ elif st.sectname == self.default_section:
1127
+ st.cursect = self._defaults
1128
+ else:
1129
+ st.cursect = self._dict()
1130
+ self._sections[st.sectname] = st.cursect
1131
+ self._proxies[st.sectname] = SectionProxy(self, st.sectname)
1132
+ st.elements_added.add(st.sectname)
1133
+ # So sections can't start with a continuation line
1134
+ st.optname = None
1135
+
1136
+ def _handle_option(self, st, line, fpname):
1137
+ # an option line?
1138
+ st.indent_level = st.cur_indent_level
1139
+
1140
+ mo = self._optcre.match(line.clean)
1141
+ if not mo:
1142
+ # a non-fatal parsing error occurred. set up the
1143
+ # exception but keep going. the exception will be
1144
+ # raised at the end of the file and will contain a
1145
+ # list of all bogus lines
1146
+ st.errors.append(ParsingError(fpname, st.lineno, line))
1147
+ return
1148
+
1149
+ st.optname, vi, optval = mo.group('option', 'vi', 'value')
1150
+ if not st.optname:
1151
+ st.errors.append(ParsingError(fpname, st.lineno, line))
1152
+ st.optname = self.optionxform(st.optname.rstrip())
1153
+ if (self._strict and
1154
+ (st.sectname, st.optname) in st.elements_added):
1155
+ raise DuplicateOptionError(st.sectname, st.optname,
1156
+ fpname, st.lineno)
1157
+ st.elements_added.add((st.sectname, st.optname))
1158
+ # This check is fine because the OPTCRE cannot
1159
+ # match if it would set optval to None
1160
+ if optval is not None:
1161
+ optval = optval.strip()
1162
+ st.cursect[st.optname] = [optval]
1163
+ else:
1164
+ # valueless option handling
1165
+ st.cursect[st.optname] = None
1166
+
1167
+ def _join_multiline_values(self):
1168
+ defaults = self.default_section, self._defaults
1169
+ all_sections = itertools.chain((defaults,),
1170
+ self._sections.items())
1171
+ for section, options in all_sections:
1172
+ for name, val in options.items():
1173
+ if isinstance(val, list):
1174
+ val = '\n'.join(val).rstrip()
1175
+ options[name] = self._interpolation.before_read(self,
1176
+ section,
1177
+ name, val)
1178
+
1179
+ def _read_defaults(self, defaults):
1180
+ """Read the defaults passed in the initializer.
1181
+ Note: values can be non-string."""
1182
+ for key, value in defaults.items():
1183
+ self._defaults[self.optionxform(key)] = value
1184
+
1185
+ def _unify_values(self, section, vars):
1186
+ """Create a sequence of lookups with 'vars' taking priority over
1187
+ the 'section' which takes priority over the DEFAULTSECT.
1188
+
1189
+ """
1190
+ sectiondict = {}
1191
+ try:
1192
+ sectiondict = self._sections[section]
1193
+ except KeyError:
1194
+ if section != self.default_section:
1195
+ raise NoSectionError(section) from None
1196
+ # Update with the entry specific variables
1197
+ vardict = {}
1198
+ if vars:
1199
+ for key, value in vars.items():
1200
+ if value is not None:
1201
+ value = str(value)
1202
+ vardict[self.optionxform(key)] = value
1203
+ return _ChainMap(vardict, sectiondict, self._defaults)
1204
+
1205
+ def _convert_to_boolean(self, value):
1206
+ """Return a boolean value translating from other types if necessary.
1207
+ """
1208
+ if value.lower() not in self.BOOLEAN_STATES:
1209
+ raise ValueError('Not a boolean: %s' % value)
1210
+ return self.BOOLEAN_STATES[value.lower()]
1211
+
1212
+ def _validate_value_types(self, *, section="", option="", value=""):
1213
+ """Raises a TypeError for non-string values.
1214
+
1215
+ The only legal non-string value if we allow valueless
1216
+ options is None, so we need to check if the value is a
1217
+ string if:
1218
+ - we do not allow valueless options, or
1219
+ - we allow valueless options but the value is not None
1220
+
1221
+ For compatibility reasons this method is not used in classic set()
1222
+ for RawConfigParsers. It is invoked in every case for mapping protocol
1223
+ access and in ConfigParser.set().
1224
+ """
1225
+ if not isinstance(section, str):
1226
+ raise TypeError("section names must be strings")
1227
+ if not isinstance(option, str):
1228
+ raise TypeError("option keys must be strings")
1229
+ if not self._allow_no_value or value:
1230
+ if not isinstance(value, str):
1231
+ raise TypeError("option values must be strings")
1232
+
1233
+ @property
1234
+ def converters(self):
1235
+ return self._converters
1236
+
1237
+
1238
+ class ConfigParser(RawConfigParser):
1239
+ """ConfigParser implementing interpolation."""
1240
+
1241
+ _DEFAULT_INTERPOLATION = BasicInterpolation()
1242
+
1243
+ def set(self, section, option, value=None):
1244
+ """Set an option. Extends RawConfigParser.set by validating type and
1245
+ interpolation syntax on the value."""
1246
+ self._validate_value_types(option=option, value=value)
1247
+ super().set(section, option, value)
1248
+
1249
+ def add_section(self, section):
1250
+ """Create a new section in the configuration. Extends
1251
+ RawConfigParser.add_section by validating if the section name is
1252
+ a string."""
1253
+ self._validate_value_types(section=section)
1254
+ super().add_section(section)
1255
+
1256
+ def _read_defaults(self, defaults):
1257
+ """Reads the defaults passed in the initializer, implicitly converting
1258
+ values to strings like the rest of the API.
1259
+
1260
+ Does not perform interpolation for backwards compatibility.
1261
+ """
1262
+ try:
1263
+ hold_interpolation = self._interpolation
1264
+ self._interpolation = Interpolation()
1265
+ self.read_dict({self.default_section: defaults})
1266
+ finally:
1267
+ self._interpolation = hold_interpolation
1268
+
1269
+
1270
+ class SectionProxy(MutableMapping):
1271
+ """A proxy for a single section from a parser."""
1272
+
1273
+ def __init__(self, parser, name):
1274
+ """Creates a view on a section of the specified `name` in `parser`."""
1275
+ self._parser = parser
1276
+ self._name = name
1277
+ for conv in parser.converters:
1278
+ key = 'get' + conv
1279
+ getter = functools.partial(self.get, _impl=getattr(parser, key))
1280
+ setattr(self, key, getter)
1281
+
1282
+ def __repr__(self):
1283
+ return '<Section: {}>'.format(self._name)
1284
+
1285
+ def __getitem__(self, key):
1286
+ if not self._parser.has_option(self._name, key):
1287
+ raise KeyError(key)
1288
+ return self._parser.get(self._name, key)
1289
+
1290
+ def __setitem__(self, key, value):
1291
+ self._parser._validate_value_types(option=key, value=value)
1292
+ return self._parser.set(self._name, key, value)
1293
+
1294
+ def __delitem__(self, key):
1295
+ if not (self._parser.has_option(self._name, key) and
1296
+ self._parser.remove_option(self._name, key)):
1297
+ raise KeyError(key)
1298
+
1299
+ def __contains__(self, key):
1300
+ return self._parser.has_option(self._name, key)
1301
+
1302
+ def __len__(self):
1303
+ return len(self._options())
1304
+
1305
+ def __iter__(self):
1306
+ return self._options().__iter__()
1307
+
1308
+ def _options(self):
1309
+ if self._name != self._parser.default_section:
1310
+ return self._parser.options(self._name)
1311
+ else:
1312
+ return self._parser.defaults()
1313
+
1314
+ @property
1315
+ def parser(self):
1316
+ # The parser object of the proxy is read-only.
1317
+ return self._parser
1318
+
1319
+ @property
1320
+ def name(self):
1321
+ # The name of the section on a proxy is read-only.
1322
+ return self._name
1323
+
1324
+ def get(self, option, fallback=None, *, raw=False, vars=None,
1325
+ _impl=None, **kwargs):
1326
+ """Get an option value.
1327
+
1328
+ Unless `fallback` is provided, `None` will be returned if the option
1329
+ is not found.
1330
+
1331
+ """
1332
+ # If `_impl` is provided, it should be a getter method on the parser
1333
+ # object that provides the desired type conversion.
1334
+ if not _impl:
1335
+ _impl = self._parser.get
1336
+ return _impl(self._name, option, raw=raw, vars=vars,
1337
+ fallback=fallback, **kwargs)
1338
+
1339
+
1340
+ class ConverterMapping(MutableMapping):
1341
+ """Enables reuse of get*() methods between the parser and section proxies.
1342
+
1343
+ If a parser class implements a getter directly, the value for the given
1344
+ key will be ``None``. The presence of the converter name here enables
1345
+ section proxies to find and use the implementation on the parser class.
1346
+ """
1347
+
1348
+ GETTERCRE = re.compile(r"^get(?P<name>.+)$")
1349
+
1350
+ def __init__(self, parser):
1351
+ self._parser = parser
1352
+ self._data = {}
1353
+ for getter in dir(self._parser):
1354
+ m = self.GETTERCRE.match(getter)
1355
+ if not m or not callable(getattr(self._parser, getter)):
1356
+ continue
1357
+ self._data[m.group('name')] = None # See class docstring.
1358
+
1359
+ def __getitem__(self, key):
1360
+ return self._data[key]
1361
+
1362
+ def __setitem__(self, key, value):
1363
+ try:
1364
+ k = 'get' + key
1365
+ except TypeError:
1366
+ raise ValueError('Incompatible key: {} (type: {})'
1367
+ ''.format(key, type(key)))
1368
+ if k == 'get':
1369
+ raise ValueError('Incompatible key: cannot use "" as a name')
1370
+ self._data[key] = value
1371
+ func = functools.partial(self._parser._get_conv, conv=value)
1372
+ func.converter = value
1373
+ setattr(self._parser, k, func)
1374
+ for proxy in self._parser.values():
1375
+ getter = functools.partial(proxy.get, _impl=func)
1376
+ setattr(proxy, k, getter)
1377
+
1378
+ def __delitem__(self, key):
1379
+ try:
1380
+ k = 'get' + (key or None)
1381
+ except TypeError:
1382
+ raise KeyError(key)
1383
+ del self._data[key]
1384
+ for inst in itertools.chain((self._parser,), self._parser.values()):
1385
+ try:
1386
+ delattr(inst, k)
1387
+ except AttributeError:
1388
+ # don't raise since the entry was present in _data, silently
1389
+ # clean up
1390
+ continue
1391
+
1392
+ def __iter__(self):
1393
+ return iter(self._data)
1394
+
1395
+ def __len__(self):
1396
+ return len(self._data)