add models.py
This commit is contained in:
@@ -0,0 +1,78 @@
|
||||
"""
|
||||
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
|
||||
Reference in New Issue
Block a user