Использование стандартных примесей
Использование примеси 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
.