sourcecode 5.3.0__py3-none-any.whl → 5.3.1__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
@@ -4,4 +4,4 @@ ASK Engine is the product. ``ask`` is the canonical CLI command; ``sourcecode``
4
4
  the legacy compatibility alias and the Python/PyPI package name. See
5
5
  docs/PRODUCT_IDENTITY.md (normative)."""
6
6
 
7
- __version__ = "5.3.0"
7
+ __version__ = "5.3.1"
@@ -147,6 +147,23 @@ def build_audit_report(
147
147
  return normalized
148
148
 
149
149
 
150
+ def _render_breakdown(value: Any) -> str:
151
+ """A count-per-class map, written the way a reader of a report reads one.
152
+
153
+ The two breakdown lines were interpolated as Python objects, so the signed
154
+ human bundle published `{'no_rule_matched': 676}` on keycloak — and a literal
155
+ `None` for a section that was not measured at all, which is the one thing a
156
+ report of record must never say when it means "not measured".
157
+ """
158
+ if value is None:
159
+ return "not measured"
160
+ if isinstance(value, dict):
161
+ if not value:
162
+ return "none reported"
163
+ return ", ".join(f"`{k}` {v}" for k, v in sorted(value.items()))
164
+ return f"`{value}`"
165
+
166
+
150
167
  def render_markdown(report: dict[str, Any]) -> str:
151
168
  """Human report renderer over the JSON contract."""
152
169
  summary = report.get("summary") or {}
@@ -160,8 +177,8 @@ def render_markdown(report: dict[str, Any]) -> str:
160
177
  f"- Profile set: `{profile}`",
161
178
  f"- Total defects: `{read_count(summary, 'total_defects')}`"
162
179
  + (" **(floor — this run was cut short)**" if summary.get("partial") else ""),
163
- f"- Risk bands: `{summary.get('risk_bands')}`",
164
- f"- Endpoint access: `{summary.get('endpoint_access')}`",
180
+ f"- Risk bands: {_render_breakdown(summary.get('risk_bands'))}",
181
+ f"- Endpoint access: {_render_breakdown(summary.get('endpoint_access'))}",
165
182
  "",
166
183
  "## Top Risks",
167
184
  "",
sourcecode/cli.py CHANGED
@@ -13240,7 +13240,10 @@ def cold_start_cmd(
13240
13240
  """Output Repository Intelligence Snapshot bootstrap context as JSON.
13241
13241
 
13242
13242
  Returns instantly from persisted RIS — zero re-analysis cost.
13243
- status: cold_start_ready | cold_start_stale | no_ris
13243
+ status: cold_start_ready | cold_start_stale | cold_start_incomplete | no_ris
13244
+ `cold_start_incomplete` means the snapshot is missing sections (or holds no
13245
+ measurement at all — `validation.status: empty_snapshot`, every count
13246
+ `null`): unknown, never zero.
13244
13247
 
13245
13248
  \b
13246
13249
  Note: Full output is large (~100K–200K tokens for medium repos).
@@ -71,6 +71,38 @@ _METHOD_ATTR = re.compile(r"RequestMethod\.(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIO
71
71
  #: annotation-shaped path on a server controller is a route, not a call.
72
72
  _DECLARATIVE_CLIENT = re.compile(r"@(\w*FeignClient|HttpExchange|RegisterRestClient)\b")
73
73
 
74
+ #: `put`, `patch` and `delete` are HTTP verbs and they are also three of the most
75
+ #: common method names in Java: `map.put("us-east-1", "us-east-1a")` matches the
76
+ #: call shape exactly. Measured on eureka, joined against open-banking-gateway:
77
+ #: all 20 "unresolved client calls" were `Map.put` literals in
78
+ #: `AbstractAzToRegionMapper`, and a `map.put("/x", v)` would have been published
79
+ #: as a real consumer call to `/x` — the direction this module declares decisive.
80
+ #: So the shape alone does not admit a call site: the FILE must carry evidence
81
+ #: that an HTTP client is in it. These are the published type names of the HTTP
82
+ #: client libraries themselves, matched as a declaration or an import — evidence,
83
+ #: never a rule about the calling code's own naming.
84
+ _HTTP_CLIENT_TYPE = re.compile(
85
+ r"\b(?:Async|Test|OAuth2)?RestTemplate\b"
86
+ r"|\bWeb(?:Test)?Client\b"
87
+ r"|\bRestClient\b"
88
+ r"|\bOkHttpClient\b"
89
+ r"|\bHttpClient\b"
90
+ r"|\bClientHttpRequest\w*\b"
91
+ r"|\bResteasyClient\b"
92
+ r"|\bjakarta\.ws\.rs\.client\b|\bjavax\.ws\.rs\.client\b"
93
+ r"|\bWebResource\b|\bWebTarget\b"
94
+ r"|\bRequestSpecification\b" # rest-assured
95
+ )
96
+
97
+
98
+ def _file_declares_http_client(text: str) -> bool:
99
+ """True when this file imports or declares a type that speaks HTTP as a client.
100
+
101
+ A file with no such type has no `restTemplate` to call, so a `.put("…")` in it
102
+ is some other API with the same method name.
103
+ """
104
+ return bool(_HTTP_CLIENT_TYPE.search(text) or _DECLARATIVE_CLIENT.search(text))
105
+
74
106
  _JAVA_SKIP_DIRS = frozenset({
75
107
  "target", "build", "out", ".git", "node_modules", ".gradle",
76
108
  })
@@ -103,7 +135,10 @@ def extract_java_client_calls(base: Path) -> "tuple[list[ClientCall], list[dict]
103
135
  except OSError:
104
136
  continue
105
137
  rel = path.relative_to(base).as_posix()
106
- for match in _JAVA_TEMPLATE_CALL.finditer(text):
138
+ _http_client_file = _file_declares_http_client(text)
139
+ for match in (
140
+ _JAVA_TEMPLATE_CALL.finditer(text) if _http_client_file else ()
141
+ ):
107
142
  op = match.group("op").lower()
108
143
  verb = next((v for k, v in _VERB_FROM_OP.items() if op.startswith(k)), "")
109
144
  if not verb and op == "exchange":
@@ -6173,6 +6173,56 @@ def _recover_openapi_spec_routes(
6173
6173
  _SEMANTIC_MODEL_ENDPOINT_SOURCES: frozenset[str] = frozenset({"annotation", "openapi-spec"})
6174
6174
 
6175
6175
 
6176
+ def is_test_source_file(rel_path: str) -> bool:
6177
+ """Return True when *rel_path* is a test source and must not enter any surface.
6178
+
6179
+ One authority for the question both Java file-list builders ask —
6180
+ `find_java_files` (which feeds the IR and therefore every CIR consumer:
6181
+ spring-audit, impact, validation, data-exposure) and
6182
+ `extract_java_endpoints` (which feeds the `endpoints` command). They asked it
6183
+ separately until a field run on jobrunr made the divergence visible:
6184
+ `endpoints` published 3 annotation routes from
6185
+ `quarkus-jobrunr-tests/src/main/java/org/jobrunr/quarkus/it/` that
6186
+ `spring-audit` could not see at all, while the payload's own
6187
+ `semantic_model_endpoints_note` claims the two counts are the same figure —
6188
+ 3 against `endpoints_analyzed: 0`.
6189
+
6190
+ Two facts, and C1-28 is why they are written as two.
6191
+ `is_test_path` answers "is this file a test source"; since the authority took
6192
+ over it never fires inside a declared main source root, which is correct
6193
+ everywhere except inside a module that is itself test infrastructure — a
6194
+ `test-framework` module has no product for its `src/main` to belong to. There
6195
+ the weaker question is the right one: does this file look like a test by name
6196
+ or by package. Both come from the one authority, so this stays a composition
6197
+ of published facts rather than a third rule.
6198
+
6199
+ A test *fixture* module (`*-test-utils`) is deliberately NOT excluded here:
6200
+ its endpoints are kept as raw evidence and tagged `scope: test_util`
6201
+ downstream, by both surfaces.
6202
+ """
6203
+ rel = rel_path.replace("\\", "/").lstrip("/")
6204
+ if _is_test_path(rel):
6205
+ return True
6206
+ _rel_sl = "/" + rel # leading slash: the check below is prefix-safe
6207
+ if "/src/main/" in _rel_sl and _matches_test_naming(rel):
6208
+ _prefix = _rel_sl.split("/src/main/")[0]
6209
+ _prefix_parts = [p for p in _prefix.split("/") if p]
6210
+ # A module is a test module if is_test_path says so OR if any module
6211
+ # directory component starts with "test" (e.g. "test-framework",
6212
+ # "test-providers", "testsuite") OR contains "test"/"tests" as a
6213
+ # hyphen/underscore-separated word (e.g. "jobrunr-micronaut-tests").
6214
+ return (
6215
+ _is_test_path(_prefix + "/x.java")
6216
+ or any(p.lower().startswith("test") for p in _prefix_parts)
6217
+ or any(
6218
+ w in {"test", "tests", "spec", "specs"}
6219
+ for p in _prefix_parts
6220
+ for w in p.lower().replace("-", " ").replace("_", " ").split()
6221
+ )
6222
+ )
6223
+ return False
6224
+
6225
+
6176
6226
  # ---------------------------------------------------------------------------
6177
6227
  # Convenience: find Java files in a repo
6178
6228
  # ---------------------------------------------------------------------------
@@ -6190,7 +6240,7 @@ def extract_java_endpoints(root: Path) -> "dict[str, Any]":
6190
6240
  """
6191
6241
  import re as _re
6192
6242
  from typing import Any as _Any
6193
- from sourcecode.path_filters import is_test_path, is_test_fixture_module_path
6243
+ from sourcecode.path_filters import is_test_fixture_module_path
6194
6244
 
6195
6245
  _EXTENDS_FROM_SIG = _re.compile(r'\bextends\s+(\w+)')
6196
6246
 
@@ -6210,9 +6260,20 @@ def extract_java_endpoints(root: Path) -> "dict[str, Any]":
6210
6260
  _CLIENT_PATH_FRAGMENTS = (
6211
6261
  "/admin-client/", "/rest-client/", "/client-api/", "/api-client/",
6212
6262
  )
6263
+ # Admission is `is_test_source_file`, the same authority `find_java_files`
6264
+ # uses, so this command's route population and the IR's cannot diverge:
6265
+ # `is_test_path` alone let a test MODULE's `src/main` resources through here
6266
+ # while the IR dropped them, and the two published counts then contradicted
6267
+ # each other (jobrunr: 3 annotation routes vs `endpoints_analyzed: 0`).
6268
+ def _rel(p: Path) -> str:
6269
+ try:
6270
+ return str(p.relative_to(root)).replace("\\", "/")
6271
+ except ValueError:
6272
+ return str(p).replace("\\", "/")
6273
+
6213
6274
  java_files = sorted(
6214
6275
  p for p in root.rglob("*.java")
6215
- if not is_test_path(str(p).replace("\\", "/"))
6276
+ if not is_test_source_file(_rel(p))
6216
6277
  and "target/" not in str(p).replace("\\", "/")
6217
6278
  and not any(f in str(p).replace("\\", "/") for f in _CLIENT_PATH_FRAGMENTS)
6218
6279
  )
@@ -6841,43 +6902,9 @@ def find_java_files(
6841
6902
  except ValueError:
6842
6903
  continue
6843
6904
  parts = rel.split("/")
6844
- # Skip test dirs — use centralised is_test_path (consistent with
6845
- # extract_java_endpoints), guarded against false positives where a Java
6846
- # *package* is named "test" inside a production src/main/ source root.
6847
- if not include_tests:
6848
- # Two facts, and C1-28 is why they are now written as two.
6849
- # `is_test_path` answers "is this file a test source"; since the
6850
- # authority took over it never fires inside a declared main source
6851
- # root, which is correct everywhere except inside a module that is
6852
- # itself test infrastructure — a `test-framework` module has no
6853
- # product for its `src/main` to belong to. There the weaker question
6854
- # is the right one: does this file look like a test by name or by
6855
- # package. Both come from the one authority, so this stays a
6856
- # composition of published facts rather than a third rule. A test
6857
- # *fixture* module (`*-test-utils`) is deliberately NOT excluded
6858
- # here: its endpoints are kept as raw evidence and tagged
6859
- # `scope: test_util` downstream.
6860
- _rel_sl = "/" + rel # leading slash: the checks below are prefix-safe
6861
- if _is_test_path(rel):
6862
- continue
6863
- if "/src/main/" in _rel_sl and _matches_test_naming(rel):
6864
- _prefix = _rel_sl.split("/src/main/")[0]
6865
- _prefix_parts = [p for p in _prefix.split("/") if p]
6866
- # A module is a test module if is_test_path says so OR if any
6867
- # module directory component starts with "test" (e.g. "test-framework",
6868
- # "test-providers", "testsuite") OR contains "test"/"tests" as a
6869
- # hyphen/underscore-separated word (e.g. "jobrunr-micronaut-tests").
6870
- _prefix_is_test = (
6871
- _is_test_path(_prefix + "/x.java")
6872
- or any(p.lower().startswith("test") for p in _prefix_parts)
6873
- or any(
6874
- w in {"test", "tests", "spec", "specs"}
6875
- for p in _prefix_parts
6876
- for w in p.lower().replace("-", " ").replace("_", " ").split()
6877
- )
6878
- )
6879
- if _prefix_is_test:
6880
- continue
6905
+ # Skip test dirs — one authority, shared with extract_java_endpoints.
6906
+ if not include_tests and is_test_source_file(rel):
6907
+ continue
6881
6908
  # Skip vendor/generated/build dirs
6882
6909
  if any(part in _VENDOR_DIRS for part in parts[:-1]):
6883
6910
  continue
sourcecode/ris.py CHANGED
@@ -484,6 +484,20 @@ def _has_uncommitted_changes(repo_root: Path) -> bool:
484
484
  return bool(worktree_dirty(root, ignore=own))
485
485
 
486
486
 
487
+ def _compact_probe(section: object) -> bool:
488
+ """True when an RIS section holds something a reader could act on.
489
+
490
+ A stub writes `{"endpoints": [], "controllers_index": []}` — a truthy dict
491
+ that contains no measurement, so the section's emptiness has to be asked of
492
+ its values, not of the container.
493
+ """
494
+ if isinstance(section, dict):
495
+ return any(_compact_probe(v) for v in section.values())
496
+ if isinstance(section, (list, tuple, set)):
497
+ return bool(section)
498
+ return section not in (None, "", 0, False)
499
+
500
+
487
501
  def get_cold_start_context(repo_root: Path) -> dict:
488
502
  """Return a lightweight bootstrap object from the persisted RIS.
489
503
 
@@ -527,22 +541,54 @@ def get_cold_start_context(repo_root: Path) -> dict:
527
541
  _endpoints_found = len(endpoints)
528
542
  # Spring is detected when controllers exist in structural map or api surface.
529
543
  _spring_detected = bool(_controllers_found) or bool(_controllers_in_api)
530
- _validation_status = (
531
- "incomplete_snapshot"
532
- if _is_java and _spring_detected and _endpoints_found == 0
533
- else "valid"
544
+ # A stub snapshot measured nothing. `update_ris_api_surface` /
545
+ # `update_ris_spring_audit` write one (`partial: True`, `confidence: 0.0`,
546
+ # `git_head: ""`) so their own section survives when no full snapshot
547
+ # exists yet — and on a repository whose Spring surface is genuinely
548
+ # empty, that stub is all there is. Measured on
549
+ # alfresco-community-repo (7 000+ Java files, 901 WebScripts): every
550
+ # section empty, and `validation: {spring_detected: false,
551
+ # controllers_found: 0, status: "valid"}` — an answer a bootstrapping
552
+ # agent reads as "this repository has no controllers and no entry
553
+ # points". Nothing was measured, so nothing is being reported: the
554
+ # sections are unknown, not zero.
555
+ _nothing_measured = not (
556
+ _compact_probe(ris.compact_summary)
557
+ or _compact_probe(ris.structural_map)
558
+ or _controllers_found
559
+ or _endpoints_found
560
+ or _compact_probe(ris.git_context_snapshot)
534
561
  )
562
+ if _nothing_measured:
563
+ _validation_status = "empty_snapshot"
564
+ elif _is_java and _spring_detected and _endpoints_found == 0:
565
+ _validation_status = "incomplete_snapshot"
566
+ else:
567
+ _validation_status = "valid"
535
568
  _validation: dict = {
536
- "spring_detected": _spring_detected,
537
- "controllers_found": _controllers_found,
538
- "endpoints_found": _endpoints_found,
569
+ "spring_detected": None if _nothing_measured else _spring_detected,
570
+ "controllers_found": None if _nothing_measured else _controllers_found,
571
+ "endpoints_found": None if _nothing_measured else _endpoints_found,
539
572
  "status": _validation_status,
540
573
  }
574
+ if _nothing_measured:
575
+ _validation["statement"] = (
576
+ "This snapshot holds no measurement: it was written by a command "
577
+ "that persisted its own section only. Every field above is unknown "
578
+ "— not zero, and not evidence that the repository has no controllers, "
579
+ "endpoints or entry points. Build one with `ask cache warm <path>` "
580
+ "(or any analysis command) and re-run."
581
+ )
541
582
 
542
583
  # When the snapshot is structurally incomplete, downgrade status so agents
543
584
  # don't assume cold_start_ready when critical sections are missing.
544
585
  _status_base = "cold_start_stale" if stale else "cold_start_ready"
545
- if _validation_status == "incomplete_snapshot" and not stale:
586
+ if _validation_status in ("incomplete_snapshot", "empty_snapshot") and not stale:
587
+ _status_base = "cold_start_incomplete"
588
+ if _validation_status == "empty_snapshot":
589
+ # A stub carries no head, so the staleness comparison it loses is not
590
+ # the fact worth reporting: `cold_start_stale` would send a reader to
591
+ # re-run against a newer tree, when what is missing is the snapshot.
546
592
  _status_base = "cold_start_incomplete"
547
593
 
548
594
  _compact = ris.compact_summary or {}
sourcecode/runs.py CHANGED
@@ -119,9 +119,28 @@ class RunRecord:
119
119
  payload["output_size_bytes"] = output_size
120
120
  if error:
121
121
  payload["error"] = error
122
+ # Bookkeeping never takes down an answer. `RunRecord.create` already
123
+ # treats an unwritable directory as "no record"; the terminal write did
124
+ # not, so a run directory that disappeared *during* the analysis — a
125
+ # concurrent `ask cache clear`, a tmp reaper, an evicted cache — raised
126
+ # FileNotFoundError out of the `_expensive_analysis_scope` exit, after the
127
+ # analysis had completed. Observed: `ask audit-report` on langchain4j died
128
+ # with a traceback over a missing `runs/<id>.tmp`, having already built
129
+ # the report. The record is recovery metadata; the answer is the product.
130
+ blob = json.dumps(payload, indent=2, sort_keys=True)
122
131
  tmp = self.path.with_suffix(".tmp")
123
- tmp.write_text(json.dumps(payload, indent=2, sort_keys=True), encoding="utf-8")
124
- tmp.replace(self.path)
132
+ for attempt in (0, 1):
133
+ try:
134
+ tmp.write_text(blob, encoding="utf-8")
135
+ tmp.replace(self.path)
136
+ return
137
+ except OSError:
138
+ if attempt:
139
+ return
140
+ try:
141
+ self.path.parent.mkdir(parents=True, exist_ok=True)
142
+ except OSError:
143
+ return
125
144
 
126
145
 
127
146
  def classify_run(path: Path) -> dict[str, Any]:
sourcecode/summarizer.py CHANGED
@@ -389,14 +389,20 @@ class ProjectSummarizer:
389
389
  parts.append(f"Domains: {', '.join(domains)}")
390
390
 
391
391
  # Quantitative structural suffix for Java projects — adds concrete scale signals
392
- # that README descriptions omit (class count, transactional boundary count).
392
+ # that README descriptions omit (file count, transactional boundary count).
393
393
  if primary is not None and primary.stack.lower() == "java":
394
394
  quant_parts: list[str] = []
395
395
  java_files = sum(
396
396
  1 for p in sm.file_paths if p.endswith(".java")
397
397
  )
398
398
  if java_files >= 50:
399
- quant_parts.append(f"{java_files:,} Java classes")
399
+ # This counts files, and says so. It read "N Java classes" — the
400
+ # headline sentence of every summary, naming a population the tool
401
+ # measures separately and differently: BroadleafCommerce is 2 659
402
+ # Java files and 3 032 declared types (2 174 classes, 742
403
+ # interfaces), so the label was wrong by a nested type per file
404
+ # and contradicted `repo-ir.analysis_meta.classes`.
405
+ quant_parts.append(f"{java_files:,} Java files")
400
406
  txn_classes: list[str] = []
401
407
  for stack in non_tooling_stacks:
402
408
  txn_classes.extend(getattr(stack, "transactional_classes", []))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sourcecode
3
- Version: 5.3.0
3
+ Version: 5.3.1
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
@@ -42,7 +42,7 @@ Description-Content-Type: text/markdown
42
42
 
43
43
  **Context · Impact · Migration · Architecture · Review — everything from one structural model.**
44
44
 
45
- ![Version](https://img.shields.io/badge/version-5.3.0-blue)
45
+ ![Version](https://img.shields.io/badge/version-5.3.1-blue)
46
46
  ![Python](https://img.shields.io/badge/python-3.9%2B-green)
47
47
 
48
48
  > **ASK Engine** is the product. The CLI command is **`ask`**. The legacy **`sourcecode`**
@@ -126,7 +126,7 @@ brew tap haroundominique/sourcecode && brew install sourcecode
126
126
  # pip / pipx
127
127
  pipx install sourcecode # or: pip install sourcecode
128
128
 
129
- ask version # ask 5.3.0 — and, on a build that has aged,
129
+ ask version # ask 5.3.1 — and, on a build that has aged,
130
130
  # how many releases have probably shipped since
131
131
  ```
132
132
 
@@ -1,4 +1,4 @@
1
- sourcecode/__init__.py,sha256=alg7fVhTqdBz-TKk1I7DwM5E5VuB5QN5_wjCc0DKyi4,308
1
+ sourcecode/__init__.py,sha256=tB6pAGawJyFaEkjGMYJE9OdwEZRKYR63O9PhylSYugU,308
2
2
  sourcecode/adaptive_scanner.py,sha256=yJBKjNpkY6bpueYJ2YnRezen3sYZDecEt7WaaNWdqug,9466
3
3
  sourcecode/archetype.py,sha256=CZvRLpkHot_D8D3JFQVorr-EHDJyh0BbS7RnSTqBigM,40499
4
4
  sourcecode/architectural_baseline.py,sha256=4GiMVBLJVHvRKSWQGf2ZVurI1-R0qk5pmaevgvGSgVA,26325
@@ -6,7 +6,7 @@ sourcecode/architectural_delta.py,sha256=JhZVmA0gYUryt4x4ieVuxPbcvoBygHgADZaYJ_o
6
6
  sourcecode/architecture_analyzer.py,sha256=GFc4ek-s1IHWM7pl-0L32WahZ93AmDgrAMcOuBKA5Dk,61463
7
7
  sourcecode/architecture_summary.py,sha256=BVVRHd952cjRhjHnR6CPrvKgaa-tdM16l-pBi1yDCPs,32395
8
8
  sourcecode/ast_extractor.py,sha256=aXJjZ7XjAdxa99hWNm4SyzPqx4gNWiTbUYjNWGNl-Vc,51213
9
- sourcecode/audit_report.py,sha256=CLvvlQH2oA6Qj4UADUWhNwSsp1OcyzwXXey5DN_IiWI,8660
9
+ sourcecode/audit_report.py,sha256=xLoGd-J8DKL4m1E7Rz8uvEKIg89yr_yUzVEPxQcJxvo,9372
10
10
  sourcecode/baseline_autocapture.py,sha256=tmMLexQSeaQRRbqxAd7walvGQqnF0mdpxQmkL40rlhI,15623
11
11
  sourcecode/cache.py,sha256=CK_J8NqyaTNZ57KQT-R4puqI8yYlzG5WL7uLFRbzods,41727
12
12
  sourcecode/cache_model.py,sha256=B0mvOLwHG7wo1JoCzHoNoI5_0TV-PnhicJM8fWkrVDI,57050
@@ -18,13 +18,13 @@ sourcecode/chain_rules.py,sha256=Bi6UHfgd-GxWswmnHRcPz5jdbAuqka3Zkz_P-MTvqhw,127
18
18
  sourcecode/change_plan.py,sha256=aX1mp2XnlDN-8R2BcTiu8HlkDwQ_4fN1ZLckj0VMXHM,9945
19
19
  sourcecode/cir_graphs.py,sha256=9G0HHj1kw2325IDyzo2OpX73BNswEckecf4MZUXB4JM,12078
20
20
  sourcecode/classifier.py,sha256=JBzPwSSrDG-tUHAbcKB678HRbjLpD-ohzbzzO62mgpo,20114
21
- sourcecode/cli.py,sha256=RK8z7-Qx-njqjxYsS1xDpifMKqtN6bUcq-tABDBjUF8,633350
21
+ sourcecode/cli.py,sha256=3GV5fX6XvOxFkDuKCMOQSejaSrt3X13Gn5qeUYzps1g,633564
22
22
  sourcecode/client_calls.py,sha256=daRTgbXNUOfkzGXJpVb6A737R_Thhka8vw1_YgxCaLg,13548
23
23
  sourcecode/code_notes_analyzer.py,sha256=EJemNCNc9Dn-1RZYu-aNbK0ELzmsyC4s6FdHi3XyNEI,9392
24
24
  sourcecode/compare.py,sha256=2GdDy0qkDSgmkkpgvoCHitoLj3mt30EeFgJ8PGEXJng,14712
25
25
  sourcecode/confidence_analyzer.py,sha256=5li0NyOdS3Ie-f2ZY1gBmnjtkuRvI50l4OnGaKkXAOU,22358
26
26
  sourcecode/constraint_diff.py,sha256=hWIO5vsxvHjsgQx23K3r_JMy1W6wQ2Ca4DqB9R_iMnY,5831
27
- sourcecode/consumer_join.py,sha256=z2etHAih_i6WBvNdUv7FjRYqA2m8v9ZyE8pVGKYqhEI,15448
27
+ sourcecode/consumer_join.py,sha256=6oNv1dbNxURCppLaixmrGbyL0Y-oSrKqjLc59YSBLEI,17086
28
28
  sourcecode/container_wiring.py,sha256=-jAOOgDR0VcZN3ph9kpZVU6iPyN1EK8H5DGAQzxGQKY,14394
29
29
  sourcecode/context_cache.py,sha256=xfS0GpWG8MpHwqgw61tp3IR7jZ2IdG1j-v_HoIiSx7o,35608
30
30
  sourcecode/context_graph.py,sha256=a6v2lgl2DxDnPAWE59K3yg6L5YFDak0LIUff3pi9p0c,47327
@@ -104,12 +104,12 @@ sourcecode/relevance_scorer.py,sha256=0AgEt4KrV73nioMqBgjhGjtY7L2C7L7cSyKtj3IKcr
104
104
  sourcecode/remedies.py,sha256=V2_cD4pLq8bKRkzF-3RGFoiu1xWYZS384WDVp1MrlZw,10225
105
105
  sourcecode/rename_refactor.py,sha256=h6dNFlB9aZ_3q6heeHBkgXQeXaT03nvPSsYH6P8qxFg,12965
106
106
  sourcecode/repo_classifier.py,sha256=FG1vaWKdWXsWdl-S8hjVMiTqcwgaRXkDyvK4rPcOGtQ,22681
107
- sourcecode/repository_ir.py,sha256=R2LjUHUxdOQdx4lGCCgKLY-9K7ldc7JAuW7MpEFJ124,368882
108
- sourcecode/ris.py,sha256=nc0d6boOiREFqXO4eLHHaYcnqZj4pT_AG43-Xz9ejkc,24862
107
+ sourcecode/repository_ir.py,sha256=EHBupXV4S1hyr6El7i3uRwqx_vohiPyc0XMRA0SzheA,369867
108
+ sourcecode/ris.py,sha256=Xbx34dkJI_uXil9xsgw-fA_Apcm4nbnTjQgFm66dP1g,27489
109
109
  sourcecode/risk.py,sha256=FGanyLOydOAf_T_VgJfITgs1eJiG5eqFC9ay_37SbH4,78173
110
110
  sourcecode/rule_catalog.py,sha256=pTkgkQZ1u7atB3fkQJ9BPWo8lNiamvEuRN7MtRgle0c,5263
111
111
  sourcecode/rule_pass.py,sha256=DTNxD-nAecMJhIzI1LCd9FyRumInQSZjitacNh4Zoc8,14671
112
- sourcecode/runs.py,sha256=zIxEPz9DBVVCrX958bZR6bODyfH56A6srAyc8LFMs8I,5303
112
+ sourcecode/runs.py,sha256=o4oXkB3WFJGScbK_C10OAWzsE18B9Zc55u_IE8_yl4M,6291
113
113
  sourcecode/runtime_classifier.py,sha256=uTAD6BDCiBLUZEDRfqk718kM4RTT_vAbfkcOI2_Xx58,18432
114
114
  sourcecode/sarif.py,sha256=3hQEegUxIZbojFdY59oB-yKsK-rnafHdTNmYsEP2--A,25984
115
115
  sourcecode/scanner.py,sha256=z3CV0rcGunu0Y8mpNgp07wI7nxT0pxw1BkXRRtI0Rpo,9609
@@ -135,7 +135,7 @@ sourcecode/spring_security_audit.py,sha256=mj3juX0FRIGde1PREetAwLNWua7HMjUedVsOH
135
135
  sourcecode/spring_semantic.py,sha256=UrmLg_4gmBVmMqvSnUMgSReVEERVGv3X7LYDBEs6k_o,16598
136
136
  sourcecode/spring_tx_analyzer.py,sha256=f1L5EjxOP8nrDTogY7xmZ2HWNjQWXy-g7tI8LlnFThI,49545
137
137
  sourcecode/sql_taint.py,sha256=f_FBzosDAjVolsMOwk8ixl0mYLTW8a0MviZL-ZhN1qg,14830
138
- sourcecode/summarizer.py,sha256=0aD4x3vgPngqBCEBKGuES1J2Vk5f7mqCm_ZWErwm3js,27025
138
+ sourcecode/summarizer.py,sha256=1je7-PfJ6A0BvZ9JzWzP7nijk6cb1KLQZajCVGAjDfE,27492
139
139
  sourcecode/target_admission.py,sha256=wFZ4pzlxhiF6Q6s2lEAZEzcCfj1Y6xNvujjt8MdO0Qo,7154
140
140
  sourcecode/test_gap_ranking.py,sha256=hl-tTyQUXZGJycG1b6npbLeE_DaVHaOsvPwG9qqC5y8,15711
141
141
  sourcecode/test_sources.py,sha256=6qXI47rVt_DFEbziFUyU-_KIUIGt8YQ5Uf4-sdiAhKU,9277
@@ -211,8 +211,8 @@ sourcecode/telemetry/consent.py,sha256=pQdl-QeLl6Gcibn0eWHSKZrm-HYSsjpVqOnjrgFp8
211
211
  sourcecode/telemetry/events.py,sha256=4_yeO58U-Cwc1Qb27VB0_EjhmroY0k91n3_VGxeALB8,2776
212
212
  sourcecode/telemetry/filters.py,sha256=RzxauTz8HliO4BllQnXEXc7zTeqdCZi5MgqGEDuW7OQ,6570
213
213
  sourcecode/telemetry/transport.py,sha256=4gGHsq0WeY9VywEZXA3vUxykfiYnw9uuqfjAAec7F8o,1681
214
- sourcecode-5.3.0.dist-info/METADATA,sha256=NX_EVNWVc6pxbGlFsKzEsHBZy4HPeVp7ZazJfho0WWg,47104
215
- sourcecode-5.3.0.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
216
- sourcecode-5.3.0.dist-info/entry_points.txt,sha256=-JEAdChrK5We51kZcb7OaDcyil-dHBjBPL-NhuO-QY8,89
217
- sourcecode-5.3.0.dist-info/licenses/LICENSE,sha256=7DdHrU9Z_3e7dSvq4ISijZNjnuHo5NIHNiHDouMQ9JU,10491
218
- sourcecode-5.3.0.dist-info/RECORD,,
214
+ sourcecode-5.3.1.dist-info/METADATA,sha256=g4hkZFlApBXJ8VVIYkggwFVyUYCiAEb7c067OcNESJk,47104
215
+ sourcecode-5.3.1.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
216
+ sourcecode-5.3.1.dist-info/entry_points.txt,sha256=-JEAdChrK5We51kZcb7OaDcyil-dHBjBPL-NhuO-QY8,89
217
+ sourcecode-5.3.1.dist-info/licenses/LICENSE,sha256=7DdHrU9Z_3e7dSvq4ISijZNjnuHo5NIHNiHDouMQ9JU,10491
218
+ sourcecode-5.3.1.dist-info/RECORD,,