class Indulgence::Permission
Attributes
ability[R]
entity[R]
Public Class Methods
all()
click to toggle source
# File lib/indulgence/permission.rb, line 66 def self.all Permission.define_ability( :name => :all, :compare_single => lambda {|thing, entity| true}, :filter_many => lambda {|things, entity| things.where(nil)} ) end
define_ability(args)
click to toggle source
# File lib/indulgence/permission.rb, line 74 def self.define_ability(args) args = generate_ability_args(args) ability_cache[args[:name].to_sym] ||= Ability.new args end
new(entity, ability, role_method = nil)
click to toggle source
# File lib/indulgence/permission.rb, line 5 def initialize(entity, ability, role_method = nil) self @entity = entity @role_name = role_method.to_sym if role_method @ability = abilities_for_role[ability] raise AbilityNotFound, "Unable to find an ability called #{ability}" unless @ability end
none()
click to toggle source
# File lib/indulgence/permission.rb, line 58 def self.none Permission.define_ability( :name => :none, :compare_single => lambda {|thing, entity| false}, :filter_many => lambda {|things, entity| raise NotFoundError} ) end
role_method()
click to toggle source
# File lib/indulgence/permission.rb, line 44 def self.role_method @@role_method end
role_method=(name)
click to toggle source
# File lib/indulgence/permission.rb, line 40 def self.role_method=(name) @@role_method = name.to_sym end
role_name_method()
click to toggle source
# File lib/indulgence/permission.rb, line 54 def self.role_name_method @@role_name_method end
role_name_method=(name)
click to toggle source
# File lib/indulgence/permission.rb, line 50 def self.role_name_method=(name) @@role_name_method = name.to_sym end
Private Class Methods
ability_cache()
click to toggle source
# File lib/indulgence/permission.rb, line 121 def self.ability_cache @ability_cache ||= {} end
generate_ability_args(args)
click to toggle source
# File lib/indulgence/permission.rb, line 125 def self.generate_ability_args(args) unless args.kind_of? Hash args = {:relationship => args.to_sym} end args[:name] = generate_ability_name(args) return args end
generate_ability_name(args)
click to toggle source
# File lib/indulgence/permission.rb, line 133 def self.generate_ability_name(args) return args[:name] if args[:name] return args.to_s if args[:relationship] raise AbilityConfigurationError, "A name is required for each ability" end
Public Instance Methods
abilities()
click to toggle source
# File lib/indulgence/permission.rb, line 13 def abilities {} end
abilities_for_role()
click to toggle source
# File lib/indulgence/permission.rb, line 87 def abilities_for_role return null_entity unless entity abilities[role_name] || default end
compare_single(thing)
click to toggle source
# File lib/indulgence/permission.rb, line 34 def compare_single(thing) ability.compare_single thing, entity end
default()
click to toggle source
# File lib/indulgence/permission.rb, line 26 def default null_entity end
define_ability(args)
click to toggle source
# File lib/indulgence/permission.rb, line 79 def define_ability(args) self.class.define_ability(args) end
filter_many(things)
click to toggle source
# File lib/indulgence/permission.rb, line 30 def filter_many(things) ability.filter_many things, entity end
null_entity()
click to toggle source
# File lib/indulgence/permission.rb, line 17 def null_entity { create: none, read: none, update: none, delete: none } end
role_name()
click to toggle source
# File lib/indulgence/permission.rb, line 83 def role_name @role_name ||= entity_role_name end
Private Instance Methods
all()
click to toggle source
# File lib/indulgence/permission.rb, line 109 def all self.class.all end
entity_has_role_method()
click to toggle source
# File lib/indulgence/permission.rb, line 102 def entity_has_role_method return true if entity.respond_to?(self.class.role_method) if Indulgence.strict? raise NoMethodError.new("#{entity} has no role method '#{role_name_method}'. Unable to process #{self.class}") end end
entity_role_name()
click to toggle source
# File lib/indulgence/permission.rb, line 93 def entity_role_name role = entity.send(self.class.role_method) if entity_has_role_method if role and abilities.keys.include?(role.send(role_name_method).to_sym) role.send(role_name_method).to_sym else :default end end
none()
click to toggle source
# File lib/indulgence/permission.rb, line 113 def none self.class.none end
role_name_method()
click to toggle source
# File lib/indulgence/permission.rb, line 117 def role_name_method self.class.role_name_method end