fin-infra 0.1.72__tar.gz → 0.1.73__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 (180) hide show
  1. {fin_infra-0.1.72 → fin_infra-0.1.73}/PKG-INFO +14 -8
  2. {fin_infra-0.1.72 → fin_infra-0.1.73}/pyproject.toml +22 -9
  3. fin_infra-0.1.73/src/fin_infra/__init__.py +72 -0
  4. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/investments/providers/plaid.py +39 -13
  5. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/providers/market/ccxt_crypto.py +17 -1
  6. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/providers/market/yahoo.py +17 -2
  7. fin_infra-0.1.72/src/fin_infra/__init__.py +0 -22
  8. {fin_infra-0.1.72 → fin_infra-0.1.73}/LICENSE +0 -0
  9. {fin_infra-0.1.72 → fin_infra-0.1.73}/README.md +0 -0
  10. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/__main__.py +0 -0
  11. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/analytics/__init__.py +0 -0
  12. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/analytics/add.py +0 -0
  13. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/analytics/cash_flow.py +0 -0
  14. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/analytics/ease.py +0 -0
  15. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/analytics/models.py +0 -0
  16. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/analytics/portfolio.py +0 -0
  17. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/analytics/projections.py +0 -0
  18. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/analytics/rebalancing.py +0 -0
  19. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/analytics/savings.py +0 -0
  20. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/analytics/scenarios.py +0 -0
  21. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/analytics/spending.py +0 -0
  22. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/banking/__init__.py +0 -0
  23. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/banking/history.py +0 -0
  24. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/banking/utils.py +0 -0
  25. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/brokerage/__init__.py +0 -0
  26. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/budgets/__init__.py +0 -0
  27. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/budgets/add.py +0 -0
  28. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/budgets/alerts.py +0 -0
  29. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/budgets/ease.py +0 -0
  30. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/budgets/models.py +0 -0
  31. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/budgets/scaffold_templates/README.md +0 -0
  32. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/budgets/scaffold_templates/__init__.py +0 -0
  33. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/budgets/scaffold_templates/models.py.tmpl +0 -0
  34. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/budgets/scaffold_templates/repository.py.tmpl +0 -0
  35. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/budgets/scaffold_templates/schemas.py.tmpl +0 -0
  36. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/budgets/templates.py +0 -0
  37. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/budgets/tracker.py +0 -0
  38. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/cashflows/__init__.py +0 -0
  39. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/cashflows/core.py +0 -0
  40. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/categorization/__init__.py +0 -0
  41. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/categorization/add.py +0 -0
  42. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/categorization/ease.py +0 -0
  43. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/categorization/engine.py +0 -0
  44. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/categorization/llm_layer.py +0 -0
  45. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/categorization/models.py +0 -0
  46. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/categorization/rules.py +0 -0
  47. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/categorization/taxonomy.py +0 -0
  48. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/chat/__init__.py +0 -0
  49. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/chat/ease.py +0 -0
  50. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/chat/planning.py +0 -0
  51. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/cli/__init__.py +0 -0
  52. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/cli/cmds/__init__.py +0 -0
  53. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/cli/cmds/scaffold_cmds.py +0 -0
  54. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/clients/__init__.py +0 -0
  55. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/clients/base.py +0 -0
  56. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/clients/plaid.py +0 -0
  57. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/compliance/__init__.py +0 -0
  58. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/credit/__init__.py +0 -0
  59. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/credit/add.py +0 -0
  60. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/credit/experian/__init__.py +0 -0
  61. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/credit/experian/auth.py +0 -0
  62. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/credit/experian/client.py +0 -0
  63. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/credit/experian/parser.py +0 -0
  64. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/credit/experian/provider.py +0 -0
  65. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/credit/mock.py +0 -0
  66. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/crypto/__init__.py +0 -0
  67. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/crypto/insights.py +0 -0
  68. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/documents/__init__.py +0 -0
  69. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/documents/add.py +0 -0
  70. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/documents/analysis.py +0 -0
  71. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/documents/ease.py +0 -0
  72. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/documents/models.py +0 -0
  73. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/documents/ocr.py +0 -0
  74. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/documents/storage.py +0 -0
  75. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/exceptions.py +0 -0
  76. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/goals/__init__.py +0 -0
  77. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/goals/add.py +0 -0
  78. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/goals/funding.py +0 -0
  79. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/goals/management.py +0 -0
  80. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/goals/milestones.py +0 -0
  81. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/goals/models.py +0 -0
  82. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/goals/scaffold_templates/README.md +0 -0
  83. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/goals/scaffold_templates/__init__.py +0 -0
  84. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/goals/scaffold_templates/models.py.tmpl +0 -0
  85. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/goals/scaffold_templates/repository.py.tmpl +0 -0
  86. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/goals/scaffold_templates/schemas.py.tmpl +0 -0
  87. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/insights/__init__.py +0 -0
  88. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/insights/aggregator.py +0 -0
  89. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/insights/models.py +0 -0
  90. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/investments/__init__.py +0 -0
  91. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/investments/add.py +0 -0
  92. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/investments/ease.py +0 -0
  93. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/investments/models.py +0 -0
  94. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/investments/providers/__init__.py +0 -0
  95. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/investments/providers/base.py +0 -0
  96. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/investments/providers/snaptrade.py +0 -0
  97. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/investments/scaffold_templates/README.md +0 -0
  98. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/investments/scaffold_templates/__init__.py +0 -0
  99. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/investments/scaffold_templates/models.py.tmpl +0 -0
  100. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/investments/scaffold_templates/repository.py.tmpl +0 -0
  101. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/investments/scaffold_templates/schemas.py.tmpl +0 -0
  102. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/markets/__init__.py +0 -0
  103. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/models/__init__.py +0 -0
  104. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/models/accounts.py +0 -0
  105. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/models/brokerage.py +0 -0
  106. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/models/candle.py +0 -0
  107. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/models/credit.py +0 -0
  108. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/models/money.py +0 -0
  109. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/models/quotes.py +0 -0
  110. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/models/tax.py +0 -0
  111. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/models/transactions.py +0 -0
  112. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/net_worth/__init__.py +0 -0
  113. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/net_worth/add.py +0 -0
  114. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/net_worth/aggregator.py +0 -0
  115. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/net_worth/calculator.py +0 -0
  116. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/net_worth/ease.py +0 -0
  117. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/net_worth/goals.py +0 -0
  118. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/net_worth/insights.py +0 -0
  119. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/net_worth/models.py +0 -0
  120. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/net_worth/scaffold_templates/README.md +0 -0
  121. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/net_worth/scaffold_templates/__init__.py +0 -0
  122. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/net_worth/scaffold_templates/models.py.tmpl +0 -0
  123. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/net_worth/scaffold_templates/repository.py.tmpl +0 -0
  124. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/net_worth/scaffold_templates/schemas.py.tmpl +0 -0
  125. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/normalization/__init__.py +0 -0
  126. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/normalization/currency_converter.py +0 -0
  127. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/normalization/models.py +0 -0
  128. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/normalization/providers/__init__.py +0 -0
  129. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/normalization/providers/exchangerate.py +0 -0
  130. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/normalization/providers/static_mappings.py +0 -0
  131. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/normalization/symbol_resolver.py +0 -0
  132. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/obs/__init__.py +0 -0
  133. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/obs/classifier.py +0 -0
  134. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/providers/__init__.py +0 -0
  135. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/providers/banking/base.py +0 -0
  136. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/providers/banking/plaid_client.py +0 -0
  137. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/providers/banking/teller_client.py +0 -0
  138. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/providers/base.py +0 -0
  139. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/providers/brokerage/alpaca.py +0 -0
  140. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/providers/brokerage/base.py +0 -0
  141. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/providers/credit/experian.py +0 -0
  142. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/providers/identity/stripe_identity.py +0 -0
  143. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/providers/market/alphavantage.py +0 -0
  144. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/providers/market/base.py +0 -0
  145. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/providers/market/coingecko.py +0 -0
  146. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/providers/registry.py +0 -0
  147. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/providers/tax/__init__.py +0 -0
  148. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/providers/tax/irs.py +0 -0
  149. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/providers/tax/mock.py +0 -0
  150. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/providers/tax/taxbit.py +0 -0
  151. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/py.typed +0 -0
  152. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/recurring/__init__.py +0 -0
  153. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/recurring/add.py +0 -0
  154. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/recurring/detector.py +0 -0
  155. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/recurring/detectors_llm.py +0 -0
  156. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/recurring/ease.py +0 -0
  157. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/recurring/insights.py +0 -0
  158. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/recurring/models.py +0 -0
  159. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/recurring/normalizer.py +0 -0
  160. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/recurring/normalizers.py +0 -0
  161. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/recurring/summary.py +0 -0
  162. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/scaffold/__init__.py +0 -0
  163. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/scaffold/budgets.py +0 -0
  164. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/scaffold/goals.py +0 -0
  165. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/security/__init__.py +0 -0
  166. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/security/add.py +0 -0
  167. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/security/audit.py +0 -0
  168. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/security/encryption.py +0 -0
  169. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/security/models.py +0 -0
  170. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/security/pii_filter.py +0 -0
  171. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/security/pii_patterns.py +0 -0
  172. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/security/token_store.py +0 -0
  173. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/settings.py +0 -0
  174. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/tax/__init__.py +0 -0
  175. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/tax/add.py +0 -0
  176. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/tax/tlh.py +0 -0
  177. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/utils/__init__.py +0 -0
  178. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/utils/http.py +0 -0
  179. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/utils/retry.py +0 -0
  180. {fin_infra-0.1.72 → fin_infra-0.1.73}/src/fin_infra/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: fin-infra
3
- Version: 0.1.72
3
+ Version: 0.1.73
4
4
  Summary: Financial infrastructure toolkit: banking connections, market data, credit, cashflows, and brokerage integrations
5
5
  License: MIT
6
6
  Keywords: finance,banking,plaid,brokerage,markets,credit,tax,cashflow,fintech,infra
@@ -19,24 +19,30 @@ Classifier: Programming Language :: Python :: 3 :: Only
19
19
  Classifier: Topic :: Office/Business :: Financial
20
20
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
21
21
  Classifier: Typing :: Typed
22
+ Provides-Extra: all
23
+ Provides-Extra: banking
24
+ Provides-Extra: crypto
25
+ Provides-Extra: markets
26
+ Provides-Extra: plaid
27
+ Provides-Extra: yahoo
22
28
  Requires-Dist: ai-infra (>=0.1.142)
23
29
  Requires-Dist: cashews[redis] (>=7.0)
24
- Requires-Dist: ccxt (>=4.0.0)
30
+ Requires-Dist: ccxt (>=4.0.0) ; extra == "markets" or extra == "crypto" or extra == "all"
25
31
  Requires-Dist: httpx (>=0.25.0)
26
32
  Requires-Dist: loguru (>=0.7.0)
27
33
  Requires-Dist: numpy (>=1.24.0)
28
34
  Requires-Dist: numpy-financial (>=1.0.0)
29
- Requires-Dist: plaid-python (>=25.0.0)
35
+ Requires-Dist: plaid-python (>=25.0.0) ; extra == "plaid" or extra == "banking" or extra == "all"
30
36
  Requires-Dist: pydantic (>=2.0)
31
37
  Requires-Dist: pydantic-settings (>=2.0)
32
38
  Requires-Dist: python-dotenv (>=1.0.0)
33
39
  Requires-Dist: tenacity (>=8.0.0)
34
40
  Requires-Dist: typing-extensions (>=4.0)
35
- Requires-Dist: yahooquery (>=2.3.0)
36
- Project-URL: Documentation, https://github.com/your-org/fin-infra#readme
37
- Project-URL: Homepage, https://github.com/your-org/fin-infra
38
- Project-URL: Issues, https://github.com/your-org/fin-infra/issues
39
- Project-URL: Repository, https://github.com/your-org/fin-infra
41
+ Requires-Dist: yahooquery (>=2.3.0) ; extra == "markets" or extra == "yahoo" or extra == "all"
42
+ Project-URL: Documentation, https://nfrax.com/fin-infra
43
+ Project-URL: Homepage, https://github.com/nfraxlab/fin-infra
44
+ Project-URL: Issues, https://github.com/nfraxlab/fin-infra/issues
45
+ Project-URL: Repository, https://github.com/nfraxlab/fin-infra
40
46
  Description-Content-Type: text/markdown
41
47
 
42
48
  <div align="center">
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "fin-infra"
3
- version = "0.1.72"
3
+ version = "0.1.73"
4
4
  description = "Financial infrastructure toolkit: banking connections, market data, credit, cashflows, and brokerage integrations"
5
5
  authors = ["Ali Khatami <aliikhatami94@gmail.com>"]
6
6
  license = "MIT"
@@ -29,10 +29,10 @@ classifiers = [
29
29
  ]
30
30
 
31
31
  [tool.poetry.urls]
32
- Homepage = "https://github.com/your-org/fin-infra"
33
- Repository = "https://github.com/your-org/fin-infra"
34
- Issues = "https://github.com/your-org/fin-infra/issues"
35
- Documentation = "https://github.com/your-org/fin-infra#readme"
32
+ Homepage = "https://github.com/nfraxlab/fin-infra"
33
+ Repository = "https://github.com/nfraxlab/fin-infra"
34
+ Issues = "https://github.com/nfraxlab/fin-infra/issues"
35
+ Documentation = "https://nfrax.com/fin-infra"
36
36
 
37
37
  [tool.poetry.dependencies]
38
38
  python = ">=3.11,<4.0"
@@ -50,12 +50,25 @@ numpy = ">=1.24.0"
50
50
  numpy-financial = ">=1.0.0"
51
51
  # svc-infra = { path = "../svc-infra", develop = true } # Local dev only - uncomment for local development
52
52
 
53
- # Provider dependencies (installed by default for easy_* functions)
54
- yahooquery = ">=2.3.0"
55
- ccxt = ">=4.0.0"
56
- plaid-python = ">=25.0.0"
53
+ # ai-infra for LLM-powered features (always included)
57
54
  ai-infra = ">=0.1.142"
58
55
 
56
+ # Optional provider dependencies (install via extras)
57
+ yahooquery = { version = ">=2.3.0", optional = true }
58
+ ccxt = { version = ">=4.0.0", optional = true }
59
+ plaid-python = { version = ">=25.0.0", optional = true }
60
+
61
+ [tool.poetry.extras]
62
+ # Market data providers
63
+ markets = ["yahooquery", "ccxt"]
64
+ yahoo = ["yahooquery"]
65
+ crypto = ["ccxt"]
66
+ # Banking providers
67
+ plaid = ["plaid-python"]
68
+ banking = ["plaid-python"]
69
+ # All providers
70
+ all = ["yahooquery", "ccxt", "plaid-python"]
71
+
59
72
  [tool.poetry.group.dev.dependencies]
60
73
  pytest = ">=8.0.0"
61
74
  pytest-asyncio = ">=0.23.0"
@@ -0,0 +1,72 @@
1
+ """fin_infra: Financial Infrastructure Toolkit.
2
+
3
+ A comprehensive financial infrastructure library providing:
4
+ - Banking integration (Plaid, Teller, MX)
5
+ - Brokerage integration (Alpaca, Interactive Brokers)
6
+ - Market data (stocks, crypto, forex)
7
+ - Credit scores (Experian, Equifax, TransUnion)
8
+ - Financial calculations (NPV, IRR, PMT, FV, PV)
9
+ - Portfolio analytics (returns, allocation, benchmarking)
10
+ - Transaction categorization (rule-based + ML)
11
+ - Budget management and cash flow analysis
12
+ - Net worth tracking and goal management
13
+
14
+ Example:
15
+ from fin_infra.banking import easy_banking
16
+ from fin_infra.markets import easy_market
17
+
18
+ banking = easy_banking()
19
+ market = easy_market()
20
+ quote = market.quote("AAPL")
21
+ """
22
+
23
+ from __future__ import annotations
24
+
25
+ # Core modules - can be imported as `from fin_infra import banking`
26
+ from . import (
27
+ analytics,
28
+ banking,
29
+ brokerage,
30
+ budgets,
31
+ cashflows,
32
+ categorization,
33
+ credit,
34
+ crypto,
35
+ investments,
36
+ markets,
37
+ net_worth,
38
+ recurring,
39
+ tax,
40
+ )
41
+
42
+ # Base exceptions
43
+ from .exceptions import (
44
+ FinInfraError,
45
+ ProviderError,
46
+ ProviderNotFoundError,
47
+ ValidationError,
48
+ )
49
+ from .version import __version__
50
+
51
+ __all__ = [
52
+ "__version__",
53
+ # Core modules
54
+ "analytics",
55
+ "banking",
56
+ "brokerage",
57
+ "budgets",
58
+ "cashflows",
59
+ "categorization",
60
+ "credit",
61
+ "crypto",
62
+ "investments",
63
+ "markets",
64
+ "net_worth",
65
+ "recurring",
66
+ "tax",
67
+ # Base errors
68
+ "FinInfraError",
69
+ "ProviderError",
70
+ "ProviderNotFoundError",
71
+ "ValidationError",
72
+ ]
@@ -12,19 +12,33 @@ from datetime import date
12
12
  from decimal import Decimal
13
13
  from typing import Any, Dict, List, Optional, cast
14
14
 
15
- from plaid.api import plaid_api
16
- from plaid.model.investments_holdings_get_request import InvestmentsHoldingsGetRequest
17
- from plaid.model.investments_transactions_get_request import (
18
- InvestmentsTransactionsGetRequest,
19
- )
20
- from plaid.model.investments_holdings_get_response import InvestmentsHoldingsGetResponse
21
- from plaid.model.investments_transactions_get_response import (
22
- InvestmentsTransactionsGetResponse,
23
- )
24
- from plaid.exceptions import ApiException
25
- import plaid
26
- from plaid.api_client import ApiClient
27
- from plaid.configuration import Configuration
15
+ try:
16
+ from plaid.api import plaid_api
17
+ from plaid.model.investments_holdings_get_request import InvestmentsHoldingsGetRequest
18
+ from plaid.model.investments_transactions_get_request import (
19
+ InvestmentsTransactionsGetRequest,
20
+ )
21
+ from plaid.model.investments_holdings_get_response import InvestmentsHoldingsGetResponse
22
+ from plaid.model.investments_transactions_get_response import (
23
+ InvestmentsTransactionsGetResponse,
24
+ )
25
+ from plaid.exceptions import ApiException
26
+ import plaid
27
+ from plaid.api_client import ApiClient
28
+ from plaid.configuration import Configuration
29
+
30
+ HAS_PLAID = True
31
+ except ImportError: # pragma: no cover
32
+ HAS_PLAID = False
33
+ plaid_api = None
34
+ plaid = None
35
+ ApiClient = None
36
+ Configuration = None
37
+ ApiException = Exception
38
+ InvestmentsHoldingsGetRequest = Any
39
+ InvestmentsTransactionsGetRequest = Any
40
+ InvestmentsHoldingsGetResponse = Any
41
+ InvestmentsTransactionsGetResponse = Any
28
42
 
29
43
  from ..models import (
30
44
  Holding,
@@ -36,6 +50,15 @@ from ..models import (
36
50
  from .base import InvestmentProvider
37
51
 
38
52
 
53
+ def _require_plaid() -> None:
54
+ """Raise ImportError if plaid-python is not installed."""
55
+ if not HAS_PLAID:
56
+ raise ImportError(
57
+ "Plaid support requires the 'plaid-python' package. "
58
+ "Install with: pip install fin-infra[plaid] or pip install fin-infra[banking]"
59
+ )
60
+
61
+
39
62
  class PlaidInvestmentProvider(InvestmentProvider):
40
63
  """Plaid Investment API provider.
41
64
 
@@ -76,7 +99,10 @@ class PlaidInvestmentProvider(InvestmentProvider):
76
99
 
77
100
  Raises:
78
101
  ValueError: If client_id or secret is missing
102
+ ImportError: If plaid-python is not installed
79
103
  """
104
+ _require_plaid()
105
+
80
106
  if not client_id or not secret:
81
107
  raise ValueError("client_id and secret are required for Plaid provider")
82
108
 
@@ -2,15 +2,31 @@ from __future__ import annotations
2
2
 
3
3
  from typing import Any, cast
4
4
 
5
- import ccxt
5
+ try:
6
+ import ccxt
7
+
8
+ HAS_CCXT = True
9
+ except ImportError: # pragma: no cover
10
+ HAS_CCXT = False
11
+ ccxt = None
6
12
 
7
13
  from ..base import CryptoDataProvider
8
14
 
9
15
 
16
+ def _require_ccxt() -> None:
17
+ """Raise ImportError if ccxt is not installed."""
18
+ if not HAS_CCXT:
19
+ raise ImportError(
20
+ "Crypto exchange support requires the 'ccxt' package. "
21
+ "Install with: pip install fin-infra[crypto] or pip install fin-infra[markets]"
22
+ )
23
+
24
+
10
25
  class CCXTCryptoData(CryptoDataProvider):
11
26
  """Exchange-agnostic crypto market data using CCXT."""
12
27
 
13
28
  def __init__(self, exchange: str = "binance") -> None:
29
+ _require_ccxt()
14
30
  if not hasattr(ccxt, exchange):
15
31
  raise ValueError(f"Unknown exchange '{exchange}' in ccxt")
16
32
  self.exchange = getattr(ccxt, exchange)()
@@ -14,12 +14,27 @@ from typing import Sequence
14
14
  from decimal import Decimal
15
15
  from datetime import datetime, timezone
16
16
 
17
- from yahooquery import Ticker
17
+ try:
18
+ from yahooquery import Ticker
19
+
20
+ HAS_YAHOOQUERY = True
21
+ except ImportError: # pragma: no cover
22
+ HAS_YAHOOQUERY = False
23
+ Ticker = None
18
24
 
19
25
  from .base import MarketDataProvider
20
26
  from ...models import Quote, Candle
21
27
 
22
28
 
29
+ def _require_yahooquery() -> None:
30
+ """Raise ImportError if yahooquery is not installed."""
31
+ if not HAS_YAHOOQUERY:
32
+ raise ImportError(
33
+ "Yahoo Finance support requires the 'yahooquery' package. "
34
+ "Install with: pip install fin-infra[yahoo] or pip install fin-infra[markets]"
35
+ )
36
+
37
+
23
38
  class YahooFinanceMarketData(MarketDataProvider):
24
39
  """Yahoo Finance provider (zero config, no API key needed).
25
40
 
@@ -42,7 +57,7 @@ class YahooFinanceMarketData(MarketDataProvider):
42
57
 
43
58
  def __init__(self) -> None:
44
59
  """Initialize Yahoo Finance provider (no configuration needed)."""
45
- pass
60
+ _require_yahooquery()
46
61
 
47
62
  def quote(self, symbol: str) -> Quote:
48
63
  """Get real-time quote for a symbol.
@@ -1,22 +0,0 @@
1
- """fin_infra: Financial infrastructure toolkit.
2
-
3
- Public surface is intentionally small at this stage. Import from submodules for
4
- specific domains (clients, models, markets, credit).
5
- """
6
-
7
- from .exceptions import (
8
- FinInfraError,
9
- ProviderError,
10
- ProviderNotFoundError,
11
- ValidationError,
12
- )
13
- from .version import __version__
14
-
15
- __all__ = [
16
- "__version__",
17
- # Base errors
18
- "FinInfraError",
19
- "ProviderError",
20
- "ProviderNotFoundError",
21
- "ValidationError",
22
- ]
File without changes
File without changes