coinex-api 0.0.15__py3-none-any.whl → 0.0.17__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.
- coinex/__init__.py +7 -0
- coinex/ccxt/__init__.py +101 -0
- coinex/ccxt/abstract/coinex.py +237 -0
- coinex/ccxt/async_support/__init__.py +80 -0
- coinex/ccxt/async_support/base/__init__.py +1 -0
- coinex/ccxt/async_support/base/exchange.py +2100 -0
- coinex/ccxt/async_support/base/throttler.py +50 -0
- coinex/ccxt/async_support/base/ws/__init__.py +38 -0
- coinex/ccxt/async_support/base/ws/aiohttp_client.py +147 -0
- coinex/ccxt/async_support/base/ws/cache.py +213 -0
- coinex/ccxt/async_support/base/ws/client.py +214 -0
- coinex/ccxt/async_support/base/ws/fast_client.py +97 -0
- coinex/ccxt/async_support/base/ws/functions.py +59 -0
- coinex/ccxt/async_support/base/ws/future.py +69 -0
- coinex/ccxt/async_support/base/ws/order_book.py +78 -0
- coinex/ccxt/async_support/base/ws/order_book_side.py +174 -0
- coinex/ccxt/async_support/coinex.py +5833 -0
- coinex/ccxt/base/__init__.py +27 -0
- coinex/ccxt/base/decimal_to_precision.py +174 -0
- coinex/ccxt/base/errors.py +267 -0
- coinex/ccxt/base/exchange.py +6769 -0
- coinex/ccxt/base/precise.py +297 -0
- coinex/ccxt/base/types.py +577 -0
- coinex/ccxt/coinex.py +5832 -0
- coinex/ccxt/pro/__init__.py +21 -0
- coinex/ccxt/pro/coinex.py +1366 -0
- coinex/ccxt/static_dependencies/README.md +1 -0
- coinex/ccxt/static_dependencies/__init__.py +1 -0
- coinex/ccxt/static_dependencies/ecdsa/__init__.py +14 -0
- coinex/ccxt/static_dependencies/ecdsa/_version.py +520 -0
- coinex/ccxt/static_dependencies/ecdsa/curves.py +56 -0
- coinex/ccxt/static_dependencies/ecdsa/der.py +221 -0
- coinex/ccxt/static_dependencies/ecdsa/ecdsa.py +310 -0
- coinex/ccxt/static_dependencies/ecdsa/ellipticcurve.py +197 -0
- coinex/ccxt/static_dependencies/ecdsa/keys.py +332 -0
- coinex/ccxt/static_dependencies/ecdsa/numbertheory.py +531 -0
- coinex/ccxt/static_dependencies/ecdsa/rfc6979.py +100 -0
- coinex/ccxt/static_dependencies/ecdsa/util.py +266 -0
- coinex/ccxt/static_dependencies/ethereum/__init__.py +7 -0
- coinex/ccxt/static_dependencies/ethereum/abi/__init__.py +16 -0
- coinex/ccxt/static_dependencies/ethereum/abi/abi.py +19 -0
- coinex/ccxt/static_dependencies/ethereum/abi/base.py +152 -0
- coinex/ccxt/static_dependencies/ethereum/abi/codec.py +217 -0
- coinex/ccxt/static_dependencies/ethereum/abi/constants.py +3 -0
- coinex/ccxt/static_dependencies/ethereum/abi/decoding.py +565 -0
- coinex/ccxt/static_dependencies/ethereum/abi/encoding.py +720 -0
- coinex/ccxt/static_dependencies/ethereum/abi/exceptions.py +139 -0
- coinex/ccxt/static_dependencies/ethereum/abi/grammar.py +443 -0
- coinex/ccxt/static_dependencies/ethereum/abi/packed.py +13 -0
- coinex/ccxt/static_dependencies/ethereum/abi/py.typed +0 -0
- coinex/ccxt/static_dependencies/ethereum/abi/registry.py +643 -0
- coinex/ccxt/static_dependencies/ethereum/abi/tools/__init__.py +3 -0
- coinex/ccxt/static_dependencies/ethereum/abi/tools/_strategies.py +230 -0
- coinex/ccxt/static_dependencies/ethereum/abi/utils/__init__.py +0 -0
- coinex/ccxt/static_dependencies/ethereum/abi/utils/numeric.py +83 -0
- coinex/ccxt/static_dependencies/ethereum/abi/utils/padding.py +27 -0
- coinex/ccxt/static_dependencies/ethereum/abi/utils/string.py +19 -0
- coinex/ccxt/static_dependencies/ethereum/account/__init__.py +3 -0
- coinex/ccxt/static_dependencies/ethereum/account/encode_typed_data/__init__.py +4 -0
- coinex/ccxt/static_dependencies/ethereum/account/encode_typed_data/encoding_and_hashing.py +239 -0
- coinex/ccxt/static_dependencies/ethereum/account/encode_typed_data/helpers.py +40 -0
- coinex/ccxt/static_dependencies/ethereum/account/messages.py +263 -0
- coinex/ccxt/static_dependencies/ethereum/account/py.typed +0 -0
- coinex/ccxt/static_dependencies/ethereum/hexbytes/__init__.py +5 -0
- coinex/ccxt/static_dependencies/ethereum/hexbytes/_utils.py +54 -0
- coinex/ccxt/static_dependencies/ethereum/hexbytes/main.py +65 -0
- coinex/ccxt/static_dependencies/ethereum/hexbytes/py.typed +0 -0
- coinex/ccxt/static_dependencies/ethereum/typing/__init__.py +63 -0
- coinex/ccxt/static_dependencies/ethereum/typing/abi.py +6 -0
- coinex/ccxt/static_dependencies/ethereum/typing/bls.py +7 -0
- coinex/ccxt/static_dependencies/ethereum/typing/discovery.py +5 -0
- coinex/ccxt/static_dependencies/ethereum/typing/encoding.py +7 -0
- coinex/ccxt/static_dependencies/ethereum/typing/enums.py +17 -0
- coinex/ccxt/static_dependencies/ethereum/typing/ethpm.py +9 -0
- coinex/ccxt/static_dependencies/ethereum/typing/evm.py +20 -0
- coinex/ccxt/static_dependencies/ethereum/typing/networks.py +1122 -0
- coinex/ccxt/static_dependencies/ethereum/typing/py.typed +0 -0
- coinex/ccxt/static_dependencies/ethereum/utils/__init__.py +115 -0
- coinex/ccxt/static_dependencies/ethereum/utils/abi.py +72 -0
- coinex/ccxt/static_dependencies/ethereum/utils/address.py +171 -0
- coinex/ccxt/static_dependencies/ethereum/utils/applicators.py +151 -0
- coinex/ccxt/static_dependencies/ethereum/utils/conversions.py +190 -0
- coinex/ccxt/static_dependencies/ethereum/utils/currency.py +107 -0
- coinex/ccxt/static_dependencies/ethereum/utils/curried/__init__.py +269 -0
- coinex/ccxt/static_dependencies/ethereum/utils/debug.py +20 -0
- coinex/ccxt/static_dependencies/ethereum/utils/decorators.py +132 -0
- coinex/ccxt/static_dependencies/ethereum/utils/encoding.py +6 -0
- coinex/ccxt/static_dependencies/ethereum/utils/exceptions.py +4 -0
- coinex/ccxt/static_dependencies/ethereum/utils/functional.py +75 -0
- coinex/ccxt/static_dependencies/ethereum/utils/hexadecimal.py +74 -0
- coinex/ccxt/static_dependencies/ethereum/utils/humanize.py +188 -0
- coinex/ccxt/static_dependencies/ethereum/utils/logging.py +159 -0
- coinex/ccxt/static_dependencies/ethereum/utils/module_loading.py +31 -0
- coinex/ccxt/static_dependencies/ethereum/utils/numeric.py +43 -0
- coinex/ccxt/static_dependencies/ethereum/utils/py.typed +0 -0
- coinex/ccxt/static_dependencies/ethereum/utils/toolz.py +76 -0
- coinex/ccxt/static_dependencies/ethereum/utils/types.py +54 -0
- coinex/ccxt/static_dependencies/ethereum/utils/typing/__init__.py +18 -0
- coinex/ccxt/static_dependencies/ethereum/utils/typing/misc.py +14 -0
- coinex/ccxt/static_dependencies/ethereum/utils/units.py +31 -0
- coinex/ccxt/static_dependencies/keccak/__init__.py +3 -0
- coinex/ccxt/static_dependencies/keccak/keccak.py +197 -0
- coinex/ccxt/static_dependencies/lark/__init__.py +38 -0
- coinex/ccxt/static_dependencies/lark/__pyinstaller/__init__.py +6 -0
- coinex/ccxt/static_dependencies/lark/__pyinstaller/hook-lark.py +14 -0
- coinex/ccxt/static_dependencies/lark/ast_utils.py +59 -0
- coinex/ccxt/static_dependencies/lark/common.py +86 -0
- coinex/ccxt/static_dependencies/lark/exceptions.py +292 -0
- coinex/ccxt/static_dependencies/lark/grammar.py +130 -0
- coinex/ccxt/static_dependencies/lark/grammars/__init__.py +0 -0
- coinex/ccxt/static_dependencies/lark/grammars/common.lark +59 -0
- coinex/ccxt/static_dependencies/lark/grammars/lark.lark +62 -0
- coinex/ccxt/static_dependencies/lark/grammars/python.lark +302 -0
- coinex/ccxt/static_dependencies/lark/grammars/unicode.lark +7 -0
- coinex/ccxt/static_dependencies/lark/indenter.py +143 -0
- coinex/ccxt/static_dependencies/lark/lark.py +658 -0
- coinex/ccxt/static_dependencies/lark/lexer.py +678 -0
- coinex/ccxt/static_dependencies/lark/load_grammar.py +1428 -0
- coinex/ccxt/static_dependencies/lark/parse_tree_builder.py +391 -0
- coinex/ccxt/static_dependencies/lark/parser_frontends.py +257 -0
- coinex/ccxt/static_dependencies/lark/parsers/__init__.py +0 -0
- coinex/ccxt/static_dependencies/lark/parsers/cyk.py +340 -0
- coinex/ccxt/static_dependencies/lark/parsers/earley.py +314 -0
- coinex/ccxt/static_dependencies/lark/parsers/earley_common.py +42 -0
- coinex/ccxt/static_dependencies/lark/parsers/earley_forest.py +801 -0
- coinex/ccxt/static_dependencies/lark/parsers/grammar_analysis.py +203 -0
- coinex/ccxt/static_dependencies/lark/parsers/lalr_analysis.py +332 -0
- coinex/ccxt/static_dependencies/lark/parsers/lalr_interactive_parser.py +158 -0
- coinex/ccxt/static_dependencies/lark/parsers/lalr_parser.py +122 -0
- coinex/ccxt/static_dependencies/lark/parsers/lalr_parser_state.py +110 -0
- coinex/ccxt/static_dependencies/lark/parsers/xearley.py +165 -0
- coinex/ccxt/static_dependencies/lark/py.typed +0 -0
- coinex/ccxt/static_dependencies/lark/reconstruct.py +107 -0
- coinex/ccxt/static_dependencies/lark/tools/__init__.py +70 -0
- coinex/ccxt/static_dependencies/lark/tools/nearley.py +202 -0
- coinex/ccxt/static_dependencies/lark/tools/serialize.py +32 -0
- coinex/ccxt/static_dependencies/lark/tools/standalone.py +196 -0
- coinex/ccxt/static_dependencies/lark/tree.py +267 -0
- coinex/ccxt/static_dependencies/lark/tree_matcher.py +186 -0
- coinex/ccxt/static_dependencies/lark/tree_templates.py +180 -0
- coinex/ccxt/static_dependencies/lark/utils.py +343 -0
- coinex/ccxt/static_dependencies/lark/visitors.py +596 -0
- coinex/ccxt/static_dependencies/marshmallow/__init__.py +81 -0
- coinex/ccxt/static_dependencies/marshmallow/base.py +65 -0
- coinex/ccxt/static_dependencies/marshmallow/class_registry.py +94 -0
- coinex/ccxt/static_dependencies/marshmallow/decorators.py +231 -0
- coinex/ccxt/static_dependencies/marshmallow/error_store.py +60 -0
- coinex/ccxt/static_dependencies/marshmallow/exceptions.py +71 -0
- coinex/ccxt/static_dependencies/marshmallow/fields.py +2114 -0
- coinex/ccxt/static_dependencies/marshmallow/orderedset.py +89 -0
- coinex/ccxt/static_dependencies/marshmallow/py.typed +0 -0
- coinex/ccxt/static_dependencies/marshmallow/schema.py +1228 -0
- coinex/ccxt/static_dependencies/marshmallow/types.py +12 -0
- coinex/ccxt/static_dependencies/marshmallow/utils.py +378 -0
- coinex/ccxt/static_dependencies/marshmallow/validate.py +678 -0
- coinex/ccxt/static_dependencies/marshmallow/warnings.py +2 -0
- coinex/ccxt/static_dependencies/marshmallow_dataclass/__init__.py +1047 -0
- coinex/ccxt/static_dependencies/marshmallow_dataclass/collection_field.py +51 -0
- coinex/ccxt/static_dependencies/marshmallow_dataclass/lazy_class_attribute.py +45 -0
- coinex/ccxt/static_dependencies/marshmallow_dataclass/mypy.py +71 -0
- coinex/ccxt/static_dependencies/marshmallow_dataclass/py.typed +0 -0
- coinex/ccxt/static_dependencies/marshmallow_dataclass/typing.py +14 -0
- coinex/ccxt/static_dependencies/marshmallow_dataclass/union_field.py +82 -0
- coinex/ccxt/static_dependencies/marshmallow_oneofschema/__init__.py +1 -0
- coinex/ccxt/static_dependencies/marshmallow_oneofschema/one_of_schema.py +193 -0
- coinex/ccxt/static_dependencies/marshmallow_oneofschema/py.typed +0 -0
- coinex/ccxt/static_dependencies/msgpack/__init__.py +55 -0
- coinex/ccxt/static_dependencies/msgpack/_cmsgpack.pyx +11 -0
- coinex/ccxt/static_dependencies/msgpack/_packer.pyx +374 -0
- coinex/ccxt/static_dependencies/msgpack/_unpacker.pyx +547 -0
- coinex/ccxt/static_dependencies/msgpack/buff_converter.h +8 -0
- coinex/ccxt/static_dependencies/msgpack/exceptions.py +48 -0
- coinex/ccxt/static_dependencies/msgpack/ext.py +168 -0
- coinex/ccxt/static_dependencies/msgpack/fallback.py +951 -0
- coinex/ccxt/static_dependencies/msgpack/pack.h +89 -0
- coinex/ccxt/static_dependencies/msgpack/pack_template.h +820 -0
- coinex/ccxt/static_dependencies/msgpack/sysdep.h +194 -0
- coinex/ccxt/static_dependencies/msgpack/unpack.h +391 -0
- coinex/ccxt/static_dependencies/msgpack/unpack_define.h +95 -0
- coinex/ccxt/static_dependencies/msgpack/unpack_template.h +464 -0
- coinex/ccxt/static_dependencies/parsimonious/__init__.py +10 -0
- coinex/ccxt/static_dependencies/parsimonious/exceptions.py +105 -0
- coinex/ccxt/static_dependencies/parsimonious/expressions.py +479 -0
- coinex/ccxt/static_dependencies/parsimonious/grammar.py +487 -0
- coinex/ccxt/static_dependencies/parsimonious/nodes.py +325 -0
- coinex/ccxt/static_dependencies/parsimonious/utils.py +40 -0
- coinex/ccxt/static_dependencies/starknet/__init__.py +0 -0
- coinex/ccxt/static_dependencies/starknet/abi/v0/__init__.py +2 -0
- coinex/ccxt/static_dependencies/starknet/abi/v0/model.py +44 -0
- coinex/ccxt/static_dependencies/starknet/abi/v0/parser.py +216 -0
- coinex/ccxt/static_dependencies/starknet/abi/v0/schemas.py +72 -0
- coinex/ccxt/static_dependencies/starknet/abi/v0/shape.py +63 -0
- coinex/ccxt/static_dependencies/starknet/abi/v1/__init__.py +2 -0
- coinex/ccxt/static_dependencies/starknet/abi/v1/core_structures.json +14 -0
- coinex/ccxt/static_dependencies/starknet/abi/v1/model.py +39 -0
- coinex/ccxt/static_dependencies/starknet/abi/v1/parser.py +220 -0
- coinex/ccxt/static_dependencies/starknet/abi/v1/parser_transformer.py +179 -0
- coinex/ccxt/static_dependencies/starknet/abi/v1/schemas.py +66 -0
- coinex/ccxt/static_dependencies/starknet/abi/v1/shape.py +47 -0
- coinex/ccxt/static_dependencies/starknet/abi/v2/__init__.py +2 -0
- coinex/ccxt/static_dependencies/starknet/abi/v2/model.py +89 -0
- coinex/ccxt/static_dependencies/starknet/abi/v2/parser.py +293 -0
- coinex/ccxt/static_dependencies/starknet/abi/v2/parser_transformer.py +192 -0
- coinex/ccxt/static_dependencies/starknet/abi/v2/schemas.py +132 -0
- coinex/ccxt/static_dependencies/starknet/abi/v2/shape.py +107 -0
- coinex/ccxt/static_dependencies/starknet/cairo/__init__.py +0 -0
- coinex/ccxt/static_dependencies/starknet/cairo/data_types.py +123 -0
- coinex/ccxt/static_dependencies/starknet/cairo/deprecated_parse/__init__.py +0 -0
- coinex/ccxt/static_dependencies/starknet/cairo/deprecated_parse/cairo_types.py +77 -0
- coinex/ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser.py +46 -0
- coinex/ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser_transformer.py +138 -0
- coinex/ccxt/static_dependencies/starknet/cairo/felt.py +64 -0
- coinex/ccxt/static_dependencies/starknet/cairo/type_parser.py +121 -0
- coinex/ccxt/static_dependencies/starknet/cairo/v1/__init__.py +0 -0
- coinex/ccxt/static_dependencies/starknet/cairo/v1/type_parser.py +59 -0
- coinex/ccxt/static_dependencies/starknet/cairo/v2/__init__.py +0 -0
- coinex/ccxt/static_dependencies/starknet/cairo/v2/type_parser.py +77 -0
- coinex/ccxt/static_dependencies/starknet/ccxt_utils.py +7 -0
- coinex/ccxt/static_dependencies/starknet/common.py +15 -0
- coinex/ccxt/static_dependencies/starknet/constants.py +39 -0
- coinex/ccxt/static_dependencies/starknet/hash/__init__.py +0 -0
- coinex/ccxt/static_dependencies/starknet/hash/address.py +79 -0
- coinex/ccxt/static_dependencies/starknet/hash/compiled_class_hash_objects.py +111 -0
- coinex/ccxt/static_dependencies/starknet/hash/selector.py +16 -0
- coinex/ccxt/static_dependencies/starknet/hash/storage.py +12 -0
- coinex/ccxt/static_dependencies/starknet/hash/utils.py +78 -0
- coinex/ccxt/static_dependencies/starknet/models/__init__.py +0 -0
- coinex/ccxt/static_dependencies/starknet/models/typed_data.py +45 -0
- coinex/ccxt/static_dependencies/starknet/serialization/__init__.py +24 -0
- coinex/ccxt/static_dependencies/starknet/serialization/_calldata_reader.py +40 -0
- coinex/ccxt/static_dependencies/starknet/serialization/_context.py +142 -0
- coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/__init__.py +10 -0
- coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/_common.py +82 -0
- coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/array_serializer.py +43 -0
- coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/bool_serializer.py +37 -0
- coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/byte_array_serializer.py +66 -0
- coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/cairo_data_serializer.py +71 -0
- coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/enum_serializer.py +71 -0
- coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/felt_serializer.py +50 -0
- coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/named_tuple_serializer.py +58 -0
- coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/option_serializer.py +43 -0
- coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/output_serializer.py +40 -0
- coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/payload_serializer.py +72 -0
- coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/struct_serializer.py +36 -0
- coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/tuple_serializer.py +36 -0
- coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/uint256_serializer.py +76 -0
- coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/uint_serializer.py +100 -0
- coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/unit_serializer.py +32 -0
- coinex/ccxt/static_dependencies/starknet/serialization/errors.py +10 -0
- coinex/ccxt/static_dependencies/starknet/serialization/factory.py +229 -0
- coinex/ccxt/static_dependencies/starknet/serialization/function_serialization_adapter.py +110 -0
- coinex/ccxt/static_dependencies/starknet/serialization/tuple_dataclass.py +59 -0
- coinex/ccxt/static_dependencies/starknet/utils/__init__.py +0 -0
- coinex/ccxt/static_dependencies/starknet/utils/constructor_args_translator.py +86 -0
- coinex/ccxt/static_dependencies/starknet/utils/iterable.py +13 -0
- coinex/ccxt/static_dependencies/starknet/utils/schema.py +13 -0
- coinex/ccxt/static_dependencies/starknet/utils/typed_data.py +182 -0
- coinex/ccxt/static_dependencies/starkware/__init__.py +0 -0
- coinex/ccxt/static_dependencies/starkware/crypto/__init__.py +0 -0
- coinex/ccxt/static_dependencies/starkware/crypto/fast_pedersen_hash.py +50 -0
- coinex/ccxt/static_dependencies/starkware/crypto/math_utils.py +78 -0
- coinex/ccxt/static_dependencies/starkware/crypto/signature.py +2344 -0
- coinex/ccxt/static_dependencies/starkware/crypto/utils.py +63 -0
- coinex/ccxt/static_dependencies/sympy/__init__.py +0 -0
- coinex/ccxt/static_dependencies/sympy/core/__init__.py +0 -0
- coinex/ccxt/static_dependencies/sympy/core/intfunc.py +35 -0
- coinex/ccxt/static_dependencies/sympy/external/__init__.py +0 -0
- coinex/ccxt/static_dependencies/sympy/external/gmpy.py +345 -0
- coinex/ccxt/static_dependencies/sympy/external/importtools.py +187 -0
- coinex/ccxt/static_dependencies/sympy/external/ntheory.py +637 -0
- coinex/ccxt/static_dependencies/sympy/external/pythonmpq.py +341 -0
- coinex/ccxt/static_dependencies/toolz/__init__.py +26 -0
- coinex/ccxt/static_dependencies/toolz/_signatures.py +784 -0
- coinex/ccxt/static_dependencies/toolz/_version.py +520 -0
- coinex/ccxt/static_dependencies/toolz/compatibility.py +30 -0
- coinex/ccxt/static_dependencies/toolz/curried/__init__.py +101 -0
- coinex/ccxt/static_dependencies/toolz/curried/exceptions.py +22 -0
- coinex/ccxt/static_dependencies/toolz/curried/operator.py +22 -0
- coinex/ccxt/static_dependencies/toolz/dicttoolz.py +339 -0
- coinex/ccxt/static_dependencies/toolz/functoolz.py +1049 -0
- coinex/ccxt/static_dependencies/toolz/itertoolz.py +1057 -0
- coinex/ccxt/static_dependencies/toolz/recipes.py +46 -0
- coinex/ccxt/static_dependencies/toolz/utils.py +9 -0
- coinex/ccxt/static_dependencies/typing_inspect/__init__.py +0 -0
- coinex/ccxt/static_dependencies/typing_inspect/typing_inspect.py +851 -0
- coinex_api-0.0.17.dist-info/METADATA +425 -0
- coinex_api-0.0.17.dist-info/RECORD +288 -0
- coinex_api-0.0.15.dist-info/METADATA +0 -79
- coinex_api-0.0.15.dist-info/RECORD +0 -3
- {coinex_api-0.0.15.dist-info → coinex_api-0.0.17.dist-info}/WHEEL +0 -0
@@ -0,0 +1,107 @@
|
|
1
|
+
import decimal
|
2
|
+
from decimal import (
|
3
|
+
localcontext,
|
4
|
+
)
|
5
|
+
from typing import (
|
6
|
+
Union,
|
7
|
+
)
|
8
|
+
|
9
|
+
from .types import (
|
10
|
+
is_integer,
|
11
|
+
is_string,
|
12
|
+
)
|
13
|
+
from .units import (
|
14
|
+
units,
|
15
|
+
)
|
16
|
+
|
17
|
+
|
18
|
+
class denoms:
|
19
|
+
wei = int(units["wei"])
|
20
|
+
kwei = int(units["kwei"])
|
21
|
+
babbage = int(units["babbage"])
|
22
|
+
femtoether = int(units["femtoether"])
|
23
|
+
mwei = int(units["mwei"])
|
24
|
+
lovelace = int(units["lovelace"])
|
25
|
+
picoether = int(units["picoether"])
|
26
|
+
gwei = int(units["gwei"])
|
27
|
+
shannon = int(units["shannon"])
|
28
|
+
nanoether = int(units["nanoether"])
|
29
|
+
nano = int(units["nano"])
|
30
|
+
szabo = int(units["szabo"])
|
31
|
+
microether = int(units["microether"])
|
32
|
+
micro = int(units["micro"])
|
33
|
+
finney = int(units["finney"])
|
34
|
+
milliether = int(units["milliether"])
|
35
|
+
milli = int(units["milli"])
|
36
|
+
ether = int(units["ether"])
|
37
|
+
kether = int(units["kether"])
|
38
|
+
grand = int(units["grand"])
|
39
|
+
mether = int(units["mether"])
|
40
|
+
gether = int(units["gether"])
|
41
|
+
tether = int(units["tether"])
|
42
|
+
|
43
|
+
|
44
|
+
MIN_WEI = 0
|
45
|
+
MAX_WEI = 2**256 - 1
|
46
|
+
|
47
|
+
|
48
|
+
def from_wei(number: int, unit: str) -> Union[int, decimal.Decimal]:
|
49
|
+
"""
|
50
|
+
Takes a number of wei and converts it to any other ether unit.
|
51
|
+
"""
|
52
|
+
if unit.lower() not in units:
|
53
|
+
raise ValueError(f"Unknown unit. Must be one of {'/'.join(units.keys())}")
|
54
|
+
|
55
|
+
if number == 0:
|
56
|
+
return 0
|
57
|
+
|
58
|
+
if number < MIN_WEI or number > MAX_WEI:
|
59
|
+
raise ValueError("value must be between 1 and 2**256 - 1")
|
60
|
+
|
61
|
+
unit_value = units[unit.lower()]
|
62
|
+
|
63
|
+
with localcontext() as ctx:
|
64
|
+
ctx.prec = 999
|
65
|
+
d_number = decimal.Decimal(value=number, context=ctx)
|
66
|
+
result_value = d_number / unit_value
|
67
|
+
|
68
|
+
return result_value
|
69
|
+
|
70
|
+
|
71
|
+
def to_wei(number: Union[int, float, str, decimal.Decimal], unit: str) -> int:
|
72
|
+
"""
|
73
|
+
Takes a number of a unit and converts it to wei.
|
74
|
+
"""
|
75
|
+
if unit.lower() not in units:
|
76
|
+
raise ValueError(f"Unknown unit. Must be one of {'/'.join(units.keys())}")
|
77
|
+
|
78
|
+
if is_integer(number) or is_string(number):
|
79
|
+
d_number = decimal.Decimal(value=number)
|
80
|
+
elif isinstance(number, float):
|
81
|
+
d_number = decimal.Decimal(value=str(number))
|
82
|
+
elif isinstance(number, decimal.Decimal):
|
83
|
+
d_number = number
|
84
|
+
else:
|
85
|
+
raise TypeError("Unsupported type. Must be one of integer, float, or string")
|
86
|
+
|
87
|
+
s_number = str(number)
|
88
|
+
unit_value = units[unit.lower()]
|
89
|
+
|
90
|
+
if d_number == decimal.Decimal(0):
|
91
|
+
return 0
|
92
|
+
|
93
|
+
if d_number < 1 and "." in s_number:
|
94
|
+
with localcontext() as ctx:
|
95
|
+
multiplier = len(s_number) - s_number.index(".") - 1
|
96
|
+
ctx.prec = multiplier
|
97
|
+
d_number = decimal.Decimal(value=number, context=ctx) * 10**multiplier
|
98
|
+
unit_value /= 10**multiplier
|
99
|
+
|
100
|
+
with localcontext() as ctx:
|
101
|
+
ctx.prec = 999
|
102
|
+
result_value = decimal.Decimal(value=d_number, context=ctx) * unit_value
|
103
|
+
|
104
|
+
if result_value < MIN_WEI or result_value > MAX_WEI:
|
105
|
+
raise ValueError("Resulting wei value must be between 1 and 2**256 - 1")
|
106
|
+
|
107
|
+
return int(result_value)
|
@@ -0,0 +1,269 @@
|
|
1
|
+
from typing import (
|
2
|
+
Any,
|
3
|
+
Callable,
|
4
|
+
Dict,
|
5
|
+
Generator,
|
6
|
+
Optional,
|
7
|
+
Sequence,
|
8
|
+
Tuple,
|
9
|
+
TypeVar,
|
10
|
+
Union,
|
11
|
+
overload,
|
12
|
+
)
|
13
|
+
|
14
|
+
from .. import (
|
15
|
+
ExtendedDebugLogger,
|
16
|
+
HasExtendedDebugLogger,
|
17
|
+
HasExtendedDebugLoggerMeta,
|
18
|
+
HasLogger,
|
19
|
+
HasLoggerMeta,
|
20
|
+
ValidationError,
|
21
|
+
add_0x_prefix,
|
22
|
+
apply_formatter_at_index,
|
23
|
+
apply_formatter_if as non_curried_apply_formatter_if,
|
24
|
+
apply_formatter_to_array,
|
25
|
+
apply_formatters_to_dict as non_curried_apply_formatters_to_dict,
|
26
|
+
apply_formatters_to_sequence,
|
27
|
+
apply_key_map,
|
28
|
+
apply_one_of_formatters as non_curried_apply_one_of_formatters,
|
29
|
+
apply_to_return_value,
|
30
|
+
big_endian_to_int,
|
31
|
+
clamp,
|
32
|
+
combine_argument_formatters,
|
33
|
+
combomethod,
|
34
|
+
decode_hex,
|
35
|
+
denoms,
|
36
|
+
encode_hex,
|
37
|
+
# event_abi_to_log_topic,
|
38
|
+
# event_signature_to_log_topic,
|
39
|
+
flatten_return,
|
40
|
+
from_wei,
|
41
|
+
# function_abi_to_4byte_selector,
|
42
|
+
# function_signature_to_4byte_selector,
|
43
|
+
get_extended_debug_logger,
|
44
|
+
get_logger,
|
45
|
+
hexstr_if_str as non_curried_hexstr_if_str,
|
46
|
+
humanize_bytes,
|
47
|
+
humanize_hash,
|
48
|
+
humanize_integer_sequence,
|
49
|
+
humanize_ipfs_uri,
|
50
|
+
humanize_seconds,
|
51
|
+
humanize_wei,
|
52
|
+
import_string,
|
53
|
+
int_to_big_endian,
|
54
|
+
is_0x_prefixed,
|
55
|
+
is_address,
|
56
|
+
is_binary_address,
|
57
|
+
is_boolean,
|
58
|
+
is_bytes,
|
59
|
+
is_canonical_address,
|
60
|
+
is_checksum_address,
|
61
|
+
is_checksum_formatted_address,
|
62
|
+
is_dict,
|
63
|
+
is_hex,
|
64
|
+
is_hex_address,
|
65
|
+
is_hexstr,
|
66
|
+
is_integer,
|
67
|
+
is_list,
|
68
|
+
is_list_like,
|
69
|
+
is_normalized_address,
|
70
|
+
is_null,
|
71
|
+
is_number,
|
72
|
+
is_same_address,
|
73
|
+
is_string,
|
74
|
+
is_text,
|
75
|
+
is_tuple,
|
76
|
+
# keccak,
|
77
|
+
remove_0x_prefix,
|
78
|
+
replace_exceptions,
|
79
|
+
reversed_return,
|
80
|
+
setup_DEBUG2_logging,
|
81
|
+
sort_return,
|
82
|
+
text_if_str as non_curried_text_if_str,
|
83
|
+
to_bytes,
|
84
|
+
to_canonical_address,
|
85
|
+
to_checksum_address,
|
86
|
+
to_dict,
|
87
|
+
to_hex,
|
88
|
+
to_int,
|
89
|
+
to_list,
|
90
|
+
to_normalized_address,
|
91
|
+
to_ordered_dict,
|
92
|
+
to_set,
|
93
|
+
to_text,
|
94
|
+
to_tuple,
|
95
|
+
to_wei,
|
96
|
+
)
|
97
|
+
from ..toolz import (
|
98
|
+
curry,
|
99
|
+
)
|
100
|
+
|
101
|
+
TReturn = TypeVar("TReturn")
|
102
|
+
TValue = TypeVar("TValue")
|
103
|
+
|
104
|
+
|
105
|
+
@overload
|
106
|
+
def apply_formatter_if(
|
107
|
+
condition: Callable[..., bool]
|
108
|
+
) -> Callable[[Callable[..., TReturn]], Callable[[TValue], Union[TReturn, TValue]]]:
|
109
|
+
pass
|
110
|
+
|
111
|
+
|
112
|
+
@overload
|
113
|
+
def apply_formatter_if(
|
114
|
+
condition: Callable[..., bool], formatter: Callable[..., TReturn]
|
115
|
+
) -> Callable[[TValue], Union[TReturn, TValue]]:
|
116
|
+
pass
|
117
|
+
|
118
|
+
|
119
|
+
@overload
|
120
|
+
def apply_formatter_if(
|
121
|
+
condition: Callable[..., bool], formatter: Callable[..., TReturn], value: TValue
|
122
|
+
) -> Union[TReturn, TValue]:
|
123
|
+
pass
|
124
|
+
|
125
|
+
|
126
|
+
# This is just a stub to appease mypy, it gets overwritten later
|
127
|
+
def apply_formatter_if( # type: ignore
|
128
|
+
condition: Callable[..., bool],
|
129
|
+
formatter: Optional[Callable[..., TReturn]] = None,
|
130
|
+
value: Optional[TValue] = None,
|
131
|
+
) -> Union[
|
132
|
+
Callable[[Callable[..., TReturn]], Callable[[TValue], Union[TReturn, TValue]]],
|
133
|
+
Callable[[TValue], Union[TReturn, TValue]],
|
134
|
+
TReturn,
|
135
|
+
TValue,
|
136
|
+
]:
|
137
|
+
pass
|
138
|
+
|
139
|
+
|
140
|
+
@overload
|
141
|
+
def apply_one_of_formatters(
|
142
|
+
formatter_condition_pairs: Sequence[
|
143
|
+
Tuple[Callable[..., bool], Callable[..., TReturn]]
|
144
|
+
]
|
145
|
+
) -> Callable[[TValue], TReturn]:
|
146
|
+
...
|
147
|
+
|
148
|
+
|
149
|
+
@overload
|
150
|
+
def apply_one_of_formatters(
|
151
|
+
formatter_condition_pairs: Sequence[
|
152
|
+
Tuple[Callable[..., bool], Callable[..., TReturn]]
|
153
|
+
],
|
154
|
+
value: TValue,
|
155
|
+
) -> TReturn:
|
156
|
+
...
|
157
|
+
|
158
|
+
|
159
|
+
# This is just a stub to appease mypy, it gets overwritten later
|
160
|
+
def apply_one_of_formatters( # type: ignore
|
161
|
+
formatter_condition_pairs: Sequence[
|
162
|
+
Tuple[Callable[..., bool], Callable[..., TReturn]]
|
163
|
+
],
|
164
|
+
value: Optional[TValue] = None,
|
165
|
+
) -> TReturn:
|
166
|
+
...
|
167
|
+
|
168
|
+
|
169
|
+
@overload
|
170
|
+
def hexstr_if_str(
|
171
|
+
to_type: Callable[..., TReturn]
|
172
|
+
) -> Callable[[Union[bytes, int, str]], TReturn]:
|
173
|
+
...
|
174
|
+
|
175
|
+
|
176
|
+
@overload
|
177
|
+
def hexstr_if_str(
|
178
|
+
to_type: Callable[..., TReturn], to_format: Union[bytes, int, str]
|
179
|
+
) -> TReturn:
|
180
|
+
...
|
181
|
+
|
182
|
+
|
183
|
+
# This is just a stub to appease mypy, it gets overwritten later
|
184
|
+
def hexstr_if_str( # type: ignore
|
185
|
+
to_type: Callable[..., TReturn], to_format: Optional[Union[bytes, int, str]] = None
|
186
|
+
) -> TReturn:
|
187
|
+
...
|
188
|
+
|
189
|
+
|
190
|
+
@overload
|
191
|
+
def text_if_str(
|
192
|
+
to_type: Callable[..., TReturn]
|
193
|
+
) -> Callable[[Union[bytes, int, str]], TReturn]:
|
194
|
+
...
|
195
|
+
|
196
|
+
|
197
|
+
@overload
|
198
|
+
def text_if_str(
|
199
|
+
to_type: Callable[..., TReturn], text_or_primitive: Union[bytes, int, str]
|
200
|
+
) -> TReturn:
|
201
|
+
...
|
202
|
+
|
203
|
+
|
204
|
+
# This is just a stub to appease mypy, it gets overwritten later
|
205
|
+
def text_if_str( # type: ignore
|
206
|
+
to_type: Callable[..., TReturn],
|
207
|
+
text_or_primitive: Optional[Union[bytes, int, str]] = None,
|
208
|
+
) -> TReturn:
|
209
|
+
...
|
210
|
+
|
211
|
+
|
212
|
+
@overload
|
213
|
+
def apply_formatters_to_dict(
|
214
|
+
formatters: Dict[Any, Any]
|
215
|
+
) -> Callable[[Dict[Any, Any]], TReturn]:
|
216
|
+
...
|
217
|
+
|
218
|
+
|
219
|
+
@overload
|
220
|
+
def apply_formatters_to_dict(
|
221
|
+
formatters: Dict[Any, Any], value: Dict[Any, Any]
|
222
|
+
) -> Dict[Any, Any]:
|
223
|
+
...
|
224
|
+
|
225
|
+
|
226
|
+
# This is just a stub to appease mypy, it gets overwritten later
|
227
|
+
def apply_formatters_to_dict( # type: ignore
|
228
|
+
formatters: Dict[Any, Any], value: Optional[Dict[Any, Any]] = None
|
229
|
+
) -> Dict[Any, Any]:
|
230
|
+
...
|
231
|
+
|
232
|
+
|
233
|
+
apply_formatter_at_index = curry(apply_formatter_at_index)
|
234
|
+
apply_formatter_if = curry(non_curried_apply_formatter_if) # noqa: F811
|
235
|
+
apply_formatter_to_array = curry(apply_formatter_to_array)
|
236
|
+
apply_formatters_to_dict = curry(non_curried_apply_formatters_to_dict) # noqa: F811
|
237
|
+
apply_formatters_to_sequence = curry(apply_formatters_to_sequence)
|
238
|
+
apply_key_map = curry(apply_key_map)
|
239
|
+
apply_one_of_formatters = curry(non_curried_apply_one_of_formatters) # noqa: F811
|
240
|
+
from_wei = curry(from_wei)
|
241
|
+
get_logger = curry(get_logger)
|
242
|
+
hexstr_if_str = curry(non_curried_hexstr_if_str) # noqa: F811
|
243
|
+
is_same_address = curry(is_same_address)
|
244
|
+
text_if_str = curry(non_curried_text_if_str) # noqa: F811
|
245
|
+
to_wei = curry(to_wei)
|
246
|
+
clamp = curry(clamp)
|
247
|
+
|
248
|
+
# Delete any methods and classes that are not intended to be importable from
|
249
|
+
# `eth_utils.curried`. We do this approach instead of __all__ because this approach
|
250
|
+
# actually prevents importing the wrong thing, while __all__ only affects
|
251
|
+
# `from eth_utils.curried import *`
|
252
|
+
del Any
|
253
|
+
del Callable
|
254
|
+
del Dict
|
255
|
+
del Generator
|
256
|
+
del Optional
|
257
|
+
del Sequence
|
258
|
+
del TReturn
|
259
|
+
del TValue
|
260
|
+
del Tuple
|
261
|
+
del TypeVar
|
262
|
+
del Union
|
263
|
+
del curry
|
264
|
+
del non_curried_apply_formatter_if
|
265
|
+
del non_curried_apply_one_of_formatters
|
266
|
+
del non_curried_apply_formatters_to_dict
|
267
|
+
del non_curried_hexstr_if_str
|
268
|
+
del non_curried_text_if_str
|
269
|
+
del overload
|
@@ -0,0 +1,20 @@
|
|
1
|
+
import platform
|
2
|
+
import subprocess
|
3
|
+
import sys
|
4
|
+
|
5
|
+
|
6
|
+
def pip_freeze() -> str:
|
7
|
+
result = subprocess.run("python -m pip freeze".split(), stdout=subprocess.PIPE)
|
8
|
+
return f"python -m pip freeze result:\n{result.stdout.decode()}"
|
9
|
+
|
10
|
+
|
11
|
+
def python_version() -> str:
|
12
|
+
return f"Python version:\n{sys.version}"
|
13
|
+
|
14
|
+
|
15
|
+
def platform_info() -> str:
|
16
|
+
return f"Operating System: {platform.platform()}"
|
17
|
+
|
18
|
+
|
19
|
+
def get_environment_summary() -> str:
|
20
|
+
return "\n\n".join([python_version(), platform_info(), pip_freeze()])
|
@@ -0,0 +1,132 @@
|
|
1
|
+
import functools
|
2
|
+
import itertools
|
3
|
+
from typing import (
|
4
|
+
Any,
|
5
|
+
Callable,
|
6
|
+
Dict,
|
7
|
+
Optional,
|
8
|
+
Type,
|
9
|
+
TypeVar,
|
10
|
+
)
|
11
|
+
|
12
|
+
from .types import (
|
13
|
+
is_text,
|
14
|
+
)
|
15
|
+
|
16
|
+
T = TypeVar("T")
|
17
|
+
|
18
|
+
|
19
|
+
class combomethod:
|
20
|
+
def __init__(self, method: Callable[..., Any]) -> None:
|
21
|
+
self.method = method
|
22
|
+
|
23
|
+
def __get__(
|
24
|
+
self, obj: Optional[T] = None, objtype: Optional[Type[T]] = None
|
25
|
+
) -> Callable[..., Any]:
|
26
|
+
@functools.wraps(self.method)
|
27
|
+
def _wrapper(*args: Any, **kwargs: Any) -> Any:
|
28
|
+
if obj is not None:
|
29
|
+
return self.method(obj, *args, **kwargs)
|
30
|
+
else:
|
31
|
+
return self.method(objtype, *args, **kwargs)
|
32
|
+
|
33
|
+
return _wrapper
|
34
|
+
|
35
|
+
|
36
|
+
def _has_one_val(*args: T, **kwargs: T) -> bool:
|
37
|
+
vals = itertools.chain(args, kwargs.values())
|
38
|
+
not_nones = list(filter(lambda val: val is not None, vals))
|
39
|
+
return len(not_nones) == 1
|
40
|
+
|
41
|
+
|
42
|
+
def _assert_one_val(*args: T, **kwargs: T) -> None:
|
43
|
+
if not _has_one_val(*args, **kwargs):
|
44
|
+
raise TypeError(
|
45
|
+
"Exactly one of the passed values can be specified. "
|
46
|
+
f"Instead, values were: {repr(args)}, {repr(kwargs)}"
|
47
|
+
)
|
48
|
+
|
49
|
+
|
50
|
+
def _hexstr_or_text_kwarg_is_text_type(**kwargs: T) -> bool:
|
51
|
+
value = kwargs["hexstr"] if "hexstr" in kwargs else kwargs["text"]
|
52
|
+
return is_text(value)
|
53
|
+
|
54
|
+
|
55
|
+
def _assert_hexstr_or_text_kwarg_is_text_type(**kwargs: T) -> None:
|
56
|
+
if not _hexstr_or_text_kwarg_is_text_type(**kwargs):
|
57
|
+
raise TypeError(
|
58
|
+
"Arguments passed as hexstr or text must be of text type. "
|
59
|
+
f"Instead, value was: {(repr(next(iter(list(kwargs.values())))))}"
|
60
|
+
)
|
61
|
+
|
62
|
+
|
63
|
+
def _validate_supported_kwarg(kwargs: Any) -> None:
|
64
|
+
if next(iter(kwargs)) not in ["primitive", "hexstr", "text"]:
|
65
|
+
raise TypeError(
|
66
|
+
"Kwarg must be 'primitive', 'hexstr', or 'text'. "
|
67
|
+
f"Instead, kwarg was: {repr((next(iter(kwargs))))}"
|
68
|
+
)
|
69
|
+
|
70
|
+
|
71
|
+
def validate_conversion_arguments(to_wrap: Callable[..., T]) -> Callable[..., T]:
|
72
|
+
"""
|
73
|
+
Validates arguments for conversion functions.
|
74
|
+
- Only a single argument is present
|
75
|
+
- Kwarg must be 'primitive' 'hexstr' or 'text'
|
76
|
+
- If it is 'hexstr' or 'text' that it is a text type
|
77
|
+
"""
|
78
|
+
|
79
|
+
@functools.wraps(to_wrap)
|
80
|
+
def wrapper(*args: Any, **kwargs: Any) -> T:
|
81
|
+
_assert_one_val(*args, **kwargs)
|
82
|
+
if kwargs:
|
83
|
+
_validate_supported_kwarg(kwargs)
|
84
|
+
|
85
|
+
if len(args) == 0 and "primitive" not in kwargs:
|
86
|
+
_assert_hexstr_or_text_kwarg_is_text_type(**kwargs)
|
87
|
+
return to_wrap(*args, **kwargs)
|
88
|
+
|
89
|
+
return wrapper
|
90
|
+
|
91
|
+
|
92
|
+
def return_arg_type(at_position: int) -> Callable[..., Callable[..., T]]:
|
93
|
+
"""
|
94
|
+
Wrap the return value with the result of `type(args[at_position])`.
|
95
|
+
"""
|
96
|
+
|
97
|
+
def decorator(to_wrap: Callable[..., Any]) -> Callable[..., T]:
|
98
|
+
@functools.wraps(to_wrap)
|
99
|
+
def wrapper(*args: Any, **kwargs: Any) -> T: # type: ignore
|
100
|
+
result = to_wrap(*args, **kwargs)
|
101
|
+
ReturnType = type(args[at_position])
|
102
|
+
return ReturnType(result) # type: ignore
|
103
|
+
|
104
|
+
return wrapper
|
105
|
+
|
106
|
+
return decorator
|
107
|
+
|
108
|
+
|
109
|
+
def replace_exceptions(
|
110
|
+
old_to_new_exceptions: Dict[Type[BaseException], Type[BaseException]]
|
111
|
+
) -> Callable[[Callable[..., T]], Callable[..., T]]:
|
112
|
+
"""
|
113
|
+
Replaces old exceptions with new exceptions to be raised in their place.
|
114
|
+
"""
|
115
|
+
old_exceptions = tuple(old_to_new_exceptions.keys())
|
116
|
+
|
117
|
+
def decorator(to_wrap: Callable[..., T]) -> Callable[..., T]:
|
118
|
+
@functools.wraps(to_wrap)
|
119
|
+
def wrapped(*args: Any, **kwargs: Any) -> T:
|
120
|
+
try:
|
121
|
+
return to_wrap(*args, **kwargs)
|
122
|
+
except old_exceptions as err:
|
123
|
+
try:
|
124
|
+
raise old_to_new_exceptions[type(err)](err) from err
|
125
|
+
except KeyError:
|
126
|
+
raise TypeError(
|
127
|
+
f"could not look up new exception to use for {repr(err)}"
|
128
|
+
) from err
|
129
|
+
|
130
|
+
return wrapped
|
131
|
+
|
132
|
+
return decorator
|
@@ -0,0 +1,75 @@
|
|
1
|
+
import collections
|
2
|
+
import functools
|
3
|
+
import itertools
|
4
|
+
from typing import ( # noqa: F401
|
5
|
+
Any,
|
6
|
+
Callable,
|
7
|
+
Dict,
|
8
|
+
Iterable,
|
9
|
+
List,
|
10
|
+
Mapping,
|
11
|
+
Set,
|
12
|
+
Tuple,
|
13
|
+
TypeVar,
|
14
|
+
Union,
|
15
|
+
)
|
16
|
+
|
17
|
+
from .toolz import (
|
18
|
+
compose as _compose,
|
19
|
+
)
|
20
|
+
|
21
|
+
T = TypeVar("T")
|
22
|
+
|
23
|
+
|
24
|
+
def identity(value: T) -> T:
|
25
|
+
return value
|
26
|
+
|
27
|
+
|
28
|
+
TGIn = TypeVar("TGIn")
|
29
|
+
TGOut = TypeVar("TGOut")
|
30
|
+
TFOut = TypeVar("TFOut")
|
31
|
+
|
32
|
+
|
33
|
+
def combine(
|
34
|
+
f: Callable[[TGOut], TFOut], g: Callable[[TGIn], TGOut]
|
35
|
+
) -> Callable[[TGIn], TFOut]:
|
36
|
+
return lambda x: f(g(x))
|
37
|
+
|
38
|
+
|
39
|
+
def apply_to_return_value(
|
40
|
+
callback: Callable[..., T]
|
41
|
+
) -> Callable[..., Callable[..., T]]:
|
42
|
+
def outer(fn: Callable[..., T]) -> Callable[..., T]:
|
43
|
+
# We would need to type annotate *args and **kwargs but doing so segfaults
|
44
|
+
# the PyPy builds. We ignore instead.
|
45
|
+
@functools.wraps(fn)
|
46
|
+
def inner(*args, **kwargs) -> T: # type: ignore
|
47
|
+
return callback(fn(*args, **kwargs))
|
48
|
+
|
49
|
+
return inner
|
50
|
+
|
51
|
+
return outer
|
52
|
+
|
53
|
+
|
54
|
+
TVal = TypeVar("TVal")
|
55
|
+
TKey = TypeVar("TKey")
|
56
|
+
to_tuple = apply_to_return_value(
|
57
|
+
tuple
|
58
|
+
) # type: Callable[[Callable[..., Iterable[TVal]]], Callable[..., Tuple[TVal, ...]]] # noqa: E501
|
59
|
+
to_list = apply_to_return_value(
|
60
|
+
list
|
61
|
+
) # type: Callable[[Callable[..., Iterable[TVal]]], Callable[..., List[TVal]]] # noqa: E501
|
62
|
+
to_set = apply_to_return_value(
|
63
|
+
set
|
64
|
+
) # type: Callable[[Callable[..., Iterable[TVal]]], Callable[..., Set[TVal]]] # noqa: E501
|
65
|
+
to_dict = apply_to_return_value(
|
66
|
+
dict
|
67
|
+
) # type: Callable[[Callable[..., Iterable[Union[Mapping[TKey, TVal], Tuple[TKey, TVal]]]]], Callable[..., Dict[TKey, TVal]]] # noqa: E501
|
68
|
+
to_ordered_dict = apply_to_return_value(
|
69
|
+
collections.OrderedDict
|
70
|
+
) # type: Callable[[Callable[..., Iterable[Union[Mapping[TKey, TVal], Tuple[TKey, TVal]]]]], Callable[..., collections.OrderedDict[TKey, TVal]]] # noqa: E501
|
71
|
+
sort_return = _compose(to_tuple, apply_to_return_value(sorted))
|
72
|
+
flatten_return = _compose(
|
73
|
+
to_tuple, apply_to_return_value(itertools.chain.from_iterable)
|
74
|
+
)
|
75
|
+
reversed_return = _compose(to_tuple, apply_to_return_value(reversed), to_tuple)
|
@@ -0,0 +1,74 @@
|
|
1
|
+
# String encodings and numeric representations
|
2
|
+
|
3
|
+
import binascii
|
4
|
+
import re
|
5
|
+
from typing import (
|
6
|
+
Any,
|
7
|
+
AnyStr,
|
8
|
+
)
|
9
|
+
|
10
|
+
from ..typing import (
|
11
|
+
HexStr,
|
12
|
+
)
|
13
|
+
|
14
|
+
from .types import (
|
15
|
+
is_string,
|
16
|
+
is_text,
|
17
|
+
)
|
18
|
+
|
19
|
+
_HEX_REGEXP = re.compile("(0[xX])?[0-9a-fA-F]*")
|
20
|
+
|
21
|
+
|
22
|
+
def decode_hex(value: str) -> bytes:
|
23
|
+
if not is_text(value):
|
24
|
+
raise TypeError("Value must be an instance of str")
|
25
|
+
non_prefixed = remove_0x_prefix(HexStr(value))
|
26
|
+
# unhexlify will only accept bytes type someday
|
27
|
+
ascii_hex = non_prefixed.encode("ascii")
|
28
|
+
return binascii.unhexlify(ascii_hex)
|
29
|
+
|
30
|
+
|
31
|
+
def encode_hex(value: AnyStr) -> HexStr:
|
32
|
+
if not is_string(value):
|
33
|
+
raise TypeError("Value must be an instance of str or unicode")
|
34
|
+
elif isinstance(value, (bytes, bytearray)):
|
35
|
+
ascii_bytes = value
|
36
|
+
else:
|
37
|
+
ascii_bytes = value.encode("ascii")
|
38
|
+
|
39
|
+
binary_hex = binascii.hexlify(ascii_bytes)
|
40
|
+
return add_0x_prefix(HexStr(binary_hex.decode("ascii")))
|
41
|
+
|
42
|
+
|
43
|
+
def is_0x_prefixed(value: str) -> bool:
|
44
|
+
if not is_text(value):
|
45
|
+
raise TypeError(
|
46
|
+
f"is_0x_prefixed requires text typed arguments. Got: {repr(value)}"
|
47
|
+
)
|
48
|
+
return value.startswith(("0x", "0X"))
|
49
|
+
|
50
|
+
|
51
|
+
def remove_0x_prefix(value: HexStr) -> HexStr:
|
52
|
+
if is_0x_prefixed(value):
|
53
|
+
return HexStr(value[2:])
|
54
|
+
return value
|
55
|
+
|
56
|
+
|
57
|
+
def add_0x_prefix(value: HexStr) -> HexStr:
|
58
|
+
if is_0x_prefixed(value):
|
59
|
+
return value
|
60
|
+
return HexStr("0x" + value)
|
61
|
+
|
62
|
+
|
63
|
+
def is_hexstr(value: Any) -> bool:
|
64
|
+
if not is_text(value) or not value:
|
65
|
+
return False
|
66
|
+
return _HEX_REGEXP.fullmatch(value) is not None
|
67
|
+
|
68
|
+
|
69
|
+
def is_hex(value: Any) -> bool:
|
70
|
+
if not is_text(value):
|
71
|
+
raise TypeError(f"is_hex requires text typed arguments. Got: {repr(value)}")
|
72
|
+
if not value:
|
73
|
+
return False
|
74
|
+
return _HEX_REGEXP.fullmatch(value) is not None
|