Пересдача № 2
Требования к знаниям учащихся
- Уровень знакомства с синтаксисом языка Ruby:
- Запуск приложения.
- Переменные, методы.
- Работа контейнерами, итераторами, нумераторами.
- Описание собственных классов.
- Наследование классов.
- Использование модулей и примесей.
- Знание деталей работы чисел.
- Знание деталей вызова методов и указания их аргументов.
- Использование методов чисел и промежутков.
- Использование методов классов строк и регулярных выражений.
- Уровень знакомства с экосистемой Ruby:
- Установка, удаление зависимостей с помощью
gem
. - Управление зависимостями с помощью Bundler.
- Проверка качества исходного кода с помощью Rubocop.
- Запуск типичных задач разработчика с помощью Rake.
- Написание модульных тестов с помощью инструментов RSpec.
- Установка, удаление зависимостей с помощью
- Уровень знакомства с разработкой веб-приложений с помощью библиотеки Roda:
- Обработка запросов GET для получения данных.
- Использование шаблонов Foundation / Bootstrap для оформления сайта.
- Обработка запросов POST на редактирование данных.
- Передача аргументов в контроллер через адресную строку.
- Умение структурировать сложное приложение.
- Умение формировать интерфейс взаимодействия в стиле REST.
Требования к выполнению задания
- Приложение реализуется студентом самостоятельно.
- Приложение должно реализовать все требования, указанные в задании. Однако к защите допускаются приложения, реализующие только часть задач.
- К защите не допускается исходный код, который не запускается.
- Исходный код приложения должен быть проверен с помощью приложения Rubocop с настройками по-умолчанию или с конфигурацией, предложенной на соответствующем занятии. Для каждого нарушения, которое находит Rubocop, должно быть объяснение почему оно не было исправлено. Допускаются аргументы с точки зрения архитектуры приложения, другого рода аргументы не принимаются.
- Все зависимости приложения должны управляться с помощью Bundler, установка зависимостей с помощью
gem
запрещена. Исключением является джемbundler
. - Для разрабатываемого приложения должны быть создан отдельный каталог.
- В корне каталога должны располагаться конфигурационные файлы:
Gemfile
,Gemfile.lock
. - В корне каталога приложения должны находится каталоги
bin
,lib
, в которых должен находиться исходный код приложения. В каталогеbin
находится исполняемый файл, в каталогеlib
находится описание всех собственных классов и модулей. - В корне каталога приложения должен находиться каталог
spec
, в котором должны находиться модульные тесты для классов, описывающих предметную логику.
- В корне каталога должны располагаться конфигурационные файлы:
- Весь код приложения должен быть разбит на модули и классы, запрещается использовать файлы с простым набором методов, которые не пренадлежат какому-либо модулю.
- Необходимо выделить отдельные классы и модули, описывающие предметную область.
- В одном модуле нельзя совмещать логику обработки предметной области и операции ввода-вывода.
- Приложение должно корректно обрабатывать неправильный ввод от пользователя.
- Приложение должно обладать понятным интерфейсом: показывать помощь по использованию, для ввода данных приложение должно показывать приглашение.
Задача
Требуется написать приложение, позволяющее получать информацию об ассортименте книжного магазина.
Описание структуры данных
Инициализация данных происходит из файла Books.json
один раз при старте приложения.
Корневой элемент JSON-данных содержит следующие элементы:
- Запись с ключом “books” и значением в виде массива книг.
- Запись с ключом “categories” и значением в виде массива справочной информации по категориям книги.
- Запись с ключом “internalAuthors” и значением в виде массива справочной информации по авторам книги.
- Запись с ключом “publishingHouses” и значением в виде массива справочной информации по издательствам.
Массив книг, “books”, состоит из записей, содержащих 3 обязательных поля:
- Пара ключ-значение с ключом “id” и строковым значением, содержащим уникальный идентификатор книги.
- Пара ключ-значение с ключом “attributes” и значением в виде записи, содержащей следующие атрибуты книги:
- “name” — название книги (строка);
- “weight” — вес книги в граммах (число);
- “amountTotal” — стоимость (целое число в виде строки);
- “lastReleaseDate” — дата последнего издания (дата в формате ГГГГ-ММ-ДД в виде строки или null);
- “isbn”.
- Пара ключ-значение с ключом “relationships” и значением в сиди записи, содержащей следующие расширяемые атрибуты книги:
- “authors” — массив записей формата {“id”: “N”}, список идентификаторов авторов (возможно, пустой);
- “category” — идентификатор категории книги (число в виде строки);
- “publishingHouse” — идентификатор издательства (число в виде строки).
Массив справочной информации “categories” состоит из записей со следующими полями:
- “id” — идентификатор категории (число в виде строки);
- “categoryName” — название категории (строка).
Массив справочной информации “internalAuthors” состоит из записей со следующими полями:
- “id” — идентификатор автора (число в виде строки);
- “authorName” — ФИО автора (строка);
- “letter” — первая буква фамилии автора (строка).
Массив справочной информации “publishingHouses” состоит из записей со следующими полями:
- “id” — идентификатор издательства (число в виде строки);
- “publishingHouse” — название издательства (строка).
Функциональность приложения
После старта приложение должно отобразить на экране приветствие и меню для выбора первой буквы фамилии автора. Пользователь может с помощью интерактивного меню или указания порядкового номера буквы выбрать интересующую его букву. Запрещено требовать от пользователя вводить букву с клавиатуры.
Помимо букв в меню первого уровня также должен присутствовать пункт меню «Завершить работу приложения». При выборе данного пункта меню приложение должно корректно завершать свою работу.
В рамках второго уровня меню должны быть отображены известные приложению авторы, фамилия которых начинается на выбранную пользователем букву. Авторы должны быть отсортированы лексикографически. Если таких авторов нет, то приложение должно вывести фразу «Нет авторов, фамилия которых начинается на букву N», где N заменяется выбранной пользователем буквой.
В рамках второго уровня меню также должен быть пункт «вернуться к списку букв». При выборе данного пункта пользователь должен увидеть меню первого уровня.
Пользователь может с помощью интерактивного меню или указания порядкового номера выбрать пункт из второго уровня меню. Запрещено требовать от пользователя вводить имя автора вручную.
После выбора автора во втором уровне интерактивного меню пользователю должна отобразиться следующая информация по автору:
- Количество книг данного автора, которые есть в настоящий момент в приложении.
- Количество книг данного автора, которые были написаны в соавторстве.
- Список уникальных имён соавторов.
- Список книг данного автора, отсортированный лексикографически.
После отображения информации пользователю предоставляется интерактивное меню, состоящее из трёх пунктов:
- Начать поиск заново. При выборе данного пункта меню приложение должно отобразить меню первого уровня.
- Выбрать другого автора на эту же букву. При выборе данного пункта меню приложение должно показать меню второго уровня со списком авторов, фамилия которых совпадает с фамилией текущего автора.
- Выйти из приложения. При выборе этого пункта меню необходимо корректно завершить работу приложения.
Меню должно быть интерактивным, либо требовать от пользователя указать номер элемента в меню.