fin-infra 0.1.65__py3-none-any.whl → 0.1.67__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 (40) hide show
  1. fin_infra/analytics/cash_flow.py +6 -5
  2. fin_infra/analytics/portfolio.py +1 -2
  3. fin_infra/analytics/spending.py +6 -6
  4. fin_infra/banking/__init__.py +1 -1
  5. fin_infra/banking/utils.py +5 -6
  6. fin_infra/cashflows/__init__.py +6 -8
  7. fin_infra/categorization/engine.py +3 -3
  8. fin_infra/categorization/llm_layer.py +3 -4
  9. fin_infra/categorization/models.py +1 -1
  10. fin_infra/chat/__init__.py +6 -6
  11. fin_infra/chat/ease.py +1 -1
  12. fin_infra/compliance/__init__.py +0 -1
  13. fin_infra/crypto/insights.py +2 -4
  14. fin_infra/documents/add.py +1 -1
  15. fin_infra/insights/__init__.py +7 -7
  16. fin_infra/investments/__init__.py +1 -1
  17. fin_infra/investments/add.py +2 -3
  18. fin_infra/investments/models.py +100 -46
  19. fin_infra/investments/providers/plaid.py +2 -3
  20. fin_infra/investments/providers/snaptrade.py +2 -2
  21. fin_infra/markets/__init__.py +0 -4
  22. fin_infra/models/transactions.py +1 -1
  23. fin_infra/net_worth/add.py +8 -5
  24. fin_infra/net_worth/aggregator.py +5 -4
  25. fin_infra/net_worth/ease.py +1 -1
  26. fin_infra/net_worth/models.py +237 -116
  27. fin_infra/normalization/__init__.py +6 -6
  28. fin_infra/obs/classifier.py +2 -2
  29. fin_infra/providers/base.py +12 -17
  30. fin_infra/recurring/add.py +8 -8
  31. fin_infra/recurring/detectors_llm.py +9 -8
  32. fin_infra/recurring/ease.py +1 -1
  33. fin_infra/recurring/insights.py +8 -7
  34. fin_infra/recurring/models.py +3 -3
  35. fin_infra/recurring/normalizers.py +8 -7
  36. {fin_infra-0.1.65.dist-info → fin_infra-0.1.67.dist-info}/METADATA +1 -2
  37. {fin_infra-0.1.65.dist-info → fin_infra-0.1.67.dist-info}/RECORD +40 -40
  38. {fin_infra-0.1.65.dist-info → fin_infra-0.1.67.dist-info}/LICENSE +0 -0
  39. {fin_infra-0.1.65.dist-info → fin_infra-0.1.67.dist-info}/WHEEL +0 -0
  40. {fin_infra-0.1.65.dist-info → fin_infra-0.1.67.dist-info}/entry_points.txt +0 -0
@@ -20,9 +20,12 @@ from pydantic import BaseModel, ConfigDict, Field
20
20
 
21
21
  # Lazy import for optional dependency (ai-infra)
22
22
  try:
23
- from ai_infra.llm import LLM # type: ignore[attr-defined]
23
+ from ai_infra.llm import LLM
24
+
25
+ LLM_AVAILABLE = True
24
26
  except ImportError:
25
- LLM = None
27
+ LLM = None # type: ignore[misc,assignment]
28
+ LLM_AVAILABLE = False
26
29
 
27
30
  logger = logging.getLogger(__name__)
28
31
 
@@ -73,7 +76,7 @@ class VariableRecurringPattern(BaseModel):
73
76
  "example": {
74
77
  "is_recurring": True,
75
78
  "cadence": "monthly",
76
- "expected_range": (45.0, 60.0),
79
+ "expected_range": [45.0, 60.0],
77
80
  "reasoning": "Seasonal winter heating causes variance",
78
81
  "confidence": 0.85,
79
82
  }
@@ -278,12 +281,10 @@ class VariableDetectorLLM:
278
281
  )
279
282
 
280
283
  response = await self.llm.achat(
284
+ user_msg=user_prompt,
281
285
  provider=self.provider,
282
- model=self.model_name,
283
- messages=[
284
- {"role": "system", "content": VARIABLE_DETECTION_SYSTEM_PROMPT},
285
- {"role": "user", "content": user_prompt},
286
- ],
286
+ model_name=self.model_name,
287
+ system=VARIABLE_DETECTION_SYSTEM_PROMPT,
287
288
  output_schema=VariableRecurringPattern,
288
289
  output_method="prompt", # Cross-provider compatibility
289
290
  temperature=0.0, # Deterministic
@@ -200,7 +200,7 @@ def easy_recurring_detection(
200
200
  )
201
201
 
202
202
  # Validate config keys (reserved for future use)
203
- valid_config_keys = set() # Will expand in future versions
203
+ valid_config_keys: set[str] = set() # Will expand in future versions
204
204
  invalid_keys = set(config.keys()) - valid_config_keys
205
205
  if invalid_keys:
206
206
  raise ValueError(
@@ -21,9 +21,12 @@ from pydantic import BaseModel, ConfigDict, Field
21
21
 
22
22
  # Lazy import for optional dependency (ai-infra)
23
23
  try:
24
- from ai_infra.llm import LLM # type: ignore[attr-defined]
24
+ from ai_infra.llm import LLM
25
+
26
+ LLM_AVAILABLE = True
25
27
  except ImportError:
26
- LLM = None
28
+ LLM = None # type: ignore[misc,assignment]
29
+ LLM_AVAILABLE = False
27
30
 
28
31
  logger = logging.getLogger(__name__)
29
32
 
@@ -369,12 +372,10 @@ class SubscriptionInsightsGenerator:
369
372
  user_prompt = INSIGHTS_GENERATION_USER_PROMPT.format(subscriptions_json=subscriptions_json)
370
373
 
371
374
  response = await self.llm.achat(
375
+ user_msg=user_prompt,
372
376
  provider=self.provider,
373
- model=self.model_name,
374
- messages=[
375
- {"role": "system", "content": INSIGHTS_GENERATION_SYSTEM_PROMPT},
376
- {"role": "user", "content": user_prompt},
377
- ],
377
+ model_name=self.model_name,
378
+ system=INSIGHTS_GENERATION_SYSTEM_PROMPT,
378
379
  output_schema=SubscriptionInsights,
379
380
  output_method="prompt", # Cross-provider compatibility
380
381
  temperature=0.3, # Slight creativity for recommendations
@@ -228,9 +228,9 @@ class SubscriptionStats(BaseModel):
228
228
  "by_pattern_type": {"fixed": 12, "variable": 2, "irregular": 1},
229
229
  "by_cadence": {"monthly": 13, "quarterly": 1, "annual": 1},
230
230
  "top_merchants": [
231
- ("Netflix", 15.99),
232
- ("Spotify", 9.99),
233
- ("Amazon Prime", 14.99),
231
+ ["Netflix", 15.99],
232
+ ["Spotify", 9.99],
233
+ ["Amazon Prime", 14.99],
234
234
  ],
235
235
  "confidence_distribution": {
236
236
  "high (0.85-1.0)": 12,
@@ -22,9 +22,12 @@ from pydantic import BaseModel, ConfigDict, Field
22
22
 
23
23
  # Lazy import for optional dependency (ai-infra)
24
24
  try:
25
- from ai_infra.llm import LLM # type: ignore[attr-defined]
25
+ from ai_infra.llm import LLM
26
+
27
+ LLM_AVAILABLE = True
26
28
  except ImportError:
27
- LLM = None
29
+ LLM = None # type: ignore[misc,assignment]
30
+ LLM_AVAILABLE = False
28
31
 
29
32
  logger = logging.getLogger(__name__)
30
33
 
@@ -340,12 +343,10 @@ class MerchantNormalizer:
340
343
  user_prompt = MERCHANT_NORMALIZATION_USER_PROMPT.format(merchant_name=merchant_name)
341
344
 
342
345
  response = await self.llm.achat(
346
+ user_msg=user_prompt,
343
347
  provider=self.provider,
344
- model=self.model_name,
345
- messages=[
346
- {"role": "system", "content": MERCHANT_NORMALIZATION_SYSTEM_PROMPT},
347
- {"role": "user", "content": user_prompt},
348
- ],
348
+ model_name=self.model_name,
349
+ system=MERCHANT_NORMALIZATION_SYSTEM_PROMPT,
349
350
  output_schema=MerchantNormalized,
350
351
  output_method="prompt", # Cross-provider compatibility
351
352
  temperature=0.0, # Deterministic
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: fin-infra
3
- Version: 0.1.65
3
+ Version: 0.1.67
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
@@ -30,7 +30,6 @@ Requires-Dist: plaid-python (>=25.0.0)
30
30
  Requires-Dist: pydantic (>=2.0)
31
31
  Requires-Dist: pydantic-settings (>=2.0)
32
32
  Requires-Dist: python-dotenv (>=1.0.0)
33
- Requires-Dist: svc-infra (>=0.1.0)
34
33
  Requires-Dist: tenacity (>=8.0.0)
35
34
  Requires-Dist: typing-extensions (>=4.0)
36
35
  Requires-Dist: yahooquery (>=2.3.0)
@@ -2,18 +2,18 @@ fin_infra/__init__.py,sha256=5vcHN0u9CE43mnK2VgiMyWTiyANupUISawvxx-2AfqE,480
2
2
  fin_infra/__main__.py,sha256=1qNP7j0ffw0wFs1dBwDcJ9TNXlC6FcYuulzoV87pMi8,262
3
3
  fin_infra/analytics/__init__.py,sha256=aiuNnii0vc34XlNzrSiMbz33lzgmR7W1nHkmAEXavCY,1870
4
4
  fin_infra/analytics/add.py,sha256=a8ZcVc0-3gxq64IFs9fN7XVMayzE6RCCnBWV3zzc7GU,12832
5
- fin_infra/analytics/cash_flow.py,sha256=3ff2FEhQKVzhrKnCHPoH6QkzREcvYLi1tqj6vkRjxi8,10246
5
+ fin_infra/analytics/cash_flow.py,sha256=lH-J6RIUzcV9Fuy56i12N6vuIdPaGz-rhWquSgjkldU,10300
6
6
  fin_infra/analytics/ease.py,sha256=p8WwFP4ivvFsvZzYRCZZVHgnPThiODve9r4-m0xnxQQ,14343
7
7
  fin_infra/analytics/models.py,sha256=cK6VKLZ763zXfn9REXOnLGx0v3Q8bUa-vH8aoNs2w-A,8215
8
- fin_infra/analytics/portfolio.py,sha256=HvJ1kKve0MhyQ6VJbLFEuNnRCdoddu84dxLyLF9Xg3s,26511
8
+ fin_infra/analytics/portfolio.py,sha256=_-whS-jwLpkhwSPmZOSipilcY2oujSItsvTzVtUsEbM,26497
9
9
  fin_infra/analytics/projections.py,sha256=7cuG6w1KXq8sd3UNufu5aOcxG5n-foswrHqrgWWKQUM,9186
10
10
  fin_infra/analytics/rebalancing.py,sha256=K3S7KQiIU2LwyAwWN9VrSly4AOl24vN9tz_JX7I9FJ8,14642
11
11
  fin_infra/analytics/savings.py,sha256=tavIRZtu9FjCm-DeWg5f060GcsdgD-cl-vgKOnieOUw,7574
12
12
  fin_infra/analytics/scenarios.py,sha256=LE_dZVkbxxAx5sxitGhiOhZfWTlYtVbIvS9pEXkijLc,12246
13
- fin_infra/analytics/spending.py,sha256=-11Pm2E-UjuLfYWLD8wQFf5Xyk_0es1xmiedTsBj-Bc,26227
14
- fin_infra/banking/__init__.py,sha256=-Pn8YxpE_aOefFGL4bBmOogywNWShEV271CKxlrvTIM,22556
13
+ fin_infra/analytics/spending.py,sha256=pubio9mFpTyVrebLsMYTYPPrgQ1_ML8ostwFenC7nb4,26225
14
+ fin_infra/banking/__init__.py,sha256=6brdnsK6ddLhypk4h0sblM1yv6BkQ46Nyq8Zvf5AewY,22570
15
15
  fin_infra/banking/history.py,sha256=1ufAwkTnXr-QJetFzJl4xA2e3dqd1-TkT8pf46MNfho,10630
16
- fin_infra/banking/utils.py,sha256=B2ebnTeUz-56l8XMBWnf2txFOr0bXIo3cKPio7_bhc4,15711
16
+ fin_infra/banking/utils.py,sha256=qQRJR0jUWXzRTBSy9vMYC4h7APub7Jb2drJH10vtY40,15678
17
17
  fin_infra/brokerage/__init__.py,sha256=2Qmiubu9kxouidrCcIHOMvYGHEgVDD5y2S2XRBAWng8,17263
18
18
  fin_infra/budgets/__init__.py,sha256=V6euagDkFHvWyjHeI64fxfddhOHDlIWwOc-PnTyyQb4,3986
19
19
  fin_infra/budgets/add.py,sha256=tdfNXD9deEEzy0xCRbTwbx70SX9wiJkWj0Huk_uCjFg,13584
@@ -27,18 +27,18 @@ fin_infra/budgets/scaffold_templates/repository.py.tmpl,sha256=khFgnQnVNnOo8DWYD
27
27
  fin_infra/budgets/scaffold_templates/schemas.py.tmpl,sha256=x5gSQ7Kiuq08tum5joKmeY0ib2r3ekLKk09dFOl0PS0,5658
28
28
  fin_infra/budgets/templates.py,sha256=Sbc7RcHXscq34g4t7J8OXM2Kfkt5DHuvqVnFU0Jiddc,12112
29
29
  fin_infra/budgets/tracker.py,sha256=U8C7k2VV8bOjtjPIWR8qXktsBNSyBAUnE9o2mjEs1MU,16490
30
- fin_infra/cashflows/__init__.py,sha256=OEleZSwEHffxTvz0J52qqlkBwnu4BHbQUW0vKwzsWAs,8579
30
+ fin_infra/cashflows/__init__.py,sha256=zwuST5PYHJHXwfqKaKo19ubvD0T3lR54RVOvzjOCNPI,8521
31
31
  fin_infra/cashflows/core.py,sha256=Or0hPqCvY_ypV0YiMXh-mle6xWK0tE8WuPPAqHGUp8E,532
32
32
  fin_infra/categorization/__init__.py,sha256=efLje12AW-ec9Vs5ynb41r4XCIWx5a-Z9WoGb3kQdIE,2030
33
33
  fin_infra/categorization/add.py,sha256=JDOvxngh-7oWHTddOyP4GAse9vLuxSTfoIhrDKUHOKg,6278
34
34
  fin_infra/categorization/ease.py,sha256=oIcPVuxXOPaAhSe_OcfO4eumCg9WpfIZUdg-k-Xx800,5859
35
- fin_infra/categorization/engine.py,sha256=ZJm-V6I1okDSFQA34GFZCOTsLCztNtmHlbm2-r51mwQ,12108
36
- fin_infra/categorization/llm_layer.py,sha256=sOR3gtyPR4y58-5a_XW7U4GMwPsvBwaL_mtmaExC_zk,12787
37
- fin_infra/categorization/models.py,sha256=O8ceQOM0ljRh0jkmnjV7CK5Jyq1DI3lG07UTeeMheNg,5931
35
+ fin_infra/categorization/engine.py,sha256=Qk14HQQB6rBwEZ0cSz47l_jD4eFpWlSJzHg8kjC0KK8,12107
36
+ fin_infra/categorization/llm_layer.py,sha256=5QjDcvYzzqFMsjYe-izl7QEp_SCe_qJ7P5I5gLa0vf8,12699
37
+ fin_infra/categorization/models.py,sha256=-rGXR0RW2EU_FQ7ZfDWBIXxx8QGJDxeBF9zKGYyVgqY,5931
38
38
  fin_infra/categorization/rules.py,sha256=m3OogJY0hJe5BrmZqOvOKS2-HRdW4Y5jvvtlPDn9Pn8,12884
39
39
  fin_infra/categorization/taxonomy.py,sha256=qsgo7VJkM6GFBBOaTRHWP82vl5SinRKnMsj4ICarEyQ,13281
40
- fin_infra/chat/__init__.py,sha256=NsYyRxZGwUFvYEmoLfuTaAfBWn34KOKqeRi6_hSVgGE,6356
41
- fin_infra/chat/ease.py,sha256=b99CtKSe9UJqXPLqlqoUI0mI6bmxHVlbpdFq4K1oCGg,3143
40
+ fin_infra/chat/__init__.py,sha256=NENUXr0Gb39avrUI75g6Wi0GXQo8KhvxKTrcNHYo4vs,6328
41
+ fin_infra/chat/ease.py,sha256=8T0BQUkWQVpaTooD5-ZtinackkciqGargXnzWzayj3M,3113
42
42
  fin_infra/chat/planning.py,sha256=eKUW6VDHJS-xQTks7bgjNQaO32Fr5gA_oP5NLt2y5Zs,19916
43
43
  fin_infra/cli/__init__.py,sha256=7M8gKULnui4__9kXRKRHgETuFwZlacK9xrq5rSZ31CM,376
44
44
  fin_infra/cli/cmds/__init__.py,sha256=BvL3wRoUl3cO5wesv1Cqoatup7VeYMhq82tS19iNZHE,136
@@ -46,7 +46,7 @@ fin_infra/cli/cmds/scaffold_cmds.py,sha256=HZrnJ6NgTBYbt6LuJeoi7JKJgWE_umX9v7zjt
46
46
  fin_infra/clients/__init__.py,sha256=EiKkAW8WY5dWtu7DDmpf3DBNcjJArxcQnE_wTAtVRho,129
47
47
  fin_infra/clients/base.py,sha256=K5nI4GJzT36oUUYGynV3b4eywJdTTa5EX26QK7XdTcc,970
48
48
  fin_infra/clients/plaid.py,sha256=jwcLdQe0G7afLO5JH5jsBosE4iz_cFsb04I8_hCbIb0,807
49
- fin_infra/compliance/__init__.py,sha256=6agXxEA5GApSvYgFWNWJDcytGv-pxu0uxx8AG9qL_n0,5296
49
+ fin_infra/compliance/__init__.py,sha256=IpeFi0ztw619Etvq2ln6kYFVwr6OrcVX6W7n5Mh3Nf4,5222
50
50
  fin_infra/credit/__init__.py,sha256=cwCP_WlrG-0yb_L4zYsuzEsSalcfiCY9ItqXfD7Jx9E,6719
51
51
  fin_infra/credit/add.py,sha256=D3btx9pmZ3tF6AYC6P4Y3dYaUuWp7M3FpDrFksxi5uM,8553
52
52
  fin_infra/credit/experian/__init__.py,sha256=g3IJGvDOMsnB0er0Uwdvl6hGKKTOazqJxSDnB2oIBm0,761
@@ -56,9 +56,9 @@ fin_infra/credit/experian/parser.py,sha256=7ptdLyTWWqHWqCo1CXn6L7XaIn9ZRRuOaATbF
56
56
  fin_infra/credit/experian/provider.py,sha256=l3NW6dppgxeUkrThftH-IB43bwuZGhNcW0jVBGF8XGY,13783
57
57
  fin_infra/credit/mock.py,sha256=xKWZk3fhuIYRfiZkNc9fbHUNViNKjmOLSj0MTI1f4ik,5356
58
58
  fin_infra/crypto/__init__.py,sha256=HpplYEY8GiBz55ehYRDQxs8SWJIW1smBs9eFOKt_nzI,8318
59
- fin_infra/crypto/insights.py,sha256=2Q0QnpOC-nXJa8pYZmjNre6csz2peGbb5chN5-cipWI,11655
59
+ fin_infra/crypto/insights.py,sha256=BBC7SSxD6FJAXKPvOkC8KK4HNy7Gtzfn0egUx_wzVJM,11444
60
60
  fin_infra/documents/__init__.py,sha256=Ub1hbX3PTrBSsBdcbL8PFf6oq8jSH4pYxW45-qOYPqs,1909
61
- fin_infra/documents/add.py,sha256=ztSFCY42hfLLgUbXefxvf_AAbzaxJ6xpEZJpcHE8g7c,8133
61
+ fin_infra/documents/add.py,sha256=qvy_TWAHhSUjEnvKGgtDTEc8YbRx97cxXtpkc7pU5uc,8145
62
62
  fin_infra/documents/analysis.py,sha256=zY5OQEIlq3JLNND_cg2KheFdryUmIecPOR2lR6oKhPw,13992
63
63
  fin_infra/documents/ease.py,sha256=rnxEIMjf6vLvD-h5WD4wM6PwmcB4iUtAtnvGxbFA5zA,9625
64
64
  fin_infra/documents/models.py,sha256=5MK5Mvs7s6HfNuNldT4xxwLGV4z1f7vNJLwDD-jalgw,6889
@@ -76,23 +76,23 @@ fin_infra/goals/scaffold_templates/__init__.py,sha256=rLFam-mRsj8LvJu5kRBEIJtw9r
76
76
  fin_infra/goals/scaffold_templates/models.py.tmpl,sha256=b23Nlwm05MFMQE4qkrylTPXqulsN6cuFzNev2liY7DI,5714
77
77
  fin_infra/goals/scaffold_templates/repository.py.tmpl,sha256=4BFy-fPBR412p8wb8VzsekxM3uGno-odqZP_BuMAXBU,11046
78
78
  fin_infra/goals/scaffold_templates/schemas.py.tmpl,sha256=M1hS1pK9UDXcNqPW-NGu9804hTFe4FPdUDVgDSMcQl4,5331
79
- fin_infra/insights/__init__.py,sha256=crIXNlztTCcYHNcEVMo8FwCTCUBwIK2wovb4HahzRYw,3988
79
+ fin_infra/insights/__init__.py,sha256=3rQvgC6a-4Nh_mv3HbS1bIN0Hc7IgRNncM0BVGo21NA,3959
80
80
  fin_infra/insights/aggregator.py,sha256=XG32mN5w5Nc4AZllmfl1esL4q44mFAf0Fvj9mWev_zk,10249
81
81
  fin_infra/insights/models.py,sha256=xov_YV8oBLJt3YdyVjbryRfcXqmGeGiPvZsZHSbvtl8,3202
82
- fin_infra/investments/__init__.py,sha256=mDHYMLSo14KByrpW9HuxIDFBdfEESZ6tFKC09Vr_aIE,6786
83
- fin_infra/investments/add.py,sha256=3cbjXbWoTuDglwk9U48X6768Etv1XLTWysdDPgsn7Yg,17658
82
+ fin_infra/investments/__init__.py,sha256=5B7m5gp9WRJHOzelYn29B4edDKIl_ZwN0kYiJ6c9LiA,6758
83
+ fin_infra/investments/add.py,sha256=lC2oK6TnJN0wbw7j5k4AKKuV1bQwi67PHG5u2PwUkNw,17560
84
84
  fin_infra/investments/ease.py,sha256=7oyMcTVmnc8pn3lqriLRruBLEznI_grpDkH7hfXmGhE,9527
85
- fin_infra/investments/models.py,sha256=KwGLw8jdgX5tw4zZjBWBEKNqKsMo3hJnmsx5hIV-rQU,16032
85
+ fin_infra/investments/models.py,sha256=_ltCQNfQ8b34ywJvheEUhmXH-gSVwCGbmZlsaNNbznE,18305
86
86
  fin_infra/investments/providers/__init__.py,sha256=V1eIzz6EnGJ-pq-9L3S2-evmcExF-YdZfd5P6JMyDtc,383
87
87
  fin_infra/investments/providers/base.py,sha256=KaJdIdeWi2WaWAogcFZw7jcqQ_IzMZw6misBNk-n6bE,9890
88
- fin_infra/investments/providers/plaid.py,sha256=2WqXwPVckIc56dx9BleC10z-WHDt7y1dO1xhsI_8kT4,18108
89
- fin_infra/investments/providers/snaptrade.py,sha256=ILpup62u5zCOgnQ_4RF1_m2BY7qowyINB-FUgq-jUrI,23542
88
+ fin_infra/investments/providers/plaid.py,sha256=9alF6vQs41CO5D75anumhMzzBbQ_E3s1DzMMwHD9igc,18109
89
+ fin_infra/investments/providers/snaptrade.py,sha256=gK4BMqMqqxFJWCyBNBdd5cllRTruVA_xvgZz4rWgxrM,23556
90
90
  fin_infra/investments/scaffold_templates/README.md,sha256=PhgxfMLrro2Jz83b7XEnBi7lexiWKqlMrd2UU2Rbs8A,12149
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=S6vaHI5T3NnP_Kwf5bym7P0lFUhewqmXKh6sEPbaBRs,9892
95
+ fin_infra/markets/__init__.py,sha256=BKyJsqA0Da3L9KOgnOXYXq4LTgTMggD6KU-Sa7nFf24,9786
96
96
  fin_infra/models/__init__.py,sha256=q3SkGzDGFkoAMxwqJw8i4cHWt5NGU5ypjOgntxDGVKo,860
97
97
  fin_infra/models/accounts.py,sha256=PeobjGg6WM70OvOTe0JIo0zo7tBM0PDAcyClQT-Jo4o,1141
98
98
  fin_infra/models/brokerage.py,sha256=z6Zyf0N5zmmXtrN2y_4fNmtIP5wNq40H8lrHLBwY7rc,8311
@@ -101,21 +101,21 @@ fin_infra/models/credit.py,sha256=rSdSURsMe9_i2gxmwPTDwNQWOuM2zutL-OhvHsnbtmw,12
101
101
  fin_infra/models/money.py,sha256=5BX8IQZkrNtjjnGIQAK2tyKnVim0R-yc1F_EBxUhcr0,400
102
102
  fin_infra/models/quotes.py,sha256=_2cDJS8_RLo4tLpJlqWd32J8uFNP0bbf1V_0u3NuLwo,543
103
103
  fin_infra/models/tax.py,sha256=lhNVIW650CdtpfgmSyMMJdojV7QnpHOUFQKiwMLTT4A,15656
104
- fin_infra/models/transactions.py,sha256=zlu7Ath91ZmqQWKn8Bd_iV_XreWTDXFWJyfTTZ3J-ss,828
104
+ fin_infra/models/transactions.py,sha256=-tLG9bYGRrV_ixaNmiJU0bf9BgngIRE7T6MD88r9rtA,868
105
105
  fin_infra/net_worth/__init__.py,sha256=EjEuHNg8gEfFwbfko1-o5j-gSUZ2FcO9h7l05C-zAJM,3101
106
- fin_infra/net_worth/add.py,sha256=5xYy2L5hEEPiQNF79i-ArWVztLXk2XM97DoZYNWGAz8,23100
107
- fin_infra/net_worth/aggregator.py,sha256=grif-N8qk77L_JQ4IlcOJaKKP1qpxel0lIV_ll3HgjI,12646
106
+ fin_infra/net_worth/add.py,sha256=QWfHIHJs2CV99WRBqjQ2OteiOrn5cR9nurmxTF9v5rg,23191
107
+ fin_infra/net_worth/aggregator.py,sha256=3iZGPE3AlS2Za90Mnw9XfKa2-BmCWLKkTUmDLztP9EQ,12779
108
108
  fin_infra/net_worth/calculator.py,sha256=JERDtZyFurw5x2NYqfHvJzv6qigamI3AFfR-wesTj_E,13133
109
- fin_infra/net_worth/ease.py,sha256=n1YI5rEmh48homMJvJMETCbcnICVE5myOnd1OZDJgiY,15920
109
+ fin_infra/net_worth/ease.py,sha256=gioKs6uwatOXKubWtyLsg8W0bXDP9DwhBEGyzwhuj2k,15890
110
110
  fin_infra/net_worth/goals.py,sha256=BJGxdsMjvgQDELFEJo-ai3DvsAzUNXvzMXkwovHr8yQ,1238
111
111
  fin_infra/net_worth/insights.py,sha256=vVK4BtfHNJGb1wyk9XD0fLpoadATTdorF8OxHOgD9b0,25222
112
- fin_infra/net_worth/models.py,sha256=A5idGtMEQy1J4jaLMq9ZZslmvOhxfkW7cjLKW23AMQo,22403
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=foCru-Nf9M1zP1jdrT0oNazzmp6AWiaDbUDoiyJefvA,6252
118
+ fin_infra/normalization/__init__.py,sha256=npvKMnCCAhbuPZAskN8PBIiq89MIU2FNpVxuOGG0DlY,6224
119
119
  fin_infra/normalization/currency_converter.py,sha256=uuu8ASa5ppEniWLEVEpiDxXjZzln9nopWrhrATcD6Z4,7058
120
120
  fin_infra/normalization/models.py,sha256=gNC9chpbQPRN58V2j__VEPVNReO1N8jH_AHObwGPWu0,1928
121
121
  fin_infra/normalization/providers/__init__.py,sha256=LFU1tB2hVO42Yrkw-IDpPexD4mIlxob9lRrJEeGYqpE,559
@@ -123,12 +123,12 @@ fin_infra/normalization/providers/exchangerate.py,sha256=vA1W2yVpCf89kOx6lctbHOQ
123
123
  fin_infra/normalization/providers/static_mappings.py,sha256=m14VHmTZipbqrgyE0ABToabVx-pDcyB577LNWrACEUM,6809
124
124
  fin_infra/normalization/symbol_resolver.py,sha256=M7Li7LFiH4xpvxXcYQlJyk0iqgqpwaj6zQKsTzWZzas,8130
125
125
  fin_infra/obs/__init__.py,sha256=kMMVl0fdwtJtZeKiusTuw0iO61Jo9-HNXsLmn3ffLRE,631
126
- fin_infra/obs/classifier.py,sha256=qZHgUV6J2sXdOhHCPOxmonyvE4V1vY-A5MDwFpzk2lk,5136
126
+ fin_infra/obs/classifier.py,sha256=FEwL1lEV_f9bFBr36PaZsV4DxU3spwIXPoegwBgzSMc,5146
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=21m6ZkovwXuUuj0-dgQVDLxSfxZVjhuXj8di_-q3jGc,6617
130
130
  fin_infra/providers/banking/teller_client.py,sha256=QmrsBlk3_rHT-pTQPrIAA74kjIjcgdi-gOb8NA3oBO8,10268
131
- fin_infra/providers/base.py,sha256=zQBiIPYrWELl65bvekAsl7WnuUYHAkM96cYmKQYTb3U,6857
131
+ fin_infra/providers/base.py,sha256=_Ez3WFGY4TwWks2juqt0yv2lR6VQxdIl3mh4z8I2kY0,6698
132
132
  fin_infra/providers/brokerage/alpaca.py,sha256=wRVfVmExiYXCk1pLRmHSrfo91714JIm3rrD0djrNfT8,9938
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
@@ -145,14 +145,14 @@ fin_infra/providers/tax/mock.py,sha256=AxI3RmEn3exdQeeUNkQYqZ-war5PS--WnLGXfRRee
145
145
  fin_infra/providers/tax/taxbit.py,sha256=DEA7vgQPYMjz4ZdC0DpY7112FLZJ2kvwgAbDZnpHFy0,4271
146
146
  fin_infra/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
147
147
  fin_infra/recurring/__init__.py,sha256=ihMPywft8pGqzMu6EXxbQCU7ByoMl_dvad00gWV1mnk,2308
148
- fin_infra/recurring/add.py,sha256=bPAVHknGoTLqk3T4vGZw1ROiFGHvASSakafGGmMlL9k,18917
148
+ fin_infra/recurring/add.py,sha256=cW1mqNwTWR8IUX3GIEeD-aLHnulorCqwG4H7iGvUJI4,19050
149
149
  fin_infra/recurring/detector.py,sha256=1e6PRoBAT2NxoGAgcVHAWwpPtznkJMaYSrJtvSq0YqM,20154
150
- fin_infra/recurring/detectors_llm.py,sha256=jCW7xXaFRISnsCYDgvyiovXThNceVK_ypWYEawUfE78,11534
151
- fin_infra/recurring/ease.py,sha256=OrpxGHi8kt6LkMmww5l0Xy2pU-5hP_dR4IgdOiaIRaU,11179
152
- fin_infra/recurring/insights.py,sha256=bpZGPZiCgrPK0Nr24QS3jc1F9sCldm6Jd5t-i6wbu7M,15916
153
- fin_infra/recurring/models.py,sha256=N4G_LM0xZr3ptHtlqOmcsw3AL2v9g7IX92SmBljkNek,8894
150
+ fin_infra/recurring/detectors_llm.py,sha256=YNG3GOvto8ua9yNacmejYcDOHZzN9UUpDtRdrzDsLSY,11504
151
+ fin_infra/recurring/ease.py,sha256=Vsg_AnTLjb5QXfFjijH2C50Or9hJGIVLtczk0U71h74,11189
152
+ fin_infra/recurring/insights.py,sha256=a4fhASyiNQTdUl2ijaxi2HqhWDhf-aJND2c62d9lgEo,15886
153
+ fin_infra/recurring/models.py,sha256=o0N8G-QhVb4zILEyry6M1VZ7liFJIOHwlejvn6p4K8M,8894
154
154
  fin_infra/recurring/normalizer.py,sha256=Rc1ntIDGir6X-I5lgv49kdLry_zHGJ8cys_Jf3F6Lhk,9761
155
- fin_infra/recurring/normalizers.py,sha256=9by3lF7EVkCWy_-rLiEKpgw-qJWzEiDOKUMscFx8hmI,15958
155
+ fin_infra/recurring/normalizers.py,sha256=37-ER4deeJhywrNVEe9KteecC_eH7xesTl2CWhRbdi0,15928
156
156
  fin_infra/recurring/summary.py,sha256=1Wte58ZZkEFulkb-nnpwfC5h7C_JrqByy47itdVdWwc,14665
157
157
  fin_infra/scaffold/__init__.py,sha256=OyD8ZtIC4eNTHqD16rbpT8KU0TpZUI6VV4xne4vpaHg,831
158
158
  fin_infra/scaffold/budgets.py,sha256=XXOLlEcyBXVwdbJB__qObRXJ0oe1okwDT_-5tG8c9Yk,9515
@@ -173,8 +173,8 @@ fin_infra/utils/__init__.py,sha256=gKacLSWMAis--pasd8AuVN7ap0e9Z1TjRGur0J23EDo,6
173
173
  fin_infra/utils/http.py,sha256=pvcxbNQ9oisoGPkNe3xX9aAgWzEN6mmdtr1w-L02Xj8,629
174
174
  fin_infra/utils/retry.py,sha256=ISBrup5XCuXqHZh9kjTGvGQYcuyYyqZE4u26wW7r3CM,1030
175
175
  fin_infra/version.py,sha256=4t_crzhrLum--oyowUMxtjBTzUtWp7oRTF22ewEvJG4,49
176
- fin_infra-0.1.65.dist-info/LICENSE,sha256=wK-Ya7Ylxa38dSIZRhvNj1ZVLIrHC-BAI8v38PNADiA,1061
177
- fin_infra-0.1.65.dist-info/METADATA,sha256=qOIl3r1vojckM7SamBAKGx-kTPqhqfp5Pji27lxINsk,10218
178
- fin_infra-0.1.65.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
179
- fin_infra-0.1.65.dist-info/entry_points.txt,sha256=Sr1uikvALZMeKm-DIkeKG4L9c4SNqysXGO_IRF8_9eU,53
180
- fin_infra-0.1.65.dist-info/RECORD,,
176
+ fin_infra-0.1.67.dist-info/LICENSE,sha256=wK-Ya7Ylxa38dSIZRhvNj1ZVLIrHC-BAI8v38PNADiA,1061
177
+ fin_infra-0.1.67.dist-info/METADATA,sha256=rLRLOO3W23-NmLTScjmv7yPD49BxzoyRkc3bQ5ApJNU,10183
178
+ fin_infra-0.1.67.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
179
+ fin_infra-0.1.67.dist-info/entry_points.txt,sha256=Sr1uikvALZMeKm-DIkeKG4L9c4SNqysXGO_IRF8_9eU,53
180
+ fin_infra-0.1.67.dist-info/RECORD,,