fin-infra 0.1.79__tar.gz → 0.1.80__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.
- {fin_infra-0.1.79 → fin_infra-0.1.80}/PKG-INFO +1 -1
- {fin_infra-0.1.79 → fin_infra-0.1.80}/pyproject.toml +5 -1
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/analytics/__init__.py +10 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/banking/__init__.py +0 -1
- fin_infra-0.1.80/src/fin_infra/clients/__init__.py +25 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/markets/__init__.py +4 -2
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/net_worth/__init__.py +7 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/providers/base.py +25 -1
- fin_infra-0.1.79/src/fin_infra/clients/__init__.py +0 -3
- {fin_infra-0.1.79 → fin_infra-0.1.80}/LICENSE +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/README.md +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/__init__.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/__main__.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/analytics/add.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/analytics/cash_flow.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/analytics/ease.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/analytics/models.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/analytics/portfolio.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/analytics/projections.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/analytics/rebalancing.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/analytics/savings.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/analytics/scenarios.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/analytics/spending.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/banking/history.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/banking/utils.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/brokerage/__init__.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/budgets/__init__.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/budgets/add.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/budgets/alerts.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/budgets/ease.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/budgets/models.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/budgets/scaffold_templates/README.md +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/budgets/scaffold_templates/__init__.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/budgets/scaffold_templates/models.py.tmpl +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/budgets/scaffold_templates/repository.py.tmpl +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/budgets/scaffold_templates/schemas.py.tmpl +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/budgets/templates.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/budgets/tracker.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/cashflows/__init__.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/cashflows/core.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/categorization/__init__.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/categorization/add.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/categorization/ease.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/categorization/engine.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/categorization/llm_layer.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/categorization/models.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/categorization/rules.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/categorization/taxonomy.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/chat/__init__.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/chat/ease.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/chat/planning.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/cli/__init__.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/cli/cmds/__init__.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/cli/cmds/scaffold_cmds.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/clients/base.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/clients/plaid.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/compliance/__init__.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/credit/__init__.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/credit/add.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/credit/experian/__init__.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/credit/experian/auth.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/credit/experian/client.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/credit/experian/parser.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/credit/experian/provider.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/credit/mock.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/crypto/__init__.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/crypto/insights.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/documents/__init__.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/documents/add.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/documents/analysis.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/documents/ease.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/documents/models.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/documents/ocr.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/documents/storage.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/exceptions.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/goals/__init__.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/goals/add.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/goals/funding.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/goals/management.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/goals/milestones.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/goals/models.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/goals/scaffold_templates/README.md +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/goals/scaffold_templates/__init__.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/goals/scaffold_templates/models.py.tmpl +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/goals/scaffold_templates/repository.py.tmpl +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/goals/scaffold_templates/schemas.py.tmpl +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/insights/__init__.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/insights/aggregator.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/insights/models.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/investments/__init__.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/investments/add.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/investments/ease.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/investments/models.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/investments/providers/__init__.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/investments/providers/base.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/investments/providers/plaid.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/investments/providers/snaptrade.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/investments/scaffold_templates/README.md +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/investments/scaffold_templates/__init__.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/investments/scaffold_templates/models.py.tmpl +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/investments/scaffold_templates/repository.py.tmpl +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/investments/scaffold_templates/schemas.py.tmpl +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/models/__init__.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/models/accounts.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/models/brokerage.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/models/candle.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/models/credit.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/models/money.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/models/quotes.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/models/tax.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/models/transactions.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/net_worth/add.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/net_worth/aggregator.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/net_worth/calculator.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/net_worth/ease.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/net_worth/goals.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/net_worth/insights.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/net_worth/models.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/net_worth/scaffold_templates/README.md +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/net_worth/scaffold_templates/__init__.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/net_worth/scaffold_templates/models.py.tmpl +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/net_worth/scaffold_templates/repository.py.tmpl +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/net_worth/scaffold_templates/schemas.py.tmpl +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/normalization/__init__.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/normalization/currency_converter.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/normalization/models.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/normalization/providers/__init__.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/normalization/providers/exchangerate.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/normalization/providers/static_mappings.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/normalization/symbol_resolver.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/obs/__init__.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/obs/classifier.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/providers/__init__.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/providers/banking/base.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/providers/banking/plaid_client.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/providers/banking/teller_client.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/providers/brokerage/alpaca.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/providers/brokerage/base.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/providers/credit/experian.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/providers/identity/stripe_identity.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/providers/market/alphavantage.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/providers/market/base.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/providers/market/ccxt_crypto.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/providers/market/coingecko.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/providers/market/yahoo.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/providers/registry.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/providers/tax/__init__.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/providers/tax/irs.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/providers/tax/mock.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/providers/tax/taxbit.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/py.typed +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/recurring/__init__.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/recurring/add.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/recurring/detector.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/recurring/detectors_llm.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/recurring/ease.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/recurring/insights.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/recurring/models.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/recurring/normalizer.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/recurring/normalizers.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/recurring/summary.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/scaffold/__init__.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/scaffold/budgets.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/scaffold/goals.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/security/__init__.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/security/add.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/security/audit.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/security/encryption.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/security/models.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/security/pii_filter.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/security/pii_patterns.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/security/token_store.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/settings.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/tax/__init__.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/tax/add.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/tax/tlh.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/utils/__init__.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/utils/http.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/utils/retry.py +0 -0
- {fin_infra-0.1.79 → fin_infra-0.1.80}/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.
|
|
3
|
+
Version: 0.1.80
|
|
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.
|
|
3
|
+
version = "0.1.80"
|
|
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"
|
|
@@ -81,6 +81,10 @@ pre-commit = ">=3.0.0"
|
|
|
81
81
|
types-requests = ">=2.31.0"
|
|
82
82
|
pytest-cov = ">=4.0.0"
|
|
83
83
|
aiosqlite = ">=0.20.0"
|
|
84
|
+
# Documentation
|
|
85
|
+
mkdocs = ">=1.6.0"
|
|
86
|
+
mkdocs-material = ">=9.5.0"
|
|
87
|
+
mkdocstrings = {extras = ["python"], version = ">=0.25.0"}
|
|
84
88
|
|
|
85
89
|
[tool.pytest.ini_options]
|
|
86
90
|
testpaths = ["tests"]
|
|
@@ -7,6 +7,16 @@ This module provides comprehensive financial analytics capabilities including:
|
|
|
7
7
|
- Portfolio analytics (returns, allocation, benchmarking)
|
|
8
8
|
- Growth projections (net worth forecasting with scenarios)
|
|
9
9
|
|
|
10
|
+
Feature Status:
|
|
11
|
+
✅ STABLE: Core calculation functions (all analytics work with provided data)
|
|
12
|
+
⚠️ INTEGRATION: Auto-fetching from providers requires setup:
|
|
13
|
+
- Banking provider for transaction data
|
|
14
|
+
- Brokerage provider for investment data
|
|
15
|
+
- Categorization for expense categorization
|
|
16
|
+
|
|
17
|
+
When providers aren't configured, functions accept data directly or return
|
|
18
|
+
sensible placeholder values for testing/development.
|
|
19
|
+
|
|
10
20
|
Serves multiple use cases:
|
|
11
21
|
- Personal finance apps (cash flow, savings tracking)
|
|
12
22
|
- Wealth management platforms (portfolio analytics, projections)
|
|
@@ -174,7 +174,6 @@ def easy_banking(provider: str = "teller", **config) -> BankingProvider:
|
|
|
174
174
|
See Also:
|
|
175
175
|
- add_banking(): For FastAPI integration with routes
|
|
176
176
|
- docs/banking.md: Comprehensive banking integration guide
|
|
177
|
-
- docs/adr/0003-banking-integration.md: Architecture decisions
|
|
178
177
|
"""
|
|
179
178
|
# Auto-detect provider config from environment if not explicitly provided
|
|
180
179
|
# Only auto-detect if no config params were passed
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"""DEPRECATED: Use fin_infra.providers instead.
|
|
2
|
+
|
|
3
|
+
This module is deprecated and will be removed in a future version.
|
|
4
|
+
All ABCs have been consolidated into fin_infra.providers.base.
|
|
5
|
+
|
|
6
|
+
Migration:
|
|
7
|
+
# Old (deprecated)
|
|
8
|
+
from fin_infra.clients import BankingClient, MarketDataClient
|
|
9
|
+
|
|
10
|
+
# New
|
|
11
|
+
from fin_infra.providers.base import BankingProvider, MarketDataProvider
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
import warnings
|
|
15
|
+
|
|
16
|
+
from .base import BankingClient, CreditClient, MarketDataClient
|
|
17
|
+
|
|
18
|
+
warnings.warn(
|
|
19
|
+
"fin_infra.clients is deprecated. Use fin_infra.providers instead. "
|
|
20
|
+
"This module will be removed in a future version.",
|
|
21
|
+
DeprecationWarning,
|
|
22
|
+
stacklevel=2,
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
__all__ = ["BankingClient", "MarketDataClient", "CreditClient"]
|
|
@@ -20,7 +20,10 @@ if TYPE_CHECKING:
|
|
|
20
20
|
from fastapi import FastAPI
|
|
21
21
|
|
|
22
22
|
from ..providers.base import MarketDataProvider
|
|
23
|
-
|
|
23
|
+
|
|
24
|
+
# Deprecated: MarketDataClient alias for backward compatibility
|
|
25
|
+
# Use MarketDataProvider instead
|
|
26
|
+
MarketDataClient = MarketDataProvider # type: ignore[misc]
|
|
24
27
|
|
|
25
28
|
|
|
26
29
|
def easy_market(
|
|
@@ -178,7 +181,6 @@ def add_market_data(
|
|
|
178
181
|
See Also:
|
|
179
182
|
- easy_market(): For standalone provider usage without FastAPI
|
|
180
183
|
- docs/market-data.md: API documentation and examples
|
|
181
|
-
- docs/adr/0004-market-data-integration.md: Architecture decisions
|
|
182
184
|
"""
|
|
183
185
|
from fastapi import HTTPException, Query
|
|
184
186
|
|
|
@@ -4,6 +4,13 @@ Net Worth Tracking Module
|
|
|
4
4
|
Calculates net worth by aggregating balances from multiple financial providers
|
|
5
5
|
(banking, brokerage, crypto) with historical snapshots and change detection.
|
|
6
6
|
|
|
7
|
+
**Feature Status**:
|
|
8
|
+
✅ STABLE: Core calculation (works with provided data)
|
|
9
|
+
✅ STABLE: Banking integration (Plaid, Teller)
|
|
10
|
+
⚠️ INTEGRATION: Brokerage integration (requires provider setup)
|
|
11
|
+
⚠️ INTEGRATION: Crypto integration (requires provider setup)
|
|
12
|
+
⚠️ INTEGRATION: Currency conversion (pass exchange_rate manually)
|
|
13
|
+
|
|
7
14
|
**Key Features**:
|
|
8
15
|
- Multi-provider aggregation (banking + brokerage + crypto)
|
|
9
16
|
- Currency normalization (all currencies → USD)
|
|
@@ -1,9 +1,33 @@
|
|
|
1
|
+
"""Base provider ABCs for fin-infra.
|
|
2
|
+
|
|
3
|
+
This module defines abstract base classes for all financial data providers.
|
|
4
|
+
These are the canonical ABCs - use these instead of fin_infra.clients.
|
|
5
|
+
|
|
6
|
+
Sync vs Async Pattern:
|
|
7
|
+
Most providers use SYNCHRONOUS methods for simplicity. The exceptions are:
|
|
8
|
+
- InvestmentProvider: Uses async methods (get_holdings, get_investment_accounts)
|
|
9
|
+
|
|
10
|
+
If you need async, wrap sync providers with asyncio.to_thread():
|
|
11
|
+
import asyncio
|
|
12
|
+
result = await asyncio.to_thread(provider.quote, "AAPL")
|
|
13
|
+
|
|
14
|
+
Provider Categories:
|
|
15
|
+
- MarketDataProvider: Stock/equity quotes and historical data
|
|
16
|
+
- CryptoDataProvider: Cryptocurrency market data
|
|
17
|
+
- BankingProvider: Bank account aggregation (Plaid, Teller, MX)
|
|
18
|
+
- BrokerageProvider: Trading operations (Alpaca, Interactive Brokers)
|
|
19
|
+
- CreditProvider: Credit scores and reports
|
|
20
|
+
- TaxProvider: Tax documents and calculations
|
|
21
|
+
- IdentityProvider: Identity verification
|
|
22
|
+
- InvestmentProvider: Investment holdings (async)
|
|
23
|
+
"""
|
|
24
|
+
|
|
1
25
|
from __future__ import annotations
|
|
2
26
|
|
|
3
27
|
from abc import ABC, abstractmethod
|
|
4
28
|
from typing import Any, Iterable, Sequence
|
|
5
29
|
|
|
6
|
-
from ..models import
|
|
30
|
+
from ..models import Candle, Quote
|
|
7
31
|
|
|
8
32
|
|
|
9
33
|
class MarketDataProvider(ABC):
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/budgets/scaffold_templates/models.py.tmpl
RENAMED
|
File without changes
|
{fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/budgets/scaffold_templates/repository.py.tmpl
RENAMED
|
File without changes
|
{fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/budgets/scaffold_templates/schemas.py.tmpl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/goals/scaffold_templates/repository.py.tmpl
RENAMED
|
File without changes
|
{fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/goals/scaffold_templates/schemas.py.tmpl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/investments/scaffold_templates/README.md
RENAMED
|
File without changes
|
{fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/investments/scaffold_templates/__init__.py
RENAMED
|
File without changes
|
{fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/investments/scaffold_templates/models.py.tmpl
RENAMED
|
File without changes
|
|
File without changes
|
{fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/investments/scaffold_templates/schemas.py.tmpl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/net_worth/scaffold_templates/__init__.py
RENAMED
|
File without changes
|
{fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/net_worth/scaffold_templates/models.py.tmpl
RENAMED
|
File without changes
|
{fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/net_worth/scaffold_templates/repository.py.tmpl
RENAMED
|
File without changes
|
{fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/net_worth/scaffold_templates/schemas.py.tmpl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fin_infra-0.1.79 → fin_infra-0.1.80}/src/fin_infra/normalization/providers/static_mappings.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|