coinex-api 0.0.14__py3-none-any.whl → 0.0.15__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.
Files changed (289) hide show
  1. {coinex_api-0.0.14.dist-info → coinex_api-0.0.15.dist-info}/METADATA +1 -1
  2. coinex_api-0.0.15.dist-info/RECORD +3 -0
  3. coinex/__init__.py +0 -7
  4. coinex/ccxt/__init__.py +0 -101
  5. coinex/ccxt/abstract/coinex.py +0 -237
  6. coinex/ccxt/async_support/__init__.py +0 -80
  7. coinex/ccxt/async_support/base/__init__.py +0 -1
  8. coinex/ccxt/async_support/base/exchange.py +0 -2100
  9. coinex/ccxt/async_support/base/throttler.py +0 -50
  10. coinex/ccxt/async_support/base/ws/__init__.py +0 -38
  11. coinex/ccxt/async_support/base/ws/aiohttp_client.py +0 -147
  12. coinex/ccxt/async_support/base/ws/cache.py +0 -213
  13. coinex/ccxt/async_support/base/ws/client.py +0 -214
  14. coinex/ccxt/async_support/base/ws/fast_client.py +0 -97
  15. coinex/ccxt/async_support/base/ws/functions.py +0 -59
  16. coinex/ccxt/async_support/base/ws/future.py +0 -69
  17. coinex/ccxt/async_support/base/ws/order_book.py +0 -78
  18. coinex/ccxt/async_support/base/ws/order_book_side.py +0 -174
  19. coinex/ccxt/async_support/coinex.py +0 -5833
  20. coinex/ccxt/base/__init__.py +0 -27
  21. coinex/ccxt/base/decimal_to_precision.py +0 -174
  22. coinex/ccxt/base/errors.py +0 -267
  23. coinex/ccxt/base/exchange.py +0 -6769
  24. coinex/ccxt/base/precise.py +0 -297
  25. coinex/ccxt/base/types.py +0 -577
  26. coinex/ccxt/coinex.py +0 -5832
  27. coinex/ccxt/pro/__init__.py +0 -21
  28. coinex/ccxt/pro/coinex.py +0 -1366
  29. coinex/ccxt/static_dependencies/README.md +0 -1
  30. coinex/ccxt/static_dependencies/__init__.py +0 -1
  31. coinex/ccxt/static_dependencies/ecdsa/__init__.py +0 -14
  32. coinex/ccxt/static_dependencies/ecdsa/_version.py +0 -520
  33. coinex/ccxt/static_dependencies/ecdsa/curves.py +0 -56
  34. coinex/ccxt/static_dependencies/ecdsa/der.py +0 -221
  35. coinex/ccxt/static_dependencies/ecdsa/ecdsa.py +0 -310
  36. coinex/ccxt/static_dependencies/ecdsa/ellipticcurve.py +0 -197
  37. coinex/ccxt/static_dependencies/ecdsa/keys.py +0 -332
  38. coinex/ccxt/static_dependencies/ecdsa/numbertheory.py +0 -531
  39. coinex/ccxt/static_dependencies/ecdsa/rfc6979.py +0 -100
  40. coinex/ccxt/static_dependencies/ecdsa/util.py +0 -266
  41. coinex/ccxt/static_dependencies/ethereum/__init__.py +0 -7
  42. coinex/ccxt/static_dependencies/ethereum/abi/__init__.py +0 -16
  43. coinex/ccxt/static_dependencies/ethereum/abi/abi.py +0 -19
  44. coinex/ccxt/static_dependencies/ethereum/abi/base.py +0 -152
  45. coinex/ccxt/static_dependencies/ethereum/abi/codec.py +0 -217
  46. coinex/ccxt/static_dependencies/ethereum/abi/constants.py +0 -3
  47. coinex/ccxt/static_dependencies/ethereum/abi/decoding.py +0 -565
  48. coinex/ccxt/static_dependencies/ethereum/abi/encoding.py +0 -720
  49. coinex/ccxt/static_dependencies/ethereum/abi/exceptions.py +0 -139
  50. coinex/ccxt/static_dependencies/ethereum/abi/grammar.py +0 -443
  51. coinex/ccxt/static_dependencies/ethereum/abi/packed.py +0 -13
  52. coinex/ccxt/static_dependencies/ethereum/abi/py.typed +0 -0
  53. coinex/ccxt/static_dependencies/ethereum/abi/registry.py +0 -643
  54. coinex/ccxt/static_dependencies/ethereum/abi/tools/__init__.py +0 -3
  55. coinex/ccxt/static_dependencies/ethereum/abi/tools/_strategies.py +0 -230
  56. coinex/ccxt/static_dependencies/ethereum/abi/utils/__init__.py +0 -0
  57. coinex/ccxt/static_dependencies/ethereum/abi/utils/numeric.py +0 -83
  58. coinex/ccxt/static_dependencies/ethereum/abi/utils/padding.py +0 -27
  59. coinex/ccxt/static_dependencies/ethereum/abi/utils/string.py +0 -19
  60. coinex/ccxt/static_dependencies/ethereum/account/__init__.py +0 -3
  61. coinex/ccxt/static_dependencies/ethereum/account/encode_typed_data/__init__.py +0 -4
  62. coinex/ccxt/static_dependencies/ethereum/account/encode_typed_data/encoding_and_hashing.py +0 -239
  63. coinex/ccxt/static_dependencies/ethereum/account/encode_typed_data/helpers.py +0 -40
  64. coinex/ccxt/static_dependencies/ethereum/account/messages.py +0 -263
  65. coinex/ccxt/static_dependencies/ethereum/account/py.typed +0 -0
  66. coinex/ccxt/static_dependencies/ethereum/hexbytes/__init__.py +0 -5
  67. coinex/ccxt/static_dependencies/ethereum/hexbytes/_utils.py +0 -54
  68. coinex/ccxt/static_dependencies/ethereum/hexbytes/main.py +0 -65
  69. coinex/ccxt/static_dependencies/ethereum/hexbytes/py.typed +0 -0
  70. coinex/ccxt/static_dependencies/ethereum/typing/__init__.py +0 -63
  71. coinex/ccxt/static_dependencies/ethereum/typing/abi.py +0 -6
  72. coinex/ccxt/static_dependencies/ethereum/typing/bls.py +0 -7
  73. coinex/ccxt/static_dependencies/ethereum/typing/discovery.py +0 -5
  74. coinex/ccxt/static_dependencies/ethereum/typing/encoding.py +0 -7
  75. coinex/ccxt/static_dependencies/ethereum/typing/enums.py +0 -17
  76. coinex/ccxt/static_dependencies/ethereum/typing/ethpm.py +0 -9
  77. coinex/ccxt/static_dependencies/ethereum/typing/evm.py +0 -20
  78. coinex/ccxt/static_dependencies/ethereum/typing/networks.py +0 -1122
  79. coinex/ccxt/static_dependencies/ethereum/typing/py.typed +0 -0
  80. coinex/ccxt/static_dependencies/ethereum/utils/__init__.py +0 -115
  81. coinex/ccxt/static_dependencies/ethereum/utils/abi.py +0 -72
  82. coinex/ccxt/static_dependencies/ethereum/utils/address.py +0 -171
  83. coinex/ccxt/static_dependencies/ethereum/utils/applicators.py +0 -151
  84. coinex/ccxt/static_dependencies/ethereum/utils/conversions.py +0 -190
  85. coinex/ccxt/static_dependencies/ethereum/utils/currency.py +0 -107
  86. coinex/ccxt/static_dependencies/ethereum/utils/curried/__init__.py +0 -269
  87. coinex/ccxt/static_dependencies/ethereum/utils/debug.py +0 -20
  88. coinex/ccxt/static_dependencies/ethereum/utils/decorators.py +0 -132
  89. coinex/ccxt/static_dependencies/ethereum/utils/encoding.py +0 -6
  90. coinex/ccxt/static_dependencies/ethereum/utils/exceptions.py +0 -4
  91. coinex/ccxt/static_dependencies/ethereum/utils/functional.py +0 -75
  92. coinex/ccxt/static_dependencies/ethereum/utils/hexadecimal.py +0 -74
  93. coinex/ccxt/static_dependencies/ethereum/utils/humanize.py +0 -188
  94. coinex/ccxt/static_dependencies/ethereum/utils/logging.py +0 -159
  95. coinex/ccxt/static_dependencies/ethereum/utils/module_loading.py +0 -31
  96. coinex/ccxt/static_dependencies/ethereum/utils/numeric.py +0 -43
  97. coinex/ccxt/static_dependencies/ethereum/utils/py.typed +0 -0
  98. coinex/ccxt/static_dependencies/ethereum/utils/toolz.py +0 -76
  99. coinex/ccxt/static_dependencies/ethereum/utils/types.py +0 -54
  100. coinex/ccxt/static_dependencies/ethereum/utils/typing/__init__.py +0 -18
  101. coinex/ccxt/static_dependencies/ethereum/utils/typing/misc.py +0 -14
  102. coinex/ccxt/static_dependencies/ethereum/utils/units.py +0 -31
  103. coinex/ccxt/static_dependencies/keccak/__init__.py +0 -3
  104. coinex/ccxt/static_dependencies/keccak/keccak.py +0 -197
  105. coinex/ccxt/static_dependencies/lark/__init__.py +0 -38
  106. coinex/ccxt/static_dependencies/lark/__pyinstaller/__init__.py +0 -6
  107. coinex/ccxt/static_dependencies/lark/__pyinstaller/hook-lark.py +0 -14
  108. coinex/ccxt/static_dependencies/lark/ast_utils.py +0 -59
  109. coinex/ccxt/static_dependencies/lark/common.py +0 -86
  110. coinex/ccxt/static_dependencies/lark/exceptions.py +0 -292
  111. coinex/ccxt/static_dependencies/lark/grammar.py +0 -130
  112. coinex/ccxt/static_dependencies/lark/grammars/__init__.py +0 -0
  113. coinex/ccxt/static_dependencies/lark/grammars/common.lark +0 -59
  114. coinex/ccxt/static_dependencies/lark/grammars/lark.lark +0 -62
  115. coinex/ccxt/static_dependencies/lark/grammars/python.lark +0 -302
  116. coinex/ccxt/static_dependencies/lark/grammars/unicode.lark +0 -7
  117. coinex/ccxt/static_dependencies/lark/indenter.py +0 -143
  118. coinex/ccxt/static_dependencies/lark/lark.py +0 -658
  119. coinex/ccxt/static_dependencies/lark/lexer.py +0 -678
  120. coinex/ccxt/static_dependencies/lark/load_grammar.py +0 -1428
  121. coinex/ccxt/static_dependencies/lark/parse_tree_builder.py +0 -391
  122. coinex/ccxt/static_dependencies/lark/parser_frontends.py +0 -257
  123. coinex/ccxt/static_dependencies/lark/parsers/__init__.py +0 -0
  124. coinex/ccxt/static_dependencies/lark/parsers/cyk.py +0 -340
  125. coinex/ccxt/static_dependencies/lark/parsers/earley.py +0 -314
  126. coinex/ccxt/static_dependencies/lark/parsers/earley_common.py +0 -42
  127. coinex/ccxt/static_dependencies/lark/parsers/earley_forest.py +0 -801
  128. coinex/ccxt/static_dependencies/lark/parsers/grammar_analysis.py +0 -203
  129. coinex/ccxt/static_dependencies/lark/parsers/lalr_analysis.py +0 -332
  130. coinex/ccxt/static_dependencies/lark/parsers/lalr_interactive_parser.py +0 -158
  131. coinex/ccxt/static_dependencies/lark/parsers/lalr_parser.py +0 -122
  132. coinex/ccxt/static_dependencies/lark/parsers/lalr_parser_state.py +0 -110
  133. coinex/ccxt/static_dependencies/lark/parsers/xearley.py +0 -165
  134. coinex/ccxt/static_dependencies/lark/py.typed +0 -0
  135. coinex/ccxt/static_dependencies/lark/reconstruct.py +0 -107
  136. coinex/ccxt/static_dependencies/lark/tools/__init__.py +0 -70
  137. coinex/ccxt/static_dependencies/lark/tools/nearley.py +0 -202
  138. coinex/ccxt/static_dependencies/lark/tools/serialize.py +0 -32
  139. coinex/ccxt/static_dependencies/lark/tools/standalone.py +0 -196
  140. coinex/ccxt/static_dependencies/lark/tree.py +0 -267
  141. coinex/ccxt/static_dependencies/lark/tree_matcher.py +0 -186
  142. coinex/ccxt/static_dependencies/lark/tree_templates.py +0 -180
  143. coinex/ccxt/static_dependencies/lark/utils.py +0 -343
  144. coinex/ccxt/static_dependencies/lark/visitors.py +0 -596
  145. coinex/ccxt/static_dependencies/marshmallow/__init__.py +0 -81
  146. coinex/ccxt/static_dependencies/marshmallow/base.py +0 -65
  147. coinex/ccxt/static_dependencies/marshmallow/class_registry.py +0 -94
  148. coinex/ccxt/static_dependencies/marshmallow/decorators.py +0 -231
  149. coinex/ccxt/static_dependencies/marshmallow/error_store.py +0 -60
  150. coinex/ccxt/static_dependencies/marshmallow/exceptions.py +0 -71
  151. coinex/ccxt/static_dependencies/marshmallow/fields.py +0 -2114
  152. coinex/ccxt/static_dependencies/marshmallow/orderedset.py +0 -89
  153. coinex/ccxt/static_dependencies/marshmallow/py.typed +0 -0
  154. coinex/ccxt/static_dependencies/marshmallow/schema.py +0 -1228
  155. coinex/ccxt/static_dependencies/marshmallow/types.py +0 -12
  156. coinex/ccxt/static_dependencies/marshmallow/utils.py +0 -378
  157. coinex/ccxt/static_dependencies/marshmallow/validate.py +0 -678
  158. coinex/ccxt/static_dependencies/marshmallow/warnings.py +0 -2
  159. coinex/ccxt/static_dependencies/marshmallow_dataclass/__init__.py +0 -1047
  160. coinex/ccxt/static_dependencies/marshmallow_dataclass/collection_field.py +0 -51
  161. coinex/ccxt/static_dependencies/marshmallow_dataclass/lazy_class_attribute.py +0 -45
  162. coinex/ccxt/static_dependencies/marshmallow_dataclass/mypy.py +0 -71
  163. coinex/ccxt/static_dependencies/marshmallow_dataclass/py.typed +0 -0
  164. coinex/ccxt/static_dependencies/marshmallow_dataclass/typing.py +0 -14
  165. coinex/ccxt/static_dependencies/marshmallow_dataclass/union_field.py +0 -82
  166. coinex/ccxt/static_dependencies/marshmallow_oneofschema/__init__.py +0 -1
  167. coinex/ccxt/static_dependencies/marshmallow_oneofschema/one_of_schema.py +0 -193
  168. coinex/ccxt/static_dependencies/marshmallow_oneofschema/py.typed +0 -0
  169. coinex/ccxt/static_dependencies/msgpack/__init__.py +0 -55
  170. coinex/ccxt/static_dependencies/msgpack/_cmsgpack.pyx +0 -11
  171. coinex/ccxt/static_dependencies/msgpack/_packer.pyx +0 -374
  172. coinex/ccxt/static_dependencies/msgpack/_unpacker.pyx +0 -547
  173. coinex/ccxt/static_dependencies/msgpack/buff_converter.h +0 -8
  174. coinex/ccxt/static_dependencies/msgpack/exceptions.py +0 -48
  175. coinex/ccxt/static_dependencies/msgpack/ext.py +0 -168
  176. coinex/ccxt/static_dependencies/msgpack/fallback.py +0 -951
  177. coinex/ccxt/static_dependencies/msgpack/pack.h +0 -89
  178. coinex/ccxt/static_dependencies/msgpack/pack_template.h +0 -820
  179. coinex/ccxt/static_dependencies/msgpack/sysdep.h +0 -194
  180. coinex/ccxt/static_dependencies/msgpack/unpack.h +0 -391
  181. coinex/ccxt/static_dependencies/msgpack/unpack_define.h +0 -95
  182. coinex/ccxt/static_dependencies/msgpack/unpack_template.h +0 -464
  183. coinex/ccxt/static_dependencies/parsimonious/__init__.py +0 -10
  184. coinex/ccxt/static_dependencies/parsimonious/exceptions.py +0 -105
  185. coinex/ccxt/static_dependencies/parsimonious/expressions.py +0 -479
  186. coinex/ccxt/static_dependencies/parsimonious/grammar.py +0 -487
  187. coinex/ccxt/static_dependencies/parsimonious/nodes.py +0 -325
  188. coinex/ccxt/static_dependencies/parsimonious/utils.py +0 -40
  189. coinex/ccxt/static_dependencies/starknet/__init__.py +0 -0
  190. coinex/ccxt/static_dependencies/starknet/abi/v0/__init__.py +0 -2
  191. coinex/ccxt/static_dependencies/starknet/abi/v0/model.py +0 -44
  192. coinex/ccxt/static_dependencies/starknet/abi/v0/parser.py +0 -216
  193. coinex/ccxt/static_dependencies/starknet/abi/v0/schemas.py +0 -72
  194. coinex/ccxt/static_dependencies/starknet/abi/v0/shape.py +0 -63
  195. coinex/ccxt/static_dependencies/starknet/abi/v1/__init__.py +0 -2
  196. coinex/ccxt/static_dependencies/starknet/abi/v1/core_structures.json +0 -14
  197. coinex/ccxt/static_dependencies/starknet/abi/v1/model.py +0 -39
  198. coinex/ccxt/static_dependencies/starknet/abi/v1/parser.py +0 -220
  199. coinex/ccxt/static_dependencies/starknet/abi/v1/parser_transformer.py +0 -179
  200. coinex/ccxt/static_dependencies/starknet/abi/v1/schemas.py +0 -66
  201. coinex/ccxt/static_dependencies/starknet/abi/v1/shape.py +0 -47
  202. coinex/ccxt/static_dependencies/starknet/abi/v2/__init__.py +0 -2
  203. coinex/ccxt/static_dependencies/starknet/abi/v2/model.py +0 -89
  204. coinex/ccxt/static_dependencies/starknet/abi/v2/parser.py +0 -293
  205. coinex/ccxt/static_dependencies/starknet/abi/v2/parser_transformer.py +0 -192
  206. coinex/ccxt/static_dependencies/starknet/abi/v2/schemas.py +0 -132
  207. coinex/ccxt/static_dependencies/starknet/abi/v2/shape.py +0 -107
  208. coinex/ccxt/static_dependencies/starknet/cairo/__init__.py +0 -0
  209. coinex/ccxt/static_dependencies/starknet/cairo/data_types.py +0 -123
  210. coinex/ccxt/static_dependencies/starknet/cairo/deprecated_parse/__init__.py +0 -0
  211. coinex/ccxt/static_dependencies/starknet/cairo/deprecated_parse/cairo_types.py +0 -77
  212. coinex/ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser.py +0 -46
  213. coinex/ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser_transformer.py +0 -138
  214. coinex/ccxt/static_dependencies/starknet/cairo/felt.py +0 -64
  215. coinex/ccxt/static_dependencies/starknet/cairo/type_parser.py +0 -121
  216. coinex/ccxt/static_dependencies/starknet/cairo/v1/__init__.py +0 -0
  217. coinex/ccxt/static_dependencies/starknet/cairo/v1/type_parser.py +0 -59
  218. coinex/ccxt/static_dependencies/starknet/cairo/v2/__init__.py +0 -0
  219. coinex/ccxt/static_dependencies/starknet/cairo/v2/type_parser.py +0 -77
  220. coinex/ccxt/static_dependencies/starknet/ccxt_utils.py +0 -7
  221. coinex/ccxt/static_dependencies/starknet/common.py +0 -15
  222. coinex/ccxt/static_dependencies/starknet/constants.py +0 -39
  223. coinex/ccxt/static_dependencies/starknet/hash/__init__.py +0 -0
  224. coinex/ccxt/static_dependencies/starknet/hash/address.py +0 -79
  225. coinex/ccxt/static_dependencies/starknet/hash/compiled_class_hash_objects.py +0 -111
  226. coinex/ccxt/static_dependencies/starknet/hash/selector.py +0 -16
  227. coinex/ccxt/static_dependencies/starknet/hash/storage.py +0 -12
  228. coinex/ccxt/static_dependencies/starknet/hash/utils.py +0 -78
  229. coinex/ccxt/static_dependencies/starknet/models/__init__.py +0 -0
  230. coinex/ccxt/static_dependencies/starknet/models/typed_data.py +0 -45
  231. coinex/ccxt/static_dependencies/starknet/serialization/__init__.py +0 -24
  232. coinex/ccxt/static_dependencies/starknet/serialization/_calldata_reader.py +0 -40
  233. coinex/ccxt/static_dependencies/starknet/serialization/_context.py +0 -142
  234. coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/__init__.py +0 -10
  235. coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/_common.py +0 -82
  236. coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/array_serializer.py +0 -43
  237. coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/bool_serializer.py +0 -37
  238. coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/byte_array_serializer.py +0 -66
  239. coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/cairo_data_serializer.py +0 -71
  240. coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/enum_serializer.py +0 -71
  241. coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/felt_serializer.py +0 -50
  242. coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/named_tuple_serializer.py +0 -58
  243. coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/option_serializer.py +0 -43
  244. coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/output_serializer.py +0 -40
  245. coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/payload_serializer.py +0 -72
  246. coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/struct_serializer.py +0 -36
  247. coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/tuple_serializer.py +0 -36
  248. coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/uint256_serializer.py +0 -76
  249. coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/uint_serializer.py +0 -100
  250. coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/unit_serializer.py +0 -32
  251. coinex/ccxt/static_dependencies/starknet/serialization/errors.py +0 -10
  252. coinex/ccxt/static_dependencies/starknet/serialization/factory.py +0 -229
  253. coinex/ccxt/static_dependencies/starknet/serialization/function_serialization_adapter.py +0 -110
  254. coinex/ccxt/static_dependencies/starknet/serialization/tuple_dataclass.py +0 -59
  255. coinex/ccxt/static_dependencies/starknet/utils/__init__.py +0 -0
  256. coinex/ccxt/static_dependencies/starknet/utils/constructor_args_translator.py +0 -86
  257. coinex/ccxt/static_dependencies/starknet/utils/iterable.py +0 -13
  258. coinex/ccxt/static_dependencies/starknet/utils/schema.py +0 -13
  259. coinex/ccxt/static_dependencies/starknet/utils/typed_data.py +0 -182
  260. coinex/ccxt/static_dependencies/starkware/__init__.py +0 -0
  261. coinex/ccxt/static_dependencies/starkware/crypto/__init__.py +0 -0
  262. coinex/ccxt/static_dependencies/starkware/crypto/fast_pedersen_hash.py +0 -50
  263. coinex/ccxt/static_dependencies/starkware/crypto/math_utils.py +0 -78
  264. coinex/ccxt/static_dependencies/starkware/crypto/signature.py +0 -2344
  265. coinex/ccxt/static_dependencies/starkware/crypto/utils.py +0 -63
  266. coinex/ccxt/static_dependencies/sympy/__init__.py +0 -0
  267. coinex/ccxt/static_dependencies/sympy/core/__init__.py +0 -0
  268. coinex/ccxt/static_dependencies/sympy/core/intfunc.py +0 -35
  269. coinex/ccxt/static_dependencies/sympy/external/__init__.py +0 -0
  270. coinex/ccxt/static_dependencies/sympy/external/gmpy.py +0 -345
  271. coinex/ccxt/static_dependencies/sympy/external/importtools.py +0 -187
  272. coinex/ccxt/static_dependencies/sympy/external/ntheory.py +0 -637
  273. coinex/ccxt/static_dependencies/sympy/external/pythonmpq.py +0 -341
  274. coinex/ccxt/static_dependencies/toolz/__init__.py +0 -26
  275. coinex/ccxt/static_dependencies/toolz/_signatures.py +0 -784
  276. coinex/ccxt/static_dependencies/toolz/_version.py +0 -520
  277. coinex/ccxt/static_dependencies/toolz/compatibility.py +0 -30
  278. coinex/ccxt/static_dependencies/toolz/curried/__init__.py +0 -101
  279. coinex/ccxt/static_dependencies/toolz/curried/exceptions.py +0 -22
  280. coinex/ccxt/static_dependencies/toolz/curried/operator.py +0 -22
  281. coinex/ccxt/static_dependencies/toolz/dicttoolz.py +0 -339
  282. coinex/ccxt/static_dependencies/toolz/functoolz.py +0 -1049
  283. coinex/ccxt/static_dependencies/toolz/itertoolz.py +0 -1057
  284. coinex/ccxt/static_dependencies/toolz/recipes.py +0 -46
  285. coinex/ccxt/static_dependencies/toolz/utils.py +0 -9
  286. coinex/ccxt/static_dependencies/typing_inspect/__init__.py +0 -0
  287. coinex/ccxt/static_dependencies/typing_inspect/typing_inspect.py +0 -851
  288. coinex_api-0.0.14.dist-info/RECORD +0 -288
  289. {coinex_api-0.0.14.dist-info → coinex_api-0.0.15.dist-info}/WHEEL +0 -0
@@ -1,202 +0,0 @@
1
- "Converts Nearley grammars to Lark"
2
-
3
- import os.path
4
- import sys
5
- import codecs
6
- import argparse
7
-
8
-
9
- from lark import Lark, Transformer, v_args
10
-
11
- nearley_grammar = r"""
12
- start: (ruledef|directive)+
13
-
14
- directive: "@" NAME (STRING|NAME)
15
- | "@" JS -> js_code
16
- ruledef: NAME "->" expansions
17
- | NAME REGEXP "->" expansions -> macro
18
- expansions: expansion ("|" expansion)*
19
-
20
- expansion: expr+ js
21
-
22
- ?expr: item (":" /[+*?]/)?
23
-
24
- ?item: rule|string|regexp|null
25
- | "(" expansions ")"
26
-
27
- rule: NAME
28
- string: STRING
29
- regexp: REGEXP
30
- null: "null"
31
- JS: /{%.*?%}/s
32
- js: JS?
33
-
34
- NAME: /[a-zA-Z_$]\w*/
35
- COMMENT: /#[^\n]*/
36
- REGEXP: /\[.*?\]/
37
-
38
- STRING: _STRING "i"?
39
-
40
- %import common.ESCAPED_STRING -> _STRING
41
- %import common.WS
42
- %ignore WS
43
- %ignore COMMENT
44
-
45
- """
46
-
47
- nearley_grammar_parser = Lark(nearley_grammar, parser='earley', lexer='basic')
48
-
49
- def _get_rulename(name):
50
- name = {'_': '_ws_maybe', '__': '_ws'}.get(name, name)
51
- return 'n_' + name.replace('$', '__DOLLAR__').lower()
52
-
53
- @v_args(inline=True)
54
- class NearleyToLark(Transformer):
55
- def __init__(self):
56
- self._count = 0
57
- self.extra_rules = {}
58
- self.extra_rules_rev = {}
59
- self.alias_js_code = {}
60
-
61
- def _new_function(self, code):
62
- name = 'alias_%d' % self._count
63
- self._count += 1
64
-
65
- self.alias_js_code[name] = code
66
- return name
67
-
68
- def _extra_rule(self, rule):
69
- if rule in self.extra_rules_rev:
70
- return self.extra_rules_rev[rule]
71
-
72
- name = 'xrule_%d' % len(self.extra_rules)
73
- assert name not in self.extra_rules
74
- self.extra_rules[name] = rule
75
- self.extra_rules_rev[rule] = name
76
- return name
77
-
78
- def rule(self, name):
79
- return _get_rulename(name)
80
-
81
- def ruledef(self, name, exps):
82
- return '!%s: %s' % (_get_rulename(name), exps)
83
-
84
- def expr(self, item, op):
85
- rule = '(%s)%s' % (item, op)
86
- return self._extra_rule(rule)
87
-
88
- def regexp(self, r):
89
- return '/%s/' % r
90
-
91
- def null(self):
92
- return ''
93
-
94
- def string(self, s):
95
- return self._extra_rule(s)
96
-
97
- def expansion(self, *x):
98
- x, js = x[:-1], x[-1]
99
- if js.children:
100
- js_code ,= js.children
101
- js_code = js_code[2:-2]
102
- alias = '-> ' + self._new_function(js_code)
103
- else:
104
- alias = ''
105
- return ' '.join(x) + alias
106
-
107
- def expansions(self, *x):
108
- return '%s' % ('\n |'.join(x))
109
-
110
- def start(self, *rules):
111
- return '\n'.join(filter(None, rules))
112
-
113
- def _nearley_to_lark(g, builtin_path, n2l, js_code, folder_path, includes):
114
- rule_defs = []
115
-
116
- tree = nearley_grammar_parser.parse(g)
117
- for statement in tree.children:
118
- if statement.data == 'directive':
119
- directive, arg = statement.children
120
- if directive in ('builtin', 'include'):
121
- folder = builtin_path if directive == 'builtin' else folder_path
122
- path = os.path.join(folder, arg[1:-1])
123
- if path not in includes:
124
- includes.add(path)
125
- with codecs.open(path, encoding='utf8') as f:
126
- text = f.read()
127
- rule_defs += _nearley_to_lark(text, builtin_path, n2l, js_code, os.path.abspath(os.path.dirname(path)), includes)
128
- else:
129
- assert False, directive
130
- elif statement.data == 'js_code':
131
- code ,= statement.children
132
- code = code[2:-2]
133
- js_code.append(code)
134
- elif statement.data == 'macro':
135
- pass # TODO Add support for macros!
136
- elif statement.data == 'ruledef':
137
- rule_defs.append(n2l.transform(statement))
138
- else:
139
- raise Exception("Unknown statement: %s" % statement)
140
-
141
- return rule_defs
142
-
143
-
144
- def create_code_for_nearley_grammar(g, start, builtin_path, folder_path, es6=False):
145
- import js2py
146
-
147
- emit_code = []
148
- def emit(x=None):
149
- if x:
150
- emit_code.append(x)
151
- emit_code.append('\n')
152
-
153
- js_code = ['function id(x) {return x[0];}']
154
- n2l = NearleyToLark()
155
- rule_defs = _nearley_to_lark(g, builtin_path, n2l, js_code, folder_path, set())
156
- lark_g = '\n'.join(rule_defs)
157
- lark_g += '\n'+'\n'.join('!%s: %s' % item for item in n2l.extra_rules.items())
158
-
159
- emit('from lark import Lark, Transformer')
160
- emit()
161
- emit('grammar = ' + repr(lark_g))
162
- emit()
163
-
164
- for alias, code in n2l.alias_js_code.items():
165
- js_code.append('%s = (%s);' % (alias, code))
166
-
167
- if es6:
168
- emit(js2py.translate_js6('\n'.join(js_code)))
169
- else:
170
- emit(js2py.translate_js('\n'.join(js_code)))
171
- emit('class TransformNearley(Transformer):')
172
- for alias in n2l.alias_js_code:
173
- emit(" %s = var.get('%s').to_python()" % (alias, alias))
174
- emit(" __default__ = lambda self, n, c, m: c if c else None")
175
-
176
- emit()
177
- emit('parser = Lark(grammar, start="n_%s", maybe_placeholders=False)' % start)
178
- emit('def parse(text):')
179
- emit(' return TransformNearley().transform(parser.parse(text))')
180
-
181
- return ''.join(emit_code)
182
-
183
- def main(fn, start, nearley_lib, es6=False):
184
- with codecs.open(fn, encoding='utf8') as f:
185
- grammar = f.read()
186
- return create_code_for_nearley_grammar(grammar, start, os.path.join(nearley_lib, 'builtin'), os.path.abspath(os.path.dirname(fn)), es6=es6)
187
-
188
- def get_arg_parser():
189
- parser = argparse.ArgumentParser(description='Reads a Nearley grammar (with js functions), and outputs an equivalent lark parser.')
190
- parser.add_argument('nearley_grammar', help='Path to the file containing the nearley grammar')
191
- parser.add_argument('start_rule', help='Rule within the nearley grammar to make the base rule')
192
- parser.add_argument('nearley_lib', help='Path to root directory of nearley codebase (used for including builtins)')
193
- parser.add_argument('--es6', help='Enable experimental ES6 support', action='store_true')
194
- return parser
195
-
196
- if __name__ == '__main__':
197
- parser = get_arg_parser()
198
- if len(sys.argv) == 1:
199
- parser.print_help(sys.stderr)
200
- sys.exit(1)
201
- args = parser.parse_args()
202
- print(main(fn=args.nearley_grammar, start=args.start_rule, nearley_lib=args.nearley_lib, es6=args.es6))
@@ -1,32 +0,0 @@
1
- import sys
2
- import json
3
-
4
- from lark.grammar import Rule
5
- from lark.lexer import TerminalDef
6
- from lark.tools import lalr_argparser, build_lalr
7
-
8
- import argparse
9
-
10
- argparser = argparse.ArgumentParser(prog='python -m lark.tools.serialize', parents=[lalr_argparser],
11
- description="Lark Serialization Tool - Stores Lark's internal state & LALR analysis as a JSON file",
12
- epilog='Look at the Lark documentation for more info on the options')
13
-
14
-
15
- def serialize(lark_inst, outfile):
16
- data, memo = lark_inst.memo_serialize([TerminalDef, Rule])
17
- outfile.write('{\n')
18
- outfile.write(' "data": %s,\n' % json.dumps(data))
19
- outfile.write(' "memo": %s\n' % json.dumps(memo))
20
- outfile.write('}\n')
21
-
22
-
23
- def main():
24
- if len(sys.argv)==1:
25
- argparser.print_help(sys.stderr)
26
- sys.exit(1)
27
- ns = argparser.parse_args()
28
- serialize(*build_lalr(ns))
29
-
30
-
31
- if __name__ == '__main__':
32
- main()
@@ -1,196 +0,0 @@
1
- ###{standalone
2
- #
3
- #
4
- # Lark Stand-alone Generator Tool
5
- # ----------------------------------
6
- # Generates a stand-alone LALR(1) parser
7
- #
8
- # Git: https://github.com/erezsh/lark
9
- # Author: Erez Shinan (erezshin@gmail.com)
10
- #
11
- #
12
- # >>> LICENSE
13
- #
14
- # This tool and its generated code use a separate license from Lark,
15
- # and are subject to the terms of the Mozilla Public License, v. 2.0.
16
- # If a copy of the MPL was not distributed with this
17
- # file, You can obtain one at https://mozilla.org/MPL/2.0/.
18
- #
19
- # If you wish to purchase a commercial license for this tool and its
20
- # generated code, you may contact me via email or otherwise.
21
- #
22
- # If MPL2 is incompatible with your free or open-source project,
23
- # contact me and we'll work it out.
24
- #
25
- #
26
-
27
- from copy import deepcopy
28
- from abc import ABC, abstractmethod
29
- from types import ModuleType
30
- from typing import (
31
- TypeVar, Generic, Type, Tuple, List, Dict, Iterator, Collection, Callable, Optional, FrozenSet, Any,
32
- Union, Iterable, IO, TYPE_CHECKING, overload, Sequence,
33
- Pattern as REPattern, ClassVar, Set, Mapping
34
- )
35
- ###}
36
-
37
- import sys
38
- import token, tokenize
39
- import os
40
- from os import path
41
- from collections import defaultdict
42
- from functools import partial
43
- from argparse import ArgumentParser
44
-
45
- import lark
46
- from lark.tools import lalr_argparser, build_lalr, make_warnings_comments
47
-
48
-
49
- from lark.grammar import Rule
50
- from lark.lexer import TerminalDef
51
-
52
- _dir = path.dirname(__file__)
53
- _larkdir = path.join(_dir, path.pardir)
54
-
55
-
56
- EXTRACT_STANDALONE_FILES = [
57
- 'tools/standalone.py',
58
- 'exceptions.py',
59
- 'utils.py',
60
- 'tree.py',
61
- 'visitors.py',
62
- 'grammar.py',
63
- 'lexer.py',
64
- 'common.py',
65
- 'parse_tree_builder.py',
66
- 'parsers/lalr_analysis.py',
67
- 'parsers/lalr_parser_state.py',
68
- 'parsers/lalr_parser.py',
69
- 'parsers/lalr_interactive_parser.py',
70
- 'parser_frontends.py',
71
- 'lark.py',
72
- 'indenter.py',
73
- ]
74
-
75
- def extract_sections(lines):
76
- section = None
77
- text = []
78
- sections = defaultdict(list)
79
- for line in lines:
80
- if line.startswith('###'):
81
- if line[3] == '{':
82
- section = line[4:].strip()
83
- elif line[3] == '}':
84
- sections[section] += text
85
- section = None
86
- text = []
87
- else:
88
- raise ValueError(line)
89
- elif section:
90
- text.append(line)
91
-
92
- return {name: ''.join(text) for name, text in sections.items()}
93
-
94
-
95
- def strip_docstrings(line_gen):
96
- """ Strip comments and docstrings from a file.
97
- Based on code from: https://stackoverflow.com/questions/1769332/script-to-remove-python-comments-docstrings
98
- """
99
- res = []
100
-
101
- prev_toktype = token.INDENT
102
- last_lineno = -1
103
- last_col = 0
104
-
105
- tokgen = tokenize.generate_tokens(line_gen)
106
- for toktype, ttext, (slineno, scol), (elineno, ecol), ltext in tokgen:
107
- if slineno > last_lineno:
108
- last_col = 0
109
- if scol > last_col:
110
- res.append(" " * (scol - last_col))
111
- if toktype == token.STRING and prev_toktype == token.INDENT:
112
- # Docstring
113
- res.append("#--")
114
- elif toktype == tokenize.COMMENT:
115
- # Comment
116
- res.append("##\n")
117
- else:
118
- res.append(ttext)
119
- prev_toktype = toktype
120
- last_col = ecol
121
- last_lineno = elineno
122
-
123
- return ''.join(res)
124
-
125
-
126
- def gen_standalone(lark_inst, output=None, out=sys.stdout, compress=False):
127
- if output is None:
128
- output = partial(print, file=out)
129
-
130
- import pickle, zlib, base64
131
- def compressed_output(obj):
132
- s = pickle.dumps(obj, pickle.HIGHEST_PROTOCOL)
133
- c = zlib.compress(s)
134
- output(repr(base64.b64encode(c)))
135
-
136
- def output_decompress(name):
137
- output('%(name)s = pickle.loads(zlib.decompress(base64.b64decode(%(name)s)))' % locals())
138
-
139
- output('# The file was automatically generated by Lark v%s' % lark.__version__)
140
- output('__version__ = "%s"' % lark.__version__)
141
- output()
142
-
143
- for i, pyfile in enumerate(EXTRACT_STANDALONE_FILES):
144
- with open(os.path.join(_larkdir, pyfile)) as f:
145
- code = extract_sections(f)['standalone']
146
- if i: # if not this file
147
- code = strip_docstrings(partial(next, iter(code.splitlines(True))))
148
- output(code)
149
-
150
- data, m = lark_inst.memo_serialize([TerminalDef, Rule])
151
- output('import pickle, zlib, base64')
152
- if compress:
153
- output('DATA = (')
154
- compressed_output(data)
155
- output(')')
156
- output_decompress('DATA')
157
- output('MEMO = (')
158
- compressed_output(m)
159
- output(')')
160
- output_decompress('MEMO')
161
- else:
162
- output('DATA = (')
163
- output(data)
164
- output(')')
165
- output('MEMO = (')
166
- output(m)
167
- output(')')
168
-
169
-
170
- output('Shift = 0')
171
- output('Reduce = 1')
172
- output("def Lark_StandAlone(**kwargs):")
173
- output(" return Lark._load_from_dict(DATA, MEMO, **kwargs)")
174
-
175
-
176
-
177
-
178
- def main():
179
- make_warnings_comments()
180
- parser = ArgumentParser(prog="prog='python -m lark.tools.standalone'", description="Lark Stand-alone Generator Tool",
181
- parents=[lalr_argparser], epilog='Look at the Lark documentation for more info on the options')
182
- parser.add_argument('-c', '--compress', action='store_true', default=0, help="Enable compression")
183
- if len(sys.argv) == 1:
184
- parser.print_help(sys.stderr)
185
- sys.exit(1)
186
- ns = parser.parse_args()
187
-
188
- lark_inst, out = build_lalr(ns)
189
- gen_standalone(lark_inst, out=out, compress=ns.compress)
190
-
191
- ns.out.close()
192
- ns.grammar_file.close()
193
-
194
-
195
- if __name__ == '__main__':
196
- main()
@@ -1,267 +0,0 @@
1
- import sys
2
- from copy import deepcopy
3
-
4
- from typing import List, Callable, Iterator, Union, Optional, Generic, TypeVar, TYPE_CHECKING
5
-
6
- if TYPE_CHECKING:
7
- from .lexer import TerminalDef, Token
8
- try:
9
- import rich
10
- except ImportError:
11
- pass
12
- from typing import Literal
13
-
14
- ###{standalone
15
-
16
- class Meta:
17
-
18
- empty: bool
19
- line: int
20
- column: int
21
- start_pos: int
22
- end_line: int
23
- end_column: int
24
- end_pos: int
25
- orig_expansion: 'List[TerminalDef]'
26
- match_tree: bool
27
-
28
- def __init__(self):
29
- self.empty = True
30
-
31
-
32
- _Leaf_T = TypeVar("_Leaf_T")
33
- Branch = Union[_Leaf_T, 'Tree[_Leaf_T]']
34
-
35
-
36
- class Tree(Generic[_Leaf_T]):
37
- """The main tree class.
38
-
39
- Creates a new tree, and stores "data" and "children" in attributes of the same name.
40
- Trees can be hashed and compared.
41
-
42
- Parameters:
43
- data: The name of the rule or alias
44
- children: List of matched sub-rules and terminals
45
- meta: Line & Column numbers (if ``propagate_positions`` is enabled).
46
- meta attributes: (line, column, end_line, end_column, start_pos, end_pos,
47
- container_line, container_column, container_end_line, container_end_column)
48
- container_* attributes consider all symbols, including those that have been inlined in the tree.
49
- For example, in the rule 'a: _A B _C', the regular attributes will mark the start and end of B,
50
- but the container_* attributes will also include _A and _C in the range. However, rules that
51
- contain 'a' will consider it in full, including _A and _C for all attributes.
52
- """
53
-
54
- data: str
55
- children: 'List[Branch[_Leaf_T]]'
56
-
57
- def __init__(self, data: str, children: 'List[Branch[_Leaf_T]]', meta: Optional[Meta]=None) -> None:
58
- self.data = data
59
- self.children = children
60
- self._meta = meta
61
-
62
- @property
63
- def meta(self) -> Meta:
64
- if self._meta is None:
65
- self._meta = Meta()
66
- return self._meta
67
-
68
- def __repr__(self):
69
- return 'Tree(%r, %r)' % (self.data, self.children)
70
-
71
- def _pretty_label(self):
72
- return self.data
73
-
74
- def _pretty(self, level, indent_str):
75
- yield f'{indent_str*level}{self._pretty_label()}'
76
- if len(self.children) == 1 and not isinstance(self.children[0], Tree):
77
- yield f'\t{self.children[0]}\n'
78
- else:
79
- yield '\n'
80
- for n in self.children:
81
- if isinstance(n, Tree):
82
- yield from n._pretty(level+1, indent_str)
83
- else:
84
- yield f'{indent_str*(level+1)}{n}\n'
85
-
86
- def pretty(self, indent_str: str=' ') -> str:
87
- """Returns an indented string representation of the tree.
88
-
89
- Great for debugging.
90
- """
91
- return ''.join(self._pretty(0, indent_str))
92
-
93
- def __rich__(self, parent:Optional['rich.tree.Tree']=None) -> 'rich.tree.Tree':
94
- """Returns a tree widget for the 'rich' library.
95
-
96
- Example:
97
- ::
98
- from rich import print
99
- from lark import Tree
100
-
101
- tree = Tree('root', ['node1', 'node2'])
102
- print(tree)
103
- """
104
- return self._rich(parent)
105
-
106
- def _rich(self, parent):
107
- if parent:
108
- tree = parent.add(f'[bold]{self.data}[/bold]')
109
- else:
110
- import rich.tree
111
- tree = rich.tree.Tree(self.data)
112
-
113
- for c in self.children:
114
- if isinstance(c, Tree):
115
- c._rich(tree)
116
- else:
117
- tree.add(f'[green]{c}[/green]')
118
-
119
- return tree
120
-
121
- def __eq__(self, other):
122
- try:
123
- return self.data == other.data and self.children == other.children
124
- except AttributeError:
125
- return False
126
-
127
- def __ne__(self, other):
128
- return not (self == other)
129
-
130
- def __hash__(self) -> int:
131
- return hash((self.data, tuple(self.children)))
132
-
133
- def iter_subtrees(self) -> 'Iterator[Tree[_Leaf_T]]':
134
- """Depth-first iteration.
135
-
136
- Iterates over all the subtrees, never returning to the same node twice (Lark's parse-tree is actually a DAG).
137
- """
138
- queue = [self]
139
- subtrees = dict()
140
- for subtree in queue:
141
- subtrees[id(subtree)] = subtree
142
- queue += [c for c in reversed(subtree.children)
143
- if isinstance(c, Tree) and id(c) not in subtrees]
144
-
145
- del queue
146
- return reversed(list(subtrees.values()))
147
-
148
- def iter_subtrees_topdown(self):
149
- """Breadth-first iteration.
150
-
151
- Iterates over all the subtrees, return nodes in order like pretty() does.
152
- """
153
- stack = [self]
154
- stack_append = stack.append
155
- stack_pop = stack.pop
156
- while stack:
157
- node = stack_pop()
158
- if not isinstance(node, Tree):
159
- continue
160
- yield node
161
- for child in reversed(node.children):
162
- stack_append(child)
163
-
164
- def find_pred(self, pred: 'Callable[[Tree[_Leaf_T]], bool]') -> 'Iterator[Tree[_Leaf_T]]':
165
- """Returns all nodes of the tree that evaluate pred(node) as true."""
166
- return filter(pred, self.iter_subtrees())
167
-
168
- def find_data(self, data: str) -> 'Iterator[Tree[_Leaf_T]]':
169
- """Returns all nodes of the tree whose data equals the given data."""
170
- return self.find_pred(lambda t: t.data == data)
171
-
172
- ###}
173
-
174
- def expand_kids_by_data(self, *data_values):
175
- """Expand (inline) children with any of the given data values. Returns True if anything changed"""
176
- changed = False
177
- for i in range(len(self.children)-1, -1, -1):
178
- child = self.children[i]
179
- if isinstance(child, Tree) and child.data in data_values:
180
- self.children[i:i+1] = child.children
181
- changed = True
182
- return changed
183
-
184
-
185
- def scan_values(self, pred: 'Callable[[Branch[_Leaf_T]], bool]') -> Iterator[_Leaf_T]:
186
- """Return all values in the tree that evaluate pred(value) as true.
187
-
188
- This can be used to find all the tokens in the tree.
189
-
190
- Example:
191
- >>> all_tokens = tree.scan_values(lambda v: isinstance(v, Token))
192
- """
193
- for c in self.children:
194
- if isinstance(c, Tree):
195
- for t in c.scan_values(pred):
196
- yield t
197
- else:
198
- if pred(c):
199
- yield c
200
-
201
- def __deepcopy__(self, memo):
202
- return type(self)(self.data, deepcopy(self.children, memo), meta=self._meta)
203
-
204
- def copy(self) -> 'Tree[_Leaf_T]':
205
- return type(self)(self.data, self.children)
206
-
207
- def set(self, data: str, children: 'List[Branch[_Leaf_T]]') -> None:
208
- self.data = data
209
- self.children = children
210
-
211
-
212
- ParseTree = Tree['Token']
213
-
214
-
215
- class SlottedTree(Tree):
216
- __slots__ = 'data', 'children', 'rule', '_meta'
217
-
218
-
219
- def pydot__tree_to_png(tree: Tree, filename: str, rankdir: 'Literal["TB", "LR", "BT", "RL"]'="LR", **kwargs) -> None:
220
- graph = pydot__tree_to_graph(tree, rankdir, **kwargs)
221
- graph.write_png(filename)
222
-
223
-
224
- def pydot__tree_to_dot(tree: Tree, filename, rankdir="LR", **kwargs):
225
- graph = pydot__tree_to_graph(tree, rankdir, **kwargs)
226
- graph.write(filename)
227
-
228
-
229
- def pydot__tree_to_graph(tree: Tree, rankdir="LR", **kwargs):
230
- """Creates a colorful image that represents the tree (data+children, without meta)
231
-
232
- Possible values for `rankdir` are "TB", "LR", "BT", "RL", corresponding to
233
- directed graphs drawn from top to bottom, from left to right, from bottom to
234
- top, and from right to left, respectively.
235
-
236
- `kwargs` can be any graph attribute (e. g. `dpi=200`). For a list of
237
- possible attributes, see https://www.graphviz.org/doc/info/attrs.html.
238
- """
239
-
240
- import pydot # type: ignore[import-not-found]
241
- graph = pydot.Dot(graph_type='digraph', rankdir=rankdir, **kwargs)
242
-
243
- i = [0]
244
-
245
- def new_leaf(leaf):
246
- node = pydot.Node(i[0], label=repr(leaf))
247
- i[0] += 1
248
- graph.add_node(node)
249
- return node
250
-
251
- def _to_pydot(subtree):
252
- color = hash(subtree.data) & 0xffffff
253
- color |= 0x808080
254
-
255
- subnodes = [_to_pydot(child) if isinstance(child, Tree) else new_leaf(child)
256
- for child in subtree.children]
257
- node = pydot.Node(i[0], style="filled", fillcolor="#%x" % color, label=subtree.data)
258
- i[0] += 1
259
- graph.add_node(node)
260
-
261
- for subnode in subnodes:
262
- graph.add_edge(pydot.Edge(node, subnode))
263
-
264
- return node
265
-
266
- _to_pydot(tree)
267
- return graph