Python-пакет с моделями и Protocol: итоговая задача

Собери ядро трекера задач: модели, Protocol и сервис

Что уже дано

В редакторе импортированы dataclass, Enum и Protocol; остальное ядро трекера нужно реализовать в одном файле. Проверяющая система не передаёт готовый репозиторий до кода ученика: после определения ваших типов она создаёт in-memory репозиторий с методами load и save и передаёт его в TaskService.

Что нужно сделать

Определите на верхнем уровне:

  • TaskStatus(Enum) с членами TODO = "TODO" и DONE = "DONE";
  • Task как @dataclass с полями id: int, title: str, status: TaskStatus;
  • TaskRepository(Protocol) с точными методами load(self) -> list[Task] и save(self, tasks: list[Task]) -> None;
  • TaskService, чей __init__(self, repo: TaskRepository) -> None сохраняет репозиторий.

Методы TaskService:

  • add(self, title: str) -> Task загружает список, создаёт id = max(существующих id, default=0) + 1, добавляет задачу со статусом TODO, сохраняет список и возвращает задачу;
  • complete(self, task_id: int) -> None переводит найденную задачу в DONE и сохраняет список, а для неизвестного id поднимает ValueError;
  • list_open(self) -> list[Task] возвращает только задачи со статусом TODO.

Ввод и вывод

stdin не используется. Печатать через print в stdout ничего не нужно. Данные поступают через методы объекта TaskRepository: сервис вызывает load() и передаёт полный список в save(tasks). Название и id передаются аргументами методов сервиса; результаты возвращаются как Task, list[Task] или None согласно сигнатурам.

Пример использования

class MemoryRepo:
    def __init__(self):
        self.tasks = []

    def load(self):
        return self.tasks

    def save(self, tasks):
        self.tasks = tasks

repo = MemoryRepo()
service = TaskService(repo)
created = service.add("Написать документацию")
print(created.id, created.title, created.status.value)
print([task.title for task in service.list_open()])

Результат:

1 Написать документацию TODO
['Написать документацию']
РешениеPython

Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.

Отправьте решение, чтобы увидеть результаты тестов.

Связанные задачи