class Admission::ResourceArbitration

Attributes

resource[R]
scope[R]

Public Class Methods

nested_scope(resource, scope) click to toggle source
# File lib/admission/resource_arbitration.rb, line 52
def self.nested_scope resource, scope
  resource = type_to_scope resource unless resource.is_a? Symbol
  "#{resource}:#{scope}".to_sym
end
new(person, rules_index, request, scope_or_resource) click to toggle source
# File lib/admission/resource_arbitration.rb, line 5
def initialize person, rules_index, request, scope_or_resource
  @person = person
  @scope, @resource = scope_and_resource scope_or_resource
  @rules_index = rules_index[@scope] || {}
  @request = request.to_sym
  @decisions = {}
end
resource_to_s(resource) click to toggle source
# File lib/admission/resource_arbitration.rb, line 57
def self.resource_to_s resource
  ", resource: #{resource.respond_to?(:id) ? "#{resource.class.name}[#{resource.id}]" : resource}"
end
type_to_scope(type) click to toggle source
# File lib/admission/resource_arbitration.rb, line 48
def self.type_to_scope type
  :"#{type.name.downcase}s"
end

Public Instance Methods

case_to_s() click to toggle source
# File lib/admission/resource_arbitration.rb, line 44
def case_to_s
  "`#{@request}` over `#{@scope}`#{Admission::ResourceArbitration.resource_to_s @resource if @resource}"
end
make_decision(from_rules, privilege) click to toggle source
# File lib/admission/resource_arbitration.rb, line 13
def make_decision from_rules, privilege
  if from_rules
    decision = from_rules[privilege]
    if Proc === decision
      if decision.instance_variable_get :@resource_arbiter
        decision = @person.instance_exec @resource, @context, &decision
      else
        decision = @person.instance_exec @context, &decision
      end
    end

    unless Admission::VALID_DECISION.include? decision
      raise "invalid decision: #{decision}"
    end

    decision
  end
end
scope_and_resource(scope_or_resource) click to toggle source
# File lib/admission/resource_arbitration.rb, line 32
def scope_and_resource scope_or_resource
  case scope_or_resource
    when Symbol
      [scope_or_resource]
    when Array
      resource, nested_scope = scope_or_resource
      [self.class.nested_scope(resource.class, nested_scope), resource]
    else
      [self.class.type_to_scope(scope_or_resource.class), scope_or_resource]
  end
end