Class: Flipper::Expressions::FeatureEnabled

Inherits:
Object
  • Object
show all
Defined in:
lib/flipper/expressions/feature_enabled.rb

Constant Summary collapse

EVALUATING_KEY =
:flipper_evaluating_features

Class Method Summary collapse

Class Method Details

.call(feature_name, context:) ⇒ Object



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/flipper/expressions/feature_enabled.rb', line 8

def self.call(feature_name, context:)
  evaluating = Thread.current[EVALUATING_KEY] ||= Set.new
  feature_name = feature_name.to_s
  current_feature = context[:feature_name].to_s

  # Track the current feature so A -> B -> A is caught
  added_current = evaluating.add?(current_feature)

  begin
    # Circular dependency: return false to break the cycle
    return false if evaluating.include?(feature_name)

    evaluating.add(feature_name)
    actor = context[:actor]
    if actor
      Flipper.enabled?(feature_name, actor)
    else
      Flipper.enabled?(feature_name)
    end
  ensure
    evaluating.delete(feature_name)
    evaluating.delete(current_feature) if added_current
  end
end