HatmanStack
fix: address post-audit review findings across docs and source
924784f
Raw
History Blame Contribute Delete
1.85 kB
"""Input validation for user-provided data."""
import re
from pydantic import BaseModel, Field, field_validator
class PlayerSearchInput(BaseModel):
"""Validated player search input."""
search_term: str = Field(
...,
min_length=1,
max_length=100,
description="Player name search term",
)
@field_validator("search_term")
@classmethod
def validate_reasonable_characters(cls, v: str) -> str:
"""Ensure search term contains only reasonable characters.
Args:
v: Input search term
Returns:
Validated and stripped search term
Raises:
ValueError: If invalid characters found
"""
v = v.strip()
if not v:
raise ValueError("Search term cannot be empty.")
# Allow letters, numbers, spaces, hyphens, periods, and apostrophes
# (e.g., "O'Neal", "J.R. Smith")
if not re.match(r"^[a-zA-Z0-9 \-.']+$", v):
raise ValueError(
"Search term contains invalid characters. "
"Please use only letters, numbers, spaces, hyphens, "
"periods, and apostrophes."
)
return v
def validate_search_term(term: str) -> str | None:
"""Validate a player search term.
Args:
term: Raw search input
Returns:
Validated and cleaned search term, or None if invalid
"""
try:
validated = PlayerSearchInput(search_term=term)
return validated.search_term
except ValueError:
return None
def is_valid_search_term(term: str) -> bool:
"""Check if a search term is valid without raising exceptions.
Args:
term: Raw search input
Returns:
True if valid, False otherwise
"""
return validate_search_term(term) is not None