ccxt 4.2.76__py2.py3-none-any.whl → 4.4.48__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (546) hide show
  1. ccxt/__init__.py +36 -14
  2. ccxt/abstract/alpaca.py +4 -0
  3. ccxt/abstract/bigone.py +1 -1
  4. ccxt/abstract/binance.py +112 -48
  5. ccxt/abstract/binancecoinm.py +112 -48
  6. ccxt/abstract/binanceus.py +147 -83
  7. ccxt/abstract/binanceusdm.py +112 -48
  8. ccxt/abstract/bingx.py +133 -78
  9. ccxt/abstract/bitbank.py +5 -0
  10. ccxt/abstract/bitfinex.py +136 -65
  11. ccxt/abstract/bitfinex1.py +69 -0
  12. ccxt/abstract/bitflyer.py +1 -0
  13. ccxt/abstract/bitget.py +8 -1
  14. ccxt/abstract/bitmart.py +13 -1
  15. ccxt/abstract/bitopro.py +1 -0
  16. ccxt/abstract/bitpanda.py +0 -12
  17. ccxt/abstract/bitrue.py +3 -3
  18. ccxt/abstract/bitstamp.py +26 -3
  19. ccxt/abstract/blofin.py +24 -0
  20. ccxt/abstract/btcbox.py +1 -0
  21. ccxt/abstract/bybit.py +29 -14
  22. ccxt/abstract/cex.py +28 -29
  23. ccxt/abstract/coinbase.py +6 -0
  24. ccxt/abstract/coinbaseadvanced.py +94 -0
  25. ccxt/abstract/{coinbasepro.py → coinbaseexchange.py} +1 -0
  26. ccxt/abstract/coinbaseinternational.py +1 -1
  27. ccxt/abstract/coincatch.py +94 -0
  28. ccxt/abstract/coinex.py +233 -123
  29. ccxt/abstract/coinmetro.py +1 -0
  30. ccxt/abstract/cryptocom.py +14 -0
  31. ccxt/abstract/defx.py +69 -0
  32. ccxt/abstract/deribit.py +1 -0
  33. ccxt/abstract/digifinex.py +1 -0
  34. ccxt/abstract/ellipx.py +25 -0
  35. ccxt/abstract/gate.py +20 -0
  36. ccxt/abstract/gateio.py +20 -0
  37. ccxt/abstract/gemini.py +1 -0
  38. ccxt/abstract/hashkey.py +67 -0
  39. ccxt/abstract/hyperliquid.py +1 -1
  40. ccxt/abstract/independentreserve.py +6 -0
  41. ccxt/abstract/kraken.py +4 -3
  42. ccxt/abstract/krakenfutures.py +4 -0
  43. ccxt/abstract/kucoin.py +25 -0
  44. ccxt/abstract/kucoinfutures.py +35 -0
  45. ccxt/abstract/luno.py +2 -0
  46. ccxt/abstract/mexc.py +4 -0
  47. ccxt/abstract/myokx.py +340 -0
  48. ccxt/abstract/oceanex.py +5 -0
  49. ccxt/abstract/okx.py +30 -0
  50. ccxt/abstract/onetrading.py +0 -12
  51. ccxt/abstract/oxfun.py +34 -0
  52. ccxt/abstract/paradex.py +40 -0
  53. ccxt/abstract/phemex.py +1 -0
  54. ccxt/abstract/upbit.py +4 -0
  55. ccxt/abstract/vertex.py +19 -0
  56. ccxt/abstract/whitebit.py +31 -1
  57. ccxt/abstract/woo.py +6 -2
  58. ccxt/abstract/woofipro.py +119 -0
  59. ccxt/abstract/xt.py +153 -0
  60. ccxt/abstract/zonda.py +6 -0
  61. ccxt/ace.py +164 -60
  62. ccxt/alpaca.py +727 -63
  63. ccxt/ascendex.py +395 -249
  64. ccxt/async_support/__init__.py +36 -14
  65. ccxt/async_support/ace.py +164 -60
  66. ccxt/async_support/alpaca.py +727 -63
  67. ccxt/async_support/ascendex.py +396 -249
  68. ccxt/async_support/base/exchange.py +531 -155
  69. ccxt/async_support/base/ws/aiohttp_client.py +28 -5
  70. ccxt/async_support/base/ws/cache.py +3 -2
  71. ccxt/async_support/base/ws/client.py +26 -5
  72. ccxt/async_support/base/ws/fast_client.py +4 -3
  73. ccxt/async_support/base/ws/functions.py +1 -1
  74. ccxt/async_support/base/ws/future.py +40 -31
  75. ccxt/async_support/base/ws/order_book_side.py +3 -0
  76. ccxt/async_support/bequant.py +1 -1
  77. ccxt/async_support/bigone.py +329 -202
  78. ccxt/async_support/binance.py +3513 -1511
  79. ccxt/async_support/binancecoinm.py +2 -1
  80. ccxt/async_support/binanceus.py +12 -1
  81. ccxt/async_support/binanceusdm.py +3 -1
  82. ccxt/async_support/bingx.py +3105 -881
  83. ccxt/async_support/bit2c.py +119 -38
  84. ccxt/async_support/bitbank.py +215 -76
  85. ccxt/async_support/bitbns.py +124 -53
  86. ccxt/async_support/bitfinex.py +3236 -1078
  87. ccxt/async_support/bitfinex1.py +1711 -0
  88. ccxt/async_support/bitflyer.py +239 -50
  89. ccxt/async_support/bitget.py +1513 -563
  90. ccxt/async_support/bithumb.py +201 -67
  91. ccxt/async_support/bitmart.py +1320 -435
  92. ccxt/async_support/bitmex.py +308 -111
  93. ccxt/async_support/bitopro.py +256 -96
  94. ccxt/async_support/bitrue.py +365 -233
  95. ccxt/async_support/bitso.py +201 -89
  96. ccxt/async_support/bitstamp.py +438 -269
  97. ccxt/async_support/bitteam.py +179 -73
  98. ccxt/async_support/bitvavo.py +180 -70
  99. ccxt/async_support/bl3p.py +92 -25
  100. ccxt/async_support/blockchaincom.py +193 -79
  101. ccxt/async_support/blofin.py +403 -150
  102. ccxt/async_support/btcalpha.py +161 -55
  103. ccxt/async_support/btcbox.py +250 -34
  104. ccxt/async_support/btcmarkets.py +232 -85
  105. ccxt/async_support/btcturk.py +159 -60
  106. ccxt/async_support/bybit.py +2326 -1255
  107. ccxt/async_support/cex.py +1409 -1329
  108. ccxt/async_support/coinbase.py +1455 -288
  109. ccxt/async_support/coinbaseadvanced.py +17 -0
  110. ccxt/async_support/{coinbasepro.py → coinbaseexchange.py} +233 -99
  111. ccxt/async_support/coinbaseinternational.py +428 -88
  112. ccxt/async_support/coincatch.py +5152 -0
  113. ccxt/async_support/coincheck.py +121 -38
  114. ccxt/async_support/coinex.py +4020 -3339
  115. ccxt/async_support/coinlist.py +273 -116
  116. ccxt/async_support/coinmate.py +204 -97
  117. ccxt/async_support/coinmetro.py +203 -110
  118. ccxt/async_support/coinone.py +142 -68
  119. ccxt/async_support/coinsph.py +206 -89
  120. ccxt/async_support/coinspot.py +137 -62
  121. ccxt/async_support/cryptocom.py +515 -185
  122. ccxt/async_support/currencycom.py +203 -85
  123. ccxt/async_support/defx.py +2066 -0
  124. ccxt/async_support/delta.py +467 -158
  125. ccxt/async_support/deribit.py +558 -324
  126. ccxt/async_support/digifinex.py +340 -223
  127. ccxt/async_support/ellipx.py +1826 -0
  128. ccxt/async_support/exmo.py +259 -128
  129. ccxt/async_support/gate.py +1473 -464
  130. ccxt/async_support/gemini.py +206 -84
  131. ccxt/async_support/hashkey.py +4164 -0
  132. ccxt/async_support/hitbtc.py +334 -178
  133. ccxt/async_support/hollaex.py +134 -83
  134. ccxt/async_support/htx.py +1095 -563
  135. ccxt/async_support/huobijp.py +105 -56
  136. ccxt/async_support/hyperliquid.py +1634 -269
  137. ccxt/async_support/idex.py +148 -95
  138. ccxt/async_support/independentreserve.py +236 -31
  139. ccxt/async_support/indodax.py +165 -62
  140. ccxt/async_support/kraken.py +871 -354
  141. ccxt/async_support/krakenfutures.py +324 -100
  142. ccxt/async_support/kucoin.py +1050 -355
  143. ccxt/async_support/kucoinfutures.py +1004 -149
  144. ccxt/async_support/kuna.py +138 -106
  145. ccxt/async_support/latoken.py +135 -79
  146. ccxt/async_support/lbank.py +290 -113
  147. ccxt/async_support/luno.py +112 -62
  148. ccxt/async_support/lykke.py +104 -55
  149. ccxt/async_support/mercado.py +36 -29
  150. ccxt/async_support/mexc.py +995 -429
  151. ccxt/async_support/myokx.py +43 -0
  152. ccxt/async_support/ndax.py +163 -82
  153. ccxt/async_support/novadax.py +121 -75
  154. ccxt/async_support/oceanex.py +175 -59
  155. ccxt/async_support/okcoin.py +222 -163
  156. ccxt/async_support/okx.py +1777 -455
  157. ccxt/async_support/onetrading.py +132 -414
  158. ccxt/async_support/oxfun.py +2832 -0
  159. ccxt/async_support/p2b.py +79 -51
  160. ccxt/async_support/paradex.py +2017 -0
  161. ccxt/async_support/paymium.py +56 -32
  162. ccxt/async_support/phemex.py +572 -196
  163. ccxt/async_support/poloniex.py +218 -95
  164. ccxt/async_support/poloniexfutures.py +260 -92
  165. ccxt/async_support/probit.py +143 -110
  166. ccxt/async_support/timex.py +123 -70
  167. ccxt/async_support/tokocrypto.py +129 -93
  168. ccxt/async_support/tradeogre.py +39 -25
  169. ccxt/async_support/upbit.py +322 -113
  170. ccxt/async_support/vertex.py +2983 -0
  171. ccxt/async_support/wavesexchange.py +227 -173
  172. ccxt/async_support/wazirx.py +145 -65
  173. ccxt/async_support/whitebit.py +533 -138
  174. ccxt/async_support/woo.py +1155 -295
  175. ccxt/async_support/woofipro.py +2716 -0
  176. ccxt/async_support/xt.py +4628 -0
  177. ccxt/async_support/yobit.py +160 -92
  178. ccxt/async_support/zaif.py +80 -33
  179. ccxt/async_support/zonda.py +140 -69
  180. ccxt/base/errors.py +51 -20
  181. ccxt/base/exchange.py +1729 -482
  182. ccxt/base/precise.py +10 -0
  183. ccxt/base/types.py +223 -4
  184. ccxt/bequant.py +1 -1
  185. ccxt/bigone.py +329 -202
  186. ccxt/binance.py +3513 -1511
  187. ccxt/binancecoinm.py +2 -1
  188. ccxt/binanceus.py +12 -1
  189. ccxt/binanceusdm.py +3 -1
  190. ccxt/bingx.py +3105 -881
  191. ccxt/bit2c.py +119 -38
  192. ccxt/bitbank.py +215 -76
  193. ccxt/bitbns.py +124 -53
  194. ccxt/bitfinex.py +3235 -1078
  195. ccxt/bitfinex1.py +1710 -0
  196. ccxt/bitflyer.py +239 -50
  197. ccxt/bitget.py +1513 -563
  198. ccxt/bithumb.py +200 -67
  199. ccxt/bitmart.py +1320 -435
  200. ccxt/bitmex.py +308 -111
  201. ccxt/bitopro.py +256 -96
  202. ccxt/bitrue.py +365 -233
  203. ccxt/bitso.py +201 -89
  204. ccxt/bitstamp.py +438 -269
  205. ccxt/bitteam.py +179 -73
  206. ccxt/bitvavo.py +180 -70
  207. ccxt/bl3p.py +92 -25
  208. ccxt/blockchaincom.py +193 -79
  209. ccxt/blofin.py +403 -150
  210. ccxt/btcalpha.py +161 -55
  211. ccxt/btcbox.py +250 -34
  212. ccxt/btcmarkets.py +232 -85
  213. ccxt/btcturk.py +159 -60
  214. ccxt/bybit.py +2326 -1255
  215. ccxt/cex.py +1408 -1329
  216. ccxt/coinbase.py +1455 -288
  217. ccxt/coinbaseadvanced.py +17 -0
  218. ccxt/{coinbasepro.py → coinbaseexchange.py} +233 -99
  219. ccxt/coinbaseinternational.py +428 -88
  220. ccxt/coincatch.py +5152 -0
  221. ccxt/coincheck.py +121 -38
  222. ccxt/coinex.py +4020 -3339
  223. ccxt/coinlist.py +273 -116
  224. ccxt/coinmate.py +204 -97
  225. ccxt/coinmetro.py +203 -110
  226. ccxt/coinone.py +142 -68
  227. ccxt/coinsph.py +206 -89
  228. ccxt/coinspot.py +137 -62
  229. ccxt/cryptocom.py +515 -185
  230. ccxt/currencycom.py +203 -85
  231. ccxt/defx.py +2065 -0
  232. ccxt/delta.py +467 -158
  233. ccxt/deribit.py +558 -324
  234. ccxt/digifinex.py +340 -223
  235. ccxt/ellipx.py +1826 -0
  236. ccxt/exmo.py +259 -128
  237. ccxt/gate.py +1473 -464
  238. ccxt/gemini.py +206 -84
  239. ccxt/hashkey.py +4164 -0
  240. ccxt/hitbtc.py +334 -178
  241. ccxt/hollaex.py +134 -83
  242. ccxt/htx.py +1095 -563
  243. ccxt/huobijp.py +105 -56
  244. ccxt/hyperliquid.py +1633 -269
  245. ccxt/idex.py +148 -95
  246. ccxt/independentreserve.py +235 -31
  247. ccxt/indodax.py +165 -62
  248. ccxt/kraken.py +871 -354
  249. ccxt/krakenfutures.py +324 -100
  250. ccxt/kucoin.py +1050 -355
  251. ccxt/kucoinfutures.py +1004 -149
  252. ccxt/kuna.py +138 -106
  253. ccxt/latoken.py +135 -79
  254. ccxt/lbank.py +290 -113
  255. ccxt/luno.py +112 -62
  256. ccxt/lykke.py +104 -55
  257. ccxt/mercado.py +36 -29
  258. ccxt/mexc.py +994 -429
  259. ccxt/myokx.py +43 -0
  260. ccxt/ndax.py +163 -82
  261. ccxt/novadax.py +121 -75
  262. ccxt/oceanex.py +175 -59
  263. ccxt/okcoin.py +222 -163
  264. ccxt/okx.py +1777 -455
  265. ccxt/onetrading.py +132 -414
  266. ccxt/oxfun.py +2831 -0
  267. ccxt/p2b.py +79 -51
  268. ccxt/paradex.py +2017 -0
  269. ccxt/paymium.py +56 -32
  270. ccxt/phemex.py +572 -196
  271. ccxt/poloniex.py +218 -95
  272. ccxt/poloniexfutures.py +260 -92
  273. ccxt/pro/__init__.py +29 -5
  274. ccxt/pro/alpaca.py +32 -17
  275. ccxt/pro/ascendex.py +63 -15
  276. ccxt/pro/bequant.py +4 -0
  277. ccxt/pro/binance.py +1596 -329
  278. ccxt/pro/binancecoinm.py +1 -0
  279. ccxt/pro/binanceus.py +2 -9
  280. ccxt/pro/binanceusdm.py +2 -0
  281. ccxt/pro/bingx.py +527 -134
  282. ccxt/pro/bitcoincom.py +4 -1
  283. ccxt/pro/bitfinex.py +731 -266
  284. ccxt/pro/bitfinex1.py +635 -0
  285. ccxt/pro/bitget.py +726 -357
  286. ccxt/pro/bithumb.py +380 -0
  287. ccxt/pro/bitmart.py +138 -39
  288. ccxt/pro/bitmex.py +199 -40
  289. ccxt/pro/bitopro.py +25 -13
  290. ccxt/pro/bitrue.py +31 -32
  291. ccxt/pro/bitstamp.py +7 -6
  292. ccxt/pro/bitvavo.py +204 -82
  293. ccxt/pro/blockchaincom.py +30 -17
  294. ccxt/pro/blofin.py +692 -0
  295. ccxt/pro/bybit.py +791 -82
  296. ccxt/pro/cex.py +99 -51
  297. ccxt/pro/coinbase.py +220 -30
  298. ccxt/{async_support/hitbtc3.py → pro/coinbaseadvanced.py} +5 -5
  299. ccxt/pro/{coinbasepro.py → coinbaseexchange.py} +19 -19
  300. ccxt/pro/coinbaseinternational.py +193 -30
  301. ccxt/pro/coincatch.py +1464 -0
  302. ccxt/pro/coincheck.py +11 -6
  303. ccxt/pro/coinex.py +967 -661
  304. ccxt/pro/coinone.py +17 -10
  305. ccxt/pro/cryptocom.py +446 -66
  306. ccxt/pro/currencycom.py +11 -10
  307. ccxt/pro/defx.py +832 -0
  308. ccxt/pro/deribit.py +168 -32
  309. ccxt/pro/exmo.py +253 -21
  310. ccxt/pro/gate.py +729 -64
  311. ccxt/pro/gemini.py +44 -26
  312. ccxt/pro/hashkey.py +802 -0
  313. ccxt/pro/hitbtc.py +208 -103
  314. ccxt/pro/hollaex.py +25 -9
  315. ccxt/pro/htx.py +83 -39
  316. ccxt/pro/huobijp.py +17 -16
  317. ccxt/pro/hyperliquid.py +502 -31
  318. ccxt/pro/idex.py +28 -13
  319. ccxt/pro/independentreserve.py +21 -16
  320. ccxt/pro/kraken.py +298 -51
  321. ccxt/pro/krakenfutures.py +166 -75
  322. ccxt/pro/kucoin.py +395 -77
  323. ccxt/pro/kucoinfutures.py +400 -99
  324. ccxt/pro/lbank.py +52 -31
  325. ccxt/pro/luno.py +12 -10
  326. ccxt/pro/mexc.py +400 -50
  327. ccxt/pro/myokx.py +28 -0
  328. ccxt/pro/ndax.py +25 -12
  329. ccxt/pro/okcoin.py +28 -9
  330. ccxt/pro/okx.py +935 -124
  331. ccxt/pro/onetrading.py +41 -24
  332. ccxt/pro/oxfun.py +1054 -0
  333. ccxt/pro/p2b.py +100 -24
  334. ccxt/pro/paradex.py +352 -0
  335. ccxt/pro/phemex.py +93 -34
  336. ccxt/pro/poloniex.py +129 -50
  337. ccxt/pro/poloniexfutures.py +53 -32
  338. ccxt/pro/probit.py +93 -86
  339. ccxt/pro/upbit.py +401 -8
  340. ccxt/pro/vertex.py +943 -0
  341. ccxt/pro/wazirx.py +46 -28
  342. ccxt/pro/whitebit.py +65 -12
  343. ccxt/pro/woo.py +486 -70
  344. ccxt/pro/woofipro.py +1271 -0
  345. ccxt/pro/xt.py +1067 -0
  346. ccxt/probit.py +143 -110
  347. ccxt/static_dependencies/__init__.py +1 -1
  348. ccxt/static_dependencies/lark/__init__.py +38 -0
  349. ccxt/static_dependencies/lark/__pyinstaller/__init__.py +6 -0
  350. ccxt/static_dependencies/lark/__pyinstaller/hook-lark.py +14 -0
  351. ccxt/static_dependencies/lark/ast_utils.py +59 -0
  352. ccxt/static_dependencies/lark/common.py +86 -0
  353. ccxt/static_dependencies/lark/exceptions.py +292 -0
  354. ccxt/static_dependencies/lark/grammar.py +130 -0
  355. ccxt/static_dependencies/lark/grammars/__init__.py +0 -0
  356. ccxt/static_dependencies/lark/indenter.py +143 -0
  357. ccxt/static_dependencies/lark/lark.py +658 -0
  358. ccxt/static_dependencies/lark/lexer.py +678 -0
  359. ccxt/static_dependencies/lark/load_grammar.py +1428 -0
  360. ccxt/static_dependencies/lark/parse_tree_builder.py +391 -0
  361. ccxt/static_dependencies/lark/parser_frontends.py +257 -0
  362. ccxt/static_dependencies/lark/parsers/__init__.py +0 -0
  363. ccxt/static_dependencies/lark/parsers/cyk.py +340 -0
  364. ccxt/static_dependencies/lark/parsers/earley.py +314 -0
  365. ccxt/static_dependencies/lark/parsers/earley_common.py +42 -0
  366. ccxt/static_dependencies/lark/parsers/earley_forest.py +801 -0
  367. ccxt/static_dependencies/lark/parsers/grammar_analysis.py +203 -0
  368. ccxt/static_dependencies/lark/parsers/lalr_analysis.py +332 -0
  369. ccxt/static_dependencies/lark/parsers/lalr_interactive_parser.py +158 -0
  370. ccxt/static_dependencies/lark/parsers/lalr_parser.py +122 -0
  371. ccxt/static_dependencies/lark/parsers/lalr_parser_state.py +110 -0
  372. ccxt/static_dependencies/lark/parsers/xearley.py +165 -0
  373. ccxt/static_dependencies/lark/py.typed +0 -0
  374. ccxt/static_dependencies/lark/reconstruct.py +107 -0
  375. ccxt/static_dependencies/lark/tools/__init__.py +70 -0
  376. ccxt/static_dependencies/lark/tools/nearley.py +202 -0
  377. ccxt/static_dependencies/lark/tools/serialize.py +32 -0
  378. ccxt/static_dependencies/lark/tools/standalone.py +196 -0
  379. ccxt/static_dependencies/lark/tree.py +267 -0
  380. ccxt/static_dependencies/lark/tree_matcher.py +186 -0
  381. ccxt/static_dependencies/lark/tree_templates.py +180 -0
  382. ccxt/static_dependencies/lark/utils.py +343 -0
  383. ccxt/static_dependencies/lark/visitors.py +596 -0
  384. ccxt/static_dependencies/marshmallow/__init__.py +81 -0
  385. ccxt/static_dependencies/marshmallow/base.py +65 -0
  386. ccxt/static_dependencies/marshmallow/class_registry.py +94 -0
  387. ccxt/static_dependencies/marshmallow/decorators.py +231 -0
  388. ccxt/static_dependencies/marshmallow/error_store.py +60 -0
  389. ccxt/static_dependencies/marshmallow/exceptions.py +71 -0
  390. ccxt/static_dependencies/marshmallow/fields.py +2114 -0
  391. ccxt/static_dependencies/marshmallow/orderedset.py +89 -0
  392. ccxt/static_dependencies/marshmallow/py.typed +0 -0
  393. ccxt/static_dependencies/marshmallow/schema.py +1228 -0
  394. ccxt/static_dependencies/marshmallow/types.py +12 -0
  395. ccxt/static_dependencies/marshmallow/utils.py +378 -0
  396. ccxt/static_dependencies/marshmallow/validate.py +678 -0
  397. ccxt/static_dependencies/marshmallow/warnings.py +2 -0
  398. ccxt/static_dependencies/marshmallow_dataclass/__init__.py +1047 -0
  399. ccxt/static_dependencies/marshmallow_dataclass/collection_field.py +51 -0
  400. ccxt/static_dependencies/marshmallow_dataclass/lazy_class_attribute.py +45 -0
  401. ccxt/static_dependencies/marshmallow_dataclass/mypy.py +71 -0
  402. ccxt/static_dependencies/marshmallow_dataclass/py.typed +0 -0
  403. ccxt/static_dependencies/marshmallow_dataclass/typing.py +14 -0
  404. ccxt/static_dependencies/marshmallow_dataclass/union_field.py +82 -0
  405. ccxt/static_dependencies/marshmallow_oneofschema/__init__.py +1 -0
  406. ccxt/static_dependencies/marshmallow_oneofschema/one_of_schema.py +193 -0
  407. ccxt/static_dependencies/marshmallow_oneofschema/py.typed +0 -0
  408. ccxt/static_dependencies/starknet/__init__.py +0 -0
  409. ccxt/static_dependencies/starknet/cairo/__init__.py +0 -0
  410. ccxt/static_dependencies/starknet/cairo/data_types.py +123 -0
  411. ccxt/static_dependencies/starknet/cairo/deprecated_parse/__init__.py +0 -0
  412. ccxt/static_dependencies/starknet/cairo/deprecated_parse/cairo_types.py +77 -0
  413. ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser.py +46 -0
  414. ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser_transformer.py +138 -0
  415. ccxt/static_dependencies/starknet/cairo/felt.py +64 -0
  416. ccxt/static_dependencies/starknet/cairo/type_parser.py +121 -0
  417. ccxt/static_dependencies/starknet/cairo/v1/__init__.py +0 -0
  418. ccxt/static_dependencies/starknet/cairo/v1/type_parser.py +59 -0
  419. ccxt/static_dependencies/starknet/cairo/v2/__init__.py +0 -0
  420. ccxt/static_dependencies/starknet/cairo/v2/type_parser.py +77 -0
  421. ccxt/static_dependencies/starknet/ccxt_utils.py +7 -0
  422. ccxt/static_dependencies/starknet/common.py +15 -0
  423. ccxt/static_dependencies/starknet/constants.py +39 -0
  424. ccxt/static_dependencies/starknet/hash/__init__.py +0 -0
  425. ccxt/static_dependencies/starknet/hash/address.py +79 -0
  426. ccxt/static_dependencies/starknet/hash/compiled_class_hash_objects.py +111 -0
  427. ccxt/static_dependencies/starknet/hash/selector.py +16 -0
  428. ccxt/static_dependencies/starknet/hash/storage.py +12 -0
  429. ccxt/static_dependencies/starknet/hash/utils.py +78 -0
  430. ccxt/static_dependencies/starknet/models/__init__.py +0 -0
  431. ccxt/static_dependencies/starknet/models/typed_data.py +45 -0
  432. ccxt/static_dependencies/starknet/serialization/__init__.py +24 -0
  433. ccxt/static_dependencies/starknet/serialization/_calldata_reader.py +40 -0
  434. ccxt/static_dependencies/starknet/serialization/_context.py +142 -0
  435. ccxt/static_dependencies/starknet/serialization/data_serializers/__init__.py +10 -0
  436. ccxt/static_dependencies/starknet/serialization/data_serializers/_common.py +82 -0
  437. ccxt/static_dependencies/starknet/serialization/data_serializers/array_serializer.py +43 -0
  438. ccxt/static_dependencies/starknet/serialization/data_serializers/bool_serializer.py +37 -0
  439. ccxt/static_dependencies/starknet/serialization/data_serializers/byte_array_serializer.py +66 -0
  440. ccxt/static_dependencies/starknet/serialization/data_serializers/cairo_data_serializer.py +71 -0
  441. ccxt/static_dependencies/starknet/serialization/data_serializers/enum_serializer.py +71 -0
  442. ccxt/static_dependencies/starknet/serialization/data_serializers/felt_serializer.py +50 -0
  443. ccxt/static_dependencies/starknet/serialization/data_serializers/named_tuple_serializer.py +58 -0
  444. ccxt/static_dependencies/starknet/serialization/data_serializers/option_serializer.py +43 -0
  445. ccxt/static_dependencies/starknet/serialization/data_serializers/output_serializer.py +40 -0
  446. ccxt/static_dependencies/starknet/serialization/data_serializers/payload_serializer.py +72 -0
  447. ccxt/static_dependencies/starknet/serialization/data_serializers/struct_serializer.py +36 -0
  448. ccxt/static_dependencies/starknet/serialization/data_serializers/tuple_serializer.py +36 -0
  449. ccxt/static_dependencies/starknet/serialization/data_serializers/uint256_serializer.py +76 -0
  450. ccxt/static_dependencies/starknet/serialization/data_serializers/uint_serializer.py +100 -0
  451. ccxt/static_dependencies/starknet/serialization/data_serializers/unit_serializer.py +32 -0
  452. ccxt/static_dependencies/starknet/serialization/errors.py +10 -0
  453. ccxt/static_dependencies/starknet/serialization/factory.py +229 -0
  454. ccxt/static_dependencies/starknet/serialization/function_serialization_adapter.py +110 -0
  455. ccxt/static_dependencies/starknet/serialization/tuple_dataclass.py +59 -0
  456. ccxt/static_dependencies/starknet/utils/__init__.py +0 -0
  457. ccxt/static_dependencies/starknet/utils/constructor_args_translator.py +86 -0
  458. ccxt/static_dependencies/starknet/utils/iterable.py +13 -0
  459. ccxt/static_dependencies/starknet/utils/schema.py +13 -0
  460. ccxt/static_dependencies/starknet/utils/typed_data.py +182 -0
  461. ccxt/static_dependencies/starkware/__init__.py +0 -0
  462. ccxt/static_dependencies/starkware/crypto/__init__.py +0 -0
  463. ccxt/static_dependencies/starkware/crypto/fast_pedersen_hash.py +50 -0
  464. ccxt/static_dependencies/starkware/crypto/math_utils.py +78 -0
  465. ccxt/static_dependencies/starkware/crypto/signature.py +2344 -0
  466. ccxt/static_dependencies/starkware/crypto/utils.py +63 -0
  467. ccxt/static_dependencies/sympy/__init__.py +0 -0
  468. ccxt/static_dependencies/sympy/core/__init__.py +0 -0
  469. ccxt/static_dependencies/sympy/core/intfunc.py +35 -0
  470. ccxt/static_dependencies/sympy/external/__init__.py +0 -0
  471. ccxt/static_dependencies/sympy/external/gmpy.py +345 -0
  472. ccxt/static_dependencies/sympy/external/importtools.py +187 -0
  473. ccxt/static_dependencies/sympy/external/ntheory.py +637 -0
  474. ccxt/static_dependencies/sympy/external/pythonmpq.py +341 -0
  475. ccxt/static_dependencies/typing_inspect/__init__.py +0 -0
  476. ccxt/static_dependencies/typing_inspect/typing_inspect.py +851 -0
  477. ccxt/test/{test_async.py → tests_async.py} +465 -407
  478. ccxt/test/tests_helpers.py +285 -0
  479. ccxt/test/tests_init.py +39 -0
  480. ccxt/test/{test_sync.py → tests_sync.py} +465 -409
  481. ccxt/timex.py +123 -70
  482. ccxt/tokocrypto.py +129 -93
  483. ccxt/tradeogre.py +39 -25
  484. ccxt/upbit.py +322 -113
  485. ccxt/vertex.py +2983 -0
  486. ccxt/wavesexchange.py +227 -173
  487. ccxt/wazirx.py +145 -65
  488. ccxt/whitebit.py +533 -138
  489. ccxt/woo.py +1155 -295
  490. ccxt/woofipro.py +2716 -0
  491. ccxt/xt.py +4627 -0
  492. ccxt/yobit.py +159 -92
  493. ccxt/zaif.py +80 -33
  494. ccxt/zonda.py +140 -69
  495. ccxt-4.4.48.dist-info/LICENSE.txt +21 -0
  496. ccxt-4.4.48.dist-info/METADATA +646 -0
  497. ccxt-4.4.48.dist-info/RECORD +669 -0
  498. {ccxt-4.2.76.dist-info → ccxt-4.4.48.dist-info}/WHEEL +1 -1
  499. ccxt/abstract/bitbay.py +0 -47
  500. ccxt/abstract/bitfinex2.py +0 -139
  501. ccxt/abstract/hitbtc3.py +0 -115
  502. ccxt/async_support/bitbay.py +0 -17
  503. ccxt/async_support/bitfinex2.py +0 -3496
  504. ccxt/async_support/flowbtc.py +0 -34
  505. ccxt/bitbay.py +0 -17
  506. ccxt/bitfinex2.py +0 -3496
  507. ccxt/flowbtc.py +0 -34
  508. ccxt/hitbtc3.py +0 -16
  509. ccxt/pro/bitfinex2.py +0 -1081
  510. ccxt/test/base/__init__.py +0 -28
  511. ccxt/test/base/test_account.py +0 -26
  512. ccxt/test/base/test_balance.py +0 -56
  513. ccxt/test/base/test_borrow_interest.py +0 -35
  514. ccxt/test/base/test_borrow_rate.py +0 -32
  515. ccxt/test/base/test_calculate_fee.py +0 -51
  516. ccxt/test/base/test_crypto.py +0 -127
  517. ccxt/test/base/test_currency.py +0 -76
  518. ccxt/test/base/test_datetime.py +0 -103
  519. ccxt/test/base/test_decimal_to_precision.py +0 -392
  520. ccxt/test/base/test_deep_extend.py +0 -68
  521. ccxt/test/base/test_deposit_withdrawal.py +0 -50
  522. ccxt/test/base/test_exchange_datetime_functions.py +0 -76
  523. ccxt/test/base/test_funding_rate_history.py +0 -29
  524. ccxt/test/base/test_last_price.py +0 -32
  525. ccxt/test/base/test_ledger_entry.py +0 -45
  526. ccxt/test/base/test_ledger_item.py +0 -48
  527. ccxt/test/base/test_leverage_tier.py +0 -33
  528. ccxt/test/base/test_margin_mode.py +0 -24
  529. ccxt/test/base/test_margin_modification.py +0 -35
  530. ccxt/test/base/test_market.py +0 -190
  531. ccxt/test/base/test_number.py +0 -411
  532. ccxt/test/base/test_ohlcv.py +0 -32
  533. ccxt/test/base/test_open_interest.py +0 -32
  534. ccxt/test/base/test_order.py +0 -64
  535. ccxt/test/base/test_order_book.py +0 -63
  536. ccxt/test/base/test_position.py +0 -60
  537. ccxt/test/base/test_shared_methods.py +0 -345
  538. ccxt/test/base/test_status.py +0 -24
  539. ccxt/test/base/test_throttle.py +0 -126
  540. ccxt/test/base/test_ticker.py +0 -86
  541. ccxt/test/base/test_trade.py +0 -47
  542. ccxt/test/base/test_trading_fee.py +0 -26
  543. ccxt/test/base/test_transaction.py +0 -39
  544. ccxt-4.2.76.dist-info/METADATA +0 -626
  545. ccxt-4.2.76.dist-info/RECORD +0 -534
  546. {ccxt-4.2.76.dist-info → ccxt-4.4.48.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,658 @@
1
+ from abc import ABC, abstractmethod
2
+ import getpass
3
+ import sys, os, pickle
4
+ import tempfile
5
+ import types
6
+ import re
7
+ from typing import (
8
+ TypeVar, Type, List, Dict, Iterator, Callable, Union, Optional, Sequence,
9
+ Tuple, Iterable, IO, Any, TYPE_CHECKING, Collection
10
+ )
11
+ if TYPE_CHECKING:
12
+ from .parsers.lalr_interactive_parser import InteractiveParser
13
+ from .tree import ParseTree
14
+ from .visitors import Transformer
15
+ from typing import Literal
16
+ from .parser_frontends import ParsingFrontend
17
+
18
+ from .exceptions import ConfigurationError, assert_config, UnexpectedInput
19
+ from .utils import Serialize, SerializeMemoizer, FS, logger
20
+ from .load_grammar import load_grammar, FromPackageLoader, Grammar, verify_used_files, PackageResource, sha256_digest
21
+ from .tree import Tree
22
+ from .common import LexerConf, ParserConf, _ParserArgType, _LexerArgType
23
+
24
+ from .lexer import Lexer, BasicLexer, TerminalDef, LexerThread, Token
25
+ from .parse_tree_builder import ParseTreeBuilder
26
+ from .parser_frontends import _validate_frontend_args, _get_lexer_callbacks, _deserialize_parsing_frontend, _construct_parsing_frontend
27
+ from .grammar import Rule
28
+
29
+
30
+ try:
31
+ import regex
32
+ _has_regex = True
33
+ except ImportError:
34
+ _has_regex = False
35
+
36
+
37
+ ###{standalone
38
+
39
+
40
+ class PostLex(ABC):
41
+ @abstractmethod
42
+ def process(self, stream: Iterator[Token]) -> Iterator[Token]:
43
+ return stream
44
+
45
+ always_accept: Iterable[str] = ()
46
+
47
+ class LarkOptions(Serialize):
48
+ """Specifies the options for Lark
49
+
50
+ """
51
+
52
+ start: List[str]
53
+ debug: bool
54
+ strict: bool
55
+ transformer: 'Optional[Transformer]'
56
+ propagate_positions: Union[bool, str]
57
+ maybe_placeholders: bool
58
+ cache: Union[bool, str]
59
+ regex: bool
60
+ g_regex_flags: int
61
+ keep_all_tokens: bool
62
+ tree_class: Optional[Callable[[str, List], Any]]
63
+ parser: _ParserArgType
64
+ lexer: _LexerArgType
65
+ ambiguity: 'Literal["auto", "resolve", "explicit", "forest"]'
66
+ postlex: Optional[PostLex]
67
+ priority: 'Optional[Literal["auto", "normal", "invert"]]'
68
+ lexer_callbacks: Dict[str, Callable[[Token], Token]]
69
+ use_bytes: bool
70
+ ordered_sets: bool
71
+ edit_terminals: Optional[Callable[[TerminalDef], TerminalDef]]
72
+ import_paths: 'List[Union[str, Callable[[Union[None, str, PackageResource], str], Tuple[str, str]]]]'
73
+ source_path: Optional[str]
74
+
75
+ OPTIONS_DOC = r"""
76
+ **=== General Options ===**
77
+
78
+ start
79
+ The start symbol. Either a string, or a list of strings for multiple possible starts (Default: "start")
80
+ debug
81
+ Display debug information and extra warnings. Use only when debugging (Default: ``False``)
82
+ When used with Earley, it generates a forest graph as "sppf.png", if 'dot' is installed.
83
+ strict
84
+ Throw an exception on any potential ambiguity, including shift/reduce conflicts, and regex collisions.
85
+ transformer
86
+ Applies the transformer to every parse tree (equivalent to applying it after the parse, but faster)
87
+ propagate_positions
88
+ Propagates positional attributes into the 'meta' attribute of all tree branches.
89
+ Sets attributes: (line, column, end_line, end_column, start_pos, end_pos,
90
+ container_line, container_column, container_end_line, container_end_column)
91
+ Accepts ``False``, ``True``, or a callable, which will filter which nodes to ignore when propagating.
92
+ maybe_placeholders
93
+ When ``True``, the ``[]`` operator returns ``None`` when not matched.
94
+ When ``False``, ``[]`` behaves like the ``?`` operator, and returns no value at all.
95
+ (default= ``True``)
96
+ cache
97
+ Cache the results of the Lark grammar analysis, for x2 to x3 faster loading. LALR only for now.
98
+
99
+ - When ``False``, does nothing (default)
100
+ - When ``True``, caches to a temporary file in the local directory
101
+ - When given a string, caches to the path pointed by the string
102
+ regex
103
+ When True, uses the ``regex`` module instead of the stdlib ``re``.
104
+ g_regex_flags
105
+ Flags that are applied to all terminals (both regex and strings)
106
+ keep_all_tokens
107
+ Prevent the tree builder from automagically removing "punctuation" tokens (Default: ``False``)
108
+ tree_class
109
+ Lark will produce trees comprised of instances of this class instead of the default ``lark.Tree``.
110
+
111
+ **=== Algorithm Options ===**
112
+
113
+ parser
114
+ Decides which parser engine to use. Accepts "earley" or "lalr". (Default: "earley").
115
+ (there is also a "cyk" option for legacy)
116
+ lexer
117
+ Decides whether or not to use a lexer stage
118
+
119
+ - "auto" (default): Choose for me based on the parser
120
+ - "basic": Use a basic lexer
121
+ - "contextual": Stronger lexer (only works with parser="lalr")
122
+ - "dynamic": Flexible and powerful (only with parser="earley")
123
+ - "dynamic_complete": Same as dynamic, but tries *every* variation of tokenizing possible.
124
+ ambiguity
125
+ Decides how to handle ambiguity in the parse. Only relevant if parser="earley"
126
+
127
+ - "resolve": The parser will automatically choose the simplest derivation
128
+ (it chooses consistently: greedy for tokens, non-greedy for rules)
129
+ - "explicit": The parser will return all derivations wrapped in "_ambig" tree nodes (i.e. a forest).
130
+ - "forest": The parser will return the root of the shared packed parse forest.
131
+
132
+ **=== Misc. / Domain Specific Options ===**
133
+
134
+ postlex
135
+ Lexer post-processing (Default: ``None``) Only works with the basic and contextual lexers.
136
+ priority
137
+ How priorities should be evaluated - "auto", ``None``, "normal", "invert" (Default: "auto")
138
+ lexer_callbacks
139
+ Dictionary of callbacks for the lexer. May alter tokens during lexing. Use with caution.
140
+ use_bytes
141
+ Accept an input of type ``bytes`` instead of ``str``.
142
+ ordered_sets
143
+ Should Earley use ordered-sets to achieve stable output (~10% slower than regular sets. Default: True)
144
+ edit_terminals
145
+ A callback for editing the terminals before parse.
146
+ import_paths
147
+ A List of either paths or loader functions to specify from where grammars are imported
148
+ source_path
149
+ Override the source of from where the grammar was loaded. Useful for relative imports and unconventional grammar loading
150
+ **=== End of Options ===**
151
+ """
152
+ if __doc__:
153
+ __doc__ += OPTIONS_DOC
154
+
155
+
156
+ # Adding a new option needs to be done in multiple places:
157
+ # - In the dictionary below. This is the primary truth of which options `Lark.__init__` accepts
158
+ # - In the docstring above. It is used both for the docstring of `LarkOptions` and `Lark`, and in readthedocs
159
+ # - As an attribute of `LarkOptions` above
160
+ # - Potentially in `_LOAD_ALLOWED_OPTIONS` below this class, when the option doesn't change how the grammar is loaded
161
+ # - Potentially in `lark.tools.__init__`, if it makes sense, and it can easily be passed as a cmd argument
162
+ _defaults: Dict[str, Any] = {
163
+ 'debug': False,
164
+ 'strict': False,
165
+ 'keep_all_tokens': False,
166
+ 'tree_class': None,
167
+ 'cache': False,
168
+ 'postlex': None,
169
+ 'parser': 'earley',
170
+ 'lexer': 'auto',
171
+ 'transformer': None,
172
+ 'start': 'start',
173
+ 'priority': 'auto',
174
+ 'ambiguity': 'auto',
175
+ 'regex': False,
176
+ 'propagate_positions': False,
177
+ 'lexer_callbacks': {},
178
+ 'maybe_placeholders': True,
179
+ 'edit_terminals': None,
180
+ 'g_regex_flags': 0,
181
+ 'use_bytes': False,
182
+ 'ordered_sets': True,
183
+ 'import_paths': [],
184
+ 'source_path': None,
185
+ '_plugins': {},
186
+ }
187
+
188
+ def __init__(self, options_dict: Dict[str, Any]) -> None:
189
+ o = dict(options_dict)
190
+
191
+ options = {}
192
+ for name, default in self._defaults.items():
193
+ if name in o:
194
+ value = o.pop(name)
195
+ if isinstance(default, bool) and name not in ('cache', 'use_bytes', 'propagate_positions'):
196
+ value = bool(value)
197
+ else:
198
+ value = default
199
+
200
+ options[name] = value
201
+
202
+ if isinstance(options['start'], str):
203
+ options['start'] = [options['start']]
204
+
205
+ self.__dict__['options'] = options
206
+
207
+
208
+ assert_config(self.parser, ('earley', 'lalr', 'cyk', None))
209
+
210
+ if self.parser == 'earley' and self.transformer:
211
+ raise ConfigurationError('Cannot specify an embedded transformer when using the Earley algorithm. '
212
+ 'Please use your transformer on the resulting parse tree, or use a different algorithm (i.e. LALR)')
213
+
214
+ if o:
215
+ raise ConfigurationError("Unknown options: %s" % o.keys())
216
+
217
+ def __getattr__(self, name: str) -> Any:
218
+ try:
219
+ return self.__dict__['options'][name]
220
+ except KeyError as e:
221
+ raise AttributeError(e)
222
+
223
+ def __setattr__(self, name: str, value: str) -> None:
224
+ assert_config(name, self.options.keys(), "%r isn't a valid option. Expected one of: %s")
225
+ self.options[name] = value
226
+
227
+ def serialize(self, memo = None) -> Dict[str, Any]:
228
+ return self.options
229
+
230
+ @classmethod
231
+ def deserialize(cls, data: Dict[str, Any], memo: Dict[int, Union[TerminalDef, Rule]]) -> "LarkOptions":
232
+ return cls(data)
233
+
234
+
235
+ # Options that can be passed to the Lark parser, even when it was loaded from cache/standalone.
236
+ # These options are only used outside of `load_grammar`.
237
+ _LOAD_ALLOWED_OPTIONS = {'postlex', 'transformer', 'lexer_callbacks', 'use_bytes', 'debug', 'g_regex_flags', 'regex', 'propagate_positions', 'tree_class', '_plugins'}
238
+
239
+ _VALID_PRIORITY_OPTIONS = ('auto', 'normal', 'invert', None)
240
+ _VALID_AMBIGUITY_OPTIONS = ('auto', 'resolve', 'explicit', 'forest')
241
+
242
+
243
+ _T = TypeVar('_T', bound="Lark")
244
+
245
+ class Lark(Serialize):
246
+ """Main interface for the library.
247
+
248
+ It's mostly a thin wrapper for the many different parsers, and for the tree constructor.
249
+
250
+ Parameters:
251
+ grammar: a string or file-object containing the grammar spec (using Lark's ebnf syntax)
252
+ options: a dictionary controlling various aspects of Lark.
253
+
254
+ Example:
255
+ >>> Lark(r'''start: "foo" ''')
256
+ Lark(...)
257
+ """
258
+
259
+ source_path: str
260
+ source_grammar: str
261
+ grammar: 'Grammar'
262
+ options: LarkOptions
263
+ lexer: Lexer
264
+ parser: 'ParsingFrontend'
265
+ terminals: Collection[TerminalDef]
266
+
267
+ def __init__(self, grammar: 'Union[Grammar, str, IO[str]]', **options) -> None:
268
+ self.options = LarkOptions(options)
269
+ re_module: types.ModuleType
270
+
271
+ # Set regex or re module
272
+ use_regex = self.options.regex
273
+ if use_regex:
274
+ if _has_regex:
275
+ re_module = regex
276
+ else:
277
+ raise ImportError('`regex` module must be installed if calling `Lark(regex=True)`.')
278
+ else:
279
+ re_module = re
280
+
281
+ # Some, but not all file-like objects have a 'name' attribute
282
+ if self.options.source_path is None:
283
+ try:
284
+ self.source_path = grammar.name # type: ignore[union-attr]
285
+ except AttributeError:
286
+ self.source_path = '<string>'
287
+ else:
288
+ self.source_path = self.options.source_path
289
+
290
+ # Drain file-like objects to get their contents
291
+ try:
292
+ read = grammar.read # type: ignore[union-attr]
293
+ except AttributeError:
294
+ pass
295
+ else:
296
+ grammar = read()
297
+
298
+ cache_fn = None
299
+ cache_sha256 = None
300
+ if isinstance(grammar, str):
301
+ self.source_grammar = grammar
302
+ if self.options.use_bytes:
303
+ if not grammar.isascii():
304
+ raise ConfigurationError("Grammar must be ascii only, when use_bytes=True")
305
+
306
+ if self.options.cache:
307
+ if self.options.parser != 'lalr':
308
+ raise ConfigurationError("cache only works with parser='lalr' for now")
309
+
310
+ unhashable = ('transformer', 'postlex', 'lexer_callbacks', 'edit_terminals', '_plugins')
311
+ options_str = ''.join(k+str(v) for k, v in options.items() if k not in unhashable)
312
+ from . import __version__
313
+ s = grammar + options_str + __version__ + str(sys.version_info[:2])
314
+ cache_sha256 = sha256_digest(s)
315
+
316
+ if isinstance(self.options.cache, str):
317
+ cache_fn = self.options.cache
318
+ else:
319
+ if self.options.cache is not True:
320
+ raise ConfigurationError("cache argument must be bool or str")
321
+
322
+ try:
323
+ username = getpass.getuser()
324
+ except Exception:
325
+ # The exception raised may be ImportError or OSError in
326
+ # the future. For the cache, we don't care about the
327
+ # specific reason - we just want a username.
328
+ username = "unknown"
329
+
330
+ cache_fn = tempfile.gettempdir() + "/.lark_cache_%s_%s_%s_%s.tmp" % (username, cache_sha256, *sys.version_info[:2])
331
+
332
+ old_options = self.options
333
+ try:
334
+ with FS.open(cache_fn, 'rb') as f:
335
+ logger.debug('Loading grammar from cache: %s', cache_fn)
336
+ # Remove options that aren't relevant for loading from cache
337
+ for name in (set(options) - _LOAD_ALLOWED_OPTIONS):
338
+ del options[name]
339
+ file_sha256 = f.readline().rstrip(b'\n')
340
+ cached_used_files = pickle.load(f)
341
+ if file_sha256 == cache_sha256.encode('utf8') and verify_used_files(cached_used_files):
342
+ cached_parser_data = pickle.load(f)
343
+ self._load(cached_parser_data, **options)
344
+ return
345
+ except FileNotFoundError:
346
+ # The cache file doesn't exist; parse and compose the grammar as normal
347
+ pass
348
+ except Exception: # We should probably narrow done which errors we catch here.
349
+ logger.exception("Failed to load Lark from cache: %r. We will try to carry on.", cache_fn)
350
+
351
+ # In theory, the Lark instance might have been messed up by the call to `_load`.
352
+ # In practice the only relevant thing that might have been overwritten should be `options`
353
+ self.options = old_options
354
+
355
+
356
+ # Parse the grammar file and compose the grammars
357
+ self.grammar, used_files = load_grammar(grammar, self.source_path, self.options.import_paths, self.options.keep_all_tokens)
358
+ else:
359
+ assert isinstance(grammar, Grammar)
360
+ self.grammar = grammar
361
+
362
+
363
+ if self.options.lexer == 'auto':
364
+ if self.options.parser == 'lalr':
365
+ self.options.lexer = 'contextual'
366
+ elif self.options.parser == 'earley':
367
+ if self.options.postlex is not None:
368
+ logger.info("postlex can't be used with the dynamic lexer, so we use 'basic' instead. "
369
+ "Consider using lalr with contextual instead of earley")
370
+ self.options.lexer = 'basic'
371
+ else:
372
+ self.options.lexer = 'dynamic'
373
+ elif self.options.parser == 'cyk':
374
+ self.options.lexer = 'basic'
375
+ else:
376
+ assert False, self.options.parser
377
+ lexer = self.options.lexer
378
+ if isinstance(lexer, type):
379
+ assert issubclass(lexer, Lexer) # XXX Is this really important? Maybe just ensure interface compliance
380
+ else:
381
+ assert_config(lexer, ('basic', 'contextual', 'dynamic', 'dynamic_complete'))
382
+ if self.options.postlex is not None and 'dynamic' in lexer:
383
+ raise ConfigurationError("Can't use postlex with a dynamic lexer. Use basic or contextual instead")
384
+
385
+ if self.options.ambiguity == 'auto':
386
+ if self.options.parser == 'earley':
387
+ self.options.ambiguity = 'resolve'
388
+ else:
389
+ assert_config(self.options.parser, ('earley', 'cyk'), "%r doesn't support disambiguation. Use one of these parsers instead: %s")
390
+
391
+ if self.options.priority == 'auto':
392
+ self.options.priority = 'normal'
393
+
394
+ if self.options.priority not in _VALID_PRIORITY_OPTIONS:
395
+ raise ConfigurationError("invalid priority option: %r. Must be one of %r" % (self.options.priority, _VALID_PRIORITY_OPTIONS))
396
+ if self.options.ambiguity not in _VALID_AMBIGUITY_OPTIONS:
397
+ raise ConfigurationError("invalid ambiguity option: %r. Must be one of %r" % (self.options.ambiguity, _VALID_AMBIGUITY_OPTIONS))
398
+
399
+ if self.options.parser is None:
400
+ terminals_to_keep = '*'
401
+ elif self.options.postlex is not None:
402
+ terminals_to_keep = set(self.options.postlex.always_accept)
403
+ else:
404
+ terminals_to_keep = set()
405
+
406
+ # Compile the EBNF grammar into BNF
407
+ self.terminals, self.rules, self.ignore_tokens = self.grammar.compile(self.options.start, terminals_to_keep)
408
+
409
+ if self.options.edit_terminals:
410
+ for t in self.terminals:
411
+ self.options.edit_terminals(t)
412
+
413
+ self._terminals_dict = {t.name: t for t in self.terminals}
414
+
415
+ # If the user asked to invert the priorities, negate them all here.
416
+ if self.options.priority == 'invert':
417
+ for rule in self.rules:
418
+ if rule.options.priority is not None:
419
+ rule.options.priority = -rule.options.priority
420
+ for term in self.terminals:
421
+ term.priority = -term.priority
422
+ # Else, if the user asked to disable priorities, strip them from the
423
+ # rules and terminals. This allows the Earley parsers to skip an extra forest walk
424
+ # for improved performance, if you don't need them (or didn't specify any).
425
+ elif self.options.priority is None:
426
+ for rule in self.rules:
427
+ if rule.options.priority is not None:
428
+ rule.options.priority = None
429
+ for term in self.terminals:
430
+ term.priority = 0
431
+
432
+ # TODO Deprecate lexer_callbacks?
433
+ self.lexer_conf = LexerConf(
434
+ self.terminals, re_module, self.ignore_tokens, self.options.postlex,
435
+ self.options.lexer_callbacks, self.options.g_regex_flags, use_bytes=self.options.use_bytes, strict=self.options.strict
436
+ )
437
+
438
+ if self.options.parser:
439
+ self.parser = self._build_parser()
440
+ elif lexer:
441
+ self.lexer = self._build_lexer()
442
+
443
+ if cache_fn:
444
+ logger.debug('Saving grammar to cache: %s', cache_fn)
445
+ try:
446
+ with FS.open(cache_fn, 'wb') as f:
447
+ assert cache_sha256 is not None
448
+ f.write(cache_sha256.encode('utf8') + b'\n')
449
+ pickle.dump(used_files, f)
450
+ self.save(f, _LOAD_ALLOWED_OPTIONS)
451
+ except IOError as e:
452
+ logger.exception("Failed to save Lark to cache: %r.", cache_fn, e)
453
+
454
+ if __doc__:
455
+ __doc__ += "\n\n" + LarkOptions.OPTIONS_DOC
456
+
457
+ __serialize_fields__ = 'parser', 'rules', 'options'
458
+
459
+ def _build_lexer(self, dont_ignore: bool=False) -> BasicLexer:
460
+ lexer_conf = self.lexer_conf
461
+ if dont_ignore:
462
+ from copy import copy
463
+ lexer_conf = copy(lexer_conf)
464
+ lexer_conf.ignore = ()
465
+ return BasicLexer(lexer_conf)
466
+
467
+ def _prepare_callbacks(self) -> None:
468
+ self._callbacks = {}
469
+ # we don't need these callbacks if we aren't building a tree
470
+ if self.options.ambiguity != 'forest':
471
+ self._parse_tree_builder = ParseTreeBuilder(
472
+ self.rules,
473
+ self.options.tree_class or Tree,
474
+ self.options.propagate_positions,
475
+ self.options.parser != 'lalr' and self.options.ambiguity == 'explicit',
476
+ self.options.maybe_placeholders
477
+ )
478
+ self._callbacks = self._parse_tree_builder.create_callback(self.options.transformer)
479
+ self._callbacks.update(_get_lexer_callbacks(self.options.transformer, self.terminals))
480
+
481
+ def _build_parser(self) -> "ParsingFrontend":
482
+ self._prepare_callbacks()
483
+ _validate_frontend_args(self.options.parser, self.options.lexer)
484
+ parser_conf = ParserConf(self.rules, self._callbacks, self.options.start)
485
+ return _construct_parsing_frontend(
486
+ self.options.parser,
487
+ self.options.lexer,
488
+ self.lexer_conf,
489
+ parser_conf,
490
+ options=self.options
491
+ )
492
+
493
+ def save(self, f, exclude_options: Collection[str] = ()) -> None:
494
+ """Saves the instance into the given file object
495
+
496
+ Useful for caching and multiprocessing.
497
+ """
498
+ if self.options.parser != 'lalr':
499
+ raise NotImplementedError("Lark.save() is only implemented for the LALR(1) parser.")
500
+ data, m = self.memo_serialize([TerminalDef, Rule])
501
+ if exclude_options:
502
+ data["options"] = {n: v for n, v in data["options"].items() if n not in exclude_options}
503
+ pickle.dump({'data': data, 'memo': m}, f, protocol=pickle.HIGHEST_PROTOCOL)
504
+
505
+ @classmethod
506
+ def load(cls: Type[_T], f) -> _T:
507
+ """Loads an instance from the given file object
508
+
509
+ Useful for caching and multiprocessing.
510
+ """
511
+ inst = cls.__new__(cls)
512
+ return inst._load(f)
513
+
514
+ def _deserialize_lexer_conf(self, data: Dict[str, Any], memo: Dict[int, Union[TerminalDef, Rule]], options: LarkOptions) -> LexerConf:
515
+ lexer_conf = LexerConf.deserialize(data['lexer_conf'], memo)
516
+ lexer_conf.callbacks = options.lexer_callbacks or {}
517
+ lexer_conf.re_module = regex if options.regex else re
518
+ lexer_conf.use_bytes = options.use_bytes
519
+ lexer_conf.g_regex_flags = options.g_regex_flags
520
+ lexer_conf.skip_validation = True
521
+ lexer_conf.postlex = options.postlex
522
+ return lexer_conf
523
+
524
+ def _load(self: _T, f: Any, **kwargs) -> _T:
525
+ if isinstance(f, dict):
526
+ d = f
527
+ else:
528
+ d = pickle.load(f)
529
+ memo_json = d['memo']
530
+ data = d['data']
531
+
532
+ assert memo_json
533
+ memo = SerializeMemoizer.deserialize(memo_json, {'Rule': Rule, 'TerminalDef': TerminalDef}, {})
534
+ options = dict(data['options'])
535
+ if (set(kwargs) - _LOAD_ALLOWED_OPTIONS) & set(LarkOptions._defaults):
536
+ raise ConfigurationError("Some options are not allowed when loading a Parser: {}"
537
+ .format(set(kwargs) - _LOAD_ALLOWED_OPTIONS))
538
+ options.update(kwargs)
539
+ self.options = LarkOptions.deserialize(options, memo)
540
+ self.rules = [Rule.deserialize(r, memo) for r in data['rules']]
541
+ self.source_path = '<deserialized>'
542
+ _validate_frontend_args(self.options.parser, self.options.lexer)
543
+ self.lexer_conf = self._deserialize_lexer_conf(data['parser'], memo, self.options)
544
+ self.terminals = self.lexer_conf.terminals
545
+ self._prepare_callbacks()
546
+ self._terminals_dict = {t.name: t for t in self.terminals}
547
+ self.parser = _deserialize_parsing_frontend(
548
+ data['parser'],
549
+ memo,
550
+ self.lexer_conf,
551
+ self._callbacks,
552
+ self.options, # Not all, but multiple attributes are used
553
+ )
554
+ return self
555
+
556
+ @classmethod
557
+ def _load_from_dict(cls, data, memo, **kwargs):
558
+ inst = cls.__new__(cls)
559
+ return inst._load({'data': data, 'memo': memo}, **kwargs)
560
+
561
+ @classmethod
562
+ def open(cls: Type[_T], grammar_filename: str, rel_to: Optional[str]=None, **options) -> _T:
563
+ """Create an instance of Lark with the grammar given by its filename
564
+
565
+ If ``rel_to`` is provided, the function will find the grammar filename in relation to it.
566
+
567
+ Example:
568
+
569
+ >>> Lark.open("grammar_file.lark", rel_to=__file__, parser="lalr")
570
+ Lark(...)
571
+
572
+ """
573
+ if rel_to:
574
+ basepath = os.path.dirname(rel_to)
575
+ grammar_filename = os.path.join(basepath, grammar_filename)
576
+ with open(grammar_filename, encoding='utf8') as f:
577
+ return cls(f, **options)
578
+
579
+ @classmethod
580
+ def open_from_package(cls: Type[_T], package: str, grammar_path: str, search_paths: 'Sequence[str]'=[""], **options) -> _T:
581
+ """Create an instance of Lark with the grammar loaded from within the package `package`.
582
+ This allows grammar loading from zipapps.
583
+
584
+ Imports in the grammar will use the `package` and `search_paths` provided, through `FromPackageLoader`
585
+
586
+ Example:
587
+
588
+ Lark.open_from_package(__name__, "example.lark", ("grammars",), parser=...)
589
+ """
590
+ package_loader = FromPackageLoader(package, search_paths)
591
+ full_path, text = package_loader(None, grammar_path)
592
+ options.setdefault('source_path', full_path)
593
+ options.setdefault('import_paths', [])
594
+ options['import_paths'].append(package_loader)
595
+ return cls(text, **options)
596
+
597
+ def __repr__(self):
598
+ return 'Lark(open(%r), parser=%r, lexer=%r, ...)' % (self.source_path, self.options.parser, self.options.lexer)
599
+
600
+
601
+ def lex(self, text: str, dont_ignore: bool=False) -> Iterator[Token]:
602
+ """Only lex (and postlex) the text, without parsing it. Only relevant when lexer='basic'
603
+
604
+ When dont_ignore=True, the lexer will return all tokens, even those marked for %ignore.
605
+
606
+ :raises UnexpectedCharacters: In case the lexer cannot find a suitable match.
607
+ """
608
+ lexer: Lexer
609
+ if not hasattr(self, 'lexer') or dont_ignore:
610
+ lexer = self._build_lexer(dont_ignore)
611
+ else:
612
+ lexer = self.lexer
613
+ lexer_thread = LexerThread.from_text(lexer, text)
614
+ stream = lexer_thread.lex(None)
615
+ if self.options.postlex:
616
+ return self.options.postlex.process(stream)
617
+ return stream
618
+
619
+ def get_terminal(self, name: str) -> TerminalDef:
620
+ """Get information about a terminal"""
621
+ return self._terminals_dict[name]
622
+
623
+ def parse_interactive(self, text: Optional[str]=None, start: Optional[str]=None) -> 'InteractiveParser':
624
+ """Start an interactive parsing session.
625
+
626
+ Parameters:
627
+ text (str, optional): Text to be parsed. Required for ``resume_parse()``.
628
+ start (str, optional): Start symbol
629
+
630
+ Returns:
631
+ A new InteractiveParser instance.
632
+
633
+ See Also: ``Lark.parse()``
634
+ """
635
+ return self.parser.parse_interactive(text, start=start)
636
+
637
+ def parse(self, text: str, start: Optional[str]=None, on_error: 'Optional[Callable[[UnexpectedInput], bool]]'=None) -> 'ParseTree':
638
+ """Parse the given text, according to the options provided.
639
+
640
+ Parameters:
641
+ text (str): Text to be parsed.
642
+ start (str, optional): Required if Lark was given multiple possible start symbols (using the start option).
643
+ on_error (function, optional): if provided, will be called on UnexpectedToken error. Return true to resume parsing.
644
+ LALR only. See examples/advanced/error_handling.py for an example of how to use on_error.
645
+
646
+ Returns:
647
+ If a transformer is supplied to ``__init__``, returns whatever is the
648
+ result of the transformation. Otherwise, returns a Tree instance.
649
+
650
+ :raises UnexpectedInput: On a parse error, one of these sub-exceptions will rise:
651
+ ``UnexpectedCharacters``, ``UnexpectedToken``, or ``UnexpectedEOF``.
652
+ For convenience, these sub-exceptions also inherit from ``ParserError`` and ``LexerError``.
653
+
654
+ """
655
+ return self.parser.parse(text, start=start, on_error=on_error)
656
+
657
+
658
+ ###}