Sha256: 8d025c5fe17fcdd8df0070729cf5b963385caa761e1df298693a1fcb545690f7

Contents?: true

Size: 1007 Bytes

Versions: 2

Compression:

Stored size: 1007 Bytes

Contents

require 'flipper/errors'
require 'flipper/type'
require 'flipper/toggle'
require 'flipper/gate'

module Flipper
  class Feature
    attr_reader :name
    attr_reader :adapter

    def initialize(name, adapter)
      @name = name
      @adapter = adapter
    end

    def enable(thing = Types::Boolean.new)
      gate_for(thing).enable(thing)
    end

    def disable(thing = Types::Boolean.new)
      gate_for(thing).disable(thing)
    end

    def enabled?(actor = nil)
      !! catch(:short_circuit) { gates.detect { |gate| gate.open?(actor) } }
    end

    def disabled?(actor = nil)
      !enabled?(actor)
    end

    private

    def gate_for(thing)
      gates.detect { |gate| gate.protects?(thing) } ||
        raise(GateNotFound.new(thing))
    end

    def gates
      @gates ||= [
        Gates::Boolean.new(self),
        Gates::Group.new(self),
        Gates::Actor.new(self),
        Gates::PercentageOfActors.new(self),
        Gates::PercentageOfRandom.new(self),
      ]
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
flipper-0.1.1 lib/flipper/feature.rb
flipper-0.1.0 lib/flipper/feature.rb