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

Текст задачи будет размещён на данной странице, а решение необходимо будет предоставить на ресурс 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.

Задачи

Разработаете веб-приложение, позволяющее пользователю решать следующие задачи.

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

Сортировка целых чисел

Реализуйте страницу для сортировки целых чисел. Макет страницы доступен по ссылке. Его необходимо использовать при реализации данной страницы.

  • Страница должна предоставлять пользователю поле для ввода строки и кнопку «Отсортировать».
  • Пользователь вводит в поле для ввода числа, разделённые запятыми, и нажимает на кнопку «Отсортировать».
  • Приложение получает ввод от пользователя, отображает эту же страницу. В поле для ввода должна содержаться строка, которую ввёл пользователь.
    • Если пользователь ввёл данные корректно, то приложение должно под формой ввода данных отобразить список отсортированных чисел.
    • Если данные введены некорректно, то приложение должно показать информационное сообщение пользователю о том, что данные введены неверно.

Приложение должно рассматривать правильным ввод в формате: число, число, число. Пробелы в начале и в конце описания каждого числа должны игнорироваться.

Поиск одинаковых чисел

Реализуйте страницу для поиска одинаковых чисел в двух последовательностях. Макет страницы доступен по ссылке. Его необходимо использовать при реализации данной страницы.

  • Страница предоставляет пользователю два поля ввода для строк и кнопку «Найти одинаковые числа».
  • Пользователь вводит в оба поля последовательности чисел в формате предыдущей задачи и нажимает на кнопку «Найти одинаковые числа».
  • Приложение получает ввод от пользователя, обрабатывает их и отображает эту же страницу. В полях для ввода должны содержаться строки, отправленные пользователем.
    • Если данные были введены корректно, то приложение под формой для ввода данных выводит список одинаковых чисел или фразу «одинаковые числа не найдены».
    • Если данные введены некорректно, то приложение должно информировать пользователя об ошибке ввода и указать поля, в которых данные были введены неверно.

Анализ данных о тратах по категориям

Реализуйте страницу анализа трат по категориям за указанный месяц. Макет страницы доступен по ссылке. Его необходимо использовать при реализации данной страницы.

Для формирования данных необходимо использовать файл cheques.yaml. Для обработки данных из данного файла нет необходимости формировать классы предметной логики «Чек» и «Продукт». Достаточно реализовать отдельный класс, реализующий логику работы над данными. Данные должны считываться при старте приложения.

  • Страница предоставляет пользователю поля для ввода данных: категория, время начала, время окончания.
  • Пользователь вводит строки в соответствующие поля и нажимает на кнопку «Отобразить».
  • Приложение получает ввод от пользователя, обрабатывает его и отображает эту же страницу. В полях для ввода должны содержаться данные, введённые пользователем.
    • Если данные были введены корректно, то приложение под формой отображает список подходящих трат в хронологическом порядке. Если подходящих трат нет, то приложение должно сообщать пользователю, что по его фильтру данных не было найдено.
    • Если данные были введены некорректно, то приложение должно информировать пользователя об ошибке ввода и указать поля, в которых данные были введены неверно.

Анализ данных о тратах по месяцам

Реализуйте страницу анализа трат по месяцам. Макет страницы доступен по ссылке. Его необходимо использовать при реализации данной страницы.

Для формирования данных необходимо использовать файл cheques.yaml. Для обработки данных из данного файла нет необходимости формировать классы предметной логики «Чек» и «Продукт». Достаточно реализовать отдельный класс, реализующий логику работы над данными. Данные должны считываться при старте приложения.

  • Страница предоставляет пользователю поле для ввода месяца в формате ГГГГ-ММ и кнопку «Отобразить».
  • Пользователь указывает месяц в поле для ввода и нажимает на кнопку «Отобразить».
  • Приложение получает ввод от пользователя, обрабатывает его и отображает результаты на этой же странице. В поле ввода должны сохраниться данные, введённые пользователем.
    • Если данные были введены верно, то приложение под формой отображает список трат по категориям за указанный месяц. Категории должны быть отсортированы по объёму трат. Если за выбранный месяц нет трат, то приложение должно сообщить об этом.
    • Если данные были введены некорректно, то приложение должно информировать пользователя об ошибке ввода.

Журнал действий пользователя

Макет страницы доступен по ссылке. Его необходимо использовать при реализации данной страницы.

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

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