Sha256: c7f912a7359afb3787561a2d211fddeb8f2f66b4a1b544cd9954444546d6f82d
Contents?: true
Size: 1.45 KB
Versions: 3
Compression:
Stored size: 1.45 KB
Contents
module Credentials module Rules class Rule attr_accessor :verb attr_accessor :options def initialize(klass, verb, *args) @klass = klass @verb = verb.to_sym @options = args.last.is_a?(Hash) ? args.pop : {} @pattern = Array(args) end def match?(actor, verb, *args) return false unless actor == @klass or actor.is_a?(@klass) return false unless @verb == :any or @verb == verb.to_sym return false unless args.size == @pattern.size @pattern.zip(args).each { |pattern, arg| return false unless !pattern.is_a?(Class) or arg == pattern or arg.is_a?(pattern) } end def allow?(actor, verb, *args) return false unless match? actor, verb, *args result = true result &&= evaluate(@options[:if], actor, *args) if @options[:if] result &&= !evaluate(@options[:unless], actor, *args) if @options[:unless] result end def deny?(actor, verb, *args) return false unless match? actor, verb, *args result = false result ||= evaluate(@options[:unless], actor, *args) if @options[:unless] result end protected def evaluate(fn, actor, *args) case fn when Proc then fn.call(actor, *args) when Symbol, String then actor.send(fn.to_sym, *args) else raise ArgumentError, "expected a proc or a symbol" end end end end end
Version data entries
3 entries across 3 versions & 2 rubygems
Version | Path |
---|---|
fauxparse-credentials-1.0.0 | lib/credentials/rules/rule.rb |
fauxparse-credentials-1.0.1 | lib/credentials/rules/rule.rb |
credentials-1.0.1 | lib/credentials/rules/rule.rb |