Class: Flipper::Feature
- Inherits:
-
Object
- Object
- Flipper::Feature
- Defined in:
- lib/flipper/feature.rb
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.
-
#boolean_value ⇒ Object
Public: Get the adapter value for the boolean gate.
-
#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.
32 33 34 35 36 37 |
# File 'lib/flipper/feature.rb', line 32 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.
19 20 21 |
# File 'lib/flipper/feature.rb', line 19 def adapter @adapter end |
#instrumenter ⇒ Object (readonly)
Private: What is being used to instrument all the things.
22 23 24 |
# File 'lib/flipper/feature.rb', line 22 def instrumenter @instrumenter end |
#key ⇒ Object (readonly)
Public: Name converted to value safe for adapter.
16 17 18 |
# File 'lib/flipper/feature.rb', line 16 def key @key end |
#name ⇒ Object (readonly)
Public: The name of the feature.
13 14 15 |
# File 'lib/flipper/feature.rb', line 13 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.
245 246 247 |
# File 'lib/flipper/feature.rb', line 245 def actors_value gate_values.actors end |
#boolean_value ⇒ Object
Public: Get the adapter value for the boolean gate.
Returns true or false.
252 253 254 |
# File 'lib/flipper/feature.rb', line 252 def boolean_value gate_values.boolean end |
#conditional? ⇒ Boolean
Public: Is the feature conditionally enabled for a given actor, group, percentage of actors or percentage of the time.
211 212 213 |
# File 'lib/flipper/feature.rb', line 211 def conditional? state == :conditional end |
#disable(thing = false) ⇒ Object
Public: Disable this feature for something.
Returns the result of Adapter#disable.
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
# File 'lib/flipper/feature.rb', line 58 def disable(thing = false) instrument(:disable) { |payload| adapter.add self gate = gate_for(thing) wrapped_thing = gate.wrap(thing) payload[:gate_name] = gate.name payload[:thing] = wrapped_thing if gate.is_a?(Gates::Boolean) adapter.clear self else 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.
150 151 152 |
# File 'lib/flipper/feature.rb', line 150 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.
160 161 162 |
# File 'lib/flipper/feature.rb', line 160 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.
180 181 182 |
# File 'lib/flipper/feature.rb', line 180 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.
170 171 172 |
# File 'lib/flipper/feature.rb', line 170 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.
295 296 297 |
# File 'lib/flipper/feature.rb', line 295 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.
288 289 290 |
# File 'lib/flipper/feature.rb', line 288 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.
231 232 233 |
# File 'lib/flipper/feature.rb', line 231 def disabled_groups Flipper.groups - enabled_groups end |
#enable(thing = true) ⇒ Object
Public: Enable this feature for something.
Returns the result of Adapter#enable.
42 43 44 45 46 47 48 49 50 51 52 53 |
# File 'lib/flipper/feature.rb', line 42 def enable(thing = true) instrument(:enable) { |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 |
#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.
110 111 112 |
# File 'lib/flipper/feature.rb', line 110 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.
120 121 122 |
# File 'lib/flipper/feature.rb', line 120 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.
140 141 142 |
# File 'lib/flipper/feature.rb', line 140 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.
130 131 132 |
# File 'lib/flipper/feature.rb', line 130 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.
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
# File 'lib/flipper/feature.rb', line 85 def enabled?(thing = nil) instrument(:enabled?) { |payload| values = gate_values payload[:thing] = gate(:actor).wrap(thing) unless thing.nil? open_gate = gates.detect { |gate| gate.open?(thing, values[gate.key], feature_name: @name) } if open_gate.nil? false else payload[:gate_name] = open_gate.name true end } end |
#enabled_gate_names ⇒ Object
Public: Get the names of the enabled gates.
Returns an Array of gate names.
281 282 283 |
# File 'lib/flipper/feature.rb', line 281 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.
273 274 275 276 |
# File 'lib/flipper/feature.rb', line 273 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.
223 224 225 |
# File 'lib/flipper/feature.rb', line 223 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.
336 337 338 |
# File 'lib/flipper/feature.rb', line 336 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
346 347 348 349 |
# File 'lib/flipper/feature.rb', line 346 def gate_for(thing) gates.detect { |gate| gate.protects?(thing) } || raise(GateNotFound.new(thing)) end |
#gate_values ⇒ Object
Public: Returns the raw gate values stored by the adapter.
216 217 218 |
# File 'lib/flipper/feature.rb', line 216 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
323 324 325 326 327 328 329 330 331 |
# File 'lib/flipper/feature.rb', line 323 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.
238 239 240 |
# File 'lib/flipper/feature.rb', line 238 def groups_value gate_values.groups end |
#inspect ⇒ Object
Public: Pretty string version for debugging.
310 311 312 313 314 315 316 317 318 |
# File 'lib/flipper/feature.rb', line 310 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.
205 206 207 |
# File 'lib/flipper/feature.rb', line 205 def off? state == :off end |
#on? ⇒ Boolean
Public: Is the feature fully enabled.
200 201 202 |
# File 'lib/flipper/feature.rb', line 200 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.
259 260 261 |
# File 'lib/flipper/feature.rb', line 259 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.
266 267 268 |
# File 'lib/flipper/feature.rb', line 266 def percentage_of_time_value gate_values.percentage_of_time end |
#remove ⇒ Object
Public: Removes this feature.
Returns the result of Adapter#remove.
78 79 80 |
# File 'lib/flipper/feature.rb', line 78 def remove instrument(:remove) { adapter.remove(self) } end |
#state ⇒ Object
Public: Returns state for feature (:on, :off, or :conditional).
185 186 187 188 189 190 191 192 193 194 195 196 197 |
# File 'lib/flipper/feature.rb', line 185 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).
305 306 307 |
# File 'lib/flipper/feature.rb', line 305 def to_param to_s end |
#to_s ⇒ Object
Public: Returns the string representation of the feature.
300 301 302 |
# File 'lib/flipper/feature.rb', line 300 def to_s name.to_s end |