lib/divining_rod.rb in divining_rod-0.2.0 vs lib/divining_rod.rb in divining_rod-0.3.0
- old
+ new
@@ -1,89 +1,107 @@
require 'yaml'
module DiviningRod
-
+
class Profile
-
+
attr_reader :match
-
+
def initialize(request)
+ @request = request
matchers.each do |matcher|
@match = matcher if matcher.matches?(request)
break if @match
end
nil
end
def group
- @match.group
+ if @match
+ @match.group
+ else
+ @request.format
+ end
end
alias_method :format, :group
-
+
def recognized?
!!@match
end
-
+
def method_missing(meth)
if meth.to_s.match(/(.+)\?$/)
tag = $1
- @match.tags.include?(tag.to_s) || @match.tags.include?(tag.to_sym) || @match.tags == tag
+ if @match
+ @match.tags.include?(tag.to_s) || @match.tags.include?(tag.to_sym) || @match.tags == tag
+ else
+ false
+ end
else
super
end
end
-
+
def matchers
DiviningRod::Matchers.definitions || []
end
-
+
end
-
+
class Matchers
-
+
class << self
-
+
attr_accessor :definitions
-
+
def define
yield(self)
end
-
+
def clear_definitions
@definitions = []
end
-
+
def ua(pattern, group, opts={})
@definitions ||= []
@definitions << Definition.new(group, opts) { |request|
if pattern.match(request.user_agent)
true
end
}
end
+ def subdomain(pattern, group, opts={})
+ @definitions ||= []
+ @definitions << Definition.new(group, opts) { |request|
+ if pattern.match(request.subdomains[0])
+ true
+ end
+ }
+ end
+
def default(group, opts = {})
@definitions ||= []
@definitions << Definition.new(group, opts) { |request| true }
end
-
+
end
-
+
end
-
+
class Definition
-
+
attr_accessor :prc, :tags, :group
-
+
def initialize(group, opts={}, &blk)
@group = group
@tags = opts[:tags] || []
@prc = blk
end
-
+
def matches?(request)
!!@prc.call(request)
end
-
+
end
-
-end
\ No newline at end of file
+
+end