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