Выполненное тестовое задание компании Hitalent по созданию консольного приложения с основным CRUD функционалом и работой c JSON файлом.
🚀 Основные требования к задаче:
- Просмотр всех текущих задач с возможностью фильтрации - Выполнено ✅
- Добавление новой задачи с автоматической генерацией уникального ID - Выполнено ✅
- Редактирование существующей задачи - Выполнено ✅
- Удаление задачи по ID - Выполнено ✅
- Поиск по ключевым словам, категории или статусу выполнения - Выполнено ✅
- Хранение данных в Json файле - Выполнено ✅
- Тестирование при помощи Pytest - Выполнено ✅
- Обработка невалидных данных и ошибок - Выполнено ✅
- Аннотации, документирование, многослойная архитектура, ОПП - Выполнено ✅
Основные объекты в проекте:
- TaskServer class - Отвечает за управление бизнес логики.
- TaskHelper class - Берет на себя чаcть функционала TaskServer, чтобы разгрузить сложность ветвления логики.
- TaskRepository class - Отвечает за выполнение СRUD операций.
- TaskStorage class - Сохраняет и загружает данные из файла, преобразует модель в словарь и обратно.
- Task class - Основная модель, которая представляет сущность "Задача".
Точка входа в приложение функция main(), которая запускает бесконечный цикл опроса пользователя с выводом панели управления в консоль. После того как пользователь ввел вариант ответа от 1 до 6 main начинает дергать класс TaskService, который содержит в себе основную бизнес логику, методы этого класса имеют логическое ветвление и обработку основных ошибок, а также вывод сообщений в консоль. Класс сервис, в свою очередь, дергает класс TaskRepository, который выполняет CRUD операции и возвращает результат классу TaskService, если это необходимо для дальнейшей логики. TaskRepository получает зависимость в виде класса Storage, который имеет только 2 метода, сохранение данных в файл и загрузка данных из файла. Также TaskService принимает зависимостью класс ServiceHelper, его я сделал, что "разгрузить" сложное логическое ветвление TaskService.
Для реализации атрибутов Task модели, таких как, category, status, priority использовал класс Enum из стандартной библиотеки и для атрибута due_date использовал datetime.
Реализовал пару декораторов для генерации автоматической генерации ID задачи и второй декоратор для получения конкретного Task объекта по ID, что очень хорошо отразилось на структуре приложения. Использовал dev инструменты для чистого кода: isort, flake, black, pre-commit.
Большая часть проекта, а именно основной функционал покрыт тестами при помощи Pytest, unittest и плагинами pytest-mock, syrupy и подробной документацией.