fin-infra 0.1.61__tar.gz → 0.1.62__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 (179) hide show
  1. {fin_infra-0.1.61 → fin_infra-0.1.62}/PKG-INFO +1 -1
  2. {fin_infra-0.1.61 → fin_infra-0.1.62}/pyproject.toml +1 -1
  3. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/budgets/__init__.py +4 -4
  4. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/crypto/insights.py +1 -1
  5. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/investments/models.py +6 -6
  6. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/net_worth/models.py +14 -14
  7. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/obs/classifier.py +4 -2
  8. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/providers/brokerage/alpaca.py +1 -1
  9. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/recurring/detectors_llm.py +1 -1
  10. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/recurring/insights.py +1 -1
  11. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/recurring/normalizers.py +1 -1
  12. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/security/token_store.py +6 -2
  13. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/tax/add.py +1 -1
  14. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/utils/retry.py +1 -1
  15. {fin_infra-0.1.61 → fin_infra-0.1.62}/LICENSE +0 -0
  16. {fin_infra-0.1.61 → fin_infra-0.1.62}/README.md +0 -0
  17. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/__init__.py +0 -0
  18. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/__main__.py +0 -0
  19. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/analytics/__init__.py +0 -0
  20. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/analytics/add.py +0 -0
  21. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/analytics/cash_flow.py +0 -0
  22. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/analytics/ease.py +0 -0
  23. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/analytics/models.py +0 -0
  24. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/analytics/portfolio.py +0 -0
  25. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/analytics/projections.py +0 -0
  26. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/analytics/rebalancing.py +0 -0
  27. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/analytics/savings.py +0 -0
  28. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/analytics/scenarios.py +0 -0
  29. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/analytics/spending.py +0 -0
  30. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/banking/__init__.py +0 -0
  31. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/banking/history.py +0 -0
  32. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/banking/utils.py +0 -0
  33. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/brokerage/__init__.py +0 -0
  34. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/budgets/add.py +0 -0
  35. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/budgets/alerts.py +0 -0
  36. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/budgets/ease.py +0 -0
  37. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/budgets/models.py +0 -0
  38. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/budgets/scaffold_templates/README.md +0 -0
  39. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/budgets/scaffold_templates/__init__.py +0 -0
  40. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/budgets/scaffold_templates/models.py.tmpl +0 -0
  41. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/budgets/scaffold_templates/repository.py.tmpl +0 -0
  42. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/budgets/scaffold_templates/schemas.py.tmpl +0 -0
  43. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/budgets/templates.py +0 -0
  44. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/budgets/tracker.py +0 -0
  45. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/cashflows/__init__.py +0 -0
  46. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/cashflows/core.py +0 -0
  47. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/categorization/__init__.py +0 -0
  48. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/categorization/add.py +0 -0
  49. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/categorization/ease.py +0 -0
  50. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/categorization/engine.py +0 -0
  51. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/categorization/llm_layer.py +0 -0
  52. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/categorization/models.py +0 -0
  53. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/categorization/rules.py +0 -0
  54. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/categorization/taxonomy.py +0 -0
  55. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/chat/__init__.py +0 -0
  56. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/chat/ease.py +0 -0
  57. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/chat/planning.py +0 -0
  58. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/cli/__init__.py +0 -0
  59. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/cli/cmds/__init__.py +0 -0
  60. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/cli/cmds/scaffold_cmds.py +0 -0
  61. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/clients/__init__.py +0 -0
  62. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/clients/base.py +0 -0
  63. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/clients/plaid.py +0 -0
  64. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/compliance/__init__.py +0 -0
  65. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/credit/__init__.py +0 -0
  66. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/credit/add.py +0 -0
  67. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/credit/experian/__init__.py +0 -0
  68. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/credit/experian/auth.py +0 -0
  69. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/credit/experian/client.py +0 -0
  70. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/credit/experian/parser.py +0 -0
  71. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/credit/experian/provider.py +0 -0
  72. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/credit/mock.py +0 -0
  73. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/crypto/__init__.py +0 -0
  74. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/documents/__init__.py +0 -0
  75. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/documents/add.py +0 -0
  76. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/documents/analysis.py +0 -0
  77. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/documents/ease.py +0 -0
  78. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/documents/models.py +0 -0
  79. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/documents/ocr.py +0 -0
  80. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/documents/storage.py +0 -0
  81. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/exceptions.py +0 -0
  82. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/goals/__init__.py +0 -0
  83. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/goals/add.py +0 -0
  84. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/goals/funding.py +0 -0
  85. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/goals/management.py +0 -0
  86. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/goals/milestones.py +0 -0
  87. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/goals/models.py +0 -0
  88. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/goals/scaffold_templates/README.md +0 -0
  89. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/goals/scaffold_templates/__init__.py +0 -0
  90. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/goals/scaffold_templates/models.py.tmpl +0 -0
  91. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/goals/scaffold_templates/repository.py.tmpl +0 -0
  92. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/goals/scaffold_templates/schemas.py.tmpl +0 -0
  93. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/insights/__init__.py +0 -0
  94. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/insights/aggregator.py +0 -0
  95. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/insights/models.py +0 -0
  96. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/investments/__init__.py +0 -0
  97. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/investments/add.py +0 -0
  98. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/investments/ease.py +0 -0
  99. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/investments/providers/__init__.py +0 -0
  100. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/investments/providers/base.py +0 -0
  101. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/investments/providers/plaid.py +0 -0
  102. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/investments/providers/snaptrade.py +0 -0
  103. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/investments/scaffold_templates/README.md +0 -0
  104. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/investments/scaffold_templates/__init__.py +0 -0
  105. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/investments/scaffold_templates/models.py.tmpl +0 -0
  106. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/investments/scaffold_templates/repository.py.tmpl +0 -0
  107. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/investments/scaffold_templates/schemas.py.tmpl +0 -0
  108. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/markets/__init__.py +0 -0
  109. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/models/__init__.py +0 -0
  110. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/models/accounts.py +0 -0
  111. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/models/brokerage.py +0 -0
  112. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/models/candle.py +0 -0
  113. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/models/credit.py +0 -0
  114. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/models/money.py +0 -0
  115. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/models/quotes.py +0 -0
  116. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/models/tax.py +0 -0
  117. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/models/transactions.py +0 -0
  118. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/net_worth/__init__.py +0 -0
  119. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/net_worth/add.py +0 -0
  120. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/net_worth/aggregator.py +0 -0
  121. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/net_worth/calculator.py +0 -0
  122. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/net_worth/ease.py +0 -0
  123. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/net_worth/goals.py +0 -0
  124. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/net_worth/insights.py +0 -0
  125. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/net_worth/scaffold_templates/README.md +0 -0
  126. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/net_worth/scaffold_templates/__init__.py +0 -0
  127. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/net_worth/scaffold_templates/models.py.tmpl +0 -0
  128. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/net_worth/scaffold_templates/repository.py.tmpl +0 -0
  129. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/net_worth/scaffold_templates/schemas.py.tmpl +0 -0
  130. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/normalization/__init__.py +0 -0
  131. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/normalization/currency_converter.py +0 -0
  132. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/normalization/models.py +0 -0
  133. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/normalization/providers/__init__.py +0 -0
  134. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/normalization/providers/exchangerate.py +0 -0
  135. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/normalization/providers/static_mappings.py +0 -0
  136. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/normalization/symbol_resolver.py +0 -0
  137. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/obs/__init__.py +0 -0
  138. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/providers/__init__.py +0 -0
  139. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/providers/banking/base.py +0 -0
  140. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/providers/banking/plaid_client.py +0 -0
  141. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/providers/banking/teller_client.py +0 -0
  142. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/providers/base.py +0 -0
  143. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/providers/brokerage/base.py +0 -0
  144. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/providers/credit/experian.py +0 -0
  145. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/providers/identity/stripe_identity.py +0 -0
  146. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/providers/market/alphavantage.py +0 -0
  147. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/providers/market/base.py +0 -0
  148. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/providers/market/ccxt_crypto.py +0 -0
  149. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/providers/market/coingecko.py +0 -0
  150. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/providers/market/yahoo.py +0 -0
  151. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/providers/registry.py +0 -0
  152. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/providers/tax/__init__.py +0 -0
  153. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/providers/tax/irs.py +0 -0
  154. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/providers/tax/mock.py +0 -0
  155. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/providers/tax/taxbit.py +0 -0
  156. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/py.typed +0 -0
  157. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/recurring/__init__.py +0 -0
  158. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/recurring/add.py +0 -0
  159. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/recurring/detector.py +0 -0
  160. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/recurring/ease.py +0 -0
  161. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/recurring/models.py +0 -0
  162. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/recurring/normalizer.py +0 -0
  163. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/recurring/summary.py +0 -0
  164. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/scaffold/__init__.py +0 -0
  165. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/scaffold/budgets.py +0 -0
  166. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/scaffold/goals.py +0 -0
  167. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/security/__init__.py +0 -0
  168. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/security/add.py +0 -0
  169. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/security/audit.py +0 -0
  170. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/security/encryption.py +0 -0
  171. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/security/models.py +0 -0
  172. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/security/pii_filter.py +0 -0
  173. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/security/pii_patterns.py +0 -0
  174. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/settings.py +0 -0
  175. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/tax/__init__.py +0 -0
  176. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/tax/tlh.py +0 -0
  177. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/utils/__init__.py +0 -0
  178. {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/utils/http.py +0 -0
  179. {fin_infra-0.1.61 → fin_infra-0.1.62}/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.61
3
+ Version: 0.1.62
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
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "fin-infra"
3
- version = "0.1.61"
3
+ version = "0.1.62"
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"
@@ -87,11 +87,11 @@ __all__ = [
87
87
  def __getattr__(name: str):
88
88
  """Lazy import for budgets module components."""
89
89
  if name == "easy_budgets":
90
- from fin_infra.budgets.ease import easy_budgets # type: ignore[attr-defined]
90
+ from fin_infra.budgets.ease import easy_budgets
91
91
 
92
92
  return easy_budgets
93
93
  elif name == "add_budgets":
94
- from fin_infra.budgets.add import add_budgets # type: ignore[attr-defined]
94
+ from fin_infra.budgets.add import add_budgets
95
95
 
96
96
  return add_budgets
97
97
  elif name in (
@@ -119,11 +119,11 @@ def __getattr__(name: str):
119
119
 
120
120
  return BudgetTracker
121
121
  elif name == "check_budget_alerts":
122
- from fin_infra.budgets.alerts import check_budget_alerts # type: ignore[attr-defined]
122
+ from fin_infra.budgets.alerts import check_budget_alerts
123
123
 
124
124
  return check_budget_alerts
125
125
  elif name == "apply_template":
126
- from fin_infra.budgets.templates import apply_template # type: ignore[attr-defined]
126
+ from fin_infra.budgets.templates import apply_template
127
127
 
128
128
  return apply_template
129
129
 
@@ -260,7 +260,7 @@ Provide your insight:"""
260
260
  # Use natural language conversation (no output_schema)
261
261
  # Note: In tests, achat is mocked with messages= parameter
262
262
  # In production, this should use user_msg, provider, model_name parameters
263
- response = await llm.achat( # type: ignore[call-arg]
263
+ response = await llm.achat(
264
264
  messages=[{"role": "user", "content": prompt}],
265
265
  )
266
266
 
@@ -201,7 +201,7 @@ class Holding(BaseModel):
201
201
  unofficial_currency_code: Optional[str] = Field(None, description="For crypto/alt currencies")
202
202
  as_of_date: Optional[date] = Field(None, description="Date of pricing data")
203
203
 
204
- @computed_field # type: ignore[misc]
204
+ @computed_field
205
205
  @property
206
206
  def unrealized_gain_loss(self) -> Optional[Decimal]:
207
207
  """Calculate unrealized gain/loss (current value - cost basis)."""
@@ -209,7 +209,7 @@ class Holding(BaseModel):
209
209
  return None
210
210
  return self.institution_value - self.cost_basis
211
211
 
212
- @computed_field # type: ignore[misc]
212
+ @computed_field
213
213
  @property
214
214
  def unrealized_gain_loss_percent(self) -> Optional[Decimal]:
215
215
  """Calculate unrealized gain/loss percentage."""
@@ -350,7 +350,7 @@ class InvestmentAccount(BaseModel):
350
350
  # Holdings
351
351
  holdings: List[Holding] = Field(default_factory=list, description="List of holdings in account")
352
352
 
353
- @computed_field # type: ignore[misc]
353
+ @computed_field
354
354
  @property
355
355
  def total_value(self) -> Decimal:
356
356
  """Calculate total account value (sum of holdings + cash)."""
@@ -358,20 +358,20 @@ class InvestmentAccount(BaseModel):
358
358
  cash_balance = self.balances.get("current") or Decimal(0)
359
359
  return holdings_value + cash_balance
360
360
 
361
- @computed_field # type: ignore[misc]
361
+ @computed_field
362
362
  @property
363
363
  def total_cost_basis(self) -> Decimal:
364
364
  """Calculate total cost basis (sum of cost_basis across holdings)."""
365
365
  return sum(h.cost_basis for h in self.holdings if h.cost_basis is not None)
366
366
 
367
- @computed_field # type: ignore[misc]
367
+ @computed_field
368
368
  @property
369
369
  def total_unrealized_gain_loss(self) -> Decimal:
370
370
  """Calculate total unrealized P&L (value - cost_basis)."""
371
371
  holdings_value = sum(h.institution_value for h in self.holdings)
372
372
  return holdings_value - self.total_cost_basis
373
373
 
374
- @computed_field # type: ignore[misc]
374
+ @computed_field
375
375
  @property
376
376
  def total_unrealized_gain_loss_percent(self) -> Optional[Decimal]:
377
377
  """Calculate total unrealized P&L percentage."""
@@ -207,7 +207,7 @@ class AssetAllocation(BaseModel):
207
207
  vehicles: float = Field(0.0, ge=0, description="Vehicle value")
208
208
  other_assets: float = Field(0.0, ge=0, description="Other asset value")
209
209
 
210
- @computed_field # type: ignore[misc]
210
+ @computed_field
211
211
  @property
212
212
  def total_assets(self) -> float:
213
213
  """Sum of all asset categories."""
@@ -220,37 +220,37 @@ class AssetAllocation(BaseModel):
220
220
  + self.other_assets
221
221
  )
222
222
 
223
- @computed_field # type: ignore[misc]
223
+ @computed_field
224
224
  @property
225
225
  def cash_percentage(self) -> float:
226
226
  """Cash as percentage of total assets."""
227
227
  return (self.cash / self.total_assets * 100) if self.total_assets > 0 else 0.0
228
228
 
229
- @computed_field # type: ignore[misc]
229
+ @computed_field
230
230
  @property
231
231
  def investments_percentage(self) -> float:
232
232
  """Investments as percentage of total assets."""
233
233
  return (self.investments / self.total_assets * 100) if self.total_assets > 0 else 0.0
234
234
 
235
- @computed_field # type: ignore[misc]
235
+ @computed_field
236
236
  @property
237
237
  def crypto_percentage(self) -> float:
238
238
  """Crypto as percentage of total assets."""
239
239
  return (self.crypto / self.total_assets * 100) if self.total_assets > 0 else 0.0
240
240
 
241
- @computed_field # type: ignore[misc]
241
+ @computed_field
242
242
  @property
243
243
  def real_estate_percentage(self) -> float:
244
244
  """Real estate as percentage of total assets."""
245
245
  return (self.real_estate / self.total_assets * 100) if self.total_assets > 0 else 0.0
246
246
 
247
- @computed_field # type: ignore[misc]
247
+ @computed_field
248
248
  @property
249
249
  def vehicles_percentage(self) -> float:
250
250
  """Vehicles as percentage of total assets."""
251
251
  return (self.vehicles / self.total_assets * 100) if self.total_assets > 0 else 0.0
252
252
 
253
- @computed_field # type: ignore[misc]
253
+ @computed_field
254
254
  @property
255
255
  def other_percentage(self) -> float:
256
256
  """Other assets as percentage of total assets."""
@@ -288,7 +288,7 @@ class LiabilityBreakdown(BaseModel):
288
288
  personal_loans: float = Field(0.0, ge=0, description="Personal loan balance")
289
289
  lines_of_credit: float = Field(0.0, ge=0, description="Line of credit balance")
290
290
 
291
- @computed_field # type: ignore[misc]
291
+ @computed_field
292
292
  @property
293
293
  def total_liabilities(self) -> float:
294
294
  """Sum of all liability categories."""
@@ -301,7 +301,7 @@ class LiabilityBreakdown(BaseModel):
301
301
  + self.lines_of_credit
302
302
  )
303
303
 
304
- @computed_field # type: ignore[misc]
304
+ @computed_field
305
305
  @property
306
306
  def credit_cards_percentage(self) -> float:
307
307
  """Credit cards as percentage of total liabilities."""
@@ -311,7 +311,7 @@ class LiabilityBreakdown(BaseModel):
311
311
  else 0.0
312
312
  )
313
313
 
314
- @computed_field # type: ignore[misc]
314
+ @computed_field
315
315
  @property
316
316
  def mortgages_percentage(self) -> float:
317
317
  """Mortgages as percentage of total liabilities."""
@@ -319,7 +319,7 @@ class LiabilityBreakdown(BaseModel):
319
319
  (self.mortgages / self.total_liabilities * 100) if self.total_liabilities > 0 else 0.0
320
320
  )
321
321
 
322
- @computed_field # type: ignore[misc]
322
+ @computed_field
323
323
  @property
324
324
  def auto_loans_percentage(self) -> float:
325
325
  """Auto loans as percentage of total liabilities."""
@@ -327,7 +327,7 @@ class LiabilityBreakdown(BaseModel):
327
327
  (self.auto_loans / self.total_liabilities * 100) if self.total_liabilities > 0 else 0.0
328
328
  )
329
329
 
330
- @computed_field # type: ignore[misc]
330
+ @computed_field
331
331
  @property
332
332
  def student_loans_percentage(self) -> float:
333
333
  """Student loans as percentage of total liabilities."""
@@ -337,7 +337,7 @@ class LiabilityBreakdown(BaseModel):
337
337
  else 0.0
338
338
  )
339
339
 
340
- @computed_field # type: ignore[misc]
340
+ @computed_field
341
341
  @property
342
342
  def personal_loans_percentage(self) -> float:
343
343
  """Personal loans as percentage of total liabilities."""
@@ -347,7 +347,7 @@ class LiabilityBreakdown(BaseModel):
347
347
  else 0.0
348
348
  )
349
349
 
350
- @computed_field # type: ignore[misc]
350
+ @computed_field
351
351
  @property
352
352
  def lines_of_credit_percentage(self) -> float:
353
353
  """Lines of credit as percentage of total liabilities."""
@@ -37,6 +37,8 @@ Usage:
37
37
 
38
38
  from __future__ import annotations
39
39
 
40
+ from typing import Callable
41
+
40
42
  # Financial capability prefix patterns (extensible)
41
43
  FINANCIAL_ROUTE_PREFIXES = (
42
44
  "/banking",
@@ -110,9 +112,9 @@ def financial_route_classifier(route_path: str, method: str) -> str:
110
112
 
111
113
 
112
114
  def compose_classifiers(
113
- *classifiers: callable,
115
+ *classifiers: Callable[[str], str],
114
116
  default: str = "public",
115
- ) -> callable:
117
+ ) -> Callable[[str], str]:
116
118
  """
117
119
  Compose multiple route classifiers with fallback logic.
118
120
 
@@ -15,7 +15,7 @@ try:
15
15
  ALPACA_AVAILABLE = True
16
16
  except ImportError:
17
17
  ALPACA_AVAILABLE = False
18
- REST = None # type: ignore
18
+ REST = None
19
19
 
20
20
  from ..base import BrokerageProvider
21
21
 
@@ -22,7 +22,7 @@ from pydantic import BaseModel, ConfigDict, Field
22
22
  try:
23
23
  from ai_infra.llm import LLM
24
24
  except ImportError:
25
- LLM = None # type: ignore
25
+ LLM = None
26
26
 
27
27
  logger = logging.getLogger(__name__)
28
28
 
@@ -23,7 +23,7 @@ from pydantic import BaseModel, ConfigDict, Field
23
23
  try:
24
24
  from ai_infra.llm import LLM
25
25
  except ImportError:
26
- LLM = None # type: ignore
26
+ LLM = None
27
27
 
28
28
  logger = logging.getLogger(__name__)
29
29
 
@@ -24,7 +24,7 @@ from pydantic import BaseModel, ConfigDict, Field
24
24
  try:
25
25
  from ai_infra.llm import LLM
26
26
  except ImportError:
27
- LLM = None # type: ignore
27
+ LLM = None
28
28
 
29
29
  logger = logging.getLogger(__name__)
30
30
 
@@ -10,12 +10,16 @@ from typing import Optional
10
10
  from sqlalchemy import Column, DateTime, String, Text, select, update
11
11
  from sqlalchemy.dialects.postgresql import UUID
12
12
  from sqlalchemy.ext.asyncio import AsyncSession
13
- from sqlalchemy.orm import declarative_base
13
+ from sqlalchemy.orm import DeclarativeBase
14
14
 
15
15
  from .encryption import ProviderTokenEncryption
16
16
  from .models import ProviderTokenMetadata
17
17
 
18
- Base = declarative_base()
18
+
19
+ class Base(DeclarativeBase):
20
+ """Declarative base for provider token models."""
21
+
22
+ pass
19
23
 
20
24
 
21
25
  class ProviderToken(Base):
@@ -321,7 +321,7 @@ def add_tax_data(
321
321
  # broker = easy_brokerage(mode="paper")
322
322
  # positions = broker.positions() # Should accept user_id parameter
323
323
  # For now, return empty list (integration test will mock this)
324
- positions: list = [] # type: ignore
324
+ positions: list = []
325
325
 
326
326
  # TODO: Get recent trades for wash sale checking
327
327
  recent_trades = None
@@ -28,7 +28,7 @@ async def retry_async(
28
28
  for i in range(attempts):
29
29
  try:
30
30
  return await func()
31
- except tuple(retry_on) as exc: # type: ignore[misc]
31
+ except tuple(retry_on) as exc:
32
32
  last_exc = exc
33
33
  if i == attempts - 1:
34
34
  break
File without changes
File without changes