Skip to content

Начало работы с Featury

Соглашения

  • Все классы фичей являются подклассами Featury::Base и располагаются в директории app/features. Рекомендуется создать ApplicationFeature::Base как базовый класс для фичей проекта.
  • Используйте пространства имён, совпадающие с именами моделей, а класс называйте существительным, описывающим процесс. Используйте форму существительного: RegistrationFeature, а не RegisterFeature. Пример: User::RegistrationFeature, Order::FulfillmentFeature.

Поддержка версий

Ruby/Rails8.18.07.27.17.06.16.05.25.15.0
4.0
3.4
3.3
3.2
3.1

Установка

Добавьте это в файл Gemfile:

ruby
gem "featury"

Затем выполните:

shell
bundle install

Подготовка

Для начала рекомендуется подготовить базовый класс для дальнейшего наследования. Этот базовый класс должен внутри себя содержать действия с интеграцией инструмента для фичей в проекте. Например, это может быть модель ActiveRecord, Flipper или что-нибудь другое.

Модель ActiveRecord

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

ruby
module ApplicationFeature
  class Base < Featury::Base
    action :enabled? do |features:, **options|
      features.all? do |feature|
        FeatureFlag
          .find_or_create_by!(code: feature, actor: options[:user])
          .enabled?
      end
    end

    action :disabled? do |features:, **options|
      features.any? do |feature|
        !FeatureFlag
          .find_or_create_by!(code: feature, actor: options[:user])
          .enabled?
      end
    end

    action :enable do |features:, **options|
      features.all? do |feature|
        FeatureFlag
          .find_or_create_by!(code: feature, actor: options[:user])
          .update!(enabled: true)
      end
    end

    action :disable do |features:, **options|
      features.all? do |feature|
        FeatureFlag
          .find_or_create_by!(code: feature, actor: options[:user])
          .update!(enabled: false)
      end
    end

    before do |action:, features:|
      Slack::API::Notify.call!(action:, features:)
    end

    after :enabled?, :disabled? do |action:, features:|
      Slack::API::Notify.call!(action:, features:)
    end
  end
end