← Все проекты уровня 3
Уровень 3 · Личные каталогиВариант B

Дневник тренировок

Сохраняйте тренировки, упражнения и подходы, чтобы сравнивать нагрузку без потери истории.

Техническое задание

Требования

Сделайте CLI-дневник тренировок с командами add, list, update, delete и find и хранением в JSON. Общий флаг --data задаёт путь к хранилищу, по умолчанию workouts.json в текущей директории. Тренировка имеет уникальный ID, дату YYYY-MM-DD, тип занятия, длительность в целых минутах, заметку и список упражнений. Упражнение содержит название и список подходов; подход задаётся числом повторений и весом в килограммах. Для упражнений с собственным весом вес допускается равным нулю. Дата, тип и хотя бы одно упражнение обязательны. Количество повторений должно быть положительным целым, вес и длительность — неотрицательными, длительность занятия — положительной.

Add получает основные поля флагами, а упражнения и подходы — из отдельного JSON-файла, указанного через --details. Программа проверяет даты по календарю. List допускает --from и --to как включительный диапазон; записи сортируются по дате убыванию, а при равной дате по ID возрастанию. Find ищет подстроку без учёта регистра в типе, заметке и названиях упражнений. Update по --id меняет дату, тип, длительность или заметку по отдельности; состав упражнений обновляется только при явном --details. Удаление требует подтверждающий флаг --yes, чтобы случайный вызов не удалил запись.

При первом запуске отсутствующий JSON-файл считается пустой историей. При любом изменении файл проверяется целиком и записывается атомарно. Повреждённое хранилище нельзя исправлять молча; данные должны остаться нетронутыми при ошибке. Ошибки аргументов, даты и ссылок на ID возвращают ненулевой код с сообщением в stderr. Не делайте графики или спортивные рекомендации: программа хранит и показывает записи. В README укажите примеры команд, а тесты покройте на временном хранилище.

Структура программы

Поместите проверку тренировки, календарных дат, фильтрацию и порядок записей в internal/workout. Отдельный файл отвечает за чтение и атомарную запись JSON; main.go разбирает команды add/list/update/delete/find и передаёт данные этим функциям. Разделите декодирование details-файла и доменную проверку, чтобы core-тесты не запускали CLI и не читали реальные файлы.

Критерии готовности

Ожидаемый результат

Сдайте запускаемый Go-модуль с пятью CLI-командами, форматом JSON, README и автономными тестами. Пример details-файла должен включать как минимум одно упражнение и несколько подходов. Вывод списка содержит дату, тип, длительность и сводку упражнений; выбранный порядок записей документирован.

Критерии приёмки:

  • README описывает границы internal/workout и хранилища; тесты используют временный файл.
  • корректная тренировка с несколькими подходами сохраняется и читается после перезапуска;
  • вес 0 разрешён для упражнения с собственным весом;
  • фильтр дат включает обе границы;
  • сортировка по дате убывающая и стабильна для одинаковых дат;
  • find находит упражнение без учёта регистра. Несуществующий ID, невозможная дата, нулевое число повторений и удаление без --yes завершаются диагностикой. Повреждённый JSON не перезаписывается, а список без файла показывает пустую историю.

Для ориентира

Примеры входа и результата

Запись: дата 2026-09-28, тип «Силовая», 45 минут, приседания с двумя подходами по 8 повторений и 40 кг сохраняются одной тренировкой. Поиск find --query присед показывает тренировку с упражнением «Приседания» независимо от регистра.