Ruby/Rails дайджест #5: Ruby/Rails Gems для решения типичных задач

Привет! Этот дайджест мы решили посвятить Ruby/Rails Gems, собрав гемы для решения типичных задач: от тестирования до безопасности Rails-приложений. Надеемся, что эти гемы помогут вам сэкономить время и сделать свою работу еще лучше. И если у вас есть идеи насчет дополнения этого списка, добавляйте интересные гемы в комментариях. Всем полезного чтения!

Style Guides

Хороший Ruby/Rails код должен быть читабельным и понятным даже для не-разработчиков. Чтобы достичь такого уровня, Ruby-разработчики следуют лучшим практикам из The Ruby Style Guide и Rails Style Guide.

ActiveRecord

Kaminari ‒ гем, который реализует пагинацию с возможностью гибкой настройки.

ActsAsTaggableOn позволяет добавлять теги к сущностям вашего Rails-приложения.

Гем deep_cloneable добавляет метод к объектам, который заставляет их копировать самих себя. С deep_cloneable вы получаете точную копию объектов, прилагая минимальные усилия.

Гем Paranoia выполняет функцию обратимого удаления (soft delete). После того, как вы вызвали destroy в объекте ActiveRecord, Paranoia не удаляет записи в базе данных. Вместо этого, гем «прячет» объект, таким образом, вы можете восстановить объект позже.

AASM работает с любыми Ruby объектами, включая ActiveRecord. AASM добавляет DSL для управления состояниями моделей.

Гем statesman ‒ альтернатива упомянутому AASM. Интересная особенность гема в том, что он не привязан к объекту, который хранит state (в большинстве случаев AR модель), за счет чего является очень гибким.

PaperTrail позволяет предупредить досадные ситуации, в которых вы не можете отменять (или восстановить) изменения в моделях. С помощью PaperTrail вы можете создавать версии моделей, восстановить данные, и не только.

Globalize используется для мультиязычности в Rails-приложении. Другими словами, Globalize позволяет добавлять переводы на различные языки для данных хранящихся в БД.

ranked-model  ‒ гем для сортировки и изменения позиций данных в таблице.

FriendlyId позволяет создавать красивые (читабельные) URL-адреса и находить по ним нужные ActiveRecord модели.

Ransack используется для реализации поиска по большому числу параметров.

Работа с БД

Sequel — ORM, которая также реализует Active Record паттерн. Имеет уйму плагинов. DSL менее приятный, чем у ActiveRecord, зато быстрее, меньше (или вовсе нету) багов, и, пожалуй, умеет делать больше. На данный момент существуют адаптеры к ADO, Amalgalite, IBM_DB, JDBC, MySQL, Mysql2, ODBC, Oracle, PostgreSQL, SQLAnywhere, SQLite3, и TinyTDS.

Тестирование

RSpec ‒ фреймворк для тестирования. Понятный и простой синтаксис RSpec позволяет писать тесты максимально приближенные к «человеческому» языку.

Database_cleaner позволяет добавить логику очистки базы данных во время выполнения тестов.

Если вы сталкиваетесь с проблемой внешних запросов во время тестов, решить ее можно с помощью гема VCR, который перехватывает все внешние запросы, записывает их в отдельный файл и воспроизводит во время тестов.

Гем factory_girl предоставляет DSL для генерации массивов данных для заполнения моделей, используется для создания тестовых данных.

Гем Faker генерирует фейковые данные (номера телефонов, email, имена пользователей).

Capybara помогает тестировать веб-приложения, симулируя взаимодействие пользователя с приложением (например, переходы по ссылкам, заполнение форм, наличие элементов на странице).

Shoulda_matchers позволяет ускорить написание тестов для типичного функционал Rails.

Полезный гем simplecov показывает процент кода, покрытый unit-тестами. Таким образом, simplecov стимулирует разработчиков стремиться к 100% протестированному коду, что не может не отразиться на его качестве.

Гем fabrication ‒ альтернатива factory_girl. Довольно гибкий гем без зависимости от Ruby on Rails.

site_prism реализует Page Object Model DSL для Capybara и пригодится для feature specs совместно с Capybara.

Оформление кода (coding style)

Гем rails_best_practices анализирует код на наличие code smells («код с душком»). Гем предлагает, как можно улучшить ваш код.

RuboCop не оставляет шанса для нарушений оформления кода, сообщая о них сразу в командной строке.

Гем RubyCritic помогает находить code smells. Каждый файл получает рейтинг от «A» до «F». Стремиться надо к отметке «A».

Дебаггинг

Стандартная страница ошибки в Rails довольно простая, поэтому разработчики предпочитают использовать альтернативные инструменты, например, Better Erros.

Pry-byebug создан для пошаговой отладки с помощью точек остановки.

Letter Opener создан для просмотра e-mail’ов прямо во вкладке браузера вместо их отправки. Таким образом, вам не нужно настраивать отправку email’ов в среде разработки и больше не надо беспокоиться о случайной отправке тестового письма неправильному адресату.

Аутентификация и авторизация

Пожалуй, нет такого Ruby-разработчика, который не слышал про гем Devise. Devise помогает построить аутентификацию любой сложности ‒ от аутентификации с помощью email и пароля до системы с приглашениями и т. д.

DeviseInvitable ‒ расширение для гема Devise. DeviseInvitable добавляет функционал рассылки приглашений через email (например, при реализации реферальных программ).

Вход на сайт с помощью аккаунтов таких социальных сетей, как Facebook или Google ‒ обычная практика. OmniAuth ‒ библиотека, которая позволяет создавать провайдеры для аутентификации через социальные сети. Имеет большой список готовых провайдеров.

Rolify‒ полезная библиотека, которая позволяет вам создавать и управлять user roles.

Гем CanCanCan используется для авторизации пользователей в Rails-приложении.

Pundit — хорошая альтернатива CanCanCan.

API

ActiveModelSerializers генерирует JSON в Rails-приложении.

Apipie-rails ‒ DSL для документирования RESTful API. Apipie буквально описывает код с помощью кода, что довольно удобно для программистов

Безопасность

Brakeman ‒ статический сканнер безопасности, который обнаруживает уязвимости в Rails-приложении.

bundler-audit проверят ваш gemfile.lock на наличие уязвимых версий гемов и не позволяет установку ненадежных гемов.

Гем Secure Headers применяет безопасные HTTP заголовки к ответам Rails-приложений. Secure Headers помогает применять такие заголовки, как CSP, чтобы предотвратить межсайтовый скриптинг и атаки на страницы со смешанным содержимым.

Платежи

Active Merchant предлагает централизованный API для интеграции с множеством популярных платежных систем. Библиотека активно поддерживается своими создателями ‒ ecommerce-платформой Shopify.

Braintree Ruby ‒ гем для интеграции Braintree.

Stripe Ruby Bindings интегрирует платежную систему Stripe.

Развертывание приложений

Puma и Unicorn являются популярными веб-серверами для Ruby/Rack.

Capistrano ‒ фреймворк для написания задач, связанных с автоматизацией развертывания приложений.

Загрузка файлов

CarrierWave ‒ гем для загрузки файлов в Ruby-приложениях.

Minimagick ‒ обертка к консольным утилитам ImageMagick или Graphics Magick.

Для загрузки файлов на внешние сервера, такие как Amazon S3 или Google Cloud Storage, используйте гем Fog, который работает с множеством облачных сервисов, включая AWS, Rackpace Servers и Brightbox.

Shrine ‒ инструмент для загрузки, процессинга, стриминга и аттачмента файлов. Shrine также дружит с различными ORM — Sequel, ActiveRecord, ROM.

Отложенные задачи

Sidekiq используется для отложенных задач и впечатляет разработчиков своей скоростью. Среди его преимуществ ‒ удобный мониторинг статуса выполнения отложенных задач и возможность выполнять параллельные задачи.

Resque ‒ инструмент для управления фоновыми задачами, похожий на Sidekiq. Тем не менее, Resque и Sidekiq работают по-разному. Resque использует только однопоточные процессы, в то время, как Sidekiq управляет многопоточными процессами. Таким образом, Resque требуется больше RAM.

Sucker Punch ‒ еще одна библиотека для выполнения фоновых задач, которая не требует никаких зависимостей (к примеру, Sidekiq нужен Redis). Sucker Punch эффективен во время работы над небольшими задачами вроде логов или имейлов, как заявляют на GitHub.

Полнотекстовый Поиск

Elasticsearch ‒ популярная поисковая система для энтерпрайзов. Гем Elasticsearch интегрирует поисковик в Rails-приложение.

Гем Thinking Sphinx интегрирует в ActiveRecord инструмент для полнотекстового поиска Sphinx.

Используйте PgSearch для интеграции полнотекстового поиска в PostgreSQL.

Переменные окружения

Dotenv загружает переменные окружения из дотфайла, который может быть расположен вне корневой папки вашего проекта. Таким образом, Dotenv помогает вам безопасно хранить конфигурационные данные вашего приложения.

Панель администратора

Active Admin и Rails Admin ‒ популярные инструменты панели администратора, или же «админки». Оба инструмента предлагают коробочное решение для управления данными, кастомизированный поиск и фильтрацию.

Administrate предлагает админ-дашборды, которые легко настроить даже новичкам ‒ в этом и есть преимущество Administrate над RailsAdmin и Active Admin.

View Helper

Draper ‒ это гем-декоратор, который добавляет объектно-ориентированное представление вашему веб-приложению.

Simple Form помогает создавать формы для Rails-приложения и быстро добавлять такие элементы форм, как dropdown списки, чекбоксы и радио-кнопки.

Следуйте лучшим SEO практикам с гемом MetaTags, который добавляет в Rails-приложение мета-тэги.

Money реализует конверсию валют, денежные величины и другие операции с классом Money. Money-Rails реализует интеграцию гема Money с Rails.

Инструменты

Whisper ‒ микро-библиотека, которая предоставляет возможности Publish/Subscribe для Ruby-объектов.

Representable ‒ гем для сериализии и десериализации объектов, у которого нет зависимости от Ruby on Rails.

Гем statesman ‒ альтернатива упомянутому AASM. Интересная особенность гема в том, что он не привязан к объекту, который хранит state (в большинстве случаев AR модель), за счет чего является очень гибким.

Time_math2 ‒ гем для работы с временем и написан нашим соотечественником из Харькова. Можно использовать, например, в ситуациях, когда надо прибавить к текущей дате два месяца или посчитать количество дней между двумя датами. Примечателен тем, что не использует monkey patch и внешних зависимостей.


Касательно тем/материалов/ивентов, которые стоит добавить в следующий выпуск дайджеста, пишите в комментариях или на volodymyr.vorobiov@rubygarage.org. Спасибо за помощь в подготовке дайджеста команде RubyGarage и контрибьюторам: Danny Ocean и Voloshin Ruslan.


← Предыдущий выпуск: Ruby дайджест #4

LinkedIn

11 комментариев

Подписаться на комментарииОтписаться от комментариев Комментарии могут оставлять только пользователи с подтвержденными аккаунтами.

Same old, same old... А как на счет более свежих и интересных гемов вроде dry-validation или shrine? В том числе гемов, которые не имеют зависимости на rails или AS/AR, вроде statesman или sequel? :)

надо было с чего то начинать, будем постепенно дополнять, кидайте все предложения в комментарии, раз в неделю планируем обновлять статью

Нижеизложенные гемы в подбирались таким образом, что бы у них не было зависимости на рельсы и/или ActiveRecord, ActiveSupport. А так же как можно меньше манки патчили core ruby classes.

Shrine — альтернативное решение по загрузке, процессингу, стримингу и аттачменту файлов. Имеет кучу плагинов и дружит с различными ORM — Sequel, ActiveRecord, ROM.

Sequel — ORM, которая так же реализует Active Record паттерн. Имеет уйму плагинов, и некоторые крутые штуки. DSL менее приятный чем у ActiveRecord, зато быстрее, меньше (или вовсе нету) багов, и, пожалуй, умеет делать больше.

dry-struct + dry-types — альетрнатива virtus. Пригодится, если вы любите выносить логику в PORO сервисы, или выносить логику из модели в обьекты-декораторы. Порекомендовал бы Virtus, но он уже несколько лет не поддерживается.

dry-validation — гем для валидаций общего назначения. Интересная альтернатива ActiveModel validaitons и/или strong_parameters. Автор утверждает, что она в несколько раз быстрее ActiveModel. Не имеет зависимости на рельсы и может быть использована в любом месте.

statesman — альтернатива упомянутому AASM и прочим стейт машинам. Оказывается найти приличный гем без зависимости на рельсы или AR/AS не так уж просто — был очень рад его обнаружить. Интерсная особенность в том, что гем не привязан к обьекту, который хранит стейт (в большинстве случаев AR модель), за счет чего является очень гибким.

Для тестирования я бы порекомендовал следующие гемы:

fabrication — альтернатива factory_girl. Довольно гибкий, и нету зависимости на рельсы.

site_prism — очень пригодится для feature спек совместно с capybara. Реализует Page Object Model паттерн, что позволяет реюзать страницу между спеками.

Not so common gems:

wisper — гибкий и тред-сейфовый гем для подписки/вещания ивентов.

representable — сереализия и десеарелизация обьектов. Существует множество альетрнатив, но у этого нету зависимости на рельсы.

Рекомендую обратить внимание на trailbalzer-operations — абстракция для вынесения бизнес логики. Можно обходиться и с помощью PORO сервисов, конечно, но гем правда интересный. Оригинальная идея — pipetree :)

dry-matcher — этакий паттерн матчинг для руби. Получаются красивые конструкции для обработки, напримерм, результатов сервиса. Хорош в связке с dry-monads.

time_math2 — гем для работы с временем. Например прибавить к текущей дате 2а месяца или посчитать кол-во дней между двумя датами. Примечателен тем, что не использует monkey patch и нету внешних зависимостей. Написан, кстати, нашим соотечественником из Харькова :)

client_side_validations — этот гем создан под рельсы. Но мне очень нравится его идея в определении валидаций в одном месте. С рельсами работает следующим образом — вы пишете валидации в модели, и все эти валидации вы вольны применить прямо к формам, которые используют эту модель. Поддерживает сторонние форм-билдеры и формы с nested childs.

Думаю, что так же стоит добавить гемы по работе с пдф файлами

Супер! Спасибо за полезный список, понедельник-вторник внесем гемы и Вас в список контрибютеров в статью :)

Спасибо! Рад помочь нашему коммьюнити :)

gem ’localeapp’
gem ’exception_notification’

Sucker Punch ‒ еще одна библиотека для выполнения фоновых задач, которая не требует никаких зависимостей (к примеру, Sidekiq нужен Redis). Sidekiq эффективен во время работы над небольшими задачами вроде логов или имейлов, как заявляют на GitHub.
Тут явно описка «Sidekiq эффективен во время работы...»?

Сергей, извините, но я не очень понимаю что вы хотите сказать, давайте еще раз и по подробнее

На сколько я понимаю, в предложении речь идет об «Sucker Punch», а не о «Sidekiq»?! т/е должно быть:

Sucker Punch эффективен во время работы над небольшими задачами вроде логов или имейлов, как заявляют на GitHub.
:-)

Сергей, ты прав, спасибо, поправил

Спасибо большое. Хоть с большей часть знаком и близко, но все равно интересный обзор.

Подписаться на комментарии