module PunditImplications::ClassMethods

Public Instance Methods

define_implications(implications) click to toggle source

Defines the implication graph and constructs query functions for all permissions by monkey-patching

# File lib/pundit_implications.rb, line 26
def define_implications(implications)
  @_implications ||= {}
  @_implications.merge!(implications) {|k,v1,v2| v1 | v2}
  transitive = transitive_hull(@_implications)
  transitive.each_key do |key|
    define_method(key.to_s + '?') {granted_list.include?(key)}
  end

  define_method('implied_permissions') {|initial|
    transitive.has_key?(initial) ? transitive[initial] : []}

  define_method('all_permissions') {transitive.keys.sort}
end

Private Instance Methods

transitive_hull(implications) click to toggle source

Computes a transitive hull for the implication graph

# File lib/pundit_implications.rb, line 43
def transitive_hull(implications)
  transitive = {}
  keys = implications.keys | implications.values.flatten
  keys.each do |key|
    weaker = []
    queue = [key]
    until queue.empty?
      weaker |= queue
      queue = queue.map{|k| implications[k]}.compact.flatten - weaker
    end
    transitive[key] = weaker.sort
  end
  transitive
end