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