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