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,12 @@
|
|
1
|
+
"""Type aliases.
|
2
|
+
|
3
|
+
.. warning::
|
4
|
+
|
5
|
+
This module is provisional. Types may be modified, added, and removed between minor releases.
|
6
|
+
"""
|
7
|
+
|
8
|
+
import typing
|
9
|
+
|
10
|
+
StrSequenceOrSet = typing.Union[typing.Sequence[str], typing.AbstractSet[str]]
|
11
|
+
Tag = typing.Union[str, typing.Tuple[str, bool]]
|
12
|
+
Validator = typing.Callable[[typing.Any], typing.Any]
|
@@ -0,0 +1,378 @@
|
|
1
|
+
"""Utility methods for marshmallow."""
|
2
|
+
|
3
|
+
from __future__ import annotations
|
4
|
+
|
5
|
+
import collections
|
6
|
+
import datetime as dt
|
7
|
+
import functools
|
8
|
+
import inspect
|
9
|
+
import json
|
10
|
+
import re
|
11
|
+
import typing
|
12
|
+
import warnings
|
13
|
+
from collections.abc import Mapping
|
14
|
+
from email.utils import format_datetime, parsedate_to_datetime
|
15
|
+
from pprint import pprint as py_pprint
|
16
|
+
|
17
|
+
from .base import FieldABC
|
18
|
+
from .exceptions import FieldInstanceResolutionError
|
19
|
+
from .warnings import RemovedInMarshmallow4Warning
|
20
|
+
|
21
|
+
EXCLUDE = "exclude"
|
22
|
+
INCLUDE = "include"
|
23
|
+
RAISE = "raise"
|
24
|
+
_UNKNOWN_VALUES = {EXCLUDE, INCLUDE, RAISE}
|
25
|
+
|
26
|
+
|
27
|
+
class _Missing:
|
28
|
+
def __bool__(self):
|
29
|
+
return False
|
30
|
+
|
31
|
+
def __copy__(self):
|
32
|
+
return self
|
33
|
+
|
34
|
+
def __deepcopy__(self, _):
|
35
|
+
return self
|
36
|
+
|
37
|
+
def __repr__(self):
|
38
|
+
return "<marshmallow.missing>"
|
39
|
+
|
40
|
+
|
41
|
+
# Singleton value that indicates that a field's value is missing from input
|
42
|
+
# dict passed to :meth:`Schema.load`. If the field's value is not required,
|
43
|
+
# it's ``default`` value is used.
|
44
|
+
missing = _Missing()
|
45
|
+
|
46
|
+
|
47
|
+
def is_generator(obj) -> bool:
|
48
|
+
"""Return True if ``obj`` is a generator"""
|
49
|
+
return inspect.isgeneratorfunction(obj) or inspect.isgenerator(obj)
|
50
|
+
|
51
|
+
|
52
|
+
def is_iterable_but_not_string(obj) -> bool:
|
53
|
+
"""Return True if ``obj`` is an iterable object that isn't a string."""
|
54
|
+
return (hasattr(obj, "__iter__") and not hasattr(obj, "strip")) or is_generator(obj)
|
55
|
+
|
56
|
+
|
57
|
+
def is_collection(obj) -> bool:
|
58
|
+
"""Return True if ``obj`` is a collection type, e.g list, tuple, queryset."""
|
59
|
+
return is_iterable_but_not_string(obj) and not isinstance(obj, Mapping)
|
60
|
+
|
61
|
+
|
62
|
+
def is_instance_or_subclass(val, class_) -> bool:
|
63
|
+
"""Return True if ``val`` is either a subclass or instance of ``class_``."""
|
64
|
+
try:
|
65
|
+
return issubclass(val, class_)
|
66
|
+
except TypeError:
|
67
|
+
return isinstance(val, class_)
|
68
|
+
|
69
|
+
|
70
|
+
def is_keyed_tuple(obj) -> bool:
|
71
|
+
"""Return True if ``obj`` has keyed tuple behavior, such as
|
72
|
+
namedtuples or SQLAlchemy's KeyedTuples.
|
73
|
+
"""
|
74
|
+
return isinstance(obj, tuple) and hasattr(obj, "_fields")
|
75
|
+
|
76
|
+
|
77
|
+
def pprint(obj, *args, **kwargs) -> None:
|
78
|
+
"""Pretty-printing function that can pretty-print OrderedDicts
|
79
|
+
like regular dictionaries. Useful for printing the output of
|
80
|
+
:meth:`marshmallow.Schema.dump`.
|
81
|
+
|
82
|
+
.. deprecated:: 3.7.0
|
83
|
+
marshmallow.pprint will be removed in marshmallow 4.
|
84
|
+
"""
|
85
|
+
warnings.warn(
|
86
|
+
"marshmallow's pprint function is deprecated and will be removed in marshmallow 4.",
|
87
|
+
RemovedInMarshmallow4Warning,
|
88
|
+
stacklevel=2,
|
89
|
+
)
|
90
|
+
if isinstance(obj, collections.OrderedDict):
|
91
|
+
print(json.dumps(obj, *args, **kwargs))
|
92
|
+
else:
|
93
|
+
py_pprint(obj, *args, **kwargs)
|
94
|
+
|
95
|
+
|
96
|
+
# https://stackoverflow.com/a/27596917
|
97
|
+
def is_aware(datetime: dt.datetime) -> bool:
|
98
|
+
return (
|
99
|
+
datetime.tzinfo is not None and datetime.tzinfo.utcoffset(datetime) is not None
|
100
|
+
)
|
101
|
+
|
102
|
+
|
103
|
+
def from_rfc(datestring: str) -> dt.datetime:
|
104
|
+
"""Parse a RFC822-formatted datetime string and return a datetime object.
|
105
|
+
|
106
|
+
https://stackoverflow.com/questions/885015/how-to-parse-a-rfc-2822-date-time-into-a-python-datetime # noqa: B950
|
107
|
+
"""
|
108
|
+
return parsedate_to_datetime(datestring)
|
109
|
+
|
110
|
+
|
111
|
+
def rfcformat(datetime: dt.datetime) -> str:
|
112
|
+
"""Return the RFC822-formatted representation of a datetime object.
|
113
|
+
|
114
|
+
:param datetime datetime: The datetime.
|
115
|
+
"""
|
116
|
+
return format_datetime(datetime)
|
117
|
+
|
118
|
+
|
119
|
+
# Hat tip to Django for ISO8601 deserialization functions
|
120
|
+
|
121
|
+
_iso8601_datetime_re = re.compile(
|
122
|
+
r"(?P<year>\d{4})-(?P<month>\d{1,2})-(?P<day>\d{1,2})"
|
123
|
+
r"[T ](?P<hour>\d{1,2}):(?P<minute>\d{1,2})"
|
124
|
+
r"(?::(?P<second>\d{1,2})(?:\.(?P<microsecond>\d{1,6})\d{0,6})?)?"
|
125
|
+
r"(?P<tzinfo>Z|[+-]\d{2}(?::?\d{2})?)?$"
|
126
|
+
)
|
127
|
+
|
128
|
+
_iso8601_date_re = re.compile(r"(?P<year>\d{4})-(?P<month>\d{1,2})-(?P<day>\d{1,2})$")
|
129
|
+
|
130
|
+
_iso8601_time_re = re.compile(
|
131
|
+
r"(?P<hour>\d{1,2}):(?P<minute>\d{1,2})"
|
132
|
+
r"(?::(?P<second>\d{1,2})(?:\.(?P<microsecond>\d{1,6})\d{0,6})?)?"
|
133
|
+
)
|
134
|
+
|
135
|
+
|
136
|
+
def get_fixed_timezone(offset: int | float | dt.timedelta) -> dt.timezone:
|
137
|
+
"""Return a tzinfo instance with a fixed offset from UTC."""
|
138
|
+
if isinstance(offset, dt.timedelta):
|
139
|
+
offset = offset.total_seconds() // 60
|
140
|
+
sign = "-" if offset < 0 else "+"
|
141
|
+
hhmm = "%02d%02d" % divmod(abs(offset), 60)
|
142
|
+
name = sign + hhmm
|
143
|
+
return dt.timezone(dt.timedelta(minutes=offset), name)
|
144
|
+
|
145
|
+
|
146
|
+
def from_iso_datetime(value):
|
147
|
+
"""Parse a string and return a datetime.datetime.
|
148
|
+
|
149
|
+
This function supports time zone offsets. When the input contains one,
|
150
|
+
the output uses a timezone with a fixed offset from UTC.
|
151
|
+
"""
|
152
|
+
match = _iso8601_datetime_re.match(value)
|
153
|
+
if not match:
|
154
|
+
raise ValueError("Not a valid ISO8601-formatted datetime string")
|
155
|
+
kw = match.groupdict()
|
156
|
+
kw["microsecond"] = kw["microsecond"] and kw["microsecond"].ljust(6, "0")
|
157
|
+
tzinfo = kw.pop("tzinfo")
|
158
|
+
if tzinfo == "Z":
|
159
|
+
tzinfo = dt.timezone.utc
|
160
|
+
elif tzinfo is not None:
|
161
|
+
offset_mins = int(tzinfo[-2:]) if len(tzinfo) > 3 else 0
|
162
|
+
offset = 60 * int(tzinfo[1:3]) + offset_mins
|
163
|
+
if tzinfo[0] == "-":
|
164
|
+
offset = -offset
|
165
|
+
tzinfo = get_fixed_timezone(offset)
|
166
|
+
kw = {k: int(v) for k, v in kw.items() if v is not None}
|
167
|
+
kw["tzinfo"] = tzinfo
|
168
|
+
return dt.datetime(**kw)
|
169
|
+
|
170
|
+
|
171
|
+
def from_iso_time(value):
|
172
|
+
"""Parse a string and return a datetime.time.
|
173
|
+
|
174
|
+
This function doesn't support time zone offsets.
|
175
|
+
"""
|
176
|
+
match = _iso8601_time_re.match(value)
|
177
|
+
if not match:
|
178
|
+
raise ValueError("Not a valid ISO8601-formatted time string")
|
179
|
+
kw = match.groupdict()
|
180
|
+
kw["microsecond"] = kw["microsecond"] and kw["microsecond"].ljust(6, "0")
|
181
|
+
kw = {k: int(v) for k, v in kw.items() if v is not None}
|
182
|
+
return dt.time(**kw)
|
183
|
+
|
184
|
+
|
185
|
+
def from_iso_date(value):
|
186
|
+
"""Parse a string and return a datetime.date."""
|
187
|
+
match = _iso8601_date_re.match(value)
|
188
|
+
if not match:
|
189
|
+
raise ValueError("Not a valid ISO8601-formatted date string")
|
190
|
+
kw = {k: int(v) for k, v in match.groupdict().items()}
|
191
|
+
return dt.date(**kw)
|
192
|
+
|
193
|
+
|
194
|
+
def from_timestamp(value: typing.Any) -> dt.datetime:
|
195
|
+
if value is True or value is False:
|
196
|
+
raise ValueError("Not a valid POSIX timestamp")
|
197
|
+
value = float(value)
|
198
|
+
if value < 0:
|
199
|
+
raise ValueError("Not a valid POSIX timestamp")
|
200
|
+
|
201
|
+
# Load a timestamp with utc as timezone to prevent using system timezone.
|
202
|
+
# Then set timezone to None, to let the Field handle adding timezone info.
|
203
|
+
try:
|
204
|
+
return dt.datetime.fromtimestamp(value, tz=dt.timezone.utc).replace(tzinfo=None)
|
205
|
+
except OverflowError as exc:
|
206
|
+
raise ValueError("Timestamp is too large") from exc
|
207
|
+
except OSError as exc:
|
208
|
+
raise ValueError("Error converting value to datetime") from exc
|
209
|
+
|
210
|
+
|
211
|
+
def from_timestamp_ms(value: typing.Any) -> dt.datetime:
|
212
|
+
value = float(value)
|
213
|
+
return from_timestamp(value / 1000)
|
214
|
+
|
215
|
+
|
216
|
+
def timestamp(
|
217
|
+
value: dt.datetime,
|
218
|
+
) -> float:
|
219
|
+
if not is_aware(value):
|
220
|
+
# When a date is naive, use UTC as zone info to prevent using system timezone.
|
221
|
+
value = value.replace(tzinfo=dt.timezone.utc)
|
222
|
+
return value.timestamp()
|
223
|
+
|
224
|
+
|
225
|
+
def timestamp_ms(value: dt.datetime) -> float:
|
226
|
+
return timestamp(value) * 1000
|
227
|
+
|
228
|
+
|
229
|
+
def isoformat(datetime: dt.datetime) -> str:
|
230
|
+
"""Return the ISO8601-formatted representation of a datetime object.
|
231
|
+
|
232
|
+
:param datetime datetime: The datetime.
|
233
|
+
"""
|
234
|
+
return datetime.isoformat()
|
235
|
+
|
236
|
+
|
237
|
+
def to_iso_time(time: dt.time) -> str:
|
238
|
+
return dt.time.isoformat(time)
|
239
|
+
|
240
|
+
|
241
|
+
def to_iso_date(date: dt.date) -> str:
|
242
|
+
return dt.date.isoformat(date)
|
243
|
+
|
244
|
+
|
245
|
+
def ensure_text_type(val: str | bytes) -> str:
|
246
|
+
if isinstance(val, bytes):
|
247
|
+
val = val.decode("utf-8")
|
248
|
+
return str(val)
|
249
|
+
|
250
|
+
|
251
|
+
def pluck(dictlist: list[dict[str, typing.Any]], key: str):
|
252
|
+
"""Extracts a list of dictionary values from a list of dictionaries.
|
253
|
+
::
|
254
|
+
|
255
|
+
>>> dlist = [{'id': 1, 'name': 'foo'}, {'id': 2, 'name': 'bar'}]
|
256
|
+
>>> pluck(dlist, 'id')
|
257
|
+
[1, 2]
|
258
|
+
"""
|
259
|
+
return [d[key] for d in dictlist]
|
260
|
+
|
261
|
+
|
262
|
+
# Various utilities for pulling keyed values from objects
|
263
|
+
|
264
|
+
|
265
|
+
def get_value(obj, key: int | str, default=missing):
|
266
|
+
"""Helper for pulling a keyed value off various types of objects. Fields use
|
267
|
+
this method by default to access attributes of the source object. For object `x`
|
268
|
+
and attribute `i`, this method first tries to access `x[i]`, and then falls back to
|
269
|
+
`x.i` if an exception is raised.
|
270
|
+
|
271
|
+
.. warning::
|
272
|
+
If an object `x` does not raise an exception when `x[i]` does not exist,
|
273
|
+
`get_value` will never check the value `x.i`. Consider overriding
|
274
|
+
`marshmallow.fields.Field.get_value` in this case.
|
275
|
+
"""
|
276
|
+
if not isinstance(key, int) and "." in key:
|
277
|
+
return _get_value_for_keys(obj, key.split("."), default)
|
278
|
+
else:
|
279
|
+
return _get_value_for_key(obj, key, default)
|
280
|
+
|
281
|
+
|
282
|
+
def _get_value_for_keys(obj, keys, default):
|
283
|
+
if len(keys) == 1:
|
284
|
+
return _get_value_for_key(obj, keys[0], default)
|
285
|
+
else:
|
286
|
+
return _get_value_for_keys(
|
287
|
+
_get_value_for_key(obj, keys[0], default), keys[1:], default
|
288
|
+
)
|
289
|
+
|
290
|
+
|
291
|
+
def _get_value_for_key(obj, key, default):
|
292
|
+
if not hasattr(obj, "__getitem__"):
|
293
|
+
return getattr(obj, key, default)
|
294
|
+
|
295
|
+
try:
|
296
|
+
return obj[key]
|
297
|
+
except (KeyError, IndexError, TypeError, AttributeError):
|
298
|
+
return getattr(obj, key, default)
|
299
|
+
|
300
|
+
|
301
|
+
def set_value(dct: dict[str, typing.Any], key: str, value: typing.Any):
|
302
|
+
"""Set a value in a dict. If `key` contains a '.', it is assumed
|
303
|
+
be a path (i.e. dot-delimited string) to the value's location.
|
304
|
+
|
305
|
+
::
|
306
|
+
|
307
|
+
>>> d = {}
|
308
|
+
>>> set_value(d, 'foo.bar', 42)
|
309
|
+
>>> d
|
310
|
+
{'foo': {'bar': 42}}
|
311
|
+
"""
|
312
|
+
if "." in key:
|
313
|
+
head, rest = key.split(".", 1)
|
314
|
+
target = dct.setdefault(head, {})
|
315
|
+
if not isinstance(target, dict):
|
316
|
+
raise ValueError(
|
317
|
+
f"Cannot set {key} in {head} " f"due to existing value: {target}"
|
318
|
+
)
|
319
|
+
set_value(target, rest, value)
|
320
|
+
else:
|
321
|
+
dct[key] = value
|
322
|
+
|
323
|
+
|
324
|
+
def callable_or_raise(obj):
|
325
|
+
"""Check that an object is callable, else raise a :exc:`TypeError`."""
|
326
|
+
if not callable(obj):
|
327
|
+
raise TypeError(f"Object {obj!r} is not callable.")
|
328
|
+
return obj
|
329
|
+
|
330
|
+
|
331
|
+
def _signature(func: typing.Callable) -> list[str]:
|
332
|
+
return list(inspect.signature(func).parameters.keys())
|
333
|
+
|
334
|
+
|
335
|
+
def get_func_args(func: typing.Callable) -> list[str]:
|
336
|
+
"""Given a callable, return a list of argument names. Handles
|
337
|
+
`functools.partial` objects and class-based callables.
|
338
|
+
|
339
|
+
.. versionchanged:: 3.0.0a1
|
340
|
+
Do not return bound arguments, eg. ``self``.
|
341
|
+
"""
|
342
|
+
if inspect.isfunction(func) or inspect.ismethod(func):
|
343
|
+
return _signature(func)
|
344
|
+
if isinstance(func, functools.partial):
|
345
|
+
return _signature(func.func)
|
346
|
+
# Callable class
|
347
|
+
return _signature(func)
|
348
|
+
|
349
|
+
|
350
|
+
def resolve_field_instance(cls_or_instance):
|
351
|
+
"""Return a Schema instance from a Schema class or instance.
|
352
|
+
|
353
|
+
:param type|Schema cls_or_instance: Marshmallow Schema class or instance.
|
354
|
+
"""
|
355
|
+
if isinstance(cls_or_instance, type):
|
356
|
+
if not issubclass(cls_or_instance, FieldABC):
|
357
|
+
raise FieldInstanceResolutionError
|
358
|
+
return cls_or_instance()
|
359
|
+
else:
|
360
|
+
if not isinstance(cls_or_instance, FieldABC):
|
361
|
+
raise FieldInstanceResolutionError
|
362
|
+
return cls_or_instance
|
363
|
+
|
364
|
+
|
365
|
+
def timedelta_to_microseconds(value: dt.timedelta) -> int:
|
366
|
+
"""Compute the total microseconds of a timedelta
|
367
|
+
|
368
|
+
https://github.com/python/cpython/blob/bb3e0c240bc60fe08d332ff5955d54197f79751c/Lib/datetime.py#L665-L667 # noqa: B950
|
369
|
+
"""
|
370
|
+
return (value.days * (24 * 3600) + value.seconds) * 1000000 + value.microseconds
|
371
|
+
|
372
|
+
|
373
|
+
def validate_unknown_parameter_value(obj: typing.Any) -> str:
|
374
|
+
if obj not in _UNKNOWN_VALUES:
|
375
|
+
raise ValueError(
|
376
|
+
f"Object {obj!r} is not a valid value for the 'unknown' parameter"
|
377
|
+
)
|
378
|
+
return obj
|