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,202 @@
1
+ "Converts Nearley grammars to Lark"
2
+
3
+ import os.path
4
+ import sys
5
+ import codecs
6
+ import argparse
7
+
8
+
9
+ from lark import Lark, Transformer, v_args
10
+
11
+ nearley_grammar = r"""
12
+ start: (ruledef|directive)+
13
+
14
+ directive: "@" NAME (STRING|NAME)
15
+ | "@" JS -> js_code
16
+ ruledef: NAME "->" expansions
17
+ | NAME REGEXP "->" expansions -> macro
18
+ expansions: expansion ("|" expansion)*
19
+
20
+ expansion: expr+ js
21
+
22
+ ?expr: item (":" /[+*?]/)?
23
+
24
+ ?item: rule|string|regexp|null
25
+ | "(" expansions ")"
26
+
27
+ rule: NAME
28
+ string: STRING
29
+ regexp: REGEXP
30
+ null: "null"
31
+ JS: /{%.*?%}/s
32
+ js: JS?
33
+
34
+ NAME: /[a-zA-Z_$]\w*/
35
+ COMMENT: /#[^\n]*/
36
+ REGEXP: /\[.*?\]/
37
+
38
+ STRING: _STRING "i"?
39
+
40
+ %import common.ESCAPED_STRING -> _STRING
41
+ %import common.WS
42
+ %ignore WS
43
+ %ignore COMMENT
44
+
45
+ """
46
+
47
+ nearley_grammar_parser = Lark(nearley_grammar, parser='earley', lexer='basic')
48
+
49
+ def _get_rulename(name):
50
+ name = {'_': '_ws_maybe', '__': '_ws'}.get(name, name)
51
+ return 'n_' + name.replace('$', '__DOLLAR__').lower()
52
+
53
+ @v_args(inline=True)
54
+ class NearleyToLark(Transformer):
55
+ def __init__(self):
56
+ self._count = 0
57
+ self.extra_rules = {}
58
+ self.extra_rules_rev = {}
59
+ self.alias_js_code = {}
60
+
61
+ def _new_function(self, code):
62
+ name = 'alias_%d' % self._count
63
+ self._count += 1
64
+
65
+ self.alias_js_code[name] = code
66
+ return name
67
+
68
+ def _extra_rule(self, rule):
69
+ if rule in self.extra_rules_rev:
70
+ return self.extra_rules_rev[rule]
71
+
72
+ name = 'xrule_%d' % len(self.extra_rules)
73
+ assert name not in self.extra_rules
74
+ self.extra_rules[name] = rule
75
+ self.extra_rules_rev[rule] = name
76
+ return name
77
+
78
+ def rule(self, name):
79
+ return _get_rulename(name)
80
+
81
+ def ruledef(self, name, exps):
82
+ return '!%s: %s' % (_get_rulename(name), exps)
83
+
84
+ def expr(self, item, op):
85
+ rule = '(%s)%s' % (item, op)
86
+ return self._extra_rule(rule)
87
+
88
+ def regexp(self, r):
89
+ return '/%s/' % r
90
+
91
+ def null(self):
92
+ return ''
93
+
94
+ def string(self, s):
95
+ return self._extra_rule(s)
96
+
97
+ def expansion(self, *x):
98
+ x, js = x[:-1], x[-1]
99
+ if js.children:
100
+ js_code ,= js.children
101
+ js_code = js_code[2:-2]
102
+ alias = '-> ' + self._new_function(js_code)
103
+ else:
104
+ alias = ''
105
+ return ' '.join(x) + alias
106
+
107
+ def expansions(self, *x):
108
+ return '%s' % ('\n |'.join(x))
109
+
110
+ def start(self, *rules):
111
+ return '\n'.join(filter(None, rules))
112
+
113
+ def _nearley_to_lark(g, builtin_path, n2l, js_code, folder_path, includes):
114
+ rule_defs = []
115
+
116
+ tree = nearley_grammar_parser.parse(g)
117
+ for statement in tree.children:
118
+ if statement.data == 'directive':
119
+ directive, arg = statement.children
120
+ if directive in ('builtin', 'include'):
121
+ folder = builtin_path if directive == 'builtin' else folder_path
122
+ path = os.path.join(folder, arg[1:-1])
123
+ if path not in includes:
124
+ includes.add(path)
125
+ with codecs.open(path, encoding='utf8') as f:
126
+ text = f.read()
127
+ rule_defs += _nearley_to_lark(text, builtin_path, n2l, js_code, os.path.abspath(os.path.dirname(path)), includes)
128
+ else:
129
+ assert False, directive
130
+ elif statement.data == 'js_code':
131
+ code ,= statement.children
132
+ code = code[2:-2]
133
+ js_code.append(code)
134
+ elif statement.data == 'macro':
135
+ pass # TODO Add support for macros!
136
+ elif statement.data == 'ruledef':
137
+ rule_defs.append(n2l.transform(statement))
138
+ else:
139
+ raise Exception("Unknown statement: %s" % statement)
140
+
141
+ return rule_defs
142
+
143
+
144
+ def create_code_for_nearley_grammar(g, start, builtin_path, folder_path, es6=False):
145
+ import js2py
146
+
147
+ emit_code = []
148
+ def emit(x=None):
149
+ if x:
150
+ emit_code.append(x)
151
+ emit_code.append('\n')
152
+
153
+ js_code = ['function id(x) {return x[0];}']
154
+ n2l = NearleyToLark()
155
+ rule_defs = _nearley_to_lark(g, builtin_path, n2l, js_code, folder_path, set())
156
+ lark_g = '\n'.join(rule_defs)
157
+ lark_g += '\n'+'\n'.join('!%s: %s' % item for item in n2l.extra_rules.items())
158
+
159
+ emit('from lark import Lark, Transformer')
160
+ emit()
161
+ emit('grammar = ' + repr(lark_g))
162
+ emit()
163
+
164
+ for alias, code in n2l.alias_js_code.items():
165
+ js_code.append('%s = (%s);' % (alias, code))
166
+
167
+ if es6:
168
+ emit(js2py.translate_js6('\n'.join(js_code)))
169
+ else:
170
+ emit(js2py.translate_js('\n'.join(js_code)))
171
+ emit('class TransformNearley(Transformer):')
172
+ for alias in n2l.alias_js_code:
173
+ emit(" %s = var.get('%s').to_python()" % (alias, alias))
174
+ emit(" __default__ = lambda self, n, c, m: c if c else None")
175
+
176
+ emit()
177
+ emit('parser = Lark(grammar, start="n_%s", maybe_placeholders=False)' % start)
178
+ emit('def parse(text):')
179
+ emit(' return TransformNearley().transform(parser.parse(text))')
180
+
181
+ return ''.join(emit_code)
182
+
183
+ def main(fn, start, nearley_lib, es6=False):
184
+ with codecs.open(fn, encoding='utf8') as f:
185
+ grammar = f.read()
186
+ return create_code_for_nearley_grammar(grammar, start, os.path.join(nearley_lib, 'builtin'), os.path.abspath(os.path.dirname(fn)), es6=es6)
187
+
188
+ def get_arg_parser():
189
+ parser = argparse.ArgumentParser(description='Reads a Nearley grammar (with js functions), and outputs an equivalent lark parser.')
190
+ parser.add_argument('nearley_grammar', help='Path to the file containing the nearley grammar')
191
+ parser.add_argument('start_rule', help='Rule within the nearley grammar to make the base rule')
192
+ parser.add_argument('nearley_lib', help='Path to root directory of nearley codebase (used for including builtins)')
193
+ parser.add_argument('--es6', help='Enable experimental ES6 support', action='store_true')
194
+ return parser
195
+
196
+ if __name__ == '__main__':
197
+ parser = get_arg_parser()
198
+ if len(sys.argv) == 1:
199
+ parser.print_help(sys.stderr)
200
+ sys.exit(1)
201
+ args = parser.parse_args()
202
+ print(main(fn=args.nearley_grammar, start=args.start_rule, nearley_lib=args.nearley_lib, es6=args.es6))
@@ -0,0 +1,32 @@
1
+ import sys
2
+ import json
3
+
4
+ from lark.grammar import Rule
5
+ from lark.lexer import TerminalDef
6
+ from lark.tools import lalr_argparser, build_lalr
7
+
8
+ import argparse
9
+
10
+ argparser = argparse.ArgumentParser(prog='python -m lark.tools.serialize', parents=[lalr_argparser],
11
+ description="Lark Serialization Tool - Stores Lark's internal state & LALR analysis as a JSON file",
12
+ epilog='Look at the Lark documentation for more info on the options')
13
+
14
+
15
+ def serialize(lark_inst, outfile):
16
+ data, memo = lark_inst.memo_serialize([TerminalDef, Rule])
17
+ outfile.write('{\n')
18
+ outfile.write(' "data": %s,\n' % json.dumps(data))
19
+ outfile.write(' "memo": %s\n' % json.dumps(memo))
20
+ outfile.write('}\n')
21
+
22
+
23
+ def main():
24
+ if len(sys.argv)==1:
25
+ argparser.print_help(sys.stderr)
26
+ sys.exit(1)
27
+ ns = argparser.parse_args()
28
+ serialize(*build_lalr(ns))
29
+
30
+
31
+ if __name__ == '__main__':
32
+ main()
@@ -0,0 +1,196 @@
1
+ ###{standalone
2
+ #
3
+ #
4
+ # Lark Stand-alone Generator Tool
5
+ # ----------------------------------
6
+ # Generates a stand-alone LALR(1) parser
7
+ #
8
+ # Git: https://github.com/erezsh/lark
9
+ # Author: Erez Shinan (erezshin@gmail.com)
10
+ #
11
+ #
12
+ # >>> LICENSE
13
+ #
14
+ # This tool and its generated code use a separate license from Lark,
15
+ # and are subject to the terms of the Mozilla Public License, v. 2.0.
16
+ # If a copy of the MPL was not distributed with this
17
+ # file, You can obtain one at https://mozilla.org/MPL/2.0/.
18
+ #
19
+ # If you wish to purchase a commercial license for this tool and its
20
+ # generated code, you may contact me via email or otherwise.
21
+ #
22
+ # If MPL2 is incompatible with your free or open-source project,
23
+ # contact me and we'll work it out.
24
+ #
25
+ #
26
+
27
+ from copy import deepcopy
28
+ from abc import ABC, abstractmethod
29
+ from types import ModuleType
30
+ from typing import (
31
+ TypeVar, Generic, Type, Tuple, List, Dict, Iterator, Collection, Callable, Optional, FrozenSet, Any,
32
+ Union, Iterable, IO, TYPE_CHECKING, overload, Sequence,
33
+ Pattern as REPattern, ClassVar, Set, Mapping
34
+ )
35
+ ###}
36
+
37
+ import sys
38
+ import token, tokenize
39
+ import os
40
+ from os import path
41
+ from collections import defaultdict
42
+ from functools import partial
43
+ from argparse import ArgumentParser
44
+
45
+ import lark
46
+ from lark.tools import lalr_argparser, build_lalr, make_warnings_comments
47
+
48
+
49
+ from lark.grammar import Rule
50
+ from lark.lexer import TerminalDef
51
+
52
+ _dir = path.dirname(__file__)
53
+ _larkdir = path.join(_dir, path.pardir)
54
+
55
+
56
+ EXTRACT_STANDALONE_FILES = [
57
+ 'tools/standalone.py',
58
+ 'exceptions.py',
59
+ 'utils.py',
60
+ 'tree.py',
61
+ 'visitors.py',
62
+ 'grammar.py',
63
+ 'lexer.py',
64
+ 'common.py',
65
+ 'parse_tree_builder.py',
66
+ 'parsers/lalr_analysis.py',
67
+ 'parsers/lalr_parser_state.py',
68
+ 'parsers/lalr_parser.py',
69
+ 'parsers/lalr_interactive_parser.py',
70
+ 'parser_frontends.py',
71
+ 'lark.py',
72
+ 'indenter.py',
73
+ ]
74
+
75
+ def extract_sections(lines):
76
+ section = None
77
+ text = []
78
+ sections = defaultdict(list)
79
+ for line in lines:
80
+ if line.startswith('###'):
81
+ if line[3] == '{':
82
+ section = line[4:].strip()
83
+ elif line[3] == '}':
84
+ sections[section] += text
85
+ section = None
86
+ text = []
87
+ else:
88
+ raise ValueError(line)
89
+ elif section:
90
+ text.append(line)
91
+
92
+ return {name: ''.join(text) for name, text in sections.items()}
93
+
94
+
95
+ def strip_docstrings(line_gen):
96
+ """ Strip comments and docstrings from a file.
97
+ Based on code from: https://stackoverflow.com/questions/1769332/script-to-remove-python-comments-docstrings
98
+ """
99
+ res = []
100
+
101
+ prev_toktype = token.INDENT
102
+ last_lineno = -1
103
+ last_col = 0
104
+
105
+ tokgen = tokenize.generate_tokens(line_gen)
106
+ for toktype, ttext, (slineno, scol), (elineno, ecol), ltext in tokgen:
107
+ if slineno > last_lineno:
108
+ last_col = 0
109
+ if scol > last_col:
110
+ res.append(" " * (scol - last_col))
111
+ if toktype == token.STRING and prev_toktype == token.INDENT:
112
+ # Docstring
113
+ res.append("#--")
114
+ elif toktype == tokenize.COMMENT:
115
+ # Comment
116
+ res.append("##\n")
117
+ else:
118
+ res.append(ttext)
119
+ prev_toktype = toktype
120
+ last_col = ecol
121
+ last_lineno = elineno
122
+
123
+ return ''.join(res)
124
+
125
+
126
+ def gen_standalone(lark_inst, output=None, out=sys.stdout, compress=False):
127
+ if output is None:
128
+ output = partial(print, file=out)
129
+
130
+ import pickle, zlib, base64
131
+ def compressed_output(obj):
132
+ s = pickle.dumps(obj, pickle.HIGHEST_PROTOCOL)
133
+ c = zlib.compress(s)
134
+ output(repr(base64.b64encode(c)))
135
+
136
+ def output_decompress(name):
137
+ output('%(name)s = pickle.loads(zlib.decompress(base64.b64decode(%(name)s)))' % locals())
138
+
139
+ output('# The file was automatically generated by Lark v%s' % lark.__version__)
140
+ output('__version__ = "%s"' % lark.__version__)
141
+ output()
142
+
143
+ for i, pyfile in enumerate(EXTRACT_STANDALONE_FILES):
144
+ with open(os.path.join(_larkdir, pyfile)) as f:
145
+ code = extract_sections(f)['standalone']
146
+ if i: # if not this file
147
+ code = strip_docstrings(partial(next, iter(code.splitlines(True))))
148
+ output(code)
149
+
150
+ data, m = lark_inst.memo_serialize([TerminalDef, Rule])
151
+ output('import pickle, zlib, base64')
152
+ if compress:
153
+ output('DATA = (')
154
+ compressed_output(data)
155
+ output(')')
156
+ output_decompress('DATA')
157
+ output('MEMO = (')
158
+ compressed_output(m)
159
+ output(')')
160
+ output_decompress('MEMO')
161
+ else:
162
+ output('DATA = (')
163
+ output(data)
164
+ output(')')
165
+ output('MEMO = (')
166
+ output(m)
167
+ output(')')
168
+
169
+
170
+ output('Shift = 0')
171
+ output('Reduce = 1')
172
+ output("def Lark_StandAlone(**kwargs):")
173
+ output(" return Lark._load_from_dict(DATA, MEMO, **kwargs)")
174
+
175
+
176
+
177
+
178
+ def main():
179
+ make_warnings_comments()
180
+ parser = ArgumentParser(prog="prog='python -m lark.tools.standalone'", description="Lark Stand-alone Generator Tool",
181
+ parents=[lalr_argparser], epilog='Look at the Lark documentation for more info on the options')
182
+ parser.add_argument('-c', '--compress', action='store_true', default=0, help="Enable compression")
183
+ if len(sys.argv) == 1:
184
+ parser.print_help(sys.stderr)
185
+ sys.exit(1)
186
+ ns = parser.parse_args()
187
+
188
+ lark_inst, out = build_lalr(ns)
189
+ gen_standalone(lark_inst, out=out, compress=ns.compress)
190
+
191
+ ns.out.close()
192
+ ns.grammar_file.close()
193
+
194
+
195
+ if __name__ == '__main__':
196
+ main()
@@ -0,0 +1,267 @@
1
+ import sys
2
+ from copy import deepcopy
3
+
4
+ from typing import List, Callable, Iterator, Union, Optional, Generic, TypeVar, TYPE_CHECKING
5
+
6
+ if TYPE_CHECKING:
7
+ from .lexer import TerminalDef, Token
8
+ try:
9
+ import rich
10
+ except ImportError:
11
+ pass
12
+ from typing import Literal
13
+
14
+ ###{standalone
15
+
16
+ class Meta:
17
+
18
+ empty: bool
19
+ line: int
20
+ column: int
21
+ start_pos: int
22
+ end_line: int
23
+ end_column: int
24
+ end_pos: int
25
+ orig_expansion: 'List[TerminalDef]'
26
+ match_tree: bool
27
+
28
+ def __init__(self):
29
+ self.empty = True
30
+
31
+
32
+ _Leaf_T = TypeVar("_Leaf_T")
33
+ Branch = Union[_Leaf_T, 'Tree[_Leaf_T]']
34
+
35
+
36
+ class Tree(Generic[_Leaf_T]):
37
+ """The main tree class.
38
+
39
+ Creates a new tree, and stores "data" and "children" in attributes of the same name.
40
+ Trees can be hashed and compared.
41
+
42
+ Parameters:
43
+ data: The name of the rule or alias
44
+ children: List of matched sub-rules and terminals
45
+ meta: Line & Column numbers (if ``propagate_positions`` is enabled).
46
+ meta attributes: (line, column, end_line, end_column, start_pos, end_pos,
47
+ container_line, container_column, container_end_line, container_end_column)
48
+ container_* attributes consider all symbols, including those that have been inlined in the tree.
49
+ For example, in the rule 'a: _A B _C', the regular attributes will mark the start and end of B,
50
+ but the container_* attributes will also include _A and _C in the range. However, rules that
51
+ contain 'a' will consider it in full, including _A and _C for all attributes.
52
+ """
53
+
54
+ data: str
55
+ children: 'List[Branch[_Leaf_T]]'
56
+
57
+ def __init__(self, data: str, children: 'List[Branch[_Leaf_T]]', meta: Optional[Meta]=None) -> None:
58
+ self.data = data
59
+ self.children = children
60
+ self._meta = meta
61
+
62
+ @property
63
+ def meta(self) -> Meta:
64
+ if self._meta is None:
65
+ self._meta = Meta()
66
+ return self._meta
67
+
68
+ def __repr__(self):
69
+ return 'Tree(%r, %r)' % (self.data, self.children)
70
+
71
+ def _pretty_label(self):
72
+ return self.data
73
+
74
+ def _pretty(self, level, indent_str):
75
+ yield f'{indent_str*level}{self._pretty_label()}'
76
+ if len(self.children) == 1 and not isinstance(self.children[0], Tree):
77
+ yield f'\t{self.children[0]}\n'
78
+ else:
79
+ yield '\n'
80
+ for n in self.children:
81
+ if isinstance(n, Tree):
82
+ yield from n._pretty(level+1, indent_str)
83
+ else:
84
+ yield f'{indent_str*(level+1)}{n}\n'
85
+
86
+ def pretty(self, indent_str: str=' ') -> str:
87
+ """Returns an indented string representation of the tree.
88
+
89
+ Great for debugging.
90
+ """
91
+ return ''.join(self._pretty(0, indent_str))
92
+
93
+ def __rich__(self, parent:Optional['rich.tree.Tree']=None) -> 'rich.tree.Tree':
94
+ """Returns a tree widget for the 'rich' library.
95
+
96
+ Example:
97
+ ::
98
+ from rich import print
99
+ from lark import Tree
100
+
101
+ tree = Tree('root', ['node1', 'node2'])
102
+ print(tree)
103
+ """
104
+ return self._rich(parent)
105
+
106
+ def _rich(self, parent):
107
+ if parent:
108
+ tree = parent.add(f'[bold]{self.data}[/bold]')
109
+ else:
110
+ import rich.tree
111
+ tree = rich.tree.Tree(self.data)
112
+
113
+ for c in self.children:
114
+ if isinstance(c, Tree):
115
+ c._rich(tree)
116
+ else:
117
+ tree.add(f'[green]{c}[/green]')
118
+
119
+ return tree
120
+
121
+ def __eq__(self, other):
122
+ try:
123
+ return self.data == other.data and self.children == other.children
124
+ except AttributeError:
125
+ return False
126
+
127
+ def __ne__(self, other):
128
+ return not (self == other)
129
+
130
+ def __hash__(self) -> int:
131
+ return hash((self.data, tuple(self.children)))
132
+
133
+ def iter_subtrees(self) -> 'Iterator[Tree[_Leaf_T]]':
134
+ """Depth-first iteration.
135
+
136
+ Iterates over all the subtrees, never returning to the same node twice (Lark's parse-tree is actually a DAG).
137
+ """
138
+ queue = [self]
139
+ subtrees = dict()
140
+ for subtree in queue:
141
+ subtrees[id(subtree)] = subtree
142
+ queue += [c for c in reversed(subtree.children)
143
+ if isinstance(c, Tree) and id(c) not in subtrees]
144
+
145
+ del queue
146
+ return reversed(list(subtrees.values()))
147
+
148
+ def iter_subtrees_topdown(self):
149
+ """Breadth-first iteration.
150
+
151
+ Iterates over all the subtrees, return nodes in order like pretty() does.
152
+ """
153
+ stack = [self]
154
+ stack_append = stack.append
155
+ stack_pop = stack.pop
156
+ while stack:
157
+ node = stack_pop()
158
+ if not isinstance(node, Tree):
159
+ continue
160
+ yield node
161
+ for child in reversed(node.children):
162
+ stack_append(child)
163
+
164
+ def find_pred(self, pred: 'Callable[[Tree[_Leaf_T]], bool]') -> 'Iterator[Tree[_Leaf_T]]':
165
+ """Returns all nodes of the tree that evaluate pred(node) as true."""
166
+ return filter(pred, self.iter_subtrees())
167
+
168
+ def find_data(self, data: str) -> 'Iterator[Tree[_Leaf_T]]':
169
+ """Returns all nodes of the tree whose data equals the given data."""
170
+ return self.find_pred(lambda t: t.data == data)
171
+
172
+ ###}
173
+
174
+ def expand_kids_by_data(self, *data_values):
175
+ """Expand (inline) children with any of the given data values. Returns True if anything changed"""
176
+ changed = False
177
+ for i in range(len(self.children)-1, -1, -1):
178
+ child = self.children[i]
179
+ if isinstance(child, Tree) and child.data in data_values:
180
+ self.children[i:i+1] = child.children
181
+ changed = True
182
+ return changed
183
+
184
+
185
+ def scan_values(self, pred: 'Callable[[Branch[_Leaf_T]], bool]') -> Iterator[_Leaf_T]:
186
+ """Return all values in the tree that evaluate pred(value) as true.
187
+
188
+ This can be used to find all the tokens in the tree.
189
+
190
+ Example:
191
+ >>> all_tokens = tree.scan_values(lambda v: isinstance(v, Token))
192
+ """
193
+ for c in self.children:
194
+ if isinstance(c, Tree):
195
+ for t in c.scan_values(pred):
196
+ yield t
197
+ else:
198
+ if pred(c):
199
+ yield c
200
+
201
+ def __deepcopy__(self, memo):
202
+ return type(self)(self.data, deepcopy(self.children, memo), meta=self._meta)
203
+
204
+ def copy(self) -> 'Tree[_Leaf_T]':
205
+ return type(self)(self.data, self.children)
206
+
207
+ def set(self, data: str, children: 'List[Branch[_Leaf_T]]') -> None:
208
+ self.data = data
209
+ self.children = children
210
+
211
+
212
+ ParseTree = Tree['Token']
213
+
214
+
215
+ class SlottedTree(Tree):
216
+ __slots__ = 'data', 'children', 'rule', '_meta'
217
+
218
+
219
+ def pydot__tree_to_png(tree: Tree, filename: str, rankdir: 'Literal["TB", "LR", "BT", "RL"]'="LR", **kwargs) -> None:
220
+ graph = pydot__tree_to_graph(tree, rankdir, **kwargs)
221
+ graph.write_png(filename)
222
+
223
+
224
+ def pydot__tree_to_dot(tree: Tree, filename, rankdir="LR", **kwargs):
225
+ graph = pydot__tree_to_graph(tree, rankdir, **kwargs)
226
+ graph.write(filename)
227
+
228
+
229
+ def pydot__tree_to_graph(tree: Tree, rankdir="LR", **kwargs):
230
+ """Creates a colorful image that represents the tree (data+children, without meta)
231
+
232
+ Possible values for `rankdir` are "TB", "LR", "BT", "RL", corresponding to
233
+ directed graphs drawn from top to bottom, from left to right, from bottom to
234
+ top, and from right to left, respectively.
235
+
236
+ `kwargs` can be any graph attribute (e. g. `dpi=200`). For a list of
237
+ possible attributes, see https://www.graphviz.org/doc/info/attrs.html.
238
+ """
239
+
240
+ import pydot # type: ignore[import-not-found]
241
+ graph = pydot.Dot(graph_type='digraph', rankdir=rankdir, **kwargs)
242
+
243
+ i = [0]
244
+
245
+ def new_leaf(leaf):
246
+ node = pydot.Node(i[0], label=repr(leaf))
247
+ i[0] += 1
248
+ graph.add_node(node)
249
+ return node
250
+
251
+ def _to_pydot(subtree):
252
+ color = hash(subtree.data) & 0xffffff
253
+ color |= 0x808080
254
+
255
+ subnodes = [_to_pydot(child) if isinstance(child, Tree) else new_leaf(child)
256
+ for child in subtree.children]
257
+ node = pydot.Node(i[0], style="filled", fillcolor="#%x" % color, label=subtree.data)
258
+ i[0] += 1
259
+ graph.add_node(node)
260
+
261
+ for subnode in subnodes:
262
+ graph.add_edge(pydot.Edge(node, subnode))
263
+
264
+ return node
265
+
266
+ _to_pydot(tree)
267
+ return graph