Class: Maybee::Authorization

Inherits:
Object
  • Object
show all
Defined in:
lib/maybee/authorization.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(access, subject_classes, options) ⇒ Authorization

Returns a new instance of Authorization.

Raises:

  • (ArgumentError)


6
7
8
9
10
11
12
13
14
# File 'lib/maybee/authorization.rb', line 6

def initialize(access, subject_classes, options)
  raise ArgumentError, "Access name must be symbol" unless access.is_a?(Symbol)
  @access = access
  #raise ArgumentError, "Subject classes must be an array" unless subject_classes.is_a?(Array)
  @subject_classes = subject_classes.empty? ? nil : subject_classes
  options.assert_valid_keys(:if, :unless, :if_subject, :unless_subject, :allow_nil)
  @allow_nil = options.delete(:allow_nil)
  @conditionals = options.empty? ? nil : options      
end

Instance Attribute Details

#accessObject (readonly)

Returns the value of attribute access.



4
5
6
# File 'lib/maybee/authorization.rb', line 4

def access
  @access
end

#allow_nilObject (readonly)

Returns the value of attribute allow_nil.



4
5
6
# File 'lib/maybee/authorization.rb', line 4

def allow_nil
  @allow_nil
end

#conditionalsObject (readonly)

Returns the value of attribute conditionals.



4
5
6
# File 'lib/maybee/authorization.rb', line 4

def conditionals
  @conditionals
end

#subject_classesObject (readonly)

Returns the value of attribute subject_classes.



4
5
6
# File 'lib/maybee/authorization.rb', line 4

def subject_classes
  @subject_classes
end

Instance Method Details

#granted?(object, subject) ⇒ Boolean



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/maybee/authorization.rb', line 16

def granted?(object, subject)
  return false if !@allow_nil && @subject_classes && @subject_classes.none? { |klass| subject.is_a?(klass) }
  return true unless @conditionals
  return true if @conditionals.all? do |clause, cond|
    next(false) if subject.nil? && !@allow_nil
    if :if_subject == clause || :unless_subject == clause
      receiver, argument = subject, object
    else
      receiver, argument = object, subject
    end
    result = if cond.is_a?(Proc)
      if cond.arity == 1
        receiver.instance_exec(argument, &cond)
      else
        receiver.instance_exec(&cond)
      end
    else
      receiver.send(cond)
    end
    (:if_subject == clause || :if == clause) ? result : !result
  end
  false
end