79 lines
2.5 KiB
Python
79 lines
2.5 KiB
Python
"""
|
||
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
|