Использование стандартных примесей
Использование примеси Comparable
Документация
Задача
Предположим разработаем инструмент, который поможет каналу Кино Огонь в составлении рейтингов кинофильмов и сериалов. Для вычисления рейтинга берётся следующая информация:
- Зрительский рейтинг фильма на IMDb, imdb.
- Зрительский рейтинг фильма на КиноПоиске, kinopiosk.
- Рейтинг кинокритиков на Metacritic, metacritic.
- Рейтинг кинокритиков на Rotten Tomatoes, rotten_tomatoes.
Рейтинг вычисляется по следующей формуле:
(imdb + kinopoisk + (metacritic + rotten_tomatoes) / 2) / 3
Ниже представлен CSV-файл, который содержит описание нескольких фильмов:
title,kinopoisk,imdb,metacritic,rotten_tomatoes
Влюблённый Шекспир,75,71,87,92
Форма воды,69,74,87,92
Столкновение,79,78,69,74
Английский пациент,79,74,87,84
Чикаго,77,72,82,85
Ваша задача написать приложение, которое считывает информацию из CSV-файла и формирует новый CSV-файл, в котором помимо изначальных данных будет также содержаться рейтинг от Кино Огонь, по которому будут отсортированы все строки. Пути к файлам указываются в качестве аргументов приложения. Пример запуска приложения:
ruby bin/create_rating.rb data/input.csv data/sorted.csv
После реализации приложения добавьте в исходный файл информацию об одном из ваших фильмов и сравните его с другими фильмами по рейтингу.
Работа с аргументами в приложении на Ruby
Для обработки аргументов рекомендуется использовать стандартные библиотеки optparse или getoptlong. Первая представляет собою современную систему описания аргументов, а вторая предоставляет реализацию подхода к обработке аргументов из стандартной библиотеки проекта GNU для языка Си.
Требования к реализации
- Структура приложения должна совпадать со стандартной структурой джема.
- В приложении должны быть выделены классы предметной логики: фильм (Movie) и список фильмов (MovieList).
- В приложении должен быть класс, который ответственен за выполнение операций приложения (RatingCreator).
- Исходный код приложения должен быть проверен с помощью Rubocop и всего его замечания должны быть исправлены.
- Все зависимости приложения должны быть описаны с помощью Bundler.
Предлагаемый подход к реализации
- Создайте каталог с приложением и разместите в нём подкаталоги bin,lib,data.
- Создайте файл data/input.csvи заполните его информацией, представленной на странице.
- Создайте файл lib/raiting_creator.rbи добавьте в него класс RatingCreator с пустым методомcreate.
- Создайте файл bin/create_rating.rb, подключите в нём файлrating_creator.rb, создайте экземпляр класса RatingCreator и вызовите методcreate. Никаких других действий в данном файле выполнять нельзя.
- В методе RatingCreator#createреализуйте обработку списка аргументов.- Проверьте, что были переданы все аргументы.
- Проверьте, что первый аргумент ссылается на существующий CSV-файл.
- Если аргументов недостаточно или они некорректны приложение должно выводить сообщение пользователю и завершать свою работу.
 
- Создайте класс Movieв файлеlib/movie.rb. Конструктор данного класса должен принимать 5 аргументов: название и 4 рейтинга. Для каждого параметра необходимо добавить соответствующий атрибут на чтение.
- Создайте виртуальный атрибут Movie#ogon_rating, который будет высчитывать рейтинг данного фильма в формате Кино Огонь.
- Создайте класс MovieListв файлеlib/movie_list.rb. Конструктор данного класса должен инициализировать переменную экземпляра@moviesпустым массивом.
- Создайте метод MovieList#read_data, который получает в качестве аргумента путь к CSV-файлу, и для каждой корректной записи в исходном файле создаёт экземпляр классаMovie, и добавляет созданный объект к списку фильмов. Используйте этот метод в классеRatingCreator.
- Включите стандартную примесь в класс Movieи реализуйте метод сравнения с другими объектами<=>, который использует атрибутogon_ratingв качестве основы для сравнения. Удостоверьтесь, что методArray#sortпроизводит сортировку списка фильмов по данному атрибуту.
- Создайте метод MovieList#save_sorted_list, который принимает в качестве аргумента путь к CSV-файлу и который сохраняет в данный файл отсортированный список фильмов. В выходном файле должны быть все поля входного файла, а также поле с вычисленным рейтингом. Используйте этот метод в классеRatingCreator.
Использование примеси Enumerable
Документация
- Справочник Ruby по примеси Enumerable
- Понимание методов Enumerable методом реализации их на Ruby
- The Simple Yet Powerful Ruby Enumerable Module
- Recreating Ruby’s Enumerable
Задача
Расширим наше предыдущее приложение, чтобы оно предоставляло больше информации по фильмам. В частности:
- Выводило информацию о фильме с самым большим рейтингом.
- Выводило информацию о фильме с самым маленький рейтингом.
- Выводило нумерованный список фильмов, считанный из изначального файла.
- Выводило средний рейтинг фильмов в формате Кино Огонь.
Предлагаемый подход к решению
- Реализуйте итератор MovieList#each. Данный итератор должен вызывать ассоциированный блок для каждого элемента массива@movies.
- Подключите примесь Enumerableв классMovieList.
- Реализуйте метод Movie#to_s, который будет преобразовывать объект фильма в формат, понятный для конечного пользователя.
- Реализуйте метод RatingCreator#show_min_max, который будет использовать методыMovieList#minиMovieList#maxдля получения фильмов с наименьшим и с наибольшим рейтингом и который будет выводить эту информацию пользователям. Вызовите данный метод в методеRatingCreator#create.
- Реализуйте метод RatingCreator#list_movies, который будет использовать методMovieList#each_with_indexдля получения и отображения пользователю нумерованного списка фильмов. Вызовите данный метод в методеRatingCreator#create.
- Реализуйте метод MovieList#average_ogon_rating, который будет использовать методыMovieList#countиMovieList#reduceдля вычисления среднего значения рейтинга фильмов. Реализуйте методRatingCreator#show_rating, в котором будет использоваться методMovieList#average_ogon_ratingдля вывода соответствующей информации пользователю. Вызовите методRatingCreator#show_ratingв методеRatingCreator#create.