Галанова Екатерина, М8О-102БВ-25
src/
models.py — модель задачи Task, дескрипторы валидации
exeptions.py — специализированные исключения
protocols.py — протокол TaskSource
main.py — фабрика источников и обработка задач
simulation.py — интерактивная симуляция через меню
sources/
file_source.py — загрузка задач из текстового файла
generator_source.py — программная генерация задач
api_stub.py — имитация внешнего API
text_files/
tasks.txt — пример файла с задачами
tests/
tests.py — тесты к лабораторной 1
tests_lab2.py — тесты к лабораторной 2
Подсистема приёма задач. Задачи поступают из различных источников, не связанных наследованием, но реализующих единый контракт через typing.Protocol.
@runtime_checkable
class TaskSource(Protocol):
def get_tasks(self) -> list[Task]: ...Каждый источник обязан реализовать get_tasks(). Общий базовый класс не используется — источники связаны только контрактом. Проверка выполняется через issubclass (при создании) и isinstance (при обработке).
- FileSource — читает задачи из текстового файла (формат
id;payload) - GeneratorSource — генерирует заданное количество задач
- ApiStubSource — заглушка внешнего API
Источники независимы по реализации. Protocol описывает поведение, а не происхождение — новый источник можно добавить без наследования и без изменения существующего кода.
Модель Task с инкапсуляцией и валидацией состояния.
| Атрибут | Тип | Описание |
|---|---|---|
id |
str |
Уникальный идентификатор (непустая строка) |
description |
str |
Описание задачи (непустая строка) |
priority |
int |
Приоритет от 1 до 10 |
status |
str |
pending / in_progress / done / cancelled |
payload |
Any |
Произвольные данные |
created_at |
datetime |
Время создания (read-only, @property) |
is_ready |
bool |
Вычисляемое свойство: pending и приоритет >= 3 |
StringValidator— data-дескриптор, проверяет что значение — непустая строка. Используется дляidиdescription.PriorityValidator— data-дескриптор, проверяет что приоритет —intот 1 до 10 (отсекаетboolиfloat).StatusValidator— data-дескриптор, допускает только разрешённые статусы.ReadOnlyTimestamp— non-data дескриптор (только__get__, без__set__), демонстрирует отличие от data-дескрипторов.
Все наследуются от TaskValidationError:
InvalidPriorityError— некорректный приоритетInvalidStatusError— недопустимый статусInvalidTaskIdError,InvalidDescriptionError— ошибки id/описания
Интерактивная симуляция:
python -m src.simulationТесты лабораторной 1:
python -m pytest tests/tests.py -vТесты лабораторной 2:
python -m pytest tests/tests_lab2.py -v- Фабрика
create_source— создание валидных источников и отклонение невалидных - Функция
process_tasks— вывод задач и проверка контракта - Интерактивная симуляция — все пункты меню
