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.
- {fin_infra-0.1.61 → fin_infra-0.1.62}/PKG-INFO +1 -1
- {fin_infra-0.1.61 → fin_infra-0.1.62}/pyproject.toml +1 -1
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/budgets/__init__.py +4 -4
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/crypto/insights.py +1 -1
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/investments/models.py +6 -6
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/net_worth/models.py +14 -14
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/obs/classifier.py +4 -2
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/providers/brokerage/alpaca.py +1 -1
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/recurring/detectors_llm.py +1 -1
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/recurring/insights.py +1 -1
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/recurring/normalizers.py +1 -1
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/security/token_store.py +6 -2
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/tax/add.py +1 -1
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/utils/retry.py +1 -1
- {fin_infra-0.1.61 → fin_infra-0.1.62}/LICENSE +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/README.md +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/__init__.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/__main__.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/analytics/__init__.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/analytics/add.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/analytics/cash_flow.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/analytics/ease.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/analytics/models.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/analytics/portfolio.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/analytics/projections.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/analytics/rebalancing.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/analytics/savings.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/analytics/scenarios.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/analytics/spending.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/banking/__init__.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/banking/history.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/banking/utils.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/brokerage/__init__.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/budgets/add.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/budgets/alerts.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/budgets/ease.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/budgets/models.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/budgets/scaffold_templates/README.md +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/budgets/scaffold_templates/__init__.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/budgets/scaffold_templates/models.py.tmpl +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/budgets/scaffold_templates/repository.py.tmpl +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/budgets/scaffold_templates/schemas.py.tmpl +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/budgets/templates.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/budgets/tracker.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/cashflows/__init__.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/cashflows/core.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/categorization/__init__.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/categorization/add.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/categorization/ease.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/categorization/engine.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/categorization/llm_layer.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/categorization/models.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/categorization/rules.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/categorization/taxonomy.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/chat/__init__.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/chat/ease.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/chat/planning.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/cli/__init__.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/cli/cmds/__init__.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/cli/cmds/scaffold_cmds.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/clients/__init__.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/clients/base.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/clients/plaid.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/compliance/__init__.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/credit/__init__.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/credit/add.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/credit/experian/__init__.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/credit/experian/auth.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/credit/experian/client.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/credit/experian/parser.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/credit/experian/provider.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/credit/mock.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/crypto/__init__.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/documents/__init__.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/documents/add.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/documents/analysis.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/documents/ease.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/documents/models.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/documents/ocr.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/documents/storage.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/exceptions.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/goals/__init__.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/goals/add.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/goals/funding.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/goals/management.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/goals/milestones.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/goals/models.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/goals/scaffold_templates/README.md +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/goals/scaffold_templates/__init__.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/goals/scaffold_templates/models.py.tmpl +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/goals/scaffold_templates/repository.py.tmpl +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/goals/scaffold_templates/schemas.py.tmpl +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/insights/__init__.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/insights/aggregator.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/insights/models.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/investments/__init__.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/investments/add.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/investments/ease.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/investments/providers/__init__.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/investments/providers/base.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/investments/providers/plaid.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/investments/providers/snaptrade.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/investments/scaffold_templates/README.md +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/investments/scaffold_templates/__init__.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/investments/scaffold_templates/models.py.tmpl +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/investments/scaffold_templates/repository.py.tmpl +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/investments/scaffold_templates/schemas.py.tmpl +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/markets/__init__.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/models/__init__.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/models/accounts.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/models/brokerage.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/models/candle.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/models/credit.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/models/money.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/models/quotes.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/models/tax.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/models/transactions.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/net_worth/__init__.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/net_worth/add.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/net_worth/aggregator.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/net_worth/calculator.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/net_worth/ease.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/net_worth/goals.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/net_worth/insights.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/net_worth/scaffold_templates/README.md +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/net_worth/scaffold_templates/__init__.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/net_worth/scaffold_templates/models.py.tmpl +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/net_worth/scaffold_templates/repository.py.tmpl +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/net_worth/scaffold_templates/schemas.py.tmpl +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/normalization/__init__.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/normalization/currency_converter.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/normalization/models.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/normalization/providers/__init__.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/normalization/providers/exchangerate.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/normalization/providers/static_mappings.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/normalization/symbol_resolver.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/obs/__init__.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/providers/__init__.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/providers/banking/base.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/providers/banking/plaid_client.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/providers/banking/teller_client.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/providers/base.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/providers/brokerage/base.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/providers/credit/experian.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/providers/identity/stripe_identity.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/providers/market/alphavantage.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/providers/market/base.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/providers/market/ccxt_crypto.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/providers/market/coingecko.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/providers/market/yahoo.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/providers/registry.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/providers/tax/__init__.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/providers/tax/irs.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/providers/tax/mock.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/providers/tax/taxbit.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/py.typed +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/recurring/__init__.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/recurring/add.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/recurring/detector.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/recurring/ease.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/recurring/models.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/recurring/normalizer.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/recurring/summary.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/scaffold/__init__.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/scaffold/budgets.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/scaffold/goals.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/security/__init__.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/security/add.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/security/audit.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/security/encryption.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/security/models.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/security/pii_filter.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/security/pii_patterns.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/settings.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/tax/__init__.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/tax/tlh.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/utils/__init__.py +0 -0
- {fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/utils/http.py +0 -0
- {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.
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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(
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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:
|
|
115
|
+
*classifiers: Callable[[str], str],
|
|
114
116
|
default: str = "public",
|
|
115
|
-
) ->
|
|
117
|
+
) -> Callable[[str], str]:
|
|
116
118
|
"""
|
|
117
119
|
Compose multiple route classifiers with fallback logic.
|
|
118
120
|
|
|
@@ -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
|
|
13
|
+
from sqlalchemy.orm import DeclarativeBase
|
|
14
14
|
|
|
15
15
|
from .encryption import ProviderTokenEncryption
|
|
16
16
|
from .models import ProviderTokenMetadata
|
|
17
17
|
|
|
18
|
-
|
|
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 = []
|
|
324
|
+
positions: list = []
|
|
325
325
|
|
|
326
326
|
# TODO: Get recent trades for wash sale checking
|
|
327
327
|
recent_trades = None
|
|
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.61 → fin_infra-0.1.62}/src/fin_infra/budgets/scaffold_templates/models.py.tmpl
RENAMED
|
File without changes
|
{fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/budgets/scaffold_templates/repository.py.tmpl
RENAMED
|
File without changes
|
{fin_infra-0.1.61 → fin_infra-0.1.62}/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.61 → fin_infra-0.1.62}/src/fin_infra/goals/scaffold_templates/repository.py.tmpl
RENAMED
|
File without changes
|
{fin_infra-0.1.61 → fin_infra-0.1.62}/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
|
{fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/investments/scaffold_templates/README.md
RENAMED
|
File without changes
|
{fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/investments/scaffold_templates/__init__.py
RENAMED
|
File without changes
|
{fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/investments/scaffold_templates/models.py.tmpl
RENAMED
|
File without changes
|
|
File without changes
|
{fin_infra-0.1.61 → fin_infra-0.1.62}/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
|
|
File without changes
|
{fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/net_worth/scaffold_templates/__init__.py
RENAMED
|
File without changes
|
{fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/net_worth/scaffold_templates/models.py.tmpl
RENAMED
|
File without changes
|
{fin_infra-0.1.61 → fin_infra-0.1.62}/src/fin_infra/net_worth/scaffold_templates/repository.py.tmpl
RENAMED
|
File without changes
|
{fin_infra-0.1.61 → fin_infra-0.1.62}/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.61 → fin_infra-0.1.62}/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
|