teachingAssistant / src /domain /models /translation_request.py
Michael Hu
refactor based on DDD
5009cb8
raw
history blame
3.79 kB
"""TranslationRequest value object for translation service requests."""
from dataclasses import dataclass
from typing import Optional
import re
from .text_content import TextContent
@dataclass(frozen=True)
class TranslationRequest:
"""Value object representing a translation request with source and target languages."""
source_text: TextContent
target_language: str
source_language: Optional[str] = None
def __post_init__(self):
"""Validate translation request after initialization."""
self._validate()
def _validate(self):
"""Validate translation request properties."""
if not isinstance(self.source_text, TextContent):
raise TypeError("Source text must be a TextContent instance")
if not isinstance(self.target_language, str):
raise TypeError("Target language must be a string")
if not self.target_language.strip():
raise ValueError("Target language cannot be empty")
# Validate target language code format (ISO 639-1 or ISO 639-3)
if not re.match(r'^[a-z]{2,3}(-[A-Z]{2})?$', self.target_language):
raise ValueError(f"Invalid target language code format: {self.target_language}. Expected format: 'en', 'en-US', etc.")
if self.source_language is not None:
if not isinstance(self.source_language, str):
raise TypeError("Source language must be a string")
if not self.source_language.strip():
raise ValueError("Source language cannot be empty string")
# Validate source language code format
if not re.match(r'^[a-z]{2,3}(-[A-Z]{2})?$', self.source_language):
raise ValueError(f"Invalid source language code format: {self.source_language}. Expected format: 'en', 'en-US', etc.")
# Check if source and target languages are the same
if self.source_language == self.target_language:
raise ValueError("Source and target languages cannot be the same")
# If source language is not specified, use the language from TextContent
if self.source_language is None and self.source_text.language == self.target_language:
raise ValueError("Source and target languages cannot be the same")
@property
def effective_source_language(self) -> str:
"""Get the effective source language (from parameter or TextContent)."""
return self.source_language if self.source_language is not None else self.source_text.language
@property
def is_auto_detect_source(self) -> bool:
"""Check if source language should be auto-detected."""
return self.source_language is None
@property
def text_length(self) -> int:
"""Get the length of source text."""
return len(self.source_text.text)
@property
def word_count(self) -> int:
"""Get the word count of source text."""
return self.source_text.word_count
def with_target_language(self, target_language: str) -> 'TranslationRequest':
"""Create a new TranslationRequest with different target language."""
return TranslationRequest(
source_text=self.source_text,
target_language=target_language,
source_language=self.source_language
)
def with_source_language(self, source_language: Optional[str]) -> 'TranslationRequest':
"""Create a new TranslationRequest with different source language."""
return TranslationRequest(
source_text=self.source_text,
target_language=self.target_language,
source_language=source_language
)