101 lines
2.7 KiB
Python
101 lines
2.7 KiB
Python
"""Command-line interface for validating Penpot files against a schema."""
|
|
|
|
import argparse
|
|
import json
|
|
import os
|
|
import sys
|
|
from typing import Any, Dict, Optional, Tuple
|
|
|
|
from jsonschema import SchemaError, ValidationError, validate
|
|
|
|
from penpot_mcp.utils import config
|
|
|
|
|
|
def parse_args() -> argparse.Namespace:
|
|
"""Parse command line arguments."""
|
|
parser = argparse.ArgumentParser(description='Validate a Penpot JSON file against a schema')
|
|
parser.add_argument('input_file', help='Path to the Penpot JSON file to validate')
|
|
parser.add_argument(
|
|
'--schema',
|
|
'-s',
|
|
default=os.path.join(
|
|
config.RESOURCES_PATH,
|
|
'penpot-schema.json'),
|
|
help='Path to the JSON schema file (default: resources/penpot-schema.json)')
|
|
parser.add_argument('--verbose', '-v', action='store_true',
|
|
help='Enable verbose output with detailed validation errors')
|
|
return parser.parse_args()
|
|
|
|
|
|
def load_json_file(file_path: str) -> Dict[str, Any]:
|
|
"""
|
|
Load a JSON file.
|
|
|
|
Args:
|
|
file_path: Path to the JSON file
|
|
|
|
Returns:
|
|
The loaded JSON data
|
|
|
|
Raises:
|
|
FileNotFoundError: If the file doesn't exist
|
|
json.JSONDecodeError: If the file isn't valid JSON
|
|
"""
|
|
try:
|
|
with open(file_path, 'r') as f:
|
|
return json.load(f)
|
|
except FileNotFoundError:
|
|
sys.exit(f"Error: File not found: {file_path}")
|
|
except json.JSONDecodeError:
|
|
sys.exit(f"Error: Invalid JSON file: {file_path}")
|
|
|
|
|
|
def validate_penpot_file(data: Dict[str, Any], schema: Dict[str,
|
|
Any]) -> Tuple[bool, Optional[str]]:
|
|
"""
|
|
Validate a Penpot file against a schema.
|
|
|
|
Args:
|
|
data: The Penpot file data
|
|
schema: The JSON schema
|
|
|
|
Returns:
|
|
Tuple of (is_valid, error_message)
|
|
"""
|
|
try:
|
|
validate(instance=data, schema=schema)
|
|
return True, None
|
|
except ValidationError as e:
|
|
return False, str(e)
|
|
except SchemaError as e:
|
|
return False, f"Schema error: {str(e)}"
|
|
|
|
|
|
def main() -> None:
|
|
"""Main entry point for the command."""
|
|
args = parse_args()
|
|
|
|
# Load the files
|
|
print(f"Loading Penpot file: {args.input_file}")
|
|
data = load_json_file(args.input_file)
|
|
|
|
print(f"Loading schema file: {args.schema}")
|
|
schema = load_json_file(args.schema)
|
|
|
|
# Validate the file
|
|
print("Validating file...")
|
|
is_valid, error = validate_penpot_file(data, schema)
|
|
|
|
if is_valid:
|
|
print("✅ Validation successful! The file conforms to the schema.")
|
|
else:
|
|
print("❌ Validation failed!")
|
|
if args.verbose and error:
|
|
print("\nError details:")
|
|
print(error)
|
|
sys.exit(1)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|