fin-infra 0.1.82__py3-none-any.whl → 0.4.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. fin_infra/analytics/__init__.py +2 -2
  2. fin_infra/analytics/add.py +3 -3
  3. fin_infra/analytics/cash_flow.py +3 -3
  4. fin_infra/analytics/models.py +5 -5
  5. fin_infra/analytics/portfolio.py +12 -12
  6. fin_infra/analytics/spending.py +4 -5
  7. fin_infra/banking/history.py +4 -4
  8. fin_infra/brokerage/__init__.py +7 -7
  9. fin_infra/budgets/alerts.py +2 -2
  10. fin_infra/budgets/ease.py +1 -2
  11. fin_infra/budgets/models.py +1 -2
  12. fin_infra/budgets/templates.py +4 -4
  13. fin_infra/budgets/tracker.py +3 -3
  14. fin_infra/categorization/__init__.py +1 -1
  15. fin_infra/categorization/ease.py +3 -3
  16. fin_infra/categorization/engine.py +1 -1
  17. fin_infra/categorization/llm_layer.py +6 -4
  18. fin_infra/categorization/models.py +3 -4
  19. fin_infra/chat/planning.py +1 -1
  20. fin_infra/cli/cmds/scaffold_cmds.py +6 -6
  21. fin_infra/credit/experian/parser.py +5 -5
  22. fin_infra/crypto/__init__.py +2 -2
  23. fin_infra/documents/models.py +2 -3
  24. fin_infra/goals/management.py +3 -3
  25. fin_infra/goals/milestones.py +6 -6
  26. fin_infra/goals/models.py +2 -2
  27. fin_infra/investments/__init__.py +2 -2
  28. fin_infra/investments/ease.py +2 -2
  29. fin_infra/investments/models.py +24 -26
  30. fin_infra/investments/providers/base.py +4 -4
  31. fin_infra/investments/scaffold_templates/README.md +17 -17
  32. fin_infra/markets/__init__.py +2 -2
  33. fin_infra/models/accounts.py +4 -5
  34. fin_infra/models/transactions.py +2 -2
  35. fin_infra/net_worth/__init__.py +6 -6
  36. fin_infra/net_worth/aggregator.py +1 -1
  37. fin_infra/net_worth/calculator.py +1 -1
  38. fin_infra/net_worth/insights.py +7 -7
  39. fin_infra/normalization/__init__.py +2 -2
  40. fin_infra/normalization/currency_converter.py +7 -8
  41. fin_infra/normalization/models.py +9 -10
  42. fin_infra/normalization/providers/static_mappings.py +1 -1
  43. fin_infra/normalization/symbol_resolver.py +3 -4
  44. fin_infra/obs/classifier.py +2 -2
  45. fin_infra/providers/brokerage/alpaca.py +1 -1
  46. fin_infra/recurring/add.py +1 -1
  47. fin_infra/recurring/detectors_llm.py +5 -5
  48. fin_infra/recurring/ease.py +4 -4
  49. fin_infra/recurring/insights.py +15 -14
  50. fin_infra/recurring/normalizer.py +6 -6
  51. fin_infra/recurring/normalizers.py +27 -26
  52. fin_infra/scaffold/goals.py +4 -4
  53. fin_infra/security/add.py +1 -2
  54. fin_infra/security/audit.py +6 -7
  55. fin_infra/security/pii_filter.py +10 -10
  56. fin_infra/security/token_store.py +2 -3
  57. fin_infra/tax/add.py +2 -2
  58. fin_infra/tax/tlh.py +5 -5
  59. fin_infra/utils/__init__.py +15 -1
  60. fin_infra/utils/deprecation.py +161 -0
  61. {fin_infra-0.1.82.dist-info → fin_infra-0.4.0.dist-info}/METADATA +17 -9
  62. {fin_infra-0.1.82.dist-info → fin_infra-0.4.0.dist-info}/RECORD +65 -64
  63. {fin_infra-0.1.82.dist-info → fin_infra-0.4.0.dist-info}/LICENSE +0 -0
  64. {fin_infra-0.1.82.dist-info → fin_infra-0.4.0.dist-info}/WHEEL +0 -0
  65. {fin_infra-0.1.82.dist-info → fin_infra-0.4.0.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,161 @@
1
+ """Deprecation utilities for fin-infra.
2
+
3
+ This module provides decorators and functions for marking features as deprecated,
4
+ following the deprecation policy defined in DEPRECATION.md.
5
+
6
+ Example:
7
+ >>> from fin_infra.utils.deprecation import deprecated
8
+ >>>
9
+ >>> @deprecated(
10
+ ... version="1.2.0",
11
+ ... reason="Use new_function() instead",
12
+ ... removal_version="1.4.0"
13
+ ... )
14
+ ... def old_function():
15
+ ... pass
16
+ """
17
+
18
+ from __future__ import annotations
19
+
20
+ import functools
21
+ import warnings
22
+ from collections.abc import Callable
23
+ from typing import Any, TypeVar
24
+
25
+ __all__ = [
26
+ "deprecated",
27
+ "deprecated_parameter",
28
+ "DeprecatedWarning",
29
+ ]
30
+
31
+ F = TypeVar("F", bound=Callable[..., Any])
32
+
33
+
34
+ class DeprecatedWarning(DeprecationWarning):
35
+ """Custom deprecation warning for fin-infra.
36
+
37
+ This warning is used to distinguish fin-infra deprecations from
38
+ Python's built-in DeprecationWarning.
39
+ """
40
+
41
+ pass
42
+
43
+
44
+ def deprecated(
45
+ version: str,
46
+ reason: str,
47
+ removal_version: str | None = None,
48
+ *,
49
+ stacklevel: int = 2,
50
+ ) -> Callable[[F], F]:
51
+ """Decorator to mark a function or class as deprecated.
52
+
53
+ The decorated function/class will emit a DeprecationWarning when called/instantiated.
54
+
55
+ Args:
56
+ version: The version in which the feature was deprecated (e.g., "1.2.0").
57
+ reason: The reason for deprecation and recommended alternative.
58
+ removal_version: The version in which the feature will be removed (e.g., "1.4.0").
59
+ stacklevel: Stack level for the warning (default 2 for immediate caller).
60
+
61
+ Returns:
62
+ A decorator that wraps the function/class with deprecation warning.
63
+
64
+ Example:
65
+ >>> @deprecated(
66
+ ... version="1.2.0",
67
+ ... reason="Use new_function() instead",
68
+ ... removal_version="1.4.0"
69
+ ... )
70
+ ... def old_function():
71
+ ... return "result"
72
+ >>>
73
+ >>> old_function() # Emits DeprecationWarning
74
+ 'result'
75
+ """
76
+
77
+ def decorator(func: F) -> F:
78
+ # Build the warning message
79
+ name = getattr(func, "__qualname__", getattr(func, "__name__", str(func)))
80
+ message = f"{name} is deprecated since version {version}."
81
+
82
+ if removal_version:
83
+ message += f" It will be removed in version {removal_version}."
84
+
85
+ message += f" {reason}"
86
+
87
+ if isinstance(func, type):
88
+ # Handle class deprecation
89
+ original_init = func.__init__ # type: ignore[misc]
90
+
91
+ @functools.wraps(original_init)
92
+ def new_init(self: Any, *args: Any, **kwargs: Any) -> None:
93
+ warnings.warn(message, DeprecatedWarning, stacklevel=stacklevel)
94
+ original_init(self, *args, **kwargs)
95
+
96
+ func.__init__ = new_init # type: ignore[misc]
97
+
98
+ # Add deprecation info to docstring
99
+ if func.__doc__:
100
+ func.__doc__ = f".. deprecated:: {version}\n {reason}\n\n{func.__doc__}"
101
+ else:
102
+ func.__doc__ = f".. deprecated:: {version}\n {reason}"
103
+
104
+ return func # type: ignore[return-value]
105
+ else:
106
+ # Handle function deprecation
107
+ @functools.wraps(func)
108
+ def wrapper(*args: Any, **kwargs: Any) -> Any:
109
+ warnings.warn(message, DeprecatedWarning, stacklevel=stacklevel)
110
+ return func(*args, **kwargs)
111
+
112
+ # Add deprecation info to docstring
113
+ if wrapper.__doc__:
114
+ wrapper.__doc__ = f".. deprecated:: {version}\n {reason}\n\n{wrapper.__doc__}"
115
+ else:
116
+ wrapper.__doc__ = f".. deprecated:: {version}\n {reason}"
117
+
118
+ return wrapper # type: ignore[return-value]
119
+
120
+ return decorator
121
+
122
+
123
+ def deprecated_parameter(
124
+ name: str,
125
+ version: str,
126
+ reason: str,
127
+ removal_version: str | None = None,
128
+ *,
129
+ stacklevel: int = 2,
130
+ ) -> None:
131
+ """Emit a deprecation warning for a deprecated parameter.
132
+
133
+ Call this function when a deprecated parameter is used. This should be
134
+ called at the beginning of a function that has deprecated parameters.
135
+
136
+ Args:
137
+ name: The name of the deprecated parameter.
138
+ version: The version in which the parameter was deprecated.
139
+ reason: The reason for deprecation and recommended alternative.
140
+ removal_version: The version in which the parameter will be removed.
141
+ stacklevel: Stack level for the warning (default 2 for immediate caller).
142
+
143
+ Example:
144
+ >>> def my_function(new_param: str, old_param: str | None = None):
145
+ ... if old_param is not None:
146
+ ... deprecated_parameter(
147
+ ... name="old_param",
148
+ ... version="1.2.0",
149
+ ... reason="Use new_param instead"
150
+ ... )
151
+ ... new_param = old_param
152
+ ... return new_param
153
+ """
154
+ message = f"Parameter '{name}' is deprecated since version {version}."
155
+
156
+ if removal_version:
157
+ message += f" It will be removed in version {removal_version}."
158
+
159
+ message += f" {reason}"
160
+
161
+ warnings.warn(message, DeprecatedWarning, stacklevel=stacklevel + 1)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: fin-infra
3
- Version: 0.1.82
3
+ Version: 0.4.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
@@ -28,7 +28,9 @@ Provides-Extra: yahoo
28
28
  Requires-Dist: ai-infra (>=0.1.142)
29
29
  Requires-Dist: cashews[redis] (>=7.0)
30
30
  Requires-Dist: ccxt (>=4.0.0) ; extra == "markets" or extra == "crypto" or extra == "all"
31
+ Requires-Dist: fastapi-users (>=15.0.2,<16.0.0)
31
32
  Requires-Dist: httpx (>=0.25.0)
33
+ Requires-Dist: langchain-core (>=1.2.5,<2.0.0)
32
34
  Requires-Dist: loguru (>=0.7.0)
33
35
  Requires-Dist: numpy (>=1.24.0)
34
36
  Requires-Dist: numpy-financial (>=1.0.0)
@@ -45,21 +47,27 @@ Project-URL: Issues, https://github.com/nfraxlab/fin-infra/issues
45
47
  Project-URL: Repository, https://github.com/nfraxlab/fin-infra
46
48
  Description-Content-Type: text/markdown
47
49
 
48
- <div align="center">
49
-
50
50
  # fin-infra
51
51
 
52
- ### Financial data infrastructure for fintech apps
52
+ **Financial data infrastructure for fintech apps.**
53
53
 
54
- [![PyPI](https://img.shields.io/pypi/v/fin-infra.svg)](https://pypi.org/project/fin-infra/) [![Python 3.11+](https://img.shields.io/badge/python-3.11+-blue.svg)](https://www.python.org/downloads/) [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](https://opensource.org/licenses/MIT) [![Downloads](https://static.pepy.tech/badge/fin-infra/month)](https://pepy.tech/project/fin-infra)
54
+ [![PyPI](https://img.shields.io/pypi/v/fin-infra.svg)](https://pypi.org/project/fin-infra/)
55
+ [![CI](https://github.com/nfraxlab/fin-infra/actions/workflows/ci.yml/badge.svg)](https://github.com/nfraxlab/fin-infra/actions/workflows/ci.yml)
56
+ [![Python](https://img.shields.io/pypi/pyversions/fin-infra.svg)](https://pypi.org/project/fin-infra/)
57
+ [![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
55
58
 
56
- **Banking, investments, market data, credit scores, and financial calculations in one toolkit.**
59
+ ## Overview
57
60
 
58
- [Documentation](docs/) · [Examples](examples/) · [PyPI](https://pypi.org/project/fin-infra/)
61
+ Banking, investments, market data, credit scores, and financial calculations in one toolkit.
59
62
 
60
- </div>
63
+ ### Key Features
61
64
 
62
- ---
65
+ - **Banking** - Plaid/Teller integration, accounts, transactions
66
+ - **Investments** - Holdings, portfolio data, real P/L with cost basis
67
+ - **Market Data** - Stocks, crypto, forex quotes and history
68
+ - **Credit** - Credit scores and monitoring
69
+ - **Analytics** - Cash flow, savings rate, spending insights
70
+ - **Cashflows** - NPV, IRR, loan amortization calculations
63
71
 
64
72
  ## Why fin-infra?
65
73
 
@@ -1,48 +1,48 @@
1
1
  fin_infra/__init__.py,sha256=7oL-CCsALNifBODAn9LriicaIrzgJkmVPvE-9duP0mw,1574
2
2
  fin_infra/__main__.py,sha256=1qNP7j0ffw0wFs1dBwDcJ9TNXlC6FcYuulzoV87pMi8,262
3
- fin_infra/analytics/__init__.py,sha256=zjAOFkI9xjg76ozZStYBXEPNwIsioj5fUBltja5JLyc,2327
4
- fin_infra/analytics/add.py,sha256=-iAqKdvf9t0gQjjo3uOO56qA_ei4omKYDOynxb4SZPI,12654
5
- fin_infra/analytics/cash_flow.py,sha256=lH-J6RIUzcV9Fuy56i12N6vuIdPaGz-rhWquSgjkldU,10300
3
+ fin_infra/analytics/__init__.py,sha256=-OsQUqLgOdafSNzbcIHy3G37nX2OwD0OzGj8C2Aiufs,2325
4
+ fin_infra/analytics/add.py,sha256=OdITXA5CjijhbBzokV3xlTcJCTiMLBDuUJ8OH9Pwkhw,12651
5
+ fin_infra/analytics/cash_flow.py,sha256=VSsQHwTi6r6VFoScH9nu9Fj8XHC4O4B9TkAI8Alobm4,10284
6
6
  fin_infra/analytics/ease.py,sha256=aTAPc-Lmh6XP7REPVlAom38MtKCqeS-auNW-rpXRZJs,14282
7
- fin_infra/analytics/models.py,sha256=cK6VKLZ763zXfn9REXOnLGx0v3Q8bUa-vH8aoNs2w-A,8215
8
- fin_infra/analytics/portfolio.py,sha256=d39sZGa3TQVX1xN2nplPHuxhsE-rahuiyzd612DeZ_Y,26417
7
+ fin_infra/analytics/models.py,sha256=XFHeVZoPE0PcSFj59dNsdxISFVwdrTLU4sDCtExumrg,8193
8
+ fin_infra/analytics/portfolio.py,sha256=3xP34nQXvLdj_6Bpz5sufRoND5hpGDnmespWAixgh80,26405
9
9
  fin_infra/analytics/projections.py,sha256=T7LLG0Pe5f-WwgfDITdTMk-l8cCLZTM9cEC_Vxf6mkc,9154
10
10
  fin_infra/analytics/rebalancing.py,sha256=VM8MgoJofmrCXPK1rbmVqWGB4FauNmHCL5HOEbrZR2g,14610
11
11
  fin_infra/analytics/savings.py,sha256=n3rGNFP8TU5mW-uz9kOuqX_mDiVnDyAeDN06Q7Abotw,7570
12
12
  fin_infra/analytics/scenarios.py,sha256=LE_dZVkbxxAx5sxitGhiOhZfWTlYtVbIvS9pEXkijLc,12246
13
- fin_infra/analytics/spending.py,sha256=wCa8mhtdMTnI3eG9W28ljCgB_AQRVGxkrRA2ZwLi_RQ,26249
13
+ fin_infra/analytics/spending.py,sha256=ogLcfF5ZOLMkBIj02RISnA3hiY_PsLWZ2_AAzA7FenY,26209
14
14
  fin_infra/banking/__init__.py,sha256=6wwGNITzyehC9MBQc5jy0ewSTuNetyQu2AdND51O55w,22450
15
- fin_infra/banking/history.py,sha256=BYvKLI_F198TBrtP7vMCCcBcszzFxZkmD-ClCezSVW8,10575
15
+ fin_infra/banking/history.py,sha256=YB-v9A03IZ_qki6A6mA-RO5Y4imlqk1CyP0W482ufdQ,10563
16
16
  fin_infra/banking/utils.py,sha256=HhxZbeaA8zqVttgMiJGnShTo_r_0DaD7T3IMq8n8340,15252
17
- fin_infra/brokerage/__init__.py,sha256=wJpgdOMWNxKt01eUIbu2oSmcFlL189nlWR0-PhLLVFc,17154
17
+ fin_infra/brokerage/__init__.py,sha256=IXm5ko5T607LodexYSbKNZc6I_2CQGaOwQUlb-w9-ks,17137
18
18
  fin_infra/budgets/__init__.py,sha256=GgfujfgdVld6_yUf8bhkW-bsIXBLb4THlJMocVpA4mM,3986
19
19
  fin_infra/budgets/add.py,sha256=i7Av--Z14sYQDJHETiF9VL71ouWBZcs3H3VZ62gqFEo,13508
20
- fin_infra/budgets/alerts.py,sha256=KlK3r2qPzMw4naFMHsFjqkwKDxdj_2b_y-ofD1nldkg,9714
21
- fin_infra/budgets/ease.py,sha256=vK5O8rvKzzJ1MUiwi7p9egayDFqyB23hPbbEhb1mhXE,8203
22
- fin_infra/budgets/models.py,sha256=qd6bcjl2cOtFqRtNe1Xso_05cQlGG-4qhBkiTQKchy0,14335
20
+ fin_infra/budgets/alerts.py,sha256=XDSUPpRR1LNgSQU0Szlht0bLWI7RRBh1ElbcwGexbPs,9701
21
+ fin_infra/budgets/ease.py,sha256=SB0hEuKw7avb32Ax1jY471hh7Y4Nhc4YtNOL7z1BOs0,8172
22
+ fin_infra/budgets/models.py,sha256=q_6aqzC3fT-h5lJfTy2YjwBJgHAJha9e18KkuyxG2Dc,14304
23
23
  fin_infra/budgets/scaffold_templates/README.md,sha256=FBtRSrQSkg7Xp8SPiuSmzGR94I2zzjOckb0_vKtcksY,14084
24
24
  fin_infra/budgets/scaffold_templates/__init__.py,sha256=zQXi_vY4QS5a4Ddi2mVXMLM--rP021h5D94ohIC1dkU,172
25
25
  fin_infra/budgets/scaffold_templates/models.py.tmpl,sha256=rpKhXwnx1gQjV_GGVqs8CvkFNHctrYcagC9swE14pVU,7553
26
26
  fin_infra/budgets/scaffold_templates/repository.py.tmpl,sha256=khFgnQnVNnOo8DWYDmYz58MvdeSJpoS9QvTXcGhsa8g,10023
27
27
  fin_infra/budgets/scaffold_templates/schemas.py.tmpl,sha256=x5gSQ7Kiuq08tum5joKmeY0ib2r3ekLKk09dFOl0PS0,5658
28
- fin_infra/budgets/templates.py,sha256=Sbc7RcHXscq34g4t7J8OXM2Kfkt5DHuvqVnFU0Jiddc,12112
29
- fin_infra/budgets/tracker.py,sha256=gF68a6sivdSfVDZanSwdGdhEcg6SEic0K_rO9ed7lvI,16460
28
+ fin_infra/budgets/templates.py,sha256=V1Hfh0P_6iMdaSLtnFm9iEvXDUyFb7yqBObat98hDjU,12093
29
+ fin_infra/budgets/tracker.py,sha256=RDPfYhOLSAp-RFlTWFTpYaB5mysu3QfQhhcqJzmVWUU,16444
30
30
  fin_infra/cashflows/__init__.py,sha256=N9ZGKwIrQs-eiZZxqCow2aLBhW1MKcJoasQjGtyV6l4,8517
31
31
  fin_infra/cashflows/core.py,sha256=YWvF0DVOfBkvO_MuDODjE-V_g52H2ixFRH_TjMXExDE,541
32
- fin_infra/categorization/__init__.py,sha256=efLje12AW-ec9Vs5ynb41r4XCIWx5a-Z9WoGb3kQdIE,2030
32
+ fin_infra/categorization/__init__.py,sha256=p5uEFX0piPI5QmYtQ4lTrr0Cph5r01XpHDOi4RwwVv4,2027
33
33
  fin_infra/categorization/add.py,sha256=-I-V7R8vWj2-B8yjtFn_pNryQV5uascFR18a1Ltcqm0,6247
34
- fin_infra/categorization/ease.py,sha256=bomEtJAgwk9uiemNt1rk-IsTjJIhyJn0GJ_c58YEmJs,5836
35
- fin_infra/categorization/engine.py,sha256=u1ZYDmuB0gZeJHn-CKvvwd7Z1HFiB-S91YuV_ZrK_Rc,12117
36
- fin_infra/categorization/llm_layer.py,sha256=CSe6q-cKQgnKUKSItdDQwzMd8K1dsp-Mwua7SWZ9Ux0,12670
37
- fin_infra/categorization/models.py,sha256=-rGXR0RW2EU_FQ7ZfDWBIXxx8QGJDxeBF9zKGYyVgqY,5931
34
+ fin_infra/categorization/ease.py,sha256=gvlVb_TL7kwm5oM_gWdrhZt4cJOSvYEgGipNJKK8CpM,5820
35
+ fin_infra/categorization/engine.py,sha256=tZ-WTkPUUcKe6rDFoCSu5BF_gezcjJfx8Yn9eUX4lDQ,12114
36
+ fin_infra/categorization/llm_layer.py,sha256=K3vn3Muf6VfsSDT-iRcKBJQyO-BSx8nfLQlK-UmBmG0,12824
37
+ fin_infra/categorization/models.py,sha256=A8m3hAIbsUUV3eNjXpTiPWD1sYGjSdXEByTS3ZZASEA,5894
38
38
  fin_infra/categorization/rules.py,sha256=IpDnHBeuykRdu5vs3Lph4Y9-3RseIjjleQ5hZphQvNk,12849
39
39
  fin_infra/categorization/taxonomy.py,sha256=p-tSOwJ0O-rFZ1LIlHSYdaYdSc65084j0fdMI_6LW84,13251
40
40
  fin_infra/chat/__init__.py,sha256=-gufQz-rOZVXkcTUcCcXdG2oGL8csJBxwSuOMN_5aVc,6324
41
41
  fin_infra/chat/ease.py,sha256=8T0BQUkWQVpaTooD5-ZtinackkciqGargXnzWzayj3M,3113
42
- fin_infra/chat/planning.py,sha256=Vc3_58XxCnpT-347Q4BV0OY-xNINX79W7hFes4gou60,19915
42
+ fin_infra/chat/planning.py,sha256=goXAHQFv-du89wAHw_X_vm8aF7-HGBeRlyiA_BWx5xw,19912
43
43
  fin_infra/cli/__init__.py,sha256=7M8gKULnui4__9kXRKRHgETuFwZlacK9xrq5rSZ31CM,376
44
44
  fin_infra/cli/cmds/__init__.py,sha256=BvL3wRoUl3cO5wesv1Cqoatup7VeYMhq82tS19iNZHE,136
45
- fin_infra/cli/cmds/scaffold_cmds.py,sha256=CDEg1Ak_2DT6iHtpMk2RfC-BUfP8zDNDA6Ekwa03Pl4,7574
45
+ fin_infra/cli/cmds/scaffold_cmds.py,sha256=bbVSNmnePOS5lqPH1Wq0ohiQWV3UnX_uTIjQkAr5qjs,7564
46
46
  fin_infra/clients/__init__.py,sha256=CL_NUNxLAKFvG7wL_F-rAhUucp6pm0sNHVtvCzVvLcw,708
47
47
  fin_infra/clients/base.py,sha256=fZebDGIfQQybqeXpFpORlDZ6wSKf33aIAkUUpmyvZrA,979
48
48
  fin_infra/clients/plaid.py,sha256=0_kV95vDgasbWyVQe3OEqtVXkF4Q6SNmvHwXXY0gzh8,816
@@ -52,25 +52,25 @@ fin_infra/credit/add.py,sha256=8mYshzS8VGlnI_2b5WxXU5QFBrI-iEPfN1RDNz0apcA,8556
52
52
  fin_infra/credit/experian/__init__.py,sha256=g3IJGvDOMsnB0er0Uwdvl6hGKKTOazqJxSDnB2oIBm0,761
53
53
  fin_infra/credit/experian/auth.py,sha256=1TfT0wnqjAs-RCzDZKF_NH8LjTPDi8uMq7uyNPLJmS4,5612
54
54
  fin_infra/credit/experian/client.py,sha256=jNvfiBM7Qn9w8J_ZqQReDa4ACymyoFVgopQpdznTI-o,8645
55
- fin_infra/credit/experian/parser.py,sha256=7ptdLyTWWqHWqCo1CXn6L7XaIn9ZRRuOaATbFmMZZ64,7489
55
+ fin_infra/credit/experian/parser.py,sha256=KFLQd4_R_tXhQkJPJrDbdD1-GlGdJy6cAToVxKoZHcY,7484
56
56
  fin_infra/credit/experian/provider.py,sha256=a_BLyfc4wLUUqt8rkcbpHJuDB_DjFhS2kTZ-loVLdhM,13680
57
57
  fin_infra/credit/mock.py,sha256=xKWZk3fhuIYRfiZkNc9fbHUNViNKjmOLSj0MTI1f4ik,5356
58
- fin_infra/crypto/__init__.py,sha256=VTi2vjiDrlg0lU9H9tM3X-scRN-Z7QJ9UpdYIOeQcaw,8262
58
+ fin_infra/crypto/__init__.py,sha256=Qv-Herm67r2dFJz2GA7ljemT_1shv2ZeWM3w6osY5HI,8260
59
59
  fin_infra/crypto/insights.py,sha256=cgMsjdrR7vOTKvEDbFCXpS7O7I8dMs1oz6cIbtrJWZI,11393
60
60
  fin_infra/documents/__init__.py,sha256=Ub1hbX3PTrBSsBdcbL8PFf6oq8jSH4pYxW45-qOYPqs,1909
61
61
  fin_infra/documents/add.py,sha256=2RSf_i39-JUT6c_jVsEQwW3FfQSlH4H9Z0t_H0vz86U,8091
62
62
  fin_infra/documents/analysis.py,sha256=UWKTR_qXZoumItXUwHFMH3LAG2vFVlPITbIC8Y_r0s8,13970
63
63
  fin_infra/documents/ease.py,sha256=z8hLaYhO1znBbcA9F10uNVa1BnH4rm3Jm5pexQwyiJY,9574
64
- fin_infra/documents/models.py,sha256=RpazzhE9qBcTRk_NO7Dl_uvcHw9UpGtnpXFcJURMtYc,6865
64
+ fin_infra/documents/models.py,sha256=VEkJynM2REAf37ZachIz7_MfTevpzmG4Cmpku388YwE,6831
65
65
  fin_infra/documents/ocr.py,sha256=8I0XhiEdDhew55jUxOB5whoO5OcSXD71xiv8HhnyYno,9565
66
66
  fin_infra/documents/storage.py,sha256=HXfubl-4PspvA-U8czB-4TgZKI1kOlw440jYHRDzjoY,10300
67
67
  fin_infra/exceptions.py,sha256=k7L3vfXcONM2-AqmqNhQvOHobVBrLPTYp44cMUxuP3o,16951
68
68
  fin_infra/goals/__init__.py,sha256=iiy7qkPazSSAmPFhy2EXkfJvOBfb7ymrqS1eXBNiaQc,2130
69
69
  fin_infra/goals/add.py,sha256=zobcqEsEzsmd9itSPyPmzpkzFQYZlETo9d17bU9s3mc,20534
70
70
  fin_infra/goals/funding.py,sha256=Fw6hUvb8yNWineEbRXFYgw4_ZRnGrBSChBjkb7Qozrs,9303
71
- fin_infra/goals/management.py,sha256=nf1Es-rdQcp8bAM1FNWonX94CvGMBS1Nis4Q1CWgY0c,33868
72
- fin_infra/goals/milestones.py,sha256=mQHDn9FXVI0HJ9qBHGW25HRwyBjp_MOxjDml7z2kgiw,9996
73
- fin_infra/goals/models.py,sha256=5X0BddvK9FBsXMTXBQn8YFBNLtIbXue9a4VdLH3rWR8,10173
71
+ fin_infra/goals/management.py,sha256=1Ur76J6-EoxIbLZVnyfw64F4wwTq8Sp5e-YWDk5qVP4,33859
72
+ fin_infra/goals/milestones.py,sha256=1Sq-ZbW_H9Makw-kz4ekuw5kFGeDBNgnyTy-1Lr9TQo,9972
73
+ fin_infra/goals/models.py,sha256=SUBaQ9PaKsvWVmyT4qWdFxHsoJxevleTg9O6Qho03Zk,10171
74
74
  fin_infra/goals/scaffold_templates/README.md,sha256=CoE_3I2K32orOFH6CvfVBaJBTGDYIESd5-48V7vU1FI,9974
75
75
  fin_infra/goals/scaffold_templates/__init__.py,sha256=rLFam-mRsj8LvJu5kRBEIJtw9rFUof7KApgD2IRE56c,107
76
76
  fin_infra/goals/scaffold_templates/models.py.tmpl,sha256=b23Nlwm05MFMQE4qkrylTPXqulsN6cuFzNev2liY7DI,5714
@@ -79,57 +79,57 @@ fin_infra/goals/scaffold_templates/schemas.py.tmpl,sha256=M1hS1pK9UDXcNqPW-NGu98
79
79
  fin_infra/insights/__init__.py,sha256=fFYymoAY2zd7eooE-RqyFifXB_J-vVkHjyMak7o4wnQ,3984
80
80
  fin_infra/insights/aggregator.py,sha256=HtaJipSA-O_HVComBcyQdkGs6guoW81sYwRYHXGdBJI,10251
81
81
  fin_infra/insights/models.py,sha256=xov_YV8oBLJt3YdyVjbryRfcXqmGeGiPvZsZHSbvtl8,3202
82
- fin_infra/investments/__init__.py,sha256=DQJa32LdXspbtxydric-AfT3o5iDkqIByAsSriSfGak,6729
82
+ fin_infra/investments/__init__.py,sha256=hJDHlKNXG0Hr3zsJeXdTEyvxL9PkVR8NkS2ULKnELWY,6727
83
83
  fin_infra/investments/add.py,sha256=UV2_99z1p8cUiifVFJXOF0lGd0ucMgZ5s9N7IFyE_NY,17193
84
- fin_infra/investments/ease.py,sha256=d5ISfxpCius6JM2LZNReztW6-IizaqoxNU4aEbXWA74,9487
85
- fin_infra/investments/models.py,sha256=UyOvtU1-uxrgE0zLP5WY3wpn3YOdOv6_b05oGismxNU,18412
84
+ fin_infra/investments/ease.py,sha256=s716nYv5kzkJ-vGbVeIumqAN0-TEl1ai-If84uP9h68,9474
85
+ fin_infra/investments/models.py,sha256=Es1GdrB640k50gtdzTtfh_66nxvYxORq0xbtXryoRGo,18319
86
86
  fin_infra/investments/providers/__init__.py,sha256=V1eIzz6EnGJ-pq-9L3S2-evmcExF-YdZfd5P6JMyDtc,383
87
- fin_infra/investments/providers/base.py,sha256=1plM-o_fV6jQyyPnpZT5q8ir96oyxvh0zwA3qpiVIFY,9810
87
+ fin_infra/investments/providers/base.py,sha256=T9XC47hQ55rL0RG9r00PZsKS68wlXJacXudwPVf19Qs,9806
88
88
  fin_infra/investments/providers/plaid.py,sha256=X42cMpsHNcOPcYvl73jrP8x7nQ399n2_it3Ko9UIkI0,18751
89
89
  fin_infra/investments/providers/snaptrade.py,sha256=Hs5uM3F31mGzSONgVXLlL2BR86mjOWs8OhcpLiUeaAo,23251
90
- fin_infra/investments/scaffold_templates/README.md,sha256=PhgxfMLrro2Jz83b7XEnBi7lexiWKqlMrd2UU2Rbs8A,12149
90
+ fin_infra/investments/scaffold_templates/README.md,sha256=q9xB__7xqSK5JTvzsDDHMsFirwWV-7TNn45R0k9F2aE,12081
91
91
  fin_infra/investments/scaffold_templates/__init__.py,sha256=iR0oiAzXFYXHBnVJjaEnAzk6omncYOLg0TKMJ7xomBc,82
92
92
  fin_infra/investments/scaffold_templates/models.py.tmpl,sha256=5inP5-jw-qEfPYxSN71tn4AojZ9PesOIeuHTw181N-c,5849
93
93
  fin_infra/investments/scaffold_templates/repository.py.tmpl,sha256=XwOEpQZfuXut1WLiq-GSSvv0oX0iYCW54eJNL0Cav94,14656
94
94
  fin_infra/investments/scaffold_templates/schemas.py.tmpl,sha256=knWmn-Kyr7AdgPD4ZPMb6T49ZuPXeuOMqmjYNyA0CA0,5451
95
- fin_infra/markets/__init__.py,sha256=Ba9iUTfDkkla8GwPo3gULTJYUDQh5gSgGN15BxHINpo,9865
95
+ fin_infra/markets/__init__.py,sha256=pVPtfOZxIeHsPuCDOCydmJjdsOc44R9B2d5EbCZNhRU,9863
96
96
  fin_infra/models/__init__.py,sha256=y94RJ_1-bzgNUCxqE76X56WIOk3-El_Jueqy7uB0rb8,860
97
- fin_infra/models/accounts.py,sha256=ExQimE2O5dyugFMW7nCboWbWcaX3Nnl5Gg-B1XLSdIk,1138
97
+ fin_infra/models/accounts.py,sha256=m_HdYHOe_m0GLnc_f5njo9n-zscWu-C0rJB6SAd5-aY,1098
98
98
  fin_infra/models/brokerage.py,sha256=TV5KMe78e-ttjcUbZIfdGo3x0NisAQ3puwv_ehtgSHc,8312
99
99
  fin_infra/models/candle.py,sha256=5JeqUvqlFfYE61uViBeLKZCh2wKdJZH7Pvi-TLzN4FI,536
100
100
  fin_infra/models/credit.py,sha256=rSdSURsMe9_i2gxmwPTDwNQWOuM2zutL-OhvHsnbtmw,12144
101
101
  fin_infra/models/money.py,sha256=63pdGD1WBMHicJ1w7pbU1g5fqt4gIzPuqQQ2-NSlBuc,401
102
102
  fin_infra/models/quotes.py,sha256=-YBzgnjjCihRAprUdaPRtfwKrgliDIGgqAnaM69VbDU,521
103
103
  fin_infra/models/tax.py,sha256=as40J9h24BB7LmeaIfay509UaYEctmk5CPW9CfcjWZc,15657
104
- fin_infra/models/transactions.py,sha256=8C4taS9ZGLeFYGqG7JGkLq5ZinvAjHPLrKyRu_Sy5_0,791
105
- fin_infra/net_worth/__init__.py,sha256=4LzVM2Y0OkBlZoD5FUAbLwtORp1okYcsYc4zj0P8C7k,3452
104
+ fin_infra/models/transactions.py,sha256=gzc6hLKKU6VUWGshqw2WChU_x0qyXhdvOGwmj9H_H3I,790
105
+ fin_infra/net_worth/__init__.py,sha256=hAxX5nM9jCf-rA0WF42Fkt6_dZLjcAZZH5KBkMhr9Ak,3444
106
106
  fin_infra/net_worth/add.py,sha256=QWfHIHJs2CV99WRBqjQ2OteiOrn5cR9nurmxTF9v5rg,23191
107
- fin_infra/net_worth/aggregator.py,sha256=9Kx2vUR71QwqYZdGaCfmYrJ1hNxzd1EEuAdWJoNjqTI,12780
108
- fin_infra/net_worth/calculator.py,sha256=SQJGJDok5HgvoAhKBxeeqt8vhGMchABU3zPmNRpqNy4,13139
107
+ fin_infra/net_worth/aggregator.py,sha256=Zlb0-Z7xdHMzjvmxc90KeYwwr8zNkybX2ra9oAFi6UM,12779
108
+ fin_infra/net_worth/calculator.py,sha256=l13BWEtJNCWau0M7J97ek8WVQN3_9NVXnJkmit0CcLU,13138
109
109
  fin_infra/net_worth/ease.py,sha256=ERdFrUjjb5l5BRp_c2tEfE1obTpRc_-FA9LnV7BTiEw,15883
110
110
  fin_infra/net_worth/goals.py,sha256=BJGxdsMjvgQDELFEJo-ai3DvsAzUNXvzMXkwovHr8yQ,1238
111
- fin_infra/net_worth/insights.py,sha256=LJ-EI0jQuBVqoFthgDq2PAmwRGorx0dP2Rsm4yNvquY,25221
111
+ fin_infra/net_worth/insights.py,sha256=RlCp247kFZ73xBlU-1LYTXs0R6sg4FvL0SidLwFz-6M,25206
112
112
  fin_infra/net_worth/models.py,sha256=sZv3dGw5zwckE2XQ7n5ehK7sv4jdGCo9c2g4ZtZHwCI,26880
113
113
  fin_infra/net_worth/scaffold_templates/README.md,sha256=Wqd6ksqFjmtNdDFOWVV_duuAcePWwiu3_YgkVM9N_WY,14363
114
114
  fin_infra/net_worth/scaffold_templates/__init__.py,sha256=OKeMCC_JNw6m8rBWr_wesOIJ1OR9LCBeIkXKahbCGC4,132
115
115
  fin_infra/net_worth/scaffold_templates/models.py.tmpl,sha256=9BKsoD08RZbSdOm0wFTbx5OzKfAEtuA1NcWyS1Aywx4,5934
116
116
  fin_infra/net_worth/scaffold_templates/repository.py.tmpl,sha256=DSErnNxeAe4pWeefARRK3bU0hHltqdIFffENfVwdd7c,12798
117
117
  fin_infra/net_worth/scaffold_templates/schemas.py.tmpl,sha256=VkFsxyZx4DFDhXDhn-7KT0IgrXCvgaS5ZdWbjyezWj0,4709
118
- fin_infra/normalization/__init__.py,sha256=O-8YvPbKWgfdC6E2qzXuCFLJ6cM-CS8GmBO8TDcJ9X0,6246
119
- fin_infra/normalization/currency_converter.py,sha256=uuu8ASa5ppEniWLEVEpiDxXjZzln9nopWrhrATcD6Z4,7058
120
- fin_infra/normalization/models.py,sha256=gNC9chpbQPRN58V2j__VEPVNReO1N8jH_AHObwGPWu0,1928
118
+ fin_infra/normalization/__init__.py,sha256=7PWJn_T-8O464cvM4BeA5krOS2YaJXhCmEV9ZtQqbB0,6244
119
+ fin_infra/normalization/currency_converter.py,sha256=YIi7EgeE_Oe2qiXaCLnmgj9AKHvKBO0eLm_7bkHMFJM,7015
120
+ fin_infra/normalization/models.py,sha256=h8zC2n642WwVWC1yvx_VCILDOgUwPDrZwjb0QIbA8cE,1873
121
121
  fin_infra/normalization/providers/__init__.py,sha256=LFU1tB2hVO42Yrkw-IDpPexD4mIlxob9lRrJEeGYqpE,559
122
122
  fin_infra/normalization/providers/exchangerate.py,sha256=I_2TK_LLOcYCy3HcN9Nut3UwqTWEOX26GktmX3cczvY,6340
123
- fin_infra/normalization/providers/static_mappings.py,sha256=m14VHmTZipbqrgyE0ABToabVx-pDcyB577LNWrACEUM,6809
124
- fin_infra/normalization/symbol_resolver.py,sha256=M7Li7LFiH4xpvxXcYQlJyk0iqgqpwaj6zQKsTzWZzas,8130
123
+ fin_infra/normalization/providers/static_mappings.py,sha256=X8eSXLU_9qwXLcSL84nNR81c_H_95-saJhwnp0h_sgE,6808
124
+ fin_infra/normalization/symbol_resolver.py,sha256=UAfhxmiINpQhE8tPLh-GMCfDZGmK5wf2DwtYZP3sSUo,8093
125
125
  fin_infra/obs/__init__.py,sha256=kMMVl0fdwtJtZeKiusTuw0iO61Jo9-HNXsLmn3ffLRE,631
126
- fin_infra/obs/classifier.py,sha256=JasWCqSkYjllJNZ5Gwbrd53ZhLwhYNZ0i2nbTcklEog,5155
126
+ fin_infra/obs/classifier.py,sha256=S7kSphgHN1O4GiMUdr3IjuXpoXU0XgGq132_U-njXX4,5153
127
127
  fin_infra/providers/__init__.py,sha256=jxhQm79T6DVXf7Wpy7luL-p50cE_IMUbjt4o3apzJQU,768
128
128
  fin_infra/providers/banking/base.py,sha256=KeNU4ur3zLKHVsBF1LQifcs2AKX06IEE-Rx_SetFeAs,102
129
129
  fin_infra/providers/banking/plaid_client.py,sha256=8Nvd9Ow_v6Scnw79R86uSvRcBRHPgc3ytsQze50E7aM,6524
130
130
  fin_infra/providers/banking/teller_client.py,sha256=733Eq-o9Yt7Sm_aWOeunJU4EWYRAaZNS7vgDVGqR0W4,10279
131
131
  fin_infra/providers/base.py,sha256=Tqjl5_hSTShgYLrSiKzeDbnL_I-dji-G_itkumm15IM,7722
132
- fin_infra/providers/brokerage/alpaca.py,sha256=X37cKou4jhekY-EHB4WKOa8K66Vkb4m5riDcuVdv7wc,9926
132
+ fin_infra/providers/brokerage/alpaca.py,sha256=BObiI_dFQZ3fOpTfmZMkri8sVrsz5uW6i5ZVUb0etCU,9923
133
133
  fin_infra/providers/brokerage/base.py,sha256=JJFH0Cqca4Rg4rmxfiwcQt-peRoBf4JpG3g6jx8DVks,106
134
134
  fin_infra/providers/credit/experian.py,sha256=r7lpFecgOdNEhb_Lxz2Z-BG8R3p2n0XlqDKL7y8NZ-0,482
135
135
  fin_infra/providers/identity/stripe_identity.py,sha256=JQGJRuQdWP5dWDcROgtz1RrmpkytRv95H6Fn-x1kifU,501
@@ -145,36 +145,37 @@ fin_infra/providers/tax/mock.py,sha256=-6VD9F3usfoxU-KqAj8jC3Q1xsnJ4o5ZT1W5Ze7X6
145
145
  fin_infra/providers/tax/taxbit.py,sha256=Lp3eH64oUrqwVT5P8oPxa01LFAmhhlfbquDFiiiDcz8,4271
146
146
  fin_infra/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
147
147
  fin_infra/recurring/__init__.py,sha256=lYeMdpgxq52x7siFp62_xVqzUx84vMNKrTuiaT2JTi4,2308
148
- fin_infra/recurring/add.py,sha256=Kc5Wv-4XshS8ET1wuydDJfRz6fQAkbZ2uQ1qFAJ0X5w,19055
148
+ fin_infra/recurring/add.py,sha256=l_VsqJNAs-s5VZ7WFA3wfXJtjib2eqBhMJofTYgDR2w,19053
149
149
  fin_infra/recurring/detector.py,sha256=MCq_48V6o9Ig9lTTHM054KNh2I_udEjWBmV_iF361ac,20131
150
- fin_infra/recurring/detectors_llm.py,sha256=MB9hGUTo8WEa-lpevOkrp0OQOXnatskzW02l_EfwTPo,11486
151
- fin_infra/recurring/ease.py,sha256=8t0lXMqNxHZkO0fw29sEn_lQjitDq0UxebtqA74tag0,11157
152
- fin_infra/recurring/insights.py,sha256=-SgskqHqOlkDwCfj4NsPMwlq1bHY2J5gM-1c_t0bSv0,15853
150
+ fin_infra/recurring/detectors_llm.py,sha256=2EMBQTIHvmxJR6gqvhlg6VNj2-eDTJiJULMxTCZMnJw,11481
151
+ fin_infra/recurring/ease.py,sha256=jaBFMul1LxjY2TAkSsmyaK6Kkflj8EfxwWPbyRGA8mw,11151
152
+ fin_infra/recurring/insights.py,sha256=-nNrXHUMnUXo7yvKktNAoUabK8XuJirL7ntVr7FAgEc,15921
153
153
  fin_infra/recurring/models.py,sha256=o0N8G-QhVb4zILEyry6M1VZ7liFJIOHwlejvn6p4K8M,8894
154
- fin_infra/recurring/normalizer.py,sha256=mihqV84Dd5AJ9JYU6KW3W8nH3TCU8FiKpPicipuClPM,9760
155
- fin_infra/recurring/normalizers.py,sha256=4DGy0RGHz5NameRpZC-QYbS2PkZc9UqjtjTuVQ_OJHA,15914
154
+ fin_infra/recurring/normalizer.py,sha256=sU4qCJ7_wVDugY0R0Td63Ol8asJNpMOHAPX92J9XJhY,9754
155
+ fin_infra/recurring/normalizers.py,sha256=1k1sbvWlo_wKn1luZgOVxcrDwRRZDul6X8sp_Pz_dkU,15970
156
156
  fin_infra/recurring/summary.py,sha256=wQshznaswIbGUPIMyayubRcRfUvVNBtyzmYx50-nqs0,14621
157
157
  fin_infra/scaffold/__init__.py,sha256=IfL_CHHMpQB1efqY37BlIu07356tLaeVI2Mv3C0qYDs,827
158
158
  fin_infra/scaffold/budgets.py,sha256=qLnyPh-a-ZrslstaxRtR__Bpwlz0EncSdVnCM7fDBI4,9481
159
- fin_infra/scaffold/goals.py,sha256=C1mexWRbWV3aRdmiT65LpKMMWzhTWTX_upeCcsjTcWw,9684
159
+ fin_infra/scaffold/goals.py,sha256=0iCUJI242sExlVttd1xb2HZCuAgzhKI_URrYnSfxrRg,9680
160
160
  fin_infra/security/__init__.py,sha256=wM341EZioKtfTawpFCciaFh0FlpHHkoEoviW9pGYqpI,1363
161
- fin_infra/security/add.py,sha256=Y_XXNd-FTpSaHmO4xkYvkW4CLlFGCuQWe9gJ7WuwiLY,2746
162
- fin_infra/security/audit.py,sha256=TekYWCOUT9Sf1sDS2-EEREtW7nhWo3H7iaLVbLPx308,3322
161
+ fin_infra/security/add.py,sha256=SIMBlSQ4FWCNiBfzgbzeVpRoo2JS3dqW-51uvq3hQU0,2715
162
+ fin_infra/security/audit.py,sha256=nb4H2Jq7XwalHLOx6LqleUtSXkBRz6u65LJ7lyuQNDo,3276
163
163
  fin_infra/security/encryption.py,sha256=Cr_9xhBiUvYx1tDjCiLTzyY9NRTlqljWGgswqXT499Y,6139
164
164
  fin_infra/security/models.py,sha256=s8dsvpxP-7DThUZl3Fvr3S6KVAfL5r3TKcd4uj_hCTE,1689
165
- fin_infra/security/pii_filter.py,sha256=nVqzbG_-Z6m8fzzS1KBy9yFwaZ8eRrU00Q72fSkVyU8,8307
165
+ fin_infra/security/pii_filter.py,sha256=DF95mSMkk8CTGAEYtEnR-CCoOIUwE7D-9voQ-Koa3j4,8297
166
166
  fin_infra/security/pii_patterns.py,sha256=SM-o7cL6NdgkOmtBedsN2nJZ5QPbeYehZdYmAujk8Y8,3070
167
- fin_infra/security/token_store.py,sha256=qgxhBKwhtVpchyHv30mM-cttuGZlzZvZLC4Oa-gTTeg,6075
167
+ fin_infra/security/token_store.py,sha256=FsfoAkIMQ2NRfkBuyG1eH30nnfO3w_V5tDPAZwUj9Os,6041
168
168
  fin_infra/settings.py,sha256=11JgIhjGwWnwixV-hveEWpoWd_JC0ixLnOQoLWCiwNo,1387
169
169
  fin_infra/tax/__init__.py,sha256=U0EUKQwbDqnAYwU8WRx6AD07TaB-ELdKGISOQ-904lw,6103
170
- fin_infra/tax/add.py,sha256=dYigcgQFEP38NLoNuhh7vpSoy07sWX6Z_DTp1tWFJXw,14553
171
- fin_infra/tax/tlh.py,sha256=3khtiEkGKIIHi2mbMM0ss-GKQ8vM3FS6hly8R00qseY,21482
172
- fin_infra/utils/__init__.py,sha256=gKacLSWMAis--pasd8AuVN7ap0e9Z1TjRGur0J23EDo,648
170
+ fin_infra/tax/add.py,sha256=d17Zuoi-xMjuJNykDHzQXnAUVzd_41BUMHQdqm23jJ8,14547
171
+ fin_infra/tax/tlh.py,sha256=rUglLeq09XxEbC2W7aJ9G0E8kj9g5QdG4ymSL4z8RK0,21477
172
+ fin_infra/utils/__init__.py,sha256=x_FUlv7FONdTPHwXTbPWY-EEOBwWnm-y8TPJ1W1PrXM,944
173
+ fin_infra/utils/deprecation.py,sha256=DTcqv7ECnrWOOwoA07JOnRci4Hqqo9YtKSSmoS-DVPY,5187
173
174
  fin_infra/utils/http.py,sha256=rDEgYsEBrEe75ml5RA-iSs3xeU5W-3j-czJlT7WbrM4,632
174
175
  fin_infra/utils/retry.py,sha256=YiyTgy26eJ1ah7fE2_-ZPa4hv4bIT4OzjYolkNWb5j0,1057
175
176
  fin_infra/version.py,sha256=4t_crzhrLum--oyowUMxtjBTzUtWp7oRTF22ewEvJG4,49
176
- fin_infra-0.1.82.dist-info/LICENSE,sha256=wK-Ya7Ylxa38dSIZRhvNj1ZVLIrHC-BAI8v38PNADiA,1061
177
- fin_infra-0.1.82.dist-info/METADATA,sha256=6_AV6KkKqn2mK3BeTZPspL56FmgxSJDoRprR-C6oayE,10479
178
- fin_infra-0.1.82.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
179
- fin_infra-0.1.82.dist-info/entry_points.txt,sha256=Sr1uikvALZMeKm-DIkeKG4L9c4SNqysXGO_IRF8_9eU,53
180
- fin_infra-0.1.82.dist-info/RECORD,,
177
+ fin_infra-0.4.0.dist-info/LICENSE,sha256=wK-Ya7Ylxa38dSIZRhvNj1ZVLIrHC-BAI8v38PNADiA,1061
178
+ fin_infra-0.4.0.dist-info/METADATA,sha256=uAW2RXczydyAk-heMq3BIzAIFUeD2aqdqdz3zGS8MYE,10842
179
+ fin_infra-0.4.0.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
180
+ fin_infra-0.4.0.dist-info/entry_points.txt,sha256=Sr1uikvALZMeKm-DIkeKG4L9c4SNqysXGO_IRF8_9eU,53
181
+ fin_infra-0.4.0.dist-info/RECORD,,