""" models.py ========= This module defines the :class:`TaskCard` Pydantic model that represents a structured representation of an informal task description. The fields are intentionally simple but expressive enough for the unit tests and examples in ``main.py``: * ``title`` – short human‑readable title. * ``subject`` – subject area or domain. * ``deadline_hint`` – free‑form hint about when the task should be finished. * ``deliverable_type`` – what is expected to be submitted (report, code, presentation, etc.). * ``grading_hints`` – list of strings that were mentioned in the original text as criteria for grading. The model uses :class:`pydantic.Field` to provide helpful descriptions and default values. The ``__str__`` method is overridden so that printing a model instance gives a nicely formatted summary. """ from __future__ import annotations from typing import List, Optional from pydantic import BaseModel, Field class TaskCard(BaseModel): """Pydantic model for a parsed task card. The fields are intentionally minimal but cover all information that the assignment expects to be extracted from an informal description. """ title: str = Field( ..., description="Short human‑readable title of the task.", ) subject: Optional[str] = Field( None, description="Subject or domain mentioned in the text (e.g. LangChain).", ) deadline_hint: Optional[str] = Field( None, description="Free‑form hint about when the task should be finished.", ) deliverable_type: Optional[str] = Field( None, description="What is expected to be submitted (report, code, presentation).", ) grading_hints: List[str] = Field( default_factory=list, description="List of strings that were mentioned as grading criteria.", ) def __str__(self) -> str: """Return a human‑readable summary of the card.""" parts = [f"Title: {self.title}"] if self.subject: parts.append(f"Subject: {self.subject}") if self.deadline_hint: parts.append(f"Deadline hint: {self.deadline_hint}") if self.deliverable_type: parts.append(f"Deliverable type: {self.deliverable_type}") if self.grading_hints: parts.append( "Grading hints: " + ", ".join(self.grading_hints) ) return "\n".join(parts) class Config: # Allow arbitrary types for future extensions. arbitrary_types_allowed = True # End of models.py