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.
- ccxt/__init__.py +36 -14
- ccxt/abstract/alpaca.py +4 -0
- ccxt/abstract/bigone.py +1 -1
- ccxt/abstract/binance.py +112 -48
- ccxt/abstract/binancecoinm.py +112 -48
- ccxt/abstract/binanceus.py +147 -83
- ccxt/abstract/binanceusdm.py +112 -48
- ccxt/abstract/bingx.py +133 -78
- ccxt/abstract/bitbank.py +5 -0
- ccxt/abstract/bitfinex.py +136 -65
- ccxt/abstract/bitfinex1.py +69 -0
- ccxt/abstract/bitflyer.py +1 -0
- ccxt/abstract/bitget.py +8 -1
- ccxt/abstract/bitmart.py +13 -1
- ccxt/abstract/bitopro.py +1 -0
- ccxt/abstract/bitpanda.py +0 -12
- ccxt/abstract/bitrue.py +3 -3
- ccxt/abstract/bitstamp.py +26 -3
- ccxt/abstract/blofin.py +24 -0
- ccxt/abstract/btcbox.py +1 -0
- ccxt/abstract/bybit.py +29 -14
- ccxt/abstract/cex.py +28 -29
- ccxt/abstract/coinbase.py +6 -0
- ccxt/abstract/coinbaseadvanced.py +94 -0
- ccxt/abstract/{coinbasepro.py → coinbaseexchange.py} +1 -0
- ccxt/abstract/coinbaseinternational.py +1 -1
- ccxt/abstract/coincatch.py +94 -0
- ccxt/abstract/coinex.py +233 -123
- ccxt/abstract/coinmetro.py +1 -0
- ccxt/abstract/cryptocom.py +14 -0
- ccxt/abstract/defx.py +69 -0
- ccxt/abstract/deribit.py +1 -0
- ccxt/abstract/digifinex.py +1 -0
- ccxt/abstract/ellipx.py +25 -0
- ccxt/abstract/gate.py +20 -0
- ccxt/abstract/gateio.py +20 -0
- ccxt/abstract/gemini.py +1 -0
- ccxt/abstract/hashkey.py +67 -0
- ccxt/abstract/hyperliquid.py +1 -1
- ccxt/abstract/independentreserve.py +6 -0
- ccxt/abstract/kraken.py +4 -3
- ccxt/abstract/krakenfutures.py +4 -0
- ccxt/abstract/kucoin.py +25 -0
- ccxt/abstract/kucoinfutures.py +35 -0
- ccxt/abstract/luno.py +2 -0
- ccxt/abstract/mexc.py +4 -0
- ccxt/abstract/myokx.py +340 -0
- ccxt/abstract/oceanex.py +5 -0
- ccxt/abstract/okx.py +30 -0
- ccxt/abstract/onetrading.py +0 -12
- ccxt/abstract/oxfun.py +34 -0
- ccxt/abstract/paradex.py +40 -0
- ccxt/abstract/phemex.py +1 -0
- ccxt/abstract/upbit.py +4 -0
- ccxt/abstract/vertex.py +19 -0
- ccxt/abstract/whitebit.py +31 -1
- ccxt/abstract/woo.py +6 -2
- ccxt/abstract/woofipro.py +119 -0
- ccxt/abstract/xt.py +153 -0
- ccxt/abstract/zonda.py +6 -0
- ccxt/ace.py +164 -60
- ccxt/alpaca.py +727 -63
- ccxt/ascendex.py +395 -249
- ccxt/async_support/__init__.py +36 -14
- ccxt/async_support/ace.py +164 -60
- ccxt/async_support/alpaca.py +727 -63
- ccxt/async_support/ascendex.py +396 -249
- ccxt/async_support/base/exchange.py +531 -155
- ccxt/async_support/base/ws/aiohttp_client.py +28 -5
- ccxt/async_support/base/ws/cache.py +3 -2
- ccxt/async_support/base/ws/client.py +26 -5
- ccxt/async_support/base/ws/fast_client.py +4 -3
- ccxt/async_support/base/ws/functions.py +1 -1
- ccxt/async_support/base/ws/future.py +40 -31
- ccxt/async_support/base/ws/order_book_side.py +3 -0
- ccxt/async_support/bequant.py +1 -1
- ccxt/async_support/bigone.py +329 -202
- ccxt/async_support/binance.py +3513 -1511
- ccxt/async_support/binancecoinm.py +2 -1
- ccxt/async_support/binanceus.py +12 -1
- ccxt/async_support/binanceusdm.py +3 -1
- ccxt/async_support/bingx.py +3105 -881
- ccxt/async_support/bit2c.py +119 -38
- ccxt/async_support/bitbank.py +215 -76
- ccxt/async_support/bitbns.py +124 -53
- ccxt/async_support/bitfinex.py +3236 -1078
- ccxt/async_support/bitfinex1.py +1711 -0
- ccxt/async_support/bitflyer.py +239 -50
- ccxt/async_support/bitget.py +1513 -563
- ccxt/async_support/bithumb.py +201 -67
- ccxt/async_support/bitmart.py +1320 -435
- ccxt/async_support/bitmex.py +308 -111
- ccxt/async_support/bitopro.py +256 -96
- ccxt/async_support/bitrue.py +365 -233
- ccxt/async_support/bitso.py +201 -89
- ccxt/async_support/bitstamp.py +438 -269
- ccxt/async_support/bitteam.py +179 -73
- ccxt/async_support/bitvavo.py +180 -70
- ccxt/async_support/bl3p.py +92 -25
- ccxt/async_support/blockchaincom.py +193 -79
- ccxt/async_support/blofin.py +403 -150
- ccxt/async_support/btcalpha.py +161 -55
- ccxt/async_support/btcbox.py +250 -34
- ccxt/async_support/btcmarkets.py +232 -85
- ccxt/async_support/btcturk.py +159 -60
- ccxt/async_support/bybit.py +2326 -1255
- ccxt/async_support/cex.py +1409 -1329
- ccxt/async_support/coinbase.py +1455 -288
- ccxt/async_support/coinbaseadvanced.py +17 -0
- ccxt/async_support/{coinbasepro.py → coinbaseexchange.py} +233 -99
- ccxt/async_support/coinbaseinternational.py +428 -88
- ccxt/async_support/coincatch.py +5152 -0
- ccxt/async_support/coincheck.py +121 -38
- ccxt/async_support/coinex.py +4020 -3339
- ccxt/async_support/coinlist.py +273 -116
- ccxt/async_support/coinmate.py +204 -97
- ccxt/async_support/coinmetro.py +203 -110
- ccxt/async_support/coinone.py +142 -68
- ccxt/async_support/coinsph.py +206 -89
- ccxt/async_support/coinspot.py +137 -62
- ccxt/async_support/cryptocom.py +515 -185
- ccxt/async_support/currencycom.py +203 -85
- ccxt/async_support/defx.py +2066 -0
- ccxt/async_support/delta.py +467 -158
- ccxt/async_support/deribit.py +558 -324
- ccxt/async_support/digifinex.py +340 -223
- ccxt/async_support/ellipx.py +1826 -0
- ccxt/async_support/exmo.py +259 -128
- ccxt/async_support/gate.py +1473 -464
- ccxt/async_support/gemini.py +206 -84
- ccxt/async_support/hashkey.py +4164 -0
- ccxt/async_support/hitbtc.py +334 -178
- ccxt/async_support/hollaex.py +134 -83
- ccxt/async_support/htx.py +1095 -563
- ccxt/async_support/huobijp.py +105 -56
- ccxt/async_support/hyperliquid.py +1634 -269
- ccxt/async_support/idex.py +148 -95
- ccxt/async_support/independentreserve.py +236 -31
- ccxt/async_support/indodax.py +165 -62
- ccxt/async_support/kraken.py +871 -354
- ccxt/async_support/krakenfutures.py +324 -100
- ccxt/async_support/kucoin.py +1050 -355
- ccxt/async_support/kucoinfutures.py +1004 -149
- ccxt/async_support/kuna.py +138 -106
- ccxt/async_support/latoken.py +135 -79
- ccxt/async_support/lbank.py +290 -113
- ccxt/async_support/luno.py +112 -62
- ccxt/async_support/lykke.py +104 -55
- ccxt/async_support/mercado.py +36 -29
- ccxt/async_support/mexc.py +995 -429
- ccxt/async_support/myokx.py +43 -0
- ccxt/async_support/ndax.py +163 -82
- ccxt/async_support/novadax.py +121 -75
- ccxt/async_support/oceanex.py +175 -59
- ccxt/async_support/okcoin.py +222 -163
- ccxt/async_support/okx.py +1777 -455
- ccxt/async_support/onetrading.py +132 -414
- ccxt/async_support/oxfun.py +2832 -0
- ccxt/async_support/p2b.py +79 -51
- ccxt/async_support/paradex.py +2017 -0
- ccxt/async_support/paymium.py +56 -32
- ccxt/async_support/phemex.py +572 -196
- ccxt/async_support/poloniex.py +218 -95
- ccxt/async_support/poloniexfutures.py +260 -92
- ccxt/async_support/probit.py +143 -110
- ccxt/async_support/timex.py +123 -70
- ccxt/async_support/tokocrypto.py +129 -93
- ccxt/async_support/tradeogre.py +39 -25
- ccxt/async_support/upbit.py +322 -113
- ccxt/async_support/vertex.py +2983 -0
- ccxt/async_support/wavesexchange.py +227 -173
- ccxt/async_support/wazirx.py +145 -65
- ccxt/async_support/whitebit.py +533 -138
- ccxt/async_support/woo.py +1155 -295
- ccxt/async_support/woofipro.py +2716 -0
- ccxt/async_support/xt.py +4628 -0
- ccxt/async_support/yobit.py +160 -92
- ccxt/async_support/zaif.py +80 -33
- ccxt/async_support/zonda.py +140 -69
- ccxt/base/errors.py +51 -20
- ccxt/base/exchange.py +1729 -482
- ccxt/base/precise.py +10 -0
- ccxt/base/types.py +223 -4
- ccxt/bequant.py +1 -1
- ccxt/bigone.py +329 -202
- ccxt/binance.py +3513 -1511
- ccxt/binancecoinm.py +2 -1
- ccxt/binanceus.py +12 -1
- ccxt/binanceusdm.py +3 -1
- ccxt/bingx.py +3105 -881
- ccxt/bit2c.py +119 -38
- ccxt/bitbank.py +215 -76
- ccxt/bitbns.py +124 -53
- ccxt/bitfinex.py +3235 -1078
- ccxt/bitfinex1.py +1710 -0
- ccxt/bitflyer.py +239 -50
- ccxt/bitget.py +1513 -563
- ccxt/bithumb.py +200 -67
- ccxt/bitmart.py +1320 -435
- ccxt/bitmex.py +308 -111
- ccxt/bitopro.py +256 -96
- ccxt/bitrue.py +365 -233
- ccxt/bitso.py +201 -89
- ccxt/bitstamp.py +438 -269
- ccxt/bitteam.py +179 -73
- ccxt/bitvavo.py +180 -70
- ccxt/bl3p.py +92 -25
- ccxt/blockchaincom.py +193 -79
- ccxt/blofin.py +403 -150
- ccxt/btcalpha.py +161 -55
- ccxt/btcbox.py +250 -34
- ccxt/btcmarkets.py +232 -85
- ccxt/btcturk.py +159 -60
- ccxt/bybit.py +2326 -1255
- ccxt/cex.py +1408 -1329
- ccxt/coinbase.py +1455 -288
- ccxt/coinbaseadvanced.py +17 -0
- ccxt/{coinbasepro.py → coinbaseexchange.py} +233 -99
- ccxt/coinbaseinternational.py +428 -88
- ccxt/coincatch.py +5152 -0
- ccxt/coincheck.py +121 -38
- ccxt/coinex.py +4020 -3339
- ccxt/coinlist.py +273 -116
- ccxt/coinmate.py +204 -97
- ccxt/coinmetro.py +203 -110
- ccxt/coinone.py +142 -68
- ccxt/coinsph.py +206 -89
- ccxt/coinspot.py +137 -62
- ccxt/cryptocom.py +515 -185
- ccxt/currencycom.py +203 -85
- ccxt/defx.py +2065 -0
- ccxt/delta.py +467 -158
- ccxt/deribit.py +558 -324
- ccxt/digifinex.py +340 -223
- ccxt/ellipx.py +1826 -0
- ccxt/exmo.py +259 -128
- ccxt/gate.py +1473 -464
- ccxt/gemini.py +206 -84
- ccxt/hashkey.py +4164 -0
- ccxt/hitbtc.py +334 -178
- ccxt/hollaex.py +134 -83
- ccxt/htx.py +1095 -563
- ccxt/huobijp.py +105 -56
- ccxt/hyperliquid.py +1633 -269
- ccxt/idex.py +148 -95
- ccxt/independentreserve.py +235 -31
- ccxt/indodax.py +165 -62
- ccxt/kraken.py +871 -354
- ccxt/krakenfutures.py +324 -100
- ccxt/kucoin.py +1050 -355
- ccxt/kucoinfutures.py +1004 -149
- ccxt/kuna.py +138 -106
- ccxt/latoken.py +135 -79
- ccxt/lbank.py +290 -113
- ccxt/luno.py +112 -62
- ccxt/lykke.py +104 -55
- ccxt/mercado.py +36 -29
- ccxt/mexc.py +994 -429
- ccxt/myokx.py +43 -0
- ccxt/ndax.py +163 -82
- ccxt/novadax.py +121 -75
- ccxt/oceanex.py +175 -59
- ccxt/okcoin.py +222 -163
- ccxt/okx.py +1777 -455
- ccxt/onetrading.py +132 -414
- ccxt/oxfun.py +2831 -0
- ccxt/p2b.py +79 -51
- ccxt/paradex.py +2017 -0
- ccxt/paymium.py +56 -32
- ccxt/phemex.py +572 -196
- ccxt/poloniex.py +218 -95
- ccxt/poloniexfutures.py +260 -92
- ccxt/pro/__init__.py +29 -5
- ccxt/pro/alpaca.py +32 -17
- ccxt/pro/ascendex.py +63 -15
- ccxt/pro/bequant.py +4 -0
- ccxt/pro/binance.py +1596 -329
- ccxt/pro/binancecoinm.py +1 -0
- ccxt/pro/binanceus.py +2 -9
- ccxt/pro/binanceusdm.py +2 -0
- ccxt/pro/bingx.py +527 -134
- ccxt/pro/bitcoincom.py +4 -1
- ccxt/pro/bitfinex.py +731 -266
- ccxt/pro/bitfinex1.py +635 -0
- ccxt/pro/bitget.py +726 -357
- ccxt/pro/bithumb.py +380 -0
- ccxt/pro/bitmart.py +138 -39
- ccxt/pro/bitmex.py +199 -40
- ccxt/pro/bitopro.py +25 -13
- ccxt/pro/bitrue.py +31 -32
- ccxt/pro/bitstamp.py +7 -6
- ccxt/pro/bitvavo.py +204 -82
- ccxt/pro/blockchaincom.py +30 -17
- ccxt/pro/blofin.py +692 -0
- ccxt/pro/bybit.py +791 -82
- ccxt/pro/cex.py +99 -51
- ccxt/pro/coinbase.py +220 -30
- ccxt/{async_support/hitbtc3.py → pro/coinbaseadvanced.py} +5 -5
- ccxt/pro/{coinbasepro.py → coinbaseexchange.py} +19 -19
- ccxt/pro/coinbaseinternational.py +193 -30
- ccxt/pro/coincatch.py +1464 -0
- ccxt/pro/coincheck.py +11 -6
- ccxt/pro/coinex.py +967 -661
- ccxt/pro/coinone.py +17 -10
- ccxt/pro/cryptocom.py +446 -66
- ccxt/pro/currencycom.py +11 -10
- ccxt/pro/defx.py +832 -0
- ccxt/pro/deribit.py +168 -32
- ccxt/pro/exmo.py +253 -21
- ccxt/pro/gate.py +729 -64
- ccxt/pro/gemini.py +44 -26
- ccxt/pro/hashkey.py +802 -0
- ccxt/pro/hitbtc.py +208 -103
- ccxt/pro/hollaex.py +25 -9
- ccxt/pro/htx.py +83 -39
- ccxt/pro/huobijp.py +17 -16
- ccxt/pro/hyperliquid.py +502 -31
- ccxt/pro/idex.py +28 -13
- ccxt/pro/independentreserve.py +21 -16
- ccxt/pro/kraken.py +298 -51
- ccxt/pro/krakenfutures.py +166 -75
- ccxt/pro/kucoin.py +395 -77
- ccxt/pro/kucoinfutures.py +400 -99
- ccxt/pro/lbank.py +52 -31
- ccxt/pro/luno.py +12 -10
- ccxt/pro/mexc.py +400 -50
- ccxt/pro/myokx.py +28 -0
- ccxt/pro/ndax.py +25 -12
- ccxt/pro/okcoin.py +28 -9
- ccxt/pro/okx.py +935 -124
- ccxt/pro/onetrading.py +41 -24
- ccxt/pro/oxfun.py +1054 -0
- ccxt/pro/p2b.py +100 -24
- ccxt/pro/paradex.py +352 -0
- ccxt/pro/phemex.py +93 -34
- ccxt/pro/poloniex.py +129 -50
- ccxt/pro/poloniexfutures.py +53 -32
- ccxt/pro/probit.py +93 -86
- ccxt/pro/upbit.py +401 -8
- ccxt/pro/vertex.py +943 -0
- ccxt/pro/wazirx.py +46 -28
- ccxt/pro/whitebit.py +65 -12
- ccxt/pro/woo.py +486 -70
- ccxt/pro/woofipro.py +1271 -0
- ccxt/pro/xt.py +1067 -0
- ccxt/probit.py +143 -110
- ccxt/static_dependencies/__init__.py +1 -1
- ccxt/static_dependencies/lark/__init__.py +38 -0
- ccxt/static_dependencies/lark/__pyinstaller/__init__.py +6 -0
- ccxt/static_dependencies/lark/__pyinstaller/hook-lark.py +14 -0
- ccxt/static_dependencies/lark/ast_utils.py +59 -0
- ccxt/static_dependencies/lark/common.py +86 -0
- ccxt/static_dependencies/lark/exceptions.py +292 -0
- ccxt/static_dependencies/lark/grammar.py +130 -0
- ccxt/static_dependencies/lark/grammars/__init__.py +0 -0
- ccxt/static_dependencies/lark/indenter.py +143 -0
- ccxt/static_dependencies/lark/lark.py +658 -0
- ccxt/static_dependencies/lark/lexer.py +678 -0
- ccxt/static_dependencies/lark/load_grammar.py +1428 -0
- ccxt/static_dependencies/lark/parse_tree_builder.py +391 -0
- ccxt/static_dependencies/lark/parser_frontends.py +257 -0
- ccxt/static_dependencies/lark/parsers/__init__.py +0 -0
- ccxt/static_dependencies/lark/parsers/cyk.py +340 -0
- ccxt/static_dependencies/lark/parsers/earley.py +314 -0
- ccxt/static_dependencies/lark/parsers/earley_common.py +42 -0
- ccxt/static_dependencies/lark/parsers/earley_forest.py +801 -0
- ccxt/static_dependencies/lark/parsers/grammar_analysis.py +203 -0
- ccxt/static_dependencies/lark/parsers/lalr_analysis.py +332 -0
- ccxt/static_dependencies/lark/parsers/lalr_interactive_parser.py +158 -0
- ccxt/static_dependencies/lark/parsers/lalr_parser.py +122 -0
- ccxt/static_dependencies/lark/parsers/lalr_parser_state.py +110 -0
- ccxt/static_dependencies/lark/parsers/xearley.py +165 -0
- ccxt/static_dependencies/lark/py.typed +0 -0
- ccxt/static_dependencies/lark/reconstruct.py +107 -0
- ccxt/static_dependencies/lark/tools/__init__.py +70 -0
- ccxt/static_dependencies/lark/tools/nearley.py +202 -0
- ccxt/static_dependencies/lark/tools/serialize.py +32 -0
- ccxt/static_dependencies/lark/tools/standalone.py +196 -0
- ccxt/static_dependencies/lark/tree.py +267 -0
- ccxt/static_dependencies/lark/tree_matcher.py +186 -0
- ccxt/static_dependencies/lark/tree_templates.py +180 -0
- ccxt/static_dependencies/lark/utils.py +343 -0
- ccxt/static_dependencies/lark/visitors.py +596 -0
- ccxt/static_dependencies/marshmallow/__init__.py +81 -0
- ccxt/static_dependencies/marshmallow/base.py +65 -0
- ccxt/static_dependencies/marshmallow/class_registry.py +94 -0
- ccxt/static_dependencies/marshmallow/decorators.py +231 -0
- ccxt/static_dependencies/marshmallow/error_store.py +60 -0
- ccxt/static_dependencies/marshmallow/exceptions.py +71 -0
- ccxt/static_dependencies/marshmallow/fields.py +2114 -0
- ccxt/static_dependencies/marshmallow/orderedset.py +89 -0
- ccxt/static_dependencies/marshmallow/py.typed +0 -0
- ccxt/static_dependencies/marshmallow/schema.py +1228 -0
- ccxt/static_dependencies/marshmallow/types.py +12 -0
- ccxt/static_dependencies/marshmallow/utils.py +378 -0
- ccxt/static_dependencies/marshmallow/validate.py +678 -0
- ccxt/static_dependencies/marshmallow/warnings.py +2 -0
- ccxt/static_dependencies/marshmallow_dataclass/__init__.py +1047 -0
- ccxt/static_dependencies/marshmallow_dataclass/collection_field.py +51 -0
- ccxt/static_dependencies/marshmallow_dataclass/lazy_class_attribute.py +45 -0
- ccxt/static_dependencies/marshmallow_dataclass/mypy.py +71 -0
- ccxt/static_dependencies/marshmallow_dataclass/py.typed +0 -0
- ccxt/static_dependencies/marshmallow_dataclass/typing.py +14 -0
- ccxt/static_dependencies/marshmallow_dataclass/union_field.py +82 -0
- ccxt/static_dependencies/marshmallow_oneofschema/__init__.py +1 -0
- ccxt/static_dependencies/marshmallow_oneofschema/one_of_schema.py +193 -0
- ccxt/static_dependencies/marshmallow_oneofschema/py.typed +0 -0
- ccxt/static_dependencies/starknet/__init__.py +0 -0
- ccxt/static_dependencies/starknet/cairo/__init__.py +0 -0
- ccxt/static_dependencies/starknet/cairo/data_types.py +123 -0
- ccxt/static_dependencies/starknet/cairo/deprecated_parse/__init__.py +0 -0
- ccxt/static_dependencies/starknet/cairo/deprecated_parse/cairo_types.py +77 -0
- ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser.py +46 -0
- ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser_transformer.py +138 -0
- ccxt/static_dependencies/starknet/cairo/felt.py +64 -0
- ccxt/static_dependencies/starknet/cairo/type_parser.py +121 -0
- ccxt/static_dependencies/starknet/cairo/v1/__init__.py +0 -0
- ccxt/static_dependencies/starknet/cairo/v1/type_parser.py +59 -0
- ccxt/static_dependencies/starknet/cairo/v2/__init__.py +0 -0
- ccxt/static_dependencies/starknet/cairo/v2/type_parser.py +77 -0
- ccxt/static_dependencies/starknet/ccxt_utils.py +7 -0
- ccxt/static_dependencies/starknet/common.py +15 -0
- ccxt/static_dependencies/starknet/constants.py +39 -0
- ccxt/static_dependencies/starknet/hash/__init__.py +0 -0
- ccxt/static_dependencies/starknet/hash/address.py +79 -0
- ccxt/static_dependencies/starknet/hash/compiled_class_hash_objects.py +111 -0
- ccxt/static_dependencies/starknet/hash/selector.py +16 -0
- ccxt/static_dependencies/starknet/hash/storage.py +12 -0
- ccxt/static_dependencies/starknet/hash/utils.py +78 -0
- ccxt/static_dependencies/starknet/models/__init__.py +0 -0
- ccxt/static_dependencies/starknet/models/typed_data.py +45 -0
- ccxt/static_dependencies/starknet/serialization/__init__.py +24 -0
- ccxt/static_dependencies/starknet/serialization/_calldata_reader.py +40 -0
- ccxt/static_dependencies/starknet/serialization/_context.py +142 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/__init__.py +10 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/_common.py +82 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/array_serializer.py +43 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/bool_serializer.py +37 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/byte_array_serializer.py +66 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/cairo_data_serializer.py +71 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/enum_serializer.py +71 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/felt_serializer.py +50 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/named_tuple_serializer.py +58 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/option_serializer.py +43 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/output_serializer.py +40 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/payload_serializer.py +72 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/struct_serializer.py +36 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/tuple_serializer.py +36 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/uint256_serializer.py +76 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/uint_serializer.py +100 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/unit_serializer.py +32 -0
- ccxt/static_dependencies/starknet/serialization/errors.py +10 -0
- ccxt/static_dependencies/starknet/serialization/factory.py +229 -0
- ccxt/static_dependencies/starknet/serialization/function_serialization_adapter.py +110 -0
- ccxt/static_dependencies/starknet/serialization/tuple_dataclass.py +59 -0
- ccxt/static_dependencies/starknet/utils/__init__.py +0 -0
- ccxt/static_dependencies/starknet/utils/constructor_args_translator.py +86 -0
- ccxt/static_dependencies/starknet/utils/iterable.py +13 -0
- ccxt/static_dependencies/starknet/utils/schema.py +13 -0
- ccxt/static_dependencies/starknet/utils/typed_data.py +182 -0
- ccxt/static_dependencies/starkware/__init__.py +0 -0
- ccxt/static_dependencies/starkware/crypto/__init__.py +0 -0
- ccxt/static_dependencies/starkware/crypto/fast_pedersen_hash.py +50 -0
- ccxt/static_dependencies/starkware/crypto/math_utils.py +78 -0
- ccxt/static_dependencies/starkware/crypto/signature.py +2344 -0
- ccxt/static_dependencies/starkware/crypto/utils.py +63 -0
- ccxt/static_dependencies/sympy/__init__.py +0 -0
- ccxt/static_dependencies/sympy/core/__init__.py +0 -0
- ccxt/static_dependencies/sympy/core/intfunc.py +35 -0
- ccxt/static_dependencies/sympy/external/__init__.py +0 -0
- ccxt/static_dependencies/sympy/external/gmpy.py +345 -0
- ccxt/static_dependencies/sympy/external/importtools.py +187 -0
- ccxt/static_dependencies/sympy/external/ntheory.py +637 -0
- ccxt/static_dependencies/sympy/external/pythonmpq.py +341 -0
- ccxt/static_dependencies/typing_inspect/__init__.py +0 -0
- ccxt/static_dependencies/typing_inspect/typing_inspect.py +851 -0
- ccxt/test/{test_async.py → tests_async.py} +465 -407
- ccxt/test/tests_helpers.py +285 -0
- ccxt/test/tests_init.py +39 -0
- ccxt/test/{test_sync.py → tests_sync.py} +465 -409
- ccxt/timex.py +123 -70
- ccxt/tokocrypto.py +129 -93
- ccxt/tradeogre.py +39 -25
- ccxt/upbit.py +322 -113
- ccxt/vertex.py +2983 -0
- ccxt/wavesexchange.py +227 -173
- ccxt/wazirx.py +145 -65
- ccxt/whitebit.py +533 -138
- ccxt/woo.py +1155 -295
- ccxt/woofipro.py +2716 -0
- ccxt/xt.py +4627 -0
- ccxt/yobit.py +159 -92
- ccxt/zaif.py +80 -33
- ccxt/zonda.py +140 -69
- ccxt-4.4.48.dist-info/LICENSE.txt +21 -0
- ccxt-4.4.48.dist-info/METADATA +646 -0
- ccxt-4.4.48.dist-info/RECORD +669 -0
- {ccxt-4.2.76.dist-info → ccxt-4.4.48.dist-info}/WHEEL +1 -1
- ccxt/abstract/bitbay.py +0 -47
- ccxt/abstract/bitfinex2.py +0 -139
- ccxt/abstract/hitbtc3.py +0 -115
- ccxt/async_support/bitbay.py +0 -17
- ccxt/async_support/bitfinex2.py +0 -3496
- ccxt/async_support/flowbtc.py +0 -34
- ccxt/bitbay.py +0 -17
- ccxt/bitfinex2.py +0 -3496
- ccxt/flowbtc.py +0 -34
- ccxt/hitbtc3.py +0 -16
- ccxt/pro/bitfinex2.py +0 -1081
- ccxt/test/base/__init__.py +0 -28
- ccxt/test/base/test_account.py +0 -26
- ccxt/test/base/test_balance.py +0 -56
- ccxt/test/base/test_borrow_interest.py +0 -35
- ccxt/test/base/test_borrow_rate.py +0 -32
- ccxt/test/base/test_calculate_fee.py +0 -51
- ccxt/test/base/test_crypto.py +0 -127
- ccxt/test/base/test_currency.py +0 -76
- ccxt/test/base/test_datetime.py +0 -103
- ccxt/test/base/test_decimal_to_precision.py +0 -392
- ccxt/test/base/test_deep_extend.py +0 -68
- ccxt/test/base/test_deposit_withdrawal.py +0 -50
- ccxt/test/base/test_exchange_datetime_functions.py +0 -76
- ccxt/test/base/test_funding_rate_history.py +0 -29
- ccxt/test/base/test_last_price.py +0 -32
- ccxt/test/base/test_ledger_entry.py +0 -45
- ccxt/test/base/test_ledger_item.py +0 -48
- ccxt/test/base/test_leverage_tier.py +0 -33
- ccxt/test/base/test_margin_mode.py +0 -24
- ccxt/test/base/test_margin_modification.py +0 -35
- ccxt/test/base/test_market.py +0 -190
- ccxt/test/base/test_number.py +0 -411
- ccxt/test/base/test_ohlcv.py +0 -32
- ccxt/test/base/test_open_interest.py +0 -32
- ccxt/test/base/test_order.py +0 -64
- ccxt/test/base/test_order_book.py +0 -63
- ccxt/test/base/test_position.py +0 -60
- ccxt/test/base/test_shared_methods.py +0 -345
- ccxt/test/base/test_status.py +0 -24
- ccxt/test/base/test_throttle.py +0 -126
- ccxt/test/base/test_ticker.py +0 -86
- ccxt/test/base/test_trade.py +0 -47
- ccxt/test/base/test_trading_fee.py +0 -26
- ccxt/test/base/test_transaction.py +0 -39
- ccxt-4.2.76.dist-info/METADATA +0 -626
- ccxt-4.2.76.dist-info/RECORD +0 -534
- {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
|