ccxt 4.2.77__py2.py3-none-any.whl → 4.4.48__py2.py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ccxt/__init__.py +36 -14
- ccxt/abstract/alpaca.py +4 -0
- ccxt/abstract/bigone.py +1 -1
- ccxt/abstract/binance.py +112 -48
- ccxt/abstract/binancecoinm.py +112 -48
- ccxt/abstract/binanceus.py +147 -83
- ccxt/abstract/binanceusdm.py +112 -48
- ccxt/abstract/bingx.py +133 -78
- ccxt/abstract/bitbank.py +5 -0
- ccxt/abstract/bitfinex.py +136 -65
- ccxt/abstract/bitfinex1.py +69 -0
- ccxt/abstract/bitflyer.py +1 -0
- ccxt/abstract/bitget.py +8 -1
- ccxt/abstract/bitmart.py +13 -1
- ccxt/abstract/bitopro.py +1 -0
- ccxt/abstract/bitpanda.py +0 -12
- ccxt/abstract/bitrue.py +3 -3
- ccxt/abstract/bitstamp.py +26 -3
- ccxt/abstract/blofin.py +24 -0
- ccxt/abstract/btcbox.py +1 -0
- ccxt/abstract/bybit.py +29 -14
- ccxt/abstract/cex.py +28 -29
- ccxt/abstract/coinbase.py +6 -0
- ccxt/abstract/coinbaseadvanced.py +94 -0
- ccxt/abstract/{coinbasepro.py → coinbaseexchange.py} +1 -0
- ccxt/abstract/coinbaseinternational.py +1 -1
- ccxt/abstract/coincatch.py +94 -0
- ccxt/abstract/coinex.py +233 -123
- ccxt/abstract/coinmetro.py +1 -0
- ccxt/abstract/cryptocom.py +14 -0
- ccxt/abstract/defx.py +69 -0
- ccxt/abstract/deribit.py +1 -0
- ccxt/abstract/digifinex.py +1 -0
- ccxt/abstract/ellipx.py +25 -0
- ccxt/abstract/gate.py +20 -0
- ccxt/abstract/gateio.py +20 -0
- ccxt/abstract/gemini.py +1 -0
- ccxt/abstract/hashkey.py +67 -0
- ccxt/abstract/hyperliquid.py +1 -1
- ccxt/abstract/independentreserve.py +6 -0
- ccxt/abstract/kraken.py +4 -3
- ccxt/abstract/krakenfutures.py +4 -0
- ccxt/abstract/kucoin.py +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 +3104 -880
- 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 +1513 -563
- 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 +206 -89
- ccxt/async_support/coinspot.py +137 -62
- ccxt/async_support/cryptocom.py +515 -185
- ccxt/async_support/currencycom.py +203 -85
- ccxt/async_support/defx.py +2066 -0
- ccxt/async_support/delta.py +404 -109
- ccxt/async_support/deribit.py +557 -323
- ccxt/async_support/digifinex.py +340 -223
- ccxt/async_support/ellipx.py +1826 -0
- ccxt/async_support/exmo.py +259 -128
- ccxt/async_support/gate.py +1472 -463
- ccxt/async_support/gemini.py +206 -84
- ccxt/async_support/hashkey.py +4164 -0
- ccxt/async_support/hitbtc.py +334 -178
- ccxt/async_support/hollaex.py +134 -83
- ccxt/async_support/htx.py +1095 -563
- ccxt/async_support/huobijp.py +105 -56
- ccxt/async_support/hyperliquid.py +1633 -268
- ccxt/async_support/idex.py +148 -95
- ccxt/async_support/independentreserve.py +236 -31
- ccxt/async_support/indodax.py +165 -62
- ccxt/async_support/kraken.py +871 -354
- ccxt/async_support/krakenfutures.py +324 -100
- ccxt/async_support/kucoin.py +917 -357
- ccxt/async_support/kucoinfutures.py +1004 -149
- ccxt/async_support/kuna.py +138 -106
- ccxt/async_support/latoken.py +135 -79
- ccxt/async_support/lbank.py +290 -113
- ccxt/async_support/luno.py +112 -62
- ccxt/async_support/lykke.py +104 -55
- ccxt/async_support/mercado.py +36 -29
- ccxt/async_support/mexc.py +995 -429
- ccxt/async_support/myokx.py +43 -0
- ccxt/async_support/ndax.py +163 -82
- ccxt/async_support/novadax.py +121 -75
- ccxt/async_support/oceanex.py +175 -59
- ccxt/async_support/okcoin.py +222 -163
- ccxt/async_support/okx.py +1776 -454
- ccxt/async_support/onetrading.py +132 -414
- ccxt/async_support/oxfun.py +2832 -0
- ccxt/async_support/p2b.py +79 -51
- ccxt/async_support/paradex.py +2017 -0
- ccxt/async_support/paymium.py +56 -32
- ccxt/async_support/phemex.py +572 -196
- ccxt/async_support/poloniex.py +218 -95
- ccxt/async_support/poloniexfutures.py +260 -92
- ccxt/async_support/probit.py +143 -110
- ccxt/async_support/timex.py +123 -70
- ccxt/async_support/tokocrypto.py +129 -93
- ccxt/async_support/tradeogre.py +39 -25
- ccxt/async_support/upbit.py +322 -113
- ccxt/async_support/vertex.py +2983 -0
- ccxt/async_support/wavesexchange.py +227 -173
- ccxt/async_support/wazirx.py +145 -65
- ccxt/async_support/whitebit.py +533 -138
- ccxt/async_support/woo.py +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 +3104 -880
- 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 +1513 -563
- 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 +206 -89
- ccxt/coinspot.py +137 -62
- ccxt/cryptocom.py +515 -185
- ccxt/currencycom.py +203 -85
- ccxt/defx.py +2065 -0
- ccxt/delta.py +404 -109
- ccxt/deribit.py +557 -323
- ccxt/digifinex.py +340 -223
- ccxt/ellipx.py +1826 -0
- ccxt/exmo.py +259 -128
- ccxt/gate.py +1472 -463
- ccxt/gemini.py +206 -84
- ccxt/hashkey.py +4164 -0
- ccxt/hitbtc.py +334 -178
- ccxt/hollaex.py +134 -83
- ccxt/htx.py +1095 -563
- ccxt/huobijp.py +105 -56
- ccxt/hyperliquid.py +1632 -268
- ccxt/idex.py +148 -95
- ccxt/independentreserve.py +235 -31
- ccxt/indodax.py +165 -62
- ccxt/kraken.py +871 -354
- ccxt/krakenfutures.py +324 -100
- ccxt/kucoin.py +917 -357
- ccxt/kucoinfutures.py +1004 -149
- ccxt/kuna.py +138 -106
- ccxt/latoken.py +135 -79
- ccxt/lbank.py +290 -113
- ccxt/luno.py +112 -62
- ccxt/lykke.py +104 -55
- ccxt/mercado.py +36 -29
- ccxt/mexc.py +994 -429
- ccxt/myokx.py +43 -0
- ccxt/ndax.py +163 -82
- ccxt/novadax.py +121 -75
- ccxt/oceanex.py +175 -59
- ccxt/okcoin.py +222 -163
- ccxt/okx.py +1776 -454
- ccxt/onetrading.py +132 -414
- ccxt/oxfun.py +2831 -0
- ccxt/p2b.py +79 -51
- ccxt/paradex.py +2017 -0
- ccxt/paymium.py +56 -32
- ccxt/phemex.py +572 -196
- ccxt/poloniex.py +218 -95
- ccxt/poloniexfutures.py +260 -92
- ccxt/pro/__init__.py +29 -5
- ccxt/pro/alpaca.py +32 -17
- ccxt/pro/ascendex.py +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 +138 -39
- ccxt/pro/bitmex.py +199 -40
- ccxt/pro/bitopro.py +25 -13
- ccxt/pro/bitrue.py +31 -32
- ccxt/pro/bitstamp.py +7 -6
- ccxt/pro/bitvavo.py +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.48.dist-info/LICENSE.txt +21 -0
- ccxt-4.4.48.dist-info/METADATA +646 -0
- ccxt-4.4.48.dist-info/RECORD +669 -0
- {ccxt-4.2.77.dist-info → ccxt-4.4.48.dist-info}/WHEEL +1 -1
- ccxt/abstract/bitbay.py +0 -47
- ccxt/abstract/bitfinex2.py +0 -139
- ccxt/abstract/hitbtc3.py +0 -115
- ccxt/async_support/bitbay.py +0 -17
- ccxt/async_support/bitfinex2.py +0 -3496
- ccxt/async_support/flowbtc.py +0 -34
- ccxt/bitbay.py +0 -17
- ccxt/bitfinex2.py +0 -3496
- ccxt/flowbtc.py +0 -34
- ccxt/hitbtc3.py +0 -16
- ccxt/pro/bitfinex2.py +0 -1081
- ccxt/test/base/__init__.py +0 -28
- ccxt/test/base/test_account.py +0 -26
- ccxt/test/base/test_balance.py +0 -56
- ccxt/test/base/test_borrow_interest.py +0 -35
- ccxt/test/base/test_borrow_rate.py +0 -32
- ccxt/test/base/test_calculate_fee.py +0 -51
- ccxt/test/base/test_crypto.py +0 -127
- ccxt/test/base/test_currency.py +0 -76
- ccxt/test/base/test_datetime.py +0 -103
- ccxt/test/base/test_decimal_to_precision.py +0 -392
- ccxt/test/base/test_deep_extend.py +0 -68
- ccxt/test/base/test_deposit_withdrawal.py +0 -50
- ccxt/test/base/test_exchange_datetime_functions.py +0 -76
- ccxt/test/base/test_funding_rate_history.py +0 -29
- ccxt/test/base/test_last_price.py +0 -32
- ccxt/test/base/test_ledger_entry.py +0 -45
- ccxt/test/base/test_ledger_item.py +0 -48
- ccxt/test/base/test_leverage_tier.py +0 -33
- ccxt/test/base/test_margin_mode.py +0 -24
- ccxt/test/base/test_margin_modification.py +0 -35
- ccxt/test/base/test_market.py +0 -190
- ccxt/test/base/test_number.py +0 -411
- ccxt/test/base/test_ohlcv.py +0 -32
- ccxt/test/base/test_open_interest.py +0 -32
- ccxt/test/base/test_order.py +0 -64
- ccxt/test/base/test_order_book.py +0 -63
- ccxt/test/base/test_position.py +0 -60
- ccxt/test/base/test_shared_methods.py +0 -345
- ccxt/test/base/test_status.py +0 -24
- ccxt/test/base/test_throttle.py +0 -126
- ccxt/test/base/test_ticker.py +0 -86
- ccxt/test/base/test_trade.py +0 -47
- ccxt/test/base/test_trading_fee.py +0 -26
- ccxt/test/base/test_transaction.py +0 -39
- ccxt-4.2.77.dist-info/METADATA +0 -626
- ccxt-4.2.77.dist-info/RECORD +0 -534
- {ccxt-4.2.77.dist-info → ccxt-4.4.48.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,51 @@
|
|
1
|
+
import typing
|
2
|
+
|
3
|
+
import marshmallow
|
4
|
+
|
5
|
+
|
6
|
+
class Sequence(marshmallow.fields.List):
|
7
|
+
"""
|
8
|
+
A sequence field, basically an immutable version of the list field.
|
9
|
+
"""
|
10
|
+
|
11
|
+
def _deserialize( # type: ignore[override]
|
12
|
+
self,
|
13
|
+
value: typing.Any,
|
14
|
+
attr: typing.Any,
|
15
|
+
data: typing.Any,
|
16
|
+
**kwargs: typing.Any,
|
17
|
+
) -> typing.Optional[typing.Sequence[typing.Any]]:
|
18
|
+
optional_list = super()._deserialize(value, attr, data, **kwargs)
|
19
|
+
return None if optional_list is None else tuple(optional_list)
|
20
|
+
|
21
|
+
|
22
|
+
class Set(marshmallow.fields.List):
|
23
|
+
"""
|
24
|
+
A set field. A set is an unordered/mutable collection of unique elements, same for frozenset
|
25
|
+
except it's immutable.
|
26
|
+
|
27
|
+
Notes:
|
28
|
+
Beware the a Set guarantees uniqueness in the resulting list but in return the item's order
|
29
|
+
will be random. So if the order matters, use a List or Sequence !
|
30
|
+
"""
|
31
|
+
|
32
|
+
def __init__(
|
33
|
+
self,
|
34
|
+
cls_or_instance: typing.Union[marshmallow.fields.Field, type],
|
35
|
+
frozen: bool = False,
|
36
|
+
**kwargs,
|
37
|
+
):
|
38
|
+
super().__init__(cls_or_instance, **kwargs)
|
39
|
+
self.set_type: typing.Type[typing.Union[frozenset, set]] = (
|
40
|
+
frozenset if frozen else set
|
41
|
+
)
|
42
|
+
|
43
|
+
def _deserialize( # type: ignore[override]
|
44
|
+
self,
|
45
|
+
value: typing.Any,
|
46
|
+
attr: typing.Any,
|
47
|
+
data: typing.Any,
|
48
|
+
**kwargs: typing.Any,
|
49
|
+
) -> typing.Union[typing.Set[typing.Any], typing.FrozenSet[typing.Any], None]:
|
50
|
+
optional_list = super()._deserialize(value, attr, data, **kwargs)
|
51
|
+
return None if optional_list is None else self.set_type(optional_list)
|
@@ -0,0 +1,45 @@
|
|
1
|
+
from typing import Any, Callable, Optional
|
2
|
+
|
3
|
+
|
4
|
+
__all__ = ("lazy_class_attribute",)
|
5
|
+
|
6
|
+
|
7
|
+
class LazyClassAttribute:
|
8
|
+
"""Descriptor decorator implementing a class-level, read-only
|
9
|
+
property, which caches its results on the class(es) on which it
|
10
|
+
operates.
|
11
|
+
"""
|
12
|
+
|
13
|
+
__slots__ = ("func", "name", "called", "forward_value")
|
14
|
+
|
15
|
+
def __init__(
|
16
|
+
self,
|
17
|
+
func: Callable[..., Any],
|
18
|
+
name: Optional[str] = None,
|
19
|
+
forward_value: Any = None,
|
20
|
+
):
|
21
|
+
self.func = func
|
22
|
+
self.name = name
|
23
|
+
self.called = False
|
24
|
+
self.forward_value = forward_value
|
25
|
+
|
26
|
+
def __get__(self, instance, cls=None):
|
27
|
+
if not cls:
|
28
|
+
cls = type(instance)
|
29
|
+
|
30
|
+
# avoid recursion
|
31
|
+
if self.called:
|
32
|
+
return self.forward_value
|
33
|
+
|
34
|
+
self.called = True
|
35
|
+
|
36
|
+
setattr(cls, self.name, self.func())
|
37
|
+
|
38
|
+
# "getattr" is used to handle bounded methods
|
39
|
+
return getattr(cls, self.name)
|
40
|
+
|
41
|
+
def __set_name__(self, owner, name):
|
42
|
+
self.name = self.name or name
|
43
|
+
|
44
|
+
|
45
|
+
lazy_class_attribute = LazyClassAttribute
|
@@ -0,0 +1,71 @@
|
|
1
|
+
import inspect
|
2
|
+
from typing import Callable, Optional, Type
|
3
|
+
|
4
|
+
from mypy import nodes
|
5
|
+
from mypy.plugin import DynamicClassDefContext, Plugin
|
6
|
+
from mypy.plugins import dataclasses
|
7
|
+
|
8
|
+
import marshmallow_dataclass
|
9
|
+
|
10
|
+
_NEW_TYPE_SIG = inspect.signature(marshmallow_dataclass.NewType)
|
11
|
+
|
12
|
+
|
13
|
+
def plugin(version: str) -> Type[Plugin]:
|
14
|
+
return MarshmallowDataclassPlugin
|
15
|
+
|
16
|
+
|
17
|
+
class MarshmallowDataclassPlugin(Plugin):
|
18
|
+
def get_dynamic_class_hook(
|
19
|
+
self, fullname: str
|
20
|
+
) -> Optional[Callable[[DynamicClassDefContext], None]]:
|
21
|
+
if fullname == "marshmallow_dataclass.NewType":
|
22
|
+
return new_type_hook
|
23
|
+
return None
|
24
|
+
|
25
|
+
def get_class_decorator_hook(self, fullname: str):
|
26
|
+
if fullname == "marshmallow_dataclass.dataclass":
|
27
|
+
return dataclasses.dataclass_class_maker_callback
|
28
|
+
return None
|
29
|
+
|
30
|
+
|
31
|
+
def new_type_hook(ctx: DynamicClassDefContext) -> None:
|
32
|
+
"""
|
33
|
+
Dynamic class hook for :func:`marshmallow_dataclass.NewType`.
|
34
|
+
|
35
|
+
Uses the type of the ``typ`` argument.
|
36
|
+
"""
|
37
|
+
typ = _get_arg_by_name(ctx.call, "typ", _NEW_TYPE_SIG)
|
38
|
+
if not isinstance(typ, nodes.RefExpr):
|
39
|
+
return
|
40
|
+
info = typ.node
|
41
|
+
if not isinstance(info, nodes.TypeInfo):
|
42
|
+
return
|
43
|
+
ctx.api.add_symbol_table_node(ctx.name, nodes.SymbolTableNode(nodes.GDEF, info))
|
44
|
+
|
45
|
+
|
46
|
+
def _get_arg_by_name(
|
47
|
+
call: nodes.CallExpr, name: str, sig: inspect.Signature
|
48
|
+
) -> Optional[nodes.Expression]:
|
49
|
+
"""
|
50
|
+
Get value of argument from a call.
|
51
|
+
|
52
|
+
:return: The argument value, or ``None`` if it cannot be found.
|
53
|
+
|
54
|
+
.. warning::
|
55
|
+
This probably doesn't yet work for calls with ``*args`` and/or ``*kwargs``.
|
56
|
+
"""
|
57
|
+
args = []
|
58
|
+
kwargs = {}
|
59
|
+
for arg_name, arg_value in zip(call.arg_names, call.args):
|
60
|
+
if arg_name is None:
|
61
|
+
args.append(arg_value)
|
62
|
+
else:
|
63
|
+
kwargs[arg_name] = arg_value
|
64
|
+
try:
|
65
|
+
bound_args = sig.bind(*args, **kwargs)
|
66
|
+
except TypeError:
|
67
|
+
return None
|
68
|
+
try:
|
69
|
+
return bound_args.arguments[name]
|
70
|
+
except KeyError:
|
71
|
+
return None
|
File without changes
|
@@ -0,0 +1,14 @@
|
|
1
|
+
import sys
|
2
|
+
|
3
|
+
import marshmallow.fields
|
4
|
+
|
5
|
+
if sys.version_info >= (3, 9):
|
6
|
+
from typing import Annotated
|
7
|
+
else:
|
8
|
+
from typing_extensions import Annotated
|
9
|
+
|
10
|
+
Url = Annotated[str, marshmallow.fields.Url]
|
11
|
+
Email = Annotated[str, marshmallow.fields.Email]
|
12
|
+
|
13
|
+
# Aliases
|
14
|
+
URL = Url
|
@@ -0,0 +1,82 @@
|
|
1
|
+
import copy
|
2
|
+
import inspect
|
3
|
+
from typing import List, Tuple, Any, Optional
|
4
|
+
|
5
|
+
import typeguard
|
6
|
+
from marshmallow import fields, Schema, ValidationError
|
7
|
+
|
8
|
+
try:
|
9
|
+
from typeguard import TypeCheckError # type: ignore[attr-defined]
|
10
|
+
except ImportError:
|
11
|
+
# typeguard < 3
|
12
|
+
TypeCheckError = TypeError # type: ignore[misc, assignment]
|
13
|
+
|
14
|
+
if "argname" not in inspect.signature(typeguard.check_type).parameters:
|
15
|
+
|
16
|
+
def _check_type(value, expected_type, argname: str):
|
17
|
+
return typeguard.check_type(value=value, expected_type=expected_type)
|
18
|
+
|
19
|
+
else:
|
20
|
+
# typeguard < 3.0.0rc2
|
21
|
+
def _check_type(value, expected_type, argname: str):
|
22
|
+
return typeguard.check_type( # type: ignore[call-overload]
|
23
|
+
value=value, expected_type=expected_type, argname=argname
|
24
|
+
)
|
25
|
+
|
26
|
+
|
27
|
+
class Union(fields.Field):
|
28
|
+
"""A union field, composed other `Field` classes or instances.
|
29
|
+
This field serializes elements based on their type, with one of its child fields.
|
30
|
+
|
31
|
+
Example: ::
|
32
|
+
|
33
|
+
number_or_string = UnionField([
|
34
|
+
(float, fields.Float()),
|
35
|
+
(str, fields.Str())
|
36
|
+
])
|
37
|
+
|
38
|
+
:param union_fields: A list of types and their associated field instance.
|
39
|
+
:param kwargs: The same keyword arguments that :class:`Field` receives.
|
40
|
+
"""
|
41
|
+
|
42
|
+
def __init__(self, union_fields: List[Tuple[type, fields.Field]], **kwargs):
|
43
|
+
super().__init__(**kwargs)
|
44
|
+
self.union_fields = union_fields
|
45
|
+
|
46
|
+
def _bind_to_schema(self, field_name: str, schema: Schema) -> None:
|
47
|
+
super()._bind_to_schema(field_name, schema)
|
48
|
+
new_union_fields = []
|
49
|
+
for typ, field in self.union_fields:
|
50
|
+
field = copy.deepcopy(field)
|
51
|
+
field._bind_to_schema(field_name, self)
|
52
|
+
new_union_fields.append((typ, field))
|
53
|
+
|
54
|
+
self.union_fields = new_union_fields
|
55
|
+
|
56
|
+
def _serialize(self, value: Any, attr: Optional[str], obj, **kwargs) -> Any:
|
57
|
+
errors = []
|
58
|
+
if value is None:
|
59
|
+
return value
|
60
|
+
for typ, field in self.union_fields:
|
61
|
+
try:
|
62
|
+
_check_type(value=value, expected_type=typ, argname=attr or "anonymous")
|
63
|
+
return field._serialize(value, attr, obj, **kwargs)
|
64
|
+
except TypeCheckError as e:
|
65
|
+
errors.append(e)
|
66
|
+
raise TypeError(
|
67
|
+
f"Unable to serialize value with any of the fields in the union: {errors}"
|
68
|
+
)
|
69
|
+
|
70
|
+
def _deserialize(self, value: Any, attr: Optional[str], data, **kwargs) -> Any:
|
71
|
+
errors = []
|
72
|
+
for typ, field in self.union_fields:
|
73
|
+
try:
|
74
|
+
result = field.deserialize(value, **kwargs)
|
75
|
+
_check_type(
|
76
|
+
value=result, expected_type=typ, argname=attr or "anonymous"
|
77
|
+
)
|
78
|
+
return result
|
79
|
+
except (TypeCheckError, ValidationError) as e:
|
80
|
+
errors.append(e)
|
81
|
+
|
82
|
+
raise ValidationError(errors)
|
@@ -0,0 +1 @@
|
|
1
|
+
from .one_of_schema import OneOfSchema # noqa
|
@@ -0,0 +1,193 @@
|
|
1
|
+
import typing
|
2
|
+
|
3
|
+
from ..marshmallow import Schema, ValidationError
|
4
|
+
|
5
|
+
|
6
|
+
class OneOfSchema(Schema):
|
7
|
+
"""
|
8
|
+
This is a special kind of schema that actually multiplexes other schemas
|
9
|
+
based on object type. When serializing values, it uses get_obj_type() method
|
10
|
+
to get object type name. Then it uses `type_schemas` name-to-Schema mapping
|
11
|
+
to get schema for that particular object type, serializes object using that
|
12
|
+
schema and adds an extra "type" field with name of object type.
|
13
|
+
Deserialization is reverse.
|
14
|
+
|
15
|
+
Example:
|
16
|
+
|
17
|
+
class Foo(object):
|
18
|
+
def __init__(self, foo):
|
19
|
+
self.foo = foo
|
20
|
+
|
21
|
+
class Bar(object):
|
22
|
+
def __init__(self, bar):
|
23
|
+
self.bar = bar
|
24
|
+
|
25
|
+
class FooSchema(marshmallow.Schema):
|
26
|
+
foo = marshmallow.fields.String(required=True)
|
27
|
+
|
28
|
+
@marshmallow.post_load
|
29
|
+
def make_foo(self, data, **kwargs):
|
30
|
+
return Foo(**data)
|
31
|
+
|
32
|
+
class BarSchema(marshmallow.Schema):
|
33
|
+
bar = marshmallow.fields.Integer(required=True)
|
34
|
+
|
35
|
+
@marshmallow.post_load
|
36
|
+
def make_bar(self, data, **kwargs):
|
37
|
+
return Bar(**data)
|
38
|
+
|
39
|
+
class MyUberSchema(marshmallow.OneOfSchema):
|
40
|
+
type_schemas = {
|
41
|
+
'foo': FooSchema,
|
42
|
+
'bar': BarSchema,
|
43
|
+
}
|
44
|
+
|
45
|
+
def get_obj_type(self, obj):
|
46
|
+
if isinstance(obj, Foo):
|
47
|
+
return 'foo'
|
48
|
+
elif isinstance(obj, Bar):
|
49
|
+
return 'bar'
|
50
|
+
else:
|
51
|
+
raise Exception('Unknown object type: %s' % repr(obj))
|
52
|
+
|
53
|
+
MyUberSchema().dump([Foo(foo='hello'), Bar(bar=123)], many=True)
|
54
|
+
# => [{'type': 'foo', 'foo': 'hello'}, {'type': 'bar', 'bar': 123}]
|
55
|
+
|
56
|
+
You can control type field name added to serialized object representation by
|
57
|
+
setting `type_field` class property.
|
58
|
+
"""
|
59
|
+
|
60
|
+
type_field = "type"
|
61
|
+
type_field_remove = True
|
62
|
+
type_schemas: typing.Mapping[str, typing.Union[typing.Type[Schema], Schema]] = {}
|
63
|
+
|
64
|
+
def get_obj_type(self, obj):
|
65
|
+
"""Returns name of the schema during dump() calls, given the object
|
66
|
+
being dumped."""
|
67
|
+
return obj.__class__.__name__
|
68
|
+
|
69
|
+
def get_data_type(self, data):
|
70
|
+
"""Returns name of the schema during load() calls, given the data being
|
71
|
+
loaded. Defaults to looking up `type_field` in the data."""
|
72
|
+
data_type = data.get(self.type_field)
|
73
|
+
if self.type_field in data and self.type_field_remove:
|
74
|
+
data.pop(self.type_field)
|
75
|
+
return data_type
|
76
|
+
|
77
|
+
def dump(self, obj, *, many=None, **kwargs):
|
78
|
+
errors = {}
|
79
|
+
result_data = []
|
80
|
+
result_errors = {}
|
81
|
+
many = self.many if many is None else bool(many)
|
82
|
+
if not many:
|
83
|
+
result = result_data = self._dump(obj, **kwargs)
|
84
|
+
else:
|
85
|
+
for idx, o in enumerate(obj):
|
86
|
+
try:
|
87
|
+
result = self._dump(o, **kwargs)
|
88
|
+
result_data.append(result)
|
89
|
+
except ValidationError as error:
|
90
|
+
result_errors[idx] = error.normalized_messages()
|
91
|
+
result_data.append(error.valid_data)
|
92
|
+
|
93
|
+
result = result_data
|
94
|
+
errors = result_errors
|
95
|
+
|
96
|
+
if not errors:
|
97
|
+
return result
|
98
|
+
else:
|
99
|
+
exc = ValidationError(errors, data=obj, valid_data=result)
|
100
|
+
raise exc
|
101
|
+
|
102
|
+
def _dump(self, obj, *, update_fields=True, **kwargs):
|
103
|
+
obj_type = self.get_obj_type(obj)
|
104
|
+
if obj_type is None:
|
105
|
+
return (
|
106
|
+
None,
|
107
|
+
{"_schema": f"Unknown object class: {obj.__class__.__name__}"},
|
108
|
+
)
|
109
|
+
|
110
|
+
type_schema = self.type_schemas.get(obj_type)
|
111
|
+
if not type_schema:
|
112
|
+
return None, {"_schema": f"Unsupported object type: {obj_type}"}
|
113
|
+
|
114
|
+
schema = type_schema if isinstance(type_schema, Schema) else type_schema()
|
115
|
+
|
116
|
+
schema.context.update(getattr(self, "context", {}))
|
117
|
+
|
118
|
+
result = schema.dump(obj, many=False, **kwargs)
|
119
|
+
if result is not None:
|
120
|
+
result[self.type_field] = obj_type
|
121
|
+
return result
|
122
|
+
|
123
|
+
def load(self, data, *, many=None, partial=None, unknown=None, **kwargs):
|
124
|
+
errors = {}
|
125
|
+
result_data = []
|
126
|
+
result_errors = {}
|
127
|
+
many = self.many if many is None else bool(many)
|
128
|
+
if partial is None:
|
129
|
+
partial = self.partial
|
130
|
+
if not many:
|
131
|
+
try:
|
132
|
+
result = result_data = self._load(
|
133
|
+
data, partial=partial, unknown=unknown, **kwargs
|
134
|
+
)
|
135
|
+
# result_data.append(result)
|
136
|
+
except ValidationError as error:
|
137
|
+
result_errors = error.normalized_messages()
|
138
|
+
result_data.append(error.valid_data)
|
139
|
+
else:
|
140
|
+
for idx, item in enumerate(data):
|
141
|
+
try:
|
142
|
+
result = self._load(item, partial=partial, **kwargs)
|
143
|
+
result_data.append(result)
|
144
|
+
except ValidationError as error:
|
145
|
+
result_errors[idx] = error.normalized_messages()
|
146
|
+
result_data.append(error.valid_data)
|
147
|
+
|
148
|
+
result = result_data
|
149
|
+
errors = result_errors
|
150
|
+
|
151
|
+
if not errors:
|
152
|
+
return result
|
153
|
+
else:
|
154
|
+
exc = ValidationError(errors, data=data, valid_data=result)
|
155
|
+
raise exc
|
156
|
+
|
157
|
+
def _load(self, data, *, partial=None, unknown=None, **kwargs):
|
158
|
+
if not isinstance(data, dict):
|
159
|
+
raise ValidationError({"_schema": f"Invalid data type: {data}"})
|
160
|
+
|
161
|
+
data = dict(data)
|
162
|
+
unknown = unknown or self.unknown
|
163
|
+
data_type = self.get_data_type(data)
|
164
|
+
|
165
|
+
if data_type is None:
|
166
|
+
raise ValidationError(
|
167
|
+
{self.type_field: ["Missing data for required field."]}
|
168
|
+
)
|
169
|
+
|
170
|
+
try:
|
171
|
+
type_schema = self.type_schemas.get(data_type)
|
172
|
+
except TypeError as error:
|
173
|
+
# data_type could be unhashable
|
174
|
+
raise ValidationError(
|
175
|
+
{self.type_field: [f"Invalid value: {data_type}"]}
|
176
|
+
) from error
|
177
|
+
if not type_schema:
|
178
|
+
raise ValidationError(
|
179
|
+
{self.type_field: [f"Unsupported value: {data_type}"]}
|
180
|
+
)
|
181
|
+
|
182
|
+
schema = type_schema if isinstance(type_schema, Schema) else type_schema()
|
183
|
+
|
184
|
+
schema.context.update(getattr(self, "context", {}))
|
185
|
+
|
186
|
+
return schema.load(data, many=False, partial=partial, unknown=unknown, **kwargs)
|
187
|
+
|
188
|
+
def validate(self, data, *, many=None, partial=None):
|
189
|
+
try:
|
190
|
+
self.load(data, many=many, partial=partial)
|
191
|
+
except ValidationError as ve:
|
192
|
+
return ve.messages
|
193
|
+
return {}
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,123 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
from abc import ABC
|
4
|
+
from collections import OrderedDict
|
5
|
+
from dataclasses import dataclass
|
6
|
+
from typing import List
|
7
|
+
|
8
|
+
|
9
|
+
class CairoType(ABC):
|
10
|
+
"""
|
11
|
+
Base type for all Cairo type representations. All types extend it.
|
12
|
+
"""
|
13
|
+
|
14
|
+
|
15
|
+
@dataclass
|
16
|
+
class FeltType(CairoType):
|
17
|
+
"""
|
18
|
+
Type representation of Cairo field element.
|
19
|
+
"""
|
20
|
+
|
21
|
+
|
22
|
+
@dataclass
|
23
|
+
class BoolType(CairoType):
|
24
|
+
"""
|
25
|
+
Type representation of Cairo boolean.
|
26
|
+
"""
|
27
|
+
|
28
|
+
|
29
|
+
@dataclass
|
30
|
+
class TupleType(CairoType):
|
31
|
+
"""
|
32
|
+
Type representation of Cairo tuples without named fields.
|
33
|
+
"""
|
34
|
+
|
35
|
+
types: List[CairoType] #: types of every tuple element.
|
36
|
+
|
37
|
+
|
38
|
+
@dataclass
|
39
|
+
class NamedTupleType(CairoType):
|
40
|
+
"""
|
41
|
+
Type representation of Cairo tuples with named fields.
|
42
|
+
"""
|
43
|
+
|
44
|
+
types: OrderedDict[str, CairoType] #: types of every tuple member.
|
45
|
+
|
46
|
+
|
47
|
+
@dataclass
|
48
|
+
class ArrayType(CairoType):
|
49
|
+
"""
|
50
|
+
Type representation of Cairo arrays.
|
51
|
+
"""
|
52
|
+
|
53
|
+
inner_type: CairoType #: type of element inside array.
|
54
|
+
|
55
|
+
|
56
|
+
@dataclass
|
57
|
+
class StructType(CairoType):
|
58
|
+
"""
|
59
|
+
Type representation of Cairo structures.
|
60
|
+
"""
|
61
|
+
|
62
|
+
name: str #: Structure name
|
63
|
+
# We need ordered dict, because it is important in serialization
|
64
|
+
types: OrderedDict[str, CairoType] #: types of every structure member.
|
65
|
+
|
66
|
+
|
67
|
+
@dataclass
|
68
|
+
class EnumType(CairoType):
|
69
|
+
"""
|
70
|
+
Type representation of Cairo enums.
|
71
|
+
"""
|
72
|
+
|
73
|
+
name: str
|
74
|
+
variants: OrderedDict[str, CairoType]
|
75
|
+
|
76
|
+
|
77
|
+
@dataclass
|
78
|
+
class OptionType(CairoType):
|
79
|
+
"""
|
80
|
+
Type representation of Cairo options.
|
81
|
+
"""
|
82
|
+
|
83
|
+
type: CairoType
|
84
|
+
|
85
|
+
|
86
|
+
@dataclass
|
87
|
+
class UintType(CairoType):
|
88
|
+
"""
|
89
|
+
Type representation of Cairo unsigned integers.
|
90
|
+
"""
|
91
|
+
|
92
|
+
bits: int
|
93
|
+
|
94
|
+
def check_range(self, value: int):
|
95
|
+
"""
|
96
|
+
Utility method checking if the `value` is in range.
|
97
|
+
"""
|
98
|
+
|
99
|
+
|
100
|
+
@dataclass
|
101
|
+
class TypeIdentifier(CairoType):
|
102
|
+
"""
|
103
|
+
Type representation of Cairo identifiers.
|
104
|
+
"""
|
105
|
+
|
106
|
+
name: str
|
107
|
+
|
108
|
+
|
109
|
+
@dataclass
|
110
|
+
class UnitType(CairoType):
|
111
|
+
"""
|
112
|
+
Type representation of Cairo unit `()`.
|
113
|
+
"""
|
114
|
+
|
115
|
+
|
116
|
+
@dataclass
|
117
|
+
class EventType(CairoType):
|
118
|
+
"""
|
119
|
+
Type representation of Cairo Event.
|
120
|
+
"""
|
121
|
+
|
122
|
+
name: str
|
123
|
+
types: OrderedDict[str, CairoType]
|
File without changes
|
@@ -0,0 +1,77 @@
|
|
1
|
+
import dataclasses
|
2
|
+
from typing import List, Optional
|
3
|
+
|
4
|
+
|
5
|
+
class CairoType:
|
6
|
+
"""
|
7
|
+
Base class for cairo types.
|
8
|
+
"""
|
9
|
+
|
10
|
+
|
11
|
+
@dataclasses.dataclass
|
12
|
+
class TypeFelt(CairoType):
|
13
|
+
pass
|
14
|
+
|
15
|
+
|
16
|
+
@dataclasses.dataclass
|
17
|
+
class TypeCodeoffset(CairoType):
|
18
|
+
pass
|
19
|
+
|
20
|
+
|
21
|
+
@dataclasses.dataclass
|
22
|
+
class TypePointer(CairoType):
|
23
|
+
pointee: CairoType
|
24
|
+
|
25
|
+
|
26
|
+
@dataclasses.dataclass
|
27
|
+
class TypeIdentifier(CairoType):
|
28
|
+
"""
|
29
|
+
Represents a name of an unresolved type.
|
30
|
+
This type can be resolved to TypeStruct or TypeDefinition.
|
31
|
+
"""
|
32
|
+
|
33
|
+
name: str
|
34
|
+
|
35
|
+
|
36
|
+
@dataclasses.dataclass
|
37
|
+
class TypeStruct(CairoType):
|
38
|
+
scope: str
|
39
|
+
|
40
|
+
|
41
|
+
@dataclasses.dataclass
|
42
|
+
class TypeFunction(CairoType):
|
43
|
+
"""
|
44
|
+
Represents a type of a function.
|
45
|
+
"""
|
46
|
+
|
47
|
+
scope: str
|
48
|
+
|
49
|
+
|
50
|
+
@dataclasses.dataclass
|
51
|
+
class TypeTuple(CairoType):
|
52
|
+
"""
|
53
|
+
Represents a type of a named or unnamed tuple.
|
54
|
+
For example, "(felt, felt*)" or "(a: felt, b: felt*)".
|
55
|
+
"""
|
56
|
+
|
57
|
+
@dataclasses.dataclass
|
58
|
+
class Item(CairoType):
|
59
|
+
"""
|
60
|
+
Represents a possibly named type item of a TypeTuple.
|
61
|
+
For example: "felt" or "a: felt".
|
62
|
+
"""
|
63
|
+
|
64
|
+
name: Optional[str]
|
65
|
+
typ: CairoType
|
66
|
+
|
67
|
+
members: List["TypeTuple.Item"]
|
68
|
+
has_trailing_comma: bool = dataclasses.field(hash=False, compare=False)
|
69
|
+
|
70
|
+
@property
|
71
|
+
def is_named(self) -> bool:
|
72
|
+
return all(member.name is not None for member in self.members)
|
73
|
+
|
74
|
+
|
75
|
+
@dataclasses.dataclass
|
76
|
+
class ExprIdentifier(CairoType):
|
77
|
+
name: str
|