fin-infra 0.7.0__tar.gz → 0.8.0__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.7.0 → fin_infra-0.8.0}/PKG-INFO +1 -1
- {fin_infra-0.7.0 → fin_infra-0.8.0}/pyproject.toml +1 -1
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/banking/__init__.py +4 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/providers/banking/teller_client.py +43 -8
- {fin_infra-0.7.0 → fin_infra-0.8.0}/LICENSE +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/README.md +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/__init__.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/__main__.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/analytics/__init__.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/analytics/add.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/analytics/benchmark.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/analytics/cash_flow.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/analytics/ease.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/analytics/models.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/analytics/portfolio.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/analytics/projections.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/analytics/rebalancing.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/analytics/rebalancing_llm.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/analytics/savings.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/analytics/scenarios.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/analytics/spending.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/banking/history.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/banking/utils.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/brokerage/__init__.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/budgets/__init__.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/budgets/add.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/budgets/alerts.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/budgets/ease.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/budgets/models.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/budgets/scaffold_templates/README.md +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/budgets/scaffold_templates/__init__.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/budgets/scaffold_templates/models.py.tmpl +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/budgets/scaffold_templates/repository.py.tmpl +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/budgets/scaffold_templates/schemas.py.tmpl +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/budgets/templates.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/budgets/tracker.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/cashflows/__init__.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/cashflows/core.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/categorization/__init__.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/categorization/add.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/categorization/ease.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/categorization/engine.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/categorization/llm_layer.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/categorization/models.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/categorization/rules.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/categorization/taxonomy.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/chat/__init__.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/chat/ease.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/chat/planning.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/cli/__init__.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/cli/cmds/__init__.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/cli/cmds/scaffold_cmds.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/clients/__init__.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/clients/base.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/clients/plaid.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/compliance/__init__.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/credit/__init__.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/credit/add.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/credit/experian/__init__.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/credit/experian/auth.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/credit/experian/client.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/credit/experian/parser.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/credit/experian/provider.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/credit/mock.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/crypto/__init__.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/crypto/insights.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/documents/__init__.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/documents/add.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/documents/analysis.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/documents/ease.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/documents/models.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/documents/ocr.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/documents/storage.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/exceptions.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/goals/__init__.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/goals/add.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/goals/funding.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/goals/management.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/goals/milestones.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/goals/models.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/goals/scaffold_templates/README.md +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/goals/scaffold_templates/__init__.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/goals/scaffold_templates/models.py.tmpl +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/goals/scaffold_templates/repository.py.tmpl +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/goals/scaffold_templates/schemas.py.tmpl +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/insights/__init__.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/insights/aggregator.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/insights/models.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/investments/__init__.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/investments/add.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/investments/ease.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/investments/models.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/investments/providers/__init__.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/investments/providers/base.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/investments/providers/plaid.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/investments/providers/snaptrade.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/investments/scaffold_templates/README.md +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/investments/scaffold_templates/__init__.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/investments/scaffold_templates/models.py.tmpl +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/investments/scaffold_templates/repository.py.tmpl +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/investments/scaffold_templates/schemas.py.tmpl +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/markets/__init__.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/models/__init__.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/models/accounts.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/models/brokerage.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/models/candle.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/models/credit.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/models/money.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/models/quotes.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/models/tax.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/models/transactions.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/net_worth/__init__.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/net_worth/add.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/net_worth/aggregator.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/net_worth/calculator.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/net_worth/ease.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/net_worth/goals.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/net_worth/insights.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/net_worth/models.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/net_worth/scaffold_templates/README.md +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/net_worth/scaffold_templates/__init__.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/net_worth/scaffold_templates/models.py.tmpl +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/net_worth/scaffold_templates/repository.py.tmpl +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/net_worth/scaffold_templates/schemas.py.tmpl +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/normalization/__init__.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/normalization/currency_converter.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/normalization/models.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/normalization/providers/__init__.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/normalization/providers/exchangerate.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/normalization/providers/static_mappings.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/normalization/symbol_resolver.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/obs/__init__.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/obs/classifier.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/providers/__init__.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/providers/banking/base.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/providers/banking/plaid_client.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/providers/base.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/providers/brokerage/alpaca.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/providers/brokerage/base.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/providers/credit/experian.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/providers/identity/stripe_identity.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/providers/market/alphavantage.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/providers/market/base.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/providers/market/ccxt_crypto.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/providers/market/coingecko.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/providers/market/yahoo.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/providers/registry.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/providers/tax/__init__.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/providers/tax/irs.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/providers/tax/mock.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/providers/tax/taxbit.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/py.typed +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/recurring/__init__.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/recurring/add.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/recurring/detector.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/recurring/detectors_llm.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/recurring/ease.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/recurring/insights.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/recurring/models.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/recurring/normalizer.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/recurring/normalizers.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/recurring/summary.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/scaffold/__init__.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/scaffold/budgets.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/scaffold/goals.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/security/__init__.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/security/add.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/security/audit.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/security/encryption.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/security/models.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/security/pii_filter.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/security/pii_patterns.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/security/token_store.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/settings.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/tax/__init__.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/tax/add.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/tax/tlh.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/utils/__init__.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/utils/deprecation.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/utils/http.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/utils/retry.py +0 -0
- {fin_infra-0.7.0 → fin_infra-0.8.0}/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.
|
|
3
|
+
Version: 0.8.0
|
|
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.
|
|
3
|
+
version = "0.8.0"
|
|
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"
|
|
@@ -28,6 +28,8 @@ Environment Variables:
|
|
|
28
28
|
Teller:
|
|
29
29
|
TELLER_CERTIFICATE_PATH: Path to certificate.pem file
|
|
30
30
|
TELLER_PRIVATE_KEY_PATH: Path to private_key.pem file
|
|
31
|
+
TELLER_CERTIFICATE: Inline certificate PEM content (alternative to path)
|
|
32
|
+
TELLER_PRIVATE_KEY: Inline private key PEM content (alternative to path)
|
|
31
33
|
TELLER_ENVIRONMENT: "sandbox" or "production" (default: sandbox)
|
|
32
34
|
|
|
33
35
|
Plaid:
|
|
@@ -191,6 +193,8 @@ def easy_banking(provider: str = "teller", **config) -> BankingProvider:
|
|
|
191
193
|
config = {
|
|
192
194
|
"cert_path": os.getenv("TELLER_CERTIFICATE_PATH"),
|
|
193
195
|
"key_path": os.getenv("TELLER_PRIVATE_KEY_PATH"),
|
|
196
|
+
"cert_content": os.getenv("TELLER_CERTIFICATE"),
|
|
197
|
+
"key_content": os.getenv("TELLER_PRIVATE_KEY"),
|
|
194
198
|
"environment": os.getenv("TELLER_ENVIRONMENT", "sandbox"),
|
|
195
199
|
}
|
|
196
200
|
elif provider == "plaid":
|
|
@@ -52,25 +52,42 @@ class TellerClient(BankingProvider):
|
|
|
52
52
|
self,
|
|
53
53
|
cert_path: str | None = None,
|
|
54
54
|
key_path: str | None = None,
|
|
55
|
+
cert_content: str | None = None,
|
|
56
|
+
key_content: str | None = None,
|
|
55
57
|
environment: str = "sandbox",
|
|
56
58
|
timeout: float = 30.0,
|
|
57
59
|
) -> None:
|
|
58
60
|
"""Initialize TellerClient banking provider.
|
|
59
61
|
|
|
60
62
|
Args:
|
|
61
|
-
cert_path: Path to certificate.pem file
|
|
62
|
-
key_path: Path to private_key.pem file
|
|
63
|
+
cert_path: Path to certificate.pem file
|
|
64
|
+
key_path: Path to private_key.pem file
|
|
65
|
+
cert_content: Inline certificate PEM content (alternative to cert_path)
|
|
66
|
+
key_content: Inline private key PEM content (alternative to key_path)
|
|
63
67
|
environment: "sandbox" or "production" (default: sandbox)
|
|
64
68
|
timeout: HTTP request timeout in seconds (default: 30.0)
|
|
65
69
|
|
|
70
|
+
Note:
|
|
71
|
+
Either (cert_path, key_path) or (cert_content, key_content) must be provided
|
|
72
|
+
for production. The inline content options are useful for Railway/Vercel
|
|
73
|
+
where env vars are preferred over mounted files.
|
|
74
|
+
|
|
66
75
|
Raises:
|
|
67
|
-
ValueError: If cert/key
|
|
76
|
+
ValueError: If cert/key are missing in production environment
|
|
68
77
|
"""
|
|
69
|
-
|
|
70
|
-
|
|
78
|
+
has_file_creds = cert_path and key_path
|
|
79
|
+
has_inline_creds = cert_content and key_content
|
|
80
|
+
|
|
81
|
+
if environment == "production" and not (has_file_creds or has_inline_creds):
|
|
82
|
+
raise ValueError(
|
|
83
|
+
"Either (cert_path, key_path) or (cert_content, key_content) "
|
|
84
|
+
"are required for production environment"
|
|
85
|
+
)
|
|
71
86
|
|
|
72
87
|
self.cert_path = cert_path
|
|
73
88
|
self.key_path = key_path
|
|
89
|
+
self.cert_content = cert_content
|
|
90
|
+
self.key_content = key_content
|
|
74
91
|
self.environment = environment
|
|
75
92
|
self.timeout = timeout
|
|
76
93
|
|
|
@@ -81,18 +98,36 @@ class TellerClient(BankingProvider):
|
|
|
81
98
|
self.base_url = "https://api.teller.io"
|
|
82
99
|
|
|
83
100
|
# Create HTTP client with mTLS certificate authentication
|
|
84
|
-
client_kwargs = {
|
|
101
|
+
client_kwargs: dict = {
|
|
85
102
|
"base_url": self.base_url,
|
|
86
103
|
"timeout": timeout,
|
|
87
104
|
"headers": {"User-Agent": "fin-infra/1.0"},
|
|
88
105
|
}
|
|
89
106
|
|
|
90
107
|
# Add certificate using SSL context (recommended approach, not deprecated)
|
|
91
|
-
if
|
|
92
|
-
#
|
|
108
|
+
if has_file_creds:
|
|
109
|
+
# Use file paths directly (assertions for type narrowing)
|
|
110
|
+
assert cert_path is not None
|
|
111
|
+
assert key_path is not None
|
|
93
112
|
ssl_context = ssl.create_default_context()
|
|
94
113
|
ssl_context.load_cert_chain(certfile=cert_path, keyfile=key_path)
|
|
95
114
|
client_kwargs["verify"] = ssl_context
|
|
115
|
+
elif has_inline_creds:
|
|
116
|
+
# Write inline content to temp files for SSL context (assertions for type narrowing)
|
|
117
|
+
assert cert_content is not None
|
|
118
|
+
assert key_content is not None
|
|
119
|
+
import tempfile
|
|
120
|
+
|
|
121
|
+
self._cert_file = tempfile.NamedTemporaryFile(mode="w", suffix=".pem", delete=False)
|
|
122
|
+
self._key_file = tempfile.NamedTemporaryFile(mode="w", suffix=".pem", delete=False)
|
|
123
|
+
self._cert_file.write(cert_content)
|
|
124
|
+
self._key_file.write(key_content)
|
|
125
|
+
self._cert_file.close()
|
|
126
|
+
self._key_file.close()
|
|
127
|
+
|
|
128
|
+
ssl_context = ssl.create_default_context()
|
|
129
|
+
ssl_context.load_cert_chain(certfile=self._cert_file.name, keyfile=self._key_file.name)
|
|
130
|
+
client_kwargs["verify"] = ssl_context
|
|
96
131
|
|
|
97
132
|
# Create client with explicit parameters to satisfy type checker
|
|
98
133
|
self.client = httpx.Client(
|
|
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.7.0 → fin_infra-0.8.0}/src/fin_infra/budgets/scaffold_templates/repository.py.tmpl
RENAMED
|
File without changes
|
{fin_infra-0.7.0 → fin_infra-0.8.0}/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
|
|
File without changes
|
{fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/goals/scaffold_templates/repository.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
|
{fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/investments/scaffold_templates/__init__.py
RENAMED
|
File without changes
|
{fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/investments/scaffold_templates/models.py.tmpl
RENAMED
|
File without changes
|
{fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/investments/scaffold_templates/repository.py.tmpl
RENAMED
|
File without changes
|
{fin_infra-0.7.0 → fin_infra-0.8.0}/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
|
|
File without changes
|
|
File without changes
|
{fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/net_worth/scaffold_templates/models.py.tmpl
RENAMED
|
File without changes
|
{fin_infra-0.7.0 → fin_infra-0.8.0}/src/fin_infra/net_worth/scaffold_templates/repository.py.tmpl
RENAMED
|
File without changes
|
{fin_infra-0.7.0 → fin_infra-0.8.0}/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.7.0 → fin_infra-0.8.0}/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
|
|
File without changes
|