rack-router 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.rvmrc +1 -0
- data/README.md +1 -1
- data/config.ru +1 -1
- data/lib/rack/route.rb +4 -3
- data/lib/rack/router.rb +10 -1
- data/rack-router.gemspec +1 -1
- data/test/route_test.rb +8 -5
- data/test/router_test.rb +4 -2
- metadata +4 -3
data/.rvmrc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
rvm 1.9.3@rack-router --create
|
data/README.md
CHANGED
data/config.ru
CHANGED
@@ -3,7 +3,7 @@ require 'rack/lobster'
|
|
3
3
|
|
4
4
|
router = Rack::Router.new do
|
5
5
|
get "/hello/:name" => proc{|env| [200, { "Content-Type" => "text/html" }, ["<h1>Hello, #{env['rack.route_params'][:name]}</h1>"] ] }
|
6
|
-
get "/lobster" => Rack::Lobster.new
|
6
|
+
get "/lobster" => Rack::Lobster.new, :as => "lobster"
|
7
7
|
end
|
8
8
|
|
9
9
|
run router
|
data/lib/rack/route.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Rack
|
2
2
|
class Route
|
3
3
|
|
4
|
-
attr_accessor :pattern, :app, :constraints
|
4
|
+
attr_accessor :pattern, :app, :constraints, :name
|
5
5
|
|
6
6
|
PATH_INFO = 'PATH_INFO'.freeze
|
7
7
|
DEFAULT_WILDCARD_NAME = :paths
|
@@ -10,7 +10,7 @@ module Rack
|
|
10
10
|
NAMED_SEGMENTS_REPLACEMENT_PATTERN = /\/:([^$\/]+)/.freeze
|
11
11
|
DOT = '.'.freeze
|
12
12
|
|
13
|
-
def initialize(pattern, app,
|
13
|
+
def initialize(pattern, app, options={})
|
14
14
|
if pattern.to_s.strip.empty?
|
15
15
|
raise ArgumentError.new("pattern cannot be blank")
|
16
16
|
end
|
@@ -21,7 +21,8 @@ module Rack
|
|
21
21
|
|
22
22
|
@pattern = pattern
|
23
23
|
@app = app
|
24
|
-
@constraints = constraints
|
24
|
+
@constraints = options && options[:constraints]
|
25
|
+
@name = options && options[:as]
|
25
26
|
end
|
26
27
|
|
27
28
|
def regexp
|
data/lib/rack/router.rb
CHANGED
@@ -21,9 +21,14 @@ module Rack
|
|
21
21
|
|
22
22
|
def initialize(&block)
|
23
23
|
@routes = {}
|
24
|
+
@named_routes = {}
|
24
25
|
routes(&block)
|
25
26
|
end
|
26
27
|
|
28
|
+
def [](route_name)
|
29
|
+
@named_routes[route_name]
|
30
|
+
end
|
31
|
+
|
27
32
|
def routes(&block)
|
28
33
|
instance_eval(&block) if block
|
29
34
|
@routes
|
@@ -46,9 +51,13 @@ module Rack
|
|
46
51
|
end
|
47
52
|
|
48
53
|
def route(method, route_spec)
|
49
|
-
route = Route.new(route_spec.first.first, route_spec.first.last)
|
54
|
+
route = Route.new(route_spec.first.first, route_spec.first.last, route_spec.reject{|k,_| k == route_spec.first.first })
|
50
55
|
@routes[method] ||= []
|
51
56
|
@routes[method] << route
|
57
|
+
if route_spec && route_spec[:as]
|
58
|
+
# Using ||= so the first route with that name will be returned
|
59
|
+
@named_routes[route_spec[:as].to_sym] ||= route_spec.first.first
|
60
|
+
end
|
52
61
|
route
|
53
62
|
end
|
54
63
|
|
data/rack-router.gemspec
CHANGED
data/test/route_test.rb
CHANGED
@@ -30,9 +30,11 @@ class RouteTest < Test::Unit::TestCase
|
|
30
30
|
|
31
31
|
def test_match_with_constraints
|
32
32
|
r = route("/posts/:year/:month/:day/:slug",
|
33
|
-
:
|
34
|
-
|
35
|
-
|
33
|
+
:constraints => {
|
34
|
+
:year => /\A\d{4}\Z/,
|
35
|
+
:month => /\A\d{1,2}\Z/,
|
36
|
+
:day => /\A\d{1,2}\Z/},
|
37
|
+
:as => "article")
|
36
38
|
assert_equal({
|
37
39
|
:year => "2012",
|
38
40
|
:month => "9",
|
@@ -41,6 +43,7 @@ class RouteTest < Test::Unit::TestCase
|
|
41
43
|
}, r.match("/posts/2012/9/20/test"))
|
42
44
|
assert_equal(nil, r.match("/posts/2012/9/20"))
|
43
45
|
assert_equal(nil, r.match("/posts/2012/x/20/test"))
|
46
|
+
assert_equal "article", r.name
|
44
47
|
end
|
45
48
|
|
46
49
|
def test_eql
|
@@ -51,8 +54,8 @@ class RouteTest < Test::Unit::TestCase
|
|
51
54
|
end
|
52
55
|
|
53
56
|
private
|
54
|
-
def route(path,
|
55
|
-
Rack::Route.new(path, lambda{|env| [200, {}, [""]] },
|
57
|
+
def route(path, options={})
|
58
|
+
Rack::Route.new(path, lambda{|env| [200, {}, [""]] }, options)
|
56
59
|
end
|
57
60
|
|
58
61
|
def match(pattern, path, params)
|
data/test/router_test.rb
CHANGED
@@ -7,8 +7,8 @@ class RouterTest < Test::Unit::TestCase
|
|
7
7
|
app2 = lambda{|env| [200, {}, ["2"]] }
|
8
8
|
|
9
9
|
router = Rack::Router.new do
|
10
|
-
post "/stuff" => app2
|
11
|
-
put "/it" => app2
|
10
|
+
post "/stuff" => app2, :as => "stuff"
|
11
|
+
put "/it" => app2, :as => :it
|
12
12
|
delete "/remove" => app2
|
13
13
|
get "/:id" => app1
|
14
14
|
end
|
@@ -21,6 +21,8 @@ class RouterTest < Test::Unit::TestCase
|
|
21
21
|
}, router.routes)
|
22
22
|
|
23
23
|
assert_equal ["42"], router.call("REQUEST_METHOD" => "GET", "PATH_INFO" => "/42").last
|
24
|
+
assert_equal "/stuff", router[:stuff]
|
25
|
+
assert_equal "/it", router[:it]
|
24
26
|
end
|
25
27
|
end
|
26
28
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rack-router
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-10-
|
12
|
+
date: 2012-10-18 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: A simple router for Rack apps
|
15
15
|
email:
|
@@ -19,6 +19,7 @@ extensions: []
|
|
19
19
|
extra_rdoc_files: []
|
20
20
|
files:
|
21
21
|
- .gitignore
|
22
|
+
- .rvmrc
|
22
23
|
- Gemfile
|
23
24
|
- LICENSE
|
24
25
|
- README.md
|
@@ -50,7 +51,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
50
51
|
version: '0'
|
51
52
|
requirements: []
|
52
53
|
rubyforge_project:
|
53
|
-
rubygems_version: 1.8.
|
54
|
+
rubygems_version: 1.8.17
|
54
55
|
signing_key:
|
55
56
|
specification_version: 3
|
56
57
|
summary: A simple router for rack apps
|