"""Standalone post-processing: derive dead objects from schema-data.json + audit-data.json.""" import argparse import json import os import sys from src.config import GRAPH_ID from src.report import find_dead_objects def main() -> None: parser = argparse.ArgumentParser(description='Detect dead objects from existing audit and schema data.') parser.add_argument('--schema-data', default=os.path.join(os.path.dirname(__file__), '..', 'schema-data.json'), help='Path to schema-data.json') parser.add_argument('--audit-data', default=os.path.join(os.path.dirname(__file__), '..', 'audit-data.json'), help='Path to audit-data.json') parser.add_argument('--graph-id', default=GRAPH_ID, help=f'Graph ID (default: {GRAPH_ID})') args = parser.parse_args() schema_path = os.path.abspath(args.schema_data) audit_path = os.path.abspath(args.audit_data) for path, label in [(schema_path, 'schema-data.json'), (audit_path, 'audit-data.json')]: if not os.path.exists(path): print(f'Error: {label} not found at {path}', file=sys.stderr) sys.exit(1) with open(schema_path) as fp: schema = json.load(fp) with open(audit_path) as fp: audit = json.load(fp) all_objects = schema['all_objects'] dead_object_fields = audit['dead_object_fields'] dead_objects = find_dead_objects(all_objects, dead_object_fields, args.graph_id) # Update audit-data.json in place audit['dead_objects'] = dead_objects if 'objects' not in audit.get('summary', {}): audit.setdefault('summary', {})['objects'] = {'dead': len(dead_objects), 'total': len(all_objects)} else: audit['summary']['objects'] = {'dead': len(dead_objects), 'total': len(all_objects)} with open(audit_path, 'w') as fp: json.dump(audit, fp, indent=2) print(f'Dead objects: {len(dead_objects)} / {len(all_objects)}') print(f'Updated {audit_path}') if __name__ == '__main__': main()