class Miau::PolicyStorage

Attributes

instances[R]
policies[R]

Example @policies: {

posts: {
  delete: :delete,
  remove: :delete
},
application: {
  admin: :check
}

}

Public Class Methods

new() click to toggle source
# File lib/miau/storage.rb, line 22
def initialize
  reset
end

Public Instance Methods

add(klass, action, meth) click to toggle source
# File lib/miau/storage.rb, line 31
def add(klass, action, meth)
  kls = klass.name.underscore[0..-8] # remove "_policy"
  kls = kls.to_sym
  @policies[kls] ||= {}
  @instances[kls] ||= klass.new
  @policies[kls][action.to_sym] = meth.to_sym
end
find_policy(klass, action) click to toggle source

returns policy: [instance, method]

# File lib/miau/storage.rb, line 49
def find_policy(klass, action)
  kls = instance_of(klass)
  act = policy_method(klass, action)
  return [kls, act] if kls.respond_to?(act)

  klass = :application
  kls = instance_of(klass)
  act = policy_method(klass, action)
  return [kls, act] if kls.respond_to?(act)

  # return nil
end
reset() click to toggle source
# File lib/miau/storage.rb, line 26
def reset
  @policies = {}
  @instances = {}
end
run(klass, action, user, resource) click to toggle source
# File lib/miau/storage.rb, line 62
def run(klass, action, user, resource)
  arr = find_policy(klass, action)
  unless arr
    msg = "class <#{klass}> action <#{action}>"
    raise Miau::NotDefinedError, msg
  end

  policy, meth = arr
  policy.user = user
  policy.resource = resource
  policy.send(meth)
end
to_yaml() click to toggle source
# File lib/miau/storage.rb, line 75
def to_yaml
  "# === @policies ===\n" + YAML.dump(@policies) +
    "# === @instances ===\n" + YAML.dump(@instances)
end

Private Instance Methods

instance_of(klass) click to toggle source
# File lib/miau/storage.rb, line 82
def instance_of(klass)
  res = @instances[klass]
  return res if res

  name = "#{klass.to_s.camelcase}Policy"
  return nil unless Object.const_defined?(name)

  @instances[klass] = name.constantize.new
end
policy_method(klass, action) click to toggle source
# File lib/miau/storage.rb, line 92
def policy_method(klass, action)
  act = @policies[klass]
  return action unless act

  act[action] || action
end