sourcecode 1.35.14__py3-none-any.whl → 1.35.16__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 +1 -1
- sourcecode/ast_extractor.py +1 -1
- sourcecode/cir_graphs.py +9 -5
- sourcecode/cli.py +1 -1
- sourcecode/dependency_analyzer.py +1 -1
- sourcecode/explain.py +4 -2
- sourcecode/fqn_utils.py +53 -0
- sourcecode/license.py +30 -12
- sourcecode/pr_impact.py +3 -1
- sourcecode/spring_impact.py +7 -12
- sourcecode/telemetry/transport.py +4 -1
- {sourcecode-1.35.14.dist-info → sourcecode-1.35.16.dist-info}/METADATA +4 -3
- {sourcecode-1.35.14.dist-info → sourcecode-1.35.16.dist-info}/RECORD +16 -15
- {sourcecode-1.35.14.dist-info → sourcecode-1.35.16.dist-info}/WHEEL +0 -0
- {sourcecode-1.35.14.dist-info → sourcecode-1.35.16.dist-info}/entry_points.txt +0 -0
- {sourcecode-1.35.14.dist-info → sourcecode-1.35.16.dist-info}/licenses/LICENSE +0 -0
sourcecode/__init__.py
CHANGED
sourcecode/ast_extractor.py
CHANGED
|
@@ -1196,7 +1196,7 @@ def _detect_role(path: str, contract: FileContract) -> str:
|
|
|
1196
1196
|
def _extract_mybatis_xml(rel_path: str, source: str) -> FileContract:
|
|
1197
1197
|
"""Extract namespace and SQL operations from a MyBatis *Mapper.xml file."""
|
|
1198
1198
|
import re as _re
|
|
1199
|
-
|
|
1199
|
+
import defusedxml.ElementTree as ElementTree # type: ignore[import]
|
|
1200
1200
|
|
|
1201
1201
|
_NS_STRIP = _re.compile(r"\{[^}]+\}")
|
|
1202
1202
|
_SQL_OPS = frozenset({"select", "insert", "update", "delete"})
|
sourcecode/cir_graphs.py
CHANGED
|
@@ -13,6 +13,8 @@ from __future__ import annotations
|
|
|
13
13
|
|
|
14
14
|
from dataclasses import dataclass, field
|
|
15
15
|
|
|
16
|
+
from sourcecode.fqn_utils import normalize_owner_fqn
|
|
17
|
+
|
|
16
18
|
# ---------------------------------------------------------------------------
|
|
17
19
|
# ImplementationGraph — CH-001
|
|
18
20
|
# ---------------------------------------------------------------------------
|
|
@@ -179,12 +181,14 @@ class InjectionGraph:
|
|
|
179
181
|
if not from_fqn or not to_fqn:
|
|
180
182
|
continue
|
|
181
183
|
|
|
182
|
-
# Resolve injector to class level
|
|
183
|
-
|
|
184
|
-
|
|
184
|
+
# Resolve injector to class level.
|
|
185
|
+
# Three formats emitted by the CIR parser:
|
|
186
|
+
# Constructor: pkg.Class#<init> → class = pkg.Class
|
|
187
|
+
# Field: pkg.Class.field → class = pkg.Class (normalize_owner_fqn)
|
|
188
|
+
# Lombok: pkg.Class → class = pkg.Class (already class-level)
|
|
189
|
+
class_fqn = normalize_owner_fqn(from_fqn)
|
|
190
|
+
if class_fqn != from_fqn:
|
|
185
191
|
injector_to_class[from_fqn] = class_fqn
|
|
186
|
-
else:
|
|
187
|
-
class_fqn = from_fqn
|
|
188
192
|
|
|
189
193
|
# Build class → [dep, ...] and service → [class, ...] indices
|
|
190
194
|
deps = deps_of.setdefault(class_fqn, [])
|
sourcecode/cli.py
CHANGED
|
@@ -4892,7 +4892,7 @@ def mcp_serve() -> None:
|
|
|
4892
4892
|
except KeyboardInterrupt:
|
|
4893
4893
|
log.info("sourcecode-mcp stopped")
|
|
4894
4894
|
except Exception as exc:
|
|
4895
|
-
log.critical("sourcecode-mcp fatal error: %s", exc,
|
|
4895
|
+
log.critical("sourcecode-mcp fatal error: %s: %s", type(exc).__name__, exc)
|
|
4896
4896
|
raise typer.Exit(code=1)
|
|
4897
4897
|
|
|
4898
4898
|
|
sourcecode/explain.py
CHANGED
|
@@ -13,6 +13,8 @@ from __future__ import annotations
|
|
|
13
13
|
from dataclasses import dataclass, field
|
|
14
14
|
from typing import TYPE_CHECKING, Optional
|
|
15
15
|
|
|
16
|
+
from sourcecode.fqn_utils import normalize_owner_fqn
|
|
17
|
+
|
|
16
18
|
if TYPE_CHECKING:
|
|
17
19
|
from sourcecode.canonical_ir import CanonicalRepositoryIR
|
|
18
20
|
from sourcecode.spring_model import SpringSemanticModel
|
|
@@ -255,8 +257,8 @@ def _build_callers(class_fqn: str, cir: "CanonicalRepositoryIR") -> list[str]:
|
|
|
255
257
|
rev: dict = (getattr(cir, "reverse_graph", None) or {}).get(class_fqn) or {}
|
|
256
258
|
for callers in rev.values():
|
|
257
259
|
for caller_fqn in (callers or []):
|
|
258
|
-
#
|
|
259
|
-
cls_fqn = caller_fqn
|
|
260
|
+
# Normalize: field (pkg.Class.field) and method (pkg.Class#method) → class FQN
|
|
261
|
+
cls_fqn = normalize_owner_fqn(caller_fqn)
|
|
260
262
|
if cls_fqn == class_fqn:
|
|
261
263
|
continue
|
|
262
264
|
s = _simple(cls_fqn)
|
sourcecode/fqn_utils.py
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"""fqn_utils.py — FQN normalization utilities (single source of truth).
|
|
2
|
+
|
|
3
|
+
All code that needs to distinguish class FQNs from member FQNs (methods, fields,
|
|
4
|
+
constructors) must use these functions. No direct `.split("#")`, `.rsplit(".")`,
|
|
5
|
+
or lowercase-heuristic checks elsewhere.
|
|
6
|
+
|
|
7
|
+
Symbol FQN conventions in the CIR:
|
|
8
|
+
Class/Interface/Enum: pkg.ClassName (no # or lowercase-last-seg)
|
|
9
|
+
Method: pkg.ClassName#methodName (hash separator)
|
|
10
|
+
Constructor: pkg.ClassName#<init> (hash, angle-bracket name)
|
|
11
|
+
Field: pkg.ClassName.fieldName (dot separator, lowercase last segment)
|
|
12
|
+
Inner class: pkg.ClassName.InnerClass (dot separator, uppercase last segment)
|
|
13
|
+
"""
|
|
14
|
+
from __future__ import annotations
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def normalize_owner_fqn(fqn: str) -> str:
|
|
18
|
+
"""Extract the owning class FQN from any symbol FQN.
|
|
19
|
+
|
|
20
|
+
Examples:
|
|
21
|
+
PatientServiceImpl -> PatientServiceImpl
|
|
22
|
+
org.foo.PatientServiceImpl -> org.foo.PatientServiceImpl
|
|
23
|
+
org.foo.PatientServiceImpl#savePatient -> org.foo.PatientServiceImpl
|
|
24
|
+
org.foo.PatientServiceImpl#<init> -> org.foo.PatientServiceImpl
|
|
25
|
+
org.foo.PatientServiceImpl.dao -> org.foo.PatientServiceImpl
|
|
26
|
+
org.foo.PatientServiceImpl.InnerClass -> org.foo.PatientServiceImpl.InnerClass (unchanged)
|
|
27
|
+
"""
|
|
28
|
+
if "#" in fqn:
|
|
29
|
+
return fqn.rsplit("#", 1)[0]
|
|
30
|
+
if "." in fqn:
|
|
31
|
+
last_seg = fqn.rsplit(".", 1)[1]
|
|
32
|
+
if last_seg and last_seg[0].islower():
|
|
33
|
+
return fqn.rsplit(".", 1)[0]
|
|
34
|
+
return fqn
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def is_member_fqn(fqn: str) -> bool:
|
|
38
|
+
"""Return True for method/field/constructor FQNs; False for type FQNs.
|
|
39
|
+
|
|
40
|
+
True: pkg.Class#method, pkg.Class#<init>, pkg.Class.fieldName
|
|
41
|
+
False: pkg.Class, pkg.outer.InnerClass, simple.Name
|
|
42
|
+
"""
|
|
43
|
+
if "#" in fqn:
|
|
44
|
+
return True
|
|
45
|
+
if "." in fqn:
|
|
46
|
+
last_seg = fqn.rsplit(".", 1)[1]
|
|
47
|
+
return bool(last_seg and last_seg[0].islower())
|
|
48
|
+
return False
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def is_type_fqn(fqn: str) -> bool:
|
|
52
|
+
"""Return True for class/interface/enum/record FQNs; False for member FQNs."""
|
|
53
|
+
return not is_member_fqn(fqn)
|
sourcecode/license.py
CHANGED
|
@@ -17,6 +17,7 @@ from __future__ import annotations
|
|
|
17
17
|
|
|
18
18
|
import json
|
|
19
19
|
import os
|
|
20
|
+
import re
|
|
20
21
|
import sys
|
|
21
22
|
from datetime import datetime, timezone
|
|
22
23
|
from pathlib import Path
|
|
@@ -25,18 +26,23 @@ from typing import Optional
|
|
|
25
26
|
# ---------------------------------------------------------------------------
|
|
26
27
|
# Supabase endpoint config — hardcoded for production; override via env for dev
|
|
27
28
|
# ---------------------------------------------------------------------------
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
"https://qkndlmyekvujjdgthtmz.supabase.co",
|
|
31
|
-
)
|
|
29
|
+
_DEFAULT_SUPABASE_URL: str = "https://qkndlmyekvujjdgthtmz.supabase.co"
|
|
30
|
+
_SUPABASE_URL: str = os.environ.get("SOURCECODE_SUPABASE_URL", _DEFAULT_SUPABASE_URL)
|
|
32
31
|
_SUPABASE_ANON_KEY: str = os.environ.get(
|
|
33
32
|
"SOURCECODE_SUPABASE_ANON_KEY",
|
|
34
33
|
"", # Set SOURCECODE_SUPABASE_ANON_KEY to your project anon key
|
|
35
34
|
)
|
|
35
|
+
if _SUPABASE_URL != _DEFAULT_SUPABASE_URL:
|
|
36
|
+
sys.stderr.write(
|
|
37
|
+
f"[sourcecode] WARNING: SOURCECODE_SUPABASE_URL overridden to {_SUPABASE_URL!r}."
|
|
38
|
+
" License requests will be sent to this server.\n"
|
|
39
|
+
)
|
|
40
|
+
sys.stderr.flush()
|
|
36
41
|
|
|
37
42
|
_LICENSE_DIR: Path = Path.home() / ".sourcecode"
|
|
38
43
|
_LICENSE_FILE: Path = _LICENSE_DIR / "license.json"
|
|
39
44
|
_CACHE_TTL_SECONDS: int = 86400 # 24 hours
|
|
45
|
+
_LICENSE_KEY_RE = re.compile(r"^[A-Za-z0-9_\-]{1,200}$")
|
|
40
46
|
|
|
41
47
|
# ---------------------------------------------------------------------------
|
|
42
48
|
# Per-feature descriptions for upgrade UX
|
|
@@ -92,6 +98,21 @@ _license_data: Optional[dict] = None
|
|
|
92
98
|
is_pro: bool = False
|
|
93
99
|
|
|
94
100
|
|
|
101
|
+
def _write_license_file(data: dict) -> None:
|
|
102
|
+
"""Atomically write license data via tmp file + rename."""
|
|
103
|
+
payload = json.dumps(data, indent=2, ensure_ascii=False).encode("utf-8")
|
|
104
|
+
tmp = _LICENSE_FILE.with_suffix(".tmp")
|
|
105
|
+
try:
|
|
106
|
+
tmp.write_bytes(payload)
|
|
107
|
+
tmp.replace(_LICENSE_FILE)
|
|
108
|
+
except Exception:
|
|
109
|
+
try:
|
|
110
|
+
tmp.unlink(missing_ok=True)
|
|
111
|
+
except Exception:
|
|
112
|
+
pass
|
|
113
|
+
raise
|
|
114
|
+
|
|
115
|
+
|
|
95
116
|
def _load_license_file() -> Optional[dict]:
|
|
96
117
|
"""Read ~/.sourcecode/license.json. Returns parsed dict or None."""
|
|
97
118
|
try:
|
|
@@ -173,10 +194,7 @@ def _maybe_revalidate() -> None:
|
|
|
173
194
|
_license_data["validated_at"] = datetime.now(timezone.utc).isoformat()
|
|
174
195
|
is_pro = _license_data.get("plan") == "pro"
|
|
175
196
|
try:
|
|
176
|
-
|
|
177
|
-
json.dumps(_license_data, indent=2, ensure_ascii=False),
|
|
178
|
-
encoding="utf-8",
|
|
179
|
-
)
|
|
197
|
+
_write_license_file(_license_data)
|
|
180
198
|
except Exception:
|
|
181
199
|
pass
|
|
182
200
|
|
|
@@ -284,6 +302,9 @@ def activate_license(license_key: str) -> None:
|
|
|
284
302
|
Outputs JSON to stdout; exits 0 on success, 1 on any failure.
|
|
285
303
|
Never raises — all error paths emit JSON and call sys.exit(1).
|
|
286
304
|
"""
|
|
305
|
+
if not _LICENSE_KEY_RE.match(license_key):
|
|
306
|
+
_fail("invalid_license", "License key format is invalid.")
|
|
307
|
+
|
|
287
308
|
if not _SUPABASE_ANON_KEY:
|
|
288
309
|
_fail("configuration_error", "SOURCECODE_SUPABASE_ANON_KEY not set. Contact support.")
|
|
289
310
|
|
|
@@ -308,10 +329,7 @@ def activate_license(license_key: str) -> None:
|
|
|
308
329
|
"activated_at": now,
|
|
309
330
|
"validated_at": now,
|
|
310
331
|
}
|
|
311
|
-
|
|
312
|
-
json.dumps(data, indent=2, ensure_ascii=False),
|
|
313
|
-
encoding="utf-8",
|
|
314
|
-
)
|
|
332
|
+
_write_license_file(data)
|
|
315
333
|
|
|
316
334
|
output = {"status": "activated", "plan": "pro", "features": data["features"]}
|
|
317
335
|
sys.stdout.write(json.dumps(output, ensure_ascii=False) + "\n")
|
sourcecode/pr_impact.py
CHANGED
|
@@ -20,6 +20,8 @@ from dataclasses import dataclass, field
|
|
|
20
20
|
from pathlib import Path
|
|
21
21
|
from typing import TYPE_CHECKING, Optional
|
|
22
22
|
|
|
23
|
+
from sourcecode.fqn_utils import is_member_fqn
|
|
24
|
+
|
|
23
25
|
if TYPE_CHECKING:
|
|
24
26
|
from sourcecode.canonical_ir import CanonicalRepositoryIR
|
|
25
27
|
from sourcecode.spring_model import SpringSemanticModel
|
|
@@ -147,7 +149,7 @@ def _build_file_class_index(cir: "CanonicalRepositoryIR") -> dict[str, list[str]
|
|
|
147
149
|
for node in nodes:
|
|
148
150
|
fqn: str = node.get("fqn") or ""
|
|
149
151
|
sf: str = node.get("source_file") or ""
|
|
150
|
-
if not fqn or not sf or
|
|
152
|
+
if not fqn or not sf or is_member_fqn(fqn):
|
|
151
153
|
continue
|
|
152
154
|
index.setdefault(sf, []).append(fqn)
|
|
153
155
|
return index
|
sourcecode/spring_impact.py
CHANGED
|
@@ -25,6 +25,7 @@ from dataclasses import dataclass, field
|
|
|
25
25
|
from pathlib import Path
|
|
26
26
|
from typing import TYPE_CHECKING, Optional
|
|
27
27
|
|
|
28
|
+
from sourcecode.fqn_utils import normalize_owner_fqn
|
|
28
29
|
from sourcecode.spring_findings import SEVERITY_ORDER, SpringFinding
|
|
29
30
|
from sourcecode.spring_model import SpringSemanticModel
|
|
30
31
|
|
|
@@ -311,19 +312,13 @@ def _bfs_callers(
|
|
|
311
312
|
if etype in _SKIP_EDGE_TYPES:
|
|
312
313
|
continue
|
|
313
314
|
for caller in fqn_list:
|
|
314
|
-
_add_caller(caller, depth)
|
|
315
|
-
# CH-002: injects edge to a field/constructor node → also traverse
|
|
316
|
-
# the containing class, bypassing the skipped contained_in edge.
|
|
317
|
-
# Two formats emitted by the CIR parser:
|
|
318
|
-
# Constructor injection: pkg.Class#<init> (hash separator)
|
|
319
|
-
# Field injection: pkg.Class.field (dot, lowercase last segment)
|
|
320
315
|
if etype == "injects":
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
316
|
+
# CH-002: field (pkg.Class.field) and constructor (pkg.Class#<init>)
|
|
317
|
+
# FQNs are injection sites, not callers. Normalize to owning class so
|
|
318
|
+
# member FQNs never appear in direct_callers / indirect_callers.
|
|
319
|
+
_add_caller(normalize_owner_fqn(caller), depth)
|
|
320
|
+
else:
|
|
321
|
+
_add_caller(caller, depth)
|
|
327
322
|
|
|
328
323
|
return direct, indirect, was_truncated
|
|
329
324
|
|
|
@@ -20,7 +20,10 @@ _TIMEOUT_S = 3
|
|
|
20
20
|
|
|
21
21
|
|
|
22
22
|
def _endpoint() -> str:
|
|
23
|
-
|
|
23
|
+
override = os.environ.get("SOURCECODE_TELEMETRY_ENDPOINT")
|
|
24
|
+
if override and override.startswith("https://"):
|
|
25
|
+
return override
|
|
26
|
+
return _DEFAULT_ENDPOINT
|
|
24
27
|
|
|
25
28
|
|
|
26
29
|
def _send_blocking(payload: dict[str, Any]) -> None:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sourcecode
|
|
3
|
-
Version: 1.35.
|
|
3
|
+
Version: 1.35.16
|
|
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
|
|
@@ -17,6 +17,7 @@ Classifier: Programming Language :: Python :: 3.12
|
|
|
17
17
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
18
18
|
Classifier: Topic :: Utilities
|
|
19
19
|
Requires-Python: >=3.9
|
|
20
|
+
Requires-Dist: defusedxml>=0.7
|
|
20
21
|
Requires-Dist: mcp>=1.0.0
|
|
21
22
|
Requires-Dist: pathspec>=1.0
|
|
22
23
|
Requires-Dist: ruamel-yaml>=0.18
|
|
@@ -39,7 +40,7 @@ Description-Content-Type: text/markdown
|
|
|
39
40
|
|
|
40
41
|
**Persistent structural context and ultra-fast repeated analysis for AI coding agents.**
|
|
41
42
|
|
|
42
|
-

|
|
43
44
|

|
|
44
45
|
|
|
45
46
|
---
|
|
@@ -113,7 +114,7 @@ pipx install sourcecode
|
|
|
113
114
|
|
|
114
115
|
```bash
|
|
115
116
|
sourcecode version
|
|
116
|
-
# sourcecode 1.35.
|
|
117
|
+
# sourcecode 1.35.16
|
|
117
118
|
```
|
|
118
119
|
|
|
119
120
|
---
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
sourcecode/__init__.py,sha256=
|
|
1
|
+
sourcecode/__init__.py,sha256=jc7t99MAOVoZuqPXgeqrR2Amq4B-LnZtcO_-sTvoMSo,104
|
|
2
2
|
sourcecode/adaptive_scanner.py,sha256=XffluXKzJUXrMtjEiAOnSNPZnztdIcts17T9ouHeID0,10521
|
|
3
3
|
sourcecode/architecture_analyzer.py,sha256=qh749a7ykPtGmQI1MR9y6j8TtL_jBdVYFx9YRsLqOMw,44121
|
|
4
4
|
sourcecode/architecture_summary.py,sha256=z34_6v7cSwy98cof2UVciGho7SCrZ93tiqMmq5WNzRQ,20405
|
|
5
|
-
sourcecode/ast_extractor.py,sha256=
|
|
5
|
+
sourcecode/ast_extractor.py,sha256=sa6CmLpn-k5G3_Hzxn8hAlZ5-TS-EVzXDD0Gvxd2jzs,50613
|
|
6
6
|
sourcecode/cache.py,sha256=wAyPrXN5DqiGivnMpeEuun2xHDKfBer2_oBsh6kj_vc,30447
|
|
7
7
|
sourcecode/canonical_ir.py,sha256=uwpwCnJxMh_eiIVg4cOLv7-aZthvmDFcG4azCOycLkw,24281
|
|
8
|
-
sourcecode/cir_graphs.py,sha256=
|
|
8
|
+
sourcecode/cir_graphs.py,sha256=rZi8JV4ZrAa2WSCeyNa4JIEKQ_yZzDZTsrvVz2KfuKA,8919
|
|
9
9
|
sourcecode/classifier.py,sha256=2lYoSH3vOTkXZYPU7Go2WIet1-IuNzTWVhc-ULnXtgw,8024
|
|
10
|
-
sourcecode/cli.py,sha256=
|
|
10
|
+
sourcecode/cli.py,sha256=uQXXwKp1qnviXG-Qgnl34_5ioPeKPuXLDh7IXXZ3aaA,224568
|
|
11
11
|
sourcecode/code_notes_analyzer.py,sha256=EJemNCNc9Dn-1RZYu-aNbK0ELzmsyC4s6FdHi3XyNEI,9392
|
|
12
12
|
sourcecode/confidence_analyzer.py,sha256=_jckZSxksV-OU38vbkxfVNBnWCtlCq8Vwfg23x1uspA,19054
|
|
13
13
|
sourcecode/context_scorer.py,sha256=QpChSpsmaAYz91rXA4Ue5xzQmNz_ZboZN09YOHScq1U,14679
|
|
@@ -15,23 +15,24 @@ sourcecode/context_summarizer.py,sha256=zlbm8ytdvJToohU108-dwBmEl52xl0gXpf6PZBOW
|
|
|
15
15
|
sourcecode/contract_model.py,sha256=nRxJKPMs1VHwFTa8AVXhGmaLjti3Lr2sjHDpWgv1bfE,3917
|
|
16
16
|
sourcecode/contract_pipeline.py,sha256=gvTdDniedm_mjq4vaHqnBY2UkQ0s00gtXqzTLILNXHc,28719
|
|
17
17
|
sourcecode/coverage_parser.py,sha256=q0LeZJaX1bnntLu-ImksdBsMlpsVmk_iUfSaB4eaJGo,19702
|
|
18
|
-
sourcecode/dependency_analyzer.py,sha256=
|
|
18
|
+
sourcecode/dependency_analyzer.py,sha256=5yUBN_Z75RWmBIbsfnMasPSUn-4IaLipt0A3b3LNVfc,56310
|
|
19
19
|
sourcecode/doc_analyzer.py,sha256=05bjTUbDbmnbajD_cgRnACzS8T7xxBKVX4CjkJlhZg8,24411
|
|
20
20
|
sourcecode/entrypoint_classifier.py,sha256=jhTYlyqDJH2AtdEcLVaRU3lYRTJuF8DkxVzl4-W3zWE,5322
|
|
21
21
|
sourcecode/env_analyzer.py,sha256=aNTyYgQk5noJDfJU6FmasmESOHfiomyJw5EvZqjy6qc,22213
|
|
22
22
|
sourcecode/error_schema.py,sha256=uwosfNaSujtYm11_732Hu92z5ITV040fQDaIyefSvR4,1683
|
|
23
|
-
sourcecode/explain.py,sha256=
|
|
23
|
+
sourcecode/explain.py,sha256=cCRpR4L0goET8UR1iFTq4gQ-2TDCRTL7jGITMO09TE4,16556
|
|
24
24
|
sourcecode/file_classifier.py,sha256=A0fEABqtfVu1MfoaxnPAvGpZgneGgVXlJDhT74NYXxE,15314
|
|
25
25
|
sourcecode/flow_analyzer.py,sha256=dSiuY4w49k29jW_EPXUOND9B5uVbuCA7kjnuHi-pIWA,28781
|
|
26
|
+
sourcecode/fqn_utils.py,sha256=XLU7zDkNBXz_RZkIUNfpPmp1nekWtqP-fxV92tDV1vg,2158
|
|
26
27
|
sourcecode/git_analyzer.py,sha256=JStxTQXNjBWi_wLdwhsZs9mT-v50cSJIz4Agzn6Kh9I,13362
|
|
27
28
|
sourcecode/graph_analyzer.py,sha256=DHR8fY69oU_Pi4SYaWboX6EoEFrctQKB9dsjpqwGMzw,62403
|
|
28
|
-
sourcecode/license.py,sha256
|
|
29
|
+
sourcecode/license.py,sha256=-sPY4VuSYSe5dZyy7uFoWn9tHFcKlQkhZU0kgbwypo8,12499
|
|
29
30
|
sourcecode/mcp_nudge.py,sha256=5ELU_ixzh6uA83NXLOZT8h00OhL53okfQdji3jyKOjg,2917
|
|
30
31
|
sourcecode/metrics_analyzer.py,sha256=m0ENgtqKeBL17kUIK3fmGkgo7UfXBNHxCMj0H_Y5K7c,22750
|
|
31
32
|
sourcecode/output_budget.py,sha256=Js9yUlfQtPhqBl9R6wn_9UHVjjJc3GtLcqyfjf5t50Q,9869
|
|
32
33
|
sourcecode/path_filters.py,sha256=ROFRQ8eSLBEMiixK9f45-RO7um4VEEcjoD5AA4I427I,3739
|
|
33
34
|
sourcecode/pr_comment_renderer.py,sha256=smHslxiG14lrytCkq5nFrFu-qTHgA-t-LFYfdrfjz2o,14423
|
|
34
|
-
sourcecode/pr_impact.py,sha256=
|
|
35
|
+
sourcecode/pr_impact.py,sha256=dCDVw83EDbyVf6F9ZmEQmsFz8ruVH7d4mpeKQCIZHM0,16805
|
|
35
36
|
sourcecode/prepare_context.py,sha256=fGFY9gWOA3-tmD4PHxil_QsaYJxfBvcAkj4rlhXUKYo,221229
|
|
36
37
|
sourcecode/progress.py,sha256=qn30sWaHOkjTgXsSBmiPkz7Rsbwc5oSlIe6JNEMYp_k,3149
|
|
37
38
|
sourcecode/ranking_engine.py,sha256=ZAucq_YX2KkWUuAZf4P0lhtQ_38vEFnUhuGtSZd1S0E,12970
|
|
@@ -47,7 +48,7 @@ sourcecode/semantic_analyzer.py,sha256=TDuC3wzZR2DPm1mgrAg1YSLk2QzJoueS3TZAmyGGp
|
|
|
47
48
|
sourcecode/serializer.py,sha256=7SBJIbpC_Lg0RGWq8jjNbF5TiuZwoP_fi0qhHnzQM8M,124386
|
|
48
49
|
sourcecode/spring_event_topology.py,sha256=LvGv5RXtU_O-fVB_OO9eDD2UmZM72Jn2oUHgOo50Qm0,17157
|
|
49
50
|
sourcecode/spring_findings.py,sha256=8V91iHOg9hFgg6tLLl4FSsgrF-dBqOcO2s-K5sD_goA,5417
|
|
50
|
-
sourcecode/spring_impact.py,sha256=
|
|
51
|
+
sourcecode/spring_impact.py,sha256=Ohm2k3W4Wts8Kx8Z7DIM-J-cwGtTJBWKFBsX-WkupBQ,32943
|
|
51
52
|
sourcecode/spring_model.py,sha256=IzMcM5ftw1_EHG3FGUDT7qdAMpo3eqbAE1LRuasfr_4,14739
|
|
52
53
|
sourcecode/spring_security_audit.py,sha256=oaV-dK_5iSRwkWSJbMbzxfPbW376n3jTwnRPAspePjg,20293
|
|
53
54
|
sourcecode/spring_semantic.py,sha256=CiAf77p48-RFrUF0zbgww4w2Xigrbo1t5M3ZCDIfV_g,12032
|
|
@@ -91,9 +92,9 @@ sourcecode/telemetry/config.py,sha256=Pir0WHp4z-9Qclnn2NDZ3vwitqsMkOAJckmwjUSxrk
|
|
|
91
92
|
sourcecode/telemetry/consent.py,sha256=wLMvGNJeSSyZoNkQXpoUioY6mMv4Qdvuw7S9jAEWnII,2237
|
|
92
93
|
sourcecode/telemetry/events.py,sha256=oEvvulfsv5GIDWG2174gSS6tNB95w38AIYiYeifGKlE,2294
|
|
93
94
|
sourcecode/telemetry/filters.py,sha256=Asa71oRl7q3Wt_FMwuufIZJFzSYdgRNKS8LHCIyFeYE,4805
|
|
94
|
-
sourcecode/telemetry/transport.py,sha256=
|
|
95
|
-
sourcecode-1.35.
|
|
96
|
-
sourcecode-1.35.
|
|
97
|
-
sourcecode-1.35.
|
|
98
|
-
sourcecode-1.35.
|
|
99
|
-
sourcecode-1.35.
|
|
95
|
+
sourcecode/telemetry/transport.py,sha256=QSslxIwij8YkRWcVvxykODDrkiN_GAAEu3dUP7KIWeE,1651
|
|
96
|
+
sourcecode-1.35.16.dist-info/METADATA,sha256=LkCx5nRHlMV_wsznbY9xRh0muC06f_qtM6K9aHP2WbM,21297
|
|
97
|
+
sourcecode-1.35.16.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
|
|
98
|
+
sourcecode-1.35.16.dist-info/entry_points.txt,sha256=ex3F9rmbXeyDIoFQHtkEqTsKSaJow8F0LrVu8XfIktQ,57
|
|
99
|
+
sourcecode-1.35.16.dist-info/licenses/LICENSE,sha256=7DdHrU9Z_3e7dSvq4ISijZNjnuHo5NIHNiHDouMQ9JU,10491
|
|
100
|
+
sourcecode-1.35.16.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|