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,63 @@
|
|
1
|
+
from typing import (
|
2
|
+
AsyncGenerator,
|
3
|
+
Optional,
|
4
|
+
TypeVar,
|
5
|
+
)
|
6
|
+
|
7
|
+
import sys
|
8
|
+
|
9
|
+
if sys.version_info.minor >= 11:
|
10
|
+
from typing import Literal, ParamSpec
|
11
|
+
else:
|
12
|
+
from typing_extensions import Literal, ParamSpec
|
13
|
+
|
14
|
+
T = TypeVar("T")
|
15
|
+
P = ParamSpec("P")
|
16
|
+
K = TypeVar("K")
|
17
|
+
V = TypeVar("V")
|
18
|
+
TAsyncGenerator = TypeVar("TAsyncGenerator", bound=AsyncGenerator)
|
19
|
+
NumType = TypeVar("NumType", int, float)
|
20
|
+
HASH_BYTES = 32
|
21
|
+
|
22
|
+
# If more shared types start popping up here extract to types.py.
|
23
|
+
Endianness = Literal["big", "little"]
|
24
|
+
TComparable = TypeVar("TComparable", bound="Comparable")
|
25
|
+
|
26
|
+
def to_bytes(
|
27
|
+
value: int,
|
28
|
+
length: Optional[int] = None,
|
29
|
+
byte_order: Optional[Endianness] = None,
|
30
|
+
signed: Optional[bool] = None,
|
31
|
+
) -> bytes:
|
32
|
+
"""
|
33
|
+
Converts the given integer to a bytes object of given length and byte order.
|
34
|
+
The default values are 32B width (which is the hash result width) and 'big', respectively.
|
35
|
+
"""
|
36
|
+
if length is None:
|
37
|
+
length = HASH_BYTES
|
38
|
+
|
39
|
+
if byte_order is None:
|
40
|
+
byte_order = "big"
|
41
|
+
|
42
|
+
if signed is None:
|
43
|
+
signed = False
|
44
|
+
|
45
|
+
return int.to_bytes(value, length=length, byteorder=byte_order, signed=signed)
|
46
|
+
|
47
|
+
|
48
|
+
def from_bytes(
|
49
|
+
value: bytes,
|
50
|
+
byte_order: Optional[Endianness] = None,
|
51
|
+
signed: Optional[bool] = None,
|
52
|
+
) -> int:
|
53
|
+
"""
|
54
|
+
Converts the given bytes object (parsed according to the given byte order) to an integer.
|
55
|
+
Default byte order is 'big'.
|
56
|
+
"""
|
57
|
+
if byte_order is None:
|
58
|
+
byte_order = "big"
|
59
|
+
|
60
|
+
if signed is None:
|
61
|
+
signed = False
|
62
|
+
|
63
|
+
return int.from_bytes(value, byteorder=byte_order, signed=signed)
|
File without changes
|
File without changes
|
@@ -0,0 +1,35 @@
|
|
1
|
+
"""
|
2
|
+
The routines here were removed from numbers.py, power.py,
|
3
|
+
digits.py and factor_.py so they could be imported into core
|
4
|
+
without raising circular import errors.
|
5
|
+
|
6
|
+
Although the name 'intfunc' was chosen to represent functions that
|
7
|
+
work with integers, it can also be thought of as containing
|
8
|
+
internal/core functions that are needed by the classes of the core.
|
9
|
+
"""
|
10
|
+
|
11
|
+
from ..external.gmpy import (gcdext)
|
12
|
+
|
13
|
+
def igcdex(a, b):
|
14
|
+
"""Returns x, y, g such that g = x*a + y*b = gcd(a, b).
|
15
|
+
|
16
|
+
Examples
|
17
|
+
========
|
18
|
+
|
19
|
+
>>> from sympy.core.intfunc import igcdex
|
20
|
+
>>> igcdex(2, 3)
|
21
|
+
(-1, 1, 1)
|
22
|
+
>>> igcdex(10, 12)
|
23
|
+
(-1, 1, 2)
|
24
|
+
|
25
|
+
>>> x, y, g = igcdex(100, 2004)
|
26
|
+
>>> x, y, g
|
27
|
+
(-20, 1, 4)
|
28
|
+
>>> x*100 + y*2004
|
29
|
+
4
|
30
|
+
|
31
|
+
"""
|
32
|
+
if (not a) and (not b):
|
33
|
+
return (0, 1, 0)
|
34
|
+
g, x, y = gcdext(int(a), int(b))
|
35
|
+
return x, y, g
|
File without changes
|
@@ -0,0 +1,345 @@
|
|
1
|
+
import os
|
2
|
+
from ctypes import c_long, sizeof
|
3
|
+
from functools import reduce
|
4
|
+
from typing import Tuple as tTuple, Type
|
5
|
+
from warnings import warn
|
6
|
+
|
7
|
+
from .importtools import import_module
|
8
|
+
|
9
|
+
from .pythonmpq import PythonMPQ
|
10
|
+
|
11
|
+
from .ntheory import (
|
12
|
+
# bit_scan1 as python_bit_scan1,
|
13
|
+
# bit_scan0 as python_bit_scan0,
|
14
|
+
# remove as python_remove,
|
15
|
+
# factorial as python_factorial,
|
16
|
+
# sqrt as python_sqrt,
|
17
|
+
# sqrtrem as python_sqrtrem,
|
18
|
+
# gcd as python_gcd,
|
19
|
+
# lcm as python_lcm,
|
20
|
+
gcdext as python_gcdext,
|
21
|
+
# is_square as python_is_square,
|
22
|
+
# invert as python_invert,
|
23
|
+
# legendre as python_legendre,
|
24
|
+
# jacobi as python_jacobi,
|
25
|
+
# kronecker as python_kronecker,
|
26
|
+
# iroot as python_iroot,
|
27
|
+
# is_fermat_prp as python_is_fermat_prp,
|
28
|
+
# is_euler_prp as python_is_euler_prp,
|
29
|
+
# is_strong_prp as python_is_strong_prp,
|
30
|
+
# is_fibonacci_prp as python_is_fibonacci_prp,
|
31
|
+
# is_lucas_prp as python_is_lucas_prp,
|
32
|
+
# is_selfridge_prp as python_is_selfridge_prp,
|
33
|
+
# is_strong_lucas_prp as python_is_strong_lucas_prp,
|
34
|
+
# is_strong_selfridge_prp as python_is_strong_selfridge_prp,
|
35
|
+
# is_bpsw_prp as python_is_bpsw_prp,
|
36
|
+
# is_strong_bpsw_prp as python_is_strong_bpsw_prp,
|
37
|
+
)
|
38
|
+
|
39
|
+
|
40
|
+
__all__ = [
|
41
|
+
# GROUND_TYPES is either 'gmpy' or 'python' depending on which is used. If
|
42
|
+
# gmpy is installed then it will be used unless the environment variable
|
43
|
+
# SYMPY_GROUND_TYPES is set to something other than 'auto', 'gmpy', or
|
44
|
+
# 'gmpy2'.
|
45
|
+
'GROUND_TYPES',
|
46
|
+
|
47
|
+
# If HAS_GMPY is 0, no supported version of gmpy is available. Otherwise,
|
48
|
+
# HAS_GMPY will be 2 for gmpy2 if GROUND_TYPES is 'gmpy'. It used to be
|
49
|
+
# possible for HAS_GMPY to be 1 for gmpy but gmpy is no longer supported.
|
50
|
+
'HAS_GMPY',
|
51
|
+
|
52
|
+
# SYMPY_INTS is a tuple containing the base types for valid integer types.
|
53
|
+
# This is either (int,) or (int, type(mpz(0))) depending on GROUND_TYPES.
|
54
|
+
'SYMPY_INTS',
|
55
|
+
|
56
|
+
# MPQ is either gmpy.mpq or the Python equivalent from
|
57
|
+
# sympy.external.pythonmpq
|
58
|
+
'MPQ',
|
59
|
+
|
60
|
+
# MPZ is either gmpy.mpz or int.
|
61
|
+
'MPZ',
|
62
|
+
|
63
|
+
# 'bit_scan1',
|
64
|
+
# 'bit_scan0',
|
65
|
+
# 'remove',
|
66
|
+
# 'factorial',
|
67
|
+
# 'sqrt',
|
68
|
+
# 'is_square',
|
69
|
+
# 'sqrtrem',
|
70
|
+
# 'gcd',
|
71
|
+
# 'lcm',
|
72
|
+
'gcdext',
|
73
|
+
# 'invert',
|
74
|
+
# 'legendre',
|
75
|
+
# 'jacobi',
|
76
|
+
# 'kronecker',
|
77
|
+
# 'iroot',
|
78
|
+
# 'is_fermat_prp',
|
79
|
+
# 'is_euler_prp',
|
80
|
+
# 'is_strong_prp',
|
81
|
+
# 'is_fibonacci_prp',
|
82
|
+
# 'is_lucas_prp',
|
83
|
+
# 'is_selfridge_prp',
|
84
|
+
# 'is_strong_lucas_prp',
|
85
|
+
# 'is_strong_selfridge_prp',
|
86
|
+
# 'is_bpsw_prp',
|
87
|
+
# 'is_strong_bpsw_prp',
|
88
|
+
]
|
89
|
+
|
90
|
+
|
91
|
+
#
|
92
|
+
# Tested python-flint version. Future versions might work but we will only use
|
93
|
+
# them if explicitly requested by SYMPY_GROUND_TYPES=flint.
|
94
|
+
#
|
95
|
+
_PYTHON_FLINT_VERSION_NEEDED = "0.6.*"
|
96
|
+
|
97
|
+
|
98
|
+
def _flint_version_okay(flint_version):
|
99
|
+
flint_ver = flint_version.split('.')[:2]
|
100
|
+
needed_ver = _PYTHON_FLINT_VERSION_NEEDED.split('.')[:2]
|
101
|
+
return flint_ver == needed_ver
|
102
|
+
|
103
|
+
#
|
104
|
+
# We will only use gmpy2 >= 2.0.0
|
105
|
+
#
|
106
|
+
_GMPY2_MIN_VERSION = '2.0.0'
|
107
|
+
|
108
|
+
|
109
|
+
def _get_flint(sympy_ground_types):
|
110
|
+
if sympy_ground_types not in ('auto', 'flint'):
|
111
|
+
return None
|
112
|
+
|
113
|
+
try:
|
114
|
+
import flint
|
115
|
+
# Earlier versions of python-flint may not have __version__.
|
116
|
+
from flint import __version__ as _flint_version
|
117
|
+
except ImportError:
|
118
|
+
if sympy_ground_types == 'flint':
|
119
|
+
warn("SYMPY_GROUND_TYPES was set to flint but python-flint is not "
|
120
|
+
"installed. Falling back to other ground types.")
|
121
|
+
return None
|
122
|
+
|
123
|
+
if _flint_version_okay(_flint_version):
|
124
|
+
return flint
|
125
|
+
elif sympy_ground_types == 'auto':
|
126
|
+
warn(f"python-flint {_flint_version} is installed but only version "
|
127
|
+
f"{_PYTHON_FLINT_VERSION_NEEDED} will be used by default. "
|
128
|
+
f"Falling back to other ground types. Use "
|
129
|
+
f"SYMPY_GROUND_TYPES=flint to force the use of python-flint.")
|
130
|
+
return None
|
131
|
+
else:
|
132
|
+
warn(f"Using python-flint {_flint_version} because SYMPY_GROUND_TYPES "
|
133
|
+
f"is set to flint but this version of SymPy has only been tested "
|
134
|
+
f"with python-flint {_PYTHON_FLINT_VERSION_NEEDED}.")
|
135
|
+
return flint
|
136
|
+
|
137
|
+
|
138
|
+
def _get_gmpy2(sympy_ground_types):
|
139
|
+
if sympy_ground_types not in ('auto', 'gmpy', 'gmpy2'):
|
140
|
+
return None
|
141
|
+
|
142
|
+
gmpy = import_module('gmpy2', min_module_version=_GMPY2_MIN_VERSION,
|
143
|
+
module_version_attr='version', module_version_attr_call_args=())
|
144
|
+
|
145
|
+
if sympy_ground_types != 'auto' and gmpy is None:
|
146
|
+
warn("gmpy2 library is not installed, switching to 'python' ground types")
|
147
|
+
|
148
|
+
return gmpy
|
149
|
+
|
150
|
+
|
151
|
+
#
|
152
|
+
# SYMPY_GROUND_TYPES can be flint, gmpy, gmpy2, python or auto (default)
|
153
|
+
#
|
154
|
+
_SYMPY_GROUND_TYPES = os.environ.get('SYMPY_GROUND_TYPES', 'auto').lower()
|
155
|
+
_flint = None
|
156
|
+
_gmpy = None
|
157
|
+
|
158
|
+
#
|
159
|
+
# First handle auto-detection of flint/gmpy2. We will prefer flint if available
|
160
|
+
# or otherwise gmpy2 if available and then lastly the python types.
|
161
|
+
#
|
162
|
+
if _SYMPY_GROUND_TYPES in ('auto', 'flint'):
|
163
|
+
_flint = _get_flint(_SYMPY_GROUND_TYPES)
|
164
|
+
if _flint is not None:
|
165
|
+
_SYMPY_GROUND_TYPES = 'flint'
|
166
|
+
else:
|
167
|
+
_SYMPY_GROUND_TYPES = 'auto'
|
168
|
+
|
169
|
+
if _SYMPY_GROUND_TYPES in ('auto', 'gmpy', 'gmpy2'):
|
170
|
+
_gmpy = _get_gmpy2(_SYMPY_GROUND_TYPES)
|
171
|
+
if _gmpy is not None:
|
172
|
+
_SYMPY_GROUND_TYPES = 'gmpy'
|
173
|
+
else:
|
174
|
+
_SYMPY_GROUND_TYPES = 'python'
|
175
|
+
|
176
|
+
if _SYMPY_GROUND_TYPES not in ('flint', 'gmpy', 'python'):
|
177
|
+
warn("SYMPY_GROUND_TYPES environment variable unrecognised. "
|
178
|
+
"Should be 'auto', 'flint', 'gmpy', 'gmpy2' or 'python'.")
|
179
|
+
_SYMPY_GROUND_TYPES = 'python'
|
180
|
+
|
181
|
+
#
|
182
|
+
# At this point _SYMPY_GROUND_TYPES is either flint, gmpy or python. The blocks
|
183
|
+
# below define the values exported by this module in each case.
|
184
|
+
#
|
185
|
+
|
186
|
+
#
|
187
|
+
# In gmpy2 and flint, there are functions that take a long (or unsigned long)
|
188
|
+
# argument. That is, it is not possible to input a value larger than that.
|
189
|
+
#
|
190
|
+
LONG_MAX = (1 << (8*sizeof(c_long) - 1)) - 1
|
191
|
+
|
192
|
+
#
|
193
|
+
# Type checkers are confused by what SYMPY_INTS is. There may be a better type
|
194
|
+
# hint for this like Type[Integral] or something.
|
195
|
+
#
|
196
|
+
SYMPY_INTS: tTuple[Type, ...]
|
197
|
+
|
198
|
+
if _SYMPY_GROUND_TYPES == 'gmpy':
|
199
|
+
|
200
|
+
assert _gmpy is not None
|
201
|
+
|
202
|
+
flint = None
|
203
|
+
gmpy = _gmpy
|
204
|
+
|
205
|
+
HAS_GMPY = 2
|
206
|
+
GROUND_TYPES = 'gmpy'
|
207
|
+
SYMPY_INTS = (int, type(gmpy.mpz(0)))
|
208
|
+
MPZ = gmpy.mpz
|
209
|
+
MPQ = gmpy.mpq
|
210
|
+
|
211
|
+
# bit_scan1 = gmpy.bit_scan1
|
212
|
+
# bit_scan0 = gmpy.bit_scan0
|
213
|
+
# remove = gmpy.remove
|
214
|
+
# factorial = gmpy.fac
|
215
|
+
# sqrt = gmpy.isqrt
|
216
|
+
# is_square = gmpy.is_square
|
217
|
+
# sqrtrem = gmpy.isqrt_rem
|
218
|
+
# gcd = gmpy.gcd
|
219
|
+
# lcm = gmpy.lcm
|
220
|
+
gcdext = gmpy.gcdext
|
221
|
+
# invert = gmpy.invert
|
222
|
+
# legendre = gmpy.legendre
|
223
|
+
# jacobi = gmpy.jacobi
|
224
|
+
# kronecker = gmpy.kronecker
|
225
|
+
|
226
|
+
# def iroot(x, n):
|
227
|
+
# # In the latest gmpy2, the threshold for n is ULONG_MAX,
|
228
|
+
# # but adjust to the older one.
|
229
|
+
# if n <= LONG_MAX:
|
230
|
+
# return gmpy.iroot(x, n)
|
231
|
+
# return python_iroot(x, n)
|
232
|
+
|
233
|
+
# is_fermat_prp = gmpy.is_fermat_prp
|
234
|
+
# is_euler_prp = gmpy.is_euler_prp
|
235
|
+
# is_strong_prp = gmpy.is_strong_prp
|
236
|
+
# is_fibonacci_prp = gmpy.is_fibonacci_prp
|
237
|
+
# is_lucas_prp = gmpy.is_lucas_prp
|
238
|
+
# is_selfridge_prp = gmpy.is_selfridge_prp
|
239
|
+
# is_strong_lucas_prp = gmpy.is_strong_lucas_prp
|
240
|
+
# is_strong_selfridge_prp = gmpy.is_strong_selfridge_prp
|
241
|
+
# is_bpsw_prp = gmpy.is_bpsw_prp
|
242
|
+
# is_strong_bpsw_prp = gmpy.is_strong_bpsw_prp
|
243
|
+
|
244
|
+
elif _SYMPY_GROUND_TYPES == 'flint':
|
245
|
+
|
246
|
+
assert _flint is not None
|
247
|
+
|
248
|
+
flint = _flint
|
249
|
+
gmpy = None
|
250
|
+
|
251
|
+
HAS_GMPY = 0
|
252
|
+
GROUND_TYPES = 'flint'
|
253
|
+
SYMPY_INTS = (int, flint.fmpz) # type: ignore
|
254
|
+
MPZ = flint.fmpz # type: ignore
|
255
|
+
MPQ = flint.fmpq # type: ignore
|
256
|
+
|
257
|
+
# bit_scan1 = python_bit_scan1
|
258
|
+
# bit_scan0 = python_bit_scan0
|
259
|
+
# remove = python_remove
|
260
|
+
# factorial = python_factorial
|
261
|
+
|
262
|
+
# def sqrt(x):
|
263
|
+
# return flint.fmpz(x).isqrt()
|
264
|
+
|
265
|
+
# def is_square(x):
|
266
|
+
# if x < 0:
|
267
|
+
# return False
|
268
|
+
# return flint.fmpz(x).sqrtrem()[1] == 0
|
269
|
+
|
270
|
+
# def sqrtrem(x):
|
271
|
+
# return flint.fmpz(x).sqrtrem()
|
272
|
+
|
273
|
+
# def gcd(*args):
|
274
|
+
# return reduce(flint.fmpz.gcd, args, flint.fmpz(0))
|
275
|
+
|
276
|
+
# def lcm(*args):
|
277
|
+
# return reduce(flint.fmpz.lcm, args, flint.fmpz(1))
|
278
|
+
|
279
|
+
gcdext = python_gcdext
|
280
|
+
# invert = python_invert
|
281
|
+
# legendre = python_legendre
|
282
|
+
|
283
|
+
# def jacobi(x, y):
|
284
|
+
# if y <= 0 or not y % 2:
|
285
|
+
# raise ValueError("y should be an odd positive integer")
|
286
|
+
# return flint.fmpz(x).jacobi(y)
|
287
|
+
|
288
|
+
# kronecker = python_kronecker
|
289
|
+
|
290
|
+
# def iroot(x, n):
|
291
|
+
# if n <= LONG_MAX:
|
292
|
+
# y = flint.fmpz(x).root(n)
|
293
|
+
# return y, y**n == x
|
294
|
+
# return python_iroot(x, n)
|
295
|
+
|
296
|
+
# is_fermat_prp = python_is_fermat_prp
|
297
|
+
# is_euler_prp = python_is_euler_prp
|
298
|
+
# is_strong_prp = python_is_strong_prp
|
299
|
+
# is_fibonacci_prp = python_is_fibonacci_prp
|
300
|
+
# is_lucas_prp = python_is_lucas_prp
|
301
|
+
# is_selfridge_prp = python_is_selfridge_prp
|
302
|
+
# is_strong_lucas_prp = python_is_strong_lucas_prp
|
303
|
+
# is_strong_selfridge_prp = python_is_strong_selfridge_prp
|
304
|
+
# is_bpsw_prp = python_is_bpsw_prp
|
305
|
+
# is_strong_bpsw_prp = python_is_strong_bpsw_prp
|
306
|
+
|
307
|
+
elif _SYMPY_GROUND_TYPES == 'python':
|
308
|
+
|
309
|
+
flint = None
|
310
|
+
gmpy = None
|
311
|
+
|
312
|
+
HAS_GMPY = 0
|
313
|
+
GROUND_TYPES = 'python'
|
314
|
+
SYMPY_INTS = (int,)
|
315
|
+
MPZ = int
|
316
|
+
MPQ = PythonMPQ
|
317
|
+
|
318
|
+
# bit_scan1 = python_bit_scan1
|
319
|
+
# bit_scan0 = python_bit_scan0
|
320
|
+
# remove = python_remove
|
321
|
+
# factorial = python_factorial
|
322
|
+
# sqrt = python_sqrt
|
323
|
+
# is_square = python_is_square
|
324
|
+
# sqrtrem = python_sqrtrem
|
325
|
+
# gcd = python_gcd
|
326
|
+
# lcm = python_lcm
|
327
|
+
gcdext = python_gcdext
|
328
|
+
# invert = python_invert
|
329
|
+
# legendre = python_legendre
|
330
|
+
# jacobi = python_jacobi
|
331
|
+
# kronecker = python_kronecker
|
332
|
+
# iroot = python_iroot
|
333
|
+
# is_fermat_prp = python_is_fermat_prp
|
334
|
+
# is_euler_prp = python_is_euler_prp
|
335
|
+
# is_strong_prp = python_is_strong_prp
|
336
|
+
# is_fibonacci_prp = python_is_fibonacci_prp
|
337
|
+
# is_lucas_prp = python_is_lucas_prp
|
338
|
+
# is_selfridge_prp = python_is_selfridge_prp
|
339
|
+
# is_strong_lucas_prp = python_is_strong_lucas_prp
|
340
|
+
# is_strong_selfridge_prp = python_is_strong_selfridge_prp
|
341
|
+
# is_bpsw_prp = python_is_bpsw_prp
|
342
|
+
# is_strong_bpsw_prp = python_is_strong_bpsw_prp
|
343
|
+
|
344
|
+
else:
|
345
|
+
assert False
|
@@ -0,0 +1,187 @@
|
|
1
|
+
"""Tools to assist importing optional external modules."""
|
2
|
+
|
3
|
+
import sys
|
4
|
+
import re
|
5
|
+
|
6
|
+
# Override these in the module to change the default warning behavior.
|
7
|
+
# For example, you might set both to False before running the tests so that
|
8
|
+
# warnings are not printed to the console, or set both to True for debugging.
|
9
|
+
|
10
|
+
WARN_NOT_INSTALLED = None # Default is False
|
11
|
+
WARN_OLD_VERSION = None # Default is True
|
12
|
+
|
13
|
+
|
14
|
+
def __sympy_debug():
|
15
|
+
# helper function from sympy/__init__.py
|
16
|
+
# We don't just import SYMPY_DEBUG from that file because we don't want to
|
17
|
+
# import all of SymPy just to use this module.
|
18
|
+
import os
|
19
|
+
debug_str = os.getenv('SYMPY_DEBUG', 'False')
|
20
|
+
if debug_str in ('True', 'False'):
|
21
|
+
return eval(debug_str)
|
22
|
+
else:
|
23
|
+
raise RuntimeError("unrecognized value for SYMPY_DEBUG: %s" %
|
24
|
+
debug_str)
|
25
|
+
|
26
|
+
if __sympy_debug():
|
27
|
+
WARN_OLD_VERSION = True
|
28
|
+
WARN_NOT_INSTALLED = True
|
29
|
+
|
30
|
+
|
31
|
+
_component_re = re.compile(r'(\d+ | [a-z]+ | \.)', re.VERBOSE)
|
32
|
+
|
33
|
+
def version_tuple(vstring):
|
34
|
+
# Parse a version string to a tuple e.g. '1.2' -> (1, 2)
|
35
|
+
# Simplified from distutils.version.LooseVersion which was deprecated in
|
36
|
+
# Python 3.10.
|
37
|
+
components = []
|
38
|
+
for x in _component_re.split(vstring):
|
39
|
+
if x and x != '.':
|
40
|
+
try:
|
41
|
+
x = int(x)
|
42
|
+
except ValueError:
|
43
|
+
pass
|
44
|
+
components.append(x)
|
45
|
+
return tuple(components)
|
46
|
+
|
47
|
+
|
48
|
+
def import_module(module, min_module_version=None, min_python_version=None,
|
49
|
+
warn_not_installed=None, warn_old_version=None,
|
50
|
+
module_version_attr='__version__', module_version_attr_call_args=None,
|
51
|
+
import_kwargs={}, catch=()):
|
52
|
+
"""
|
53
|
+
Import and return a module if it is installed.
|
54
|
+
|
55
|
+
If the module is not installed, it returns None.
|
56
|
+
|
57
|
+
A minimum version for the module can be given as the keyword argument
|
58
|
+
min_module_version. This should be comparable against the module version.
|
59
|
+
By default, module.__version__ is used to get the module version. To
|
60
|
+
override this, set the module_version_attr keyword argument. If the
|
61
|
+
attribute of the module to get the version should be called (e.g.,
|
62
|
+
module.version()), then set module_version_attr_call_args to the args such
|
63
|
+
that module.module_version_attr(*module_version_attr_call_args) returns the
|
64
|
+
module's version.
|
65
|
+
|
66
|
+
If the module version is less than min_module_version using the Python <
|
67
|
+
comparison, None will be returned, even if the module is installed. You can
|
68
|
+
use this to keep from importing an incompatible older version of a module.
|
69
|
+
|
70
|
+
You can also specify a minimum Python version by using the
|
71
|
+
min_python_version keyword argument. This should be comparable against
|
72
|
+
sys.version_info.
|
73
|
+
|
74
|
+
If the keyword argument warn_not_installed is set to True, the function will
|
75
|
+
emit a UserWarning when the module is not installed.
|
76
|
+
|
77
|
+
If the keyword argument warn_old_version is set to True, the function will
|
78
|
+
emit a UserWarning when the library is installed, but cannot be imported
|
79
|
+
because of the min_module_version or min_python_version options.
|
80
|
+
|
81
|
+
Note that because of the way warnings are handled, a warning will be
|
82
|
+
emitted for each module only once. You can change the default warning
|
83
|
+
behavior by overriding the values of WARN_NOT_INSTALLED and WARN_OLD_VERSION
|
84
|
+
in sympy.external.importtools. By default, WARN_NOT_INSTALLED is False and
|
85
|
+
WARN_OLD_VERSION is True.
|
86
|
+
|
87
|
+
This function uses __import__() to import the module. To pass additional
|
88
|
+
options to __import__(), use the import_kwargs keyword argument. For
|
89
|
+
example, to import a submodule A.B, you must pass a nonempty fromlist option
|
90
|
+
to __import__. See the docstring of __import__().
|
91
|
+
|
92
|
+
This catches ImportError to determine if the module is not installed. To
|
93
|
+
catch additional errors, pass them as a tuple to the catch keyword
|
94
|
+
argument.
|
95
|
+
|
96
|
+
Examples
|
97
|
+
========
|
98
|
+
|
99
|
+
>>> from sympy.external import import_module
|
100
|
+
|
101
|
+
>>> numpy = import_module('numpy')
|
102
|
+
|
103
|
+
>>> numpy = import_module('numpy', min_python_version=(2, 7),
|
104
|
+
... warn_old_version=False)
|
105
|
+
|
106
|
+
>>> numpy = import_module('numpy', min_module_version='1.5',
|
107
|
+
... warn_old_version=False) # numpy.__version__ is a string
|
108
|
+
|
109
|
+
>>> # gmpy does not have __version__, but it does have gmpy.version()
|
110
|
+
|
111
|
+
>>> gmpy = import_module('gmpy', min_module_version='1.14',
|
112
|
+
... module_version_attr='version', module_version_attr_call_args=(),
|
113
|
+
... warn_old_version=False)
|
114
|
+
|
115
|
+
>>> # To import a submodule, you must pass a nonempty fromlist to
|
116
|
+
>>> # __import__(). The values do not matter.
|
117
|
+
>>> p3 = import_module('mpl_toolkits.mplot3d',
|
118
|
+
... import_kwargs={'fromlist':['something']})
|
119
|
+
|
120
|
+
>>> # matplotlib.pyplot can raise RuntimeError when the display cannot be opened
|
121
|
+
>>> matplotlib = import_module('matplotlib',
|
122
|
+
... import_kwargs={'fromlist':['pyplot']}, catch=(RuntimeError,))
|
123
|
+
|
124
|
+
"""
|
125
|
+
# keyword argument overrides default, and global variable overrides
|
126
|
+
# keyword argument.
|
127
|
+
warn_old_version = (WARN_OLD_VERSION if WARN_OLD_VERSION is not None
|
128
|
+
else warn_old_version or True)
|
129
|
+
warn_not_installed = (WARN_NOT_INSTALLED if WARN_NOT_INSTALLED is not None
|
130
|
+
else warn_not_installed or False)
|
131
|
+
|
132
|
+
import warnings
|
133
|
+
|
134
|
+
# Check Python first so we don't waste time importing a module we can't use
|
135
|
+
if min_python_version:
|
136
|
+
if sys.version_info < min_python_version:
|
137
|
+
if warn_old_version:
|
138
|
+
warnings.warn("Python version is too old to use %s "
|
139
|
+
"(%s or newer required)" % (
|
140
|
+
module, '.'.join(map(str, min_python_version))),
|
141
|
+
UserWarning, stacklevel=2)
|
142
|
+
return
|
143
|
+
|
144
|
+
try:
|
145
|
+
mod = __import__(module, **import_kwargs)
|
146
|
+
|
147
|
+
## there's something funny about imports with matplotlib and py3k. doing
|
148
|
+
## from matplotlib import collections
|
149
|
+
## gives python's stdlib collections module. explicitly re-importing
|
150
|
+
## the module fixes this.
|
151
|
+
from_list = import_kwargs.get('fromlist', ())
|
152
|
+
for submod in from_list:
|
153
|
+
if submod == 'collections' and mod.__name__ == 'matplotlib':
|
154
|
+
__import__(module + '.' + submod)
|
155
|
+
except ImportError:
|
156
|
+
if warn_not_installed:
|
157
|
+
warnings.warn("%s module is not installed" % module, UserWarning,
|
158
|
+
stacklevel=2)
|
159
|
+
return
|
160
|
+
except catch as e:
|
161
|
+
if warn_not_installed:
|
162
|
+
warnings.warn(
|
163
|
+
"%s module could not be used (%s)" % (module, repr(e)),
|
164
|
+
stacklevel=2)
|
165
|
+
return
|
166
|
+
|
167
|
+
if min_module_version:
|
168
|
+
modversion = getattr(mod, module_version_attr)
|
169
|
+
if module_version_attr_call_args is not None:
|
170
|
+
modversion = modversion(*module_version_attr_call_args)
|
171
|
+
if version_tuple(modversion) < version_tuple(min_module_version):
|
172
|
+
if warn_old_version:
|
173
|
+
# Attempt to create a pretty string version of the version
|
174
|
+
if isinstance(min_module_version, str):
|
175
|
+
verstr = min_module_version
|
176
|
+
elif isinstance(min_module_version, (tuple, list)):
|
177
|
+
verstr = '.'.join(map(str, min_module_version))
|
178
|
+
else:
|
179
|
+
# Either don't know what this is. Hopefully
|
180
|
+
# it's something that has a nice str version, like an int.
|
181
|
+
verstr = str(min_module_version)
|
182
|
+
warnings.warn("%s version is too old to use "
|
183
|
+
"(%s or newer required)" % (module, verstr),
|
184
|
+
UserWarning, stacklevel=2)
|
185
|
+
return
|
186
|
+
|
187
|
+
return mod
|