Class: AbilityList

Inherits:
Object
  • Object
show all
Defined in:
lib/ability_list.rb,
lib/ability_list/version.rb

Defined Under Namespace

Modules: Helpers

Constant Summary collapse

Error =
Class.new(StandardError)
VERSION =
"0.0.3"

Instance Method Summary collapse

Instance Method Details

#authorize!(verb, object = nil) ⇒ Object

Ensures that the owner can perform ‘verb` on `object/class` – raises an error otherwise.



46
47
48
# File 'lib/ability_list.rb', line 46

def authorize!(verb, object=nil)
  can?(verb, object) or raise Error.new("Access denied (#{verb})")
end

#can(verb, klass = nil, columns = [], &block) ⇒ Object

Declares that the owner can perform ‘verb` on `class`.



13
14
15
16
# File 'lib/ability_list.rb', line 13

def can(verb, klass=nil, columns=[], &block)
  columns = [columns] unless columns.is_a? Array
  rules << [true, verb, get_class(klass), columns, block]
end

#can?(verb, object = nil, columns = []) ⇒ Boolean

Checks if the owner can perform ‘verb` on the given `object` (or class).

Returns:

  • (Boolean)


27
28
29
30
31
32
33
34
35
# File 'lib/ability_list.rb', line 27

def can?(verb, object=nil, columns=[])
  columns = [columns] unless columns.is_a? Array
  rules = rules_for(verb, get_class(object))
  rules.inject(false) do |bool, (sign, _, _, cols, proc)|
    sign ?
      ((bool || !proc ||  proc.call(object)) && ((columns & cols) == columns)) :  # can
      (bool &&  proc && !proc.call(object) && (columns.empty? || (columns & cols) != columns))    # cannot
  end
end

#cannot(verb, klass = nil, columns = [], &block) ⇒ Object

Inverse of ‘can`.



19
20
21
22
# File 'lib/ability_list.rb', line 19

def cannot(verb, klass=nil, columns=[], &block)
  columns = [columns] unless columns.is_a? Array
  rules << [false, verb, get_class(klass), columns, block]
end

#cannot?(verb, object = nil, columns = []) ⇒ Boolean

Inverse of ‘can?`.

Returns:

  • (Boolean)


38
39
40
# File 'lib/ability_list.rb', line 38

def cannot?(verb, object=nil, columns=[])
  !can?(verb, object, columns)
end

#rulesObject

Returns a list of rules. These are populated by ‘can` and `cannot`. (Rules are tuples)



6
7
8
# File 'lib/ability_list.rb', line 6

def rules
  @rules ||= []
end

#rules_for(verb, klass) ⇒ Object

Returns a subset of ‘rules` that match the given `verb` and `class`.



58
59
60
61
62
63
# File 'lib/ability_list.rb', line 58

def rules_for(verb, klass)
  rules.select do |(sign, _verb, _klass, cols, block)|
    (_verb  == :manage || _verb  == verb) &&
    (_klass == :all    || _klass == klass)
  end
end

#unauthorize!(verb, object = nil) ⇒ Object

Inverse of ‘authorize!`.



51
52
53
# File 'lib/ability_list.rb', line 51

def unauthorize!(verb, object=nil)
  cannot?(verb, object) or raise Error.new("Access denied (#{verb})")
end