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,851 @@
|
|
1
|
+
"""Defines experimental API for runtime inspection of types defined
|
2
|
+
in the standard "typing" module.
|
3
|
+
|
4
|
+
Example usage::
|
5
|
+
from typing_inspect import is_generic_type
|
6
|
+
"""
|
7
|
+
|
8
|
+
# NOTE: This module must support Python 2.7 in addition to Python 3.x
|
9
|
+
|
10
|
+
import sys
|
11
|
+
import types
|
12
|
+
import typing
|
13
|
+
import typing_extensions
|
14
|
+
|
15
|
+
from mypy_extensions import _TypedDictMeta as _TypedDictMeta_Mypy
|
16
|
+
|
17
|
+
# See comments in typing_extensions source on why the switch is at 3.9.2
|
18
|
+
if (3, 4, 0) <= sys.version_info[:3] < (3, 9, 2):
|
19
|
+
from typing_extensions import _TypedDictMeta as _TypedDictMeta_TE
|
20
|
+
elif sys.version_info[:3] >= (3, 9, 2):
|
21
|
+
# Situation with typing_extensions.TypedDict is complicated.
|
22
|
+
# Use the one defined in typing_extentions, and if there is none,
|
23
|
+
# fall back to typing.
|
24
|
+
try:
|
25
|
+
from typing_extensions import _TypedDictMeta as _TypedDictMeta_TE
|
26
|
+
except ImportError:
|
27
|
+
from typing import _TypedDictMeta as _TypedDictMeta_TE
|
28
|
+
else:
|
29
|
+
# typing_extensions.TypedDict is a re-export from typing.
|
30
|
+
from typing import TypedDict
|
31
|
+
_TypedDictMeta_TE = type(TypedDict)
|
32
|
+
|
33
|
+
NEW_TYPING = sys.version_info[:3] >= (3, 7, 0) # PEP 560
|
34
|
+
if NEW_TYPING:
|
35
|
+
import collections.abc
|
36
|
+
|
37
|
+
WITH_FINAL = True
|
38
|
+
WITH_LITERAL = True
|
39
|
+
WITH_CLASSVAR = True
|
40
|
+
WITH_NEWTYPE = True
|
41
|
+
LEGACY_TYPING = False
|
42
|
+
|
43
|
+
if NEW_TYPING:
|
44
|
+
from typing import (
|
45
|
+
Generic, Callable, Union, TypeVar, ClassVar, Tuple, _GenericAlias,
|
46
|
+
ForwardRef, NewType,
|
47
|
+
)
|
48
|
+
from typing_extensions import Final, Literal
|
49
|
+
if sys.version_info[:3] >= (3, 9, 0):
|
50
|
+
from typing import _SpecialGenericAlias
|
51
|
+
typingGenericAlias = (_GenericAlias, _SpecialGenericAlias, types.GenericAlias)
|
52
|
+
else:
|
53
|
+
typingGenericAlias = (_GenericAlias,)
|
54
|
+
else:
|
55
|
+
from typing import (
|
56
|
+
Callable, CallableMeta, Union, Tuple, TupleMeta, TypeVar, GenericMeta,
|
57
|
+
_ForwardRef,
|
58
|
+
)
|
59
|
+
try:
|
60
|
+
from typing import _Union, _ClassVar
|
61
|
+
except ImportError:
|
62
|
+
# support for very old typing module <=3.5.3
|
63
|
+
_Union = type(Union)
|
64
|
+
WITH_CLASSVAR = False
|
65
|
+
LEGACY_TYPING = True
|
66
|
+
|
67
|
+
try: # python 3.6
|
68
|
+
from typing_extensions import _Final
|
69
|
+
except ImportError: # python 2.7
|
70
|
+
try:
|
71
|
+
from typing import _Final
|
72
|
+
except ImportError:
|
73
|
+
WITH_FINAL = False
|
74
|
+
|
75
|
+
try: # python 3.6
|
76
|
+
from typing_extensions import Literal
|
77
|
+
except ImportError: # python 2.7
|
78
|
+
try:
|
79
|
+
from typing import Literal
|
80
|
+
except ImportError:
|
81
|
+
WITH_LITERAL = False
|
82
|
+
|
83
|
+
try: # python < 3.5.2
|
84
|
+
from typing_extensions import NewType
|
85
|
+
except ImportError:
|
86
|
+
try:
|
87
|
+
from typing import NewType
|
88
|
+
except ImportError:
|
89
|
+
WITH_NEWTYPE = False
|
90
|
+
|
91
|
+
|
92
|
+
def _gorg(cls):
|
93
|
+
"""This function exists for compatibility with old typing versions."""
|
94
|
+
assert isinstance(cls, GenericMeta)
|
95
|
+
if hasattr(cls, '_gorg'):
|
96
|
+
return cls._gorg
|
97
|
+
while cls.__origin__ is not None:
|
98
|
+
cls = cls.__origin__
|
99
|
+
return cls
|
100
|
+
|
101
|
+
|
102
|
+
def is_generic_type(tp):
|
103
|
+
"""Test if the given type is a generic type. This includes Generic itself, but
|
104
|
+
excludes special typing constructs such as Union, Tuple, Callable, ClassVar.
|
105
|
+
Examples::
|
106
|
+
|
107
|
+
is_generic_type(int) == False
|
108
|
+
is_generic_type(Union[int, str]) == False
|
109
|
+
is_generic_type(Union[int, T]) == False
|
110
|
+
is_generic_type(ClassVar[List[int]]) == False
|
111
|
+
is_generic_type(Callable[..., T]) == False
|
112
|
+
|
113
|
+
is_generic_type(Generic) == True
|
114
|
+
is_generic_type(Generic[T]) == True
|
115
|
+
is_generic_type(Iterable[int]) == True
|
116
|
+
is_generic_type(Mapping) == True
|
117
|
+
is_generic_type(MutableMapping[T, List[int]]) == True
|
118
|
+
is_generic_type(Sequence[Union[str, bytes]]) == True
|
119
|
+
"""
|
120
|
+
if NEW_TYPING:
|
121
|
+
return (isinstance(tp, type) and issubclass(tp, Generic) or
|
122
|
+
isinstance(tp, typingGenericAlias) and
|
123
|
+
tp.__origin__ not in (Union, tuple, ClassVar, collections.abc.Callable))
|
124
|
+
return (isinstance(tp, GenericMeta) and not
|
125
|
+
isinstance(tp, (CallableMeta, TupleMeta)))
|
126
|
+
|
127
|
+
|
128
|
+
def is_callable_type(tp):
|
129
|
+
"""Test if the type is a generic callable type, including subclasses
|
130
|
+
excluding non-generic types and callables.
|
131
|
+
Examples::
|
132
|
+
|
133
|
+
is_callable_type(int) == False
|
134
|
+
is_callable_type(type) == False
|
135
|
+
is_callable_type(Callable) == True
|
136
|
+
is_callable_type(Callable[..., int]) == True
|
137
|
+
is_callable_type(Callable[[int, int], Iterable[str]]) == True
|
138
|
+
class MyClass(Callable[[int], int]):
|
139
|
+
...
|
140
|
+
is_callable_type(MyClass) == True
|
141
|
+
|
142
|
+
For more general tests use callable(), for more precise test
|
143
|
+
(excluding subclasses) use::
|
144
|
+
|
145
|
+
get_origin(tp) is collections.abc.Callable # Callable prior to Python 3.7
|
146
|
+
"""
|
147
|
+
if NEW_TYPING:
|
148
|
+
return (tp is Callable or isinstance(tp, typingGenericAlias) and
|
149
|
+
tp.__origin__ is collections.abc.Callable or
|
150
|
+
isinstance(tp, type) and issubclass(tp, Generic) and
|
151
|
+
issubclass(tp, collections.abc.Callable))
|
152
|
+
return type(tp) is CallableMeta
|
153
|
+
|
154
|
+
|
155
|
+
def is_tuple_type(tp):
|
156
|
+
"""Test if the type is a generic tuple type, including subclasses excluding
|
157
|
+
non-generic classes.
|
158
|
+
Examples::
|
159
|
+
|
160
|
+
is_tuple_type(int) == False
|
161
|
+
is_tuple_type(tuple) == False
|
162
|
+
is_tuple_type(Tuple) == True
|
163
|
+
is_tuple_type(Tuple[str, int]) == True
|
164
|
+
class MyClass(Tuple[str, int]):
|
165
|
+
...
|
166
|
+
is_tuple_type(MyClass) == True
|
167
|
+
|
168
|
+
For more general tests use issubclass(..., tuple), for more precise test
|
169
|
+
(excluding subclasses) use::
|
170
|
+
|
171
|
+
get_origin(tp) is tuple # Tuple prior to Python 3.7
|
172
|
+
"""
|
173
|
+
if NEW_TYPING:
|
174
|
+
return (tp is Tuple or isinstance(tp, typingGenericAlias) and
|
175
|
+
tp.__origin__ is tuple or
|
176
|
+
isinstance(tp, type) and issubclass(tp, Generic) and
|
177
|
+
issubclass(tp, tuple))
|
178
|
+
return type(tp) is TupleMeta
|
179
|
+
|
180
|
+
|
181
|
+
def is_optional_type(tp):
|
182
|
+
"""Test if the type is type(None), or is a direct union with it, such as Optional[T].
|
183
|
+
|
184
|
+
NOTE: this method inspects nested `Union` arguments but not `TypeVar` definition
|
185
|
+
bounds and constraints. So it will return `False` if
|
186
|
+
- `tp` is a `TypeVar` bound, or constrained to, an optional type
|
187
|
+
- `tp` is a `Union` to a `TypeVar` bound or constrained to an optional type,
|
188
|
+
- `tp` refers to a *nested* `Union` containing an optional type or one of the above.
|
189
|
+
|
190
|
+
Users wishing to check for optionality in types relying on type variables might wish
|
191
|
+
to use this method in combination with `get_constraints` and `get_bound`
|
192
|
+
"""
|
193
|
+
|
194
|
+
if tp is type(None): # noqa
|
195
|
+
return True
|
196
|
+
elif is_union_type(tp):
|
197
|
+
return any(is_optional_type(tt) for tt in get_args(tp, evaluate=True))
|
198
|
+
else:
|
199
|
+
return False
|
200
|
+
|
201
|
+
|
202
|
+
def is_final_type(tp):
|
203
|
+
"""Test if the type is a final type. Examples::
|
204
|
+
|
205
|
+
is_final_type(int) == False
|
206
|
+
is_final_type(Final) == True
|
207
|
+
is_final_type(Final[int]) == True
|
208
|
+
"""
|
209
|
+
if NEW_TYPING:
|
210
|
+
return (tp is Final or
|
211
|
+
isinstance(tp, typingGenericAlias) and tp.__origin__ is Final)
|
212
|
+
return WITH_FINAL and type(tp) is _Final
|
213
|
+
|
214
|
+
|
215
|
+
try:
|
216
|
+
MaybeUnionType = types.UnionType
|
217
|
+
except AttributeError:
|
218
|
+
MaybeUnionType = None
|
219
|
+
|
220
|
+
|
221
|
+
def is_union_type(tp):
|
222
|
+
"""Test if the type is a union type. Examples::
|
223
|
+
|
224
|
+
is_union_type(int) == False
|
225
|
+
is_union_type(Union) == True
|
226
|
+
is_union_type(Union[int, int]) == False
|
227
|
+
is_union_type(Union[T, int]) == True
|
228
|
+
is_union_type(int | int) == False
|
229
|
+
is_union_type(T | int) == True
|
230
|
+
"""
|
231
|
+
if NEW_TYPING:
|
232
|
+
return (tp is Union or
|
233
|
+
(isinstance(tp, typingGenericAlias) and tp.__origin__ is Union) or
|
234
|
+
(MaybeUnionType and isinstance(tp, MaybeUnionType)))
|
235
|
+
return type(tp) is _Union
|
236
|
+
|
237
|
+
|
238
|
+
LITERALS = {Literal}
|
239
|
+
if hasattr(typing, "Literal"):
|
240
|
+
LITERALS.add(typing.Literal)
|
241
|
+
|
242
|
+
|
243
|
+
def is_literal_type(tp):
|
244
|
+
if NEW_TYPING:
|
245
|
+
return (tp in LITERALS or
|
246
|
+
isinstance(tp, typingGenericAlias) and tp.__origin__ in LITERALS)
|
247
|
+
return WITH_LITERAL and type(tp) is type(Literal)
|
248
|
+
|
249
|
+
|
250
|
+
def is_typevar(tp):
|
251
|
+
"""Test if the type represents a type variable. Examples::
|
252
|
+
|
253
|
+
is_typevar(int) == False
|
254
|
+
is_typevar(T) == True
|
255
|
+
is_typevar(Union[T, int]) == False
|
256
|
+
"""
|
257
|
+
|
258
|
+
return type(tp) is TypeVar
|
259
|
+
|
260
|
+
|
261
|
+
def is_classvar(tp):
|
262
|
+
"""Test if the type represents a class variable. Examples::
|
263
|
+
|
264
|
+
is_classvar(int) == False
|
265
|
+
is_classvar(ClassVar) == True
|
266
|
+
is_classvar(ClassVar[int]) == True
|
267
|
+
is_classvar(ClassVar[List[T]]) == True
|
268
|
+
"""
|
269
|
+
if NEW_TYPING:
|
270
|
+
return (tp is ClassVar or
|
271
|
+
isinstance(tp, typingGenericAlias) and tp.__origin__ is ClassVar)
|
272
|
+
elif WITH_CLASSVAR:
|
273
|
+
return type(tp) is _ClassVar
|
274
|
+
else:
|
275
|
+
return False
|
276
|
+
|
277
|
+
|
278
|
+
def is_new_type(tp):
|
279
|
+
"""Tests if the type represents a distinct type. Examples::
|
280
|
+
|
281
|
+
is_new_type(int) == False
|
282
|
+
is_new_type(NewType) == True
|
283
|
+
is_new_type(NewType('Age', int)) == True
|
284
|
+
is_new_type(NewType('Scores', List[Dict[str, float]])) == True
|
285
|
+
"""
|
286
|
+
if not WITH_NEWTYPE:
|
287
|
+
return False
|
288
|
+
elif sys.version_info[:3] >= (3, 10, 0) and sys.version_info.releaselevel != 'beta':
|
289
|
+
return (tp in (NewType, typing_extensions.NewType) or
|
290
|
+
isinstance(tp, (NewType, typing_extensions.NewType)))
|
291
|
+
elif sys.version_info[:3] >= (3, 0, 0):
|
292
|
+
try:
|
293
|
+
res = isinstance(tp, typing_extensions.NewType)
|
294
|
+
except TypeError:
|
295
|
+
pass
|
296
|
+
else:
|
297
|
+
if res:
|
298
|
+
return res
|
299
|
+
return (tp in (NewType, typing_extensions.NewType) or
|
300
|
+
(getattr(tp, '__supertype__', None) is not None and
|
301
|
+
getattr(tp, '__qualname__', '') == 'NewType.<locals>.new_type' and
|
302
|
+
tp.__module__ in ('typing', 'typing_extensions')))
|
303
|
+
else: # python 2
|
304
|
+
# __qualname__ is not available in python 2, so we simplify the test here
|
305
|
+
return (tp is NewType or
|
306
|
+
(getattr(tp, '__supertype__', None) is not None and
|
307
|
+
tp.__module__ in ('typing', 'typing_extensions')))
|
308
|
+
|
309
|
+
|
310
|
+
def is_forward_ref(tp):
|
311
|
+
"""Tests if the type is a :class:`typing.ForwardRef`. Examples::
|
312
|
+
|
313
|
+
u = Union["Milk", Way]
|
314
|
+
args = get_args(u)
|
315
|
+
is_forward_ref(args[0]) == True
|
316
|
+
is_forward_ref(args[1]) == False
|
317
|
+
"""
|
318
|
+
if not NEW_TYPING:
|
319
|
+
return isinstance(tp, _ForwardRef)
|
320
|
+
return isinstance(tp, ForwardRef)
|
321
|
+
|
322
|
+
|
323
|
+
def get_last_origin(tp):
|
324
|
+
"""Get the last base of (multiply) subscripted type. Supports generic types,
|
325
|
+
Union, Callable, and Tuple. Returns None for unsupported types.
|
326
|
+
Examples::
|
327
|
+
|
328
|
+
get_last_origin(int) == None
|
329
|
+
get_last_origin(ClassVar[int]) == None
|
330
|
+
get_last_origin(Generic[T]) == Generic
|
331
|
+
get_last_origin(Union[T, int][str]) == Union[T, int]
|
332
|
+
get_last_origin(List[Tuple[T, T]][int]) == List[Tuple[T, T]]
|
333
|
+
get_last_origin(List) == List
|
334
|
+
"""
|
335
|
+
if NEW_TYPING:
|
336
|
+
raise ValueError('This function is only supported in Python 3.6,'
|
337
|
+
' use get_origin instead')
|
338
|
+
sentinel = object()
|
339
|
+
origin = getattr(tp, '__origin__', sentinel)
|
340
|
+
if origin is sentinel:
|
341
|
+
return None
|
342
|
+
if origin is None:
|
343
|
+
return tp
|
344
|
+
return origin
|
345
|
+
|
346
|
+
|
347
|
+
def get_origin(tp):
|
348
|
+
"""Get the unsubscripted version of a type. Supports generic types, Union,
|
349
|
+
Callable, and Tuple. Returns None for unsupported types. Examples::
|
350
|
+
|
351
|
+
get_origin(int) == None
|
352
|
+
get_origin(ClassVar[int]) == None
|
353
|
+
get_origin(Generic) == Generic
|
354
|
+
get_origin(Generic[T]) == Generic
|
355
|
+
get_origin(Union[T, int]) == Union
|
356
|
+
get_origin(List[Tuple[T, T]][int]) == list # List prior to Python 3.7
|
357
|
+
"""
|
358
|
+
if NEW_TYPING:
|
359
|
+
if isinstance(tp, typingGenericAlias):
|
360
|
+
return tp.__origin__ if tp.__origin__ is not ClassVar else None
|
361
|
+
if tp is Generic:
|
362
|
+
return Generic
|
363
|
+
return None
|
364
|
+
if isinstance(tp, GenericMeta):
|
365
|
+
return _gorg(tp)
|
366
|
+
if is_union_type(tp):
|
367
|
+
return Union
|
368
|
+
if is_tuple_type(tp):
|
369
|
+
return Tuple
|
370
|
+
if is_literal_type(tp):
|
371
|
+
if NEW_TYPING:
|
372
|
+
return tp.__origin__ or tp
|
373
|
+
return Literal
|
374
|
+
|
375
|
+
return None
|
376
|
+
|
377
|
+
|
378
|
+
def get_parameters(tp):
|
379
|
+
"""Return type parameters of a parameterizable type as a tuple
|
380
|
+
in lexicographic order. Parameterizable types are generic types,
|
381
|
+
unions, tuple types and callable types. Examples::
|
382
|
+
|
383
|
+
get_parameters(int) == ()
|
384
|
+
get_parameters(Generic) == ()
|
385
|
+
get_parameters(Union) == ()
|
386
|
+
get_parameters(List[int]) == ()
|
387
|
+
|
388
|
+
get_parameters(Generic[T]) == (T,)
|
389
|
+
get_parameters(Tuple[List[T], List[S_co]]) == (T, S_co)
|
390
|
+
get_parameters(Union[S_co, Tuple[T, T]][int, U]) == (U,)
|
391
|
+
get_parameters(Mapping[T, Tuple[S_co, T]]) == (T, S_co)
|
392
|
+
"""
|
393
|
+
if LEGACY_TYPING:
|
394
|
+
# python <= 3.5.2
|
395
|
+
if is_union_type(tp):
|
396
|
+
params = []
|
397
|
+
for arg in (tp.__union_params__ if tp.__union_params__ is not None else ()):
|
398
|
+
params += get_parameters(arg)
|
399
|
+
return tuple(params)
|
400
|
+
elif is_tuple_type(tp):
|
401
|
+
params = []
|
402
|
+
for arg in (tp.__tuple_params__ if tp.__tuple_params__ is not None else ()):
|
403
|
+
params += get_parameters(arg)
|
404
|
+
return tuple(params)
|
405
|
+
elif is_generic_type(tp):
|
406
|
+
params = []
|
407
|
+
base_params = tp.__parameters__
|
408
|
+
if base_params is None:
|
409
|
+
return ()
|
410
|
+
for bp_ in base_params:
|
411
|
+
for bp in (get_args(bp_) if is_tuple_type(bp_) else (bp_,)):
|
412
|
+
if _has_type_var(bp) and not isinstance(bp, TypeVar):
|
413
|
+
raise TypeError(
|
414
|
+
"Cannot inherit from a generic class "
|
415
|
+
"parameterized with "
|
416
|
+
"non-type-variable %s" % bp)
|
417
|
+
if params is None:
|
418
|
+
params = []
|
419
|
+
if bp not in params:
|
420
|
+
params.append(bp)
|
421
|
+
if params is not None:
|
422
|
+
return tuple(params)
|
423
|
+
else:
|
424
|
+
return ()
|
425
|
+
else:
|
426
|
+
return ()
|
427
|
+
elif NEW_TYPING:
|
428
|
+
if (
|
429
|
+
(
|
430
|
+
isinstance(tp, typingGenericAlias) and
|
431
|
+
hasattr(tp, '__parameters__')
|
432
|
+
) or
|
433
|
+
isinstance(tp, type) and issubclass(tp, Generic) and
|
434
|
+
tp is not Generic):
|
435
|
+
return tp.__parameters__
|
436
|
+
else:
|
437
|
+
return ()
|
438
|
+
elif (
|
439
|
+
is_generic_type(tp) or is_union_type(tp) or
|
440
|
+
is_callable_type(tp) or is_tuple_type(tp)
|
441
|
+
):
|
442
|
+
return tp.__parameters__ if tp.__parameters__ is not None else ()
|
443
|
+
else:
|
444
|
+
return ()
|
445
|
+
|
446
|
+
|
447
|
+
def get_last_args(tp):
|
448
|
+
"""Get last arguments of (multiply) subscripted type.
|
449
|
+
Parameters for Callable are flattened. Examples::
|
450
|
+
|
451
|
+
get_last_args(int) == ()
|
452
|
+
get_last_args(Union) == ()
|
453
|
+
get_last_args(ClassVar[int]) == (int,)
|
454
|
+
get_last_args(Union[T, int]) == (T, int)
|
455
|
+
get_last_args(Iterable[Tuple[T, S]][int, T]) == (int, T)
|
456
|
+
get_last_args(Callable[[T], int]) == (T, int)
|
457
|
+
get_last_args(Callable[[], int]) == (int,)
|
458
|
+
"""
|
459
|
+
if NEW_TYPING:
|
460
|
+
raise ValueError('This function is only supported in Python 3.6,'
|
461
|
+
' use get_args instead')
|
462
|
+
elif is_classvar(tp):
|
463
|
+
return (tp.__type__,) if tp.__type__ is not None else ()
|
464
|
+
elif is_generic_type(tp):
|
465
|
+
try:
|
466
|
+
if tp.__args__ is not None and len(tp.__args__) > 0:
|
467
|
+
return tp.__args__
|
468
|
+
except AttributeError:
|
469
|
+
# python 3.5.1
|
470
|
+
pass
|
471
|
+
return tp.__parameters__ if tp.__parameters__ is not None else ()
|
472
|
+
elif is_union_type(tp):
|
473
|
+
try:
|
474
|
+
return tp.__args__ if tp.__args__ is not None else ()
|
475
|
+
except AttributeError:
|
476
|
+
# python 3.5.2
|
477
|
+
return tp.__union_params__ if tp.__union_params__ is not None else ()
|
478
|
+
elif is_callable_type(tp):
|
479
|
+
return tp.__args__ if tp.__args__ is not None else ()
|
480
|
+
elif is_tuple_type(tp):
|
481
|
+
try:
|
482
|
+
return tp.__args__ if tp.__args__ is not None else ()
|
483
|
+
except AttributeError:
|
484
|
+
# python 3.5.2
|
485
|
+
return tp.__tuple_params__ if tp.__tuple_params__ is not None else ()
|
486
|
+
else:
|
487
|
+
return ()
|
488
|
+
|
489
|
+
|
490
|
+
def _eval_args(args):
|
491
|
+
"""Internal helper for get_args."""
|
492
|
+
res = []
|
493
|
+
for arg in args:
|
494
|
+
if not isinstance(arg, tuple):
|
495
|
+
res.append(arg)
|
496
|
+
elif is_callable_type(arg[0]):
|
497
|
+
callable_args = _eval_args(arg[1:])
|
498
|
+
if len(arg) == 2:
|
499
|
+
res.append(Callable[[], callable_args[0]])
|
500
|
+
elif arg[1] is Ellipsis:
|
501
|
+
res.append(Callable[..., callable_args[1]])
|
502
|
+
else:
|
503
|
+
res.append(Callable[list(callable_args[:-1]), callable_args[-1]])
|
504
|
+
else:
|
505
|
+
res.append(type(arg[0]).__getitem__(arg[0], _eval_args(arg[1:])))
|
506
|
+
return tuple(res)
|
507
|
+
|
508
|
+
|
509
|
+
def get_args(tp, evaluate=None):
|
510
|
+
"""Get type arguments with all substitutions performed. For unions,
|
511
|
+
basic simplifications used by Union constructor are performed.
|
512
|
+
On versions prior to 3.7 if `evaluate` is False (default),
|
513
|
+
report result as nested tuple, this matches
|
514
|
+
the internal representation of types. If `evaluate` is True
|
515
|
+
(or if Python version is 3.7 or greater), then all
|
516
|
+
type parameters are applied (this could be time and memory expensive).
|
517
|
+
Examples::
|
518
|
+
|
519
|
+
get_args(int) == ()
|
520
|
+
get_args(Union[int, Union[T, int], str][int]) == (int, str)
|
521
|
+
get_args(Union[int, Tuple[T, int]][str]) == (int, (Tuple, str, int))
|
522
|
+
|
523
|
+
get_args(Union[int, Tuple[T, int]][str], evaluate=True) == \
|
524
|
+
(int, Tuple[str, int])
|
525
|
+
get_args(Dict[int, Tuple[T, T]][Optional[int]], evaluate=True) == \
|
526
|
+
(int, Tuple[Optional[int], Optional[int]])
|
527
|
+
get_args(Callable[[], T][int], evaluate=True) == ([], int,)
|
528
|
+
"""
|
529
|
+
if NEW_TYPING:
|
530
|
+
if evaluate is not None and not evaluate:
|
531
|
+
raise ValueError('evaluate can only be True in Python >= 3.7')
|
532
|
+
# Note special aliases on Python 3.9 don't have __args__.
|
533
|
+
if isinstance(tp, typingGenericAlias) and hasattr(tp, '__args__'):
|
534
|
+
res = tp.__args__
|
535
|
+
if get_origin(tp) is collections.abc.Callable and res[0] is not Ellipsis:
|
536
|
+
res = (list(res[:-1]), res[-1])
|
537
|
+
return res
|
538
|
+
if MaybeUnionType and isinstance(tp, MaybeUnionType):
|
539
|
+
return tp.__args__
|
540
|
+
return ()
|
541
|
+
if is_classvar(tp) or is_final_type(tp):
|
542
|
+
return (tp.__type__,) if tp.__type__ is not None else ()
|
543
|
+
if is_literal_type(tp):
|
544
|
+
return tp.__values__ or ()
|
545
|
+
if (
|
546
|
+
is_generic_type(tp) or is_union_type(tp) or
|
547
|
+
is_callable_type(tp) or is_tuple_type(tp)
|
548
|
+
):
|
549
|
+
try:
|
550
|
+
tree = tp._subs_tree()
|
551
|
+
except AttributeError:
|
552
|
+
# Old python typing module <= 3.5.3
|
553
|
+
if is_union_type(tp):
|
554
|
+
# backport of union's subs_tree
|
555
|
+
tree = _union_subs_tree(tp)
|
556
|
+
elif is_generic_type(tp):
|
557
|
+
# backport of GenericMeta's subs_tree
|
558
|
+
tree = _generic_subs_tree(tp)
|
559
|
+
elif is_tuple_type(tp):
|
560
|
+
# ad-hoc (inspired by union)
|
561
|
+
tree = _tuple_subs_tree(tp)
|
562
|
+
else:
|
563
|
+
# tree = _subs_tree(tp)
|
564
|
+
return ()
|
565
|
+
|
566
|
+
if isinstance(tree, tuple) and len(tree) > 1:
|
567
|
+
if not evaluate:
|
568
|
+
return tree[1:]
|
569
|
+
res = _eval_args(tree[1:])
|
570
|
+
if get_origin(tp) is Callable and res[0] is not Ellipsis:
|
571
|
+
res = (list(res[:-1]), res[-1])
|
572
|
+
return res
|
573
|
+
|
574
|
+
return ()
|
575
|
+
|
576
|
+
|
577
|
+
def get_bound(tp):
|
578
|
+
"""Return the type bound to a `TypeVar` if any.
|
579
|
+
|
580
|
+
It the type is not a `TypeVar`, a `TypeError` is raised.
|
581
|
+
Examples::
|
582
|
+
|
583
|
+
get_bound(TypeVar('T')) == None
|
584
|
+
get_bound(TypeVar('T', bound=int)) == int
|
585
|
+
"""
|
586
|
+
|
587
|
+
if is_typevar(tp):
|
588
|
+
return getattr(tp, '__bound__', None)
|
589
|
+
else:
|
590
|
+
raise TypeError("type is not a `TypeVar`: " + str(tp))
|
591
|
+
|
592
|
+
|
593
|
+
def get_constraints(tp):
|
594
|
+
"""Returns the constraints of a `TypeVar` if any.
|
595
|
+
|
596
|
+
It the type is not a `TypeVar`, a `TypeError` is raised
|
597
|
+
Examples::
|
598
|
+
|
599
|
+
get_constraints(TypeVar('T')) == ()
|
600
|
+
get_constraints(TypeVar('T', int, str)) == (int, str)
|
601
|
+
"""
|
602
|
+
|
603
|
+
if is_typevar(tp):
|
604
|
+
return getattr(tp, '__constraints__', ())
|
605
|
+
else:
|
606
|
+
raise TypeError("type is not a `TypeVar`: " + str(tp))
|
607
|
+
|
608
|
+
|
609
|
+
def get_generic_type(obj):
|
610
|
+
"""Get the generic type of an object if possible, or runtime class otherwise.
|
611
|
+
Examples::
|
612
|
+
|
613
|
+
class Node(Generic[T]):
|
614
|
+
...
|
615
|
+
type(Node[int]()) == Node
|
616
|
+
get_generic_type(Node[int]()) == Node[int]
|
617
|
+
get_generic_type(Node[T]()) == Node[T]
|
618
|
+
get_generic_type(1) == int
|
619
|
+
"""
|
620
|
+
|
621
|
+
gen_type = getattr(obj, '__orig_class__', None)
|
622
|
+
return gen_type if gen_type is not None else type(obj)
|
623
|
+
|
624
|
+
|
625
|
+
def get_generic_bases(tp):
|
626
|
+
"""Get generic base types of a type or empty tuple if not possible.
|
627
|
+
Example::
|
628
|
+
|
629
|
+
class MyClass(List[int], Mapping[str, List[int]]):
|
630
|
+
...
|
631
|
+
MyClass.__bases__ == (List, Mapping)
|
632
|
+
get_generic_bases(MyClass) == (List[int], Mapping[str, List[int]])
|
633
|
+
"""
|
634
|
+
if LEGACY_TYPING:
|
635
|
+
return tuple(t for t in tp.__bases__ if isinstance(t, GenericMeta))
|
636
|
+
else:
|
637
|
+
return getattr(tp, '__orig_bases__', ())
|
638
|
+
|
639
|
+
|
640
|
+
def typed_dict_keys(td):
|
641
|
+
"""If td is a TypedDict class, return a dictionary mapping the typed keys to types.
|
642
|
+
Otherwise, return None. Examples::
|
643
|
+
|
644
|
+
class TD(TypedDict):
|
645
|
+
x: int
|
646
|
+
y: int
|
647
|
+
class Other(dict):
|
648
|
+
x: int
|
649
|
+
y: int
|
650
|
+
|
651
|
+
typed_dict_keys(TD) == {'x': int, 'y': int}
|
652
|
+
typed_dict_keys(dict) == None
|
653
|
+
typed_dict_keys(Other) == None
|
654
|
+
"""
|
655
|
+
if isinstance(td, (_TypedDictMeta_Mypy, _TypedDictMeta_TE)):
|
656
|
+
return td.__annotations__.copy()
|
657
|
+
return None
|
658
|
+
|
659
|
+
|
660
|
+
def get_forward_arg(fr):
|
661
|
+
"""
|
662
|
+
If fr is a ForwardRef, return the string representation of the forward reference.
|
663
|
+
Otherwise return None. Examples::
|
664
|
+
|
665
|
+
tp = List["FRef"]
|
666
|
+
fr = get_args(tp)[0]
|
667
|
+
get_forward_arg(fr) == "FRef"
|
668
|
+
get_forward_arg(tp) == None
|
669
|
+
"""
|
670
|
+
return fr.__forward_arg__ if is_forward_ref(fr) else None
|
671
|
+
|
672
|
+
|
673
|
+
# A few functions backported and adapted for the LEGACY_TYPING context, and used above
|
674
|
+
|
675
|
+
def _replace_arg(arg, tvars, args):
|
676
|
+
"""backport of _replace_arg"""
|
677
|
+
if tvars is None:
|
678
|
+
tvars = []
|
679
|
+
# if hasattr(arg, '_subs_tree') and isinstance(arg, (GenericMeta, _TypingBase)):
|
680
|
+
# return arg._subs_tree(tvars, args)
|
681
|
+
if is_union_type(arg):
|
682
|
+
return _union_subs_tree(arg, tvars, args)
|
683
|
+
if is_tuple_type(arg):
|
684
|
+
return _tuple_subs_tree(arg, tvars, args)
|
685
|
+
if is_generic_type(arg):
|
686
|
+
return _generic_subs_tree(arg, tvars, args)
|
687
|
+
if isinstance(arg, TypeVar):
|
688
|
+
for i, tvar in enumerate(tvars):
|
689
|
+
if arg == tvar:
|
690
|
+
return args[i]
|
691
|
+
return arg
|
692
|
+
|
693
|
+
|
694
|
+
def _remove_dups_flatten(parameters):
|
695
|
+
"""backport of _remove_dups_flatten"""
|
696
|
+
|
697
|
+
# Flatten out Union[Union[...], ...].
|
698
|
+
params = []
|
699
|
+
for p in parameters:
|
700
|
+
if isinstance(p, _Union): # and p.__origin__ is Union:
|
701
|
+
params.extend(p.__union_params__) # p.__args__)
|
702
|
+
elif isinstance(p, tuple) and len(p) > 0 and p[0] is Union:
|
703
|
+
params.extend(p[1:])
|
704
|
+
else:
|
705
|
+
params.append(p)
|
706
|
+
# Weed out strict duplicates, preserving the first of each occurrence.
|
707
|
+
all_params = set(params)
|
708
|
+
if len(all_params) < len(params):
|
709
|
+
new_params = []
|
710
|
+
for t in params:
|
711
|
+
if t in all_params:
|
712
|
+
new_params.append(t)
|
713
|
+
all_params.remove(t)
|
714
|
+
params = new_params
|
715
|
+
assert not all_params, all_params
|
716
|
+
# Weed out subclasses.
|
717
|
+
# E.g. Union[int, Employee, Manager] == Union[int, Employee].
|
718
|
+
# If object is present it will be sole survivor among proper classes.
|
719
|
+
# Never discard type variables.
|
720
|
+
# (In particular, Union[str, AnyStr] != AnyStr.)
|
721
|
+
all_params = set(params)
|
722
|
+
for t1 in params:
|
723
|
+
if not isinstance(t1, type):
|
724
|
+
continue
|
725
|
+
if any(isinstance(t2, type) and issubclass(t1, t2)
|
726
|
+
for t2 in all_params - {t1}
|
727
|
+
if (not (isinstance(t2, GenericMeta) and
|
728
|
+
get_origin(t2) is not None) and
|
729
|
+
not isinstance(t2, TypeVar))):
|
730
|
+
all_params.remove(t1)
|
731
|
+
return tuple(t for t in params if t in all_params)
|
732
|
+
|
733
|
+
|
734
|
+
def _subs_tree(cls, tvars=None, args=None):
|
735
|
+
"""backport of typing._subs_tree, adapted for legacy versions """
|
736
|
+
def _get_origin(cls):
|
737
|
+
try:
|
738
|
+
return cls.__origin__
|
739
|
+
except AttributeError:
|
740
|
+
return None
|
741
|
+
|
742
|
+
current = _get_origin(cls)
|
743
|
+
if current is None:
|
744
|
+
if not is_union_type(cls) and not is_tuple_type(cls):
|
745
|
+
return cls
|
746
|
+
|
747
|
+
# Make of chain of origins (i.e. cls -> cls.__origin__)
|
748
|
+
orig_chain = []
|
749
|
+
while _get_origin(current) is not None:
|
750
|
+
orig_chain.append(current)
|
751
|
+
current = _get_origin(current)
|
752
|
+
|
753
|
+
# Replace type variables in __args__ if asked ...
|
754
|
+
tree_args = []
|
755
|
+
|
756
|
+
def _get_args(cls):
|
757
|
+
if is_union_type(cls):
|
758
|
+
cls_args = cls.__union_params__
|
759
|
+
elif is_tuple_type(cls):
|
760
|
+
cls_args = cls.__tuple_params__
|
761
|
+
else:
|
762
|
+
try:
|
763
|
+
cls_args = cls.__args__
|
764
|
+
except AttributeError:
|
765
|
+
cls_args = ()
|
766
|
+
return cls_args if cls_args is not None else ()
|
767
|
+
|
768
|
+
for arg in _get_args(cls):
|
769
|
+
tree_args.append(_replace_arg(arg, tvars, args))
|
770
|
+
# ... then continue replacing down the origin chain.
|
771
|
+
for ocls in orig_chain:
|
772
|
+
new_tree_args = []
|
773
|
+
for arg in _get_args(ocls):
|
774
|
+
new_tree_args.append(_replace_arg(arg, get_parameters(ocls), tree_args))
|
775
|
+
tree_args = new_tree_args
|
776
|
+
return tree_args
|
777
|
+
|
778
|
+
|
779
|
+
def _union_subs_tree(tp, tvars=None, args=None):
|
780
|
+
""" backport of Union._subs_tree """
|
781
|
+
if tp is Union:
|
782
|
+
return Union # Nothing to substitute
|
783
|
+
tree_args = _subs_tree(tp, tvars, args)
|
784
|
+
# tree_args = tp.__union_params__ if tp.__union_params__ is not None else ()
|
785
|
+
tree_args = _remove_dups_flatten(tree_args)
|
786
|
+
if len(tree_args) == 1:
|
787
|
+
return tree_args[0] # Union of a single type is that type
|
788
|
+
return (Union,) + tree_args
|
789
|
+
|
790
|
+
|
791
|
+
def _generic_subs_tree(tp, tvars=None, args=None):
|
792
|
+
""" backport of GenericMeta._subs_tree """
|
793
|
+
if tp.__origin__ is None:
|
794
|
+
return tp
|
795
|
+
tree_args = _subs_tree(tp, tvars, args)
|
796
|
+
return (_gorg(tp),) + tuple(tree_args)
|
797
|
+
|
798
|
+
|
799
|
+
def _tuple_subs_tree(tp, tvars=None, args=None):
|
800
|
+
""" ad-hoc function (inspired by union) for legacy typing """
|
801
|
+
if tp is Tuple:
|
802
|
+
return Tuple # Nothing to substitute
|
803
|
+
tree_args = _subs_tree(tp, tvars, args)
|
804
|
+
return (Tuple,) + tuple(tree_args)
|
805
|
+
|
806
|
+
|
807
|
+
def _has_type_var(t):
|
808
|
+
if t is None:
|
809
|
+
return False
|
810
|
+
elif is_union_type(t):
|
811
|
+
return _union_has_type_var(t)
|
812
|
+
elif is_tuple_type(t):
|
813
|
+
return _tuple_has_type_var(t)
|
814
|
+
elif is_generic_type(t):
|
815
|
+
return _generic_has_type_var(t)
|
816
|
+
elif is_callable_type(t):
|
817
|
+
return _callable_has_type_var(t)
|
818
|
+
else:
|
819
|
+
return False
|
820
|
+
|
821
|
+
|
822
|
+
def _union_has_type_var(tp):
|
823
|
+
if tp.__union_params__:
|
824
|
+
for t in tp.__union_params__:
|
825
|
+
if _has_type_var(t):
|
826
|
+
return True
|
827
|
+
return False
|
828
|
+
|
829
|
+
|
830
|
+
def _tuple_has_type_var(tp):
|
831
|
+
if tp.__tuple_params__:
|
832
|
+
for t in tp.__tuple_params__:
|
833
|
+
if _has_type_var(t):
|
834
|
+
return True
|
835
|
+
return False
|
836
|
+
|
837
|
+
|
838
|
+
def _callable_has_type_var(tp):
|
839
|
+
if tp.__args__:
|
840
|
+
for t in tp.__args__:
|
841
|
+
if _has_type_var(t):
|
842
|
+
return True
|
843
|
+
return _has_type_var(tp.__result__)
|
844
|
+
|
845
|
+
|
846
|
+
def _generic_has_type_var(tp):
|
847
|
+
if tp.__parameters__:
|
848
|
+
for t in tp.__parameters__:
|
849
|
+
if _has_type_var(t):
|
850
|
+
return True
|
851
|
+
return False
|