sourcecode 1.54.0__py3-none-any.whl → 1.56.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.
sourcecode/__init__.py CHANGED
@@ -1,3 +1,3 @@
1
1
  """sourcecode — Deterministic codebase context maps for AI coding agents."""
2
2
 
3
- __version__ = "1.54.0"
3
+ __version__ = "1.56.0"
@@ -634,11 +634,13 @@ def _find_symbol_files(
634
634
  try:
635
635
  result = subprocess.run(
636
636
  [
637
- "grep", "-rl",
637
+ "grep", "-rlF",
638
638
  "--include=*.ts", "--include=*.tsx",
639
639
  "--include=*.js", "--include=*.jsx",
640
640
  "--include=*.py", "--include=*.java",
641
- symbol, ".",
641
+ # -e guards a symbol that begins with '-' from being parsed as a
642
+ # flag; -- terminates options so the search root can't be either.
643
+ "-e", symbol, "--", ".",
642
644
  ],
643
645
  cwd=str(root),
644
646
  capture_output=True,
sourcecode/license.py CHANGED
@@ -45,7 +45,33 @@ _DEFAULT_SUPABASE_URL: str = "https://qkndlmyekvujjdgthtmz.supabase.co"
45
45
  # Paste your project's anon key here so `sourcecode activate` works out of the
46
46
  # box; env var still overrides for testing against another project.
47
47
  _DEFAULT_SUPABASE_ANON_KEY: str = "sb_publishable_qiJFLWjbBbTqjg-fb0mAGA_cl8PBOKH"
48
- _SUPABASE_URL: str = os.environ.get("SOURCECODE_SUPABASE_URL", _DEFAULT_SUPABASE_URL)
48
+ def _safe_supabase_url(override: "Optional[str]") -> str:
49
+ """Validate the SOURCECODE_SUPABASE_URL override before trusting it.
50
+
51
+ The license key is POSTed to this host, so a plaintext ``http://`` endpoint
52
+ would expose the credential on the wire. Allow ``https://`` to any host, and
53
+ ``http://`` only to loopback (Supabase local dev serves on
54
+ ``http://127.0.0.1:54321``). Anything else is rejected back to the default.
55
+ """
56
+ if not override or override == _DEFAULT_SUPABASE_URL:
57
+ return _DEFAULT_SUPABASE_URL
58
+ from urllib.parse import urlparse
59
+
60
+ parsed = urlparse(override)
61
+ host = (parsed.hostname or "").lower()
62
+ is_loopback = host in {"localhost", "127.0.0.1", "::1"}
63
+ if parsed.scheme == "https" or (parsed.scheme == "http" and is_loopback):
64
+ return override
65
+ sys.stderr.write(
66
+ f"[sourcecode] WARNING: ignoring SOURCECODE_SUPABASE_URL={override!r} — "
67
+ "must be https:// (or http:// to localhost). Using the default endpoint "
68
+ "to avoid sending the license key over plaintext.\n"
69
+ )
70
+ sys.stderr.flush()
71
+ return _DEFAULT_SUPABASE_URL
72
+
73
+
74
+ _SUPABASE_URL: str = _safe_supabase_url(os.environ.get("SOURCECODE_SUPABASE_URL"))
49
75
  _SUPABASE_ANON_KEY: str = os.environ.get(
50
76
  "SOURCECODE_SUPABASE_ANON_KEY",
51
77
  _DEFAULT_SUPABASE_ANON_KEY,
@@ -152,12 +178,35 @@ _license_data: Optional[dict] = None
152
178
  is_pro: bool = False
153
179
 
154
180
 
181
+ def _secure_dir() -> None:
182
+ """Create ~/.sourcecode owner-only (0700). Holds the license secret.
183
+
184
+ ``mkdir(mode=...)`` is ignored when the dir already exists, so chmod
185
+ unconditionally. Best-effort: a chmod failure (e.g. Windows) is non-fatal.
186
+ """
187
+ try:
188
+ _LICENSE_DIR.mkdir(parents=True, exist_ok=True)
189
+ os.chmod(_LICENSE_DIR, 0o700)
190
+ except OSError:
191
+ pass
192
+
193
+
155
194
  def _write_license_file(data: dict) -> None:
156
- """Atomically write license data via tmp file + rename."""
195
+ """Atomically write license data via tmp file + rename, owner-only (0600).
196
+
197
+ The payload contains the Pro ``license_key`` and account email, so the file
198
+ must not be world/group-readable on shared hosts. Permissions are set on the
199
+ tmp file *before* the rename so there is no readable window at the final path.
200
+ """
201
+ _secure_dir()
157
202
  payload = json.dumps(data, indent=2, ensure_ascii=False).encode("utf-8")
158
203
  tmp = _LICENSE_FILE.with_suffix(".tmp")
159
204
  try:
160
205
  tmp.write_bytes(payload)
206
+ try:
207
+ os.chmod(tmp, 0o600)
208
+ except OSError:
209
+ pass
161
210
  tmp.replace(_LICENSE_FILE)
162
211
  except Exception:
163
212
  try:
@@ -192,7 +241,7 @@ def check_delta_free_tier(repo_path: str) -> "tuple[bool, int, int]":
192
241
  new_used = used + 1
193
242
  runs[key] = new_used
194
243
  try:
195
- _LICENSE_DIR.mkdir(parents=True, exist_ok=True)
244
+ _secure_dir()
196
245
  tmp = _DELTA_RUNS_FILE.with_suffix(".tmp")
197
246
  tmp.write_text(json.dumps(runs, indent=2, ensure_ascii=False), encoding="utf-8")
198
247
  tmp.replace(_DELTA_RUNS_FILE)
@@ -506,7 +555,7 @@ def activate_license(license_key: str) -> None:
506
555
  _emit_telemetry("activation", feature="key", success=False, error_kind="NotPro")
507
556
  _fail("not_pro", "This license is not a Pro license.")
508
557
 
509
- _LICENSE_DIR.mkdir(parents=True, exist_ok=True)
558
+ _secure_dir()
510
559
  now = datetime.now(timezone.utc).isoformat()
511
560
  data = {
512
561
  "license_key": license_key,
@@ -182,6 +182,25 @@ _INERT_MARKER_SUPERTYPES = frozenset({
182
182
  "Externalizable", "java.io.Externalizable",
183
183
  })
184
184
 
185
+ # Concrete JDK base classes extended for implementation reuse, NOT framework-DI
186
+ # interfaces. `class Foo extends ArrayList` is code reuse, not polymorphic wiring,
187
+ # and consumers that merely hold an ArrayList/InputStream field are not callers of
188
+ # Foo. Validated on BroadleafCommerce: without this, CH-007 mis-recovered consumers
189
+ # of ArrayList/Stack/InputStream as callers of EmptyFilterValues/IdentityUtilContext/
190
+ # ResourceInputStream. Simple-name match (the external type is, by definition, not in-repo).
191
+ _NON_DI_SUPERTYPES = frozenset({
192
+ # java.util containers
193
+ "ArrayList", "LinkedList", "Vector", "Stack", "HashMap", "LinkedHashMap",
194
+ "TreeMap", "HashSet", "LinkedHashSet", "TreeSet", "ArrayDeque", "Properties",
195
+ "AbstractList", "AbstractMap", "AbstractSet", "AbstractCollection", "EnumMap",
196
+ # java.io / java.nio streams + readers
197
+ "InputStream", "OutputStream", "Reader", "Writer", "FilterInputStream",
198
+ "FilterOutputStream", "ByteArrayInputStream", "ByteArrayOutputStream",
199
+ # java.lang base classes
200
+ "Object", "Thread", "Throwable", "Exception", "RuntimeException", "Error",
201
+ "Number", "Enum", "ClassLoader", "ThreadLocal",
202
+ })
203
+
185
204
 
186
205
  def _external_supertypes(cir, class_fqn: str) -> list[str]:
187
206
  """Return supertypes of class_fqn that are NOT in-repo symbols.
@@ -212,6 +231,8 @@ def _external_supertypes(cir, class_fqn: str) -> list[str]:
212
231
  simple = to.rsplit(".", 1)[1] if "." in to else to
213
232
  if simple in _INERT_MARKER_SUPERTYPES or to in _INERT_MARKER_SUPERTYPES:
214
233
  continue
234
+ if simple in _NON_DI_SUPERTYPES:
235
+ continue # concrete JDK base extended for reuse, not DI dispatch
215
236
  # Internal if it resolves to exactly one in-repo class (exact or simple-name).
216
237
  if to in known:
217
238
  continue
@@ -246,6 +267,51 @@ def _is_unmodeled_value_type(cir, class_fqn: str, model) -> bool:
246
267
  return True
247
268
 
248
269
 
270
+ # CH-007 — external-interface DI bridge (caller recovery)
271
+ # ---------------------------------------------------------------------------
272
+ # When a class is reachable only through an external interface it implements
273
+ # (the CH-005 blind spot), its consumers inject/reference the *external* type,
274
+ # never the impl — so no reverse-graph edge names the impl and CH-001b (in-repo
275
+ # interface expansion) cannot bridge. The wiring sites are still in-repo, though:
276
+ # the raw dependency edges record `<consumer> -[injects|calls|instantiates|returns]->
277
+ # <external interface>`. Read those to recover the consumer classes, and count how
278
+ # many in-repo classes implement/extend each external supertype: exactly one means
279
+ # the binding is unambiguous (this impl IS the injected bean); several means any
280
+ # could be, so recover all candidates and flag the ambiguity rather than assert.
281
+ _DI_USE_EDGE_TYPES = frozenset({"injects", "calls", "instantiates", "returns"})
282
+
283
+
284
+ def _recover_external_iface_callers(
285
+ cir, external_supertypes: list[str], impl_class_fqn: str
286
+ ) -> tuple[list[str], int]:
287
+ """Recover in-repo wiring/consumer classes for an impl wired via an external
288
+ interface (CH-007). See module note above.
289
+
290
+ Returns ``(recovered_caller_classes, max_impl_count)`` where max_impl_count is
291
+ the largest number of in-repo implementors across the matched supertypes — 1
292
+ means the impl→bean binding is unambiguous, >1 means it is not.
293
+ """
294
+ deps = getattr(cir, "dependencies", None) or []
295
+ ext = set(external_supertypes)
296
+ if not ext:
297
+ return [], 0
298
+ recovered: list[str] = []
299
+ impl_count: dict[str, int] = {e: 0 for e in ext}
300
+ for edge in deps:
301
+ to = (edge.get("to") or "").strip()
302
+ if to not in ext:
303
+ continue
304
+ et = edge.get("type")
305
+ if et in ("implements", "extends"):
306
+ impl_count[to] = impl_count.get(to, 0) + 1
307
+ elif et in _DI_USE_EDGE_TYPES:
308
+ owner = normalize_owner_fqn((edge.get("from") or "").strip())
309
+ if owner and owner != impl_class_fqn:
310
+ recovered.append(owner)
311
+ max_impl = max(impl_count.values()) if impl_count else 0
312
+ return list(dict.fromkeys(recovered)), max_impl
313
+
314
+
249
315
  # ---------------------------------------------------------------------------
250
316
  # Symbol resolution
251
317
  # ---------------------------------------------------------------------------
@@ -846,7 +912,57 @@ class ImpactOrchestrator:
846
912
  if empty_blast and class_level_seed:
847
913
  external_supertypes = _external_supertypes(cir, resolved_symbol)
848
914
  framework_di_blind_spot = bool(external_supertypes)
915
+
916
+ # CH-007: external-interface DI bridge. Before treating the empty result as a
917
+ # blind spot, recover the in-repo wiring/consumer classes that inject the
918
+ # external supertype (they never name this impl, so the BFS missed them).
919
+ di_recovered_callers: list[str] = []
920
+ di_binding_ambiguous = False
849
921
  if framework_di_blind_spot:
922
+ di_recovered_callers, _max_impl = _recover_external_iface_callers(
923
+ cir, external_supertypes, resolved_symbol
924
+ )
925
+ di_binding_ambiguous = _max_impl > 1
926
+ # Keep only genuinely new caller classes (not seeds / already found).
927
+ _known = set(seed_fqns) | set(direct_callers) | set(indirect_callers)
928
+ di_recovered_callers = [c for c in di_recovered_callers if c not in _known]
929
+
930
+ di_recovered = bool(di_recovered_callers)
931
+ if di_recovered:
932
+ # Merge recovered wiring sites into the chain and recompute the views
933
+ # that depend on the caller set (endpoints, findings, surfaces, risk).
934
+ direct_callers = direct_callers + di_recovered_callers
935
+ empty_blast = False
936
+ all_callers = direct_callers + indirect_callers
937
+ endpoints_affected = _collect_endpoints(all_callers, seed_fqns, model)
938
+ impact_findings_raw = _filter_findings(
939
+ all_findings, seed_fqns, direct_callers, indirect_callers, endpoints_affected
940
+ )
941
+ impact_findings_raw.sort(
942
+ key=lambda f: (SEVERITY_ORDER.get(f.severity, 9), f.symbol)
943
+ )
944
+ impact_findings = [f.to_dict() for f in impact_findings_raw]
945
+ security_surfaces = _build_security_surfaces(endpoints_affected, impact_findings_raw)
946
+ risk_level, risk_score = _compute_risk(
947
+ len(direct_callers), len(indirect_callers),
948
+ len(endpoints_affected), impact_findings_raw,
949
+ )
950
+ _ambig = (
951
+ " Binding is ambiguous (the external type has multiple in-repo "
952
+ "implementors); the recovered caller(s) wire one of them — verify "
953
+ "which bean is configured." if di_binding_ambiguous else ""
954
+ )
955
+ warnings.append(
956
+ f"External-interface DI bridge (CH-007): recovered "
957
+ f"{len(di_recovered_callers)} in-repo wiring/consumer class(es) that "
958
+ "inject the external supertype(s) [" + ", ".join(external_supertypes)
959
+ + "] this class implements. These callers reference the interface, not "
960
+ "this class directly, so the static call-graph missed them. They reach "
961
+ "this class only if it is the bean configured for that interface — the "
962
+ "interface may also have framework/third-party implementations; verify "
963
+ "the wiring." + _ambig
964
+ )
965
+ elif framework_di_blind_spot:
850
966
  warnings.append(
851
967
  "Framework/external-interface DI blind spot (CH-005): this class "
852
968
  "implements/extends external type(s) [" + ", ".join(external_supertypes)
@@ -900,6 +1016,10 @@ class ImpactOrchestrator:
900
1016
  confidence: str
901
1017
  if resolution == "not_found":
902
1018
  confidence = "low"
1019
+ elif di_recovered:
1020
+ # Callers recovered structurally via the external-interface DI bridge.
1021
+ # Unambiguous binding (single in-repo impl) → medium; ambiguous → low.
1022
+ confidence = "low" if di_binding_ambiguous else "medium"
903
1023
  elif framework_di_blind_spot or value_type_blind_spot or unresolved_ref_blind_spot:
904
1024
  confidence = "low"
905
1025
  elif resolution == "partial" or confidence_reducing:
@@ -931,11 +1051,14 @@ class ImpactOrchestrator:
931
1051
  "model_build_time_ms": model.build_time_ms,
932
1052
  "query_time_ms": elapsed_ms,
933
1053
  "blind_spots": (
934
- (["framework_di"] if framework_di_blind_spot else [])
1054
+ # framework_di stops being a blind spot once CH-007 recovers callers
1055
+ (["framework_di"] if framework_di_blind_spot and not di_recovered else [])
935
1056
  + (["value_type"] if value_type_blind_spot else [])
936
1057
  + (["unresolved_refs"] if unresolved_ref_blind_spot else [])
937
1058
  ),
938
1059
  "external_supertypes": external_supertypes,
1060
+ "external_iface_callers_recovered": len(di_recovered_callers),
1061
+ "external_iface_binding_ambiguous": di_binding_ambiguous,
939
1062
  },
940
1063
  )
941
1064
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sourcecode
3
- Version: 1.54.0
3
+ Version: 1.56.0
4
4
  Summary: Persistent structural context and ultra-fast repeated analysis for AI coding agents
5
5
  License-File: LICENSE
6
6
  Keywords: agents,ai,codebase,context,developer-tools,llm
@@ -40,7 +40,7 @@ Description-Content-Type: text/markdown
40
40
 
41
41
  **Persistent structural context and ultra-fast repeated analysis for AI coding agents.**
42
42
 
43
- ![Version](https://img.shields.io/badge/version-1.54.0-blue)
43
+ ![Version](https://img.shields.io/badge/version-1.56.0-blue)
44
44
  ![Python](https://img.shields.io/badge/python-3.9%2B-green)
45
45
 
46
46
  ---
@@ -459,9 +459,12 @@ Unlike `impact` (which traces the caller graph), `impact-chain` builds on the Sp
459
459
  | `impact_findings` | TX-001..005 and SEC-001..003 findings that touch the call chain |
460
460
  | `risk_level` | `critical` \| `high` \| `medium` \| `low` |
461
461
  | `confidence` | `high` \| `medium` \| `low` — `low` on a detected blind spot, `medium` on partial resolution or capped traversal. Informational interface↔impl expansion notices do **not** lower it, so a clean resolved query stays `high`. |
462
- | `metadata.blind_spots` | `framework_di` and/or `value_type` when an empty result is unmodeled-edge driven, not real dead code |
462
+ | `metadata.blind_spots` | `framework_di` and/or `value_type` when an empty result is unmodeled-edge driven, not real dead code (CH-007 drops `framework_di` once it recovers the wiring callers) |
463
+ | `metadata.external_iface_callers_recovered` / `external_iface_binding_ambiguous` | CH-007 — count of in-repo wiring callers recovered through an external interface, and whether the impl→bean binding is ambiguous (multiple in-repo implementors) |
463
464
 
464
- **Framework/DI blind spot (CH-005).** An empty blast radius is ambiguous: genuinely unused, or invoked through an edge the static graph does not model. When the target class implements/extends an **external** framework type (e.g. Spring Security's `RedirectStrategy`, a servlet `Filter`) it is typically wired by framework DI/config and invoked polymorphically — no in-repo edge names its methods, so `direct_callers` is `0`. Rather than report that as `risk:low` at high confidence (a dangerous false negative that reads as "safe to change"), `impact-chain` detects the external supertype, drops `confidence` to `low`, lists it in `metadata.external_supertypes`, and emits a `CH-005` warning telling you to search the DI/security/config wiring for the supertype. Inert markers (`Serializable`, `Cloneable`) are excluded.
465
+ **Framework/DI blind spot (CH-005).** An empty blast radius is ambiguous: genuinely unused, or invoked through an edge the static graph does not model. When the target class implements/extends an **external** framework type (e.g. Spring Security's `RedirectStrategy`, a servlet `Filter`) it is typically wired by framework DI/config and invoked polymorphically — no in-repo edge names its methods, so `direct_callers` is `0`. Rather than report that as `risk:low` at high confidence (a dangerous false negative that reads as "safe to change"), `impact-chain` detects the external supertype, drops `confidence` to `low`, lists it in `metadata.external_supertypes`, and emits a `CH-005` warning telling you to search the DI/security/config wiring for the supertype. Inert markers (`Serializable`, `Cloneable`) and concrete JDK base classes extended for reuse (`ArrayList`, `InputStream`, …) are excluded.
466
+
467
+ **External-interface DI caller recovery (CH-007).** When the target is wired through an external interface, the consumers that inject that interface never name the target, so the static caller graph misses them — but the wiring sites are still in-repo. `impact-chain` reads the dependency edges to recover the in-repo classes that inject/use the external supertype and attributes them as callers (so their endpoints map too). If exactly one in-repo class implements the interface the binding is unambiguous (`confidence:medium`); if several do, `metadata.external_iface_binding_ambiguous` is `true` and confidence stays `low`. `metadata.external_iface_callers_recovered` reports the count. Recovered callers reach the target only if it is the bean configured for that interface (which may also have framework/third-party implementations) — the warning says so. Validated on BroadleafCommerce: querying a `UserDetailsService` implementation recovers the security-config and login-service classes that wire it.
465
468
 
466
469
  **Caller precision (CH-006).** `implements`/`extends` are structural type declarations, not calls — so they are excluded from the caller graph. Querying a class that implements a high-fanout interface (e.g. a 40-implementor `CustomEndpoint` or a shared `Mapper<E,D>` base) does **not** report its sibling implementors as callers; only real `injects`/`calls` edges count. This prevents a leaf class from being inflated to a large false blast radius.
467
470
 
@@ -1,4 +1,4 @@
1
- sourcecode/__init__.py,sha256=LfTE9XTRZtRV8IXTdhYD92vZwvIIvz8cRORq_nAxiD4,103
1
+ sourcecode/__init__.py,sha256=Pkp631Fn1N1LTXdXhECw7jwtP1qHPqYOjr7-FG3sUJc,103
2
2
  sourcecode/adaptive_scanner.py,sha256=XffluXKzJUXrMtjEiAOnSNPZnztdIcts17T9ouHeID0,10521
3
3
  sourcecode/architecture_analyzer.py,sha256=liCwQmLgb5vplohy8arjYxs_HOIv5C9MjLh_gY6bc5Q,44115
4
4
  sourcecode/architecture_summary.py,sha256=z34_6v7cSwy98cof2UVciGho7SCrZ93tiqMmq5WNzRQ,20405
@@ -13,7 +13,7 @@ sourcecode/confidence_analyzer.py,sha256=_jckZSxksV-OU38vbkxfVNBnWCtlCq8Vwfg23x1
13
13
  sourcecode/context_scorer.py,sha256=QpChSpsmaAYz91rXA4Ue5xzQmNz_ZboZN09YOHScq1U,14679
14
14
  sourcecode/context_summarizer.py,sha256=zlbm8ytdvJToohU108-dwBmEl52xl0gXpf6PZBOW_2A,6540
15
15
  sourcecode/contract_model.py,sha256=nRxJKPMs1VHwFTa8AVXhGmaLjti3Lr2sjHDpWgv1bfE,3917
16
- sourcecode/contract_pipeline.py,sha256=gvTdDniedm_mjq4vaHqnBY2UkQ0s00gtXqzTLILNXHc,28719
16
+ sourcecode/contract_pipeline.py,sha256=bNn9SYtwfI1CGKlYGxewexlp7_IWhpwSCae-BMuuVwQ,28895
17
17
  sourcecode/coverage_parser.py,sha256=q0LeZJaX1bnntLu-ImksdBsMlpsVmk_iUfSaB4eaJGo,19702
18
18
  sourcecode/dependency_analyzer.py,sha256=qEnRiKFkleZJyLf_DyznJbWD1GJ881iG4RRDqH9oGQ4,61524
19
19
  sourcecode/doc_analyzer.py,sha256=05bjTUbDbmnbajD_cgRnACzS8T7xxBKVX4CjkJlhZg8,24411
@@ -29,7 +29,7 @@ sourcecode/fqn_utils.py,sha256=XLU7zDkNBXz_RZkIUNfpPmp1nekWtqP-fxV92tDV1vg,2158
29
29
  sourcecode/git_analyzer.py,sha256=JStxTQXNjBWi_wLdwhsZs9mT-v50cSJIz4Agzn6Kh9I,13362
30
30
  sourcecode/graph_analyzer.py,sha256=DHR8fY69oU_Pi4SYaWboX6EoEFrctQKB9dsjpqwGMzw,62403
31
31
  sourcecode/integration_detector.py,sha256=ZJqrGwvZ4ee2JTGhlazKk67aZi173HxkhNpl8Yntpd8,6503
32
- sourcecode/license.py,sha256=i_X1bYdobL_z9OVuLiycnWEFSaaNhcKKuTd6G55U3_k,20747
32
+ sourcecode/license.py,sha256=JD-1pnH_2XR9lKr9p9KQZn9U31I9e5o6GYsN1XCVccw,22577
33
33
  sourcecode/mcp_nudge.py,sha256=5ELU_ixzh6uA83NXLOZT8h00OhL53okfQdji3jyKOjg,2917
34
34
  sourcecode/metrics_analyzer.py,sha256=m0ENgtqKeBL17kUIK3fmGkgo7UfXBNHxCMj0H_Y5K7c,22750
35
35
  sourcecode/migrate_check.py,sha256=H8iy7Vk8cGL0dnR3ZkFPS20CtfF5LJWuzQVQE4awQ9s,56192
@@ -55,7 +55,7 @@ sourcecode/semantic_analyzer.py,sha256=4OdG6tTSnTvq3_dSWMbQu8Ad1ndSCKeG-b9qM4hIx
55
55
  sourcecode/serializer.py,sha256=TGzftrSKitZrtl6Hh-R05s4KdTOxwTmph_lGDbo2Wzg,125015
56
56
  sourcecode/spring_event_topology.py,sha256=5_ON_21Le5zbG-1GRc5GLIi5HJfy_QjcXLVPC5WeUGQ,18055
57
57
  sourcecode/spring_findings.py,sha256=G7Or2lKBUQbcTDqudLvSs9XvNg_YoAa-_lBOG_ULs8E,5457
58
- sourcecode/spring_impact.py,sha256=5ooAVO-gg1rL-wRaT9_V8ra8edq5TAKu-kp4sAEoS_U,46343
58
+ sourcecode/spring_impact.py,sha256=f8XJtOG41f7EHQCs64BBZ0mdMTwU40DRcMoQ59SVprg,53296
59
59
  sourcecode/spring_model.py,sha256=zOAgFmrRbG4a6KLm1TJl55aWMyPNsz3OS3FSczqPG6A,16594
60
60
  sourcecode/spring_security_audit.py,sha256=XtPJ1SXlZJ8k6VYmaWuAp7Bbir4UmreAL7doIGQ5I7o,20595
61
61
  sourcecode/spring_semantic.py,sha256=O1nKSGVzlukuxLHQVuCPxc-XrcrMFxwlHA20_dmEGgM,13307
@@ -102,8 +102,8 @@ sourcecode/telemetry/consent.py,sha256=wLMvGNJeSSyZoNkQXpoUioY6mMv4Qdvuw7S9jAEWn
102
102
  sourcecode/telemetry/events.py,sha256=LtzYfaX9Ilckj5PTvAcTpDa9mLqDsYPDUiDkRa58piY,2580
103
103
  sourcecode/telemetry/filters.py,sha256=NHa5T-6DaZduQPFuC34jOqHWQgSizM-Ygq8aZ4j19ng,5834
104
104
  sourcecode/telemetry/transport.py,sha256=4gGHsq0WeY9VywEZXA3vUxykfiYnw9uuqfjAAec7F8o,1681
105
- sourcecode-1.54.0.dist-info/METADATA,sha256=IKf3ufkzi2IYGswenS8AADWj8eUsW6YPFFhJl_mT6M4,37049
106
- sourcecode-1.54.0.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
107
- sourcecode-1.54.0.dist-info/entry_points.txt,sha256=ex3F9rmbXeyDIoFQHtkEqTsKSaJow8F0LrVu8XfIktQ,57
108
- sourcecode-1.54.0.dist-info/licenses/LICENSE,sha256=7DdHrU9Z_3e7dSvq4ISijZNjnuHo5NIHNiHDouMQ9JU,10491
109
- sourcecode-1.54.0.dist-info/RECORD,,
105
+ sourcecode-1.56.0.dist-info/METADATA,sha256=3XaX5Y56V_x6f4WkArJ-hXRYyds-FnNpQqBXNrTNdLk,38464
106
+ sourcecode-1.56.0.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
107
+ sourcecode-1.56.0.dist-info/entry_points.txt,sha256=ex3F9rmbXeyDIoFQHtkEqTsKSaJow8F0LrVu8XfIktQ,57
108
+ sourcecode-1.56.0.dist-info/licenses/LICENSE,sha256=7DdHrU9Z_3e7dSvq4ISijZNjnuHo5NIHNiHDouMQ9JU,10491
109
+ sourcecode-1.56.0.dist-info/RECORD,,