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.4"

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.versionObject



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

def self.version
  VERSION
end

Instance Method Details

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

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



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

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`.



17
18
19
20
# File 'lib/ability_list.rb', line 17

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)


31
32
33
34
35
36
37
38
39
# File 'lib/ability_list.rb', line 31

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`.



23
24
25
26
# File 'lib/ability_list.rb', line 23

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)


42
43
44
# File 'lib/ability_list.rb', line 42

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)



10
11
12
# File 'lib/ability_list.rb', line 10

def rules
  @rules ||= []
end

#rules_for(verb, klass) ⇒ Object

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



62
63
64
65
66
67
# File 'lib/ability_list.rb', line 62

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!`.



55
56
57
# File 'lib/ability_list.rb', line 55

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