Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 24 additions & 1 deletion promptlens/models/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

from typing import Any, Dict, List, Optional

from pydantic import BaseModel, Field
from pydantic import BaseModel, Field, field_validator


class ProviderConfig(BaseModel):
Expand Down Expand Up @@ -83,6 +83,9 @@ class ExecutionConfig(BaseModel):
timeout_seconds: int = 60


SUPPORTED_OUTPUT_FORMATS = {"html", "json", "csv", "md"}


class OutputConfig(BaseModel):
"""Configuration for output settings.

Expand All @@ -96,6 +99,26 @@ class OutputConfig(BaseModel):
formats: List[str] = Field(default_factory=lambda: ["html", "json"])
run_name: Optional[str] = None

@field_validator("formats")
@classmethod
def validate_formats(cls, formats: List[str]) -> List[str]:
"""Ensure output formats are supported and normalized."""
normalized_formats = [format_name.lower().strip() for format_name in formats]
invalid_formats = [
format_name for format_name in normalized_formats
if format_name not in SUPPORTED_OUTPUT_FORMATS
]

if invalid_formats:
supported = ", ".join(sorted(SUPPORTED_OUTPUT_FORMATS))
invalid = ", ".join(sorted(set(invalid_formats)))
raise ValueError(
f"Unsupported output formats: {invalid}. "
f"Supported formats: {supported}"
)

return normalized_formats


class RunConfig(BaseModel):
"""Complete run configuration.
Expand Down
17 changes: 17 additions & 0 deletions tests/test_output_format_validation.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
"""Tests for output format validation hardening."""

import pytest
from pydantic import ValidationError

from promptlens.models.config import OutputConfig


def test_output_formats_are_normalized() -> None:
config = OutputConfig(formats=[" JSON ", "Html", "md"])

assert config.formats == ["json", "html", "md"]


def test_output_formats_reject_unsupported_values() -> None:
with pytest.raises(ValidationError, match="Unsupported output formats"):
OutputConfig(formats=["json", "xml"])