Sha256: 1b12878a6e1b8eaf0527de535f43f89d8571f604b073c51a3b5d67f111d382dd

Contents?: true

Size: 1.33 KB

Versions: 4

Compression:

Stored size: 1.33 KB

Contents

module Flipflop
  module Strategies
    class SequelStrategy < AbstractStrategy
      class << self
        def default_description
          "Stores features in database. Applies to all users."
        end

        def define_feature_class
          return Flipflop::Feature if defined?(Flipflop::Feature)

          model = Class.new(Sequel::Model(:flipflop_features))
          model.plugin(:timestamps, force: true, update_on_create: true)
          model.raise_on_save_failure = true

          Flipflop.const_set(:Feature, model)
        end
      end

      def initialize(**options)
        @class = options.delete(:class) || self.class.define_feature_class
        if !@class.kind_of?(Class)
          @class = ActiveSupport::Inflector.constantize(@class.to_s)
        end
        super(**options)
      end

      def switchable?
        true
      end

      def enabled?(feature)
        find(feature).try(:enabled?)
      end

      def switch!(feature, enabled)
        record = find_or_new(feature)
        record.enabled = enabled
        record.save
      end

      def clear!(feature)
        find(feature).try(:destroy)
      end

      protected

      def find_or_new(feature)
        find(feature) || @class.new(key: feature.to_s)
      end

      def find(feature)
        @class.where(key: feature.to_s).first
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
flipflop-2.7.1 lib/flipflop/strategies/sequel_strategy.rb
flipflop-2.7.0 lib/flipflop/strategies/sequel_strategy.rb
flipflop-2.6.0 lib/flipflop/strategies/sequel_strategy.rb
flipflop-2.5.0 lib/flipflop/strategies/sequel_strategy.rb