fin-infra 0.2.2__py3-none-any.whl → 0.3.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.
@@ -300,6 +300,8 @@ Return JSON with category, confidence, and reasoning."""
300
300
  def _get_cache_key(self, merchant_name: str) -> str:
301
301
  """Generate stable cache key from merchant name."""
302
302
  normalized = merchant_name.lower().strip()
303
+ # Security: B324 skip justified - MD5 used for cache key generation only,
304
+ # not for security. We need deterministic hashing for cache lookups.
303
305
  hash_value = hashlib.md5(normalized.encode()).hexdigest()
304
306
  return f"llm_category:{hash_value}"
305
307
 
@@ -352,6 +352,7 @@ class SubscriptionInsightsGenerator:
352
352
  import json
353
353
 
354
354
  subscriptions_json = json.dumps(subscriptions, sort_keys=True)
355
+ # Security: B324 skip justified - MD5 used for cache key generation only.
355
356
  hash_hex = hashlib.md5(subscriptions_json.encode()).hexdigest()
356
357
  return f"insights:{hash_hex}"
357
358
 
@@ -330,6 +330,7 @@ class MerchantNormalizer:
330
330
  Format: merchant_norm:{md5_hex}
331
331
  """
332
332
  normalized = merchant_name.lower().strip()
333
+ # Security: B324 skip justified - MD5 used for cache key generation only.
333
334
  hash_hex = hashlib.md5(normalized.encode()).hexdigest()
334
335
  return f"merchant_norm:{hash_hex}"
335
336
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: fin-infra
3
- Version: 0.2.2
3
+ Version: 0.3.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
@@ -33,7 +33,7 @@ fin_infra/categorization/__init__.py,sha256=p5uEFX0piPI5QmYtQ4lTrr0Cph5r01XpHDOi
33
33
  fin_infra/categorization/add.py,sha256=-I-V7R8vWj2-B8yjtFn_pNryQV5uascFR18a1Ltcqm0,6247
34
34
  fin_infra/categorization/ease.py,sha256=gvlVb_TL7kwm5oM_gWdrhZt4cJOSvYEgGipNJKK8CpM,5820
35
35
  fin_infra/categorization/engine.py,sha256=tZ-WTkPUUcKe6rDFoCSu5BF_gezcjJfx8Yn9eUX4lDQ,12114
36
- fin_infra/categorization/llm_layer.py,sha256=hCqTfF3LPy7xs_7wJgBbwG4hYkoY2TtRSs_XWyihHuI,12665
36
+ fin_infra/categorization/llm_layer.py,sha256=K3vn3Muf6VfsSDT-iRcKBJQyO-BSx8nfLQlK-UmBmG0,12824
37
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
@@ -149,10 +149,10 @@ fin_infra/recurring/add.py,sha256=l_VsqJNAs-s5VZ7WFA3wfXJtjib2eqBhMJofTYgDR2w,19
149
149
  fin_infra/recurring/detector.py,sha256=MCq_48V6o9Ig9lTTHM054KNh2I_udEjWBmV_iF361ac,20131
150
150
  fin_infra/recurring/detectors_llm.py,sha256=2EMBQTIHvmxJR6gqvhlg6VNj2-eDTJiJULMxTCZMnJw,11481
151
151
  fin_infra/recurring/ease.py,sha256=jaBFMul1LxjY2TAkSsmyaK6Kkflj8EfxwWPbyRGA8mw,11151
152
- fin_infra/recurring/insights.py,sha256=zHHcD7jEYJF39TI9-5LSgjh-zHhXjxuKfLyKI6SIA8Y,15839
152
+ fin_infra/recurring/insights.py,sha256=-nNrXHUMnUXo7yvKktNAoUabK8XuJirL7ntVr7FAgEc,15921
153
153
  fin_infra/recurring/models.py,sha256=o0N8G-QhVb4zILEyry6M1VZ7liFJIOHwlejvn6p4K8M,8894
154
154
  fin_infra/recurring/normalizer.py,sha256=sU4qCJ7_wVDugY0R0Td63Ol8asJNpMOHAPX92J9XJhY,9754
155
- fin_infra/recurring/normalizers.py,sha256=oGxCTDGUixORwXiC424wN5QYxTPdJu2rSrSG84QkVlA,15888
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
@@ -174,8 +174,8 @@ fin_infra/utils/deprecation.py,sha256=DTcqv7ECnrWOOwoA07JOnRci4Hqqo9YtKSSmoS-DVP
174
174
  fin_infra/utils/http.py,sha256=rDEgYsEBrEe75ml5RA-iSs3xeU5W-3j-czJlT7WbrM4,632
175
175
  fin_infra/utils/retry.py,sha256=YiyTgy26eJ1ah7fE2_-ZPa4hv4bIT4OzjYolkNWb5j0,1057
176
176
  fin_infra/version.py,sha256=4t_crzhrLum--oyowUMxtjBTzUtWp7oRTF22ewEvJG4,49
177
- fin_infra-0.2.2.dist-info/LICENSE,sha256=wK-Ya7Ylxa38dSIZRhvNj1ZVLIrHC-BAI8v38PNADiA,1061
178
- fin_infra-0.2.2.dist-info/METADATA,sha256=q4UDtFCwgUSeK3o93LDT5BeMK227AnqkQS_PaR7OZuE,10842
179
- fin_infra-0.2.2.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
180
- fin_infra-0.2.2.dist-info/entry_points.txt,sha256=Sr1uikvALZMeKm-DIkeKG4L9c4SNqysXGO_IRF8_9eU,53
181
- fin_infra-0.2.2.dist-info/RECORD,,
177
+ fin_infra-0.3.0.dist-info/LICENSE,sha256=wK-Ya7Ylxa38dSIZRhvNj1ZVLIrHC-BAI8v38PNADiA,1061
178
+ fin_infra-0.3.0.dist-info/METADATA,sha256=QRpFctfnsMzPnCg_62UNa6uw-L_0yx76FGzd72-XyA0,10842
179
+ fin_infra-0.3.0.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
180
+ fin_infra-0.3.0.dist-info/entry_points.txt,sha256=Sr1uikvALZMeKm-DIkeKG4L9c4SNqysXGO_IRF8_9eU,53
181
+ fin_infra-0.3.0.dist-info/RECORD,,