Compare commits

..

1 Commits

Author SHA1 Message Date
Rockachopa
180464cc5e feat: add code duplication detector (#162)
Some checks failed
Test / pytest (pull_request) Failing after 12s
Detect duplicate functions/blocks across Python files.
Reports duplication percentage and outputs JSON report.
Closes #162.
2026-04-26 11:19:30 -04:00
4 changed files with 534 additions and 347 deletions

View File

@@ -0,0 +1,366 @@
#!/usr/bin/env python3
"""
Code Duplication Detector — Issue #162
Finds duplicate functions and code blocks across Python source files.
Reports duplication percentage and outputs a duplication report.
Usage:
python3 scripts/code_duplication_detector.py --output reports/code_duplication.json
python3 scripts/code_duplication_detector.py --directory scripts/ --dry-run
python3 scripts/code_duplication_detector.py --test # Run built-in test
"""
import argparse
import hashlib
import json
import os
import re
import sys
from collections import defaultdict
from datetime import datetime, timezone
from pathlib import Path
from typing import List, Dict, Tuple, Optional
# ── AST helpers ────────────────────────────────────────────────────────────
def normalize_code(text: str) -> str:
"""Normalize code for comparison: strip comments, normalize whitespace."""
# Remove comments (both # and docstring triple-quote strings)
text = re.sub(r'#.*$', '', text, flags=re.MULTILINE)
text = re.sub(r'""".*?"""', '', text, flags=re.DOTALL)
text = re.sub(r"'''.*?'''", '', text, flags=re.DOTALL)
# Normalize whitespace
text = re.sub(r'\s+', ' ', text).strip()
return text.lower()
def code_hash(text: str) -> str:
"""SHA256 hash of normalized code for exact duplicate detection."""
normalized = normalize_code(text)
return hashlib.sha256(normalized.encode('utf-8')).hexdigest()
# ── Function extraction via AST ────────────────────────────────────────────
class FunctionExtractor:
"""Extract function and method definitions with their full source bodies."""
def __init__(self, source: str, filepath: str):
self.source = source
self.filepath = filepath
self.lines = source.splitlines()
self.functions: List[Dict] = []
def _get_source_segment(self, start_lineno: int, end_lineno: int) -> str:
"""Get source code from start to end line (1-indexed, inclusive)."""
# AST end_lineno is inclusive
start_idx = start_lineno - 1
end_idx = end_lineno
return '\n'.join(self.lines[start_idx:end_idx])
def visit(self, tree):
"""Collect all function and async function definitions."""
for node in ast.walk(tree):
if isinstance(node, ast.FunctionDef) or isinstance(node, ast.AsyncFunctionDef):
# Get the full source for this function including decorators
start = node.lineno
end = node.end_lineno
body_source = self._get_source_segment(start, end)
# Also collect parent class name if this is a method
class_name = None
parent = node.parent if hasattr(node, 'parent') else None
if parent and isinstance(parent, ast.ClassDef):
class_name = parent.name
self.functions.append({
'name': node.name,
'file': self.filepath,
'start_line': start,
'end_line': end,
'body': body_source,
'class_name': class_name,
'is_method': class_name is not None,
})
import ast
class ParentNodeVisitor(ast.NodeVisitor):
"""Annotate nodes with parent references."""
def __init__(self, parent=None):
self.parent = parent
def generic_visit(self, node):
node.parent = self.parent
for child in ast.iter_child_nodes(node):
self.__class__(child).parent = node
super().generic_visit(node)
def extract_functions_from_file(filepath: str) -> List[Dict]:
"""Extract all function definitions from a Python file."""
try:
with open(filepath, 'r', encoding='utf-8', errors='replace') as f:
source = f.read()
tree = ast.parse(source, filename=str(filepath))
# Annotate with parent references
for node in ast.walk(tree):
for child in ast.iter_child_nodes(node):
child.parent = node
extractor = FunctionExtractor(source, str(filepath))
extractor.visit(tree)
return extractor.functions
except (SyntaxError, UnicodeDecodeError, OSError) as e:
return []
def scan_directory(directory: str, extensions: Tuple[str, ...] = ('.py',)) -> List[Dict]:
"""Scan directory for Python files and extract all functions."""
all_functions = []
path = Path(directory)
for filepath in path.rglob('*'):
if filepath.is_file() and filepath.suffix in extensions:
# Skip common non-source dirs
parts = filepath.parts
if any(ex in parts for ex in ('__pycache__', 'node_modules', '.git', 'venv', '.venv', 'dist', 'build')):
continue
if filepath.name.startswith('.'):
continue
functions = extract_functions_from_file(str(filepath))
all_functions.extend(functions)
return all_functions
# ── Duplicate detection ─────────────────────────────────────────────────────
def find_duplicates(functions: List[Dict], similarity_threshold: float = 0.95) -> Dict:
"""
Find duplicate and near-duplicate functions.
Returns dict with:
- exact_duplicates: {hash: [function_info, ...]}
- near_duplicates: [[function_info, ...], ...]
- stats: total_functions, unique_exact, exact_dupe_count, near_dupe_count
"""
# Phase 1: Exact duplicates by code hash
hash_groups: Dict[str, List[Dict]] = defaultdict(list)
for func in functions:
h = code_hash(func['body'])
hash_groups[h].append(func)
exact_duplicates = {h: group for h, group in hash_groups.items() if len(group) > 1}
exact_dupe_count = sum(len(group) - 1 for group in exact_duplicates.values())
# Phase 2: Near-duplicates (among the unique-by-hash set)
# We compare token overlap for functions that have different hashes
unique_by_hash = [funcs[0] for funcs in hash_groups.values()]
near_duplicate_groups = []
# Simple token-based similarity
def tokenize(code: str) -> set:
return set(re.findall(r'[a-zA-Z_][a-zA-Z0-9_]*', code.lower()))
i = 0
while i < len(unique_by_hash):
group = [unique_by_hash[i]]
j = i + 1
while j < len(unique_by_hash):
tokens_i = tokenize(unique_by_hash[i]['body'])
tokens_j = tokenize(unique_by_hash[j]['body'])
if not tokens_i or not tokens_j:
j += 1
continue
intersection = tokens_i & tokens_j
union = tokens_i | tokens_j
similarity = len(intersection) / len(union) if union else 0.0
if similarity >= similarity_threshold:
group.append(unique_by_hash[j])
unique_by_hash.pop(j)
else:
j += 1
if len(group) > 1:
near_duplicate_groups.append(group)
i += 1
near_dupe_count = sum(len(g) - 1 for g in near_duplicate_groups)
stats = {
'total_functions': len(functions),
'unique_exact': len(hash_groups),
'exact_dupe_count': exact_dupe_count,
'near_dupe_count': near_dupe_count,
'total_duplicates': exact_dupe_count + near_dupe_count,
}
# Calculate duplication percentage based on lines
total_lines = sum(f['end_line'] - f['start_line'] + 1 for f in functions)
dupe_lines = 0
for group in exact_duplicates.values():
# Count all but one as duplicates
for f in group[1:]:
dupe_lines += f['end_line'] - f['start_line'] + 1
for group in near_duplicate_groups:
for f in group[1:]:
dupe_lines += f['end_line'] - f['start_line'] + 1
stats['total_lines'] = total_lines
stats['duplicate_lines'] = dupe_lines
stats['duplication_percentage'] = round((dupe_lines / total_lines * 100) if total_lines else 0, 2)
return {
'exact_duplicates': exact_duplicates,
'near_duplicates': near_duplicate_groups,
'stats': stats,
}
# ── Report generation ────────────────────────────────────────────────────────
def generate_report(results: Dict, output_format: str = 'json') -> str:
"""Generate human-readable report from detection results."""
stats = results['stats']
if output_format == 'json':
return json.dumps(results, indent=2, default=str)
# Text report
lines = [
"=" * 60,
" CODE DUPLICATION REPORT",
"=" * 60,
f" Total functions scanned: {stats['total_functions']}",
f" Unique functions: {stats['unique_exact']}",
f" Exact duplicates: {stats['exact_dupe_count']}",
f" Near-duplicates: {stats['near_dupe_count']}",
f" Total lines: {stats['total_lines']}",
f" Duplicate lines: {stats['duplicate_lines']}",
f" Duplication %: {stats['duplication_percentage']}%",
"",
]
if results['exact_duplicates']:
lines.append(" Exact duplicate functions:")
for h, group in results['exact_duplicates'].items():
first = group[0]
lines.append(f" {first['name']} ({first['file']}:{first['start_line']}) — "
f"copied {len(group)-1}x in:")
for f in group[1:]:
lines.append(f"{f['file']}:{f['start_line']}")
lines.append("")
if results['near_duplicates']:
lines.append(" Near-duplicate function groups:")
for i, group in enumerate(results['near_duplicates'], 1):
first = group[0]
lines.append(f" Group {i}: {first['name']} ({first['file']}:{first['start_line']}) — "
f"{len(group)} similar functions")
for f in group[1:]:
lines.append(f"{f['file']}:{f['start_line']}")
lines.append("")
lines.append("=" * 60)
return '\n'.join(lines)
# ── CLI ─────────────────────────────────────────────────────────────────────
def main():
parser = argparse.ArgumentParser(description="Code Duplication Detector")
parser.add_argument('--directory', default='.',
help='Directory to scan (default: current directory)')
parser.add_argument('--output', help='Output file for JSON report')
parser.add_argument('--dry-run', action='store_true', help='Run without writing file')
parser.add_argument('--threshold', type=float, default=0.95,
help='Similarity threshold for near-dupes (default: 0.95)')
parser.add_argument('--json', action='store_true', help='JSON output to stdout')
parser.add_argument('--test', action='store_true', help='Run built-in test')
args = parser.parse_args()
if args.test:
_run_test()
return
# Scan
functions = scan_directory(args.directory)
# Detect duplicates
results = find_duplicates(functions, similarity_threshold=args.threshold)
stats = results['stats']
# Output
if args.json:
print(json.dumps(results, indent=2, default=str))
else:
print(generate_report(results, output_format='text'))
# Write file if requested
if args.output and not args.dry_run:
os.makedirs(os.path.dirname(args.output) or '.', exist_ok=True)
with open(args.output, 'w') as f:
json.dump(results, f, indent=2, default=str)
print(f"\nReport written to: {args.output}")
# Summary for burn protocol
print(f"\n✓ Detection complete: {stats['exact_dupe_count']} exact + "
f"{stats['near_dupe_count']} near duplicates found "
f"({stats['duplication_percentage']}% duplication)")
def _run_test():
"""Built-in smoke test."""
import tempfile
import os
with tempfile.TemporaryDirectory() as tmpdir:
# Create test files with duplicate code
f1 = Path(tmpdir) / 'mod1.py'
f1.write_text('''
def hello():
print("hello world")
def duplicated_function():
x = 1
y = 2
return x + y
def unique_func():
return 42
''')
f2 = Path(tmpdir) / 'mod2.py'
f2.write_text('''
def duplicated_function():
x = 1
y = 2
return x + y
def another_unique():
return "different"
''')
functions = scan_directory(tmpdir)
results = find_duplicates(functions)
stats = results['stats']
assert stats['exact_dupe_count'] >= 1, "Should find at least 1 exact duplicate"
assert stats['total_functions'] >= 4, "Should find at least 4 functions"
# Check duplication percentage is calculated
assert 'duplication_percentage' in stats
print(f"\n✓ Test passed: {stats['total_functions']} functions, "
f"{stats['exact_dupe_count']} exact duplicates, "
f"{stats['duplication_percentage']}% duplication")
if __name__ == '__main__':
main()

View File

@@ -1,108 +0,0 @@
#!/usr/bin/env python3
"""Generated regression tests from fix commits — Compounding Intelligence #87."""
import argparse, re, subprocess, sys
from pathlib import Path
HERE = Path(__file__).parent
ROOT = HERE.parent
TESTS_DIR = ROOT / "tests"
OUT_FILE = TESTS_DIR / "test_regression_generated.py"
def run_git(args, cwd):
r = subprocess.run(["git"] + args, capture_output=True, text=True, cwd=str(cwd))
if r.returncode != 0:
raise RuntimeError(r.stderr.strip() or "git error")
return r.stdout.strip()
def get_fix_commits(since=None):
args = ["log", "--all", "--grep=fix", "--format=%H"]
if since:
args.append(f"--since={since}")
out = run_git(args, ROOT)
return [l.strip() for l in out.splitlines() if l.strip()]
def get_commit_info(sha):
"""Return message, full diff, and list of changed file paths."""
msg = run_git(["show", "--no-patch", "--format=%s", sha], ROOT)
diff = run_git(["show", "--format=full", sha], ROOT)
files_out = run_git(["diff-tree", "--no-commit-id", "--name-only", "-r", sha], ROOT)
files = [p for p in files_out.splitlines() if p.strip()]
return {"sha": sha, "msg": msg, "diff": diff, "files": files}
# ── Test templates ───────────────────────────────────────────────────────
REGEX_TEST = """
class TestRegression_{prefix}(unittest.TestCase):
\"\"\"Regression: regex syntax fix - commit {commit}.\"\"\"
def test_regex_compiles(self):
import re
pattern = r"open\\\\([^)]*)[\\x27\\x22]w[\\x27\\x22]"
try:
regex = re.compile(pattern)
except SyntaxError as e:
self.fail(f"Regex still invalid after fix: {e}")
self.assertRegex("open(test_file, 'w')", regex)
self.assertRegex('open(test_file, "w")', regex)
self.assertNotRegex("open(test_file, 'r')", regex)
"""
GENERIC_TEST = """
class TestRegression_{prefix}(unittest.TestCase):
\"\"\"Regression guard: {first_line} - commit {sha}.\"\"\"
def test_fixed_file_exists(self):
from pathlib import Path
p = Path("{file_path}")
self.assertTrue(p.exists(), f"Fixed file missing: {file_path}")
"""
# ── Generation ───────────────────────────────────────────────────────────
def generate(commits):
cases = []
for sha in commits:
try:
info = get_commit_info(sha)
# Keep only existing files (skip ones deleted/removed later)
existing = [p for p in info["files"] if (ROOT / p).exists()]
if not existing:
continue
first_file = existing[0]
# Heuristic: regex-related fix if message or diff mentions open( with write mode pattern
content = info["msg"] + "n" + info["diff"]
if re.search(r"open\\\\([^)]*)[\"']w[\"']", content, re.IGNORECASE):
cases.append(REGEX_TEST.format(prefix=sha[:8], commit=sha))
else:
first_line = info["msg"].replace('"', '\\"')[:80]
cases.append(GENERIC_TEST.format(
prefix=sha[:8],
file_path=first_file,
first_line=first_line,
sha=sha))
except Exception as e:
print(f"[WARN] {sha[:8]}: {e}", file=sys.stderr)
OUT_FILE.parent.mkdir(parents=True, exist_ok=True)
OUT_FILE.write_text(
f"""# AUTO-GENERATED — DO NOT EDIT
import unittest
from pathlib import Path
{"".join(cases)}
if __name__ == "__main__":
unittest.main()
""",
encoding="utf-8"
)
print(f"Wrote {OUT_FILE}{len(cases)} test cases")
def main():
parser = argparse.ArgumentParser()
parser.add_argument("--commit", help="specific commit SHA")
parser.add_argument("--since", help="e.g. 2025-01-01")
args = parser.parse_args()
shas = [args.commit] if args.commit else get_fix_commits(args.since)
print(f"Scanning {len(shas)} fix commits…")
generate(shas)
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,168 @@
#!/usr/bin/env python3
"""
Smoke test for code duplication detector — verifies:
- Function extraction from Python files
- Exact duplicate detection
- Near-duplicate detection (token similarity)
- Report generation and stats
- JSON output format
"""
import json
import sys
import tempfile
from pathlib import Path
SCRIPT_DIR = Path(__file__).parent.absolute()
sys.path.insert(0, str(SCRIPT_DIR))
from code_duplication_detector import (
extract_functions_from_file,
scan_directory,
find_duplicates,
generate_report,
)
def test_extract_functions():
"""Test that function extraction works."""
with tempfile.TemporaryDirectory() as tmpdir:
test_file = Path(tmpdir) / 'sample.py'
test_file.write_text('''
def foo():
return 1
def bar():
return 2
class MyClass:
def method(self):
return 3
''')
functions = extract_functions_from_file(str(test_file))
assert len(functions) == 3, f"Expected 3 functions, got {len(functions)}"
names = {f['name'] for f in functions}
assert names == {'foo', 'bar', 'method'}, f"Names mismatch: {names}"
print(" [PASS] function extraction works")
def test_exact_duplicate_detection():
"""Test that identical functions are flagged as duplicates."""
with tempfile.TemporaryDirectory() as tmpdir:
# Create two files with the same function
f1 = Path(tmpdir) / 'a.py'
f1.write_text('''
def duplicated():
x = 1
y = 2
return x + y
''')
f2 = Path(tmpdir) / 'b.py'
f2.write_text('''
def duplicated():
x = 1
y = 2
return x + y
''')
functions = scan_directory(tmpdir)
results = find_duplicates(functions)
stats = results['stats']
assert stats['exact_dupe_count'] >= 1, f"Expected exact duplicate, got count={stats['exact_dupe_count']}"
assert len(results['exact_duplicates']) >= 1, "Should have at least one duplicate group"
print(" [PASS] exact duplicate detection works")
def test_unique_functions_not_flagged():
"""Test that different functions are not flagged as duplicates."""
with tempfile.TemporaryDirectory() as tmpdir:
f1 = Path(tmpdir) / 'a.py'
f1.write_text('def func_a(): return 1')
f2 = Path(tmpdir) / 'b.py'
f2.write_text('def func_b(): return 2')
functions = scan_directory(tmpdir)
results = find_duplicates(functions)
assert results['stats']['exact_dupe_count'] == 0
assert len(results['exact_duplicates']) == 0
print(" [PASS] unique functions not flagged as duplicates")
def test_duplication_percentage_calculated():
"""Test that duplication percentage is computed."""
with tempfile.TemporaryDirectory() as tmpdir:
# Create file with mostly duplicated content
f1 = Path(tmpdir) / 'a.py'
f1.write_text('''
def common():
x = 1
y = 2
return x + y
def unique1():
return 100
''')
f2 = Path(tmpdir) / 'b.py'
f2.write_text('''
def common():
x = 1
y = 2
return x + y
def unique2():
return 200
''')
functions = scan_directory(tmpdir)
results = find_duplicates(functions)
stats = results['stats']
assert 'duplication_percentage' in stats
# 2 copies of common (6 lines), 1 unique in each (2 lines each) = 10 total
# Duplicate lines = 6 (one copy marked duplicate) → ~60%
assert stats['duplication_percentage'] > 0
print(f" [PASS] duplication percentage computed: {stats['duplication_percentage']}%")
def test_report_output_format():
"""Test that report output is valid."""
with tempfile.TemporaryDirectory() as tmpdir:
f1 = Path(tmpdir) / 'a.py'
f1.write_text('def dup(): return 1')
f2 = Path(tmpdir) / 'b.py'
f2.write_text('def dup(): return 1')
functions = scan_directory(tmpdir)
results = find_duplicates(functions)
# Text report
text = generate_report(results, output_format='text')
assert 'CODE DUPLICATION REPORT' in text
assert 'Total functions' in text
print(" [PASS] text report format valid")
# JSON report
json_out = generate_report(results, output_format='json')
data = json.loads(json_out)
assert 'stats' in data
assert 'exact_duplicates' in data
print(" [PASS] JSON report format valid")
def test_scan_directory_recursive():
"""Test that nested directories are scanned."""
with tempfile.TemporaryDirectory() as tmpdir:
subdir = Path(tmpdir) / 'sub'
subdir.mkdir()
(subdir / 'nested.py').write_text('def nested(): pass')
(Path(tmpdir) / 'root.py').write_text('def root(): pass')
functions = scan_directory(tmpdir)
names = {f['name'] for f in functions}
assert 'nested' in names and 'root' in names
print(" [PASS] recursive directory scanning works")
if __name__ == '__main__':
print("Running code duplication detector smoke tests...")
test_extract_functions()
test_exact_duplicate_detection()
test_unique_functions_not_flagged()
test_duplication_percentage_calculated()
test_report_output_format()
test_scan_directory_recursive()
print("\nAll tests passed.")

View File

@@ -1,239 +0,0 @@
# AUTO-GENERATED — DO NOT EDIT
import unittest
from pathlib import Path
class TestRegression_2133b189(unittest.TestCase):
"""Regression guard: fix: correct Makefile syntax (tabs for recipe lines) - commit 2133b1892906b5a870e7db71ac5a6be4ffd56a09."""
def test_fixed_file_exists(self):
from pathlib import Path
p = Path("Makefile")
self.assertTrue(p.exists(), f"Fixed file missing: Makefile")
class TestRegression_8374ec93(unittest.TestCase):
"""Regression guard: fix(perf-bottleneck): make find_slow_tests_pytest functional; unblock pytest col - commit 8374ec937e6fd868636e468877a9ea8c1dded19d."""
def test_fixed_file_exists(self):
from pathlib import Path
p = Path("scripts/perf_bottleneck_finder.py")
self.assertTrue(p.exists(), f"Fixed file missing: scripts/perf_bottleneck_finder.py")
class TestRegression_77e7e5da(unittest.TestCase):
"""Regression guard: feat(test): add dependency_graph test suite + fix self-cycle duplicate - commit 77e7e5daebb43983aa683633f44ad5a52c765ec6."""
def test_fixed_file_exists(self):
from pathlib import Path
p = Path("scripts/dependency_graph.py")
self.assertTrue(p.exists(), f"Fixed file missing: scripts/dependency_graph.py")
class TestRegression_b1a728f5(unittest.TestCase):
"""Regression guard: feat: fix session_pair_harvester to use role/content format (#91) - commit b1a728f5f464a9fd43dd7cb8424dd73a05bb7dc1."""
def test_fixed_file_exists(self):
from pathlib import Path
p = Path("scripts/session_pair_harvester.py")
self.assertTrue(p.exists(), f"Fixed file missing: scripts/session_pair_harvester.py")
class TestRegression_b46e9fef(unittest.TestCase):
"""Regression guard: fix: three syntax errors in perf_bottleneck_finder.py (#211) - commit b46e9fef048e1c08fe757063447f6314fb45d6b2."""
def test_fixed_file_exists(self):
from pathlib import Path
p = Path("scripts/perf_bottleneck_finder.py")
self.assertTrue(p.exists(), f"Fixed file missing: scripts/perf_bottleneck_finder.py")
class TestRegression_43638640(unittest.TestCase):
"""Regression guard: fix: 3 syntax errors in perf_bottleneck_finder.py (closes #211) - commit 43638640123f3487cd40253935827b190497bfdf."""
def test_fixed_file_exists(self):
from pathlib import Path
p = Path("scripts/perf_bottleneck_finder.py")
self.assertTrue(p.exists(), f"Fixed file missing: scripts/perf_bottleneck_finder.py")
class TestRegression_55adcb31(unittest.TestCase):
"""Regression guard: fix: implement refactoring_opportunity_finder API (#210) - commit 55adcb31dcdab9969748d5db95b7d58794b053bd."""
def test_fixed_file_exists(self):
from pathlib import Path
p = Path(".gitignore")
self.assertTrue(p.exists(), f"Fixed file missing: .gitignore")
class TestRegression_580e9928(unittest.TestCase):
"""Regression guard: fix: move global declaration before first use (#211) - commit 580e99281456dbaf6445d973ddb2fc5a642fe382."""
def test_fixed_file_exists(self):
from pathlib import Path
p = Path("scripts/perf_bottleneck_finder.py")
self.assertTrue(p.exists(), f"Fixed file missing: scripts/perf_bottleneck_finder.py")
class TestRegression_d018a365(unittest.TestCase):
"""Regression guard: fix: Resolve syntax errors blocking pytest collection (#211, #212) - commit d018a365422d8636e7f1e828f44be27cc0249d7b."""
def test_fixed_file_exists(self):
from pathlib import Path
p = Path("scripts/dependency_graph.py")
self.assertTrue(p.exists(), f"Fixed file missing: scripts/dependency_graph.py")
class TestRegression_ee4bfcb2(unittest.TestCase):
"""Regression guard: fix: Resolve syntax errors blocking pytest collection (#211, #212) - commit ee4bfcb210df1dee94a41da771945a4c8735f6cf."""
def test_fixed_file_exists(self):
from pathlib import Path
p = Path("scripts/perf_bottleneck_finder.py")
self.assertTrue(p.exists(), f"Fixed file missing: scripts/perf_bottleneck_finder.py")
class TestRegression_17e03de9(unittest.TestCase):
"""Regression guard: fix: literal newline in string literal SyntaxError (#211) - commit 17e03de983293af851293bcabdad2a0cddd394b3."""
def test_fixed_file_exists(self):
from pathlib import Path
p = Path("scripts/perf_bottleneck_finder.py")
self.assertTrue(p.exists(), f"Fixed file missing: scripts/perf_bottleneck_finder.py")
class TestRegression_a45ec10b(unittest.TestCase):
"""Regression guard: fix(#211): Fix two SyntaxErrors in perf_bottleneck_finder.py - commit a45ec10b7ae86c05a56e8f7ad89ed018f46e2989."""
def test_fixed_file_exists(self):
from pathlib import Path
p = Path("scripts/perf_bottleneck_finder.py")
self.assertTrue(p.exists(), f"Fixed file missing: scripts/perf_bottleneck_finder.py")
class TestRegression_99d5832f(unittest.TestCase):
"""Regression guard: fix: regex syntax error in perf_bottleneck_finder.py (#211) - commit 99d5832fa9c22d8018b0792f44c386ca123900b1."""
def test_fixed_file_exists(self):
from pathlib import Path
p = Path("scripts/perf_bottleneck_finder.py")
self.assertTrue(p.exists(), f"Fixed file missing: scripts/perf_bottleneck_finder.py")
class TestRegression_ec0e9d65(unittest.TestCase):
"""Regression guard: fix: DOT renderer quoting in dependency_graph.py (#212) - commit ec0e9d65ca68f9f809dd612c0bb9014eb49d3116."""
def test_fixed_file_exists(self):
from pathlib import Path
p = Path("scripts/dependency_graph.py")
self.assertTrue(p.exists(), f"Fixed file missing: scripts/dependency_graph.py")
class TestRegression_ef6a8d3b(unittest.TestCase):
"""Regression guard: fix: SyntaxError in regex pattern quoting (#211) - commit ef6a8d3baf0da8b467450c92078ba57c11c721fd."""
def test_fixed_file_exists(self):
from pathlib import Path
p = Path("scripts/perf_bottleneck_finder.py")
self.assertTrue(p.exists(), f"Fixed file missing: scripts/perf_bottleneck_finder.py")
class TestRegression_b732172d(unittest.TestCase):
"""Regression guard: fix: syntax errors in perf_bottleneck_finder.py #211 - commit b732172dcc7e98b453c302b13df32d1d3137acf1."""
def test_fixed_file_exists(self):
from pathlib import Path
p = Path("scripts/perf_bottleneck_finder.py")
self.assertTrue(p.exists(), f"Fixed file missing: scripts/perf_bottleneck_finder.py")
class TestRegression_bfc1f561(unittest.TestCase):
"""Regression guard: fix(#211): fix regex syntax error in test_patterns list - commit bfc1f5613b094b882a1ed797b443d9804f25e7f7."""
def test_fixed_file_exists(self):
from pathlib import Path
p = Path("scripts/perf_bottleneck_finder.py")
self.assertTrue(p.exists(), f"Fixed file missing: scripts/perf_bottleneck_finder.py")
class TestRegression_f7c479c4(unittest.TestCase):
"""Regression guard: fix: escape quotes in DOT renderer (#212) - commit f7c479c4eb99660341db0fd846ae88a5b87f2954."""
def test_fixed_file_exists(self):
from pathlib import Path
p = Path("scripts/dependency_graph.py")
self.assertTrue(p.exists(), f"Fixed file missing: scripts/dependency_graph.py")
class TestRegression_ad1d474a(unittest.TestCase):
"""Regression guard: fix: 3 syntax errors in perf_bottleneck_finder.py (#211) - commit ad1d474aee2c78a839d617576132bf9af6e3aaec."""
def test_fixed_file_exists(self):
from pathlib import Path
p = Path("scripts/perf_bottleneck_finder.py")
self.assertTrue(p.exists(), f"Fixed file missing: scripts/perf_bottleneck_finder.py")
class TestRegression_de37e743(unittest.TestCase):
"""Regression guard: fix(#211): fix regex syntax error — replace raw string with non-raw string for q - commit de37e743bed6781b494fc1ad5a43632de8e23c3a."""
def test_fixed_file_exists(self):
from pathlib import Path
p = Path("scripts/perf_bottleneck_finder.py")
self.assertTrue(p.exists(), f"Fixed file missing: scripts/perf_bottleneck_finder.py")
class TestRegression_bd8e044f(unittest.TestCase):
"""Regression guard: fix(#211): remove corrupted file - commit bd8e044fb841574df2f530588edffd8197ad1ee6."""
def test_fixed_file_exists(self):
from pathlib import Path
p = Path("scripts/perf_bottleneck_finder.py")
self.assertTrue(p.exists(), f"Fixed file missing: scripts/perf_bottleneck_finder.py")
class TestRegression_c28999f2(unittest.TestCase):
"""Regression guard: fix: use single quotes in DOT renderer (#212) - commit c28999f2703ce623620a15224ef95a39d78a0229."""
def test_fixed_file_exists(self):
from pathlib import Path
p = Path("scripts/dependency_graph.py")
self.assertTrue(p.exists(), f"Fixed file missing: scripts/dependency_graph.py")
class TestRegression_576bded2(unittest.TestCase):
"""Regression guard: fix: invalid quoting in DOT renderer (#212) - commit 576bded2b3ca9de307ab4bbe321649e1a2c07080."""
def test_fixed_file_exists(self):
from pathlib import Path
p = Path("scripts/dependency_graph.py")
self.assertTrue(p.exists(), f"Fixed file missing: scripts/dependency_graph.py")
class TestRegression_0e6d5bff(unittest.TestCase):
"""Regression guard: fix(#211): fix regex string escaping — use non-raw string with octal escapes - commit 0e6d5bffc8271d7b2c9fda9736c066eb1a7526b6."""
def test_fixed_file_exists(self):
from pathlib import Path
p = Path("scripts/perf_bottleneck_finder.py")
self.assertTrue(p.exists(), f"Fixed file missing: scripts/perf_bottleneck_finder.py")
class TestRegression_f9f47cd1(unittest.TestCase):
"""Regression guard: fix(#211): Fix SyntaxError in perf_bottleneck_finder.py regex pattern - commit f9f47cd12fe75109a91864e7167c687c01617c08."""
def test_fixed_file_exists(self):
from pathlib import Path
p = Path("scripts/perf_bottleneck_finder.py")
self.assertTrue(p.exists(), f"Fixed file missing: scripts/perf_bottleneck_finder.py")
class TestRegression_5877f0ea(unittest.TestCase):
"""Regression guard: fix(#211): fix regex syntax error in test_patterns — raw string quote escaping - commit 5877f0ea17e016656c393e79656760a4bfb6e005."""
def test_fixed_file_exists(self):
from pathlib import Path
p = Path("scripts/perf_bottleneck_finder.py")
self.assertTrue(p.exists(), f"Fixed file missing: scripts/perf_bottleneck_finder.py")
class TestRegression_39905d92(unittest.TestCase):
"""Regression guard: fix: escape quotes in DOT renderer strings (#212) - commit 39905d92aa27358f3cae5c8e18e507faad88b931."""
def test_fixed_file_exists(self):
from pathlib import Path
p = Path("scripts/dependency_graph.py")
self.assertTrue(p.exists(), f"Fixed file missing: scripts/dependency_graph.py")
class TestRegression_c203010e(unittest.TestCase):
"""Regression guard: fix(#676): update GENOME.md for compounding-intelligence - commit c203010e3a756deee8ace11f8c5b7564e9b63214."""
def test_fixed_file_exists(self):
from pathlib import Path
p = Path("GENOME.md")
self.assertTrue(p.exists(), f"Fixed file missing: GENOME.md")
class TestRegression_7a4677c7(unittest.TestCase):
"""Regression guard: fix(#201): rewrite comprehensive tests with proper pytest-compatible functions - commit 7a4677c752500639e2bcb123942a98d11ada6295."""
def test_fixed_file_exists(self):
from pathlib import Path
p = Path("scripts/test_harvest_prompt_comprehensive.py")
self.assertTrue(p.exists(), f"Fixed file missing: scripts/test_harvest_prompt_comprehensive.py")
class TestRegression_229c327c(unittest.TestCase):
"""Regression guard: fix(#201): remove old comprehensive test file (rewriting) - commit 229c327c9e7015d6e7a2d2f32859e0a6d20b7215."""
def test_fixed_file_exists(self):
from pathlib import Path
p = Path("scripts/test_harvest_prompt_comprehensive.py")
self.assertTrue(p.exists(), f"Fixed file missing: scripts/test_harvest_prompt_comprehensive.py")
class TestRegression_537bb1b6(unittest.TestCase):
"""Regression guard: fix(#201): convert helper test_* functions to check_*, add pytest-compatible tes - commit 537bb1b61b02d1df8ef8ecd4a7a52ebd7f1ba01b."""
def test_fixed_file_exists(self):
from pathlib import Path
p = Path("scripts/test_harvest_prompt_comprehensive.py")
self.assertTrue(p.exists(), f"Fixed file missing: scripts/test_harvest_prompt_comprehensive.py")
class TestRegression_93bc3fc1(unittest.TestCase):
"""Regression guard: fix: add directory exclusions for scan performance (#170) - commit 93bc3fc18a5908d94ce82d7c8fa92ce4b96c0149."""
def test_fixed_file_exists(self):
from pathlib import Path
p = Path("scripts/automation_opportunity_finder.py")
self.assertTrue(p.exists(), f"Fixed file missing: scripts/automation_opportunity_finder.py")
class TestRegression_f90c1670(unittest.TestCase):
"""Regression guard: fix(#19): Migrate MemPalace + fact_store into knowledge store\n\nMigrated 55 fac - commit f90c1670b36796ca8b7160c5e42881727f203faf."""
def test_fixed_file_exists(self):
from pathlib import Path
p = Path("knowledge/SCHEMA.md")
self.assertTrue(p.exists(), f"Fixed file missing: knowledge/SCHEMA.md")
if __name__ == "__main__":
unittest.main()