mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-28 05:33:53 +00:00 
			
		
		
		
	Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com>
		
			
				
	
	
		
			89 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			89 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
| #!/usr/bin/env python3
 | |
| """Add metadata to memory analysis JSON file.
 | |
| 
 | |
| This script adds components and platform metadata to an existing
 | |
| memory analysis JSON file. Used by CI to ensure all required fields are present
 | |
| for the comment script.
 | |
| """
 | |
| 
 | |
| from __future__ import annotations
 | |
| 
 | |
| import argparse
 | |
| import json
 | |
| from pathlib import Path
 | |
| import sys
 | |
| 
 | |
| 
 | |
| def main() -> int:
 | |
|     """Main entry point."""
 | |
|     parser = argparse.ArgumentParser(
 | |
|         description="Add metadata to memory analysis JSON file"
 | |
|     )
 | |
|     parser.add_argument(
 | |
|         "--json-file",
 | |
|         required=True,
 | |
|         help="Path to JSON file to update",
 | |
|     )
 | |
|     parser.add_argument(
 | |
|         "--components",
 | |
|         required=True,
 | |
|         help='JSON array of component names (e.g., \'["api", "wifi"]\')',
 | |
|     )
 | |
|     parser.add_argument(
 | |
|         "--platform",
 | |
|         required=True,
 | |
|         help="Platform name",
 | |
|     )
 | |
| 
 | |
|     args = parser.parse_args()
 | |
| 
 | |
|     # Load existing JSON
 | |
|     json_path = Path(args.json_file)
 | |
|     if not json_path.exists():
 | |
|         print(f"Error: JSON file not found: {args.json_file}", file=sys.stderr)
 | |
|         return 1
 | |
| 
 | |
|     try:
 | |
|         with open(json_path, encoding="utf-8") as f:
 | |
|             data = json.load(f)
 | |
|     except (json.JSONDecodeError, OSError) as e:
 | |
|         print(f"Error loading JSON: {e}", file=sys.stderr)
 | |
|         return 1
 | |
| 
 | |
|     # Parse components
 | |
|     try:
 | |
|         components = json.loads(args.components)
 | |
|         if not isinstance(components, list):
 | |
|             print("Error: --components must be a JSON array", file=sys.stderr)
 | |
|             return 1
 | |
|         # Element-level validation: ensure each component is a non-empty string
 | |
|         for idx, comp in enumerate(components):
 | |
|             if not isinstance(comp, str) or not comp.strip():
 | |
|                 print(
 | |
|                     f"Error: component at index {idx} is not a non-empty string: {comp!r}",
 | |
|                     file=sys.stderr,
 | |
|                 )
 | |
|                 return 1
 | |
|     except json.JSONDecodeError as e:
 | |
|         print(f"Error parsing components: {e}", file=sys.stderr)
 | |
|         return 1
 | |
| 
 | |
|     # Add metadata
 | |
|     data["components"] = components
 | |
|     data["platform"] = args.platform
 | |
| 
 | |
|     # Write back
 | |
|     try:
 | |
|         with open(json_path, "w", encoding="utf-8") as f:
 | |
|             json.dump(data, f, indent=2)
 | |
|         print(f"Added metadata to {args.json_file}", file=sys.stderr)
 | |
|     except OSError as e:
 | |
|         print(f"Error writing JSON: {e}", file=sys.stderr)
 | |
|         return 1
 | |
| 
 | |
|     return 0
 | |
| 
 | |
| 
 | |
| if __name__ == "__main__":
 | |
|     sys.exit(main())
 |