#!/usr/bin/env python3 """ Adds 'using StellaOps.TestKit;' to files that use TestCategories but are missing the import. """ import re import sys from pathlib import Path def fix_file(file_path: Path, dry_run: bool = False) -> bool: """Add using StellaOps.TestKit; to files that need it.""" try: content = file_path.read_text(encoding='utf-8-sig') except Exception as e: print(f" Error reading {file_path}: {e}", file=sys.stderr) return False # Check if file uses TestCategories if 'TestCategories.' not in content: return False # Check if 'using StellaOps.TestKit;' exists anywhere in the file if 'using StellaOps.TestKit;' in content: return False # Find the namespace declaration namespace_match = re.search(r'^namespace\s+[\w.]+', content, re.MULTILINE) if not namespace_match: print(f" No namespace found in {file_path}", file=sys.stderr) return False # Find the last 'using' statement before the namespace top_section = content[:namespace_match.start()] last_using = None for match in re.finditer(r'^using [^;]+;\s*$', top_section, re.MULTILINE): last_using = match if last_using: insert_pos = last_using.end() fixed = content[:insert_pos] + '\nusing StellaOps.TestKit;' + content[insert_pos:] else: # No using statements, add at the beginning fixed = 'using StellaOps.TestKit;\n' + content if not dry_run: encoding = 'utf-8-sig' if content.startswith('\ufeff') else 'utf-8' file_path.write_text(fixed, encoding=encoding) return True def main(): import argparse parser = argparse.ArgumentParser(description='Add missing using StellaOps.TestKit statements') parser.add_argument('--path', default='src', help='Path to scan') parser.add_argument('--dry-run', action='store_true', help='Show what would be fixed') args = parser.parse_args() root = Path(args.path) fixed_count = 0 checked_count = 0 for file_path in root.rglob('*.cs'): if '/obj/' in str(file_path) or '/bin/' in str(file_path): continue if 'node_modules' in str(file_path): continue if 'Test' not in str(file_path): continue checked_count += 1 if fix_file(file_path, dry_run=args.dry_run): print(f"{'Would add' if args.dry_run else 'Added'} using to: {file_path}") fixed_count += 1 print(f"\nChecked: {checked_count} files") print(f"Fixed: {fixed_count} files") if __name__ == '__main__': main()