webull-openapi-python-sdk 1.0.0__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 (295) hide show
  1. samples/__init__.py +1 -0
  2. samples/data/__init__.py +1 -0
  3. samples/data/data_client.py +57 -0
  4. samples/data/data_streaming_client.py +86 -0
  5. samples/data/data_streaming_client_async.py +101 -0
  6. samples/trade/__init__.py +0 -0
  7. samples/trade/trade_client.py +163 -0
  8. samples/trade/trade_client_v2.py +181 -0
  9. samples/trade/trade_event_client.py +47 -0
  10. webull/__init__.py +1 -0
  11. webull/core/__init__.py +12 -0
  12. webull/core/auth/__init__.py +0 -0
  13. webull/core/auth/algorithm/__init__.py +0 -0
  14. webull/core/auth/algorithm/sha_hmac1.py +65 -0
  15. webull/core/auth/algorithm/sha_hmac256.py +75 -0
  16. webull/core/auth/composer/__init__.py +0 -0
  17. webull/core/auth/composer/default_signature_composer.py +125 -0
  18. webull/core/auth/credentials.py +46 -0
  19. webull/core/auth/signers/__init__.py +0 -0
  20. webull/core/auth/signers/app_key_signer.py +72 -0
  21. webull/core/auth/signers/signer.py +48 -0
  22. webull/core/auth/signers/signer_factory.py +58 -0
  23. webull/core/cache/__init__.py +225 -0
  24. webull/core/client.py +410 -0
  25. webull/core/common/__init__.py +0 -0
  26. webull/core/common/api_type.py +19 -0
  27. webull/core/common/easy_enum.py +35 -0
  28. webull/core/common/region.py +7 -0
  29. webull/core/compat.py +85 -0
  30. webull/core/context/__init__.py +0 -0
  31. webull/core/context/request_context_holder.py +33 -0
  32. webull/core/data/endpoints.json +22 -0
  33. webull/core/data/retry_config.json +15 -0
  34. webull/core/endpoint/__init__.py +8 -0
  35. webull/core/endpoint/chained_endpoint_resolver.py +57 -0
  36. webull/core/endpoint/default_endpoint_resolver.py +60 -0
  37. webull/core/endpoint/local_config_regional_endpoint_resolver.py +77 -0
  38. webull/core/endpoint/resolver_endpoint_request.py +46 -0
  39. webull/core/endpoint/user_customized_endpoint_resolver.py +55 -0
  40. webull/core/exception/__init__.py +0 -0
  41. webull/core/exception/error_code.py +23 -0
  42. webull/core/exception/error_msg.py +21 -0
  43. webull/core/exception/exceptions.py +53 -0
  44. webull/core/headers.py +57 -0
  45. webull/core/http/__init__.py +0 -0
  46. webull/core/http/initializer/__init__.py +0 -0
  47. webull/core/http/initializer/client_initializer.py +79 -0
  48. webull/core/http/initializer/token/__init__.py +0 -0
  49. webull/core/http/initializer/token/bean/__init__.py +0 -0
  50. webull/core/http/initializer/token/bean/access_token.py +40 -0
  51. webull/core/http/initializer/token/bean/check_token_request.py +44 -0
  52. webull/core/http/initializer/token/bean/create_token_request.py +45 -0
  53. webull/core/http/initializer/token/bean/refresh_token_request.py +44 -0
  54. webull/core/http/initializer/token/token_manager.py +208 -0
  55. webull/core/http/initializer/token/token_operation.py +72 -0
  56. webull/core/http/method_type.py +43 -0
  57. webull/core/http/protocol_type.py +43 -0
  58. webull/core/http/request.py +121 -0
  59. webull/core/http/response.py +166 -0
  60. webull/core/request.py +278 -0
  61. webull/core/retry/__init__.py +0 -0
  62. webull/core/retry/backoff_strategy.py +102 -0
  63. webull/core/retry/retry_condition.py +214 -0
  64. webull/core/retry/retry_policy.py +63 -0
  65. webull/core/retry/retry_policy_context.py +51 -0
  66. webull/core/utils/__init__.py +0 -0
  67. webull/core/utils/common.py +62 -0
  68. webull/core/utils/data.py +25 -0
  69. webull/core/utils/desensitize.py +33 -0
  70. webull/core/utils/validation.py +49 -0
  71. webull/core/vendored/__init__.py +0 -0
  72. webull/core/vendored/requests/__init__.py +94 -0
  73. webull/core/vendored/requests/__version__.py +28 -0
  74. webull/core/vendored/requests/_internal_utils.py +56 -0
  75. webull/core/vendored/requests/adapters.py +539 -0
  76. webull/core/vendored/requests/api.py +166 -0
  77. webull/core/vendored/requests/auth.py +307 -0
  78. webull/core/vendored/requests/certs.py +34 -0
  79. webull/core/vendored/requests/compat.py +85 -0
  80. webull/core/vendored/requests/cookies.py +555 -0
  81. webull/core/vendored/requests/exceptions.py +136 -0
  82. webull/core/vendored/requests/help.py +134 -0
  83. webull/core/vendored/requests/hooks.py +48 -0
  84. webull/core/vendored/requests/models.py +960 -0
  85. webull/core/vendored/requests/packages/__init__.py +17 -0
  86. webull/core/vendored/requests/packages/certifi/__init__.py +17 -0
  87. webull/core/vendored/requests/packages/certifi/__main__.py +16 -0
  88. webull/core/vendored/requests/packages/certifi/cacert.pem +4433 -0
  89. webull/core/vendored/requests/packages/certifi/core.py +51 -0
  90. webull/core/vendored/requests/packages/chardet/__init__.py +53 -0
  91. webull/core/vendored/requests/packages/chardet/big5freq.py +400 -0
  92. webull/core/vendored/requests/packages/chardet/big5prober.py +61 -0
  93. webull/core/vendored/requests/packages/chardet/chardistribution.py +247 -0
  94. webull/core/vendored/requests/packages/chardet/charsetgroupprober.py +120 -0
  95. webull/core/vendored/requests/packages/chardet/charsetprober.py +159 -0
  96. webull/core/vendored/requests/packages/chardet/cli/__init__.py +1 -0
  97. webull/core/vendored/requests/packages/chardet/cli/chardetect.py +99 -0
  98. webull/core/vendored/requests/packages/chardet/codingstatemachine.py +102 -0
  99. webull/core/vendored/requests/packages/chardet/compat.py +48 -0
  100. webull/core/vendored/requests/packages/chardet/cp949prober.py +63 -0
  101. webull/core/vendored/requests/packages/chardet/enums.py +90 -0
  102. webull/core/vendored/requests/packages/chardet/escprober.py +115 -0
  103. webull/core/vendored/requests/packages/chardet/escsm.py +260 -0
  104. webull/core/vendored/requests/packages/chardet/eucjpprober.py +106 -0
  105. webull/core/vendored/requests/packages/chardet/euckrfreq.py +209 -0
  106. webull/core/vendored/requests/packages/chardet/euckrprober.py +61 -0
  107. webull/core/vendored/requests/packages/chardet/euctwfreq.py +401 -0
  108. webull/core/vendored/requests/packages/chardet/euctwprober.py +60 -0
  109. webull/core/vendored/requests/packages/chardet/gb2312freq.py +297 -0
  110. webull/core/vendored/requests/packages/chardet/gb2312prober.py +60 -0
  111. webull/core/vendored/requests/packages/chardet/hebrewprober.py +306 -0
  112. webull/core/vendored/requests/packages/chardet/jisfreq.py +339 -0
  113. webull/core/vendored/requests/packages/chardet/jpcntx.py +247 -0
  114. webull/core/vendored/requests/packages/chardet/langbulgarianmodel.py +242 -0
  115. webull/core/vendored/requests/packages/chardet/langcyrillicmodel.py +347 -0
  116. webull/core/vendored/requests/packages/chardet/langgreekmodel.py +239 -0
  117. webull/core/vendored/requests/packages/chardet/langhebrewmodel.py +214 -0
  118. webull/core/vendored/requests/packages/chardet/langhungarianmodel.py +239 -0
  119. webull/core/vendored/requests/packages/chardet/langthaimodel.py +213 -0
  120. webull/core/vendored/requests/packages/chardet/langturkishmodel.py +207 -0
  121. webull/core/vendored/requests/packages/chardet/latin1prober.py +159 -0
  122. webull/core/vendored/requests/packages/chardet/mbcharsetprober.py +105 -0
  123. webull/core/vendored/requests/packages/chardet/mbcsgroupprober.py +68 -0
  124. webull/core/vendored/requests/packages/chardet/mbcssm.py +586 -0
  125. webull/core/vendored/requests/packages/chardet/sbcharsetprober.py +146 -0
  126. webull/core/vendored/requests/packages/chardet/sbcsgroupprober.py +87 -0
  127. webull/core/vendored/requests/packages/chardet/sjisprober.py +106 -0
  128. webull/core/vendored/requests/packages/chardet/universaldetector.py +300 -0
  129. webull/core/vendored/requests/packages/chardet/utf8prober.py +96 -0
  130. webull/core/vendored/requests/packages/chardet/version.py +23 -0
  131. webull/core/vendored/requests/packages/urllib3/__init__.py +114 -0
  132. webull/core/vendored/requests/packages/urllib3/_collections.py +346 -0
  133. webull/core/vendored/requests/packages/urllib3/connection.py +405 -0
  134. webull/core/vendored/requests/packages/urllib3/connectionpool.py +910 -0
  135. webull/core/vendored/requests/packages/urllib3/contrib/__init__.py +0 -0
  136. webull/core/vendored/requests/packages/urllib3/contrib/_appengine_environ.py +44 -0
  137. webull/core/vendored/requests/packages/urllib3/contrib/_securetransport/__init__.py +0 -0
  138. webull/core/vendored/requests/packages/urllib3/contrib/_securetransport/bindings.py +607 -0
  139. webull/core/vendored/requests/packages/urllib3/contrib/_securetransport/low_level.py +360 -0
  140. webull/core/vendored/requests/packages/urllib3/contrib/appengine.py +303 -0
  141. webull/core/vendored/requests/packages/urllib3/contrib/ntlmpool.py +125 -0
  142. webull/core/vendored/requests/packages/urllib3/contrib/pyopenssl.py +484 -0
  143. webull/core/vendored/requests/packages/urllib3/contrib/securetransport.py +818 -0
  144. webull/core/vendored/requests/packages/urllib3/contrib/socks.py +206 -0
  145. webull/core/vendored/requests/packages/urllib3/exceptions.py +260 -0
  146. webull/core/vendored/requests/packages/urllib3/fields.py +192 -0
  147. webull/core/vendored/requests/packages/urllib3/filepost.py +112 -0
  148. webull/core/vendored/requests/packages/urllib3/packages/__init__.py +19 -0
  149. webull/core/vendored/requests/packages/urllib3/packages/backports/__init__.py +0 -0
  150. webull/core/vendored/requests/packages/urllib3/packages/backports/makefile.py +67 -0
  151. webull/core/vendored/requests/packages/urllib3/packages/ordered_dict.py +273 -0
  152. webull/core/vendored/requests/packages/urllib3/packages/six.py +882 -0
  153. webull/core/vendored/requests/packages/urllib3/packages/socks.py +887 -0
  154. webull/core/vendored/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py +19 -0
  155. webull/core/vendored/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.py +170 -0
  156. webull/core/vendored/requests/packages/urllib3/poolmanager.py +467 -0
  157. webull/core/vendored/requests/packages/urllib3/request.py +164 -0
  158. webull/core/vendored/requests/packages/urllib3/response.py +721 -0
  159. webull/core/vendored/requests/packages/urllib3/util/__init__.py +68 -0
  160. webull/core/vendored/requests/packages/urllib3/util/connection.py +148 -0
  161. webull/core/vendored/requests/packages/urllib3/util/queue.py +35 -0
  162. webull/core/vendored/requests/packages/urllib3/util/request.py +132 -0
  163. webull/core/vendored/requests/packages/urllib3/util/response.py +101 -0
  164. webull/core/vendored/requests/packages/urllib3/util/retry.py +426 -0
  165. webull/core/vendored/requests/packages/urllib3/util/selectors.py +601 -0
  166. webull/core/vendored/requests/packages/urllib3/util/ssl_.py +396 -0
  167. webull/core/vendored/requests/packages/urllib3/util/timeout.py +256 -0
  168. webull/core/vendored/requests/packages/urllib3/util/url.py +252 -0
  169. webull/core/vendored/requests/packages/urllib3/util/wait.py +164 -0
  170. webull/core/vendored/requests/packages.py +28 -0
  171. webull/core/vendored/requests/sessions.py +750 -0
  172. webull/core/vendored/requests/status_codes.py +105 -0
  173. webull/core/vendored/requests/structures.py +119 -0
  174. webull/core/vendored/requests/utils.py +916 -0
  175. webull/core/vendored/six.py +905 -0
  176. webull/data/__init__.py +3 -0
  177. webull/data/common/__init__.py +0 -0
  178. webull/data/common/category.py +26 -0
  179. webull/data/common/connect_ack.py +29 -0
  180. webull/data/common/direction.py +25 -0
  181. webull/data/common/exchange_code.py +33 -0
  182. webull/data/common/exercise_style.py +22 -0
  183. webull/data/common/expiration_cycle.py +26 -0
  184. webull/data/common/instrument_status.py +23 -0
  185. webull/data/common/option_type.py +20 -0
  186. webull/data/common/subscribe_type.py +22 -0
  187. webull/data/common/timespan.py +29 -0
  188. webull/data/data_client.py +35 -0
  189. webull/data/data_streaming_client.py +89 -0
  190. webull/data/internal/__init__.py +0 -0
  191. webull/data/internal/default_retry_policy.py +84 -0
  192. webull/data/internal/exceptions.py +60 -0
  193. webull/data/internal/quotes_client.py +314 -0
  194. webull/data/internal/quotes_decoder.py +40 -0
  195. webull/data/internal/quotes_payload_decoder.py +35 -0
  196. webull/data/internal/quotes_topic.py +36 -0
  197. webull/data/quotes/__init__.py +0 -0
  198. webull/data/quotes/instrument.py +33 -0
  199. webull/data/quotes/market_data.py +187 -0
  200. webull/data/quotes/market_streaming_data.py +66 -0
  201. webull/data/quotes/subscribe/__init__.py +0 -0
  202. webull/data/quotes/subscribe/ask_bid_result.py +49 -0
  203. webull/data/quotes/subscribe/basic_result.py +45 -0
  204. webull/data/quotes/subscribe/broker_result.py +33 -0
  205. webull/data/quotes/subscribe/message_pb2.py +37 -0
  206. webull/data/quotes/subscribe/order_result.py +30 -0
  207. webull/data/quotes/subscribe/payload_type.py +19 -0
  208. webull/data/quotes/subscribe/quote_decoder.py +28 -0
  209. webull/data/quotes/subscribe/quote_result.py +47 -0
  210. webull/data/quotes/subscribe/snapshot_decoder.py +30 -0
  211. webull/data/quotes/subscribe/snapshot_result.py +69 -0
  212. webull/data/quotes/subscribe/tick_decoder.py +29 -0
  213. webull/data/quotes/subscribe/tick_result.py +47 -0
  214. webull/data/request/__init__.py +0 -0
  215. webull/data/request/get_batch_historical_bars_request.py +43 -0
  216. webull/data/request/get_corp_action_request.py +47 -0
  217. webull/data/request/get_eod_bars_request.py +32 -0
  218. webull/data/request/get_historical_bars_request.py +43 -0
  219. webull/data/request/get_instruments_request.py +30 -0
  220. webull/data/request/get_quotes_request.py +35 -0
  221. webull/data/request/get_snapshot_request.py +38 -0
  222. webull/data/request/get_tick_request.py +37 -0
  223. webull/data/request/subscribe_request.py +43 -0
  224. webull/data/request/unsubscribe_request.py +42 -0
  225. webull/trade/__init__.py +2 -0
  226. webull/trade/common/__init__.py +0 -0
  227. webull/trade/common/account_type.py +22 -0
  228. webull/trade/common/category.py +29 -0
  229. webull/trade/common/combo_ticker_type.py +23 -0
  230. webull/trade/common/combo_type.py +31 -0
  231. webull/trade/common/currency.py +24 -0
  232. webull/trade/common/forbid_reason.py +27 -0
  233. webull/trade/common/instrument_type.py +27 -0
  234. webull/trade/common/markets.py +27 -0
  235. webull/trade/common/order_entrust_type.py +21 -0
  236. webull/trade/common/order_side.py +23 -0
  237. webull/trade/common/order_status.py +25 -0
  238. webull/trade/common/order_tif.py +24 -0
  239. webull/trade/common/order_type.py +30 -0
  240. webull/trade/common/trade_policy.py +22 -0
  241. webull/trade/common/trading_date_type.py +24 -0
  242. webull/trade/common/trailing_type.py +23 -0
  243. webull/trade/events/__init__.py +0 -0
  244. webull/trade/events/default_retry_policy.py +64 -0
  245. webull/trade/events/events_pb2.py +43 -0
  246. webull/trade/events/events_pb2_grpc.py +66 -0
  247. webull/trade/events/signature_composer.py +61 -0
  248. webull/trade/events/types.py +21 -0
  249. webull/trade/request/__init__.py +0 -0
  250. webull/trade/request/cancel_order_request.py +28 -0
  251. webull/trade/request/get_account_balance_request.py +28 -0
  252. webull/trade/request/get_account_positions_request.py +30 -0
  253. webull/trade/request/get_account_profile_request.py +26 -0
  254. webull/trade/request/get_app_subscriptions.py +28 -0
  255. webull/trade/request/get_open_orders_request.py +30 -0
  256. webull/trade/request/get_order_detail_request.py +27 -0
  257. webull/trade/request/get_today_orders_request.py +31 -0
  258. webull/trade/request/get_trade_calendar_request.py +30 -0
  259. webull/trade/request/get_trade_instrument_detail_request.py +24 -0
  260. webull/trade/request/get_trade_security_detail_request.py +42 -0
  261. webull/trade/request/get_tradeable_instruments_request.py +27 -0
  262. webull/trade/request/palce_order_request.py +91 -0
  263. webull/trade/request/place_order_request_v2.py +58 -0
  264. webull/trade/request/replace_order_request.py +73 -0
  265. webull/trade/request/replace_order_request_v2.py +38 -0
  266. webull/trade/request/v2/__init__.py +0 -0
  267. webull/trade/request/v2/cancel_option_request.py +28 -0
  268. webull/trade/request/v2/cancel_order_request.py +28 -0
  269. webull/trade/request/v2/get_account_balance_request.py +28 -0
  270. webull/trade/request/v2/get_account_list.py +23 -0
  271. webull/trade/request/v2/get_account_positions_request.py +24 -0
  272. webull/trade/request/v2/get_order_detail_request.py +26 -0
  273. webull/trade/request/v2/get_order_history_request.py +35 -0
  274. webull/trade/request/v2/palce_order_request.py +87 -0
  275. webull/trade/request/v2/place_option_request.py +64 -0
  276. webull/trade/request/v2/preview_option_request.py +28 -0
  277. webull/trade/request/v2/preview_order_request.py +59 -0
  278. webull/trade/request/v2/replace_option_request.py +28 -0
  279. webull/trade/request/v2/replace_order_request.py +57 -0
  280. webull/trade/trade/__init__.py +0 -0
  281. webull/trade/trade/account_info.py +83 -0
  282. webull/trade/trade/order_operation.py +246 -0
  283. webull/trade/trade/trade_calendar.py +37 -0
  284. webull/trade/trade/trade_instrument.py +72 -0
  285. webull/trade/trade/v2/__init__.py +0 -0
  286. webull/trade/trade/v2/account_info_v2.py +55 -0
  287. webull/trade/trade/v2/order_operation_v2.py +206 -0
  288. webull/trade/trade_client.py +43 -0
  289. webull/trade/trade_events_client.py +233 -0
  290. webull_openapi_python_sdk-1.0.0.dist-info/METADATA +28 -0
  291. webull_openapi_python_sdk-1.0.0.dist-info/RECORD +295 -0
  292. webull_openapi_python_sdk-1.0.0.dist-info/WHEEL +5 -0
  293. webull_openapi_python_sdk-1.0.0.dist-info/licenses/LICENSE +202 -0
  294. webull_openapi_python_sdk-1.0.0.dist-info/licenses/NOTICE +56 -0
  295. webull_openapi_python_sdk-1.0.0.dist-info/top_level.txt +2 -0
@@ -0,0 +1,112 @@
1
+ # Copyright 2022 Webull
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from __future__ import absolute_import
16
+ import binascii
17
+ import codecs
18
+ import os
19
+
20
+ from io import BytesIO
21
+
22
+ from .packages import six
23
+ from .packages.six import b
24
+ from .fields import RequestField
25
+
26
+ writer = codecs.lookup('utf-8')[3]
27
+
28
+
29
+ def choose_boundary():
30
+ """
31
+ Our embarrassingly-simple replacement for mimetools.choose_boundary.
32
+ """
33
+ boundary = binascii.hexlify(os.urandom(16))
34
+ if six.PY3:
35
+ boundary = boundary.decode('ascii')
36
+ return boundary
37
+
38
+
39
+ def iter_field_objects(fields):
40
+ """
41
+ Iterate over fields.
42
+
43
+ Supports list of (k, v) tuples and dicts, and lists of
44
+ :class:`~urllib3.fields.RequestField`.
45
+
46
+ """
47
+ if isinstance(fields, dict):
48
+ i = six.iteritems(fields)
49
+ else:
50
+ i = iter(fields)
51
+
52
+ for field in i:
53
+ if isinstance(field, RequestField):
54
+ yield field
55
+ else:
56
+ yield RequestField.from_tuples(*field)
57
+
58
+
59
+ def iter_fields(fields):
60
+ """
61
+ .. deprecated:: 1.6
62
+
63
+ Iterate over fields.
64
+
65
+ The addition of :class:`~urllib3.fields.RequestField` makes this function
66
+ obsolete. Instead, use :func:`iter_field_objects`, which returns
67
+ :class:`~urllib3.fields.RequestField` objects.
68
+
69
+ Supports list of (k, v) tuples and dicts.
70
+ """
71
+ if isinstance(fields, dict):
72
+ return ((k, v) for k, v in six.iteritems(fields))
73
+
74
+ return ((k, v) for k, v in fields)
75
+
76
+
77
+ def encode_multipart_formdata(fields, boundary=None):
78
+ """
79
+ Encode a dictionary of ``fields`` using the multipart/form-data MIME format.
80
+
81
+ :param fields:
82
+ Dictionary of fields or list of (key, :class:`~urllib3.fields.RequestField`).
83
+
84
+ :param boundary:
85
+ If not specified, then a random boundary will be generated using
86
+ :func:`urllib3.filepost.choose_boundary`.
87
+ """
88
+ body = BytesIO()
89
+ if boundary is None:
90
+ boundary = choose_boundary()
91
+
92
+ for field in iter_field_objects(fields):
93
+ body.write(b('--%s\r\n' % (boundary)))
94
+
95
+ writer(body).write(field.render_headers())
96
+ data = field.data
97
+
98
+ if isinstance(data, int):
99
+ data = str(data) # Backwards compatibility
100
+
101
+ if isinstance(data, six.text_type):
102
+ writer(body).write(data)
103
+ else:
104
+ body.write(data)
105
+
106
+ body.write(b'\r\n')
107
+
108
+ body.write(b('--%s--\r\n' % (boundary)))
109
+
110
+ content_type = str('multipart/form-data; boundary=%s' % boundary)
111
+
112
+ return body.getvalue(), content_type
@@ -0,0 +1,19 @@
1
+ # Copyright 2022 Webull
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from __future__ import absolute_import
16
+
17
+ from . import ssl_match_hostname
18
+
19
+ __all__ = ('ssl_match_hostname', )
@@ -0,0 +1,67 @@
1
+ # Copyright 2022 Webull
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ # -*- coding: utf-8 -*-
16
+ """
17
+ backports.makefile
18
+ ~~~~~~~~~~~~~~~~~~
19
+
20
+ Backports the Python 3 ``socket.makefile`` method for use with anything that
21
+ wants to create a "fake" socket object.
22
+ """
23
+ import io
24
+
25
+ from socket import SocketIO
26
+
27
+
28
+ def backport_makefile(self, mode="r", buffering=None, encoding=None,
29
+ errors=None, newline=None):
30
+ """
31
+ Backport of ``socket.makefile`` from Python 3.5.
32
+ """
33
+ if not set(mode) <= {"r", "w", "b"}:
34
+ raise ValueError(
35
+ "invalid mode %r (only r, w, b allowed)" % (mode,)
36
+ )
37
+ writing = "w" in mode
38
+ reading = "r" in mode or not writing
39
+ assert reading or writing
40
+ binary = "b" in mode
41
+ rawmode = ""
42
+ if reading:
43
+ rawmode += "r"
44
+ if writing:
45
+ rawmode += "w"
46
+ raw = SocketIO(self, rawmode)
47
+ self._makefile_refs += 1
48
+ if buffering is None:
49
+ buffering = -1
50
+ if buffering < 0:
51
+ buffering = io.DEFAULT_BUFFER_SIZE
52
+ if buffering == 0:
53
+ if not binary:
54
+ raise ValueError("unbuffered streams must be binary")
55
+ return raw
56
+ if reading and writing:
57
+ buffer = io.BufferedRWPair(raw, raw, buffering)
58
+ elif reading:
59
+ buffer = io.BufferedReader(raw, buffering)
60
+ else:
61
+ assert writing
62
+ buffer = io.BufferedWriter(raw, buffering)
63
+ if binary:
64
+ return buffer
65
+ text = io.TextIOWrapper(buffer, encoding, errors, newline)
66
+ text.mode = mode
67
+ return text
@@ -0,0 +1,273 @@
1
+ # Copyright 2022 Webull
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ # Backport of OrderedDict() class that runs on Python 2.4, 2.5, 2.6, 2.7 and pypy.
16
+ # Passes Python2.7's test suite and incorporates all the latest updates.
17
+ # Copyright 2009 Raymond Hettinger, released under the MIT License.
18
+ # http://code.activestate.com/recipes/576693/
19
+ try:
20
+ from thread import get_ident as _get_ident
21
+ except ImportError:
22
+ from dummy_thread import get_ident as _get_ident
23
+
24
+ try:
25
+ from _abcoll import KeysView, ValuesView, ItemsView
26
+ except ImportError:
27
+ pass
28
+
29
+
30
+ class OrderedDict(dict):
31
+ 'Dictionary that remembers insertion order'
32
+ # An inherited dict maps keys to values.
33
+ # The inherited dict provides __getitem__, __len__, __contains__, and get.
34
+ # The remaining methods are order-aware.
35
+ # Big-O running times for all methods are the same as for regular dictionaries.
36
+
37
+ # The internal self.__map dictionary maps keys to links in a doubly linked list.
38
+ # The circular doubly linked list starts and ends with a sentinel element.
39
+ # The sentinel element never gets deleted (this simplifies the algorithm).
40
+ # Each link is stored as a list of length three: [PREV, NEXT, KEY].
41
+
42
+ def __init__(self, *args, **kwds):
43
+ '''Initialize an ordered dictionary. Signature is the same as for
44
+ regular dictionaries, but keyword arguments are not recommended
45
+ because their insertion order is arbitrary.
46
+
47
+ '''
48
+ if len(args) > 1:
49
+ raise TypeError('expected at most 1 arguments, got %d' % len(args))
50
+ try:
51
+ self.__root
52
+ except AttributeError:
53
+ self.__root = root = [] # sentinel node
54
+ root[:] = [root, root, None]
55
+ self.__map = {}
56
+ self.__update(*args, **kwds)
57
+
58
+ def __setitem__(self, key, value, dict_setitem=dict.__setitem__):
59
+ 'od.__setitem__(i, y) <==> od[i]=y'
60
+ # Setting a new item creates a new link which goes at the end of the linked
61
+ # list, and the inherited dictionary is updated with the new key/value pair.
62
+ if key not in self:
63
+ root = self.__root
64
+ last = root[0]
65
+ last[1] = root[0] = self.__map[key] = [last, root, key]
66
+ dict_setitem(self, key, value)
67
+
68
+ def __delitem__(self, key, dict_delitem=dict.__delitem__):
69
+ 'od.__delitem__(y) <==> del od[y]'
70
+ # Deleting an existing item uses self.__map to find the link which is
71
+ # then removed by updating the links in the predecessor and successor nodes.
72
+ dict_delitem(self, key)
73
+ link_prev, link_next, key = self.__map.pop(key)
74
+ link_prev[1] = link_next
75
+ link_next[0] = link_prev
76
+
77
+ def __iter__(self):
78
+ 'od.__iter__() <==> iter(od)'
79
+ root = self.__root
80
+ curr = root[1]
81
+ while curr is not root:
82
+ yield curr[2]
83
+ curr = curr[1]
84
+
85
+ def __reversed__(self):
86
+ 'od.__reversed__() <==> reversed(od)'
87
+ root = self.__root
88
+ curr = root[0]
89
+ while curr is not root:
90
+ yield curr[2]
91
+ curr = curr[0]
92
+
93
+ def clear(self):
94
+ 'od.clear() -> None. Remove all items from od.'
95
+ try:
96
+ for node in self.__map.itervalues():
97
+ del node[:]
98
+ root = self.__root
99
+ root[:] = [root, root, None]
100
+ self.__map.clear()
101
+ except AttributeError:
102
+ pass
103
+ dict.clear(self)
104
+
105
+ def popitem(self, last=True):
106
+ '''od.popitem() -> (k, v), return and remove a (key, value) pair.
107
+ Pairs are returned in LIFO order if last is true or FIFO order if false.
108
+
109
+ '''
110
+ if not self:
111
+ raise KeyError('dictionary is empty')
112
+ root = self.__root
113
+ if last:
114
+ link = root[0]
115
+ link_prev = link[0]
116
+ link_prev[1] = root
117
+ root[0] = link_prev
118
+ else:
119
+ link = root[1]
120
+ link_next = link[1]
121
+ root[1] = link_next
122
+ link_next[0] = root
123
+ key = link[2]
124
+ del self.__map[key]
125
+ value = dict.pop(self, key)
126
+ return key, value
127
+
128
+ # -- the following methods do not depend on the internal structure --
129
+
130
+ def keys(self):
131
+ 'od.keys() -> list of keys in od'
132
+ return list(self)
133
+
134
+ def values(self):
135
+ 'od.values() -> list of values in od'
136
+ return [self[key] for key in self]
137
+
138
+ def items(self):
139
+ 'od.items() -> list of (key, value) pairs in od'
140
+ return [(key, self[key]) for key in self]
141
+
142
+ def iterkeys(self):
143
+ 'od.iterkeys() -> an iterator over the keys in od'
144
+ return iter(self)
145
+
146
+ def itervalues(self):
147
+ 'od.itervalues -> an iterator over the values in od'
148
+ for k in self:
149
+ yield self[k]
150
+
151
+ def iteritems(self):
152
+ 'od.iteritems -> an iterator over the (key, value) items in od'
153
+ for k in self:
154
+ yield (k, self[k])
155
+
156
+ def update(*args, **kwds):
157
+ '''od.update(E, **F) -> None. Update od from dict/iterable E and F.
158
+
159
+ If E is a dict instance, does: for k in E: od[k] = E[k]
160
+ If E has a .keys() method, does: for k in E.keys(): od[k] = E[k]
161
+ Or if E is an iterable of items, does: for k, v in E: od[k] = v
162
+ In either case, this is followed by: for k, v in F.items(): od[k] = v
163
+
164
+ '''
165
+ if len(args) > 2:
166
+ raise TypeError('update() takes at most 2 positional '
167
+ 'arguments (%d given)' % (len(args),))
168
+ elif not args:
169
+ raise TypeError('update() takes at least 1 argument (0 given)')
170
+ self = args[0]
171
+ # Make progressively weaker assumptions about "other"
172
+ other = ()
173
+ if len(args) == 2:
174
+ other = args[1]
175
+ if isinstance(other, dict):
176
+ for key in other:
177
+ self[key] = other[key]
178
+ elif hasattr(other, 'keys'):
179
+ for key in other.keys():
180
+ self[key] = other[key]
181
+ else:
182
+ for key, value in other:
183
+ self[key] = value
184
+ for key, value in kwds.items():
185
+ self[key] = value
186
+
187
+ __update = update # let subclasses override update without breaking __init__
188
+
189
+ __marker = object()
190
+
191
+ def pop(self, key, default=__marker):
192
+ '''od.pop(k[,d]) -> v, remove specified key and return the corresponding value.
193
+ If key is not found, d is returned if given, otherwise KeyError is raised.
194
+
195
+ '''
196
+ if key in self:
197
+ result = self[key]
198
+ del self[key]
199
+ return result
200
+ if default is self.__marker:
201
+ raise KeyError(key)
202
+ return default
203
+
204
+ def setdefault(self, key, default=None):
205
+ 'od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od'
206
+ if key in self:
207
+ return self[key]
208
+ self[key] = default
209
+ return default
210
+
211
+ def __repr__(self, _repr_running={}):
212
+ 'od.__repr__() <==> repr(od)'
213
+ call_key = id(self), _get_ident()
214
+ if call_key in _repr_running:
215
+ return '...'
216
+ _repr_running[call_key] = 1
217
+ try:
218
+ if not self:
219
+ return '%s()' % (self.__class__.__name__,)
220
+ return '%s(%r)' % (self.__class__.__name__, self.items())
221
+ finally:
222
+ del _repr_running[call_key]
223
+
224
+ def __reduce__(self):
225
+ 'Return state information for pickling'
226
+ items = [[k, self[k]] for k in self]
227
+ inst_dict = vars(self).copy()
228
+ for k in vars(OrderedDict()):
229
+ inst_dict.pop(k, None)
230
+ if inst_dict:
231
+ return (self.__class__, (items,), inst_dict)
232
+ return self.__class__, (items,)
233
+
234
+ def copy(self):
235
+ 'od.copy() -> a shallow copy of od'
236
+ return self.__class__(self)
237
+
238
+ @classmethod
239
+ def fromkeys(cls, iterable, value=None):
240
+ '''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S
241
+ and values equal to v (which defaults to None).
242
+
243
+ '''
244
+ d = cls()
245
+ for key in iterable:
246
+ d[key] = value
247
+ return d
248
+
249
+ def __eq__(self, other):
250
+ '''od.__eq__(y) <==> od==y. Comparison to another OD is order-sensitive
251
+ while comparison to a regular mapping is order-insensitive.
252
+
253
+ '''
254
+ if isinstance(other, OrderedDict):
255
+ return len(self)==len(other) and self.items() == other.items()
256
+ return dict.__eq__(self, other)
257
+
258
+ def __ne__(self, other):
259
+ return not self == other
260
+
261
+ # -- the following methods are only used in Python 2.7 --
262
+
263
+ def viewkeys(self):
264
+ "od.viewkeys() -> a set-like object providing a view on od's keys"
265
+ return KeysView(self)
266
+
267
+ def viewvalues(self):
268
+ "od.viewvalues() -> an object providing a view on od's values"
269
+ return ValuesView(self)
270
+
271
+ def viewitems(self):
272
+ "od.viewitems() -> a set-like object providing a view on od's items"
273
+ return ItemsView(self)