lib-x17-fintech 2.1.3__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 (282) hide show
  1. lib_x17_fintech-2.1.3.dist-info/METADATA +633 -0
  2. lib_x17_fintech-2.1.3.dist-info/RECORD +282 -0
  3. lib_x17_fintech-2.1.3.dist-info/WHEEL +5 -0
  4. lib_x17_fintech-2.1.3.dist-info/licenses/LICENSE +1 -0
  5. lib_x17_fintech-2.1.3.dist-info/top_level.txt +1 -0
  6. xfintech/__init__.py +0 -0
  7. xfintech/connect/__init__.py +18 -0
  8. xfintech/connect/artifact/__init__.py +5 -0
  9. xfintech/connect/artifact/artifact.py +168 -0
  10. xfintech/connect/artifact/tests/__init__.py +3 -0
  11. xfintech/connect/artifact/tests/test_class_artifact_all.py +564 -0
  12. xfintech/connect/common/__init__.py +12 -0
  13. xfintech/connect/common/connect.py +49 -0
  14. xfintech/connect/common/connectref.py +119 -0
  15. xfintech/connect/common/error.py +62 -0
  16. xfintech/connect/common/tests/__init__.py +1 -0
  17. xfintech/connect/common/tests/test_class_connectlike_all.py +544 -0
  18. xfintech/connect/common/tests/test_class_connectref_all.py +586 -0
  19. xfintech/connect/common/tests/test_class_errors_all.py +524 -0
  20. xfintech/connect/instance/__init__.py +7 -0
  21. xfintech/connect/instance/macos.py +121 -0
  22. xfintech/connect/instance/s3.py +176 -0
  23. xfintech/connect/instance/tests/__init__.py +1 -0
  24. xfintech/connect/instance/tests/test_class_macosconnect_all.py +692 -0
  25. xfintech/connect/instance/tests/test_class_s3connect_all.py +603 -0
  26. xfintech/data/__init__.py +20 -0
  27. xfintech/data/common/__init__.py +15 -0
  28. xfintech/data/common/cache.py +186 -0
  29. xfintech/data/common/coolant.py +171 -0
  30. xfintech/data/common/metric.py +138 -0
  31. xfintech/data/common/paginate.py +132 -0
  32. xfintech/data/common/params.py +162 -0
  33. xfintech/data/common/retry.py +201 -0
  34. xfintech/data/common/tests/__init__.py +1 -0
  35. xfintech/data/common/tests/test_class_cache_all.py +681 -0
  36. xfintech/data/common/tests/test_class_coolant_all.py +534 -0
  37. xfintech/data/common/tests/test_class_metric_all.py +705 -0
  38. xfintech/data/common/tests/test_class_paginate_all.py +508 -0
  39. xfintech/data/common/tests/test_class_params_all.py +891 -0
  40. xfintech/data/common/tests/test_class_retry_all.py +714 -0
  41. xfintech/data/job/__init__.py +17 -0
  42. xfintech/data/job/errors.py +112 -0
  43. xfintech/data/job/house.py +156 -0
  44. xfintech/data/job/job.py +247 -0
  45. xfintech/data/job/joblike.py +47 -0
  46. xfintech/data/job/tests/__init__.py +1 -0
  47. xfintech/data/job/tests/test_class_errors_all.py +275 -0
  48. xfintech/data/job/tests/test_class_house_all.py +801 -0
  49. xfintech/data/job/tests/test_class_job_all.py +684 -0
  50. xfintech/data/job/tests/test_class_joblike_all.py +482 -0
  51. xfintech/data/relay/__init__.py +7 -0
  52. xfintech/data/relay/client.py +114 -0
  53. xfintech/data/relay/clientlike.py +45 -0
  54. xfintech/data/relay/tests/test_class_relayclient_all.py +484 -0
  55. xfintech/data/relay/tests/test_class_relayclientlike_all.py +500 -0
  56. xfintech/data/source/__init__.py +7 -0
  57. xfintech/data/source/baostock/__init__.py +21 -0
  58. xfintech/data/source/baostock/job/__init__.py +5 -0
  59. xfintech/data/source/baostock/job/job.py +217 -0
  60. xfintech/data/source/baostock/job/tests/__init__.py +0 -0
  61. xfintech/data/source/baostock/job/tests/test_class_baostockjob_all.py +547 -0
  62. xfintech/data/source/baostock/session/__init__.py +8 -0
  63. xfintech/data/source/baostock/session/relay.py +223 -0
  64. xfintech/data/source/baostock/session/session.py +241 -0
  65. xfintech/data/source/baostock/session/tests/__init__.py +0 -0
  66. xfintech/data/source/baostock/session/tests/test_class_relay_all.py +694 -0
  67. xfintech/data/source/baostock/session/tests/test_class_session_all.py +505 -0
  68. xfintech/data/source/baostock/stock/__init__.py +0 -0
  69. xfintech/data/source/baostock/stock/hs300stock/__init__.py +3 -0
  70. xfintech/data/source/baostock/stock/hs300stock/constant.py +49 -0
  71. xfintech/data/source/baostock/stock/hs300stock/hs300stock.py +133 -0
  72. xfintech/data/source/baostock/stock/hs300stock/tests/__init__.py +1 -0
  73. xfintech/data/source/baostock/stock/hs300stock/tests/test_class_hs300index_all.py +413 -0
  74. xfintech/data/source/baostock/stock/minuteline/__init__.py +19 -0
  75. xfintech/data/source/baostock/stock/minuteline/constant.py +89 -0
  76. xfintech/data/source/baostock/stock/minuteline/minuteline.py +163 -0
  77. xfintech/data/source/baostock/stock/minuteline/tests/__init__.py +0 -0
  78. xfintech/data/source/baostock/stock/minuteline/tests/test_class_minuteline_all.py +582 -0
  79. xfintech/data/source/baostock/stock/stock/__init__.py +19 -0
  80. xfintech/data/source/baostock/stock/stock/constant.py +55 -0
  81. xfintech/data/source/baostock/stock/stock/stock.py +149 -0
  82. xfintech/data/source/baostock/stock/stock/tests/__init__.py +0 -0
  83. xfintech/data/source/baostock/stock/stock/tests/test_class_stock_all.py +508 -0
  84. xfintech/data/source/baostock/stock/stockinfo/__init__.py +5 -0
  85. xfintech/data/source/baostock/stock/stockinfo/constant.py +66 -0
  86. xfintech/data/source/baostock/stock/stockinfo/stockinfo.py +176 -0
  87. xfintech/data/source/baostock/stock/stockinfo/tests/__init__.py +1 -0
  88. xfintech/data/source/baostock/stock/stockinfo/tests/test_class_stockinfo_all.py +617 -0
  89. xfintech/data/source/baostock/stock/sz50stock/__init__.py +3 -0
  90. xfintech/data/source/baostock/stock/sz50stock/constant.py +49 -0
  91. xfintech/data/source/baostock/stock/sz50stock/sz50stock.py +133 -0
  92. xfintech/data/source/baostock/stock/sz50stock/tests/__init__.py +1 -0
  93. xfintech/data/source/baostock/stock/sz50stock/tests/test_class_sz50stock_all.py +397 -0
  94. xfintech/data/source/baostock/stock/tradedate/__init__.py +19 -0
  95. xfintech/data/source/baostock/stock/tradedate/constant.py +72 -0
  96. xfintech/data/source/baostock/stock/tradedate/tests/__init__.py +0 -0
  97. xfintech/data/source/baostock/stock/tradedate/tests/test_class_tradedate_all.py +695 -0
  98. xfintech/data/source/baostock/stock/tradedate/tradedate.py +208 -0
  99. xfintech/data/source/baostock/stock/zz500stock/__init__.py +3 -0
  100. xfintech/data/source/baostock/stock/zz500stock/constant.py +55 -0
  101. xfintech/data/source/baostock/stock/zz500stock/tests/__init__.py +1 -0
  102. xfintech/data/source/baostock/stock/zz500stock/tests/test_class_zz500stock_all.py +421 -0
  103. xfintech/data/source/baostock/stock/zz500stock/zz500stock.py +133 -0
  104. xfintech/data/source/tushare/__init__.py +61 -0
  105. xfintech/data/source/tushare/job/__init__.py +5 -0
  106. xfintech/data/source/tushare/job/job.py +257 -0
  107. xfintech/data/source/tushare/job/tests/test_class_tusharejob_all.py +589 -0
  108. xfintech/data/source/tushare/session/__init__.py +5 -0
  109. xfintech/data/source/tushare/session/relay.py +231 -0
  110. xfintech/data/source/tushare/session/session.py +239 -0
  111. xfintech/data/source/tushare/session/tests/test_class_relay_all.py +719 -0
  112. xfintech/data/source/tushare/session/tests/test_class_session_all.py +705 -0
  113. xfintech/data/source/tushare/stock/__init__.py +55 -0
  114. xfintech/data/source/tushare/stock/adjfactor/__init__.py +19 -0
  115. xfintech/data/source/tushare/stock/adjfactor/adjfactor.py +150 -0
  116. xfintech/data/source/tushare/stock/adjfactor/constant.py +71 -0
  117. xfintech/data/source/tushare/stock/adjfactor/tests/__init__.py +0 -0
  118. xfintech/data/source/tushare/stock/adjfactor/tests/test_class_adjfactor_all.py +372 -0
  119. xfintech/data/source/tushare/stock/capflow/__init__.py +19 -0
  120. xfintech/data/source/tushare/stock/capflow/capflow.py +171 -0
  121. xfintech/data/source/tushare/stock/capflow/constant.py +105 -0
  122. xfintech/data/source/tushare/stock/capflow/tests/__init__.py +0 -0
  123. xfintech/data/source/tushare/stock/capflow/tests/test_class_capflow_all.py +589 -0
  124. xfintech/data/source/tushare/stock/capflowdc/__init__.py +19 -0
  125. xfintech/data/source/tushare/stock/capflowdc/capflowdc.py +167 -0
  126. xfintech/data/source/tushare/stock/capflowdc/constant.py +95 -0
  127. xfintech/data/source/tushare/stock/capflowdc/tests/__init__.py +0 -0
  128. xfintech/data/source/tushare/stock/capflowdc/tests/test_class_capflowdc_all.py +814 -0
  129. xfintech/data/source/tushare/stock/capflowths/__init__.py +19 -0
  130. xfintech/data/source/tushare/stock/capflowths/capflowths.py +173 -0
  131. xfintech/data/source/tushare/stock/capflowths/constant.py +92 -0
  132. xfintech/data/source/tushare/stock/capflowths/tests/__init__.py +0 -0
  133. xfintech/data/source/tushare/stock/capflowths/tests/test_class_capflowths_all.py +551 -0
  134. xfintech/data/source/tushare/stock/company/__init__.py +19 -0
  135. xfintech/data/source/tushare/stock/company/company.py +188 -0
  136. xfintech/data/source/tushare/stock/company/constant.py +92 -0
  137. xfintech/data/source/tushare/stock/company/tests/__init__.py +1 -0
  138. xfintech/data/source/tushare/stock/company/tests/test_class_company_all.py +829 -0
  139. xfintech/data/source/tushare/stock/companybusiness/__init__.py +21 -0
  140. xfintech/data/source/tushare/stock/companybusiness/companybusiness.py +183 -0
  141. xfintech/data/source/tushare/stock/companybusiness/constant.py +91 -0
  142. xfintech/data/source/tushare/stock/companybusiness/tests/__init__.py +0 -0
  143. xfintech/data/source/tushare/stock/companybusiness/tests/test_class_companybusiness_all.py +633 -0
  144. xfintech/data/source/tushare/stock/companycashflow/__init__.py +21 -0
  145. xfintech/data/source/tushare/stock/companycashflow/companycashflow.py +277 -0
  146. xfintech/data/source/tushare/stock/companycashflow/constant.py +293 -0
  147. xfintech/data/source/tushare/stock/companycashflow/tests/__init__.py +0 -0
  148. xfintech/data/source/tushare/stock/companycashflow/tests/test_class_companycashflow_all.py +619 -0
  149. xfintech/data/source/tushare/stock/companydebt/__init__.py +19 -0
  150. xfintech/data/source/tushare/stock/companydebt/companydebt.py +339 -0
  151. xfintech/data/source/tushare/stock/companydebt/constant.py +403 -0
  152. xfintech/data/source/tushare/stock/companydebt/tests/__init__.py +0 -0
  153. xfintech/data/source/tushare/stock/companydebt/tests/test_class_companydebt_all.py +655 -0
  154. xfintech/data/source/tushare/stock/companyoverview/__init__.py +21 -0
  155. xfintech/data/source/tushare/stock/companyoverview/companyoverview.py +214 -0
  156. xfintech/data/source/tushare/stock/companyoverview/constant.py +152 -0
  157. xfintech/data/source/tushare/stock/companyoverview/tests/__init__.py +0 -0
  158. xfintech/data/source/tushare/stock/companyoverview/tests/test_class_companyoverview_all.py +647 -0
  159. xfintech/data/source/tushare/stock/companyprofit/__init__.py +21 -0
  160. xfintech/data/source/tushare/stock/companyprofit/companyprofit.py +272 -0
  161. xfintech/data/source/tushare/stock/companyprofit/constant.py +259 -0
  162. xfintech/data/source/tushare/stock/companyprofit/tests/__init__.py +0 -0
  163. xfintech/data/source/tushare/stock/companyprofit/tests/test_class_companyprofit_all.py +635 -0
  164. xfintech/data/source/tushare/stock/conceptcapflowdc/__init__.py +21 -0
  165. xfintech/data/source/tushare/stock/conceptcapflowdc/conceptcapflowdc.py +175 -0
  166. xfintech/data/source/tushare/stock/conceptcapflowdc/constant.py +106 -0
  167. xfintech/data/source/tushare/stock/conceptcapflowdc/tests/__init__.py +0 -0
  168. xfintech/data/source/tushare/stock/conceptcapflowdc/tests/test_class_conceptcapflowdc_all.py +568 -0
  169. xfintech/data/source/tushare/stock/conceptcapflowths/__init__.py +21 -0
  170. xfintech/data/source/tushare/stock/conceptcapflowths/conceptcapflowths.py +188 -0
  171. xfintech/data/source/tushare/stock/conceptcapflowths/constant.py +89 -0
  172. xfintech/data/source/tushare/stock/conceptcapflowths/tests/__init__.py +0 -0
  173. xfintech/data/source/tushare/stock/conceptcapflowths/tests/test_class_conceptcapflowths_all.py +516 -0
  174. xfintech/data/source/tushare/stock/dayline/__init__.py +19 -0
  175. xfintech/data/source/tushare/stock/dayline/constant.py +87 -0
  176. xfintech/data/source/tushare/stock/dayline/dayline.py +177 -0
  177. xfintech/data/source/tushare/stock/dayline/tests/__init__.py +0 -0
  178. xfintech/data/source/tushare/stock/dayline/tests/test_class_dayline_all.py +585 -0
  179. xfintech/data/source/tushare/stock/industrycapflowths/__init__.py +21 -0
  180. xfintech/data/source/tushare/stock/industrycapflowths/constant.py +89 -0
  181. xfintech/data/source/tushare/stock/industrycapflowths/industrycapflowths.py +192 -0
  182. xfintech/data/source/tushare/stock/industrycapflowths/tests/__init__.py +0 -0
  183. xfintech/data/source/tushare/stock/industrycapflowths/tests/test_class_industrycapflowths_all.py +683 -0
  184. xfintech/data/source/tushare/stock/marketindexcapflowdc/__init__.py +21 -0
  185. xfintech/data/source/tushare/stock/marketindexcapflowdc/constant.py +90 -0
  186. xfintech/data/source/tushare/stock/marketindexcapflowdc/marketindexcapflowdc.py +173 -0
  187. xfintech/data/source/tushare/stock/marketindexcapflowdc/tests/__init__.py +0 -0
  188. xfintech/data/source/tushare/stock/marketindexcapflowdc/tests/test_class_marketindexcapflowdc_all.py +793 -0
  189. xfintech/data/source/tushare/stock/monthline/__init__.py +19 -0
  190. xfintech/data/source/tushare/stock/monthline/constant.py +87 -0
  191. xfintech/data/source/tushare/stock/monthline/monthline.py +180 -0
  192. xfintech/data/source/tushare/stock/monthline/tests/__init__.py +0 -0
  193. xfintech/data/source/tushare/stock/monthline/tests/test_class_monthline_all.py +574 -0
  194. xfintech/data/source/tushare/stock/stock/__init__.py +19 -0
  195. xfintech/data/source/tushare/stock/stock/constant.py +105 -0
  196. xfintech/data/source/tushare/stock/stock/stock.py +193 -0
  197. xfintech/data/source/tushare/stock/stock/tests/__init__.py +0 -0
  198. xfintech/data/source/tushare/stock/stock/tests/test_class_stock_all.py +788 -0
  199. xfintech/data/source/tushare/stock/stockdividend/__init__.py +21 -0
  200. xfintech/data/source/tushare/stock/stockdividend/constant.py +111 -0
  201. xfintech/data/source/tushare/stock/stockdividend/stockdividend.py +180 -0
  202. xfintech/data/source/tushare/stock/stockdividend/tests/__init__.py +0 -0
  203. xfintech/data/source/tushare/stock/stockdividend/tests/test_class_stockdividend_all.py +725 -0
  204. xfintech/data/source/tushare/stock/stockinfo/__init__.py +19 -0
  205. xfintech/data/source/tushare/stock/stockinfo/constant.py +104 -0
  206. xfintech/data/source/tushare/stock/stockinfo/stockinfo.py +208 -0
  207. xfintech/data/source/tushare/stock/stockinfo/tests/__init__.py +0 -0
  208. xfintech/data/source/tushare/stock/stockinfo/tests/test_class_stockinfo_all.py +881 -0
  209. xfintech/data/source/tushare/stock/stockipo/__init__.py +19 -0
  210. xfintech/data/source/tushare/stock/stockipo/constant.py +90 -0
  211. xfintech/data/source/tushare/stock/stockipo/stockipo.py +234 -0
  212. xfintech/data/source/tushare/stock/stockipo/tests/__init__.py +1 -0
  213. xfintech/data/source/tushare/stock/stockipo/tests/test_class_stockipo_all.py +750 -0
  214. xfintech/data/source/tushare/stock/stockpledge/__init__.py +19 -0
  215. xfintech/data/source/tushare/stock/stockpledge/constant.py +72 -0
  216. xfintech/data/source/tushare/stock/stockpledge/stockpledge.py +158 -0
  217. xfintech/data/source/tushare/stock/stockpledge/tests/__init__.py +0 -0
  218. xfintech/data/source/tushare/stock/stockpledge/tests/test_class_stockpledge_all.py +664 -0
  219. xfintech/data/source/tushare/stock/stockpledgedetail/__init__.py +21 -0
  220. xfintech/data/source/tushare/stock/stockpledgedetail/constant.py +85 -0
  221. xfintech/data/source/tushare/stock/stockpledgedetail/stockpledgedetail.py +171 -0
  222. xfintech/data/source/tushare/stock/stockpledgedetail/tests/__init__.py +0 -0
  223. xfintech/data/source/tushare/stock/stockpledgedetail/tests/test_class_stockpledgedetail_all.py +112 -0
  224. xfintech/data/source/tushare/stock/stockst/__init__.py +19 -0
  225. xfintech/data/source/tushare/stock/stockst/constant.py +80 -0
  226. xfintech/data/source/tushare/stock/stockst/stockst.py +189 -0
  227. xfintech/data/source/tushare/stock/stockst/tests/__init__.py +0 -0
  228. xfintech/data/source/tushare/stock/stockst/tests/test_class_stockst_all.py +693 -0
  229. xfintech/data/source/tushare/stock/stocksuspend/__init__.py +21 -0
  230. xfintech/data/source/tushare/stock/stocksuspend/constant.py +75 -0
  231. xfintech/data/source/tushare/stock/stocksuspend/stocksuspend.py +151 -0
  232. xfintech/data/source/tushare/stock/stocksuspend/tests/__init__.py +0 -0
  233. xfintech/data/source/tushare/stock/stocksuspend/tests/test_class_stocksuspend_all.py +626 -0
  234. xfintech/data/source/tushare/stock/techindex/__init__.py +19 -0
  235. xfintech/data/source/tushare/stock/techindex/constant.py +600 -0
  236. xfintech/data/source/tushare/stock/techindex/techindex.py +314 -0
  237. xfintech/data/source/tushare/stock/techindex/tests/__init__.py +0 -0
  238. xfintech/data/source/tushare/stock/techindex/tests/test_class_techindex_all.py +576 -0
  239. xfintech/data/source/tushare/stock/tradedate/__init__.py +19 -0
  240. xfintech/data/source/tushare/stock/tradedate/constant.py +93 -0
  241. xfintech/data/source/tushare/stock/tradedate/tests/__init__.py +0 -0
  242. xfintech/data/source/tushare/stock/tradedate/tests/test_class_tradedate_all.py +947 -0
  243. xfintech/data/source/tushare/stock/tradedate/tradedate.py +234 -0
  244. xfintech/data/source/tushare/stock/weekline/__init__.py +19 -0
  245. xfintech/data/source/tushare/stock/weekline/constant.py +87 -0
  246. xfintech/data/source/tushare/stock/weekline/tests/__init__.py +0 -0
  247. xfintech/data/source/tushare/stock/weekline/tests/test_class_weekline_all.py +575 -0
  248. xfintech/data/source/tushare/stock/weekline/weekline.py +182 -0
  249. xfintech/fabric/__init__.py +18 -0
  250. xfintech/fabric/column/__init__.py +7 -0
  251. xfintech/fabric/column/info.py +202 -0
  252. xfintech/fabric/column/kind.py +102 -0
  253. xfintech/fabric/column/tests/__init__.py +0 -0
  254. xfintech/fabric/column/tests/test_class_info_all.py +207 -0
  255. xfintech/fabric/column/tests/test_class_kind_all.py +80 -0
  256. xfintech/fabric/table/__init__.py +5 -0
  257. xfintech/fabric/table/info.py +263 -0
  258. xfintech/fabric/table/tests/__init__.py +0 -0
  259. xfintech/fabric/table/tests/test_class_info_all.py +547 -0
  260. xfintech/serde/__init__.py +35 -0
  261. xfintech/serde/common/__init__.py +9 -0
  262. xfintech/serde/common/dataformat.py +78 -0
  263. xfintech/serde/common/deserialiserlike.py +38 -0
  264. xfintech/serde/common/error.py +182 -0
  265. xfintech/serde/common/serialiserlike.py +38 -0
  266. xfintech/serde/common/tests/__init__.py +1 -0
  267. xfintech/serde/common/tests/test_class_dataformat_all.py +694 -0
  268. xfintech/serde/common/tests/test_class_deserialiserlike_all.py +500 -0
  269. xfintech/serde/common/tests/test_class_errors_all.py +518 -0
  270. xfintech/serde/common/tests/test_class_serialiserlike_all.py +401 -0
  271. xfintech/serde/deserialiser/__init__.py +7 -0
  272. xfintech/serde/deserialiser/pandas.py +113 -0
  273. xfintech/serde/deserialiser/python.py +68 -0
  274. xfintech/serde/deserialiser/tests/__init__.py +1 -0
  275. xfintech/serde/deserialiser/tests/test_class_pandasdeserialiser_all.py +503 -0
  276. xfintech/serde/deserialiser/tests/test_class_pythondeserialiser_all.py +570 -0
  277. xfintech/serde/serialiser/__init__.py +7 -0
  278. xfintech/serde/serialiser/pandas.py +116 -0
  279. xfintech/serde/serialiser/python.py +71 -0
  280. xfintech/serde/serialiser/tests/__init__.py +1 -0
  281. xfintech/serde/serialiser/tests/test_class_pandasserialiser_all.py +474 -0
  282. xfintech/serde/serialiser/tests/test_class_pythonserialiser_all.py +508 -0
@@ -0,0 +1,518 @@
1
+ """
2
+ 描述:
3
+ - serde.common.error 模块的单元测试。
4
+ - 测试所有 8 个自定义异常类的继承、实例化和使用。
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ import pytest
10
+
11
+ from xfintech.serde.common.error import (
12
+ DeserialiserFailedError,
13
+ DeserialiserImportError,
14
+ DeserialiserInputTypeError,
15
+ DeserialiserNotSupportedError,
16
+ SerialiserFailedError,
17
+ SerialiserImportError,
18
+ SerialiserInputTypeError,
19
+ SerialiserNotSupportedError,
20
+ )
21
+
22
+ # =============================================================================
23
+ # DeserialiserInputTypeError Tests
24
+ # =============================================================================
25
+
26
+
27
+ def test_deserialiserinputtypeerror_inherits_from_typeerror():
28
+ """测试 DeserialiserInputTypeError 继承自 TypeError"""
29
+ assert issubclass(DeserialiserInputTypeError, TypeError)
30
+
31
+
32
+ def test_deserialiserinputtypeerror_can_instantiate():
33
+ """测试可以实例化 DeserialiserInputTypeError"""
34
+ error = DeserialiserInputTypeError("Test message")
35
+ assert isinstance(error, DeserialiserInputTypeError)
36
+ assert isinstance(error, TypeError)
37
+
38
+
39
+ def test_deserialiserinputtypeerror_can_raise():
40
+ """测试可以抛出 DeserialiserInputTypeError"""
41
+ with pytest.raises(DeserialiserInputTypeError):
42
+ raise DeserialiserInputTypeError("Input type is wrong")
43
+
44
+
45
+ def test_deserialiserinputtypeerror_message():
46
+ """测试 DeserialiserInputTypeError 消息"""
47
+ msg = "Expected bytes, got str"
48
+ error = DeserialiserInputTypeError(msg)
49
+ assert str(error) == msg
50
+
51
+
52
+ def test_deserialiserinputtypeerror_can_catch_as_typeerror():
53
+ """测试可以作为 TypeError 捕获"""
54
+ with pytest.raises(TypeError):
55
+ raise DeserialiserInputTypeError("Wrong type")
56
+
57
+
58
+ def test_deserialiserinputtypeerror_with_multiple_args():
59
+ """测试多参数实例化"""
60
+ error = DeserialiserInputTypeError("Error", "Extra info")
61
+ assert len(error.args) == 2
62
+
63
+
64
+ def test_deserialiserinputtypeerror_empty_message():
65
+ """测试空消息"""
66
+ error = DeserialiserInputTypeError()
67
+ assert str(error) == ""
68
+
69
+
70
+ def test_deserialiserinputtypeerror_use_case():
71
+ """测试实际使用场景"""
72
+
73
+ def deserialise(data):
74
+ if not isinstance(data, bytes):
75
+ raise DeserialiserInputTypeError(f"Expected bytes, got {type(data).__name__}")
76
+
77
+ with pytest.raises(DeserialiserInputTypeError) as excinfo:
78
+ deserialise("not bytes")
79
+ assert "Expected bytes" in str(excinfo.value)
80
+
81
+
82
+ # =============================================================================
83
+ # DeserialiserNotSupportedError Tests
84
+ # =============================================================================
85
+
86
+
87
+ def test_deserialisernotsupportederror_inherits_from_typeerror():
88
+ """测试 DeserialiserNotSupportedError 继承自 TypeError"""
89
+ assert issubclass(DeserialiserNotSupportedError, TypeError)
90
+
91
+
92
+ def test_deserialisernotsupportederror_can_instantiate():
93
+ """测试可以实例化 DeserialiserNotSupportedError"""
94
+ error = DeserialiserNotSupportedError("Test message")
95
+ assert isinstance(error, DeserialiserNotSupportedError)
96
+ assert isinstance(error, TypeError)
97
+
98
+
99
+ def test_deserialisernotsupportederror_can_raise():
100
+ """测试可以抛出 DeserialiserNotSupportedError"""
101
+ with pytest.raises(DeserialiserNotSupportedError):
102
+ raise DeserialiserNotSupportedError("Format not supported")
103
+
104
+
105
+ def test_deserialisernotsupportederror_message():
106
+ """测试 DeserialiserNotSupportedError 消息"""
107
+ msg = "XML format not supported"
108
+ error = DeserialiserNotSupportedError(msg)
109
+ assert str(error) == msg
110
+
111
+
112
+ def test_deserialisernotsupportederror_use_case():
113
+ """测试实际使用场景"""
114
+
115
+ def deserialise(data, format):
116
+ supported = ["json", "csv", "parquet"]
117
+ if format not in supported:
118
+ raise DeserialiserNotSupportedError(f"Format '{format}' not supported. Supported: {supported}")
119
+
120
+ with pytest.raises(DeserialiserNotSupportedError) as excinfo:
121
+ deserialise(b"data", "xml")
122
+ assert "xml" in str(excinfo.value)
123
+
124
+
125
+ # =============================================================================
126
+ # DeserialiserImportError Tests
127
+ # =============================================================================
128
+
129
+
130
+ def test_deserialiserimporterror_inherits_from_importerror():
131
+ """测试 DeserialiserImportError 继承自 ImportError"""
132
+ assert issubclass(DeserialiserImportError, ImportError)
133
+
134
+
135
+ def test_deserialiserimporterror_can_instantiate():
136
+ """测试可以实例化 DeserialiserImportError"""
137
+ error = DeserialiserImportError("Test message")
138
+ assert isinstance(error, DeserialiserImportError)
139
+ assert isinstance(error, ImportError)
140
+
141
+
142
+ def test_deserialiserimporterror_can_raise():
143
+ """测试可以抛出 DeserialiserImportError"""
144
+ with pytest.raises(DeserialiserImportError):
145
+ raise DeserialiserImportError("Missing dependency")
146
+
147
+
148
+ def test_deserialiserimporterror_message():
149
+ """测试 DeserialiserImportError 消息"""
150
+ msg = "pyarrow is required"
151
+ error = DeserialiserImportError(msg)
152
+ assert str(error) == msg
153
+
154
+
155
+ def test_deserialiserimporterror_can_catch_as_importerror():
156
+ """测试可以作为 ImportError 捕获"""
157
+ with pytest.raises(ImportError):
158
+ raise DeserialiserImportError("Missing module")
159
+
160
+
161
+ def test_deserialiserimporterror_with_cause():
162
+ """测试带原因链的异常"""
163
+ original = ImportError("No module named 'pandas'")
164
+ try:
165
+ raise DeserialiserImportError("pandas required") from original
166
+ except DeserialiserImportError as e:
167
+ assert e.__cause__ is original
168
+
169
+
170
+ # =============================================================================
171
+ # DeserialiserFailedError Tests
172
+ # =============================================================================
173
+
174
+
175
+ def test_deserialisedfailederror_inherits_from_exception():
176
+ """测试 DeserialiserFailedError 继承自 Exception"""
177
+ assert issubclass(DeserialiserFailedError, Exception)
178
+
179
+
180
+ def test_deserialisedfailederror_can_instantiate():
181
+ """测试可以实例化 DeserialiserFailedError"""
182
+ error = DeserialiserFailedError("Test message")
183
+ assert isinstance(error, DeserialiserFailedError)
184
+ assert isinstance(error, Exception)
185
+
186
+
187
+ def test_deserialisedfailederror_can_raise():
188
+ """测试可以抛出 DeserialiserFailedError"""
189
+ with pytest.raises(DeserialiserFailedError):
190
+ raise DeserialiserFailedError("Deserialisation failed")
191
+
192
+
193
+ def test_deserialisedfailederror_message():
194
+ """测试 DeserialiserFailedError 消息"""
195
+ msg = "Failed to parse data"
196
+ error = DeserialiserFailedError(msg)
197
+ assert str(error) == msg
198
+
199
+
200
+ def test_deserialisedfailederror_not_typeerror():
201
+ """测试不是 TypeError"""
202
+ error = DeserialiserFailedError()
203
+ assert not isinstance(error, TypeError)
204
+
205
+
206
+ def test_deserialisedfailederror_use_case():
207
+ """测试实际使用场景"""
208
+ import json
209
+
210
+ def deserialise_json(data):
211
+ try:
212
+ return json.loads(data)
213
+ except json.JSONDecodeError as e:
214
+ raise DeserialiserFailedError(f"Failed to deserialise JSON: {e}") from e
215
+
216
+ with pytest.raises(DeserialiserFailedError) as excinfo:
217
+ deserialise_json(b"invalid json")
218
+ assert "Failed to deserialise JSON" in str(excinfo.value)
219
+
220
+
221
+ def test_deserialisedfailederror_with_cause():
222
+ """测试带原因链的异常"""
223
+ original = ValueError("Invalid data")
224
+ try:
225
+ raise DeserialiserFailedError("Parsing failed") from original
226
+ except DeserialiserFailedError as e:
227
+ assert e.__cause__ is original
228
+
229
+
230
+ # =============================================================================
231
+ # SerialiserInputTypeError Tests
232
+ # =============================================================================
233
+
234
+
235
+ def test_serialiserinputtypeerror_inherits_from_typeerror():
236
+ """测试 SerialiserInputTypeError 继承自 TypeError"""
237
+ assert issubclass(SerialiserInputTypeError, TypeError)
238
+
239
+
240
+ def test_serialiserinputtypeerror_can_instantiate():
241
+ """测试可以实例化 SerialiserInputTypeError"""
242
+ error = SerialiserInputTypeError("Test message")
243
+ assert isinstance(error, SerialiserInputTypeError)
244
+ assert isinstance(error, TypeError)
245
+
246
+
247
+ def test_serialiserinputtypeerror_can_raise():
248
+ """测试可以抛出 SerialiserInputTypeError"""
249
+ with pytest.raises(SerialiserInputTypeError):
250
+ raise SerialiserInputTypeError("Input type is wrong")
251
+
252
+
253
+ def test_serialiserinputtypeerror_message():
254
+ """测试 SerialiserInputTypeError 消息"""
255
+ msg = "Expected DataFrame, got list"
256
+ error = SerialiserInputTypeError(msg)
257
+ assert str(error) == msg
258
+
259
+
260
+ def test_serialiserinputtypeerror_can_catch_as_typeerror():
261
+ """测试可以作为 TypeError 捕获"""
262
+ with pytest.raises(TypeError):
263
+ raise SerialiserInputTypeError("Wrong type")
264
+
265
+
266
+ def test_serialiserinputtypeerror_use_case():
267
+ """测试实际使用场景"""
268
+
269
+ def serialise(data):
270
+ if not hasattr(data, "to_dict"):
271
+ raise SerialiserInputTypeError(f"Expected DataFrame-like object, got {type(data).__name__}")
272
+
273
+ with pytest.raises(SerialiserInputTypeError) as excinfo:
274
+ serialise([1, 2, 3])
275
+ assert "Expected DataFrame-like" in str(excinfo.value)
276
+
277
+
278
+ # =============================================================================
279
+ # SerialiserNotSupportedError Tests
280
+ # =============================================================================
281
+
282
+
283
+ def test_serialisernotsupportederror_inherits_from_typeerror():
284
+ """测试 SerialiserNotSupportedError 继承自 TypeError"""
285
+ assert issubclass(SerialiserNotSupportedError, TypeError)
286
+
287
+
288
+ def test_serialisernotsupportederror_can_instantiate():
289
+ """测试可以实例化 SerialiserNotSupportedError"""
290
+ error = SerialiserNotSupportedError("Test message")
291
+ assert isinstance(error, SerialiserNotSupportedError)
292
+ assert isinstance(error, TypeError)
293
+
294
+
295
+ def test_serialisernotsupportederror_can_raise():
296
+ """测试可以抛出 SerialiserNotSupportedError"""
297
+ with pytest.raises(SerialiserNotSupportedError):
298
+ raise SerialiserNotSupportedError("Format not supported")
299
+
300
+
301
+ def test_serialisernotsupportederror_message():
302
+ """测试 SerialiserNotSupportedError 消息"""
303
+ msg = "XML format not supported"
304
+ error = SerialiserNotSupportedError(msg)
305
+ assert str(error) == msg
306
+
307
+
308
+ def test_serialisernotsupportederror_use_case():
309
+ """测试实际使用场景"""
310
+
311
+ def serialise(data, format):
312
+ supported = ["json", "csv", "parquet"]
313
+ if format not in supported:
314
+ raise SerialiserNotSupportedError(f"Format '{format}' not supported. Supported: {supported}")
315
+
316
+ with pytest.raises(SerialiserNotSupportedError) as excinfo:
317
+ serialise({}, "xml")
318
+ assert "xml" in str(excinfo.value)
319
+
320
+
321
+ # =============================================================================
322
+ # SerialiserImportError Tests
323
+ # =============================================================================
324
+
325
+
326
+ def test_serialiserimporterror_inherits_from_importerror():
327
+ """测试 SerialiserImportError 继承自 ImportError"""
328
+ assert issubclass(SerialiserImportError, ImportError)
329
+
330
+
331
+ def test_serialiserimporterror_can_instantiate():
332
+ """测试可以实例化 SerialiserImportError"""
333
+ error = SerialiserImportError("Test message")
334
+ assert isinstance(error, SerialiserImportError)
335
+ assert isinstance(error, ImportError)
336
+
337
+
338
+ def test_serialiserimporterror_can_raise():
339
+ """测试可以抛出 SerialiserImportError"""
340
+ with pytest.raises(SerialiserImportError):
341
+ raise SerialiserImportError("Missing dependency")
342
+
343
+
344
+ def test_serialiserimporterror_message():
345
+ """测试 SerialiserImportError 消息"""
346
+ msg = "pyarrow is required"
347
+ error = SerialiserImportError(msg)
348
+ assert str(error) == msg
349
+
350
+
351
+ def test_serialiserimporterror_can_catch_as_importerror():
352
+ """测试可以作为 ImportError 捕获"""
353
+ with pytest.raises(ImportError):
354
+ raise SerialiserImportError("Missing module")
355
+
356
+
357
+ def test_serialiserimporterror_with_cause():
358
+ """测试带原因链的异常"""
359
+ original = ImportError("No module named 'pandas'")
360
+ try:
361
+ raise SerialiserImportError("pandas required") from original
362
+ except SerialiserImportError as e:
363
+ assert e.__cause__ is original
364
+
365
+
366
+ # =============================================================================
367
+ # SerialiserFailedError Tests
368
+ # =============================================================================
369
+
370
+
371
+ def test_serialiserfailederror_inherits_from_exception():
372
+ """测试 SerialiserFailedError 继承自 Exception"""
373
+ assert issubclass(SerialiserFailedError, Exception)
374
+
375
+
376
+ def test_serialiserfailederror_can_instantiate():
377
+ """测试可以实例化 SerialiserFailedError"""
378
+ error = SerialiserFailedError("Test message")
379
+ assert isinstance(error, SerialiserFailedError)
380
+ assert isinstance(error, Exception)
381
+
382
+
383
+ def test_serialiserfailederror_can_raise():
384
+ """测试可以抛出 SerialiserFailedError"""
385
+ with pytest.raises(SerialiserFailedError):
386
+ raise SerialiserFailedError("Serialisation failed")
387
+
388
+
389
+ def test_serialiserfailederror_message():
390
+ """测试 SerialiserFailedError 消息"""
391
+ msg = "Failed to convert data"
392
+ error = SerialiserFailedError(msg)
393
+ assert str(error) == msg
394
+
395
+
396
+ def test_serialiserfailederror_not_typeerror():
397
+ """测试不是 TypeError"""
398
+ error = SerialiserFailedError()
399
+ assert not isinstance(error, TypeError)
400
+
401
+
402
+ def test_serialiserfailederror_use_case():
403
+ """测试实际使用场景"""
404
+ import json
405
+
406
+ def serialise_json(data):
407
+ try:
408
+ return json.dumps(data).encode()
409
+ except (TypeError, ValueError) as e:
410
+ raise SerialiserFailedError(f"Failed to serialise to JSON: {e}") from e
411
+
412
+ # Create non-serializable object
413
+ class NonSerializable:
414
+ pass
415
+
416
+ with pytest.raises(SerialiserFailedError) as excinfo:
417
+ serialise_json({"obj": NonSerializable()})
418
+ assert "Failed to serialise to JSON" in str(excinfo.value)
419
+
420
+
421
+ def test_serialiserfailederror_with_cause():
422
+ """测试带原因链的异常"""
423
+ original = ValueError("Invalid data")
424
+ try:
425
+ raise SerialiserFailedError("Conversion failed") from original
426
+ except SerialiserFailedError as e:
427
+ assert e.__cause__ is original
428
+
429
+
430
+ # =============================================================================
431
+ # Cross-Error Distinction Tests
432
+ # =============================================================================
433
+
434
+
435
+ def test_deserialiser_and_serialiser_input_type_errors_are_distinct():
436
+ """测试反序列化和序列化输入类型错误是不同的类"""
437
+ assert DeserialiserInputTypeError is not SerialiserInputTypeError
438
+ assert not issubclass(DeserialiserInputTypeError, SerialiserInputTypeError)
439
+ assert not issubclass(SerialiserInputTypeError, DeserialiserInputTypeError)
440
+
441
+
442
+ def test_deserialiser_and_serialiser_not_supported_errors_are_distinct():
443
+ """测试反序列化和序列化不支持错误是不同的类"""
444
+ assert DeserialiserNotSupportedError is not SerialiserNotSupportedError
445
+ assert not issubclass(DeserialiserNotSupportedError, SerialiserNotSupportedError)
446
+ assert not issubclass(SerialiserNotSupportedError, DeserialiserNotSupportedError)
447
+
448
+
449
+ def test_deserialiser_and_serialiser_import_errors_are_distinct():
450
+ """测试反序列化和序列化导入错误是不同的类"""
451
+ assert DeserialiserImportError is not SerialiserImportError
452
+ assert not issubclass(DeserialiserImportError, SerialiserImportError)
453
+ assert not issubclass(SerialiserImportError, DeserialiserImportError)
454
+
455
+
456
+ def test_deserialiser_and_serialiser_failed_errors_are_distinct():
457
+ """测试反序列化和序列化失败错误是不同的类"""
458
+ assert DeserialiserFailedError is not SerialiserFailedError
459
+ assert not issubclass(DeserialiserFailedError, SerialiserFailedError)
460
+ assert not issubclass(SerialiserFailedError, DeserialiserFailedError)
461
+
462
+
463
+ # =============================================================================
464
+ # Error Hierarchy Tests
465
+ # =============================================================================
466
+
467
+
468
+ def test_all_typeerror_subclasses():
469
+ """测试所有 TypeError 子类"""
470
+ typeerror_subclasses = [
471
+ DeserialiserInputTypeError,
472
+ DeserialiserNotSupportedError,
473
+ SerialiserInputTypeError,
474
+ SerialiserNotSupportedError,
475
+ ]
476
+ for error_class in typeerror_subclasses:
477
+ assert issubclass(error_class, TypeError)
478
+
479
+
480
+ def test_all_importerror_subclasses():
481
+ """测试所有 ImportError 子类"""
482
+ importerror_subclasses = [
483
+ DeserialiserImportError,
484
+ SerialiserImportError,
485
+ ]
486
+ for error_class in importerror_subclasses:
487
+ assert issubclass(error_class, ImportError)
488
+
489
+
490
+ def test_all_exception_subclasses():
491
+ """测试所有 Exception 子类(不是 TypeError 或 ImportError)"""
492
+ exception_subclasses = [
493
+ DeserialiserFailedError,
494
+ SerialiserFailedError,
495
+ ]
496
+ for error_class in exception_subclasses:
497
+ assert issubclass(error_class, Exception)
498
+ assert not issubclass(error_class, TypeError)
499
+ assert not issubclass(error_class, ImportError)
500
+
501
+
502
+ def test_error_catching_with_multiple_types():
503
+ """测试捕获多种错误类型"""
504
+
505
+ def operation():
506
+ raise DeserialiserInputTypeError("Type error")
507
+
508
+ # Can catch as specific type
509
+ with pytest.raises(DeserialiserInputTypeError):
510
+ operation()
511
+
512
+ # Can catch as TypeError
513
+ with pytest.raises(TypeError):
514
+ operation()
515
+
516
+ # Can catch as Exception
517
+ with pytest.raises(Exception):
518
+ operation()