class Flipper::Feature
rubocop:disable Metrics/ClassLength
Constants
- InstrumentationName
Private: The name of feature instrumentation events.
Attributes
Private: The adapter this feature should use.
Private: What is being used to instrument all the things.
Public: Name converted to value safe for adapter.
Public: The name of the feature.
Public Class Methods
Internal: Initializes a new feature instance.
name - The Symbol or String name of the feature. adapter - The adapter that will be used to store details about this feature.
options - The Hash of options.
:instrumenter - What to use to instrument all the things.
# File lib/flipper/feature.rb, line 34 def initialize(name, adapter, options = {}) @name = name @key = name.to_s @instrumenter = options.fetch(:instrumenter, Instrumenters::Noop) @adapter = adapter end
Public Instance Methods
Public: Get the adapter value for the actors gate.
Returns Set of String flipper_id's.
# File lib/flipper/feature.rb, line 258 def actors_value gate_values.actors end
Public: Adds this feature.
Returns the result of Adapter#add.
# File lib/flipper/feature.rb, line 76 def add instrument(:add) { adapter.add(self) } end
Public: Get the adapter value for the boolean gate.
Returns true or false.
# File lib/flipper/feature.rb, line 265 def boolean_value gate_values.boolean end
Public: Clears all gate values for this feature.
Returns the result of Adapter#clear.
# File lib/flipper/feature.rb, line 90 def clear instrument(:clear) { adapter.clear(self) } end
Public: Is the feature conditionally enabled for a given actor, group, percentage of actors or percentage of the time.
# File lib/flipper/feature.rb, line 224 def conditional? state == :conditional end
Public: Disable this feature for something.
Returns the result of Adapter#disable.
# File lib/flipper/feature.rb, line 60 def disable(thing = false) instrument(:disable) do |payload| adapter.add self gate = gate_for(thing) wrapped_thing = gate.wrap(thing) payload[:gate_name] = gate.name payload[:thing] = wrapped_thing adapter.disable self, gate, wrapped_thing end end
Public: Disables a feature for an actor.
actor - a Flipper::Types::Actor instance or an object that responds
to flipper_id.
Returns result of disable.
# File lib/flipper/feature.rb, line 163 def disable_actor(actor) disable Types::Actor.wrap(actor) end
Public: Disables a feature for a group.
group - a Flipper::Types::Group instance or a String or Symbol name of a
registered group.
Returns result of disable.
# File lib/flipper/feature.rb, line 173 def disable_group(group) disable Types::Group.wrap(group) end
Public: Disables a feature for a percentage of actors.
percentage - a Flipper::Types::PercentageOfTime instance or an object that
responds to to_i.
Returns result of disable.
# File lib/flipper/feature.rb, line 193 def disable_percentage_of_actors disable Types::PercentageOfActors.new(0) end
Public: Disables a feature a percentage of time.
percentage - a Flipper::Types::PercentageOfTime instance or an object that
responds to to_i.
Returns result of disable.
# File lib/flipper/feature.rb, line 183 def disable_percentage_of_time disable Types::PercentageOfTime.new(0) end
Public: Get the names of the disabled gates.
Returns an Array of gate names.
# File lib/flipper/feature.rb, line 308 def disabled_gate_names disabled_gates.map(&:name) end
Public: Get the gates that have not been enabled for the feature.
Returns an Array of Flipper::Gate instances.
# File lib/flipper/feature.rb, line 301 def disabled_gates gates - enabled_gates end
Public: Get groups not enabled for this feature.
Returns Set of Flipper::Types::Group instances.
# File lib/flipper/feature.rb, line 244 def disabled_groups Flipper.groups - enabled_groups end
Public: Enable this feature for something.
Returns the result of Adapter#enable.
# File lib/flipper/feature.rb, line 44 def enable(thing = true) instrument(:enable) do |payload| adapter.add self gate = gate_for(thing) wrapped_thing = gate.wrap(thing) payload[:gate_name] = gate.name payload[:thing] = wrapped_thing adapter.enable self, gate, wrapped_thing end end
Public: Enables a feature for an actor.
actor - a Flipper::Types::Actor instance or an object that responds
to flipper_id.
Returns result of enable.
# File lib/flipper/feature.rb, line 123 def enable_actor(actor) enable Types::Actor.wrap(actor) end
Public: Enables a feature for a group.
group - a Flipper::Types::Group instance or a String or Symbol name of a
registered group.
Returns result of enable.
# File lib/flipper/feature.rb, line 133 def enable_group(group) enable Types::Group.wrap(group) end
Public: Enables a feature for a percentage of actors.
percentage - a Flipper::Types::PercentageOfTime instance or an object that
responds to to_i.
Returns result of enable.
# File lib/flipper/feature.rb, line 153 def enable_percentage_of_actors(percentage) enable Types::PercentageOfActors.wrap(percentage) end
Public: Enables a feature a percentage of time.
percentage - a Flipper::Types::PercentageOfTime instance or an object that
responds to to_i.
Returns result of enable.
# File lib/flipper/feature.rb, line 143 def enable_percentage_of_time(percentage) enable Types::PercentageOfTime.wrap(percentage) end
Public: Check if a feature is enabled for a thing.
Returns true if enabled, false if not.
# File lib/flipper/feature.rb, line 97 def enabled?(thing = nil) instrument(:enabled?) do |payload| values = gate_values thing = gate(:actor).wrap(thing) unless thing.nil? payload[:thing] = thing context = FeatureCheckContext.new( feature_name: @name, values: values, thing: thing ) if open_gate = gates.detect { |gate| gate.open?(context) } payload[:gate_name] = open_gate.name true else false end end end
Public: Get the names of the enabled gates.
Returns an Array of gate names.
# File lib/flipper/feature.rb, line 294 def enabled_gate_names enabled_gates.map(&:name) end
Public: Get the gates that have been enabled for the feature.
Returns an Array of Flipper::Gate instances.
# File lib/flipper/feature.rb, line 286 def enabled_gates values = gate_values gates.select { |gate| gate.enabled?(values[gate.key]) } end
Public: Get groups enabled for this feature.
Returns Set of Flipper::Types::Group instances.
# File lib/flipper/feature.rb, line 236 def enabled_groups groups_value.map { |name| Flipper.group(name) }.to_set end
Public: Find a gate by name.
Returns a Flipper::Gate if found, nil if not.
# File lib/flipper/feature.rb, line 349 def gate(name) gates.detect { |gate| gate.name == name.to_sym } end
Public: Find the gate that protects a thing.
thing - The object for which you would like to find a gate
Returns a Flipper::Gate. Raises Flipper::GateNotFound if no gate found for thing
# File lib/flipper/feature.rb, line 359 def gate_for(thing) gates.detect { |gate| gate.protects?(thing) } || raise(GateNotFound, thing) end
Public: Returns the raw gate values stored by the adapter.
# File lib/flipper/feature.rb, line 229 def gate_values GateValues.new(adapter.get(self)) end
Public: Get all the gates used to determine enabled/disabled for the feature.
Returns an array of gates
# File lib/flipper/feature.rb, line 336 def gates @gates ||= [ Gates::Boolean.new, Gates::Group.new, Gates::Actor.new, Gates::PercentageOfActors.new, Gates::PercentageOfTime.new, ] end
Public: Get the adapter value for the groups gate.
Returns Set of String group names.
# File lib/flipper/feature.rb, line 251 def groups_value gate_values.groups end
Public: Pretty string version for debugging.
# File lib/flipper/feature.rb, line 323 def inspect attributes = [ "name=#{name.inspect}", "state=#{state.inspect}", "enabled_gate_names=#{enabled_gate_names.inspect}", "adapter=#{adapter.name.inspect}", ] "#<#{self.class.name}:#{object_id} #{attributes.join(', ')}>" end
Public: Is the feature fully disabled.
# File lib/flipper/feature.rb, line 218 def off? state == :off end
Public: Is the feature fully enabled.
# File lib/flipper/feature.rb, line 213 def on? state == :on end
Public: Get the adapter value for the percentage of actors gate.
Returns Integer greater than or equal to 0 and less than or equal to 100.
# File lib/flipper/feature.rb, line 272 def percentage_of_actors_value gate_values.percentage_of_actors end
Public: Get the adapter value for the percentage of time gate.
Returns Integer greater than or equal to 0 and less than or equal to 100.
# File lib/flipper/feature.rb, line 279 def percentage_of_time_value gate_values.percentage_of_time end
Public: Removes this feature.
Returns the result of Adapter#remove.
# File lib/flipper/feature.rb, line 83 def remove instrument(:remove) { adapter.remove(self) } end
Public: Returns state for feature (:on, :off, or :conditional).
# File lib/flipper/feature.rb, line 198 def state values = gate_values boolean = gate(:boolean) non_boolean_gates = gates - [boolean] if values.boolean || values.percentage_of_actors == 100 || values.percentage_of_time == 100 :on elsif non_boolean_gates.detect { |gate| gate.enabled?(values[gate.key]) } :conditional else :off end end
Public: Identifier to be used in the url (a rails-ism).
# File lib/flipper/feature.rb, line 318 def to_param to_s end
Public: Returns the string representation of the feature.
# File lib/flipper/feature.rb, line 313 def to_s name.to_s end
Private Instance Methods
Private: Instrument a feature operation.
# File lib/flipper/feature.rb, line 366 def instrument(operation) @instrumenter.instrument(InstrumentationName) do |payload| payload[:feature_name] = name payload[:operation] = operation payload[:result] = yield(payload) if block_given? end end