lixinger-python 0.3.9__tar.gz → 0.3.10__tar.gz

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 (476) hide show
  1. lixinger_python-0.3.10/.claude/settings.local.json +13 -0
  2. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/.ruff.toml +21 -4
  3. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/ADD_NEW_API_QUICK.md +9 -13
  4. lixinger_python-0.3.10/ARCHITECTURE.md +60 -0
  5. lixinger_python-0.3.10/CLAUDE.md +116 -0
  6. lixinger_python-0.3.10/DOCUMENTATION.md +22 -0
  7. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/PKG-INFO +1 -1
  8. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/PUBLISHING.md +5 -67
  9. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/examples/company_profile_example.py +2 -2
  10. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/api/base.py +1 -1
  11. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/api/cn/company/namespace.py +3 -3
  12. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/api/cn/index/namespace.py +22 -18
  13. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/client.py +11 -4
  14. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/exceptions.py +1 -1
  15. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/utils/rate_limiter.py +1 -1
  16. lixinger_python-0.3.10/lixinger-api/REMINDER.md +31 -0
  17. lixinger_python-0.3.10/lixinger-api/cn/company/allotment.md +59 -0
  18. lixinger_python-0.3.10/lixinger-api/cn/company/announcement.md +108 -0
  19. lixinger_python-0.3.10/lixinger-api/cn/company/block-deal.md +142 -0
  20. lixinger_python-0.3.10/lixinger-api/cn/company/candlestick.md +123 -0
  21. lixinger_python-0.3.10/lixinger-api/cn/company/customers.md +133 -0
  22. lixinger_python-0.3.10/lixinger-api/cn/company/dividend.md +111 -0
  23. lixinger_python-0.3.10/lixinger-api/cn/company/equity-change.md +114 -0
  24. lixinger_python-0.3.10/lixinger-api/cn/company/fs/bank.md +691 -0
  25. lixinger_python-0.3.10/lixinger-api/cn/company/fs/insurance.md +674 -0
  26. lixinger_python-0.3.10/lixinger-api/cn/company/fs/non_financial.md +756 -0
  27. lixinger_python-0.3.10/lixinger-api/cn/company/fs/other_financial.md +547 -0
  28. lixinger_python-0.3.10/lixinger-api/cn/company/fs/security.md +620 -0
  29. lixinger_python-0.3.10/lixinger-api/cn/company/fund-collection-shareholders.md +88 -0
  30. lixinger_python-0.3.10/lixinger-api/cn/company/fund-shareholders.md +99 -0
  31. lixinger_python-0.3.10/lixinger-api/cn/company/fundamental/bank.md +196 -0
  32. lixinger_python-0.3.10/lixinger-api/cn/company/fundamental/insurance.md +190 -0
  33. lixinger_python-0.3.10/lixinger-api/cn/company/fundamental/non_financial.md +155 -0
  34. lixinger_python-0.3.10/lixinger-api/cn/company/fundamental/other_financial.md +188 -0
  35. lixinger_python-0.3.10/lixinger-api/cn/company/fundamental/security.md +188 -0
  36. lixinger_python-0.3.10/lixinger-api/cn/company/hot/capita.md +158 -0
  37. lixinger_python-0.3.10/lixinger-api/cn/company/hot/df.md +128 -0
  38. lixinger_python-0.3.10/lixinger-api/cn/company/hot/elr.md +136 -0
  39. lixinger_python-0.3.10/lixinger-api/cn/company/hot/esc.md +177 -0
  40. lixinger_python-0.3.10/lixinger-api/cn/company/hot/mm_ha.md +435 -0
  41. lixinger_python-0.3.10/lixinger-api/cn/company/hot/mssc.md +191 -0
  42. lixinger_python-0.3.10/lixinger-api/cn/company/hot/mtasl.md +267 -0
  43. lixinger_python-0.3.10/lixinger-api/cn/company/hot/npd.md +128 -0
  44. lixinger_python-0.3.10/lixinger-api/cn/company/hot/ple.md +142 -0
  45. lixinger_python-0.3.10/lixinger-api/cn/company/hot/shnc.md +174 -0
  46. lixinger_python-0.3.10/lixinger-api/cn/company/hot/t_a.md +148 -0
  47. lixinger_python-0.3.10/lixinger-api/cn/company/hot/tr.md +175 -0
  48. lixinger_python-0.3.10/lixinger-api/cn/company/hot/tr_dri.md +182 -0
  49. lixinger_python-0.3.10/lixinger-api/cn/company/indices.md +116 -0
  50. lixinger_python-0.3.10/lixinger-api/cn/company/industries.md +115 -0
  51. lixinger_python-0.3.10/lixinger-api/cn/company/inquiry.md +88 -0
  52. lixinger_python-0.3.10/lixinger-api/cn/company/major-shareholders-shares-change.md +152 -0
  53. lixinger_python-0.3.10/lixinger-api/cn/company/majority-shareholders.md +99 -0
  54. lixinger_python-0.3.10/lixinger-api/cn/company/margin-trading-and-securities-lending.md +107 -0
  55. lixinger_python-0.3.10/lixinger-api/cn/company/measures.md +93 -0
  56. lixinger_python-0.3.10/lixinger-api/cn/company/mutual-market.md +68 -0
  57. lixinger_python-0.3.10/lixinger-api/cn/company/nolimit-shareholders.md +108 -0
  58. lixinger_python-0.3.10/lixinger-api/cn/company/operating-data.md +286 -0
  59. lixinger_python-0.3.10/lixinger-api/cn/company/operation-revenue-constitution.md +308 -0
  60. lixinger_python-0.3.10/lixinger-api/cn/company/pledge.md +67 -0
  61. lixinger_python-0.3.10/lixinger-api/cn/company/profile.md +127 -0
  62. lixinger_python-0.3.10/lixinger-api/cn/company/senior-executive-shares-change.md +130 -0
  63. lixinger_python-0.3.10/lixinger-api/cn/company/shareholders-num.md +79 -0
  64. lixinger_python-0.3.10/lixinger-api/cn/company/suppliers.md +131 -0
  65. lixinger_python-0.3.10/lixinger-api/cn/company/trading-abnormal.md +320 -0
  66. lixinger_python-0.3.10/lixinger-api/cn/company/volatility.md +69 -0
  67. lixinger_python-0.3.10/lixinger-api/cn/company.md +302 -0
  68. lixinger_python-0.3.10/lixinger-api/cn/fund/announcement.md +97 -0
  69. lixinger_python-0.3.10/lixinger-api/cn/fund/asset-combination.md +134 -0
  70. lixinger_python-0.3.10/lixinger-api/cn/fund/asset-industry-combination.md +163 -0
  71. lixinger_python-0.3.10/lixinger-api/cn/fund/candlestick.md +93 -0
  72. lixinger_python-0.3.10/lixinger-api/cn/fund/dividend.md +56 -0
  73. lixinger_python-0.3.10/lixinger-api/cn/fund/drawdown.md +79 -0
  74. lixinger_python-0.3.10/lixinger-api/cn/fund/fees.md +73 -0
  75. lixinger_python-0.3.10/lixinger-api/cn/fund/hot/f_as.md +123 -0
  76. lixinger_python-0.3.10/lixinger-api/cn/fund/hot/f_nlacan.md +176 -0
  77. lixinger_python-0.3.10/lixinger-api/cn/fund/hot/fet_s.md +214 -0
  78. lixinger_python-0.3.10/lixinger-api/cn/fund/hot/ff.md +160 -0
  79. lixinger_python-0.3.10/lixinger-api/cn/fund/hot/fp.md +152 -0
  80. lixinger_python-0.3.10/lixinger-api/cn/fund/hot/fpr.md +207 -0
  81. lixinger_python-0.3.10/lixinger-api/cn/fund/hot/fss.md +154 -0
  82. lixinger_python-0.3.10/lixinger-api/cn/fund/manager.md +108 -0
  83. lixinger_python-0.3.10/lixinger-api/cn/fund/net-value-of-dividend-reinvestment.md +68 -0
  84. lixinger_python-0.3.10/lixinger-api/cn/fund/net-value.md +68 -0
  85. lixinger_python-0.3.10/lixinger-api/cn/fund/profile.md +111 -0
  86. lixinger_python-0.3.10/lixinger-api/cn/fund/shareholders-structure.md +73 -0
  87. lixinger_python-0.3.10/lixinger-api/cn/fund/shareholdings.md +88 -0
  88. lixinger_python-0.3.10/lixinger-api/cn/fund/shares.md +78 -0
  89. lixinger_python-0.3.10/lixinger-api/cn/fund/split.md +55 -0
  90. lixinger_python-0.3.10/lixinger-api/cn/fund/total-net-value.md +68 -0
  91. lixinger_python-0.3.10/lixinger-api/cn/fund/turnover-rate.md +60 -0
  92. lixinger_python-0.3.10/lixinger-api/cn/fund/volatility.md +69 -0
  93. lixinger_python-0.3.10/lixinger-api/cn/fund-company/asset-scale.md +80 -0
  94. lixinger_python-0.3.10/lixinger-api/cn/fund-company/fund-list.md +950 -0
  95. lixinger_python-0.3.10/lixinger-api/cn/fund-company/fund-manager-list.md +272 -0
  96. lixinger_python-0.3.10/lixinger-api/cn/fund-company/hot/fc_as.md +198 -0
  97. lixinger_python-0.3.10/lixinger-api/cn/fund-company/hot/fc_asr.md +246 -0
  98. lixinger_python-0.3.10/lixinger-api/cn/fund-company/shareholdings.md +78 -0
  99. lixinger_python-0.3.10/lixinger-api/cn/fund-company.md +117 -0
  100. lixinger_python-0.3.10/lixinger-api/cn/fund-manager/hot/fmi.md +311 -0
  101. lixinger_python-0.3.10/lixinger-api/cn/fund-manager/hot/fmp.md +297 -0
  102. lixinger_python-0.3.10/lixinger-api/cn/fund-manager/management-funds.md +154 -0
  103. lixinger_python-0.3.10/lixinger-api/cn/fund-manager/profit-ratio.md +56 -0
  104. lixinger_python-0.3.10/lixinger-api/cn/fund-manager/shareholdings.md +58 -0
  105. lixinger_python-0.3.10/lixinger-api/cn/fund-manager.md +108 -0
  106. lixinger_python-0.3.10/lixinger-api/cn/fund.md +150 -0
  107. lixinger_python-0.3.10/lixinger-api/cn/index/candlestick.md +103 -0
  108. lixinger_python-0.3.10/lixinger-api/cn/index/constituent-weightings.md +85 -0
  109. lixinger_python-0.3.10/lixinger-api/cn/index/constituents.md +514 -0
  110. lixinger_python-0.3.10/lixinger-api/cn/index/drawdown.md +79 -0
  111. lixinger_python-0.3.10/lixinger-api/cn/index/fs/bank.md +589 -0
  112. lixinger_python-0.3.10/lixinger-api/cn/index/fs/hybrid.md +449 -0
  113. lixinger_python-0.3.10/lixinger-api/cn/index/fs/non_financial.md +669 -0
  114. lixinger_python-0.3.10/lixinger-api/cn/index/fs/security.md +568 -0
  115. lixinger_python-0.3.10/lixinger-api/cn/index/fundamental.md +192 -0
  116. lixinger_python-0.3.10/lixinger-api/cn/index/hot/cp.md +203 -0
  117. lixinger_python-0.3.10/lixinger-api/cn/index/hot/ic.md +107 -0
  118. lixinger_python-0.3.10/lixinger-api/cn/index/hot/ifet_sni.md +156 -0
  119. lixinger_python-0.3.10/lixinger-api/cn/index/hot/mm_ha.md +198 -0
  120. lixinger_python-0.3.10/lixinger-api/cn/index/hot/mtasl.md +209 -0
  121. lixinger_python-0.3.10/lixinger-api/cn/index/hot/tr.md +142 -0
  122. lixinger_python-0.3.10/lixinger-api/cn/index/hot/tr_cp.md +159 -0
  123. lixinger_python-0.3.10/lixinger-api/cn/index/margin-trading-and-securities-lending.md +96 -0
  124. lixinger_python-0.3.10/lixinger-api/cn/index/mutual-market.md +76 -0
  125. lixinger_python-0.3.10/lixinger-api/cn/index/tracking-fund.md +79 -0
  126. lixinger_python-0.3.10/lixinger-api/cn/index/volatility.md +69 -0
  127. lixinger_python-0.3.10/lixinger-api/cn/index.md +166 -0
  128. lixinger_python-0.3.10/lixinger-api/cn/industry/constituents/cni.md +1135 -0
  129. lixinger_python-0.3.10/lixinger-api/cn/industry/constituents/sw.md +784 -0
  130. lixinger_python-0.3.10/lixinger-api/cn/industry/constituents/sw_2021.md +802 -0
  131. lixinger_python-0.3.10/lixinger-api/cn/industry/fs/cni/bank.md +589 -0
  132. lixinger_python-0.3.10/lixinger-api/cn/industry/fs/cni/hybrid.md +449 -0
  133. lixinger_python-0.3.10/lixinger-api/cn/industry/fs/cni/insurance.md +587 -0
  134. lixinger_python-0.3.10/lixinger-api/cn/industry/fs/cni/non_financial.md +669 -0
  135. lixinger_python-0.3.10/lixinger-api/cn/industry/fs/cni/security.md +552 -0
  136. lixinger_python-0.3.10/lixinger-api/cn/industry/fs/sw/bank.md +589 -0
  137. lixinger_python-0.3.10/lixinger-api/cn/industry/fs/sw/hybrid.md +449 -0
  138. lixinger_python-0.3.10/lixinger-api/cn/industry/fs/sw/insurance.md +588 -0
  139. lixinger_python-0.3.10/lixinger-api/cn/industry/fs/sw/non_financial.md +669 -0
  140. lixinger_python-0.3.10/lixinger-api/cn/industry/fs/sw/security.md +552 -0
  141. lixinger_python-0.3.10/lixinger-api/cn/industry/fs/sw_2021/bank.md +589 -0
  142. lixinger_python-0.3.10/lixinger-api/cn/industry/fs/sw_2021/hybrid.md +449 -0
  143. lixinger_python-0.3.10/lixinger-api/cn/industry/fs/sw_2021/insurance.md +588 -0
  144. lixinger_python-0.3.10/lixinger-api/cn/industry/fs/sw_2021/non_financial.md +669 -0
  145. lixinger_python-0.3.10/lixinger-api/cn/industry/fs/sw_2021/security.md +552 -0
  146. lixinger_python-0.3.10/lixinger-api/cn/industry/fundamental/cni.md +184 -0
  147. lixinger_python-0.3.10/lixinger-api/cn/industry/fundamental/sw.md +184 -0
  148. lixinger_python-0.3.10/lixinger-api/cn/industry/fundamental/sw_2021.md +184 -0
  149. lixinger_python-0.3.10/lixinger-api/cn/industry/hot/mm_ha/cni.md +199 -0
  150. lixinger_python-0.3.10/lixinger-api/cn/industry/hot/mm_ha/sw.md +199 -0
  151. lixinger_python-0.3.10/lixinger-api/cn/industry/hot/mm_ha/sw_2021.md +199 -0
  152. lixinger_python-0.3.10/lixinger-api/cn/industry/hot/mtasl/cni.md +207 -0
  153. lixinger_python-0.3.10/lixinger-api/cn/industry/hot/mtasl/sw.md +207 -0
  154. lixinger_python-0.3.10/lixinger-api/cn/industry/hot/mtasl/sw_2021.md +207 -0
  155. lixinger_python-0.3.10/lixinger-api/cn/industry/margin-trading-and-securities-lending/cni.md +96 -0
  156. lixinger_python-0.3.10/lixinger-api/cn/industry/margin-trading-and-securities-lending/sw.md +96 -0
  157. lixinger_python-0.3.10/lixinger-api/cn/industry/margin-trading-and-securities-lending/sw_2021.md +96 -0
  158. lixinger_python-0.3.10/lixinger-api/cn/industry/mutual-market/cni.md +76 -0
  159. lixinger_python-0.3.10/lixinger-api/cn/industry/mutual-market/sw.md +76 -0
  160. lixinger_python-0.3.10/lixinger-api/cn/industry/mutual-market/sw_2021.md +76 -0
  161. lixinger_python-0.3.10/lixinger-api/cn/industry.md +151 -0
  162. lixinger_python-0.3.10/lixinger-api/hk/company/allotment.md +59 -0
  163. lixinger_python-0.3.10/lixinger-api/hk/company/announcement.md +96 -0
  164. lixinger_python-0.3.10/lixinger-api/hk/company/candlestick.md +122 -0
  165. lixinger_python-0.3.10/lixinger-api/hk/company/dividend.md +93 -0
  166. lixinger_python-0.3.10/lixinger-api/hk/company/employee.md +445 -0
  167. lixinger_python-0.3.10/lixinger-api/hk/company/equity-change.md +80 -0
  168. lixinger_python-0.3.10/lixinger-api/hk/company/fs/bank.md +452 -0
  169. lixinger_python-0.3.10/lixinger-api/hk/company/fs/insurance.md +505 -0
  170. lixinger_python-0.3.10/lixinger-api/hk/company/fs/non_financial.md +534 -0
  171. lixinger_python-0.3.10/lixinger-api/hk/company/fs/other_financial.md +418 -0
  172. lixinger_python-0.3.10/lixinger-api/hk/company/fs/reit.md +439 -0
  173. lixinger_python-0.3.10/lixinger-api/hk/company/fs/security.md +463 -0
  174. lixinger_python-0.3.10/lixinger-api/hk/company/fund-collection-shareholders.md +83 -0
  175. lixinger_python-0.3.10/lixinger-api/hk/company/fund-shareholders.md +94 -0
  176. lixinger_python-0.3.10/lixinger-api/hk/company/fundamental/bank.md +173 -0
  177. lixinger_python-0.3.10/lixinger-api/hk/company/fundamental/insurance.md +175 -0
  178. lixinger_python-0.3.10/lixinger-api/hk/company/fundamental/non_financial.md +173 -0
  179. lixinger_python-0.3.10/lixinger-api/hk/company/fundamental/other_financial.md +173 -0
  180. lixinger_python-0.3.10/lixinger-api/hk/company/fundamental/reit.md +173 -0
  181. lixinger_python-0.3.10/lixinger-api/hk/company/fundamental/security.md +173 -0
  182. lixinger_python-0.3.10/lixinger-api/hk/company/hot/capita.md +122 -0
  183. lixinger_python-0.3.10/lixinger-api/hk/company/hot/director_equity_change.md +167 -0
  184. lixinger_python-0.3.10/lixinger-api/hk/company/hot/mm_ah.md +301 -0
  185. lixinger_python-0.3.10/lixinger-api/hk/company/hot/npd.md +112 -0
  186. lixinger_python-0.3.10/lixinger-api/hk/company/hot/rep.md +211 -0
  187. lixinger_python-0.3.10/lixinger-api/hk/company/hot/ss.md +140 -0
  188. lixinger_python-0.3.10/lixinger-api/hk/company/hot/ss_ha.md +147 -0
  189. lixinger_python-0.3.10/lixinger-api/hk/company/hot/tr.md +138 -0
  190. lixinger_python-0.3.10/lixinger-api/hk/company/hot/tr_dri.md +165 -0
  191. lixinger_python-0.3.10/lixinger-api/hk/company/indices.md +116 -0
  192. lixinger_python-0.3.10/lixinger-api/hk/company/industries.md +113 -0
  193. lixinger_python-0.3.10/lixinger-api/hk/company/latest-shareholders.md +133 -0
  194. lixinger_python-0.3.10/lixinger-api/hk/company/mutual-market.md +67 -0
  195. lixinger_python-0.3.10/lixinger-api/hk/company/operation-revenue-constitution.md +229 -0
  196. lixinger_python-0.3.10/lixinger-api/hk/company/profile.md +86 -0
  197. lixinger_python-0.3.10/lixinger-api/hk/company/repurchase.md +132 -0
  198. lixinger_python-0.3.10/lixinger-api/hk/company/shareholders-equity-change.md +253 -0
  199. lixinger_python-0.3.10/lixinger-api/hk/company/short-selling.md +76 -0
  200. lixinger_python-0.3.10/lixinger-api/hk/company/split.md +57 -0
  201. lixinger_python-0.3.10/lixinger-api/hk/company/volatility.md +69 -0
  202. lixinger_python-0.3.10/lixinger-api/hk/company.md +286 -0
  203. lixinger_python-0.3.10/lixinger-api/hk/index/candlestick.md +100 -0
  204. lixinger_python-0.3.10/lixinger-api/hk/index/constituents.md +994 -0
  205. lixinger_python-0.3.10/lixinger-api/hk/index/drawdown.md +79 -0
  206. lixinger_python-0.3.10/lixinger-api/hk/index/fs/hybrid.md +343 -0
  207. lixinger_python-0.3.10/lixinger-api/hk/index/fs/non_financial.md +489 -0
  208. lixinger_python-0.3.10/lixinger-api/hk/index/fundamental.md +179 -0
  209. lixinger_python-0.3.10/lixinger-api/hk/index/hot/cp.md +195 -0
  210. lixinger_python-0.3.10/lixinger-api/hk/index/hot/ic.md +107 -0
  211. lixinger_python-0.3.10/lixinger-api/hk/index/hot/ifet_sni.md +155 -0
  212. lixinger_python-0.3.10/lixinger-api/hk/index/hot/mm_ah.md +185 -0
  213. lixinger_python-0.3.10/lixinger-api/hk/index/mutual-market.md +75 -0
  214. lixinger_python-0.3.10/lixinger-api/hk/index/tracking-fund.md +79 -0
  215. lixinger_python-0.3.10/lixinger-api/hk/index/volatility.md +69 -0
  216. lixinger_python-0.3.10/lixinger-api/hk/index.md +159 -0
  217. lixinger_python-0.3.10/lixinger-api/hk/industry/constituents/hsi.md +2658 -0
  218. lixinger_python-0.3.10/lixinger-api/hk/industry/fs/hsi/hybrid.md +359 -0
  219. lixinger_python-0.3.10/lixinger-api/hk/industry/fs/hsi/non_financial.md +490 -0
  220. lixinger_python-0.3.10/lixinger-api/hk/industry/fundamental/hsi.md +182 -0
  221. lixinger_python-0.3.10/lixinger-api/hk/industry/hot/mm_ah/hsi.md +198 -0
  222. lixinger_python-0.3.10/lixinger-api/hk/industry/mutual-market/hsi.md +75 -0
  223. lixinger_python-0.3.10/lixinger-api/hk/industry.md +147 -0
  224. lixinger_python-0.3.10/lixinger-api/macro/bop.md +958 -0
  225. lixinger_python-0.3.10/lixinger-api/macro/central-bank-balance-sheet.md +307 -0
  226. lixinger_python-0.3.10/lixinger-api/macro/credit-securities-account.md +223 -0
  227. lixinger_python-0.3.10/lixinger-api/macro/crude-oil.md +79 -0
  228. lixinger_python-0.3.10/lixinger-api/macro/currency-exchange-rate.md +149 -0
  229. lixinger_python-0.3.10/lixinger-api/macro/domestic-debt-securities.md +247 -0
  230. lixinger_python-0.3.10/lixinger-api/macro/domestic-trade.md +166 -0
  231. lixinger_python-0.3.10/lixinger-api/macro/energy.md +220 -0
  232. lixinger_python-0.3.10/lixinger-api/macro/foreign-assets.md +158 -0
  233. lixinger_python-0.3.10/lixinger-api/macro/foreign-trade.md +190 -0
  234. lixinger_python-0.3.10/lixinger-api/macro/gdp.md +278 -0
  235. lixinger_python-0.3.10/lixinger-api/macro/gold-price.md +75 -0
  236. lixinger_python-0.3.10/lixinger-api/macro/industrialization.md +220 -0
  237. lixinger_python-0.3.10/lixinger-api/macro/interest-rates.md +152 -0
  238. lixinger_python-0.3.10/lixinger-api/macro/investment-in-fixed-assets.md +117 -0
  239. lixinger_python-0.3.10/lixinger-api/macro/investor.md +87 -0
  240. lixinger_python-0.3.10/lixinger-api/macro/leverage-ratio.md +174 -0
  241. lixinger_python-0.3.10/lixinger-api/macro/money-supply.md +222 -0
  242. lixinger_python-0.3.10/lixinger-api/macro/national-debt.md +101 -0
  243. lixinger_python-0.3.10/lixinger-api/macro/national-finance.md +1040 -0
  244. lixinger_python-0.3.10/lixinger-api/macro/natural-gas.md +78 -0
  245. lixinger_python-0.3.10/lixinger-api/macro/non-ferrous-metals.md +83 -0
  246. lixinger_python-0.3.10/lixinger-api/macro/official-reserve-assets.md +212 -0
  247. lixinger_python-0.3.10/lixinger-api/macro/platinum-price.md +78 -0
  248. lixinger_python-0.3.10/lixinger-api/macro/population.md +172 -0
  249. lixinger_python-0.3.10/lixinger-api/macro/price-index.md +332 -0
  250. lixinger_python-0.3.10/lixinger-api/macro/real-estate.md +262 -0
  251. lixinger_python-0.3.10/lixinger-api/macro/required-reserves.md +63 -0
  252. lixinger_python-0.3.10/lixinger-api/macro/rmb-deposits.md +257 -0
  253. lixinger_python-0.3.10/lixinger-api/macro/rmb-loans.md +281 -0
  254. lixinger_python-0.3.10/lixinger-api/macro/rmbidx.md +49 -0
  255. lixinger_python-0.3.10/lixinger-api/macro/silver-price.md +78 -0
  256. lixinger_python-0.3.10/lixinger-api/macro/social-financing.md +259 -0
  257. lixinger_python-0.3.10/lixinger-api/macro/stamp-duty.md +104 -0
  258. lixinger_python-0.3.10/lixinger-api/macro/traffic-transportation.md +112 -0
  259. lixinger_python-0.3.10/lixinger-api/macro/unemployment-rate.md +98 -0
  260. lixinger_python-0.3.10/lixinger-api/macro/usdx.md +71 -0
  261. lixinger_python-0.3.10/lixinger-api/macro/vix-fear-index.md +155 -0
  262. lixinger_python-0.3.10/lixinger-api/us/index/candlestick.md +96 -0
  263. lixinger_python-0.3.10/lixinger-api/us/index/constituents.md +4522 -0
  264. lixinger_python-0.3.10/lixinger-api/us/index/drawdown.md +79 -0
  265. lixinger_python-0.3.10/lixinger-api/us/index/fs/non_financial.md +377 -0
  266. lixinger_python-0.3.10/lixinger-api/us/index/fundamental.md +175 -0
  267. lixinger_python-0.3.10/lixinger-api/us/index/hot/cp.md +169 -0
  268. lixinger_python-0.3.10/lixinger-api/us/index/hot/ifet_sni.md +140 -0
  269. lixinger_python-0.3.10/lixinger-api/us/index/tracking-fund.md +79 -0
  270. lixinger_python-0.3.10/lixinger-api/us/index/volatility.md +69 -0
  271. lixinger_python-0.3.10/lixinger-api/us/index.md +137 -0
  272. lixinger_python-0.3.10/mypy.ini +28 -0
  273. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/pyproject.toml +1 -1
  274. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/scripts/explore_api.py +1 -1
  275. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/uv.lock +1 -1
  276. lixinger_python-0.3.9/.claude/settings.local.json +0 -9
  277. lixinger_python-0.3.9/AGENTS.md +0 -354
  278. lixinger_python-0.3.9/CLAUDE.md +0 -256
  279. lixinger_python-0.3.9/DOCS.md +0 -334
  280. lixinger_python-0.3.9/SETUP.md +0 -383
  281. lixinger_python-0.3.9/fund_response.json +0 -1
  282. lixinger_python-0.3.9/mypy.ini +0 -5
  283. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/.env.example +0 -0
  284. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/.github/copilot-instructions.md +0 -0
  285. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/.github/workflows/README.md +0 -0
  286. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/.github/workflows/pr-checks.yml +0 -0
  287. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/.gitignore +0 -0
  288. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/.pre-commit-config.yaml +0 -0
  289. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/.python-version +0 -0
  290. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/CHANGELOG.md +0 -0
  291. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/LICENSE +0 -0
  292. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/MANIFEST.in +0 -0
  293. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/README.md +0 -0
  294. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/codecov.yml +0 -0
  295. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/docs/api/client.md +0 -0
  296. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/docs/api/company/announcement.md +0 -0
  297. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/docs/api/company/candlestick.md +0 -0
  298. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/docs/api/company/company.md +0 -0
  299. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/docs/api/company/dividend.md +0 -0
  300. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/docs/api/company/equity_change.md +0 -0
  301. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/docs/api/company/fs/non_financial.md +0 -0
  302. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/docs/api/company/fundamental/bank.md +0 -0
  303. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/docs/api/company/fundamental/insurance.md +0 -0
  304. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/docs/api/company/fundamental/non_financial.md +0 -0
  305. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/docs/api/company/fundamental/other_financial.md +0 -0
  306. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/docs/api/company/fundamental/security.md +0 -0
  307. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/docs/api/company/indices.md +0 -0
  308. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/docs/api/company/profile.md +0 -0
  309. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/docs/api/fund/announcement.md +0 -0
  310. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/docs/api/fund/asset_combination.md +0 -0
  311. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/docs/api/fund/asset_industry_combination.md +0 -0
  312. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/docs/api/fund/candlestick.md +0 -0
  313. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/docs/api/fund/fund.md +0 -0
  314. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/docs/api/fund/profile.md +0 -0
  315. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/docs/api/fund/shareholdings.md +0 -0
  316. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/docs/api/index/candlestick.md +0 -0
  317. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/docs/api/index/constituent_weightings.md +0 -0
  318. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/docs/api/index/constituents.md +0 -0
  319. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/docs/api/index/drawdown.md +0 -0
  320. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/docs/api/index/fundamental.md +0 -0
  321. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/docs/api/index/index.md +0 -0
  322. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/docs/api/index/tracking_fund.md +0 -0
  323. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/docs/api/overview.md +0 -0
  324. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/docs/development/code-style.md +0 -0
  325. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/docs/development/contributing.md +0 -0
  326. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/docs/development/testing.md +0 -0
  327. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/docs/examples/company.md +0 -0
  328. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/docs/examples/fund.md +0 -0
  329. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/docs/examples/index.md +0 -0
  330. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/docs/getting-started/configuration.md +0 -0
  331. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/docs/getting-started/installation.md +0 -0
  332. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/docs/getting-started/quickstart.md +0 -0
  333. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/docs/index.md +0 -0
  334. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/examples/company_example.py +0 -0
  335. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/examples/dividend_example.py +0 -0
  336. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/examples/fs_example.py +0 -0
  337. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/examples/index_constituent_weightings_example.py +0 -0
  338. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/examples/index_constituents_example.py +0 -0
  339. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/examples/index_info_example.py +0 -0
  340. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/examples/index_margin_trading_example.py +0 -0
  341. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/__init__.py +0 -0
  342. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/api/__init__.py +0 -0
  343. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/api/cn/__init__.py +0 -0
  344. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/api/cn/company/__init__.py +0 -0
  345. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/api/cn/company/announcement.py +0 -0
  346. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/api/cn/company/candlestick.py +0 -0
  347. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/api/cn/company/company.py +0 -0
  348. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/api/cn/company/dividend.py +0 -0
  349. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/api/cn/company/equity_change.py +0 -0
  350. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/api/cn/company/fs/__init__.py +0 -0
  351. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/api/cn/company/fs/bank.py +0 -0
  352. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/api/cn/company/fs/insurance.py +0 -0
  353. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/api/cn/company/fs/non_financial.py +0 -0
  354. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/api/cn/company/fs/other_financial.py +0 -0
  355. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/api/cn/company/fs/security.py +0 -0
  356. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/api/cn/company/fundamental/__init__.py +0 -0
  357. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/api/cn/company/fundamental/bank.py +0 -0
  358. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/api/cn/company/fundamental/insurance.py +0 -0
  359. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/api/cn/company/fundamental/non_financial.py +0 -0
  360. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/api/cn/company/fundamental/other_financial.py +0 -0
  361. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/api/cn/company/fundamental/security.py +0 -0
  362. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/api/cn/company/indices.py +0 -0
  363. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/api/cn/company/profile.py +0 -0
  364. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/api/cn/fund/__init__.py +0 -0
  365. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/api/cn/fund/announcement.py +0 -0
  366. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/api/cn/fund/asset_combination.py +0 -0
  367. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/api/cn/fund/asset_industry_combination.py +0 -0
  368. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/api/cn/fund/candlestick.py +0 -0
  369. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/api/cn/fund/fund.py +0 -0
  370. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/api/cn/fund/profile.py +0 -0
  371. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/api/cn/fund/shareholdings.py +0 -0
  372. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/api/cn/index/__init__.py +0 -0
  373. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/api/cn/index/candlestick.py +0 -0
  374. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/api/cn/index/constituent_weightings.py +0 -0
  375. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/api/cn/index/constituents.py +0 -0
  376. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/api/cn/index/drawdown.py +0 -0
  377. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/api/cn/index/fs/__init__.py +0 -0
  378. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/api/cn/index/fs/bank.py +0 -0
  379. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/api/cn/index/fs/hybrid.py +0 -0
  380. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/api/cn/index/fs/non_financial.py +0 -0
  381. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/api/cn/index/fs/security.py +0 -0
  382. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/api/cn/index/fundamental.py +0 -0
  383. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/api/cn/index/index.py +0 -0
  384. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/api/cn/index/margin_trading.py +0 -0
  385. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/api/cn/index/tracking_fund.py +0 -0
  386. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/config.py +0 -0
  387. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/models/__init__.py +0 -0
  388. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/models/cn/__init__.py +0 -0
  389. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/models/cn/company/__init__.py +0 -0
  390. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/models/cn/company/announcement.py +0 -0
  391. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/models/cn/company/candlestick.py +0 -0
  392. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/models/cn/company/company.py +0 -0
  393. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/models/cn/company/dividend.py +0 -0
  394. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/models/cn/company/equity_change.py +0 -0
  395. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/models/cn/company/fs/__init__.py +0 -0
  396. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/models/cn/company/fs/bank.py +0 -0
  397. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/models/cn/company/fs/insurance.py +0 -0
  398. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/models/cn/company/fs/non_financial.py +0 -0
  399. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/models/cn/company/fs/other_financial.py +0 -0
  400. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/models/cn/company/fs/security.py +0 -0
  401. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/models/cn/company/fundamental/__init__.py +0 -0
  402. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/models/cn/company/fundamental/bank.py +0 -0
  403. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/models/cn/company/fundamental/insurance.py +0 -0
  404. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/models/cn/company/fundamental/non_financial.py +0 -0
  405. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/models/cn/company/fundamental/other_financial.py +0 -0
  406. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/models/cn/company/fundamental/security.py +0 -0
  407. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/models/cn/company/indices.py +0 -0
  408. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/models/cn/fund/__init__.py +0 -0
  409. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/models/cn/fund/announcement.py +0 -0
  410. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/models/cn/fund/asset_combination.py +0 -0
  411. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/models/cn/fund/asset_industry_combination.py +0 -0
  412. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/models/cn/fund/candlestick.py +0 -0
  413. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/models/cn/fund/fund.py +0 -0
  414. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/models/cn/fund/profile.py +0 -0
  415. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/models/cn/fund/shareholdings.py +0 -0
  416. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/models/cn/index/__init__.py +0 -0
  417. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/models/cn/index/candlestick.py +0 -0
  418. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/models/cn/index/constituent_weightings.py +0 -0
  419. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/models/cn/index/constituents.py +0 -0
  420. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/models/cn/index/drawdown.py +0 -0
  421. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/models/cn/index/fs/__init__.py +0 -0
  422. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/models/cn/index/fs/bank.py +0 -0
  423. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/models/cn/index/fs/hybrid.py +0 -0
  424. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/models/cn/index/fs/non_financial.py +0 -0
  425. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/models/cn/index/fs/security.py +0 -0
  426. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/models/cn/index/fundamental.py +0 -0
  427. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/models/cn/index/index.py +0 -0
  428. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/models/cn/index/margin_trading.py +0 -0
  429. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/models/cn/index/tracking_fund.py +0 -0
  430. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/py.typed +0 -0
  431. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/utils/__init__.py +0 -0
  432. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/utils/api.py +0 -0
  433. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/utils/dataframe.py +0 -0
  434. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/utils/dict.py +0 -0
  435. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/lixinger/utils/retry.py +0 -0
  436. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/mkdocs.yml +0 -0
  437. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/scripts/generate_docs.py +0 -0
  438. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/scripts/publish.sh +0 -0
  439. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/tests/api/cn/company/test_announcement.py +0 -0
  440. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/tests/api/cn/company/test_dividend.py +0 -0
  441. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/tests/api/cn/index/test_constituents.py +0 -0
  442. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/tests/conftest.py +0 -0
  443. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/tests/test_bank_statements.py +0 -0
  444. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/tests/test_candlestick.py +0 -0
  445. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/tests/test_client.py +0 -0
  446. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/tests/test_cn_index_candlestick.py +0 -0
  447. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/tests/test_cn_index_constituent_weightings.py +0 -0
  448. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/tests/test_company.py +0 -0
  449. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/tests/test_company_profile.py +0 -0
  450. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/tests/test_equity_change.py +0 -0
  451. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/tests/test_fund.py +0 -0
  452. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/tests/test_fund_announcement.py +0 -0
  453. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/tests/test_fund_asset_combination.py +0 -0
  454. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/tests/test_fund_asset_industry_combination.py +0 -0
  455. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/tests/test_fund_candlestick.py +0 -0
  456. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/tests/test_fund_profile.py +0 -0
  457. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/tests/test_fund_shareholdings.py +0 -0
  458. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/tests/test_fundamental.py +0 -0
  459. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/tests/test_fundamental_bank.py +0 -0
  460. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/tests/test_fundamental_security.py +0 -0
  461. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/tests/test_index.py +0 -0
  462. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/tests/test_index_constituents.py +0 -0
  463. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/tests/test_index_drawdown.py +0 -0
  464. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/tests/test_index_fs_bank.py +0 -0
  465. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/tests/test_index_fs_hybrid.py +0 -0
  466. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/tests/test_index_fs_non_financial.py +0 -0
  467. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/tests/test_index_fs_security.py +0 -0
  468. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/tests/test_index_fundamental.py +0 -0
  469. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/tests/test_index_margin_trading.py +0 -0
  470. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/tests/test_indices.py +0 -0
  471. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/tests/test_insurance_statements.py +0 -0
  472. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/tests/test_integration.py +0 -0
  473. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/tests/test_non_financial_statements.py +0 -0
  474. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/tests/test_other_financial_statements.py +0 -0
  475. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/tests/test_security_statements.py +0 -0
  476. {lixinger_python-0.3.9 → lixinger_python-0.3.10}/tests/test_tracking_fund.py +0 -0
@@ -0,0 +1,13 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "Bash(uv run *)",
5
+ "Bash(git add *)",
6
+ "Bash(git commit -m ' *)",
7
+ "Bash(git commit *)",
8
+ "Bash(python -c ' *)",
9
+ "Bash(git stash *)",
10
+ "Bash(gh run *)"
11
+ ]
12
+ }
13
+ }
@@ -10,15 +10,19 @@ preview = false
10
10
  select = [
11
11
  # Pyflakes (F) - catch common errors
12
12
  "F",
13
- # Pycodestyle (E, W) - PEP 8 style guide
13
+ # Pycodestyle (E, W) - PEP 8 style guide (E722 = bare except)
14
14
  "E",
15
15
  "W",
16
16
  # isort (I) - import sorting
17
17
  "I",
18
- # pep8-naming (N) - naming conventions
18
+ # pep8-naming (N) - PEP 8 naming conventions
19
19
  "N",
20
- # pydocstyle (D) - docstring conventions
20
+ # pydocstyle (D) - docstring conventions (Google style enforced below)
21
21
  "D",
22
+ # flake8-annotations (ANN) - require type hints on function signatures
23
+ "ANN",
24
+ # flake8-blind-except (BLE) - forbid bare / overly broad except
25
+ "BLE",
22
26
  # pyupgrade (UP) - upgrade syntax for newer Python versions
23
27
  "UP",
24
28
  # flake8-bugbear (B) - find bugs and design problems
@@ -43,7 +47,7 @@ select = [
43
47
  "PGH",
44
48
  # Pylint (PL) - additional checks
45
49
  "PL",
46
- # tryceratops (TRY) - exception handling
50
+ # tryceratops (TRY) - exception handling (TRY002 forbids `raise Exception`)
47
51
  "TRY",
48
52
  # flake8-type-checking (TCH) - type checking imports
49
53
  "TCH",
@@ -64,6 +68,10 @@ ignore = [
64
68
  "D104", # Missing docstring in public package
65
69
  "D105", # Missing docstring in magic method
66
70
  "D107", # Missing docstring in __init__
71
+ # Type-hint relaxations: `self`/`cls` and **kwargs need not be annotated
72
+ "ANN101", # Missing type annotation for self
73
+ "ANN102", # Missing type annotation for cls
74
+ "ANN401", # Allow `typing.Any` (SDK returns generic API payloads)
67
75
  # Allow relative imports
68
76
  "TID252",
69
77
  # Allow print statements (useful for debugging)
@@ -99,6 +107,8 @@ ignore = [
99
107
  "S101", # Use of assert
100
108
  "ARG", # Unused arguments
101
109
  "PLR2004", # Magic numbers
110
+ "ANN", # Type annotations not required in tests
111
+ "D", # Docstrings not required in tests
102
112
  ]
103
113
  "data_provider/**/*.py" = [
104
114
  "ERA001", # Remove commented-out code
@@ -111,6 +121,13 @@ ignore = [
111
121
  "app.py" = [
112
122
  "F401", # Unused imports (Flask decorators)
113
123
  ]
124
+ # Examples & scripts: relaxed docstring / annotation requirements
125
+ "examples/**/*.py" = ["ANN", "D"]
126
+ "scripts/**/*.py" = ["ANN", "D"]
127
+
128
+ [lint.pydocstyle]
129
+ # Enforce Google-style docstrings (required for MkDocs / mkdocstrings)
130
+ convention = "google"
114
131
 
115
132
  [lint.isort]
116
133
  known-first-party = ["analyzer", "core", "data_provider"]
@@ -6,7 +6,11 @@
6
6
 
7
7
  ## 🎯 三步添加新 API
8
8
 
9
- ### 1️⃣ 写代码 + Docstrings
9
+ ### 1️⃣ 读文档
10
+
11
+ 所有API文档都放在了 [lixinger-api](./lixinger-api/)下, 首先阅读 [REMINDER.md](./lixinger-api/REMINDER.md) 了解注意事项, 然后阅读具体的 API 文档, 例如 [lixinger-api/cn/company/financials.md](./lixinger-api/cn/company/financials.md) 了解具体的参数和返回值。
12
+
13
+ ### 2️⃣ 写代码 + Docstrings
10
14
 
11
15
  ```python
12
16
  # lixinger/api/cn/company/your_api.py
@@ -49,7 +53,7 @@ class YourAPI(BaseAPI):
49
53
 
50
54
  ---
51
55
 
52
- ### 2️⃣ 生成文档
56
+ ### 3️⃣ 生成文档
53
57
 
54
58
  **方式 A: 自动生成(推荐)**
55
59
 
@@ -79,7 +83,7 @@ EOF
79
83
 
80
84
  ---
81
85
 
82
- ### 3️⃣ 预览 & 部署
86
+ ### 4️⃣ 预览 & 部署
83
87
 
84
88
  ```bash
85
89
  # 本地预览
@@ -167,6 +171,8 @@ async def method_name(param: type) -> return_type:
167
171
  return data
168
172
  ```
169
173
 
174
+ 参考@DOCUMENTATION.md了解项目的文档规范和 Docstring 规范。
175
+
170
176
  ---
171
177
 
172
178
  ## 🧪 测试模板
@@ -191,13 +197,3 @@ async def test_your_api(monkeypatch):
191
197
 
192
198
  assert not df.empty
193
199
  ```
194
-
195
- ---
196
-
197
- ## 🔗 完整文档
198
-
199
- 详细指南请查看:[ADD_NEW_API.md](ADD_NEW_API.md)
200
-
201
- ---
202
-
203
- **重点**:只要写好 docstrings,文档会自动生成!✨
@@ -0,0 +1,60 @@
1
+ # 🏛️ ARCHITECTURE
2
+
3
+ > Lixinger Python SDK 架构简述
4
+
5
+ ---
6
+
7
+ ## 1. 设计原则
8
+
9
+ | 原则 | 说明 |
10
+ | --- | --- |
11
+ | **完全异步** | 所有 API 方法为 `async def`,底层 `httpx.AsyncClient` |
12
+ | **端点驱动目录** | 目录严格镜像 REST 路径:`/cn/company/fs/bank` → `lixinger/api/cn/company/fs/bank.py` |
13
+ | **类型安全** | 全量类型注解 + Pandera DataFrame Schema,`mypy` 严格 |
14
+ | **两种调用形态** | `AsyncLixingerClient`(OO)与 `get_xxx()`(函数式)共享同一底层 |
15
+ | **单一 HTTP 出口** | 端点模块**只能**通过 `BaseAPI._request` 发起请求,重试/限速/鉴权/异常映射集中在一处 |
16
+ | **DataFrame 一体化** | 所有 API 返回 `pandas.DataFrame`,字段自动 `camelCase → snake_case`,经 Pandera 校验 |
17
+ | **API Key 只来自环境变量** | 强制 `LIXINGER_API_KEY`,不可通过参数传入 |
18
+ | **文档即代码** | MkDocs + mkdocstrings 从 docstring 自动生成 API 参考 |
19
+
20
+ ---
21
+
22
+ ## 2. 分层结构
23
+
24
+ ```
25
+ Layer 4 Public Surface lixinger/__init__.py
26
+ └── AsyncLixingerClient / get_xxx() / 异常类
27
+ Layer 3 Endpoint Modules lixinger/api/cn/**/*.py
28
+ └── XxxAPI 类 + get_xxx() 函数 + Namespace 聚合
29
+ Layer 2 BaseAPI lixinger/api/base.py
30
+ └── _request():唯一网络出口(重试 + 限速 + 鉴权 + 解包)
31
+ Layer 1 Infrastructure lixinger/utils/*
32
+ └── httpx / RateLimiter / Retry / Config / Pandera
33
+ ```
34
+
35
+ ---
36
+
37
+ ## 3. 目录结构
38
+
39
+ ```text
40
+ lixinger-python/
41
+ ├── lixinger/ # SDK 主包(client / config / exceptions / __init__)
42
+ │ ├── api/ # Layer 2+3:base.py + 按 REST 路径组织的端点模块
43
+ │ │ └── cn/ # 中国大陆市场
44
+ │ │ ├── company/ # /cn/company/*(含 fs/ 与 fundamental/ 按公司类型细分)
45
+ │ │ ├── index/ # /cn/index/*(含 fs/ 按指数类型细分)
46
+ │ │ └── fund/ # /cn/fund/*
47
+ │ ├── models/ # Pandera DataFrame Schema(结构镜像 api/)
48
+ │ └── utils/ # rate_limiter / retry / dataframe / dict / api 装饰器
49
+
50
+ ├── tests/ # pytest(含 integration 标记)
51
+ ├── examples/ # 各模块使用示例
52
+ ├── scripts/ # explore_api / generate_docs / publish
53
+ ├── docs/ # MkDocs 源文件
54
+ ├── lixinger-api/ # 官方 API 文档镜像(cn/hk/us/macro)
55
+ ├── mkdocs.yml
56
+ ├── pyproject.toml # uv / ruff / mypy / pytest 配置
57
+ └── .env(.example) # 环境变量
58
+ ```
59
+
60
+ **核心约束**:目录路径必须与 REST 端点一一对应。端点 `/cn/index/fs/hybrid` → `lixinger/api/cn/index/fs/hybrid.py` → `lixinger/models/cn/index/fs/hybrid.py`。
@@ -0,0 +1,116 @@
1
+ # CLAUDE.md
2
+
3
+ This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
4
+
5
+ ## Project Overview
6
+
7
+ This is a Python SDK for the Lixinger API, which provides financial data services. The project is in early development stages.
8
+
9
+ - **API Documentation**: https://www.lixinger.com/open/api/doc?api-key=cn/company/fundamental/non_financial
10
+ - **API Endpoint**: `https://open.lixinger.com/api`
11
+ - **Python Version**: 3.13+
12
+ - **Package Manager**: uv (fast Python package installer)
13
+ - **Main Dependencies**: httpx (with SOCKS proxy support), python-dotenv, pydantic
14
+
15
+ ## Configuration
16
+
17
+ **IMPORTANT**: The SDK uses environment variables for configuration via dotenv. The API key is ALWAYS loaded from the `.env` file and CANNOT be passed as a parameter.
18
+
19
+ 1. **Setup**: Copy `.env.example` to `.env` and configure:
20
+ ```bash
21
+ cp .env.example .env
22
+ ```
23
+
24
+ 2. **Required Environment Variables**:
25
+ - `LIXINGER_API_KEY` - Your Lixinger API key (REQUIRED - cannot be passed as parameter)
26
+
27
+ 3. **Optional Environment Variables**:
28
+ - `LIXINGER_BASE_URL` - Custom API base URL (default: https://open.lixinger.com/api)
29
+ - `LIXINGER_TIMEOUT` - Request timeout in seconds (default: 30.0)
30
+ - `LIXINGER_MAX_RETRIES` - Maximum retry attempts (default: 3)
31
+ - `LIXINGER_PROXY` - Proxy URL, supports SOCKS (default: None)
32
+ - `LIXINGER_MAX_REQUESTS_PER_MINUTE` - Rate limit (default: 1000)
33
+
34
+ ## Development Commands
35
+
36
+ ### Setup
37
+
38
+ ```bash
39
+ # Install dependencies using uv
40
+ uv sync --dev
41
+
42
+ # Install pre-commit hooks (IMPORTANT!)
43
+ uv run pre-commit install
44
+ ```
45
+
46
+ ### Running
47
+
48
+ ```bash
49
+ # Run the main script
50
+ uv run python main.py
51
+
52
+ # Run examples (make sure .env is configured first)
53
+ uv run python examples/company_example.py
54
+ ```
55
+
56
+ ### Linting
57
+
58
+ ```bash
59
+ # Run Ruff linter
60
+ uv run ruff check .
61
+
62
+ # Auto-fix linting issues
63
+ uv run ruff check . --fix
64
+
65
+ # Format code
66
+ uv run ruff format .
67
+
68
+ # Check formatting (used in CI)
69
+ uv run ruff format --check .
70
+
71
+ # Run Mypy type checker
72
+ uv run mypy lixinger/
73
+ ```
74
+
75
+ ### Testing
76
+
77
+ ```bash
78
+ # Run all tests
79
+ uv run pytest
80
+
81
+ # Run only unit tests (fast, no API key needed)
82
+ uv run pytest -m "not integration"
83
+
84
+ # Run integration tests (requires valid API key in .env)
85
+ uv run pytest -m integration
86
+
87
+ # Run specific test file
88
+ uv run pytest tests/test_client.py
89
+
90
+ # Run with coverage
91
+ uv run pytest --cov=lixinger
92
+
93
+ # Explore API and record real responses
94
+ uv run python scripts/explore_api.py
95
+ ```
96
+
97
+
98
+ ## Hard Constraints
99
+
100
+ - Always using the python via `uv run python`
101
+ - Always using `~=` in `pyproject.toml` for dependencies and always use `uv` for package management.
102
+ - Update [ARCHITECTURE.md](/.ARCHITECTURE.md) if you add / change project structure.
103
+ - Work on one feature at a time
104
+ - Only start the next feature after the current one passes end-to-end verification
105
+ - Don't "also refactor" feature B while implementing feature A
106
+ - All code must pass lint check
107
+ - Run `load_dotenv()` to load environment variables from `.env` file if not already done when running python code.
108
+
109
+
110
+ # References
111
+
112
+ Read @ADD_NEW_API_QUICK.md to quickly add new API endpoints and models.
113
+ Read @PUBLISHING.md to learn how to publish the SDK to PyPI.
114
+ Read @ARCHITECTURE.md to understand the SDK's architecture and design principles.
115
+ Read @.github/workflows/README.md to understand the CI/CD workflow.
116
+ Read @DOCUMENTATION.md to understand how to write docstrings and generate documentation.
@@ -0,0 +1,22 @@
1
+
2
+ ## Documentation
3
+
4
+ This project uses **MkDocs + mkdocstrings** to automatically generate API documentation from docstrings.
5
+
6
+ **Requirements when adding new APIs**:
7
+ - ✅ Write complete Google-style docstrings
8
+ - ✅ Include `Args`, `Returns`, and `Example` sections
9
+ - ✅ Use full type annotations
10
+
11
+ **Quick workflow**:
12
+ ```bash
13
+ # 1. Write code with docstrings
14
+ # 2. Generate docs
15
+ uv run python scripts/generate_docs.py
16
+ # 3. Preview
17
+ uv run mkdocs serve
18
+ ```
19
+
20
+ **Important**:
21
+ - ✅ DO commit: `docs/` (source files), `mkdocs.yml`
22
+ - ❌ DON'T commit: `site/` (auto-generated)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lixinger-python
3
- Version: 0.3.9
3
+ Version: 0.3.10
4
4
  Summary: Python SDK for Lixinger Financial Data API
5
5
  Project-URL: Homepage, https://www.lixinger.com
6
6
  Project-URL: Documentation, https://www.lixinger.com/open/api/doc
@@ -142,6 +142,10 @@ git tag -a v0.1.0 -m "Release version 0.1.0"
142
142
  git push origin v0.1.0
143
143
  ```
144
144
 
145
+ ### Step 10: Update CHANGELOG.md
146
+
147
+ Update `CHANGELOG.md` with the changes in this release.
148
+
145
149
  ## Using in Another Project
146
150
 
147
151
  After publishing, you can use it in your other project:
@@ -168,65 +172,6 @@ with LixingerClient() as client:
168
172
  print(df)
169
173
  ```
170
174
 
171
- ## Automation with GitHub Actions (Optional)
172
-
173
- You can automate releases with GitHub Actions. Create `.github/workflows/publish.yml`:
174
-
175
- ```yaml
176
- name: Publish to PyPI
177
-
178
- on:
179
- release:
180
- types: [published]
181
-
182
- jobs:
183
- publish:
184
- runs-on: ubuntu-latest
185
- steps:
186
- - uses: actions/checkout@v4
187
-
188
- - name: Set up Python
189
- uses: actions/setup-python@v5
190
- with:
191
- python-version: '3.13'
192
-
193
- - name: Install dependencies
194
- run: |
195
- pip install build twine
196
-
197
- - name: Build package
198
- run: python -m build
199
-
200
- - name: Publish to PyPI
201
- env:
202
- TWINE_USERNAME: __token__
203
- TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }}
204
- run: twine upload dist/*
205
- ```
206
-
207
- Then add `PYPI_API_TOKEN` to your GitHub repository secrets.
208
-
209
- ## Troubleshooting
210
-
211
- ### Error: Package already exists
212
-
213
- - You cannot re-upload the same version
214
- - Increment the version number in `pyproject.toml`
215
-
216
- ### Error: Invalid credentials
217
-
218
- - Check your `~/.pypirc` file
219
- - Ensure API token is correct and has upload permissions
220
-
221
- ### Error: Package name already taken
222
-
223
- - Choose a different name in `pyproject.toml`
224
- - Try variations like `lixinger-sdk`, `pylixinger`, etc.
225
-
226
- ### Import errors after installation
227
-
228
- - Ensure `lixinger/__init__.py` properly exports all public APIs
229
- - Check that all required files are included in MANIFEST.in
230
175
 
231
176
  ## Best Practices
232
177
 
@@ -236,11 +181,4 @@ Then add `PYPI_API_TOKEN` to your GitHub repository secrets.
236
181
  4. **Write a CHANGELOG.md** to document changes between versions
237
182
  5. **Never commit sensitive files** like `.pypirc` or `.env`
238
183
  6. **Follow semantic versioning** for version numbers
239
- 7. **Run all tests** before publishing
240
-
241
- ## Additional Resources
242
-
243
- - [Python Packaging User Guide](https://packaging.python.org/)
244
- - [PyPI Help](https://pypi.org/help/)
245
- - [Semantic Versioning](https://semver.org/)
246
- - [uv Documentation](https://docs.astral.sh/uv/)
184
+ 7. **Run all tests** before publishing
@@ -15,7 +15,7 @@ async def main():
15
15
  try:
16
16
  df = await client.company.get_profile(stock_codes=["600036"])
17
17
  print(df)
18
- except Exception as e:
18
+ except Exception as e: # noqa: BLE001
19
19
  print(f"Error fetching profile: {e}")
20
20
  print("Note: This example requires a valid LIXINGER_API_KEY in .env")
21
21
  finally:
@@ -26,7 +26,7 @@ async def main():
26
26
  try:
27
27
  df = await get_profile(stock_codes=["000001"])
28
28
  print(df)
29
- except Exception as e:
29
+ except Exception as e: # noqa: BLE001
30
30
  print(f"Error fetching profile: {e}")
31
31
 
32
32
 
@@ -37,7 +37,7 @@ class BaseAPI:
37
37
  client: httpx.AsyncClient | None = None,
38
38
  config: Config | None = None,
39
39
  rate_limiter: AsyncRateLimiter | None = None,
40
- ):
40
+ ) -> None:
41
41
  self._client = client
42
42
  self._config = config or settings
43
43
  self._rate_limiter = rate_limiter or _global_rate_limiter
@@ -37,7 +37,7 @@ class FundamentalNamespace:
37
37
  insurance: InsuranceFundamentalAPI,
38
38
  security: SecurityFundamentalAPI,
39
39
  other_financial: OtherFinancialFundamentalAPI,
40
- ):
40
+ ) -> None:
41
41
  """Initialize the fundamental namespace."""
42
42
  self.non_financial = non_financial
43
43
  self.bank = bank
@@ -65,7 +65,7 @@ class FSNamespace:
65
65
  insurance: InsuranceStatementAPI,
66
66
  security: SecurityStatementAPI,
67
67
  other_financial: OtherFinancialStatementAPI,
68
- ):
68
+ ) -> None:
69
69
  """Initialize the financial statement namespace."""
70
70
  self.non_financial = non_financial
71
71
  self.bank = bank
@@ -121,7 +121,7 @@ class CompanyNamespace:
121
121
  indices: IndicesAPI,
122
122
  dividend: DividendAPI,
123
123
  announcement: AnnouncementAPI,
124
- ):
124
+ ) -> None:
125
125
  """Initialize the company namespace.
126
126
 
127
127
  Args:
@@ -1,5 +1,9 @@
1
1
  """Index namespace for grouping related APIs."""
2
2
 
3
+ from typing import Any
4
+
5
+ import pandas as pd
6
+
3
7
  from lixinger.api.cn.index.candlestick import IndexCandlestickAPI
4
8
  from lixinger.api.cn.index.constituent_weightings import ConstituentWeightingsAPI
5
9
  from lixinger.api.cn.index.constituents import ConstituentsAPI
@@ -32,7 +36,7 @@ class IndexFSNamespace:
32
36
  bank: IndexBankStatementAPI,
33
37
  security: IndexSecurityStatementAPI,
34
38
  hybrid: IndexHybridStatementAPI,
35
- ):
39
+ ) -> None:
36
40
  """Initialize the index financial statement namespace.
37
41
 
38
42
  Args:
@@ -84,7 +88,7 @@ class IndexNamespace:
84
88
  fs_bank: IndexBankStatementAPI,
85
89
  fs_security: IndexSecurityStatementAPI,
86
90
  fs_hybrid: IndexHybridStatementAPI,
87
- ):
91
+ ) -> None:
88
92
  """Initialize the index namespace.
89
93
 
90
94
  Args:
@@ -118,34 +122,34 @@ class IndexNamespace:
118
122
  )
119
123
 
120
124
  # Convenience aliases for shorter access
121
- def get_index(self, *args, **kwargs):
125
+ async def get_index(self, *args: Any, **kwargs: Any) -> pd.DataFrame:
122
126
  """Alias for index.get_index."""
123
- return self.index.get_index(*args, **kwargs)
127
+ return await self.index.get_index(*args, **kwargs)
124
128
 
125
- def get_constituents(self, *args, **kwargs):
129
+ async def get_constituents(self, *args: Any, **kwargs: Any) -> pd.DataFrame:
126
130
  """Alias for constituents.get_constituents."""
127
- return self.constituents.get_constituents(*args, **kwargs)
131
+ return await self.constituents.get_constituents(*args, **kwargs)
128
132
 
129
- def get_constituent_weightings(self, *args, **kwargs):
133
+ async def get_constituent_weightings(self, *args: Any, **kwargs: Any) -> pd.DataFrame:
130
134
  """Alias for constituent_weightings.get_constituent_weightings."""
131
- return self.constituent_weightings.get_constituent_weightings(*args, **kwargs)
135
+ return await self.constituent_weightings.get_constituent_weightings(*args, **kwargs)
132
136
 
133
- def get_fundamental(self, *args, **kwargs):
137
+ async def get_fundamental(self, *args: Any, **kwargs: Any) -> pd.DataFrame:
134
138
  """Alias for fundamental.get_fundamental."""
135
- return self.fundamental.get_fundamental(*args, **kwargs)
139
+ return await self.fundamental.get_fundamental(*args, **kwargs)
136
140
 
137
- def get_candlestick(self, *args, **kwargs):
141
+ async def get_candlestick(self, *args: Any, **kwargs: Any) -> pd.DataFrame:
138
142
  """Alias for candlestick.get_candlestick."""
139
- return self.candlestick.get_candlestick(*args, **kwargs)
143
+ return await self.candlestick.get_candlestick(*args, **kwargs)
140
144
 
141
- def get_drawdown(self, *args, **kwargs):
145
+ async def get_drawdown(self, *args: Any, **kwargs: Any) -> pd.DataFrame:
142
146
  """Alias for drawdown.get_drawdown."""
143
- return self.drawdown.get_drawdown(*args, **kwargs)
147
+ return await self.drawdown.get_drawdown(*args, **kwargs)
144
148
 
145
- def get_tracking_fund(self, *args, **kwargs):
149
+ async def get_tracking_fund(self, *args: Any, **kwargs: Any) -> pd.DataFrame:
146
150
  """Alias for tracking_fund.get_tracking_fund."""
147
- return self.tracking_fund.get_tracking_fund(*args, **kwargs)
151
+ return await self.tracking_fund.get_tracking_fund(*args, **kwargs)
148
152
 
149
- def get_margin_trading(self, *args, **kwargs):
153
+ async def get_margin_trading(self, *args: Any, **kwargs: Any) -> pd.DataFrame:
150
154
  """Alias for margin_trading.get_margin_trading."""
151
- return self.margin_trading.get_margin_trading(*args, **kwargs)
155
+ return await self.margin_trading.get_margin_trading(*args, **kwargs)
@@ -1,3 +1,5 @@
1
+ from types import TracebackType
2
+
1
3
  import httpx
2
4
 
3
5
  from lixinger.api.cn.company.announcement import AnnouncementAPI
@@ -62,7 +64,7 @@ class AsyncLixingerClient:
62
64
  max_retries: int | None = None,
63
65
  proxy: str | None = None,
64
66
  max_requests_per_minute: int = 1000,
65
- ):
67
+ ) -> None:
66
68
  """Initialize the async Lixinger API client.
67
69
 
68
70
  The API key is ALWAYS loaded from the LIXINGER_API_KEY environment variable.
@@ -233,13 +235,18 @@ class AsyncLixingerClient:
233
235
  )
234
236
  self.cn_fund_announcement = FundAnnouncementAPI(self._http_client, self.config, self._rate_limiter)
235
237
 
236
- async def __aenter__(self):
238
+ async def __aenter__(self) -> "AsyncLixingerClient":
237
239
  return self
238
240
 
239
- async def __aexit__(self, exc_type, exc_val, exc_tb):
241
+ async def __aexit__(
242
+ self,
243
+ exc_type: type[BaseException] | None,
244
+ exc_val: BaseException | None,
245
+ exc_tb: TracebackType | None,
246
+ ) -> None:
240
247
  await self.close()
241
248
 
242
- async def close(self):
249
+ async def close(self) -> None:
243
250
  """Close the underlying HTTP client."""
244
251
  await self._http_client.aclose()
245
252
 
@@ -5,7 +5,7 @@ class LixingerError(Exception):
5
5
  class APIError(LixingerError):
6
6
  """API request failed."""
7
7
 
8
- def __init__(self, message: str, status_code: int | None = None):
8
+ def __init__(self, message: str, status_code: int | None = None) -> None:
9
9
  super().__init__(message)
10
10
  self.status_code = status_code
11
11
 
@@ -6,7 +6,7 @@ import time
6
6
  class AsyncRateLimiter:
7
7
  """Async token bucket rate limiter."""
8
8
 
9
- def __init__(self, max_requests: int, window: float = 60.0):
9
+ def __init__(self, max_requests: int, window: float = 60.0) -> None:
10
10
  self.max_requests = max_requests
11
11
  self.window = window
12
12
  self.requests: deque[float] = deque()
@@ -0,0 +1,31 @@
1
+ When implementing API client functionality, ensure:
2
+
3
+ 1. **Request Headers**:
4
+ - Set `Content-Type: application/json`
5
+ - Include `accept-encoding: gzip` (can also include deflate, br, *)
6
+
7
+ 2. **Rate Limiting**:
8
+ - Maximum 1000 requests per minute
9
+ - Status code 429 (Too Many Requests) indicates rate limit exceeded
10
+ - Implement retry mechanism for network issues and failures
11
+
12
+ 3. **Error Handling**:
13
+ - All API calls should have retry logic
14
+ - Handle network issues gracefully to prevent crashes
15
+
16
+ 4. **Authentication**:
17
+ - API key is sent via query parameter `token` in POST request body
18
+ - Never hardcode API keys in source code
19
+
20
+ 5. **Response Format** (CRITICAL):
21
+ - All Lixinger API responses follow a standard format:
22
+ ```json
23
+ {
24
+ "code": 1, // 1 = success, other values = error
25
+ "message": "success", // "success" or error message
26
+ "data": [...] // Actual response payload
27
+ }
28
+ ```
29
+ - Always validate `code == 1` and `message == "success"`
30
+ - Return only the `data` field to users (unwrap the response)
31
+ - Handle error responses appropriately