Пересдача № 3
Требования к знаниям учащихся
- Уровень знакомства с синтаксисом языка 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
один раз при старте приложения.
Внимание! Структура файла аналогична файлам с пересдач № 1 и № 2 с несколькими модификациями:
- Добавлены атрибуты книги:
- “quantity” – количество экземпляров на складе (число);
- “ageLimit” – возрастной рейтинг, минимальный рекомендуемый возраст читателя (число).
- Добавлена характеристика автора в массиве “internalAuthors”:
- “booksCount” – общее количество книг автора, продающихся сейчас или продававшихся ранее в магазине (число).
Корневой элемент JSON-данных содержит следующие элементы:
- Запись с ключом “books” и значением в виде массива книг.
- Запись с ключом “categories” и значением в виде массива справочной информации по категориям книги.
- Запись с ключом “internalAuthors” и значением в виде массива справочной информации по авторам книги.
- Запись с ключом “publishingHouses” и значением в виде массива справочной информации по издательствам.
Массив книг, “books”, состоит из записей, содержащих 3 обязательных поля:
- Пара ключ-значение с ключом “id” и строковым значением, содержащим уникальный идентификатор книги.
- Пара ключ-значение с ключом “attributes” и значением в виде записи, содержащей следующие атрибуты книги:
- “name” — название книги (строка);
- “weight” — вес книги в граммах (число);
- “amountTotal” — стоимость (целое число в виде строки);
- “lastReleaseDate” — дата последнего издания (дата в формате ГГГГ-ММ-ДД в виде строки или null);
- “isbn” — ISBN книги;
- “quantity” — количество экземпляров на складе (число);
- “ageLimit” — возрастной рейтинг, минимальный рекомендуемый возраст читателя (число).
- Пара ключ-значение с ключом “relationships” и значением в сиди записи, содержащей следующие расширяемые атрибуты книги:
- “authors” — массив записей формата {“id”: “N”}, список идентификаторов авторов (возможно, пустой);
- “category” — идентификатор категории книги (число в виде строки);
- “publishingHouse” — идентификатор издательства (число в виде строки).
Массив справочной информации “categories” состоит из записей со следующими полями:
- “id” — идентификатор категории (число в виде строки);
- “categoryName” — название категории (строка).
Массив справочной информации “internalAuthors” состоит из записей со следующими полями:
- “id” — идентификатор автора (число в виде строки);
- “authorName” — ФИО автора (строка);
- “letter” — первая буква фамилии автора (строка);
- “booksCount” – общее количество книг автора, продающихся сейчас или продававшихся ранее в магазине (число).
Массив справочной информации “publishingHouses” состоит из записей со следующими полями:
- “id” — идентификатор издательства (число в виде строки);
- “publishingHouse” — название издательства (строка).
Функциональность приложения
Требования к функциональности приложения описаны в вашем варианте.