Class: Policier::Context

Inherits:
Object
  • Object
show all
Defined in:
lib/policier/context.rb

Defined Under Namespace

Classes: DuplicatePayloadKey, NotInScopeException, ScopeStartedEvaluation

Constant Summary collapse

THREAD_CURRENT_KEY =
:policier_context_current

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(payload) ⇒ Context

Returns a new instance of Context.



43
44
45
46
47
# File 'lib/policier/context.rb', line 43

def initialize(payload)
  @payload = payload
  @conditions = {}
  @data = {}
end

Instance Attribute Details

#payloadObject (readonly)

Returns the value of attribute payload.



41
42
43
# File 'lib/policier/context.rb', line 41

def payload
  @payload
end

Class Method Details

.currentObject



16
17
18
19
20
# File 'lib/policier/context.rb', line 16

def current
  raise NotInScopeException unless Thread.current[THREAD_CURRENT_KEY]

  Thread.current[THREAD_CURRENT_KEY]
end

.scope(payload = {}) ⇒ Object



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/policier/context.rb', line 22

def scope(payload = {})
  if Thread.current[THREAD_CURRENT_KEY].present? && Context.current.evaluation_started?
    raise ScopeStartedEvaluation
  end

  if Thread.current[THREAD_CURRENT_KEY].blank?
    Thread.current[THREAD_CURRENT_KEY] = new(payload)
  else
    raise ScopeStartedEvaluation if Context.current.evaluation_started? && payload.any?

    Context.current.payload.merge!(payload)
  end

  yield
ensure
  Thread.current[THREAD_CURRENT_KEY] = nil
end

Instance Method Details

#ensure_condiiton(condition_class) ⇒ Object



66
67
68
# File 'lib/policier/context.rb', line 66

def ensure_condiiton(condition_class)
  @conditions[condition_class] ||= condition_class.new.verify
end

#evaluation_started?Boolean

Returns:

  • (Boolean)


62
63
64
# File 'lib/policier/context.rb', line 62

def evaluation_started?
  @conditions.present?
end

#init_data(condition_class, data_class) ⇒ Object



49
50
51
# File 'lib/policier/context.rb', line 49

def init_data(condition_class, data_class)
  @data[condition_class] = data_class.new
end

#mock_condition(*condtion_classes, failed: false, data_replacement: {}) ⇒ Object



53
54
55
56
57
58
59
60
# File 'lib/policier/context.rb', line 53

def mock_condition(*condtion_classes, failed: false, data_replacement: {})
  condtion_classes.each do |condition_class|
    @condition[condition_class] ||= condition_class.new.iverride!(
      failed: failed,
      data_replacement: data_replacement
    )
  end
end