Initial commit: Penpot MCP Server - Complete AI-powered design workflow automation with MCP protocol, Penpot API integration, Claude AI support, CLI tools, and comprehensive documentation
This commit is contained in:
100
penpot_mcp/tools/cli/validate_cmd.py
Normal file
100
penpot_mcp/tools/cli/validate_cmd.py
Normal file
@@ -0,0 +1,100 @@
|
||||
"""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()
|
||||
Reference in New Issue
Block a user