sourcecode 5.4.2__py3-none-any.whl → 5.5.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.

Potentially problematic release.


This version of sourcecode might be problematic. Click here for more details.

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.4.2"
7
+ __version__ = "5.5.0"
@@ -136,7 +136,7 @@ pipx install sourcecode # isolated install, no venv needed
136
136
 
137
137
  # Verify
138
138
  ask version
139
- # ask 5.4.2
139
+ # ask 5.5.0
140
140
  ```
141
141
 
142
142
  Requires Python 3.9+.
sourcecode/cache_model.py CHANGED
@@ -492,6 +492,7 @@ class Conditioning:
492
492
  scope: str # "3 342 Java files, cache cold"
493
493
  transfers: "Optional[bool]" # do the reference figures apply here?
494
494
  per_command: "dict[str, str]" # command → how it can be run here
495
+ java_files: "Optional[int]" = None # measured scope size, if available
495
496
 
496
497
  def statement(self) -> str:
497
498
  """One sentence about whether the figures below transfer to this scope."""
@@ -500,6 +501,14 @@ class Conditioning:
500
501
  f"This repository ({self.scope}) was not measured, so nothing below "
501
502
  f"is claimed about it: the figures are the reference repository's."
502
503
  )
504
+ if self.java_files is not None and self.java_files > REFERENCE_JAVA_FILES:
505
+ return (
506
+ f"This repository ({self.scope}) is larger than the repository the "
507
+ f"figures below were measured on ({REFERENCE_JAVA_FILES} Java files), "
508
+ f"and what cost tracks here is the build rather than the file count: "
509
+ f"{FIELD_ANCHOR}. Read each figure as the reference's, not as yours; "
510
+ f"the `here:` lines say how each command can be run on this one."
511
+ )
503
512
  if self.transfers:
504
513
  return (
505
514
  f"This repository ({self.scope}) is within the size the figures "
sourcecode/cli.py CHANGED
@@ -27,6 +27,7 @@ from sourcecode.phased_run import PhasedRun
27
27
  from sourcecode.partial_contract import PARTIAL_EXIT_CODE as _PARTIAL_EXIT
28
28
  from sourcecode.partial_contract import read_count as _read_count
29
29
  from sourcecode import perf
30
+ from sourcecode.non_coverage import block as _non_coverage_block
30
31
  from sourcecode.caller_metrics import (
31
32
  CALLER_METRIC_RECONCILIATION,
32
33
  CYCLE_METRIC_RECONCILIATION,
@@ -7287,6 +7288,23 @@ def validation_cmd(
7287
7288
  except Exception:
7288
7289
  pass
7289
7290
 
7291
+ if data.get("programmatic_validation", {}).get("detected"):
7292
+ data.setdefault("non_coverage", _non_coverage_block("validation"))
7293
+ _vc = data.get("validation_confidence")
7294
+ if isinstance(_vc, dict):
7295
+ _vc["overall"] = "Likely"
7296
+ _vc["claim"] = (
7297
+ "Declared constraints are present, but programmatic Spring "
7298
+ "Validator wiring was detected outside this surface's model"
7299
+ )
7300
+ limits = _vc.setdefault("known_precision_limits", [])
7301
+ note = (
7302
+ "Programmatic Spring Validator / @InitBinder wiring is outside the "
7303
+ "declared-constraint surface."
7304
+ )
7305
+ if note not in limits:
7306
+ limits.append(note)
7307
+
7290
7308
  if path_prefix:
7291
7309
  data["endpoints"] = [
7292
7310
  e for e in data.get("endpoints", [])
@@ -14387,7 +14405,8 @@ def _cache_model_conditioning(path: Path) -> Any:
14387
14405
  line += f" ({found.reference})"
14388
14406
  per_command[row.command] = line
14389
14407
  return _cmodel.Conditioning(
14390
- scope=scope.describe(), transfers=transfers, per_command=per_command
14408
+ scope=scope.describe(), transfers=transfers, per_command=per_command,
14409
+ java_files=scope.java_files,
14391
14410
  )
14392
14411
  except Exception:
14393
14412
  # A cost note is never worth failing a command that answers.
@@ -321,6 +321,27 @@ NON_COVERAGE: tuple[NonCoverage, ...] = (
321
321
  "routes) is a measurement this command does not yet make."
322
322
  ),
323
323
  ),
324
+ NonCoverage(
325
+ id="NC-011",
326
+ surface="validation",
327
+ not_covered=(
328
+ "Programmatic Spring request-body validation wired with "
329
+ "`org.springframework.validation.Validator` or `@InitBinder`."
330
+ ),
331
+ why=(
332
+ "This surface reads declared bean-validation constraints recovered from "
333
+ "OpenAPI or DTO annotations. A validator registered in controller code "
334
+ "can enforce body rules without any declarative constraint on the "
335
+ "payload, so treating the result as fully verified would overstate what "
336
+ "the declared-constraint scan proves."
337
+ ),
338
+ instead=(
339
+ "`@InitBinder` / `setValidator(...)` wiring, or a Spring `Validator` "
340
+ "implementation, which this surface reports only as a coverage "
341
+ "boundary. `validation` still shows the declared rules; the programmatic "
342
+ "validator remains outside that model."
343
+ ),
344
+ ),
324
345
  )
325
346
 
326
347
 
@@ -162,7 +162,7 @@ _QUALIFIED_TYPE_RE = re.compile(r"\b[A-Z][A-Za-z0-9_$]*\.[A-Z][A-Za-z0-9_$]*")
162
162
 
163
163
  def _scan_repository(
164
164
  root: Path, simple_names: "set[str]", nested: "dict[str, tuple[str, str]]"
165
- ) -> "tuple[dict[str, str], dict[str, str]]":
165
+ ) -> "tuple[dict[str, str], dict[str, str], dict[str, str]]":
166
166
  """One walk, two questions — `(config-wired names, nested types other code names)`.
167
167
 
168
168
  Both scans need the whole tree, and walking it twice doubled the cost of the
@@ -175,6 +175,7 @@ def _scan_repository(
175
175
  """
176
176
  config_hits: dict[str, str] = {}
177
177
  nested_hits: dict[str, str] = {}
178
+ literal_hits: dict[str, str] = {}
178
179
  pending = set(simple_names)
179
180
  by_qualified: dict[str, list[str]] = {}
180
181
  for fqn, (qualified, _own) in nested.items():
@@ -183,7 +184,7 @@ def _scan_repository(
183
184
  scan_config = bool(pending)
184
185
  scan_java = bool(by_qualified)
185
186
  if not scan_config and not scan_java:
186
- return config_hits, nested_hits
187
+ return config_hits, nested_hits, literal_hits
187
188
 
188
189
  scanned = 0
189
190
  for dirpath, dirnames, filenames in os.walk(root):
@@ -191,7 +192,7 @@ def _scan_repository(
191
192
  for filename in filenames:
192
193
  is_java = filename.endswith(".java")
193
194
  is_config = os.path.splitext(filename)[1].lower() in _CONFIG_REF_EXTS
194
- if not ((is_java and scan_java) or (is_config and scan_config)):
195
+ if not ((is_java and (scan_java or scan_config)) or (is_config and scan_config)):
195
196
  continue
196
197
  if scanned >= _SCAN_MAX_FILES:
197
198
  break
@@ -206,6 +207,17 @@ def _scan_repository(
206
207
  pending.discard(hit)
207
208
  config_hits[hit] = rel
208
209
  scan_config = bool(pending)
210
+ if is_java and scan_config:
211
+ # A `Foo.class` literal is a real static reference, and the
212
+ # field audit found one of these on the annotation-dispatch path.
213
+ class_hits = {
214
+ hit for hit in pending
215
+ if f"{hit}.class" in text
216
+ }
217
+ for hit in class_hits:
218
+ pending.discard(hit)
219
+ literal_hits[hit] = rel
220
+ scan_config = bool(pending)
209
221
  if is_java and scan_java:
210
222
  for hit in set(_QUALIFIED_TYPE_RE.findall(text)) & set(by_qualified):
211
223
  for fqn in by_qualified[hit]:
@@ -213,10 +225,10 @@ def _scan_repository(
213
225
  nested_hits[fqn] = rel
214
226
  scan_java = len(nested_hits) < len(nested)
215
227
  if not scan_config and not scan_java:
216
- return config_hits, nested_hits
228
+ return config_hits, nested_hits, literal_hits
217
229
  if scanned >= _SCAN_MAX_FILES:
218
230
  break
219
- return config_hits, nested_hits
231
+ return config_hits, nested_hits, literal_hits
220
232
 
221
233
 
222
234
  def analyze_type_references(nodes: "list[dict]", root: Path) -> ReferenceFacts:
@@ -226,7 +238,15 @@ def analyze_type_references(nodes: "list[dict]", root: Path) -> ReferenceFacts:
226
238
  examined, because a method with no callers is a different question.
227
239
  """
228
240
  root = Path(root)
229
- types = [n for n in nodes or [] if n.get("type") in ("class", "interface") and n.get("fqn")]
241
+ def _node_kind(node: dict) -> str:
242
+ kind = str(node.get("symbol_kind") or node.get("kind") or node.get("type") or "")
243
+ if kind in ("class", "interface", "enum", "annotation", "record"):
244
+ return kind
245
+ if kind == "@interface":
246
+ return "annotation"
247
+ return str(node.get("type") or "")
248
+
249
+ types = [n for n in nodes or [] if _node_kind(n) in ("class", "interface", "enum", "annotation", "record") and n.get("fqn")]
230
250
  if not types:
231
251
  return ReferenceFacts(0, {s: 0 for s in STATUSES}, ())
232
252
 
@@ -237,7 +257,7 @@ def analyze_type_references(nodes: "list[dict]", root: Path) -> ReferenceFacts:
237
257
  entries.append(TypeReference(
238
258
  fqn=str(node["fqn"]), status=REFERENCED,
239
259
  basis="incoming edge in the call-graph",
240
- type=str(node.get("type") or ""), role=str(node.get("role") or "other"),
260
+ type=_node_kind(node), role=str(node.get("role") or "other"),
241
261
  ))
242
262
  else:
243
263
  candidates.append(node)
@@ -271,22 +291,30 @@ def analyze_type_references(nodes: "list[dict]", root: Path) -> ReferenceFacts:
271
291
  f"{parts[-2]}.{parts[-1]}",
272
292
  str(node.get("source_file") or "").replace("\\", "/"),
273
293
  )
274
- config_hits, nested_hits = _scan_repository(root, set(by_simple), nested_candidates)
294
+ config_hits, nested_hits, literal_hits = _scan_repository(root, set(by_simple), nested_candidates)
295
+ literal_refs: dict[str, str] = {}
275
296
  for simple, config_file in config_hits.items():
276
297
  for node in by_simple.get(simple, []):
277
298
  dispatch_basis[str(node["fqn"])] = f"named in {config_file}"
299
+ for simple, literal_file in literal_hits.items():
300
+ for node in by_simple.get(simple, []):
301
+ literal_refs[str(node["fqn"])] = literal_file
278
302
 
279
303
  for node in candidates:
280
304
  fqn = str(node["fqn"])
281
305
  common = {
282
306
  "fqn": fqn,
283
- "type": str(node.get("type") or ""),
307
+ "type": _node_kind(node),
284
308
  "role": str(node.get("role") or "other"),
285
309
  }
286
- if fqn in nested_hits:
310
+ if fqn in nested_hits or fqn in literal_refs:
287
311
  entries.append(TypeReference(
288
312
  status=REFERENCED,
289
- basis=f"named as a qualified nested type in {nested_hits[fqn]}",
313
+ basis=(
314
+ f"named as a qualified nested type in {nested_hits[fqn]}"
315
+ if fqn in nested_hits
316
+ else f"referenced by a class literal in {literal_refs[fqn]}"
317
+ ),
290
318
  **common,
291
319
  ))
292
320
  elif fqn in dispatch_basis:
@@ -3778,7 +3778,11 @@ def _parse_route_http_method(ann_name: str, args_str: str) -> str:
3778
3778
  if explicit:
3779
3779
  return explicit
3780
3780
  m = re.search(r'method\s*=\s*(?:RequestMethod\.)?(\w+)', args_str or "")
3781
- return m.group(1).upper() if m else ""
3781
+ if m:
3782
+ return m.group(1).upper()
3783
+ if ann_name == "@RequestMapping":
3784
+ return "ANY"
3785
+ return ""
3782
3786
 
3783
3787
 
3784
3788
  def _parse_route_extras(args_str: str) -> dict:
@@ -34,6 +34,7 @@ from pathlib import Path
34
34
  from typing import TYPE_CHECKING, Any, Optional
35
35
 
36
36
  from sourcecode.path_filters import is_test_path
37
+ from sourcecode.non_coverage import block as non_coverage_block
37
38
 
38
39
  if TYPE_CHECKING:
39
40
  from sourcecode.context_graph import ContextGraph
@@ -471,6 +472,47 @@ def _is_body_endpoint(ep: "dict[str, Any]") -> bool:
471
472
  return method in ("POST", "PUT", "PATCH")
472
473
 
473
474
 
475
+ def _programmatic_validation_signals(graph: "ContextGraph") -> "list[str]":
476
+ """Presence-only evidence for Spring Validator / InitBinder wiring.
477
+
478
+ The validation surface does not model these flows, but the command still
479
+ needs to say when a repo is using them so the declared-constraint summary is
480
+ not read as a full proof."""
481
+ evidence: list[str] = []
482
+
483
+ for t in graph.types():
484
+ if _is_excluded(t.source_file):
485
+ continue
486
+ sig = (t.signature or "")
487
+ if "org.springframework.validation.Validator" not in sig:
488
+ continue
489
+ if "ConstraintValidator" in sig:
490
+ continue
491
+ evidence.append(f"{t.fqn} implements org.springframework.validation.Validator")
492
+
493
+ for m in graph.symbols(kind="method"):
494
+ if _is_excluded(m.source_file):
495
+ continue
496
+ if m.has_annotation("InitBinder"):
497
+ evidence.append(f"{m.fqn} is annotated with @InitBinder")
498
+
499
+ if evidence:
500
+ return sorted(dict.fromkeys(evidence))
501
+
502
+ try:
503
+ for edge in graph.cir.call_graph:
504
+ target = str(edge.get("to") or edge.get("to_symbol") or "")
505
+ if target.endswith("setValidator"):
506
+ source = str(edge.get("from") or edge.get("from_symbol") or "")
507
+ if source:
508
+ evidence.append(f"{source} calls {target}")
509
+ break
510
+ except Exception:
511
+ pass
512
+
513
+ return sorted(dict.fromkeys(evidence))
514
+
515
+
474
516
  def build_validation_surface(
475
517
  root: Path,
476
518
  endpoints_data: "Optional[dict[str, Any]]" = None,
@@ -494,6 +536,7 @@ def build_validation_surface(
494
536
  graph = _build_graph(root)
495
537
 
496
538
  catalog = discover_custom_validators(root, graph)
539
+ programmatic_evidence = _programmatic_validation_signals(graph)
497
540
 
498
541
  out_endpoints: "list[dict[str, Any]]" = []
499
542
  gaps: "list[dict[str, Any]]" = []
@@ -579,6 +622,11 @@ def build_validation_surface(
579
622
  "gaps": len(gaps),
580
623
  },
581
624
  }
625
+ if programmatic_evidence:
626
+ result["programmatic_validation"] = {
627
+ "detected": True,
628
+ "evidence": programmatic_evidence,
629
+ }
582
630
  spec_path = endpoints_data.get("openapi_spec")
583
631
  if spec_path:
584
632
  result["openapi_spec"] = spec_path
@@ -661,7 +709,48 @@ def build_validation_surface(
661
709
  "expected for such repos, not a missing-validation finding."
662
710
  )
663
711
 
712
+ if programmatic_evidence:
713
+ result["non_coverage"] = non_coverage_block("validation")
714
+ result["note"] = (
715
+ result.get("note", "")
716
+ + " Programmatic Spring Validator wiring was detected, which is "
717
+ "outside the declared-constraint surface this command models."
718
+ ).strip()
719
+ if not result.get("gaps"):
720
+ result["gaps"] = [
721
+ {
722
+ "method": "",
723
+ "path": "",
724
+ "controller": "",
725
+ "reason": "programmatic_validator_wiring_unmodeled",
726
+ "basis": "programmatic_validation",
727
+ "confidence": "Likely",
728
+ }
729
+ ]
730
+ result["summary"]["gaps"] = 1
731
+
664
732
  _reconcile_with_code_axis(result, graph, root)
733
+ if programmatic_evidence:
734
+ result["non_coverage"] = non_coverage_block("validation")
735
+ note = result.get("note", "")
736
+ programmatic_note = (
737
+ " Programmatic Spring Validator wiring was detected, which is "
738
+ "outside the declared-constraint surface this command models."
739
+ )
740
+ if programmatic_note.strip() not in note:
741
+ result["note"] = (note + programmatic_note).strip()
742
+ if not result.get("gaps"):
743
+ result["gaps"] = [
744
+ {
745
+ "method": "",
746
+ "path": "",
747
+ "controller": "",
748
+ "reason": "programmatic_validator_wiring_unmodeled",
749
+ "basis": "programmatic_validation",
750
+ "confidence": "Likely",
751
+ }
752
+ ]
753
+ result["summary"]["gaps"] = 1
665
754
  return result
666
755
 
667
756
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sourcecode
3
- Version: 5.4.2
3
+ Version: 5.5.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
@@ -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.4.2-blue)
45
+ ![Version](https://img.shields.io/badge/version-5.5.0-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.4.2 — and, on a build that has aged,
129
+ ask version # ask 5.5.0 — 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=WQWTkDakQXjcnyUFAJbBeG-cxLTeltlVtdTrNrLgbE0,308
1
+ sourcecode/__init__.py,sha256=kIpmlxwOoXC5aa6kJcz5s9dCm4R4SN2RiXVFk3uxLJQ,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
@@ -10,7 +10,7 @@ sourcecode/audit_report.py,sha256=xLoGd-J8DKL4m1E7Rz8uvEKIg89yr_yUzVEPxQcJxvo,93
10
10
  sourcecode/baseline_autocapture.py,sha256=aKjZfKKi2qXOMKlvAWq-gvCDoTYzeQcVBInMf_bC8dU,16902
11
11
  sourcecode/bundled_docs.py,sha256=hvQeUNDo9SEp_Mtf6o9bexKUmJ8YW76rXKn9spRfQQs,2581
12
12
  sourcecode/cache.py,sha256=CK_J8NqyaTNZ57KQT-R4puqI8yYlzG5WL7uLFRbzods,41727
13
- sourcecode/cache_model.py,sha256=B0mvOLwHG7wo1JoCzHoNoI5_0TV-PnhicJM8fWkrVDI,57050
13
+ sourcecode/cache_model.py,sha256=owPgg0IgzIfwwQvLREMfqCZMyF2t3svfppIg4HscR8g,57677
14
14
  sourcecode/call_surface.py,sha256=fiqYfHooxN1fX9oQoysq1LS3LoZcobhyUNjAGEZKpwk,4148
15
15
  sourcecode/caller_metrics.py,sha256=--sFGDnIog_YGu9xZHMcB91F5xZakfaAKvy15xU54hg,7904
16
16
  sourcecode/caller_reach.py,sha256=RRF49tv4-QswraJ2vsZ89VAMOj7BmYXlAdXr-tLP_CA,9483
@@ -19,7 +19,7 @@ sourcecode/chain_rules.py,sha256=Bi6UHfgd-GxWswmnHRcPz5jdbAuqka3Zkz_P-MTvqhw,127
19
19
  sourcecode/change_plan.py,sha256=aX1mp2XnlDN-8R2BcTiu8HlkDwQ_4fN1ZLckj0VMXHM,9945
20
20
  sourcecode/cir_graphs.py,sha256=9G0HHj1kw2325IDyzo2OpX73BNswEckecf4MZUXB4JM,12078
21
21
  sourcecode/classifier.py,sha256=JBzPwSSrDG-tUHAbcKB678HRbjLpD-ohzbzzO62mgpo,20114
22
- sourcecode/cli.py,sha256=YDsp5GnmTGI3XsQqCD_XU4mj7sCJ7zCCZvBQGagroDU,645060
22
+ sourcecode/cli.py,sha256=vV53BEtmpl97Kz2a00Sk88_SKgdbd17B5mA52tMLcas,645928
23
23
  sourcecode/client_calls.py,sha256=5_sBfFVXi6RgGiyWrlJKH4x4EF21do6gKlAOuFCKAoA,17709
24
24
  sourcecode/code_notes_analyzer.py,sha256=EJemNCNc9Dn-1RZYu-aNbK0ELzmsyC4s6FdHi3XyNEI,9392
25
25
  sourcecode/compare.py,sha256=2GdDy0qkDSgmkkpgvoCHitoLj3mt30EeFgJ8PGEXJng,14712
@@ -75,7 +75,7 @@ sourcecode/mcp_nudge.py,sha256=lKemOqK_wny2u7Ymcr2Idi5Kx8pXY02jCi-_nJYLGMg,2992
75
75
  sourcecode/metrics_analyzer.py,sha256=gLoRWKygF18jLgwsqmGXSWopw-f5iO1VbM7Jjdif6ag,22809
76
76
  sourcecode/migrate_check.py,sha256=8KKgsiiWu21XwCXgFV1bB8AVsB-pl6KNBTmMW6NYGB8,149028
77
77
  sourcecode/migration_blast.py,sha256=OPryWkM6-PbvcG3eJFdcWUnlpXBje41nu2BkrZnE2hg,9359
78
- sourcecode/non_coverage.py,sha256=9d-H0MISBov4sRqI6hD_1LX8q-bUDsB6g8jhvezftBM,22526
78
+ sourcecode/non_coverage.py,sha256=sKp0J4_hKzKb_HMoXtdP91D0lMfEAPrOx44sqdQc18Y,23520
79
79
  sourcecode/openapi_surface.py,sha256=BTt0K-woZbkbWTN77IkqeBm_Okag9owR0848fmot8sk,16207
80
80
  sourcecode/openrewrite_recipe.py,sha256=4dyY5twRB6Xew-G9Zy5FafNZwlMU1S7DnRa2FqPkhpQ,12233
81
81
  sourcecode/output_budget.py,sha256=GxoFnbwk0dvqScgmMRPZHj7m-zRIoHLwUKplrH0u89s,13872
@@ -99,13 +99,13 @@ sourcecode/readiness_timeline.py,sha256=KjghC1MWH7Tzto97TBR3N0F8FkR87w5z7lZ1QsWv
99
99
  sourcecode/readonly.py,sha256=dqGiNVvpfi4Ww8VzwUs6E3SdbqcHL1LFHItIK7IjrM0,5830
100
100
  sourcecode/reconciliation.py,sha256=GU-1PTcVr8zcbtC7BASfpHcZndP9AdboXPNQiBc0fzo,34251
101
101
  sourcecode/redactor.py,sha256=SB4hwIvg8h-hvcqKcDWaZvA-aSyn-at-BIRwa0tUv5E,3227
102
- sourcecode/reference_facts.py,sha256=Ns495c6eTmq2SrqPkcUrJUJru4_wj_yRWm4YDeJwves,13440
102
+ sourcecode/reference_facts.py,sha256=3r8EnbKewOAls3FOggDWnTr84eogJoQ8fVVdvyXSpfE,14801
103
103
  sourcecode/release_info.py,sha256=IQdMsFrQM4IVHNmwXWS7TbtRu80_oWugvNrYnpQ0bao,5895
104
104
  sourcecode/relevance_scorer.py,sha256=0AgEt4KrV73nioMqBgjhGjtY7L2C7L7cSyKtj3IKcrw,9408
105
105
  sourcecode/remedies.py,sha256=V2_cD4pLq8bKRkzF-3RGFoiu1xWYZS384WDVp1MrlZw,10225
106
106
  sourcecode/rename_refactor.py,sha256=h6dNFlB9aZ_3q6heeHBkgXQeXaT03nvPSsYH6P8qxFg,12965
107
107
  sourcecode/repo_classifier.py,sha256=FG1vaWKdWXsWdl-S8hjVMiTqcwgaRXkDyvK4rPcOGtQ,22681
108
- sourcecode/repository_ir.py,sha256=zuB1FyLZ_fR_CLEmR1gREvlICmz88vtDwM8cF8XcdGI,380354
108
+ sourcecode/repository_ir.py,sha256=AAX2OCLNIBcTicuHH-WydIJStBVPjbdkBbYCwOhFYWs,380428
109
109
  sourcecode/ris.py,sha256=Xbx34dkJI_uXil9xsgw-fA_Apcm4nbnTjQgFm66dP1g,27489
110
110
  sourcecode/risk.py,sha256=432XEiL9xp8JBaxidwQInZBN4F98QJLAsqgZrh3CKow,81790
111
111
  sourcecode/rule_catalog.py,sha256=pTkgkQZ1u7atB3fkQJ9BPWo8lNiamvEuRN7MtRgle0c,5263
@@ -146,7 +146,7 @@ sourcecode/token_estimate.py,sha256=G-ivzIJfVq5TLQN04dC0WK4LZJjWVYL54Ebcxe4fJ7M,
146
146
  sourcecode/tree_utils.py,sha256=8GAkIfQAsvtEudIeW1l4ooH_oRtrWR8cpJQJsEa_Pfw,2093
147
147
  sourcecode/type_usage_surface.py,sha256=51IrKRQoIoRnlsiDjHnqpJBn2rc6E59aRhgS0HTzAF0,4428
148
148
  sourcecode/validation_inference.py,sha256=-oWJqE6PqkqcZbCFDJeWCQHgI9Dbuv5ggJWD3LE_2IU,20817
149
- sourcecode/validation_surface.py,sha256=jYL-hkDjaaRKkAt7ZUcbxm3Dydl8o6KVRhTkuPXKPVc,31460
149
+ sourcecode/validation_surface.py,sha256=2wQAEfzWKAymsptGLaIlN-xw2C7ozE4zO-WR8a7qr20,34857
150
150
  sourcecode/verify_edit.py,sha256=SUaJeH5Icc54mutQx3-gh7i8U6d50cb_oxYc9SDUnHs,42757
151
151
  sourcecode/verify_repo.py,sha256=aHlNIUfoVVUxTXTNtSFryP4dOFBOvCfdyC31fFRXU6s,15346
152
152
  sourcecode/verify_rules.py,sha256=R3l6nLT6WQzUNBzxtmnxyGZcKj9qMDW38Y0c0gNdCGk,19973
@@ -213,9 +213,9 @@ sourcecode/telemetry/events.py,sha256=4_yeO58U-Cwc1Qb27VB0_EjhmroY0k91n3_VGxeALB
213
213
  sourcecode/telemetry/filters.py,sha256=RzxauTz8HliO4BllQnXEXc7zTeqdCZi5MgqGEDuW7OQ,6570
214
214
  sourcecode/telemetry/transport.py,sha256=4gGHsq0WeY9VywEZXA3vUxykfiYnw9uuqfjAAec7F8o,1681
215
215
  sourcecode/_docs/DEFECT-LEDGER.md,sha256=sTFPEV2xx-L9n4mrG8UO4LxeETMJpGKHXyKQBZlqNog,497112
216
- sourcecode/_docs/USER_GUIDE.md,sha256=-gPDFEQLLtERE1MUBwIVV0bFkO7gAXjHJZYjaVi5Mk4,79546
217
- sourcecode-5.4.2.dist-info/METADATA,sha256=PoQ4vxB_dsPXHdslpC_UhP7uzaGRQSpvpeb_a7WlFP0,47104
218
- sourcecode-5.4.2.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
219
- sourcecode-5.4.2.dist-info/entry_points.txt,sha256=-JEAdChrK5We51kZcb7OaDcyil-dHBjBPL-NhuO-QY8,89
220
- sourcecode-5.4.2.dist-info/licenses/LICENSE,sha256=7DdHrU9Z_3e7dSvq4ISijZNjnuHo5NIHNiHDouMQ9JU,10491
221
- sourcecode-5.4.2.dist-info/RECORD,,
216
+ sourcecode/_docs/USER_GUIDE.md,sha256=yRFIp4sx38X4KSxIf1RjwCiWsvKSmJ-IoPkzHOOsMI4,79546
217
+ sourcecode-5.5.0.dist-info/METADATA,sha256=jg3OolyQqoitfNoZCkPqc8nQm20P8TZogBj2pyC8ljA,47104
218
+ sourcecode-5.5.0.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
219
+ sourcecode-5.5.0.dist-info/entry_points.txt,sha256=-JEAdChrK5We51kZcb7OaDcyil-dHBjBPL-NhuO-QY8,89
220
+ sourcecode-5.5.0.dist-info/licenses/LICENSE,sha256=7DdHrU9Z_3e7dSvq4ISijZNjnuHo5NIHNiHDouMQ9JU,10491
221
+ sourcecode-5.5.0.dist-info/RECORD,,