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