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,503 @@
1
+ import pandas as pd
2
+ import pytest
3
+
4
+ from xfintech.serde.common.dataformat import DataFormat
5
+ from xfintech.serde.common.error import (
6
+ DeserialiserFailedError,
7
+ DeserialiserInputTypeError,
8
+ )
9
+ from xfintech.serde.deserialiser.pandas import PandasDeserialiser
10
+ from xfintech.serde.serialiser.pandas import PandasSerialiser
11
+
12
+ # ==================== Class Structure Tests ====================
13
+
14
+
15
+ def test_pandasdeserialiser_has_deserialise_method():
16
+ """Test PandasDeserialiser has deserialise method"""
17
+ assert hasattr(PandasDeserialiser, "deserialise")
18
+ assert callable(PandasDeserialiser.deserialise)
19
+
20
+
21
+ def test_pandasdeserialiser_has_from_parquet_method():
22
+ """Test PandasDeserialiser has from_parquet method"""
23
+ assert hasattr(PandasDeserialiser, "from_parquet")
24
+ assert callable(PandasDeserialiser.from_parquet)
25
+
26
+
27
+ def test_pandasdeserialiser_has_from_csv_method():
28
+ """Test PandasDeserialiser has from_csv method"""
29
+ assert hasattr(PandasDeserialiser, "from_csv")
30
+ assert callable(PandasDeserialiser.from_csv)
31
+
32
+
33
+ def test_pandasdeserialiser_has_from_json_method():
34
+ """Test PandasDeserialiser has from_json method"""
35
+ assert hasattr(PandasDeserialiser, "from_json")
36
+ assert callable(PandasDeserialiser.from_json)
37
+
38
+
39
+ def test_pandasdeserialiser_methods_are_static():
40
+ """Test all methods are static methods"""
41
+ assert isinstance(PandasDeserialiser.__dict__["deserialise"], staticmethod)
42
+ assert isinstance(PandasDeserialiser.__dict__["from_parquet"], staticmethod)
43
+ assert isinstance(PandasDeserialiser.__dict__["from_csv"], staticmethod)
44
+ assert isinstance(PandasDeserialiser.__dict__["from_json"], staticmethod)
45
+
46
+
47
+ # ==================== deserialise() Method Tests ====================
48
+
49
+
50
+ def test_deserialise_with_parquet_format_enum():
51
+ """Test deserialise with PARQUET DataFormat enum"""
52
+ df = pd.DataFrame({"a": [1, 2, 3], "b": [4, 5, 6]})
53
+ bytes_data = PandasSerialiser.to_parquet(df)
54
+ result = PandasDeserialiser.deserialise(bytes_data, DataFormat.PARQUET)
55
+ assert isinstance(result, pd.DataFrame)
56
+ assert result.equals(df)
57
+
58
+
59
+ def test_deserialise_with_parquet_format_string():
60
+ """Test deserialise with 'parquet' string"""
61
+ df = pd.DataFrame({"a": [1, 2, 3], "b": [4, 5, 6]})
62
+ bytes_data = PandasSerialiser.to_parquet(df)
63
+ result = PandasDeserialiser.deserialise(bytes_data, "parquet")
64
+ assert isinstance(result, pd.DataFrame)
65
+ assert result.equals(df)
66
+
67
+
68
+ def test_deserialise_with_csv_format_enum():
69
+ """Test deserialise with CSV DataFormat enum"""
70
+ df = pd.DataFrame({"a": [1, 2, 3], "b": [4, 5, 6]})
71
+ bytes_data = PandasSerialiser.to_csv(df, index=False)
72
+ result = PandasDeserialiser.deserialise(bytes_data, DataFormat.CSV)
73
+ assert isinstance(result, pd.DataFrame)
74
+ assert list(result.columns) == ["a", "b"]
75
+
76
+
77
+ def test_deserialise_with_csv_format_string():
78
+ """Test deserialise with 'csv' string"""
79
+ df = pd.DataFrame({"a": [1, 2, 3], "b": [4, 5, 6]})
80
+ bytes_data = PandasSerialiser.to_csv(df, index=False)
81
+ result = PandasDeserialiser.deserialise(bytes_data, "csv")
82
+ assert isinstance(result, pd.DataFrame)
83
+ assert list(result.columns) == ["a", "b"]
84
+
85
+
86
+ def test_deserialise_with_json_format_enum():
87
+ """Test deserialise with JSON DataFormat enum"""
88
+ df = pd.DataFrame({"a": [1, 2, 3], "b": [4, 5, 6]})
89
+ bytes_data = PandasSerialiser.to_json(df)
90
+ result = PandasDeserialiser.deserialise(bytes_data, DataFormat.JSON)
91
+ assert isinstance(result, pd.DataFrame)
92
+ assert list(result.columns) == ["a", "b"]
93
+
94
+
95
+ def test_deserialise_with_json_format_string():
96
+ """Test deserialise with 'json' string"""
97
+ df = pd.DataFrame({"a": [1, 2, 3], "b": [4, 5, 6]})
98
+ bytes_data = PandasSerialiser.to_json(df)
99
+ result = PandasDeserialiser.deserialise(bytes_data, "json")
100
+ assert isinstance(result, pd.DataFrame)
101
+ assert list(result.columns) == ["a", "b"]
102
+
103
+
104
+ def test_deserialise_with_uppercase_format_string():
105
+ """Test deserialise with uppercase format string"""
106
+ df = pd.DataFrame({"a": [1, 2]})
107
+ bytes_data = PandasSerialiser.to_parquet(df)
108
+ result = PandasDeserialiser.deserialise(bytes_data, "PARQUET")
109
+ assert isinstance(result, pd.DataFrame)
110
+
111
+
112
+ def test_deserialise_with_mixed_case_format_string():
113
+ """Test deserialise with mixed case format string"""
114
+ df = pd.DataFrame({"a": [1, 2]})
115
+ bytes_data = PandasSerialiser.to_csv(df, index=False)
116
+ result = PandasDeserialiser.deserialise(bytes_data, "CsV")
117
+ assert isinstance(result, pd.DataFrame)
118
+
119
+
120
+ def test_deserialise_raises_on_non_bytes():
121
+ """Test deserialise raises error for non-bytes input"""
122
+ with pytest.raises(DeserialiserInputTypeError) as exc_info:
123
+ PandasDeserialiser.deserialise([1, 2, 3], DataFormat.PARQUET)
124
+ assert "expects bytes" in str(exc_info.value)
125
+
126
+
127
+ def test_deserialise_raises_on_string_input():
128
+ """Test deserialise raises error for string input"""
129
+ with pytest.raises(DeserialiserInputTypeError):
130
+ PandasDeserialiser.deserialise("not bytes", DataFormat.CSV)
131
+
132
+
133
+ def test_deserialise_raises_on_dict_input():
134
+ """Test deserialise raises error for dict input"""
135
+ with pytest.raises(DeserialiserInputTypeError):
136
+ PandasDeserialiser.deserialise({"a": [1, 2]}, DataFormat.JSON)
137
+
138
+
139
+ def test_deserialise_raises_on_none_input():
140
+ """Test deserialise raises error for None input"""
141
+ with pytest.raises(DeserialiserInputTypeError):
142
+ PandasDeserialiser.deserialise(None, DataFormat.PARQUET)
143
+
144
+
145
+ def test_deserialise_raises_on_unsupported_format():
146
+ """Test deserialise raises error for unsupported format"""
147
+ with pytest.raises(ValueError) as exc_info:
148
+ PandasDeserialiser.deserialise(b"data", "xml")
149
+ assert "Unknown DataFormat" in str(exc_info.value)
150
+
151
+
152
+ def test_deserialise_raises_on_invalid_data():
153
+ """Test deserialise raises error for invalid data"""
154
+ with pytest.raises(DeserialiserFailedError):
155
+ PandasDeserialiser.deserialise(b"invalid data", DataFormat.PARQUET)
156
+
157
+
158
+ def test_deserialise_empty_csv():
159
+ """Test deserialise with empty CSV raises error"""
160
+ bytes_data = b""
161
+ with pytest.raises(DeserialiserFailedError):
162
+ PandasDeserialiser.deserialise(bytes_data, DataFormat.CSV)
163
+
164
+
165
+ # ==================== from_parquet() Method Tests ====================
166
+
167
+
168
+ def test_from_parquet_basic():
169
+ """Test from_parquet with basic DataFrame"""
170
+ df = pd.DataFrame({"a": [1, 2, 3], "b": ["x", "y", "z"]})
171
+ bytes_data = PandasSerialiser.to_parquet(df)
172
+ result = PandasDeserialiser.from_parquet(bytes_data)
173
+ assert isinstance(result, pd.DataFrame)
174
+ assert result.equals(df)
175
+
176
+
177
+ def test_from_parquet_returns_dataframe():
178
+ """Test from_parquet returns pandas DataFrame"""
179
+ df = pd.DataFrame({"col1": [1, 2, 3], "col2": [4.5, 5.6, 6.7]})
180
+ bytes_data = PandasSerialiser.to_parquet(df)
181
+ result = PandasDeserialiser.from_parquet(bytes_data)
182
+ assert type(result).__name__ == "DataFrame"
183
+
184
+
185
+ def test_from_parquet_preserves_data_types():
186
+ """Test from_parquet preserves data types"""
187
+ df = pd.DataFrame({"int": [1, 2, 3], "float": [1.1, 2.2, 3.3], "str": ["a", "b", "c"]})
188
+ bytes_data = PandasSerialiser.to_parquet(df)
189
+ result = PandasDeserialiser.from_parquet(bytes_data)
190
+ assert result["int"].dtype == df["int"].dtype
191
+ assert result["float"].dtype == df["float"].dtype
192
+
193
+
194
+ def test_from_parquet_with_datetime_column():
195
+ """Test from_parquet with datetime column"""
196
+ df = pd.DataFrame({"date": pd.date_range("2024-01-01", periods=3)})
197
+ bytes_data = PandasSerialiser.to_parquet(df)
198
+ result = PandasDeserialiser.from_parquet(bytes_data)
199
+ assert isinstance(result, pd.DataFrame)
200
+ assert len(result) == 3
201
+
202
+
203
+ def test_from_parquet_with_mixed_types():
204
+ """Test from_parquet with mixed data types"""
205
+ df = pd.DataFrame({"int": [1, 2, 3], "float": [1.1, 2.2, 3.3], "str": ["a", "b", "c"], "bool": [True, False, True]})
206
+ bytes_data = PandasSerialiser.to_parquet(df)
207
+ result = PandasDeserialiser.from_parquet(bytes_data)
208
+ assert result.equals(df)
209
+
210
+
211
+ def test_from_parquet_raises_on_invalid_bytes():
212
+ """Test from_parquet raises error for invalid parquet bytes"""
213
+ with pytest.raises(DeserialiserFailedError):
214
+ PandasDeserialiser.from_parquet(b"not valid parquet")
215
+
216
+
217
+ def test_from_parquet_large_dataframe():
218
+ """Test from_parquet with large DataFrame"""
219
+ df = pd.DataFrame({"col": range(10000)})
220
+ bytes_data = PandasSerialiser.to_parquet(df)
221
+ result = PandasDeserialiser.from_parquet(bytes_data)
222
+ assert len(result) == 10000
223
+
224
+
225
+ def test_from_parquet_multiindex():
226
+ """Test from_parquet with MultiIndex DataFrame"""
227
+ arrays = [["A", "A", "B", "B"], [1, 2, 1, 2]]
228
+ index = pd.MultiIndex.from_arrays(arrays, names=["letter", "number"])
229
+ df = pd.DataFrame({"value": [10, 20, 30, 40]}, index=index)
230
+ bytes_data = PandasSerialiser.to_parquet(df)
231
+ result = PandasDeserialiser.from_parquet(bytes_data)
232
+ assert isinstance(result, pd.DataFrame)
233
+
234
+
235
+ # ==================== from_csv() Method Tests ====================
236
+
237
+
238
+ def test_from_csv_basic():
239
+ """Test from_csv with basic DataFrame"""
240
+ df = pd.DataFrame({"a": [1, 2, 3], "b": [4, 5, 6]})
241
+ bytes_data = PandasSerialiser.to_csv(df, index=False)
242
+ result = PandasDeserialiser.from_csv(bytes_data)
243
+ assert isinstance(result, pd.DataFrame)
244
+ assert list(result.columns) == ["a", "b"]
245
+
246
+
247
+ def test_from_csv_returns_dataframe():
248
+ """Test from_csv returns pandas DataFrame"""
249
+ df = pd.DataFrame({"col1": [1, 2, 3], "col2": [4, 5, 6]})
250
+ bytes_data = PandasSerialiser.to_csv(df, index=False)
251
+ result = PandasDeserialiser.from_csv(bytes_data)
252
+ assert type(result).__name__ == "DataFrame"
253
+
254
+
255
+ def test_from_csv_with_custom_encoding():
256
+ """Test from_csv with custom encoding"""
257
+ df = pd.DataFrame({"a": ["中文", "日本語"]})
258
+ bytes_data = PandasSerialiser.to_csv(df, index=False, encoding="utf-8")
259
+ result = PandasDeserialiser.from_csv(bytes_data, encoding="utf-8")
260
+ assert isinstance(result, pd.DataFrame)
261
+
262
+
263
+ def test_from_csv_empty():
264
+ """Test from_csv with empty CSV raises error"""
265
+ bytes_data = b""
266
+ with pytest.raises(DeserialiserFailedError):
267
+ PandasDeserialiser.from_csv(bytes_data)
268
+
269
+
270
+ def test_from_csv_with_na_values():
271
+ """Test from_csv with NA values"""
272
+ df = pd.DataFrame({"a": [1, None, 3], "b": [4, 5, None]})
273
+ bytes_data = PandasSerialiser.to_csv(df, index=False)
274
+ result = PandasDeserialiser.from_csv(bytes_data)
275
+ assert isinstance(result, pd.DataFrame)
276
+ assert result.isna().sum().sum() >= 2 # At least 2 NA values
277
+
278
+
279
+ def test_from_csv_raises_on_invalid_bytes():
280
+ """Test from_csv raises error for invalid CSV bytes"""
281
+ with pytest.raises(DeserialiserFailedError):
282
+ PandasDeserialiser.from_csv(b"\xff\xfe") # Invalid UTF-8
283
+
284
+
285
+ def test_from_csv_with_special_characters():
286
+ """Test from_csv with special characters"""
287
+ df = pd.DataFrame({"col": ["test,with,comma", "test\nwith\nnewline"]})
288
+ bytes_data = PandasSerialiser.to_csv(df, index=False)
289
+ result = PandasDeserialiser.from_csv(bytes_data)
290
+ assert isinstance(result, pd.DataFrame)
291
+
292
+
293
+ def test_from_csv_single_column():
294
+ """Test from_csv with single column"""
295
+ df = pd.DataFrame({"x": [1, 2, 3]})
296
+ bytes_data = PandasSerialiser.to_csv(df, index=False)
297
+ result = PandasDeserialiser.from_csv(bytes_data)
298
+ assert list(result.columns) == ["x"]
299
+
300
+
301
+ # ==================== from_json() Method Tests ====================
302
+
303
+
304
+ def test_from_json_basic():
305
+ """Test from_json with basic DataFrame"""
306
+ df = pd.DataFrame({"a": [1, 2, 3], "b": [4, 5, 6]})
307
+ bytes_data = PandasSerialiser.to_json(df)
308
+ result = PandasDeserialiser.from_json(bytes_data)
309
+ assert isinstance(result, pd.DataFrame)
310
+ assert list(result.columns) == ["a", "b"]
311
+
312
+
313
+ def test_from_json_returns_dataframe():
314
+ """Test from_json returns pandas DataFrame"""
315
+ df = pd.DataFrame({"col1": [1, 2], "col2": [3, 4]})
316
+ bytes_data = PandasSerialiser.to_json(df)
317
+ result = PandasDeserialiser.from_json(bytes_data)
318
+ assert type(result).__name__ == "DataFrame"
319
+
320
+
321
+ def test_from_json_with_orient_records():
322
+ """Test from_json with orient='records'"""
323
+ df = pd.DataFrame({"a": [1, 2], "b": [3, 4]})
324
+ bytes_data = PandasSerialiser.to_json(df, orient="records")
325
+ result = PandasDeserialiser.from_json(bytes_data, orient="records")
326
+ assert isinstance(result, pd.DataFrame)
327
+
328
+
329
+ def test_from_json_with_orient_split():
330
+ """Test from_json with orient='split'"""
331
+ df = pd.DataFrame({"a": [1, 2], "b": [3, 4]})
332
+ bytes_data = PandasSerialiser.to_json(df, orient="split")
333
+ result = PandasDeserialiser.from_json(bytes_data, orient="split")
334
+ assert isinstance(result, pd.DataFrame)
335
+
336
+
337
+ def test_from_json_with_orient_index():
338
+ """Test from_json with orient='index'"""
339
+ df = pd.DataFrame({"a": [1, 2], "b": [3, 4]})
340
+ bytes_data = PandasSerialiser.to_json(df, orient="index")
341
+ result = PandasDeserialiser.from_json(bytes_data, orient="index")
342
+ assert isinstance(result, pd.DataFrame)
343
+
344
+
345
+ def test_from_json_with_orient_columns():
346
+ """Test from_json with orient='columns'"""
347
+ df = pd.DataFrame({"a": [1, 2], "b": [3, 4]})
348
+ bytes_data = PandasSerialiser.to_json(df, orient="columns")
349
+ result = PandasDeserialiser.from_json(bytes_data, orient="columns")
350
+ assert isinstance(result, pd.DataFrame)
351
+
352
+
353
+ def test_from_json_with_orient_values():
354
+ """Test from_json with orient='values'"""
355
+ df = pd.DataFrame({"a": [1, 2], "b": [3, 4]})
356
+ bytes_data = PandasSerialiser.to_json(df, orient="values")
357
+ result = PandasDeserialiser.from_json(bytes_data, orient="values")
358
+ assert isinstance(result, pd.DataFrame)
359
+
360
+
361
+ def test_from_json_with_custom_encoding():
362
+ """Test from_json with custom encoding"""
363
+ df = pd.DataFrame({"a": [1, 2]})
364
+ bytes_data = PandasSerialiser.to_json(df, encoding="utf-8")
365
+ result = PandasDeserialiser.from_json(bytes_data, encoding="utf-8")
366
+ assert isinstance(result, pd.DataFrame)
367
+
368
+
369
+ def test_from_json_empty():
370
+ """Test from_json with empty JSON"""
371
+ bytes_data = b"{}"
372
+ result = PandasDeserialiser.from_json(bytes_data)
373
+ assert isinstance(result, pd.DataFrame)
374
+
375
+
376
+ def test_from_json_raises_on_invalid_bytes():
377
+ """Test from_json raises error for invalid JSON bytes"""
378
+ with pytest.raises(DeserialiserFailedError):
379
+ PandasDeserialiser.from_json(b"not valid json")
380
+
381
+
382
+ def test_from_json_with_unicode():
383
+ """Test from_json with Unicode characters"""
384
+ df = pd.DataFrame({"text": ["Hello 世界", "Привет"]})
385
+ bytes_data = PandasSerialiser.to_json(df)
386
+ result = PandasDeserialiser.from_json(bytes_data)
387
+ assert isinstance(result, pd.DataFrame)
388
+
389
+
390
+ def test_from_json_with_lines_format():
391
+ """Test from_json with lines=True (newline-delimited JSON)"""
392
+ df = pd.DataFrame({"a": [1, 2], "b": [3, 4]})
393
+ bytes_data = PandasSerialiser.to_json(df, orient="records", lines=True)
394
+ result = PandasDeserialiser.from_json(bytes_data, orient="records", lines=True)
395
+ assert isinstance(result, pd.DataFrame)
396
+ assert len(result) == 2
397
+
398
+
399
+ # ==================== Roundtrip Tests ====================
400
+
401
+
402
+ def test_roundtrip_parquet():
403
+ """Test serialise and deserialise roundtrip for PARQUET"""
404
+ original = pd.DataFrame({"int": [1, 2, 3], "float": [1.1, 2.2, 3.3], "str": ["a", "b", "c"]})
405
+ bytes_data = PandasSerialiser.serialise(original, DataFormat.PARQUET)
406
+ result = PandasDeserialiser.deserialise(bytes_data, DataFormat.PARQUET)
407
+ assert result.equals(original)
408
+
409
+
410
+ def test_roundtrip_csv():
411
+ """Test serialise and deserialise roundtrip for CSV"""
412
+ original = pd.DataFrame({"a": [1, 2, 3], "b": [4, 5, 6]})
413
+ bytes_data = PandasSerialiser.serialise(original, DataFormat.CSV, index=False)
414
+ result = PandasDeserialiser.deserialise(bytes_data, DataFormat.CSV)
415
+ assert list(result.columns) == list(original.columns)
416
+ assert len(result) == len(original)
417
+
418
+
419
+ def test_roundtrip_json():
420
+ """Test serialise and deserialise roundtrip for JSON"""
421
+ original = pd.DataFrame({"a": [1, 2, 3], "b": [4, 5, 6]})
422
+ bytes_data = PandasSerialiser.serialise(original, DataFormat.JSON)
423
+ result = PandasDeserialiser.deserialise(bytes_data, DataFormat.JSON)
424
+ assert list(result.columns) == list(original.columns)
425
+ assert len(result) == len(original)
426
+
427
+
428
+ def test_roundtrip_all_formats():
429
+ """Test roundtrip for all supported formats"""
430
+ original = pd.DataFrame({"x": [1, 2, 3], "y": [4, 5, 6]})
431
+
432
+ for format in [DataFormat.PARQUET, DataFormat.CSV, DataFormat.JSON]:
433
+ if format == DataFormat.CSV:
434
+ bytes_data = PandasSerialiser.serialise(original, format, index=False)
435
+ else:
436
+ bytes_data = PandasSerialiser.serialise(original, format)
437
+ result = PandasDeserialiser.deserialise(bytes_data, format)
438
+ assert isinstance(result, pd.DataFrame)
439
+ assert len(result) == len(original)
440
+
441
+
442
+ def test_roundtrip_with_unicode():
443
+ """Test roundtrip with Unicode data"""
444
+ original = pd.DataFrame({"text": ["Hello 世界", "Привет", "مرحبا"]})
445
+
446
+ # Test with CSV and JSON (parquet handles this automatically)
447
+ for format in [DataFormat.CSV, DataFormat.JSON]:
448
+ if format == DataFormat.CSV:
449
+ bytes_data = PandasSerialiser.serialise(original, format, index=False)
450
+ else:
451
+ bytes_data = PandasSerialiser.serialise(original, format)
452
+ result = PandasDeserialiser.deserialise(bytes_data, format)
453
+ assert isinstance(result, pd.DataFrame)
454
+ assert len(result) == len(original)
455
+
456
+
457
+ def test_roundtrip_large_dataframe():
458
+ """Test roundtrip with large DataFrame"""
459
+ original = pd.DataFrame({"col": range(1000)})
460
+ bytes_data = PandasSerialiser.serialise(original, DataFormat.PARQUET)
461
+ result = PandasDeserialiser.deserialise(bytes_data, DataFormat.PARQUET)
462
+ assert len(result) == 1000
463
+
464
+
465
+ # ==================== Integration and Edge Case Tests ====================
466
+
467
+
468
+ def test_deserialise_all_formats_produce_dataframes():
469
+ """Test all formats produce DataFrame output"""
470
+ df = pd.DataFrame({"a": [1, 2, 3]})
471
+
472
+ parquet_bytes = PandasSerialiser.serialise(df, DataFormat.PARQUET)
473
+ csv_bytes = PandasSerialiser.serialise(df, DataFormat.CSV, index=False)
474
+ json_bytes = PandasSerialiser.serialise(df, DataFormat.JSON)
475
+
476
+ assert isinstance(PandasDeserialiser.deserialise(parquet_bytes, DataFormat.PARQUET), pd.DataFrame)
477
+ assert isinstance(PandasDeserialiser.deserialise(csv_bytes, DataFormat.CSV), pd.DataFrame)
478
+ assert isinstance(PandasDeserialiser.deserialise(json_bytes, DataFormat.JSON), pd.DataFrame)
479
+
480
+
481
+ def test_deserialise_preserves_column_order():
482
+ """Test deserialise preserves column order"""
483
+ df = pd.DataFrame({"z": [1, 2], "a": [3, 4], "m": [5, 6]})
484
+ bytes_data = PandasSerialiser.to_parquet(df)
485
+ result = PandasDeserialiser.from_parquet(bytes_data)
486
+ assert list(result.columns) == ["z", "a", "m"]
487
+
488
+
489
+ def test_deserialise_with_kwargs_passthrough():
490
+ """Test that kwargs are passed through to underlying methods"""
491
+ df = pd.DataFrame({"a": [1, 2, 3]})
492
+ bytes_data = PandasSerialiser.to_csv(df, index=False)
493
+ result = PandasDeserialiser.deserialise(bytes_data, DataFormat.CSV)
494
+ assert isinstance(result, pd.DataFrame)
495
+
496
+
497
+ def test_dataframe_with_categorical_data():
498
+ """Test deserialising DataFrame with categorical data"""
499
+ df = pd.DataFrame({"cat": pd.Categorical(["a", "b", "c", "a"])})
500
+ bytes_data = PandasSerialiser.to_parquet(df)
501
+ result = PandasDeserialiser.from_parquet(bytes_data)
502
+ assert isinstance(result, pd.DataFrame)
503
+ assert len(result) == 4