Class: Admission::Arbitration::RulesBuilder

Inherits:
Object
  • Object
show all
Defined in:
lib/admission/arbitration.rb

Direct Known Subclasses

ResourceArbitration::RulesBuilder

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(privilege_order) ⇒ RulesBuilder

Returns a new instance of RulesBuilder.



78
79
80
81
# File 'lib/admission/arbitration.rb', line 78

def initialize privilege_order
  @rules = []
  @privilege_order = privilege_order
end

Instance Attribute Details

#privilege_orderObject (readonly)

Returns the value of attribute privilege_order.



76
77
78
# File 'lib/admission/arbitration.rb', line 76

def privilege_order
  @privilege_order
end

Instance Method Details

#add_allowance_rule(actions, arbiter, **options) ⇒ Object



104
105
106
107
108
109
110
111
112
# File 'lib/admission/arbitration.rb', line 104

def add_allowance_rule actions, arbiter, **options
  raise 'must be called within `privilege` block' unless @privilege

  @rules << options.merge!(
      privilege: @privilege,
      actions: actions,
      arbiter: arbiter
  )
end

#allow(*actions, &block) ⇒ Object



90
91
92
93
# File 'lib/admission/arbitration.rb', line 90

def allow *actions, &block
  raise "reserved action name #{Admission::ALL_ACTION}" if actions.include? Admission::ALL_ACTION
  add_allowance_rule actions.flatten, (block || true)
end

#allow_all(&block) ⇒ Object



95
96
97
# File 'lib/admission/arbitration.rb', line 95

def allow_all &block
  add_allowance_rule [Admission::ALL_ACTION], (block || true)
end

#create_indexObject



114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# File 'lib/admission/arbitration.rb', line 114

def create_index
  index_instance = @rules.reduce Hash.new do |index, allowance|
    privilege = allowance[:privilege]
    actions = allowance[:actions]
    arbiter = allowance[:arbiter]

    actions.each do |action|
      action_index = (index[action] ||= {})
      action_index[privilege] = arbiter
    end

    index
  end

  index_instance.values.each &:freeze
  index_instance.freeze
end

#forbid(*actions) ⇒ Object



99
100
101
102
# File 'lib/admission/arbitration.rb', line 99

def forbid *actions
  raise "reserved action name #{Admission::ALL_ACTION}" if actions.include? Admission::ALL_ACTION
  add_allowance_rule actions.flatten, :forbidden
end

#privilege(name, level = nil) ⇒ Object



83
84
85
86
87
88
# File 'lib/admission/arbitration.rb', line 83

def privilege name, level=nil
  @privilege = privilege_order.get name, level
  raise "no such privilege: #{name}#{Admission::Privilege::SEPARATOR}#{level}" unless @privilege
  yield
  @privilege = nil
end