133 lines
4.1 KiB
Python
133 lines
4.1 KiB
Python
"""Output formatters for validation results."""
|
|
|
|
import json
|
|
|
|
from envschema.core import ValidationResult
|
|
|
|
|
|
class TextFormatter:
|
|
"""Formatter for human-readable text output."""
|
|
|
|
RED = "\033[91m"
|
|
GREEN = "\033[92m"
|
|
YELLOW = "\033[93m"
|
|
RESET = "\033[0m"
|
|
BOLD = "\033[1m"
|
|
|
|
@staticmethod
|
|
def format(result: ValidationResult, color: bool = True, ci_mode: bool = False) -> str:
|
|
"""Format validation result as text.
|
|
|
|
Args:
|
|
result: Validation result to format.
|
|
color: Whether to use ANSI colors.
|
|
ci_mode: CI mode (cleaner output without special chars).
|
|
|
|
Returns:
|
|
Formatted text.
|
|
"""
|
|
lines = []
|
|
|
|
if ci_mode:
|
|
return TextFormatter._format_ci(result)
|
|
|
|
if result.is_valid:
|
|
lines.append(f"{TextFormatter._color(TextFormatter.GREEN, '✓', color)} Validation passed")
|
|
if result.warnings:
|
|
lines.append("")
|
|
lines.append("Warnings:")
|
|
for warning in result.warnings:
|
|
lines.append(f" {TextFormatter._color(TextFormatter.YELLOW, '⚠', color)} {warning}")
|
|
else:
|
|
lines.append(f"{TextFormatter._color(TextFormatter.RED, '✗', color)} Validation failed")
|
|
lines.append("")
|
|
|
|
if result.missing_required:
|
|
lines.append("Missing required variables:")
|
|
for var in result.missing_required:
|
|
lines.append(f" {TextFormatter._color(TextFormatter.RED, '✗', color)} {var}")
|
|
lines.append("")
|
|
|
|
if result.type_errors:
|
|
lines.append("Type errors:")
|
|
for error in result.type_errors:
|
|
lines.append(f" {TextFormatter._color(TextFormatter.RED, '✗', color)} {error.var_name}: {error.message}")
|
|
lines.append("")
|
|
|
|
if result.pattern_errors:
|
|
lines.append("Pattern errors:")
|
|
for error in result.pattern_errors:
|
|
lines.append(f" {TextFormatter._color(TextFormatter.RED, '✗', color)} {error.var_name}: {error.message}")
|
|
lines.append("")
|
|
|
|
if result.warnings:
|
|
lines.append("Warnings:")
|
|
for warning in result.warnings:
|
|
lines.append(f" {TextFormatter._color(TextFormatter.YELLOW, '⚠', color)} {warning}")
|
|
|
|
return "\n".join(lines)
|
|
|
|
@staticmethod
|
|
def _format_ci(result: ValidationResult) -> str:
|
|
"""Format result for CI mode."""
|
|
lines = []
|
|
|
|
if result.is_valid:
|
|
lines.append("Validation passed")
|
|
else:
|
|
lines.append("Validation failed")
|
|
|
|
if result.missing_required:
|
|
lines.append("Missing required variables: " + ", ".join(result.missing_required))
|
|
|
|
if result.type_errors:
|
|
for error in result.type_errors:
|
|
lines.append(f"{error.var_name}: {error.message}")
|
|
|
|
return "\n".join(lines)
|
|
|
|
@staticmethod
|
|
def _color(color_code: str, text: str, use_color: bool) -> str:
|
|
"""Apply color to text."""
|
|
if use_color:
|
|
return f"{color_code}{text}{TextFormatter.RESET}"
|
|
return text
|
|
|
|
|
|
class JsonFormatter:
|
|
"""Formatter for JSON output."""
|
|
|
|
@staticmethod
|
|
def format(result: ValidationResult) -> str:
|
|
"""Format validation result as JSON.
|
|
|
|
Args:
|
|
result: Validation result to format.
|
|
|
|
Returns:
|
|
JSON string.
|
|
"""
|
|
return json.dumps(result.to_dict(), indent=2)
|
|
|
|
|
|
def format_result(
|
|
result: ValidationResult,
|
|
output_format: str = "text",
|
|
color: bool = True,
|
|
ci_mode: bool = False,
|
|
) -> str:
|
|
"""Format a validation result.
|
|
|
|
Args:
|
|
result: Validation result to format.
|
|
output_format: Output format ('text' or 'json').
|
|
color: Whether to use colors (text format only).
|
|
ci_mode: CI mode (text format only).
|
|
|
|
Returns:
|
|
Formatted output string.
|
|
"""
|
|
if output_format == "json":
|
|
return JsonFormatter.format(result)
|
|
return TextFormatter.format(result, color=color, ci_mode=ci_mode)
|