Лабораторная работа будет выдана на ограниченное время, равное шести часам. Формат сдачи можно сравнить с обыкновенной контрольной по математическим предметам.

Текст задачи будет размещён на данной странице, а решение необходимо будет предоставить на ресурс moodle.uniyar.ac.ru. Пожалуйста удостоверьтесь, что у вас есть доступ к данному ресурсу.

Результат работы — архив с исходными кодами, который прикрепляется как решение задачи.

Требования к знаниям учащихся

  • Уровень знакомства с синтаксисом языка Ruby:
    • Запуск приложения.
    • Переменные, методы.
    • Работа контейнерами, итераторами, нумераторами.
    • Описание собственных классов.
    • Наследование классов.
    • Использование модулей и примесей.
    • Знание деталей работы чисел.
    • Знание деталей вызова методов и указания их аргументов.
    • Использование методов чисел и промежутков.
    • Использование методов классов строк и регулярных выражений.
  • Уровень знакомства с экосистемой Ruby:
    • Установка, удаление зависимостей с помощью gem.
    • Управление зависимостями с помощью Bundler.
    • Проверка качества исходного кода с помощью Rubocop.
    • Запуск типичных задач разработчика с помощью Rake.
  • Уровень знакомства с разработкой веб-приложений с помощью библиотеки Roda:
    • Обработка запросов GET для получения данных.
    • Использование шаблонов Foundation / Bootstrap для оформления сайта.
    • Обработка запросов POST на редактирование данных.
    • Передача аргументов в контроллер через адресную строку.
    • Умение структурировать сложное приложение.
    • Умение формировать интерфейс взаимодействия в стиле REST.

Требования к выполнению задания

  • Приложение должно реализовать все требования, указанные в задании. Однако, к защите допускаются приложения, реализующие только часть задач.
  • Исходный код приложения должен быть проверен с помощью приложения Rubocop с настройками по-умолчанию или с конфигурацией, предложенной на соответствующем занятии. Для каждого нарушения, которое находит Rubocop, должно быть объяснение почему оно не было исправлено. Допускаются аргументы с точки зрения архитектуры приложения, другого рода аргументы не принимаются.
  • Все зависимости приложения должны управляться с помощью Bundler, установка зависимостей с помощью gem запрещена. Исключением является джем bundler.
  • Для разрабатываемого приложения должен быть создан отдельный каталог.
    • В корне каталога должны располагаться конфигурационные файлы: Gemfile, Gemfile.lock.
    • В корне каталога должен находится конфигурационный файл rackup с помощью которого можно запустить приложение.
    • Исходный код приложения может быть расположен в каталогах helpers, models, lib, routes.
    • В каталоге views должны находиться шаблоны для описания вида.
  • Весь код приложения должен быть разбит на модули и классы, запрещается использовать файлы с простым набором методов, которые не пренадлежат какому-либо модулю.
  • Необходимо выделить отдельные классы, описывающие предметную область.
  • В одном модуле нельзя совмещать логику обработки предметной области и операции ввода-вывода.
  • Для обработки параметров запросов необходимо использовать специализированную библиотеку (dry-schema, dry-validations и т.п.).
  • Для формирования содержимого формы необходимо использовать специализированную библиотеку (forme, simple_form и т.п.).
  • Приложение должно корректно обрабатывать неправильный ввод от пользователя.
  • Приложение должно обладать понятным интерфейсом: показывать помощь по использованию, в случае ошибочных ситуаций сообщать пользователю причину ошибки и способы его устранения.
  • Желательно автоматизировать следующие задачи с помощью системы выполнения задач Rake:
    • Запуск приложения с помощью rerun.
    • Выполнение проверки исходного кода с помощью Rubocop.
  • Вся логика приложения должна быть реализована на языке Ruby. Запрещено реализовывать задачу с помощью языка JavaScript или любого языка, который компилируется в JavaScript или WebAssembly.

Задача

Разработаете веб-приложение, позволяющее пользователю просматривать аналитическую информацию о чеках. Информация о чеках хранится в CSV-документе cheques.csv. Данный документ должен быть загружен приложением один раз во время его старта.

Для формирования страниц предоставляются шаблоны, которые необходимо использовать при реализации соответствующих страниц. Архив со всеми шаблонами можно скачать по ссылке.

Стартовая страница, маршрут /

На стартовой странице, (маршрут /) должна быть размещена информация о назначении сайта, а также ссылки, ведущие к двум аналитическим частям приложения: анализ по месяцам и анализ по категориям.

Навигация по аналитике по месяцам, маршрут /months

На странице аналитики по месяцам должны располагаться автоматически созданные ссылки на страницы аналитики по конкретному месяцу. Для всех известных месяцев должна быть создана ссылка на соответствующий месяц. Если для месяца у приложения нет данных, то ссылка не должна генерироваться.

Например, если есть данные за декабрь 2019 года, тогда на странице должна быть ссылка, ведущая к статистике за этот месяц. Например: <a href='/months/2019-19'>Статистика за декабрь 2019 года</a>.

Аналитика за конкретный месяц, маршрут /months/MONTH

Приложение должно получать номер месяца для отображения информации из маршрута. Если за указанный месяц у приложения нет данных, то оно должно отображать данное сообщение на странице.

Если данные есть, тогда их необходимо отобразить в таблице. В таблице должна быть вся информация по тратам за выбранный пользователем месяц.

Навигация по аналитике по категориям, маршрут /categories

На странице навигации по аналитике по категориям должны располагаться автоматически созданные ссылки на страницы с аналитикой по категориям. Для всех известных категорий должна быть создана ссылка на страницу для конкретной категории. Если для данной категории у приложения нет информации, то ссылки не должны генерироваться.

Например, если есть данные по категории food, тогда на странице должна быть ссылка, ведущая на страницу со статистикой по данной категории. Например: <a href='/categories/food'>Статистика по категории food</a>.

Аналитика по категории, маршрут /categories/CATEGORY

Приложение должно получать название категории для отображения из маршрута. Если приложение не обладает информацией по данной категории, то на странице должно быть отображено соответствующее сообщение.

Если данные по категории есть, то на странице должна быть отображена следующая информация:

  • Информация о самой большой трате по данной категории.
  • Информация о самой маленькой трате по данной категории.
  • Список трат по данной категории за последний месяц.