Class: Opi::Router

Inherits:
Object
  • Object
show all
Defined in:
lib/opi/router.rb

Constant Summary collapse

WILDCARD_PATTERN =
/\/\*/
NAMED_SEGMENTS_PATTERN =
/\/:([^$\/]+)/
NAMED_SEGMENTS_REPLACEMENT_PATTERN =
/\/:([^$\/]+)/

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(root) ⇒ Router

Returns a new instance of Router.



9
10
11
12
13
# File 'lib/opi/router.rb', line 9

def initialize(root)
  @root = root
  @routes = []
  compile_routes(@root)
end

Instance Attribute Details

#routesObject

Returns the value of attribute routes.



3
4
5
# File 'lib/opi/router.rb', line 3

def routes
  @routes
end

Instance Method Details

#route(method, path) ⇒ Object

def route(method, path, options={}, block)

# TODO: remove&replace existing routes (on reload)
router.routes.unshift({:method => method, :path => path, :options => options, :block => block})

end



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/opi/router.rb', line 20

def route(method, path)
  method_routes = self.routes.find_all{|x| x.method == method}
  method_routes.each do |route|
    if route.path =~ WILDCARD_PATTERN
      src = "\\A#{route.path.gsub('*','(.*)')}\\Z"
      if match = path.match(Regexp.new(src))
        return [route, match[1].split('/')]
      end
    elsif route.path =~ NAMED_SEGMENTS_PATTERN
      src = "\\A#{route.path.gsub(NAMED_SEGMENTS_REPLACEMENT_PATTERN, '/(?<\1>[^$/]+)')}\\Z"
      if match = path.match(Regexp.new(src))
        return [route, Hash[match.names.zip(match.captures)]]
      end
    elsif path == route.path
      return [route]
    end
  end
  nil
end