Использование примеси 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

Аргументы, переданные Ruby-приложению, содержатся в массиве, доступном в переменной ARGV. Данный массив содержит строки, которые были переданы приложению. Для контроля за количеством аргументов можно воспользоваться методом #size. Для проверки существования файла, который был передан в качестве аргумента можно воспользоваться методом File::exist?.

Если вы хотите обрабатывать аргументы в более структурированном формате, то лучше воспользоваться одной из стандартных библиотек: optparse или getoptlong. Первая представляет собою современную систему описания аргументов, а вторая предоставляет реализацию подхода к обработке аргументов из стандартной библиотеки проекта GNU для языка Си.

Требования к реализации

  • Структура приложения должна совпадать со стандартной структурой джема.
  • В приложении должны быть выделены классы предметной логики: фильм (Movie) и список фильмов (MovieList).
  • В приложении должен быть класс, который ответственен за выполнение операций приложения (RatingCreator).
  • Исходный код приложения должен быть проверен с помощью Rubocop и всего его замечания должны быть исправлены.
  • Все зависимости приложения должны быть описаны с помощью Bundler.

Предлагаемый подход к реализации

  1. Создайте каталог с приложением и разместите в нём подкаталоги bin, lib, data.
  2. Создайте файл data/input.csv и заполните его информацией, представленной на странице.
  3. Создайте файл lib/raiting_creator.rb и добавьте в него класс RatingCreator с пустым методом create.
  4. Создайте файл bin/create_rating.rb, подключите в нём файл rating_creator.rb, создайте экземпляр класса RatingCreator и вызовите метод create. Никаких других действий в данном файле выполнять нельзя.
  5. В методе RatingCreator#create реализуйте обработку списка аргументов.
    • Проверьте, что были переданы все аргументы.
    • Проверьте, что первый аргумент ссылается на существующий CSV-файл.
    • Если аргументов недостаточно или они некорректны приложение должно выводить сообщение пользователю и завершать свою работу.
  6. Создайте класс Movie в файле lib/movie.rb. Конструктор данного класса должен принимать 5 аргументов: название и 4 рейтинга. Для каждого параметра необходимо добавить соответствующий атрибут на чтение.
  7. Создайте виртуальный атрибут Movie#ogon_rating, который будет высчитывать рейтинг данного фильма в формате Кино Огонь.
  8. Создайте класс MovieList в файле lib/movie_list.rb. Конструктор данного класса должен инициализировать переменную экземпляра @movies пустым массивом.
  9. Создайте метод MovieList#read_data, который получает в качестве аргумента путь к CSV-файлу, и для каждой корректной записи в исходном файле создаёт экземпляр класса Movie, и добавляет созданный объект к списку фильмов. Используйте этот метод в классе RatingCreator.
  10. Включите стандартную примесь в класс Movie и реализуйте метод сравнения с другими объектами <=>, который использует атрибут ogon_rating в качестве основы для сравнения. Удостоверьтесь, что метод Array#sort производит сортировку списка фильмов по данному атрибуту.
  11. Создайте метод MovieList#save_sorted_list, который принимает в качестве аргумента путь к CSV-файлу и который сохраняет в данный файл отсортированный список фильмов. В выходном файле должны быть все поля входного файла, а также поле с вычисленным рейтингом. Используйте этот метод в классе RatingCreator.

Использование примеси Enumerable

Документация

Задача

Расширим наше предыдущее приложение, чтобы оно предоставляло больше информации по фильмам. В частности:

  • Выводило информацию о фильме с самым большим рейтингом.
  • Выводило информацию о фильме с самым маленький рейтингом.
  • Выводило нумерованный список фильмов, считанный из изначального файла.
  • Выводило средний рейтинг фильмов в формате Кино Огонь.

Предлагаемый подход к решению

  1. Реализуйте итератор MovieList#each. Данный итератор должен вызывать ассоциированный блок для каждого элемента массива @movies.
  2. Подключите примесь Enumerable в класс MovieList.
  3. Реализуйте метод Movie#to_s, который будет преобразовывать объект фильма в формат, понятный для конечного пользователя.
  4. Реализуйте метод RatingCreator#show_min_max, который будет использовать методы MovieList#min и MovieList#max для получения фильмов с наименьшим и с наибольшим рейтингом и который будет выводить эту информацию пользователям. Вызовите данный метод в методе RatingCreator#create.
  5. Реализуйте метод RatingCreator#list_movies, который будет использовать метод MovieList#each_with_index для получения и отображения пользователю нумерованного списка фильмов. Вызовите данный метод в методе RatingCreator#create.
  6. Реализуйте метод MovieList#average_ogon_rating, который будет использовать методы MovieList#count и MovieList#reduce для вычисления среднего значения рейтинга фильмов. Реализуйте метод RatingCreator#show_rating, в котором будет использоваться метод MovieList#average_ogon_rating для вывода соответствующей информации пользователю. Вызовите метод RatingCreator#show_rating в методе RatingCreator#create.