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