spark: generated LOC report for Hermes spark profile using pygount
This commit is contained in:
1 parent
48b180cb70
commit
2084c924b1
7 files changed
+273
-25
No files matched your search
+24
-15
@@ -170,6 +170,23 @@ def classify(cmd: str | None):
|
||||
return primary, faults, detail
|
||||
|
||||
|
||||
def _write_json_file(path: str, obj) -> int:
|
||||
"""Write obj as indented JSON to path. Returns 0 on success, 2 on OSError.
|
||||
|
||||
Extracted from the two sites that previously hand-duplicated the
|
||||
open/dump/write/newline/except block: report() and the --check/--json
|
||||
branch in main(). Both used indent=2 with default sort_keys=False.
|
||||
"""
|
||||
try:
|
||||
with open(path, "w", encoding="utf-8") as fh:
|
||||
json.dump(obj, fh, indent=2, sort_keys=False)
|
||||
fh.write("\n")
|
||||
except OSError as exc:
|
||||
print("cannot write --json " + path + ": " + str(exc), file=sys.stderr)
|
||||
return 2
|
||||
return 0
|
||||
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# The runner's own logs
|
||||
# --------------------------------------------------------------------------
|
||||
@@ -463,13 +480,9 @@ def report(runs: list[dict], as_json: str | None, quiet: bool,
|
||||
"ralph_dir": os.path.dirname(graded[0]["runner_log"])
|
||||
if graded and graded[0]["runner_log"] else None,
|
||||
"runs": graded, "summary": summary}
|
||||
try:
|
||||
with open(as_json, "w", encoding="utf-8") as fh:
|
||||
json.dump(payload, fh, indent=2, sort_keys=False)
|
||||
fh.write("\n")
|
||||
except OSError as exc:
|
||||
print("cannot write --json " + as_json + ": " + str(exc), file=sys.stderr)
|
||||
return 2
|
||||
rc = _write_json_file(as_json, payload)
|
||||
if rc:
|
||||
return rc
|
||||
if not quiet:
|
||||
print(f"\njson -> {as_json}")
|
||||
return 0
|
||||
@@ -508,14 +521,10 @@ def main(argv=None) -> int:
|
||||
if detail:
|
||||
print(f" detail: {json.dumps(detail)}")
|
||||
if a.json:
|
||||
try:
|
||||
with open(a.json, "w", encoding="utf-8") as fh:
|
||||
json.dump({"check": a.check, "class": primary, "faults": faults,
|
||||
"detail": detail}, fh, indent=2)
|
||||
fh.write("\n")
|
||||
except OSError as exc:
|
||||
print("cannot write --json " + a.json + ": " + str(exc), file=sys.stderr)
|
||||
return 2
|
||||
rc = _write_json_file(a.json, {"check": a.check, "class": primary,
|
||||
"faults": faults, "detail": detail})
|
||||
if rc:
|
||||
return rc
|
||||
return 1 if (a.fail_on_fault and primary != "SOUND") else 0
|
||||
|
||||
if a.log:
|
||||
|
||||
+20
-10
@@ -356,6 +356,21 @@ def _grade(base, *args):
|
||||
return rc, buf.getvalue()
|
||||
|
||||
|
||||
def _install_checkin_check(base):
|
||||
"""Copy checkin_check.py into a fixture repo's tools/ dir (DRY: inlined 5x).
|
||||
|
||||
gate_blame grades each fixture by the tool file the fixture carries, so
|
||||
checkin_check.py is installed into <base>/tools/ for fixtures A through E.
|
||||
The two-line shutil.copy that did this was hand-duped five times; this
|
||||
factors it into one self-contained definition. Behavior is unchanged: same
|
||||
source file, same destination, same bytes on disk. `here` is resolved from
|
||||
this module's own __file__ so the helper stays correct from a lone copy.
|
||||
"""
|
||||
here = os.path.dirname(os.path.abspath(__file__))
|
||||
shutil.copy(os.path.join(here, "checkin_check.py"),
|
||||
os.path.join(base, "tools", "checkin_check.py"))
|
||||
|
||||
|
||||
def selftest():
|
||||
here = os.path.dirname(os.path.abspath(__file__))
|
||||
cells, failures = [], []
|
||||
@@ -371,8 +386,7 @@ def selftest():
|
||||
a = os.path.join(base, "a")
|
||||
os.makedirs(os.path.join(a, "tools"))
|
||||
os.makedirs(os.path.join(a, "checkins"))
|
||||
shutil.copy(os.path.join(here, "checkin_check.py"),
|
||||
os.path.join(a, "tools", "checkin_check.py"))
|
||||
_install_checkin_check(a)
|
||||
with open(os.path.join(a, "tools", "checkin_baseline.tsv"), "w") as fh:
|
||||
fh.write("# empty ledger: every fault is new\n")
|
||||
with open(os.path.join(a, "WIZARDS-TABLE.md"), "w") as fh:
|
||||
@@ -396,8 +410,7 @@ def selftest():
|
||||
b = os.path.join(base, "b")
|
||||
os.makedirs(os.path.join(b, "tools"))
|
||||
os.makedirs(os.path.join(b, "checkins"))
|
||||
shutil.copy(os.path.join(here, "checkin_check.py"),
|
||||
os.path.join(b, "tools", "checkin_check.py"))
|
||||
_install_checkin_check(b)
|
||||
with open(os.path.join(b, "tools", "checkin_baseline.tsv"), "w") as fh:
|
||||
fh.write("# empty ledger\n")
|
||||
with open(os.path.join(b, "WIZARDS-TABLE.md"), "w") as fh:
|
||||
@@ -417,8 +430,7 @@ def selftest():
|
||||
c = os.path.join(base, "c")
|
||||
os.makedirs(os.path.join(c, "tools"))
|
||||
os.makedirs(os.path.join(c, "checkins"))
|
||||
shutil.copy(os.path.join(here, "checkin_check.py"),
|
||||
os.path.join(c, "tools", "checkin_check.py"))
|
||||
_install_checkin_check(c)
|
||||
with open(os.path.join(c, "tools", "checkin_baseline.tsv"), "w") as fh:
|
||||
fh.write("# empty ledger\n")
|
||||
with open(os.path.join(c, "WIZARDS-TABLE.md"), "w") as fh:
|
||||
@@ -440,8 +452,7 @@ def selftest():
|
||||
_repo(d)
|
||||
_fixture(d, {}, "d1 no tools dir", "2026-10-20T10:00:00+00:00")
|
||||
os.makedirs(os.path.join(d, "tools"))
|
||||
shutil.copy(os.path.join(here, "checkin_check.py"),
|
||||
os.path.join(d, "tools", "checkin_check.py"))
|
||||
_install_checkin_check(d)
|
||||
with open(os.path.join(d, "tools", "checkin_baseline.tsv"), "w") as fh:
|
||||
fh.write("# empty ledger\n")
|
||||
_fixture(d, {"WIZARDS-TABLE.md": TABLE}, "d2 adds the tool",
|
||||
@@ -455,8 +466,7 @@ def selftest():
|
||||
e = os.path.join(base, "e")
|
||||
os.makedirs(os.path.join(e, "tools"))
|
||||
os.makedirs(os.path.join(e, "checkins"))
|
||||
shutil.copy(os.path.join(here, "checkin_check.py"),
|
||||
os.path.join(e, "tools", "checkin_check.py"))
|
||||
_install_checkin_check(e)
|
||||
_repo(e)
|
||||
_fixture(e, {"WIZARDS-TABLE.md": TABLE}, "e1 no check-ins",
|
||||
"2026-10-20T10:00:00+00:00")
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
=== forge dry-refactor commit verification ===
|
||||
timestamp: 2026-10-23T20:49:41Z
|
||||
HEAD: 7b33259 sol: sol-profile triage report (368 files: 97 ACTIVE, 265 STALE, 6 ARTIFACT, 0 DEAD)
|
||||
|
||||
--- git diff --stat ---
|
||||
tools/check_lint.py | 39 ++++++++++++++++++++++++---------------
|
||||
tools/gate_blame.py | 30 ++++++++++++++++++++----------
|
||||
2 files changed, 44 insertions(+), 25 deletions(-)
|
||||
|
||||
--- verify_gate_blame_dry_refactor.py ---
|
||||
[ok ] [1] selftest: original (HEAD) 21/21 rc 0
|
||||
[ok ] [2] selftest: refactored (working tree) 21/21 rc 0
|
||||
[ok ] [3] selftest: stdout BYTE-IDENTICAL (original == refactored)
|
||||
[ok ] [4] code-level: refactored HAS the helper; original has none
|
||||
[ok ] [5] code-level: refactored has 0 inlined sites; original has 5
|
||||
[ok ] [6] non-vacuity: live run produced a real 21-cell census
|
||||
|
||||
verify: 6 checks, 6 passed, 0 failed
|
||||
gate_blame rc=0
|
||||
|
||||
--- verify_check_lint_dry_refactor.py ---
|
||||
[ok ] [1] selftest: original (HEAD) 37/37 rc 0
|
||||
[ok ] [2] selftest: refactored (working tree) 37/37 rc 0
|
||||
[ok ] [3] selftest: stdout BYTE-IDENTICAL (original == refactored)
|
||||
[ok ] [4] code-level: refactored HAS _write_json_file; original NONE
|
||||
[ok ] [5] code-level: json.dump( count 2 in original, 1 in refactored
|
||||
[ok ] [6] non-vacuity: live run produced a real 37-cell census
|
||||
[ok ] [7] --check --json: stdout + JSON file BYTE-IDENTICAL (rc match)
|
||||
[ok ] [8] --check --json unwritable path: both return rc 2
|
||||
|
||||
verify: 8 checks, 8 passed, 0 failed
|
||||
check_lint rc=0
|
||||
|
||||
--- selftest gate_blame.py --selftest ---
|
||||
selftest: 21 cells, 21 passed, 0 failed
|
||||
rc=0
|
||||
|
||||
--- selftest check_lint.py --selftest ---
|
||||
selftest: 37 cells, 37 passed, 0 failed
|
||||
rc=0
|
||||
@@ -0,0 +1,95 @@
|
||||
# forge: commit verified DRY refactors — gate_blame + check_lint
|
||||
|
||||
forge lane: Refactor. Two behavior-preserving DRY extractions in the working
|
||||
tree, verified green against `HEAD` (the committed pre-refactor original), then
|
||||
committed to origin/main.
|
||||
|
||||
## The work
|
||||
|
||||
### 1. gate_blame.py — `_install_checkin_check`
|
||||
`--selftest` (21 cells) installs `checkin_check.py` into five fixture repos (A-E)
|
||||
so `verify.py` grades each fixture by its own tree. The installer was a two-line
|
||||
`shutil.copy` block, hand-duped five times:
|
||||
|
||||
```python
|
||||
shutil.copy(os.path.join(here, "checkin_check.py"),
|
||||
os.path.join(<base>, "tools", "checkin_check.py"))
|
||||
```
|
||||
|
||||
Collapsed into one module-level helper:
|
||||
|
||||
```python
|
||||
def _install_checkin_check(base):
|
||||
here = os.path.dirname(os.path.abspath(__file__))
|
||||
shutil.copy(os.path.join(here, "checkin_check.py"),
|
||||
os.path.join(base, "tools", "checkin_check.py"))
|
||||
```
|
||||
|
||||
Five call sites (A-E) become five `_install_checkin_check(<base>)` calls. Same
|
||||
source, same destination, same bytes.
|
||||
|
||||
### 2. check_lint.py — `_write_json_file`
|
||||
Two `--json` output paths (`report()` and `main()`'s `--check --json` branch)
|
||||
each inlined an identical try/except json-dump block. Collapsed into one helper
|
||||
returning `0`/`2` (the repo's "could not grade" code), preserving `indent=2`,
|
||||
`sort_keys=False`, the `\n` terminator, the exact error message, and the rc-2
|
||||
contract.
|
||||
|
||||
## ORIGINAL vs REFACTORED
|
||||
- ORIGINAL = `git show HEAD:tools/<tool>.py` (the committed pre-refactor source).
|
||||
- REFACTORED = working tree / committed tree (post-commit).
|
||||
|
||||
Both anchors are stable: `HEAD` here is the last tree without this commit.
|
||||
|
||||
## Evidence (measured, fresh run captured in DRY_REFACTOR_COMMIT_EVIDENCE.log)
|
||||
|
||||
```
|
||||
--- git diff --stat ---
|
||||
tools/check_lint.py | 39 ++++++++++++++++++++++++---------------
|
||||
tools/gate_blame.py | 30 +++++++++++++++++++----------
|
||||
2 files changed, 44 insertions(+), 25 deletions(-)
|
||||
|
||||
--- verify_gate_blame_dry_refactor.py ---
|
||||
[ok ] [1] selftest: original (HEAD) 21/21 rc 0
|
||||
[ok ] [2] selftest: refactored (working tree) 21/21 rc 0
|
||||
[ok ] [3] selftest: stdout BYTE-IDENTICAL (original == refactored)
|
||||
[ok ] [4] code-level: refactored HAS the helper; original has none
|
||||
[ok ] [5] code-level: refactored has 0 inlined sites; original has 5
|
||||
[ok ] [6] non-vacuity: live run produced a real 21-cell census
|
||||
verify: 6 checks, 6 passed, 0 failed (rc 0)
|
||||
|
||||
--- verify_check_lint_dry_refactor.py ---
|
||||
[ok ] [1] selftest: original (HEAD) 37/37 rc 0
|
||||
[ok ] [2] selftest: refactored (working tree) 37/37 rc 0
|
||||
[ok ] [3] selftest: stdout BYTE-IDENTICAL (original == refactored)
|
||||
[ok ] [4] code-level: refactored HAS _write_json_file; original NONE
|
||||
[ok ] [5] code-level: json.dump( count 2 in original, 1 in refactored
|
||||
[ok ] [6] non-vacuity: live run produced a real 37-cell census
|
||||
[ok ] [7] --check --json: stdout + JSON file BYTE-IDENTICAL (rc match)
|
||||
[ok ] [8] --check --json unwritable path: both return rc 2
|
||||
verify: 8 checks, 8 passed, 0 failed (rc 0)
|
||||
|
||||
--- selftest gate_blame.py --selftest ---
|
||||
selftest: 21 cells, 21 passed, 0 failed (rc 0)
|
||||
--- selftest check_lint.py --selftest ---
|
||||
selftest: 37 cells, 37 passed, 0 failed (rc 0)
|
||||
```
|
||||
|
||||
## Non-tautology proof
|
||||
Against the pinned original (`git show HEAD:`), the smells genuinely existed
|
||||
(gate_blame: 5 inlined sites in HEAD, 0 in refactored; check_lint: 2
|
||||
`json.dump(` call sites in HEAD, 1 in refactored) and the helper definitions
|
||||
exist only in the refactored source. The selftest census is a real 37-cell and
|
||||
21-cell run, not a stub, and stdout is byte-identical pre/post-refactor.
|
||||
|
||||
## Artifacts
|
||||
- Refactored tools: `tools/gate_blame.py`, `tools/check_lint.py`
|
||||
- Verifiers (committed): `wizard-work/forge/verify_gate_blame_dry_refactor.py`,
|
||||
`wizard-work/forge/verify_check_lint_dry_refactor.py`
|
||||
- Fresh evidence log: `DRY_REFACTOR_COMMIT_EVIDENCE.log`
|
||||
- Report: this file
|
||||
- Post-check CHECK (see verdict below): selftests on the committed tree
|
||||
|
||||
VERDICT: PASS — both DRY refactors verified green (gate_blame 6/6, check_lint
|
||||
8/8; selftests 21/21 + 37/37, byte-identical stdout) and committed to origin/main.
|
||||
EXIT=0
|
||||
@@ -0,0 +1,3 @@
|
||||
|
||||
|
||||
{"formatVersion": "1.1.0", "pygountVersion": "3.2.0", "files": [{"codeCount": 0, "documentationCount": 4, "emptyCount": 3, "group": "spark", "isCountable": true, "language": "Markdown", "lineCount": 7, "path": "/root/.hermes/profiles/spark/SOUL.md", "state": "analyzed", "stateInfo": null, "sourceCount": 0}, {"codeCount": 14, "documentationCount": 0, "emptyCount": 5, "group": "spark", "isCountable": true, "language": "JSON", "lineCount": 19, "path": "/root/.hermes/profiles/spark/auth.json", "state": "analyzed", "stateInfo": null, "sourceCount": 14}, {"codeCount": 0, "documentationCount": 0, "emptyCount": 0, "group": "spark", "isCountable": false, "language": "__generated__", "lineCount": 0, "path": "/root/.hermes/profiles/spark/auth.lock", "state": "generated", "stateInfo": "(?s:.*\\.lock)\\z", "sourceCount": 0}, {"codeCount": 0, "documentationCount": 0, "emptyCount": 0, "group": "spark", "isCountable": false, "language": "__unknown__", "lineCount": 0, "path": "/root/.hermes/profiles/spark/backups/config/config.yaml.good.20261011-153604", "state": "unknown", "stateInfo": null, "sourceCount": 0}, {"codeCount": 0, "documentationCount": 0, "emptyCount": 0, "group": "spark", "isCountable": false, "language": "__unknown__", "lineCount": 0, "path": "/root/.hermes/profiles/spark/backups/config/config.yaml.good.20261011-153610", "state": "unknown", "stateInfo": null, "sourceCount": 0}, {"codeCount": 0, "documentationCount": 0, "emptyCount": 0, "group": "spark", "isCountable": false, "language": "__unknown__", "lineCount": 0, "path": "/root/.hermes/profiles/spark/backups/config/config.yaml.good.20261012-085041", "state": "unknown", "stateInfo": null, "sourceCount": 0}, {"codeCount": 0, "documentationCount": 0, "emptyCount": 0, "group": "spark", "isCountable": false, "language": "__unknown__", "lineCount": 0, "path": "/root/.hermes/profiles/spark/backups/config/config.yaml.good.20261014-165715", "state": "unknown", "stateInfo": null, "sourceCount": 0}, {"codeCount": 0, "documentationCount": 0, "emptyCount": 0, "group": "spark", "isCountable": false, "language": "__binary__", "lineCount": 0, "path": "/root/.hermes/profiles/spark/bin/tirith", "state": "binary", "stateInfo": null, "sourceCount": 0}, {"codeCount": 6705, "documentationCount": 0, "emptyCount": 1708, "group": "spark", "isCountable": true, "language": "JSON", "lineCount": 8413, "path": "/root/.hermes/profiles/spark/cache/endpoint_model_metadata.json", "state": "analyzed", "stateInfo": null, "sourceCount": 6705}, {"codeCount": 345, "documentationCount": 0, "emptyCount": 86, "group": "spark", "isCountable": true, "language": "JSON", "lineCount": 475, "path": "/root/.hermes/profiles/spark/cache/nous_recommended_cache.json", "state": "analyzed", "stateInfo": null, "sourceCount": 389}, {"codeCount": 22, "documentationCount": 0, "emptyCount": 12, "group": "spark", "isCountable": true, "language": "JSON", "lineCount": 38, "path": "/root/.hermes/profiles/spark/cache/oauth_heal_clean.json", "state": "analyzed", "stateInfo": null, "sourceCount": 26}, {"codeCount": 1, "documentationCount": 0, "emptyCount": 0, "group": "spark", "isCountable": true, "language": "JSON", "lineCount": 1, "path": "/root/.hermes/profiles/spark/cache/plugin_toolset_keys.json", "state": "analyzed", "stateInfo": null, "sourceCount": 1}, {"codeCount": 1479, "documentationCount": 0, "emptyCount": 632, "group": "spark", "isCountable": true, "language": "JSON", "lineCount": 2981, "path": "/root/.hermes/profiles/spark/cache/reasoning_caps.json", "state": "analyzed", "stateInfo": null, "sourceCount": 2349}, {"codeCount": 1, "documentationCount": 0, "emptyCount": 0, "group": "spark", "isCountable": true, "language": "JSON", "lineCount": 1, "path": "/root/.hermes/profiles/spark/cache/schema_columns.json", "state": "analyzed", "stateInfo": null, "sourceCount": 1}, {"codeCount": 87, "documentationCount": 0, "emptyCount": 0, "group": "spark", "isCountable": true, "language": "Bash", "lineCount": 87, "path": "/root/.hermes/profiles/spark/cache/scratch/hermes-snap-18c65962e510.sh", "state": "analyzed", "stateInfo": null, "sourceCount": 87}, {"codeCount": 87, "documentationCount": 0, "emptyCount": 0, "group": "spark", "isCountable": true, "language": "Bash", "lineCount": 87, "path": "/root/.hermes/profiles/spark/cache/scratch/hermes-snap-717571bc4904.sh", "state": "analyzed", "stateInfo": null, "sourceCount": 87}, {"codeCount": 87, "documentationCount": 0, "emptyCount": 0, "group": "spark", "isCountable": true, "language": "Bash", "lineCount": 87, "path": "/root/.hermes/profiles/spark/cache/scratch/hermes-snap-907824848c8a.sh", "state": "analyzed", "stateInfo": null, "sourceCount": 87}, {"codeCount": 0, "documentationCount": 0, "emptyCount": 0, "group": "spark", "isCountable": false, "language": "__binary__", "lineCount": 0, "path": "/root/.hermes/profiles/spark/cache/scratch/node-compile-cache/v26.7.0-x64-8d7ad2ee-0/004fa13c", "state": "binary", "stateInfo": null, "sourceCount": 0}, {"codeCount": 0, "documenLine truncated
|
||||
@@ -0,0 +1,31 @@
|
||||
# Hermes Profile LOC Analysis Report
|
||||
# Generated for: /root/.hermes/profiles/spark/
|
||||
# Tool: pygount 3.2.0
|
||||
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━┳━━━━━━━━━┳━━━━━━━┓
|
||||
Language ┃ Files ┃ % ┃ Code ┃ % ┃ Comment ┃ % ┃
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━╇━━━━━━━━━╇━━━━━━━┫
|
||||
JSON │ 32 │ 3.3 │ 15226 │ 68.3 │ 0 │ 0.0 │
|
||||
Python │ 50 │ 5.1 │ 7894 │ 68.1 │ 1427 │ 12.3 │
|
||||
Bash │ 9 │ 0.9 │ 487 │ 81.2 │ 69 │ 11.5 │
|
||||
HTML │ 2 │ 0.2 │ 473 │ 66.2 │ 104 │ 14.6 │
|
||||
JavaScript+Genshi Text │ 2 │ 0.2 │ 132 │ 47.8 │ 69 │ 25.0 │
|
||||
YAML │ 2 │ 0.2 │ 32 │ 62.7 │ 11 │ 21.6 │
|
||||
JavaScript │ 1 │ 0.1 │ 28 │ 54.9 │ 4 │ 7.8 │
|
||||
Groff │ 4 │ 0.4 │ 0 │ 0.0 │ 131481 │ 98.5 │
|
||||
Markdown │ 267 │ 27.4 │ 0 │ 0.0 │ 28613 │ 51.2 │
|
||||
Text only │ 1 │ 0.1 │ 0 │ 0.0 │ 1 │ 100.0 │
|
||||
__unknown__ │ 17 │ 1.7 │ 0 │ 0.0 │ 0 │ 0.0 │
|
||||
__generated__ │ 2 │ 0.2 │ 0 │ 0.0 │ 0 │ 0.0 │
|
||||
__duplicate__ │ 11 │ 1.1 │ 0 │ 0.0 │ 0 │ 0.0 │
|
||||
__binary__ │ 573 │ 58.9 │ 0 │ 0.0 │ 0 │ 0.0 │
|
||||
──────────────────────────────┼───────┼───────┼───────┼──────┼─────────┼───────┤
|
||||
Sum │ 973 │ 100.0 │ 24272 │ 10.8 │ 161779 │ 71.9 │
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┴───────┴───────┴───────┴──────┴─────────┴───────┘
|
||||
|
||||
SUMMARY:
|
||||
- Total Lines of Code: 24,272
|
||||
- Total Files: 973
|
||||
- Languages: 9 (JSON, Python, Bash, HTML, JavaScript, YAML, Groff, Markdown)
|
||||
- Code-to-Comment Ratio: 10.8% code / 71.9% comments
|
||||
- Binary/Empty/Generated files: 653 files (58.9% binary + 1.1% duplicate + 0.2% generated)
|
||||
@@ -0,0 +1,60 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Verify the profile LOC report is accurate."""
|
||||
import json
|
||||
import sys
|
||||
|
||||
# Read the JSON report
|
||||
with open('/root/.hermes/wizard-outputs/spark/profile_loc_report.json', 'r') as f:
|
||||
data = json.load(f)
|
||||
|
||||
# Check that the report has the expected structure
|
||||
if 'summary' not in data:
|
||||
print("FAIL: No summary in report")
|
||||
sys.exit(1)
|
||||
|
||||
summary = data['summary']
|
||||
|
||||
# Verify key metrics
|
||||
total_code = summary.get('totalCodeCount', 0)
|
||||
total_files = summary.get('totalFileCount', 0)
|
||||
|
||||
# According to pygount, we should have ~973 files and ~24,272 lines of code
|
||||
if total_files != 973:
|
||||
print(f"FAIL: Expected 973 files, got {total_files}")
|
||||
sys.exit(1)
|
||||
|
||||
if total_code != 24272:
|
||||
print(f"FAIL: Expected 24272 lines of code, got {total_code}")
|
||||
sys.exit(1)
|
||||
|
||||
# Verify languages section
|
||||
if 'languages' not in data or len(data['languages']) == 0:
|
||||
print("FAIL: No languages in report")
|
||||
sys.exit(1)
|
||||
|
||||
# Check Python language is present
|
||||
python_lang = None
|
||||
for lang in data['languages']:
|
||||
if lang.get('language') == 'Python':
|
||||
python_lang = lang
|
||||
break
|
||||
|
||||
if python_lang is None:
|
||||
print("FAIL: No Python language in report")
|
||||
sys.exit(1)
|
||||
|
||||
# Python should have ~50 files and ~7,894 lines of code
|
||||
if python_lang.get('fileCount') != 50:
|
||||
print(f"FAIL: Expected 50 Python files, got {python_lang.get('fileCount')}")
|
||||
sys.exit(1)
|
||||
|
||||
if python_lang.get('codeCount') != 7894:
|
||||
print(f"FAIL: Expected 7894 Python lines of code, got {python_lang.get('codeCount')}")
|
||||
sys.exit(1)
|
||||
|
||||
print("PASS: All verification checks passed")
|
||||
print(f"Total files: {total_files}")
|
||||
print(f"Total code lines: {total_code}")
|
||||
print(f"Python files: {python_lang.get('fileCount')}")
|
||||
print(f"Python code lines: {python_lang.get('codeCount')}")
|
||||
sys.exit(0)
|
||||
Reference in new issue
Block a user