Class: Flipper::Feature
- Inherits:
-
Object
- Object
- Flipper::Feature
- Defined in:
- lib/flipper/feature.rb
Overview
rubocop:disable Metrics/ClassLength
Constant Summary collapse
- InstrumentationName =
Private: The name of feature instrumentation events.
"feature_operation.#{InstrumentationNamespace}".freeze
Instance Attribute Summary collapse
-
#adapter ⇒ Object
readonly
Private: The adapter this feature should use.
-
#instrumenter ⇒ Object
readonly
Private: What is being used to instrument all the things.
-
#key ⇒ Object
readonly
Public: Name converted to value safe for adapter.
-
#name ⇒ Object
readonly
Public: The name of the feature.
Instance Method Summary collapse
-
#actors_value ⇒ Object
Public: Get the adapter value for the actors gate.
-
#add ⇒ Object
Public: Adds this feature.
-
#boolean_value ⇒ Object
Public: Get the adapter value for the boolean gate.
-
#clear ⇒ Object
Public: Clears all gate values for this feature.
-
#conditional? ⇒ Boolean
Public: Is the feature conditionally enabled for a given actor, group, percentage of actors or percentage of the time.
-
#disable(thing = false) ⇒ Object
Public: Disable this feature for something.
-
#disable_actor(actor) ⇒ Object
Public: Disables a feature for an actor.
-
#disable_group(group) ⇒ Object
Public: Disables a feature for a group.
-
#disable_percentage_of_actors ⇒ Object
Public: Disables a feature for a percentage of actors.
-
#disable_percentage_of_time ⇒ Object
Public: Disables a feature a percentage of time.
-
#disabled_gate_names ⇒ Object
Public: Get the names of the disabled gates.
-
#disabled_gates ⇒ Object
Public: Get the gates that have not been enabled for the feature.
-
#disabled_groups ⇒ Object
Public: Get groups not enabled for this feature.
-
#enable(thing = true) ⇒ Object
Public: Enable this feature for something.
-
#enable_actor(actor) ⇒ Object
Public: Enables a feature for an actor.
-
#enable_group(group) ⇒ Object
Public: Enables a feature for a group.
-
#enable_percentage_of_actors(percentage) ⇒ Object
Public: Enables a feature for a percentage of actors.
-
#enable_percentage_of_time(percentage) ⇒ Object
Public: Enables a feature a percentage of time.
-
#enabled?(thing = nil) ⇒ Boolean
Public: Check if a feature is enabled for a thing.
-
#enabled_gate_names ⇒ Object
Public: Get the names of the enabled gates.
-
#enabled_gates ⇒ Object
Public: Get the gates that have been enabled for the feature.
-
#enabled_groups ⇒ Object
(also: #groups)
Public: Get groups enabled for this feature.
-
#gate(name) ⇒ Object
Public: Find a gate by name.
-
#gate_for(thing) ⇒ Object
Public: Find the gate that protects a thing.
-
#gate_values ⇒ Object
Public: Returns the raw gate values stored by the adapter.
-
#gates ⇒ Object
Public: Get all the gates used to determine enabled/disabled for the feature.
-
#groups_value ⇒ Object
Public: Get the adapter value for the groups gate.
-
#initialize(name, adapter, options = {}) ⇒ Feature
constructor
Internal: Initializes a new feature instance.
-
#inspect ⇒ Object
Public: Pretty string version for debugging.
-
#off? ⇒ Boolean
Public: Is the feature fully disabled.
-
#on? ⇒ Boolean
Public: Is the feature fully enabled.
-
#percentage_of_actors_value ⇒ Object
Public: Get the adapter value for the percentage of actors gate.
-
#percentage_of_time_value ⇒ Object
Public: Get the adapter value for the percentage of time gate.
-
#remove ⇒ Object
Public: Removes this feature.
-
#state ⇒ Object
Public: Returns state for feature (:on, :off, or :conditional).
-
#to_param ⇒ Object
Public: Identifier to be used in the url (a rails-ism).
-
#to_s ⇒ Object
Public: Returns the string representation of the feature.
Constructor Details
#initialize(name, adapter, options = {}) ⇒ Feature
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.
34 35 36 37 38 39 |
# File 'lib/flipper/feature.rb', line 34 def initialize(name, adapter, = {}) @name = name @key = name.to_s @instrumenter = .fetch(:instrumenter, Instrumenters::Noop) @adapter = adapter end |
Instance Attribute Details
#adapter ⇒ Object (readonly)
Private: The adapter this feature should use.
21 22 23 |
# File 'lib/flipper/feature.rb', line 21 def adapter @adapter end |
#instrumenter ⇒ Object (readonly)
Private: What is being used to instrument all the things.
24 25 26 |
# File 'lib/flipper/feature.rb', line 24 def instrumenter @instrumenter end |
#key ⇒ Object (readonly)
Public: Name converted to value safe for adapter.
18 19 20 |
# File 'lib/flipper/feature.rb', line 18 def key @key end |
#name ⇒ Object (readonly)
Public: The name of the feature.
15 16 17 |
# File 'lib/flipper/feature.rb', line 15 def name @name end |
Instance Method Details
#actors_value ⇒ Object
Public: Get the adapter value for the actors gate.
Returns Set of String flipper_id’s.
258 259 260 |
# File 'lib/flipper/feature.rb', line 258 def actors_value gate_values.actors end |
#add ⇒ Object
Public: Adds this feature.
Returns the result of Adapter#add.
76 77 78 |
# File 'lib/flipper/feature.rb', line 76 def add instrument(:add) { adapter.add(self) } end |
#boolean_value ⇒ Object
Public: Get the adapter value for the boolean gate.
Returns true or false.
265 266 267 |
# File 'lib/flipper/feature.rb', line 265 def boolean_value gate_values.boolean end |
#clear ⇒ Object
Public: Clears all gate values for this feature.
Returns the result of Adapter#clear.
90 91 92 |
# File 'lib/flipper/feature.rb', line 90 def clear instrument(:clear) { adapter.clear(self) } end |
#conditional? ⇒ Boolean
Public: Is the feature conditionally enabled for a given actor, group, percentage of actors or percentage of the time.
224 225 226 |
# File 'lib/flipper/feature.rb', line 224 def conditional? state == :conditional end |
#disable(thing = false) ⇒ Object
Public: Disable this feature for something.
Returns the result of Adapter#disable.
60 61 62 63 64 65 66 67 68 69 70 71 |
# 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 |
#disable_actor(actor) ⇒ Object
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.
163 164 165 |
# File 'lib/flipper/feature.rb', line 163 def disable_actor(actor) disable Types::Actor.wrap(actor) end |
#disable_group(group) ⇒ Object
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.
173 174 175 |
# File 'lib/flipper/feature.rb', line 173 def disable_group(group) disable Types::Group.wrap(group) end |
#disable_percentage_of_actors ⇒ Object
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.
193 194 195 |
# File 'lib/flipper/feature.rb', line 193 def disable_percentage_of_actors disable Types::PercentageOfActors.new(0) end |
#disable_percentage_of_time ⇒ Object
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.
183 184 185 |
# File 'lib/flipper/feature.rb', line 183 def disable_percentage_of_time disable Types::PercentageOfTime.new(0) end |
#disabled_gate_names ⇒ Object
Public: Get the names of the disabled gates.
Returns an Array of gate names.
308 309 310 |
# File 'lib/flipper/feature.rb', line 308 def disabled_gate_names disabled_gates.map(&:name) end |
#disabled_gates ⇒ Object
Public: Get the gates that have not been enabled for the feature.
Returns an Array of Flipper::Gate instances.
301 302 303 |
# File 'lib/flipper/feature.rb', line 301 def disabled_gates gates - enabled_gates end |
#disabled_groups ⇒ Object
Public: Get groups not enabled for this feature.
Returns Set of Flipper::Types::Group instances.
244 245 246 |
# File 'lib/flipper/feature.rb', line 244 def disabled_groups Flipper.groups - enabled_groups end |
#enable(thing = true) ⇒ Object
Public: Enable this feature for something.
Returns the result of Adapter#enable.
44 45 46 47 48 49 50 51 52 53 54 55 |
# 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 |
#enable_actor(actor) ⇒ Object
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.
123 124 125 |
# File 'lib/flipper/feature.rb', line 123 def enable_actor(actor) enable Types::Actor.wrap(actor) end |
#enable_group(group) ⇒ Object
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.
133 134 135 |
# File 'lib/flipper/feature.rb', line 133 def enable_group(group) enable Types::Group.wrap(group) end |
#enable_percentage_of_actors(percentage) ⇒ Object
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.
153 154 155 |
# File 'lib/flipper/feature.rb', line 153 def enable_percentage_of_actors(percentage) enable Types::PercentageOfActors.wrap(percentage) end |
#enable_percentage_of_time(percentage) ⇒ Object
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.
143 144 145 |
# File 'lib/flipper/feature.rb', line 143 def enable_percentage_of_time(percentage) enable Types::PercentageOfTime.wrap(percentage) end |
#enabled?(thing = nil) ⇒ Boolean
Public: Check if a feature is enabled for a thing.
Returns true if enabled, false if not.
97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
# 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 |
#enabled_gate_names ⇒ Object
Public: Get the names of the enabled gates.
Returns an Array of gate names.
294 295 296 |
# File 'lib/flipper/feature.rb', line 294 def enabled_gate_names enabled_gates.map(&:name) end |
#enabled_gates ⇒ Object
Public: Get the gates that have been enabled for the feature.
Returns an Array of Flipper::Gate instances.
286 287 288 289 |
# File 'lib/flipper/feature.rb', line 286 def enabled_gates values = gate_values gates.select { |gate| gate.enabled?(values[gate.key]) } end |
#enabled_groups ⇒ Object Also known as: groups
Public: Get groups enabled for this feature.
Returns Set of Flipper::Types::Group instances.
236 237 238 |
# File 'lib/flipper/feature.rb', line 236 def enabled_groups groups_value.map { |name| Flipper.group(name) }.to_set end |
#gate(name) ⇒ Object
Public: Find a gate by name.
Returns a Flipper::Gate if found, nil if not.
349 350 351 |
# File 'lib/flipper/feature.rb', line 349 def gate(name) gates.detect { |gate| gate.name == name.to_sym } end |
#gate_for(thing) ⇒ Object
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
359 360 361 |
# File 'lib/flipper/feature.rb', line 359 def gate_for(thing) gates.detect { |gate| gate.protects?(thing) } || raise(GateNotFound, thing) end |
#gate_values ⇒ Object
Public: Returns the raw gate values stored by the adapter.
229 230 231 |
# File 'lib/flipper/feature.rb', line 229 def gate_values GateValues.new(adapter.get(self)) end |
#gates ⇒ Object
Public: Get all the gates used to determine enabled/disabled for the feature.
Returns an array of gates
336 337 338 339 340 341 342 343 344 |
# 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 |
#groups_value ⇒ Object
Public: Get the adapter value for the groups gate.
Returns Set of String group names.
251 252 253 |
# File 'lib/flipper/feature.rb', line 251 def groups_value gate_values.groups end |
#inspect ⇒ Object
Public: Pretty string version for debugging.
323 324 325 326 327 328 329 330 331 |
# 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 |
#off? ⇒ Boolean
Public: Is the feature fully disabled.
218 219 220 |
# File 'lib/flipper/feature.rb', line 218 def off? state == :off end |
#on? ⇒ Boolean
Public: Is the feature fully enabled.
213 214 215 |
# File 'lib/flipper/feature.rb', line 213 def on? state == :on end |
#percentage_of_actors_value ⇒ Object
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.
272 273 274 |
# File 'lib/flipper/feature.rb', line 272 def percentage_of_actors_value gate_values.percentage_of_actors end |
#percentage_of_time_value ⇒ Object
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.
279 280 281 |
# File 'lib/flipper/feature.rb', line 279 def percentage_of_time_value gate_values.percentage_of_time end |
#remove ⇒ Object
Public: Removes this feature.
Returns the result of Adapter#remove.
83 84 85 |
# File 'lib/flipper/feature.rb', line 83 def remove instrument(:remove) { adapter.remove(self) } end |
#state ⇒ Object
Public: Returns state for feature (:on, :off, or :conditional).
198 199 200 201 202 203 204 205 206 207 208 209 210 |
# 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 |
#to_param ⇒ Object
Public: Identifier to be used in the url (a rails-ism).
318 319 320 |
# File 'lib/flipper/feature.rb', line 318 def to_param to_s end |
#to_s ⇒ Object
Public: Returns the string representation of the feature.
313 314 315 |
# File 'lib/flipper/feature.rb', line 313 def to_s name.to_s end |