@rowstile/cli-linux-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 (565) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +5 -0
  3. package/package.json +26 -0
  4. package/python/bin/python3.13 +0 -0
  5. package/python/bin/python3.13-config +122 -0
  6. package/python/lib/libpython3.13.so.1.0 +0 -0
  7. package/python/lib/libpython3.so +0 -0
  8. package/python/lib/python3.13/LICENSE.txt +277 -0
  9. package/python/lib/python3.13/__future__.py +147 -0
  10. package/python/lib/python3.13/__hello__.py +16 -0
  11. package/python/lib/python3.13/_aix_support.py +108 -0
  12. package/python/lib/python3.13/_android_support.py +192 -0
  13. package/python/lib/python3.13/_apple_support.py +66 -0
  14. package/python/lib/python3.13/_collections_abc.py +1187 -0
  15. package/python/lib/python3.13/_colorize.py +119 -0
  16. package/python/lib/python3.13/_compat_pickle.py +251 -0
  17. package/python/lib/python3.13/_compression.py +162 -0
  18. package/python/lib/python3.13/_ios_support.py +71 -0
  19. package/python/lib/python3.13/_markupbase.py +396 -0
  20. package/python/lib/python3.13/_opcode_metadata.py +343 -0
  21. package/python/lib/python3.13/_osx_support.py +579 -0
  22. package/python/lib/python3.13/_py_abc.py +147 -0
  23. package/python/lib/python3.13/_pydatetime.py +2640 -0
  24. package/python/lib/python3.13/_pydecimal.py +6356 -0
  25. package/python/lib/python3.13/_pyio.py +2714 -0
  26. package/python/lib/python3.13/_pylong.py +363 -0
  27. package/python/lib/python3.13/_pyrepl/__init__.py +19 -0
  28. package/python/lib/python3.13/_pyrepl/__main__.py +10 -0
  29. package/python/lib/python3.13/_pyrepl/_minimal_curses.py +68 -0
  30. package/python/lib/python3.13/_pyrepl/_threading_handler.py +74 -0
  31. package/python/lib/python3.13/_pyrepl/base_eventqueue.py +110 -0
  32. package/python/lib/python3.13/_pyrepl/commands.py +492 -0
  33. package/python/lib/python3.13/_pyrepl/completing_reader.py +295 -0
  34. package/python/lib/python3.13/_pyrepl/console.py +229 -0
  35. package/python/lib/python3.13/_pyrepl/curses.py +33 -0
  36. package/python/lib/python3.13/_pyrepl/fancy_termios.py +82 -0
  37. package/python/lib/python3.13/_pyrepl/historical_reader.py +419 -0
  38. package/python/lib/python3.13/_pyrepl/input.py +114 -0
  39. package/python/lib/python3.13/_pyrepl/keymap.py +213 -0
  40. package/python/lib/python3.13/_pyrepl/main.py +59 -0
  41. package/python/lib/python3.13/_pyrepl/mypy.ini +29 -0
  42. package/python/lib/python3.13/_pyrepl/pager.py +175 -0
  43. package/python/lib/python3.13/_pyrepl/reader.py +764 -0
  44. package/python/lib/python3.13/_pyrepl/readline.py +599 -0
  45. package/python/lib/python3.13/_pyrepl/simple_interact.py +180 -0
  46. package/python/lib/python3.13/_pyrepl/trace.py +21 -0
  47. package/python/lib/python3.13/_pyrepl/types.py +10 -0
  48. package/python/lib/python3.13/_pyrepl/unix_console.py +852 -0
  49. package/python/lib/python3.13/_pyrepl/unix_eventqueue.py +76 -0
  50. package/python/lib/python3.13/_pyrepl/utils.py +83 -0
  51. package/python/lib/python3.13/_pyrepl/windows_console.py +687 -0
  52. package/python/lib/python3.13/_pyrepl/windows_eventqueue.py +42 -0
  53. package/python/lib/python3.13/_sitebuiltins.py +91 -0
  54. package/python/lib/python3.13/_strptime.py +800 -0
  55. package/python/lib/python3.13/_sysconfigdata__linux_x86_64-linux-gnu.py +1079 -0
  56. package/python/lib/python3.13/_threading_local.py +120 -0
  57. package/python/lib/python3.13/_weakrefset.py +205 -0
  58. package/python/lib/python3.13/abc.py +188 -0
  59. package/python/lib/python3.13/antigravity.py +17 -0
  60. package/python/lib/python3.13/argparse.py +2690 -0
  61. package/python/lib/python3.13/ast.py +1865 -0
  62. package/python/lib/python3.13/asyncio/__init__.py +47 -0
  63. package/python/lib/python3.13/asyncio/__main__.py +211 -0
  64. package/python/lib/python3.13/asyncio/base_events.py +2086 -0
  65. package/python/lib/python3.13/asyncio/base_futures.py +67 -0
  66. package/python/lib/python3.13/asyncio/base_subprocess.py +312 -0
  67. package/python/lib/python3.13/asyncio/base_tasks.py +94 -0
  68. package/python/lib/python3.13/asyncio/constants.py +41 -0
  69. package/python/lib/python3.13/asyncio/coroutines.py +109 -0
  70. package/python/lib/python3.13/asyncio/events.py +885 -0
  71. package/python/lib/python3.13/asyncio/exceptions.py +62 -0
  72. package/python/lib/python3.13/asyncio/format_helpers.py +84 -0
  73. package/python/lib/python3.13/asyncio/futures.py +425 -0
  74. package/python/lib/python3.13/asyncio/locks.py +617 -0
  75. package/python/lib/python3.13/asyncio/log.py +7 -0
  76. package/python/lib/python3.13/asyncio/mixins.py +21 -0
  77. package/python/lib/python3.13/asyncio/proactor_events.py +891 -0
  78. package/python/lib/python3.13/asyncio/protocols.py +216 -0
  79. package/python/lib/python3.13/asyncio/queues.py +309 -0
  80. package/python/lib/python3.13/asyncio/runners.py +217 -0
  81. package/python/lib/python3.13/asyncio/selector_events.py +1328 -0
  82. package/python/lib/python3.13/asyncio/sslproto.py +929 -0
  83. package/python/lib/python3.13/asyncio/staggered.py +174 -0
  84. package/python/lib/python3.13/asyncio/streams.py +787 -0
  85. package/python/lib/python3.13/asyncio/subprocess.py +229 -0
  86. package/python/lib/python3.13/asyncio/taskgroups.py +278 -0
  87. package/python/lib/python3.13/asyncio/tasks.py +1121 -0
  88. package/python/lib/python3.13/asyncio/threads.py +26 -0
  89. package/python/lib/python3.13/asyncio/timeouts.py +185 -0
  90. package/python/lib/python3.13/asyncio/transports.py +337 -0
  91. package/python/lib/python3.13/asyncio/trsock.py +98 -0
  92. package/python/lib/python3.13/asyncio/unix_events.py +1550 -0
  93. package/python/lib/python3.13/asyncio/windows_events.py +906 -0
  94. package/python/lib/python3.13/asyncio/windows_utils.py +181 -0
  95. package/python/lib/python3.13/base64.py +628 -0
  96. package/python/lib/python3.13/bdb.py +973 -0
  97. package/python/lib/python3.13/bisect.py +118 -0
  98. package/python/lib/python3.13/bz2.py +352 -0
  99. package/python/lib/python3.13/cProfile.py +197 -0
  100. package/python/lib/python3.13/calendar.py +813 -0
  101. package/python/lib/python3.13/cmd.py +409 -0
  102. package/python/lib/python3.13/code.py +386 -0
  103. package/python/lib/python3.13/codecs.py +1132 -0
  104. package/python/lib/python3.13/codeop.py +155 -0
  105. package/python/lib/python3.13/collections/__init__.py +1603 -0
  106. package/python/lib/python3.13/colorsys.py +166 -0
  107. package/python/lib/python3.13/compileall.py +470 -0
  108. package/python/lib/python3.13/concurrent/__init__.py +1 -0
  109. package/python/lib/python3.13/concurrent/futures/__init__.py +54 -0
  110. package/python/lib/python3.13/concurrent/futures/_base.py +660 -0
  111. package/python/lib/python3.13/concurrent/futures/process.py +892 -0
  112. package/python/lib/python3.13/concurrent/futures/thread.py +240 -0
  113. package/python/lib/python3.13/configparser.py +1396 -0
  114. package/python/lib/python3.13/contextlib.py +814 -0
  115. package/python/lib/python3.13/contextvars.py +4 -0
  116. package/python/lib/python3.13/copy.py +306 -0
  117. package/python/lib/python3.13/copyreg.py +217 -0
  118. package/python/lib/python3.13/csv.py +527 -0
  119. package/python/lib/python3.13/ctypes/__init__.py +605 -0
  120. package/python/lib/python3.13/ctypes/_aix.py +327 -0
  121. package/python/lib/python3.13/ctypes/_endian.py +78 -0
  122. package/python/lib/python3.13/ctypes/macholib/README.ctypes +7 -0
  123. package/python/lib/python3.13/ctypes/macholib/__init__.py +9 -0
  124. package/python/lib/python3.13/ctypes/macholib/dyld.py +165 -0
  125. package/python/lib/python3.13/ctypes/macholib/dylib.py +42 -0
  126. package/python/lib/python3.13/ctypes/macholib/fetch_macholib +2 -0
  127. package/python/lib/python3.13/ctypes/macholib/fetch_macholib.bat +1 -0
  128. package/python/lib/python3.13/ctypes/macholib/framework.py +42 -0
  129. package/python/lib/python3.13/ctypes/util.py +387 -0
  130. package/python/lib/python3.13/ctypes/wintypes.py +202 -0
  131. package/python/lib/python3.13/curses/__init__.py +101 -0
  132. package/python/lib/python3.13/curses/ascii.py +99 -0
  133. package/python/lib/python3.13/curses/has_key.py +192 -0
  134. package/python/lib/python3.13/curses/panel.py +6 -0
  135. package/python/lib/python3.13/curses/textpad.py +236 -0
  136. package/python/lib/python3.13/dataclasses.py +1679 -0
  137. package/python/lib/python3.13/datetime.py +9 -0
  138. package/python/lib/python3.13/dbm/__init__.py +194 -0
  139. package/python/lib/python3.13/dbm/dumb.py +319 -0
  140. package/python/lib/python3.13/dbm/gnu.py +3 -0
  141. package/python/lib/python3.13/dbm/ndbm.py +3 -0
  142. package/python/lib/python3.13/dbm/sqlite3.py +144 -0
  143. package/python/lib/python3.13/decimal.py +109 -0
  144. package/python/lib/python3.13/difflib.py +2058 -0
  145. package/python/lib/python3.13/dis.py +1075 -0
  146. package/python/lib/python3.13/doctest.py +2919 -0
  147. package/python/lib/python3.13/email/__init__.py +61 -0
  148. package/python/lib/python3.13/email/_encoded_words.py +233 -0
  149. package/python/lib/python3.13/email/_header_value_parser.py +3153 -0
  150. package/python/lib/python3.13/email/_parseaddr.py +563 -0
  151. package/python/lib/python3.13/email/_policybase.py +382 -0
  152. package/python/lib/python3.13/email/architecture.rst +216 -0
  153. package/python/lib/python3.13/email/base64mime.py +115 -0
  154. package/python/lib/python3.13/email/charset.py +396 -0
  155. package/python/lib/python3.13/email/contentmanager.py +254 -0
  156. package/python/lib/python3.13/email/encoders.py +65 -0
  157. package/python/lib/python3.13/email/errors.py +117 -0
  158. package/python/lib/python3.13/email/feedparser.py +536 -0
  159. package/python/lib/python3.13/email/generator.py +530 -0
  160. package/python/lib/python3.13/email/header.py +582 -0
  161. package/python/lib/python3.13/email/headerregistry.py +618 -0
  162. package/python/lib/python3.13/email/iterators.py +68 -0
  163. package/python/lib/python3.13/email/message.py +1217 -0
  164. package/python/lib/python3.13/email/mime/__init__.py +0 -0
  165. package/python/lib/python3.13/email/mime/application.py +37 -0
  166. package/python/lib/python3.13/email/mime/audio.py +97 -0
  167. package/python/lib/python3.13/email/mime/base.py +29 -0
  168. package/python/lib/python3.13/email/mime/image.py +152 -0
  169. package/python/lib/python3.13/email/mime/message.py +33 -0
  170. package/python/lib/python3.13/email/mime/multipart.py +47 -0
  171. package/python/lib/python3.13/email/mime/nonmultipart.py +21 -0
  172. package/python/lib/python3.13/email/mime/text.py +40 -0
  173. package/python/lib/python3.13/email/parser.py +127 -0
  174. package/python/lib/python3.13/email/policy.py +232 -0
  175. package/python/lib/python3.13/email/quoprimime.py +300 -0
  176. package/python/lib/python3.13/email/utils.py +497 -0
  177. package/python/lib/python3.13/encodings/__init__.py +179 -0
  178. package/python/lib/python3.13/encodings/__pycache__/__init__.cpython-313.pyc +0 -0
  179. package/python/lib/python3.13/encodings/__pycache__/aliases.cpython-313.pyc +0 -0
  180. package/python/lib/python3.13/encodings/__pycache__/utf_8.cpython-313.pyc +0 -0
  181. package/python/lib/python3.13/encodings/aliases.py +560 -0
  182. package/python/lib/python3.13/encodings/ascii.py +50 -0
  183. package/python/lib/python3.13/encodings/base64_codec.py +55 -0
  184. package/python/lib/python3.13/encodings/big5.py +39 -0
  185. package/python/lib/python3.13/encodings/big5hkscs.py +39 -0
  186. package/python/lib/python3.13/encodings/bz2_codec.py +78 -0
  187. package/python/lib/python3.13/encodings/charmap.py +69 -0
  188. package/python/lib/python3.13/encodings/cp037.py +307 -0
  189. package/python/lib/python3.13/encodings/cp1006.py +307 -0
  190. package/python/lib/python3.13/encodings/cp1026.py +307 -0
  191. package/python/lib/python3.13/encodings/cp1125.py +698 -0
  192. package/python/lib/python3.13/encodings/cp1140.py +307 -0
  193. package/python/lib/python3.13/encodings/cp1250.py +307 -0
  194. package/python/lib/python3.13/encodings/cp1251.py +307 -0
  195. package/python/lib/python3.13/encodings/cp1252.py +307 -0
  196. package/python/lib/python3.13/encodings/cp1253.py +307 -0
  197. package/python/lib/python3.13/encodings/cp1254.py +307 -0
  198. package/python/lib/python3.13/encodings/cp1255.py +307 -0
  199. package/python/lib/python3.13/encodings/cp1256.py +307 -0
  200. package/python/lib/python3.13/encodings/cp1257.py +307 -0
  201. package/python/lib/python3.13/encodings/cp1258.py +307 -0
  202. package/python/lib/python3.13/encodings/cp273.py +307 -0
  203. package/python/lib/python3.13/encodings/cp424.py +307 -0
  204. package/python/lib/python3.13/encodings/cp437.py +698 -0
  205. package/python/lib/python3.13/encodings/cp500.py +307 -0
  206. package/python/lib/python3.13/encodings/cp720.py +309 -0
  207. package/python/lib/python3.13/encodings/cp737.py +698 -0
  208. package/python/lib/python3.13/encodings/cp775.py +697 -0
  209. package/python/lib/python3.13/encodings/cp850.py +698 -0
  210. package/python/lib/python3.13/encodings/cp852.py +698 -0
  211. package/python/lib/python3.13/encodings/cp855.py +698 -0
  212. package/python/lib/python3.13/encodings/cp856.py +307 -0
  213. package/python/lib/python3.13/encodings/cp857.py +694 -0
  214. package/python/lib/python3.13/encodings/cp858.py +698 -0
  215. package/python/lib/python3.13/encodings/cp860.py +698 -0
  216. package/python/lib/python3.13/encodings/cp861.py +698 -0
  217. package/python/lib/python3.13/encodings/cp862.py +698 -0
  218. package/python/lib/python3.13/encodings/cp863.py +698 -0
  219. package/python/lib/python3.13/encodings/cp864.py +690 -0
  220. package/python/lib/python3.13/encodings/cp865.py +698 -0
  221. package/python/lib/python3.13/encodings/cp866.py +698 -0
  222. package/python/lib/python3.13/encodings/cp869.py +689 -0
  223. package/python/lib/python3.13/encodings/cp874.py +307 -0
  224. package/python/lib/python3.13/encodings/cp875.py +307 -0
  225. package/python/lib/python3.13/encodings/cp932.py +39 -0
  226. package/python/lib/python3.13/encodings/cp949.py +39 -0
  227. package/python/lib/python3.13/encodings/cp950.py +39 -0
  228. package/python/lib/python3.13/encodings/euc_jis_2004.py +39 -0
  229. package/python/lib/python3.13/encodings/euc_jisx0213.py +39 -0
  230. package/python/lib/python3.13/encodings/euc_jp.py +39 -0
  231. package/python/lib/python3.13/encodings/euc_kr.py +39 -0
  232. package/python/lib/python3.13/encodings/gb18030.py +39 -0
  233. package/python/lib/python3.13/encodings/gb2312.py +39 -0
  234. package/python/lib/python3.13/encodings/gbk.py +39 -0
  235. package/python/lib/python3.13/encodings/hex_codec.py +55 -0
  236. package/python/lib/python3.13/encodings/hp_roman8.py +314 -0
  237. package/python/lib/python3.13/encodings/hz.py +39 -0
  238. package/python/lib/python3.13/encodings/idna.py +387 -0
  239. package/python/lib/python3.13/encodings/iso2022_jp.py +39 -0
  240. package/python/lib/python3.13/encodings/iso2022_jp_1.py +39 -0
  241. package/python/lib/python3.13/encodings/iso2022_jp_2.py +39 -0
  242. package/python/lib/python3.13/encodings/iso2022_jp_2004.py +39 -0
  243. package/python/lib/python3.13/encodings/iso2022_jp_3.py +39 -0
  244. package/python/lib/python3.13/encodings/iso2022_jp_ext.py +39 -0
  245. package/python/lib/python3.13/encodings/iso2022_kr.py +39 -0
  246. package/python/lib/python3.13/encodings/iso8859_1.py +307 -0
  247. package/python/lib/python3.13/encodings/iso8859_10.py +307 -0
  248. package/python/lib/python3.13/encodings/iso8859_11.py +307 -0
  249. package/python/lib/python3.13/encodings/iso8859_13.py +307 -0
  250. package/python/lib/python3.13/encodings/iso8859_14.py +307 -0
  251. package/python/lib/python3.13/encodings/iso8859_15.py +307 -0
  252. package/python/lib/python3.13/encodings/iso8859_16.py +307 -0
  253. package/python/lib/python3.13/encodings/iso8859_2.py +307 -0
  254. package/python/lib/python3.13/encodings/iso8859_3.py +307 -0
  255. package/python/lib/python3.13/encodings/iso8859_4.py +307 -0
  256. package/python/lib/python3.13/encodings/iso8859_5.py +307 -0
  257. package/python/lib/python3.13/encodings/iso8859_6.py +307 -0
  258. package/python/lib/python3.13/encodings/iso8859_7.py +307 -0
  259. package/python/lib/python3.13/encodings/iso8859_8.py +307 -0
  260. package/python/lib/python3.13/encodings/iso8859_9.py +307 -0
  261. package/python/lib/python3.13/encodings/johab.py +39 -0
  262. package/python/lib/python3.13/encodings/koi8_r.py +307 -0
  263. package/python/lib/python3.13/encodings/koi8_t.py +308 -0
  264. package/python/lib/python3.13/encodings/koi8_u.py +307 -0
  265. package/python/lib/python3.13/encodings/kz1048.py +307 -0
  266. package/python/lib/python3.13/encodings/latin_1.py +50 -0
  267. package/python/lib/python3.13/encodings/mac_arabic.py +698 -0
  268. package/python/lib/python3.13/encodings/mac_croatian.py +307 -0
  269. package/python/lib/python3.13/encodings/mac_cyrillic.py +307 -0
  270. package/python/lib/python3.13/encodings/mac_farsi.py +307 -0
  271. package/python/lib/python3.13/encodings/mac_greek.py +307 -0
  272. package/python/lib/python3.13/encodings/mac_iceland.py +307 -0
  273. package/python/lib/python3.13/encodings/mac_latin2.py +312 -0
  274. package/python/lib/python3.13/encodings/mac_roman.py +307 -0
  275. package/python/lib/python3.13/encodings/mac_romanian.py +307 -0
  276. package/python/lib/python3.13/encodings/mac_turkish.py +307 -0
  277. package/python/lib/python3.13/encodings/mbcs.py +47 -0
  278. package/python/lib/python3.13/encodings/oem.py +41 -0
  279. package/python/lib/python3.13/encodings/palmos.py +308 -0
  280. package/python/lib/python3.13/encodings/ptcp154.py +312 -0
  281. package/python/lib/python3.13/encodings/punycode.py +253 -0
  282. package/python/lib/python3.13/encodings/quopri_codec.py +56 -0
  283. package/python/lib/python3.13/encodings/raw_unicode_escape.py +46 -0
  284. package/python/lib/python3.13/encodings/rot_13.py +113 -0
  285. package/python/lib/python3.13/encodings/shift_jis.py +39 -0
  286. package/python/lib/python3.13/encodings/shift_jis_2004.py +39 -0
  287. package/python/lib/python3.13/encodings/shift_jisx0213.py +39 -0
  288. package/python/lib/python3.13/encodings/tis_620.py +307 -0
  289. package/python/lib/python3.13/encodings/undefined.py +49 -0
  290. package/python/lib/python3.13/encodings/unicode_escape.py +46 -0
  291. package/python/lib/python3.13/encodings/utf_16.py +155 -0
  292. package/python/lib/python3.13/encodings/utf_16_be.py +42 -0
  293. package/python/lib/python3.13/encodings/utf_16_le.py +42 -0
  294. package/python/lib/python3.13/encodings/utf_32.py +150 -0
  295. package/python/lib/python3.13/encodings/utf_32_be.py +37 -0
  296. package/python/lib/python3.13/encodings/utf_32_le.py +37 -0
  297. package/python/lib/python3.13/encodings/utf_7.py +38 -0
  298. package/python/lib/python3.13/encodings/utf_8.py +42 -0
  299. package/python/lib/python3.13/encodings/utf_8_sig.py +130 -0
  300. package/python/lib/python3.13/encodings/uu_codec.py +103 -0
  301. package/python/lib/python3.13/encodings/zlib_codec.py +77 -0
  302. package/python/lib/python3.13/enum.py +2183 -0
  303. package/python/lib/python3.13/filecmp.py +320 -0
  304. package/python/lib/python3.13/fileinput.py +442 -0
  305. package/python/lib/python3.13/fnmatch.py +192 -0
  306. package/python/lib/python3.13/fractions.py +1043 -0
  307. package/python/lib/python3.13/ftplib.py +975 -0
  308. package/python/lib/python3.13/functools.py +1036 -0
  309. package/python/lib/python3.13/genericpath.py +200 -0
  310. package/python/lib/python3.13/getopt.py +215 -0
  311. package/python/lib/python3.13/getpass.py +192 -0
  312. package/python/lib/python3.13/gettext.py +657 -0
  313. package/python/lib/python3.13/glob.py +572 -0
  314. package/python/lib/python3.13/graphlib.py +250 -0
  315. package/python/lib/python3.13/gzip.py +693 -0
  316. package/python/lib/python3.13/hashlib.py +255 -0
  317. package/python/lib/python3.13/heapq.py +603 -0
  318. package/python/lib/python3.13/hmac.py +220 -0
  319. package/python/lib/python3.13/html/__init__.py +132 -0
  320. package/python/lib/python3.13/html/entities.py +2513 -0
  321. package/python/lib/python3.13/html/parser.py +583 -0
  322. package/python/lib/python3.13/http/__init__.py +202 -0
  323. package/python/lib/python3.13/http/client.py +1598 -0
  324. package/python/lib/python3.13/http/cookiejar.py +2122 -0
  325. package/python/lib/python3.13/http/cookies.py +635 -0
  326. package/python/lib/python3.13/http/server.py +1355 -0
  327. package/python/lib/python3.13/imaplib.py +1769 -0
  328. package/python/lib/python3.13/importlib/__init__.py +136 -0
  329. package/python/lib/python3.13/importlib/_abc.py +39 -0
  330. package/python/lib/python3.13/importlib/_bootstrap.py +1559 -0
  331. package/python/lib/python3.13/importlib/_bootstrap_external.py +1826 -0
  332. package/python/lib/python3.13/importlib/abc.py +243 -0
  333. package/python/lib/python3.13/importlib/machinery.py +21 -0
  334. package/python/lib/python3.13/importlib/metadata/__init__.py +1093 -0
  335. package/python/lib/python3.13/importlib/metadata/_adapters.py +89 -0
  336. package/python/lib/python3.13/importlib/metadata/_collections.py +30 -0
  337. package/python/lib/python3.13/importlib/metadata/_functools.py +104 -0
  338. package/python/lib/python3.13/importlib/metadata/_itertools.py +73 -0
  339. package/python/lib/python3.13/importlib/metadata/_meta.py +67 -0
  340. package/python/lib/python3.13/importlib/metadata/_text.py +99 -0
  341. package/python/lib/python3.13/importlib/metadata/diagnose.py +21 -0
  342. package/python/lib/python3.13/importlib/readers.py +12 -0
  343. package/python/lib/python3.13/importlib/resources/__init__.py +43 -0
  344. package/python/lib/python3.13/importlib/resources/_adapters.py +168 -0
  345. package/python/lib/python3.13/importlib/resources/_common.py +211 -0
  346. package/python/lib/python3.13/importlib/resources/_functional.py +81 -0
  347. package/python/lib/python3.13/importlib/resources/_itertools.py +38 -0
  348. package/python/lib/python3.13/importlib/resources/abc.py +173 -0
  349. package/python/lib/python3.13/importlib/resources/readers.py +203 -0
  350. package/python/lib/python3.13/importlib/resources/simple.py +106 -0
  351. package/python/lib/python3.13/importlib/simple.py +14 -0
  352. package/python/lib/python3.13/importlib/util.py +274 -0
  353. package/python/lib/python3.13/inspect.py +3479 -0
  354. package/python/lib/python3.13/io.py +99 -0
  355. package/python/lib/python3.13/ipaddress.py +2440 -0
  356. package/python/lib/python3.13/json/__init__.py +365 -0
  357. package/python/lib/python3.13/json/decoder.py +364 -0
  358. package/python/lib/python3.13/json/encoder.py +446 -0
  359. package/python/lib/python3.13/json/scanner.py +73 -0
  360. package/python/lib/python3.13/json/tool.py +90 -0
  361. package/python/lib/python3.13/keyword.py +64 -0
  362. package/python/lib/python3.13/lib-dynload/.empty +0 -0
  363. package/python/lib/python3.13/lib-dynload/_dbm.cpython-313-x86_64-linux-gnu.so +0 -0
  364. package/python/lib/python3.13/linecache.py +236 -0
  365. package/python/lib/python3.13/locale.py +1987 -0
  366. package/python/lib/python3.13/logging/__init__.py +2330 -0
  367. package/python/lib/python3.13/logging/config.py +1080 -0
  368. package/python/lib/python3.13/logging/handlers.py +1629 -0
  369. package/python/lib/python3.13/lzma.py +364 -0
  370. package/python/lib/python3.13/mailbox.py +2219 -0
  371. package/python/lib/python3.13/mimetypes.py +679 -0
  372. package/python/lib/python3.13/modulefinder.py +671 -0
  373. package/python/lib/python3.13/multiprocessing/__init__.py +37 -0
  374. package/python/lib/python3.13/multiprocessing/connection.py +1216 -0
  375. package/python/lib/python3.13/multiprocessing/context.py +383 -0
  376. package/python/lib/python3.13/multiprocessing/dummy/__init__.py +126 -0
  377. package/python/lib/python3.13/multiprocessing/dummy/connection.py +75 -0
  378. package/python/lib/python3.13/multiprocessing/forkserver.py +373 -0
  379. package/python/lib/python3.13/multiprocessing/heap.py +337 -0
  380. package/python/lib/python3.13/multiprocessing/managers.py +1397 -0
  381. package/python/lib/python3.13/multiprocessing/pool.py +957 -0
  382. package/python/lib/python3.13/multiprocessing/popen_fork.py +97 -0
  383. package/python/lib/python3.13/multiprocessing/popen_forkserver.py +74 -0
  384. package/python/lib/python3.13/multiprocessing/popen_spawn_posix.py +76 -0
  385. package/python/lib/python3.13/multiprocessing/popen_spawn_win32.py +147 -0
  386. package/python/lib/python3.13/multiprocessing/process.py +436 -0
  387. package/python/lib/python3.13/multiprocessing/queues.py +399 -0
  388. package/python/lib/python3.13/multiprocessing/reduction.py +281 -0
  389. package/python/lib/python3.13/multiprocessing/resource_sharer.py +154 -0
  390. package/python/lib/python3.13/multiprocessing/resource_tracker.py +499 -0
  391. package/python/lib/python3.13/multiprocessing/shared_memory.py +544 -0
  392. package/python/lib/python3.13/multiprocessing/sharedctypes.py +240 -0
  393. package/python/lib/python3.13/multiprocessing/spawn.py +307 -0
  394. package/python/lib/python3.13/multiprocessing/synchronize.py +404 -0
  395. package/python/lib/python3.13/multiprocessing/util.py +562 -0
  396. package/python/lib/python3.13/netrc.py +199 -0
  397. package/python/lib/python3.13/ntpath.py +872 -0
  398. package/python/lib/python3.13/nturl2path.py +69 -0
  399. package/python/lib/python3.13/numbers.py +427 -0
  400. package/python/lib/python3.13/opcode.py +115 -0
  401. package/python/lib/python3.13/operator.py +467 -0
  402. package/python/lib/python3.13/optparse.py +1681 -0
  403. package/python/lib/python3.13/os.py +1184 -0
  404. package/python/lib/python3.13/pathlib/__init__.py +12 -0
  405. package/python/lib/python3.13/pathlib/_abc.py +930 -0
  406. package/python/lib/python3.13/pathlib/_local.py +861 -0
  407. package/python/lib/python3.13/pdb.py +2550 -0
  408. package/python/lib/python3.13/pickle.py +1860 -0
  409. package/python/lib/python3.13/pickletools.py +2904 -0
  410. package/python/lib/python3.13/pkgutil.py +529 -0
  411. package/python/lib/python3.13/platform.py +1454 -0
  412. package/python/lib/python3.13/plistlib.py +948 -0
  413. package/python/lib/python3.13/poplib.py +477 -0
  414. package/python/lib/python3.13/posixpath.py +578 -0
  415. package/python/lib/python3.13/pprint.py +658 -0
  416. package/python/lib/python3.13/profile.py +616 -0
  417. package/python/lib/python3.13/pstats.py +778 -0
  418. package/python/lib/python3.13/pty.py +211 -0
  419. package/python/lib/python3.13/py_compile.py +212 -0
  420. package/python/lib/python3.13/pyclbr.py +314 -0
  421. package/python/lib/python3.13/pydoc.py +2861 -0
  422. package/python/lib/python3.13/queue.py +383 -0
  423. package/python/lib/python3.13/quopri.py +237 -0
  424. package/python/lib/python3.13/random.py +1078 -0
  425. package/python/lib/python3.13/re/__init__.py +428 -0
  426. package/python/lib/python3.13/re/_casefix.py +106 -0
  427. package/python/lib/python3.13/re/_compiler.py +768 -0
  428. package/python/lib/python3.13/re/_constants.py +222 -0
  429. package/python/lib/python3.13/re/_parser.py +1081 -0
  430. package/python/lib/python3.13/reprlib.py +230 -0
  431. package/python/lib/python3.13/rlcompleter.py +222 -0
  432. package/python/lib/python3.13/runpy.py +326 -0
  433. package/python/lib/python3.13/sched.py +167 -0
  434. package/python/lib/python3.13/secrets.py +71 -0
  435. package/python/lib/python3.13/selectors.py +603 -0
  436. package/python/lib/python3.13/shelve.py +250 -0
  437. package/python/lib/python3.13/shlex.py +345 -0
  438. package/python/lib/python3.13/shutil.py +1569 -0
  439. package/python/lib/python3.13/signal.py +94 -0
  440. package/python/lib/python3.13/site.py +773 -0
  441. package/python/lib/python3.13/smtplib.py +1123 -0
  442. package/python/lib/python3.13/socket.py +988 -0
  443. package/python/lib/python3.13/socketserver.py +863 -0
  444. package/python/lib/python3.13/sqlite3/__init__.py +70 -0
  445. package/python/lib/python3.13/sqlite3/__main__.py +139 -0
  446. package/python/lib/python3.13/sqlite3/dbapi2.py +108 -0
  447. package/python/lib/python3.13/sqlite3/dump.py +118 -0
  448. package/python/lib/python3.13/sre_compile.py +7 -0
  449. package/python/lib/python3.13/sre_constants.py +7 -0
  450. package/python/lib/python3.13/sre_parse.py +7 -0
  451. package/python/lib/python3.13/ssl.py +1541 -0
  452. package/python/lib/python3.13/stat.py +212 -0
  453. package/python/lib/python3.13/statistics.py +1817 -0
  454. package/python/lib/python3.13/string.py +314 -0
  455. package/python/lib/python3.13/stringprep.py +272 -0
  456. package/python/lib/python3.13/struct.py +15 -0
  457. package/python/lib/python3.13/subprocess.py +2258 -0
  458. package/python/lib/python3.13/symtable.py +414 -0
  459. package/python/lib/python3.13/sysconfig/__init__.py +734 -0
  460. package/python/lib/python3.13/sysconfig/__main__.py +248 -0
  461. package/python/lib/python3.13/tabnanny.py +340 -0
  462. package/python/lib/python3.13/tarfile.py +3136 -0
  463. package/python/lib/python3.13/tempfile.py +958 -0
  464. package/python/lib/python3.13/textwrap.py +497 -0
  465. package/python/lib/python3.13/this.py +28 -0
  466. package/python/lib/python3.13/threading.py +1602 -0
  467. package/python/lib/python3.13/timeit.py +381 -0
  468. package/python/lib/python3.13/token.py +141 -0
  469. package/python/lib/python3.13/tokenize.py +592 -0
  470. package/python/lib/python3.13/tomllib/__init__.py +10 -0
  471. package/python/lib/python3.13/tomllib/_parser.py +703 -0
  472. package/python/lib/python3.13/tomllib/_re.py +107 -0
  473. package/python/lib/python3.13/tomllib/_types.py +10 -0
  474. package/python/lib/python3.13/tomllib/mypy.ini +15 -0
  475. package/python/lib/python3.13/trace.py +754 -0
  476. package/python/lib/python3.13/traceback.py +1639 -0
  477. package/python/lib/python3.13/tracemalloc.py +560 -0
  478. package/python/lib/python3.13/tty.py +73 -0
  479. package/python/lib/python3.13/types.py +346 -0
  480. package/python/lib/python3.13/typing.py +3846 -0
  481. package/python/lib/python3.13/unittest/__init__.py +80 -0
  482. package/python/lib/python3.13/unittest/__main__.py +18 -0
  483. package/python/lib/python3.13/unittest/_log.py +86 -0
  484. package/python/lib/python3.13/unittest/async_case.py +146 -0
  485. package/python/lib/python3.13/unittest/case.py +1478 -0
  486. package/python/lib/python3.13/unittest/loader.py +460 -0
  487. package/python/lib/python3.13/unittest/main.py +280 -0
  488. package/python/lib/python3.13/unittest/mock.py +3189 -0
  489. package/python/lib/python3.13/unittest/result.py +256 -0
  490. package/python/lib/python3.13/unittest/runner.py +292 -0
  491. package/python/lib/python3.13/unittest/signals.py +71 -0
  492. package/python/lib/python3.13/unittest/suite.py +379 -0
  493. package/python/lib/python3.13/unittest/util.py +170 -0
  494. package/python/lib/python3.13/urllib/__init__.py +0 -0
  495. package/python/lib/python3.13/urllib/error.py +74 -0
  496. package/python/lib/python3.13/urllib/parse.py +1264 -0
  497. package/python/lib/python3.13/urllib/request.py +2796 -0
  498. package/python/lib/python3.13/urllib/response.py +84 -0
  499. package/python/lib/python3.13/urllib/robotparser.py +363 -0
  500. package/python/lib/python3.13/uuid.py +784 -0
  501. package/python/lib/python3.13/warnings.py +735 -0
  502. package/python/lib/python3.13/wave.py +665 -0
  503. package/python/lib/python3.13/weakref.py +674 -0
  504. package/python/lib/python3.13/webbrowser.py +724 -0
  505. package/python/lib/python3.13/wsgiref/__init__.py +25 -0
  506. package/python/lib/python3.13/wsgiref/handlers.py +575 -0
  507. package/python/lib/python3.13/wsgiref/headers.py +192 -0
  508. package/python/lib/python3.13/wsgiref/simple_server.py +161 -0
  509. package/python/lib/python3.13/wsgiref/types.py +54 -0
  510. package/python/lib/python3.13/wsgiref/util.py +159 -0
  511. package/python/lib/python3.13/wsgiref/validate.py +438 -0
  512. package/python/lib/python3.13/xml/__init__.py +20 -0
  513. package/python/lib/python3.13/xml/dom/NodeFilter.py +27 -0
  514. package/python/lib/python3.13/xml/dom/__init__.py +140 -0
  515. package/python/lib/python3.13/xml/dom/domreg.py +99 -0
  516. package/python/lib/python3.13/xml/dom/expatbuilder.py +962 -0
  517. package/python/lib/python3.13/xml/dom/minicompat.py +109 -0
  518. package/python/lib/python3.13/xml/dom/minidom.py +2024 -0
  519. package/python/lib/python3.13/xml/dom/pulldom.py +336 -0
  520. package/python/lib/python3.13/xml/dom/xmlbuilder.py +389 -0
  521. package/python/lib/python3.13/xml/etree/ElementInclude.py +186 -0
  522. package/python/lib/python3.13/xml/etree/ElementPath.py +430 -0
  523. package/python/lib/python3.13/xml/etree/ElementTree.py +2116 -0
  524. package/python/lib/python3.13/xml/etree/__init__.py +33 -0
  525. package/python/lib/python3.13/xml/etree/cElementTree.py +3 -0
  526. package/python/lib/python3.13/xml/parsers/__init__.py +8 -0
  527. package/python/lib/python3.13/xml/parsers/expat.py +8 -0
  528. package/python/lib/python3.13/xml/sax/__init__.py +94 -0
  529. package/python/lib/python3.13/xml/sax/_exceptions.py +127 -0
  530. package/python/lib/python3.13/xml/sax/expatreader.py +454 -0
  531. package/python/lib/python3.13/xml/sax/handler.py +387 -0
  532. package/python/lib/python3.13/xml/sax/saxutils.py +369 -0
  533. package/python/lib/python3.13/xml/sax/xmlreader.py +378 -0
  534. package/python/lib/python3.13/xmlrpc/__init__.py +1 -0
  535. package/python/lib/python3.13/xmlrpc/client.py +1503 -0
  536. package/python/lib/python3.13/xmlrpc/server.py +1002 -0
  537. package/python/lib/python3.13/zipapp.py +229 -0
  538. package/python/lib/python3.13/zipfile/__init__.py +2391 -0
  539. package/python/lib/python3.13/zipfile/__main__.py +4 -0
  540. package/python/lib/python3.13/zipfile/_path/__init__.py +452 -0
  541. package/python/lib/python3.13/zipfile/_path/glob.py +113 -0
  542. package/python/lib/python3.13/zipimport.py +803 -0
  543. package/python/lib/python3.13/zoneinfo/__init__.py +34 -0
  544. package/python/lib/python3.13/zoneinfo/_common.py +172 -0
  545. package/python/lib/python3.13/zoneinfo/_tzpath.py +189 -0
  546. package/python/lib/python3.13/zoneinfo/_zoneinfo.py +779 -0
  547. package/python/licenses/LICENSE.bdb.txt +126 -0
  548. package/python/licenses/LICENSE.bzip2.txt +37 -0
  549. package/python/licenses/LICENSE.cpython.txt +771 -0
  550. package/python/licenses/LICENSE.expat.txt +21 -0
  551. package/python/licenses/LICENSE.libX11.txt +942 -0
  552. package/python/licenses/LICENSE.libXau.txt +21 -0
  553. package/python/licenses/LICENSE.libedit.txt +29 -0
  554. package/python/licenses/LICENSE.libffi.txt +21 -0
  555. package/python/licenses/LICENSE.liblzma.txt +13 -0
  556. package/python/licenses/LICENSE.libuuid.txt +27 -0
  557. package/python/licenses/LICENSE.libxcb.txt +30 -0
  558. package/python/licenses/LICENSE.mpdecimal.txt +24 -0
  559. package/python/licenses/LICENSE.ncurses.txt +29 -0
  560. package/python/licenses/LICENSE.openssl-1.1.txt +124 -0
  561. package/python/licenses/LICENSE.openssl-3.txt +177 -0
  562. package/python/licenses/LICENSE.sqlite.txt +23 -0
  563. package/python/licenses/LICENSE.tcl.txt +40 -0
  564. package/python/licenses/LICENSE.tix.txt +54 -0
  565. package/python/licenses/LICENSE.zlib.txt +21 -0
@@ -0,0 +1,527 @@
1
+
2
+ r"""
3
+ CSV parsing and writing.
4
+
5
+ This module provides classes that assist in the reading and writing
6
+ of Comma Separated Value (CSV) files, and implements the interface
7
+ described by PEP 305. Although many CSV files are simple to parse,
8
+ the format is not formally defined by a stable specification and
9
+ is subtle enough that parsing lines of a CSV file with something
10
+ like line.split(",") is bound to fail. The module supports three
11
+ basic APIs: reading, writing, and registration of dialects.
12
+
13
+
14
+ DIALECT REGISTRATION:
15
+
16
+ Readers and writers support a dialect argument, which is a convenient
17
+ handle on a group of settings. When the dialect argument is a string,
18
+ it identifies one of the dialects previously registered with the module.
19
+ If it is a class or instance, the attributes of the argument are used as
20
+ the settings for the reader or writer:
21
+
22
+ class excel:
23
+ delimiter = ','
24
+ quotechar = '"'
25
+ escapechar = None
26
+ doublequote = True
27
+ skipinitialspace = False
28
+ lineterminator = '\r\n'
29
+ quoting = QUOTE_MINIMAL
30
+
31
+ SETTINGS:
32
+
33
+ * quotechar - specifies a one-character string to use as the
34
+ quoting character. It defaults to '"'.
35
+ * delimiter - specifies a one-character string to use as the
36
+ field separator. It defaults to ','.
37
+ * skipinitialspace - specifies how to interpret spaces which
38
+ immediately follow a delimiter. It defaults to False, which
39
+ means that spaces immediately following a delimiter is part
40
+ of the following field.
41
+ * lineterminator - specifies the character sequence which should
42
+ terminate rows.
43
+ * quoting - controls when quotes should be generated by the writer.
44
+ It can take on any of the following module constants:
45
+
46
+ csv.QUOTE_MINIMAL means only when required, for example, when a
47
+ field contains either the quotechar or the delimiter
48
+ csv.QUOTE_ALL means that quotes are always placed around fields.
49
+ csv.QUOTE_NONNUMERIC means that quotes are always placed around
50
+ fields which do not parse as integers or floating-point
51
+ numbers.
52
+ csv.QUOTE_STRINGS means that quotes are always placed around
53
+ fields which are strings. Note that the Python value None
54
+ is not a string.
55
+ csv.QUOTE_NOTNULL means that quotes are only placed around fields
56
+ that are not the Python value None.
57
+ csv.QUOTE_NONE means that quotes are never placed around fields.
58
+ * escapechar - specifies a one-character string used to escape
59
+ the delimiter when quoting is set to QUOTE_NONE.
60
+ * doublequote - controls the handling of quotes inside fields. When
61
+ True, two consecutive quotes are interpreted as one during read,
62
+ and when writing, each quote character embedded in the data is
63
+ written as two quotes
64
+ """
65
+
66
+ import re
67
+ import types
68
+ from _csv import Error, writer, reader, register_dialect, \
69
+ unregister_dialect, get_dialect, list_dialects, \
70
+ field_size_limit, \
71
+ QUOTE_MINIMAL, QUOTE_ALL, QUOTE_NONNUMERIC, QUOTE_NONE, \
72
+ QUOTE_STRINGS, QUOTE_NOTNULL
73
+ from _csv import Dialect as _Dialect
74
+
75
+ from io import StringIO
76
+
77
+ __all__ = ["QUOTE_MINIMAL", "QUOTE_ALL", "QUOTE_NONNUMERIC", "QUOTE_NONE",
78
+ "QUOTE_STRINGS", "QUOTE_NOTNULL",
79
+ "Error", "Dialect", "excel", "excel_tab",
80
+ "field_size_limit", "reader", "writer",
81
+ "register_dialect", "get_dialect", "list_dialects", "Sniffer",
82
+ "unregister_dialect", "DictReader", "DictWriter",
83
+ "unix_dialect"]
84
+
85
+ __version__ = "1.0"
86
+
87
+
88
+ class Dialect:
89
+ """Describe a CSV dialect.
90
+
91
+ This must be subclassed (see csv.excel). Valid attributes are:
92
+ delimiter, quotechar, escapechar, doublequote, skipinitialspace,
93
+ lineterminator, quoting.
94
+
95
+ """
96
+ _name = ""
97
+ _valid = False
98
+ # placeholders
99
+ delimiter = None
100
+ quotechar = None
101
+ escapechar = None
102
+ doublequote = None
103
+ skipinitialspace = None
104
+ lineterminator = None
105
+ quoting = None
106
+
107
+ def __init__(self):
108
+ if self.__class__ != Dialect:
109
+ self._valid = True
110
+ self._validate()
111
+
112
+ def _validate(self):
113
+ try:
114
+ _Dialect(self)
115
+ except TypeError as e:
116
+ # Re-raise to get a traceback showing more user code.
117
+ raise Error(str(e)) from None
118
+
119
+ class excel(Dialect):
120
+ """Describe the usual properties of Excel-generated CSV files."""
121
+ delimiter = ','
122
+ quotechar = '"'
123
+ doublequote = True
124
+ skipinitialspace = False
125
+ lineterminator = '\r\n'
126
+ quoting = QUOTE_MINIMAL
127
+ register_dialect("excel", excel)
128
+
129
+ class excel_tab(excel):
130
+ """Describe the usual properties of Excel-generated TAB-delimited files."""
131
+ delimiter = '\t'
132
+ register_dialect("excel-tab", excel_tab)
133
+
134
+ class unix_dialect(Dialect):
135
+ """Describe the usual properties of Unix-generated CSV files."""
136
+ delimiter = ','
137
+ quotechar = '"'
138
+ doublequote = True
139
+ skipinitialspace = False
140
+ lineterminator = '\n'
141
+ quoting = QUOTE_ALL
142
+ register_dialect("unix", unix_dialect)
143
+
144
+
145
+ class DictReader:
146
+ def __init__(self, f, fieldnames=None, restkey=None, restval=None,
147
+ dialect="excel", *args, **kwds):
148
+ if fieldnames is not None and iter(fieldnames) is fieldnames:
149
+ fieldnames = list(fieldnames)
150
+ self._fieldnames = fieldnames # list of keys for the dict
151
+ self.restkey = restkey # key to catch long rows
152
+ self.restval = restval # default value for short rows
153
+ self.reader = reader(f, dialect, *args, **kwds)
154
+ self.dialect = dialect
155
+ self.line_num = 0
156
+
157
+ def __iter__(self):
158
+ return self
159
+
160
+ @property
161
+ def fieldnames(self):
162
+ if self._fieldnames is None:
163
+ try:
164
+ self._fieldnames = next(self.reader)
165
+ except StopIteration:
166
+ pass
167
+ self.line_num = self.reader.line_num
168
+ return self._fieldnames
169
+
170
+ @fieldnames.setter
171
+ def fieldnames(self, value):
172
+ self._fieldnames = value
173
+
174
+ def __next__(self):
175
+ if self.line_num == 0:
176
+ # Used only for its side effect.
177
+ self.fieldnames
178
+ row = next(self.reader)
179
+ self.line_num = self.reader.line_num
180
+
181
+ # unlike the basic reader, we prefer not to return blanks,
182
+ # because we will typically wind up with a dict full of None
183
+ # values
184
+ while row == []:
185
+ row = next(self.reader)
186
+ d = dict(zip(self.fieldnames, row))
187
+ lf = len(self.fieldnames)
188
+ lr = len(row)
189
+ if lf < lr:
190
+ d[self.restkey] = row[lf:]
191
+ elif lf > lr:
192
+ for key in self.fieldnames[lr:]:
193
+ d[key] = self.restval
194
+ return d
195
+
196
+ __class_getitem__ = classmethod(types.GenericAlias)
197
+
198
+
199
+ class DictWriter:
200
+ def __init__(self, f, fieldnames, restval="", extrasaction="raise",
201
+ dialect="excel", *args, **kwds):
202
+ if fieldnames is not None and iter(fieldnames) is fieldnames:
203
+ fieldnames = list(fieldnames)
204
+ self.fieldnames = fieldnames # list of keys for the dict
205
+ self.restval = restval # for writing short dicts
206
+ extrasaction = extrasaction.lower()
207
+ if extrasaction not in ("raise", "ignore"):
208
+ raise ValueError("extrasaction (%s) must be 'raise' or 'ignore'"
209
+ % extrasaction)
210
+ self.extrasaction = extrasaction
211
+ self.writer = writer(f, dialect, *args, **kwds)
212
+
213
+ def writeheader(self):
214
+ header = dict(zip(self.fieldnames, self.fieldnames))
215
+ return self.writerow(header)
216
+
217
+ def _dict_to_list(self, rowdict):
218
+ if self.extrasaction == "raise":
219
+ wrong_fields = rowdict.keys() - self.fieldnames
220
+ if wrong_fields:
221
+ raise ValueError("dict contains fields not in fieldnames: "
222
+ + ", ".join([repr(x) for x in wrong_fields]))
223
+ return (rowdict.get(key, self.restval) for key in self.fieldnames)
224
+
225
+ def writerow(self, rowdict):
226
+ return self.writer.writerow(self._dict_to_list(rowdict))
227
+
228
+ def writerows(self, rowdicts):
229
+ return self.writer.writerows(map(self._dict_to_list, rowdicts))
230
+
231
+ __class_getitem__ = classmethod(types.GenericAlias)
232
+
233
+
234
+ class Sniffer:
235
+ '''
236
+ "Sniffs" the format of a CSV file (i.e. delimiter, quotechar)
237
+ Returns a Dialect object.
238
+ '''
239
+ def __init__(self):
240
+ # in case there is more than one possible delimiter
241
+ self.preferred = [',', '\t', ';', ' ', ':']
242
+
243
+
244
+ def sniff(self, sample, delimiters=None):
245
+ """
246
+ Returns a dialect (or None) corresponding to the sample
247
+
248
+ If several delimiters fit the sample equally well, the
249
+ delimiters listed in the preferred attribute are preferred, in
250
+ that order, no matter how many times each of them occurs.
251
+ """
252
+
253
+ sample = sample.replace('\r\n', '\n').replace('\r', '\n')
254
+
255
+ quotechar, doublequote, delimiter, skipinitialspace = \
256
+ self._guess_quote_and_delimiter(sample, delimiters)
257
+ if not delimiter:
258
+ delimiter, skipinitialspace = self._guess_delimiter(sample,
259
+ delimiters)
260
+
261
+ if not delimiter:
262
+ raise Error("Could not determine delimiter")
263
+
264
+ class dialect(Dialect):
265
+ _name = "sniffed"
266
+ lineterminator = '\r\n'
267
+ quoting = QUOTE_MINIMAL
268
+ # escapechar = ''
269
+
270
+ dialect.doublequote = doublequote
271
+ dialect.delimiter = delimiter
272
+ # _csv.reader won't accept a quotechar of ''
273
+ dialect.quotechar = quotechar or '"'
274
+ dialect.skipinitialspace = skipinitialspace
275
+
276
+ return dialect
277
+
278
+
279
+ def _guess_quote_and_delimiter(self, data, delimiters):
280
+ """
281
+ Looks for text enclosed between two identical quotes
282
+ (the probable quotechar) which are preceded and followed
283
+ by the same character (the probable delimiter).
284
+ For example:
285
+ ,'some text',
286
+ The quote with the most wins, same with the delimiter.
287
+ If there is no quotechar the delimiter can't be determined
288
+ this way.
289
+ """
290
+
291
+ # The body of a quoted field ends at the first quote which is
292
+ # not doubled, as it does for a reader. A lazy ".*?" scans to
293
+ # the end of the sample instead, from every start: quadratically.
294
+ body = r'(?:(?P=quote){2}|(?!(?P=quote)).)*+'
295
+ matches = []
296
+ for restr in (r'(?P<delim>[^\w\n"\'])(?P<space> ?)(?P<quote>["\'])%s(?P=quote)(?P=delim)', # ,"...",
297
+ r'(?:^|\n)(?P<quote>["\'])%s(?P=quote)(?P<delim>[^\w\n"\'])(?P<space> ?)', # "...",
298
+ r'(?P<delim>[^\w\n"\'])(?P<space> ?)(?P<quote>["\'])%s(?P=quote)(?:$|\n)', # ,"..."
299
+ r'(?:^|\n)(?P<quote>["\'])%s(?P=quote)(?:$|\n)'): # "..." (no delim, no space)
300
+ regexp = re.compile(restr % body, re.DOTALL | re.MULTILINE)
301
+ matches = regexp.findall(data)
302
+ if matches:
303
+ break
304
+
305
+ if not matches:
306
+ # (quotechar, doublequote, delimiter, skipinitialspace)
307
+ return ('', False, None, 0)
308
+ quotes = {}
309
+ delims = {}
310
+ spaces = 0
311
+ groupindex = regexp.groupindex
312
+ for m in matches:
313
+ n = groupindex['quote'] - 1
314
+ key = m[n]
315
+ if key:
316
+ quotes[key] = quotes.get(key, 0) + 1
317
+ try:
318
+ n = groupindex['delim'] - 1
319
+ key = m[n]
320
+ except KeyError:
321
+ continue
322
+ if key and (delimiters is None or key in delimiters):
323
+ delims[key] = delims.get(key, 0) + 1
324
+ try:
325
+ n = groupindex['space'] - 1
326
+ except KeyError:
327
+ continue
328
+ if m[n]:
329
+ spaces += 1
330
+
331
+ quotechar = max(quotes, key=quotes.get)
332
+
333
+ if delims:
334
+ delim = max(delims, key=delims.get)
335
+ skipinitialspace = delims[delim] == spaces
336
+ if delim == '\n': # most likely a file with a single column
337
+ delim = ''
338
+ else:
339
+ # there is *no* delimiter, it's a single column of quoted data
340
+ delim = ''
341
+ skipinitialspace = 0
342
+
343
+ # A doubled quote character inside a quoted field means
344
+ # a double quoted format. Match whole fields, so that a match
345
+ # cannot slide across field boundaries.
346
+ doublequote = False
347
+ if delim:
348
+ dq_regexp = re.compile(
349
+ r"(?:(?<=%(delim)s)|^)%(space)s%(quote)s" # ,"
350
+ r"((?:%(quote)s%(quote)s|[^%(quote)s]++)*+)" # the body
351
+ r"%(quote)s(?:%(delim)s|$)" # ",
352
+ % {'delim': re.escape(delim), 'quote': quotechar,
353
+ # Skipping spaces after a space rescans them.
354
+ 'space': ' *+' if delim != ' ' else ''},
355
+ re.MULTILINE)
356
+ dquotechar = quotechar * 2
357
+ doublequote = any(dquotechar in m[1]
358
+ for m in dq_regexp.finditer(data))
359
+
360
+ return (quotechar, doublequote, delim, skipinitialspace)
361
+
362
+
363
+ def _guess_delimiter(self, data, delimiters):
364
+ """
365
+ The delimiter /should/ occur the same number of times on
366
+ each row. However, due to malformed data, it may not. We don't want
367
+ an all or nothing approach, so we allow for small variations in this
368
+ number.
369
+ 1) build a table of the frequency of each character on every line.
370
+ 2) build a table of frequencies of this frequency (meta-frequency?),
371
+ e.g. 'x occurred 5 times in 10 rows, 6 times in 1000 rows,
372
+ 7 times in 2 rows'
373
+ 3) use the mode of the meta-frequency to determine the /expected/
374
+ frequency for that character
375
+ 4) find out how often the character actually meets that goal
376
+ 5) the character that best meets its goal is the delimiter
377
+ For performance reasons, the data is evaluated in chunks, so it can
378
+ try and evaluate the smallest portion of the data possible, evaluating
379
+ additional chunks as necessary.
380
+ """
381
+
382
+ data = list(filter(None, data.split('\n')))
383
+
384
+ ascii = [chr(c) for c in range(127)] # 7-bit ASCII
385
+
386
+ # build frequency tables
387
+ chunkLength = min(10, len(data))
388
+ iteration = 0
389
+ charFrequency = {}
390
+ modes = {}
391
+ delims = {}
392
+ start, end = 0, chunkLength
393
+ while start < len(data):
394
+ iteration += 1
395
+ for line in data[start:end]:
396
+ for char in ascii:
397
+ metaFrequency = charFrequency.get(char, {})
398
+ # must count even if frequency is 0
399
+ freq = line.count(char)
400
+ # value is the mode
401
+ metaFrequency[freq] = metaFrequency.get(freq, 0) + 1
402
+ charFrequency[char] = metaFrequency
403
+
404
+ for char in charFrequency.keys():
405
+ items = list(charFrequency[char].items())
406
+ if len(items) == 1 and items[0][0] == 0:
407
+ continue
408
+ # get the mode of the frequencies
409
+ if len(items) > 1:
410
+ modes[char] = max(items, key=lambda x: x[1])
411
+ # adjust the mode - subtract the sum of all
412
+ # other frequencies
413
+ items.remove(modes[char])
414
+ modes[char] = (modes[char][0], modes[char][1]
415
+ - sum(item[1] for item in items))
416
+ else:
417
+ modes[char] = items[0]
418
+
419
+ # build a list of possible delimiters
420
+ modeList = modes.items()
421
+ total = float(min(chunkLength * iteration, len(data)))
422
+ # (rows of consistent data) / (number of rows) = 100%
423
+ consistency = 1.0
424
+ # minimum consistency threshold
425
+ threshold = 0.9
426
+ while len(delims) == 0 and consistency >= threshold:
427
+ for k, v in modeList:
428
+ if v[0] > 0 and v[1] > 0:
429
+ if ((v[1]/total) >= consistency and
430
+ (delimiters is None or k in delimiters)):
431
+ delims[k] = v
432
+ consistency -= 0.01
433
+
434
+ if len(delims) == 1:
435
+ delim = list(delims.keys())[0]
436
+ skipinitialspace = (data[0].count(delim) ==
437
+ data[0].count("%c " % delim))
438
+ return (delim, skipinitialspace)
439
+
440
+ # analyze another chunkLength lines
441
+ start = end
442
+ end += chunkLength
443
+
444
+ if not delims:
445
+ return ('', 0)
446
+
447
+ # if there's more than one, fall back to a 'preferred' list
448
+ if len(delims) > 1:
449
+ for d in self.preferred:
450
+ if d in delims.keys():
451
+ skipinitialspace = (data[0].count(d) ==
452
+ data[0].count("%c " % d))
453
+ return (d, skipinitialspace)
454
+
455
+ # nothing else indicates a preference, pick the character that
456
+ # dominates(?)
457
+ items = [(v,k) for (k,v) in delims.items()]
458
+ items.sort()
459
+ delim = items[-1][1]
460
+
461
+ skipinitialspace = (data[0].count(delim) ==
462
+ data[0].count("%c " % delim))
463
+ return (delim, skipinitialspace)
464
+
465
+
466
+ def has_header(self, sample):
467
+ # Creates a dictionary of types of data in each column. If any
468
+ # column is of a single type (say, integers), *except* for the first
469
+ # row, then the first row is presumed to be labels. If the type
470
+ # can't be determined, it is assumed to be a string in which case
471
+ # the length of the string is the determining factor: if all of the
472
+ # rows except for the first are the same length, it's a header.
473
+ # Finally, a 'vote' is taken at the end for each column, adding or
474
+ # subtracting from the likelihood of the first row being a header.
475
+
476
+ rdr = reader(StringIO(sample), self.sniff(sample))
477
+
478
+ header = next(rdr) # assume first row is header
479
+
480
+ columns = len(header)
481
+ columnTypes = {}
482
+ for i in range(columns): columnTypes[i] = None
483
+
484
+ checked = 0
485
+ for row in rdr:
486
+ # arbitrary number of rows to check, to keep it sane
487
+ if checked > 20:
488
+ break
489
+ checked += 1
490
+
491
+ if len(row) != columns:
492
+ continue # skip rows that have irregular number of columns
493
+
494
+ for col in list(columnTypes.keys()):
495
+ thisType = complex
496
+ try:
497
+ thisType(row[col])
498
+ except (ValueError, OverflowError):
499
+ # fallback to length of string
500
+ thisType = len(row[col])
501
+
502
+ if thisType != columnTypes[col]:
503
+ if columnTypes[col] is None: # add new column type
504
+ columnTypes[col] = thisType
505
+ else:
506
+ # type is inconsistent, remove column from
507
+ # consideration
508
+ del columnTypes[col]
509
+
510
+ # finally, compare results against first row and "vote"
511
+ # on whether it's a header
512
+ hasHeader = 0
513
+ for col, colType in columnTypes.items():
514
+ if isinstance(colType, int): # it's a length
515
+ if len(header[col]) != colType:
516
+ hasHeader += 1
517
+ else:
518
+ hasHeader -= 1
519
+ else: # attempt typecast
520
+ try:
521
+ colType(header[col])
522
+ except (ValueError, TypeError):
523
+ hasHeader += 1
524
+ else:
525
+ hasHeader -= 1
526
+
527
+ return hasHeader > 0