http_router 0.2.5 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +5 -0
- data/lib/ext/rack/uri_escape.rb +1 -1
- data/lib/http_router/node.rb +25 -29
- data/lib/http_router/version.rb +1 -1
- data/spec/recognize_spec.rb +16 -9
- metadata +19 -19
data/CHANGELOG
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
== 0.3.0
|
2
|
+
|
3
|
+
* Unescape param values (Joshua Hull, d7a6a1f)
|
4
|
+
* Removed useless test in request method adding (Joshua Hull, bcaade2)
|
5
|
+
|
1
6
|
== 0.2.5
|
2
7
|
|
3
8
|
* Walk entire tree looking for possible request_methods to return on 405 if a match isn't achieved. (Joshua Hull, 3e8631f)
|
data/lib/ext/rack/uri_escape.rb
CHANGED
data/lib/http_router/node.rb
CHANGED
@@ -98,34 +98,30 @@ class HttpRouter
|
|
98
98
|
|
99
99
|
for current_node_index in (0...current_nodes.size)
|
100
100
|
current_node = current_nodes.at(current_node_index)
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
current_nodes[current_node_index] = (current_node.lookup[request_options[method]] ||= router.request_node)
|
118
|
-
end
|
119
|
-
when 1 #this node is farther ahead
|
120
|
-
current_nodes[current_node_index] = (current_node.catchall ||= router.request_node)
|
121
|
-
when -1 #this method is more important than the current node
|
122
|
-
next_node = current_node.dup
|
123
|
-
current_node.reset!
|
124
|
-
current_node.request_method = method
|
125
|
-
redo
|
101
|
+
unless current_node.request_method
|
102
|
+
current_node.request_method = method
|
103
|
+
end
|
104
|
+
case RequestNode::RequestMethods.index(method) <=> RequestNode::RequestMethods.index(current_node.request_method)
|
105
|
+
when 0 #use this node
|
106
|
+
if request_options[method].is_a?(Regexp)
|
107
|
+
new_node = router.request_node
|
108
|
+
current_nodes[current_node_index] = new_node
|
109
|
+
current_node.create_linear
|
110
|
+
current_node.linear << [request_options[method], new_node]
|
111
|
+
elsif request_options[method].is_a?(Array)
|
112
|
+
current_node.create_lookup
|
113
|
+
current_nodes[current_node_index] = request_options[method].map{|val| current_node.lookup[val] ||= router.request_node}
|
114
|
+
else
|
115
|
+
current_node.create_lookup
|
116
|
+
current_nodes[current_node_index] = (current_node.lookup[request_options[method]] ||= router.request_node)
|
126
117
|
end
|
127
|
-
|
128
|
-
current_node.catchall ||= router.request_node
|
118
|
+
when 1 #this node is farther ahead
|
119
|
+
current_nodes[current_node_index] = (current_node.catchall ||= router.request_node)
|
120
|
+
when -1 #this method is more important than the current node
|
121
|
+
next_node = current_node.dup
|
122
|
+
current_node.reset!
|
123
|
+
current_node.request_method = method
|
124
|
+
redo
|
129
125
|
end
|
130
126
|
end
|
131
127
|
current_nodes.flatten!
|
@@ -152,7 +148,7 @@ class HttpRouter
|
|
152
148
|
next_node = @linear.find do |(tester, node)|
|
153
149
|
if tester.respond_to?(:matches?) and match = tester.matches?(parts)
|
154
150
|
dupped_parts = parts.dup
|
155
|
-
params
|
151
|
+
params.push((val = tester.consume(match, dupped_parts) and val.is_a?(Array)) ? val.map{|v| Rack::Utils.uri_unescape(v)} : Rack::Utils.uri_unescape(val))
|
156
152
|
parts.replace(dupped_parts) if response = node.find_on_parts(request, dupped_parts, params, alternate_request_methods)
|
157
153
|
elsif tester.respond_to?(:match) and match = tester.match(parts.whole_path) and match.begin(0) == 0
|
158
154
|
dupped_parts = router.split(parts.whole_path[match[0].size, parts.whole_path.size])
|
@@ -167,7 +163,7 @@ class HttpRouter
|
|
167
163
|
parts.shift
|
168
164
|
return match.find_on_parts(request, parts, params, alternate_request_methods)
|
169
165
|
elsif @catchall
|
170
|
-
params
|
166
|
+
params.push((val = @catchall.variable.consume(nil, parts) and val.is_a?(Array)) ? val.map{|v| Rack::Utils.uri_unescape(v)} : Rack::Utils.uri_unescape(val))
|
171
167
|
return @catchall.find_on_parts(request, parts, params, alternate_request_methods)
|
172
168
|
end
|
173
169
|
end
|
data/lib/http_router/version.rb
CHANGED
data/spec/recognize_spec.rb
CHANGED
@@ -99,15 +99,6 @@ describe "HttpRouter#recognize" do
|
|
99
99
|
end
|
100
100
|
end
|
101
101
|
|
102
|
-
context "with variables" do
|
103
|
-
it "should recognize" do
|
104
|
-
@router.add("/foo").to(:test1)
|
105
|
-
@router.add("/foo/:id").to(:test2)
|
106
|
-
@router.recognize(Rack::MockRequest.env_for('/foo')).dest.should == :test1
|
107
|
-
@router.recognize(Rack::MockRequest.env_for('/foo/id')).dest.should == :test2
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
102
|
context "with missing leading /" do
|
112
103
|
it "should recognize" do
|
113
104
|
@router.add("foo").to(:test1)
|
@@ -179,7 +170,22 @@ describe "HttpRouter#recognize" do
|
|
179
170
|
end
|
180
171
|
|
181
172
|
context("with dynamic paths") do
|
173
|
+
it "should recognize /foo/:id and /foo" do
|
174
|
+
@router.add("/foo/:id").to(:test2)
|
175
|
+
@router.add("/foo").to(:test1)
|
176
|
+
@router.recognize(Rack::MockRequest.env_for('/foo')).dest.should == :test1
|
177
|
+
@router.recognize(Rack::MockRequest.env_for('/foo/id')).dest.should == :test2
|
178
|
+
end
|
179
|
+
|
182
180
|
it "should recognize '/:variable'" do
|
181
|
+
route = @router.add('/:variable').to(:test)
|
182
|
+
response = @router.recognize(Rack::MockRequest.env_for('/%E6%AE%BA%E3%81%99'))
|
183
|
+
response.route.should == route
|
184
|
+
response.params.should == ["\346\256\272\343\201\231"]
|
185
|
+
response.params_as_hash[:variable].should == "\346\256\272\343\201\231"
|
186
|
+
end
|
187
|
+
|
188
|
+
it "should recognize '/:variable' and URI unescape variables" do
|
183
189
|
route = @router.add('/:variable').to(:test)
|
184
190
|
response = @router.recognize(Rack::MockRequest.env_for('/value'))
|
185
191
|
response.route.should == route
|
@@ -242,6 +248,7 @@ describe "HttpRouter#recognize" do
|
|
242
248
|
response.route.should == route
|
243
249
|
response.params.should == [['one', 'two', 'three']]
|
244
250
|
end
|
251
|
+
|
245
252
|
it "should recognize with a regexp" do
|
246
253
|
route = @router.add('/test/*variable/anymore').matching(:variable => /\d+/).to(:test)
|
247
254
|
response = @router.recognize(Rack::MockRequest.env_for('/test/123/345/567/anymore'))
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: http_router
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 3
|
9
|
+
- 0
|
10
|
+
version: 0.3.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Joshua Hull
|
@@ -15,11 +15,10 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-06-
|
18
|
+
date: 2010-06-27 00:00:00 -04:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
|
-
prerelease: false
|
23
22
|
version_requirements: &id001 !ruby/object:Gem::Requirement
|
24
23
|
none: false
|
25
24
|
requirements:
|
@@ -31,10 +30,10 @@ dependencies:
|
|
31
30
|
- 0
|
32
31
|
version: "1.0"
|
33
32
|
requirement: *id001
|
34
|
-
type: :runtime
|
35
33
|
name: rack
|
36
|
-
- !ruby/object:Gem::Dependency
|
37
34
|
prerelease: false
|
35
|
+
type: :runtime
|
36
|
+
- !ruby/object:Gem::Dependency
|
38
37
|
version_requirements: &id002 !ruby/object:Gem::Requirement
|
39
38
|
none: false
|
40
39
|
requirements:
|
@@ -47,10 +46,10 @@ dependencies:
|
|
47
46
|
- 1
|
48
47
|
version: 0.2.1
|
49
48
|
requirement: *id002
|
50
|
-
type: :runtime
|
51
49
|
name: url_mount
|
52
|
-
- !ruby/object:Gem::Dependency
|
53
50
|
prerelease: false
|
51
|
+
type: :runtime
|
52
|
+
- !ruby/object:Gem::Dependency
|
54
53
|
version_requirements: &id003 !ruby/object:Gem::Requirement
|
55
54
|
none: false
|
56
55
|
requirements:
|
@@ -61,10 +60,10 @@ dependencies:
|
|
61
60
|
- 0
|
62
61
|
version: "0"
|
63
62
|
requirement: *id003
|
64
|
-
type: :development
|
65
63
|
name: rspec
|
66
|
-
- !ruby/object:Gem::Dependency
|
67
64
|
prerelease: false
|
65
|
+
type: :development
|
66
|
+
- !ruby/object:Gem::Dependency
|
68
67
|
version_requirements: &id004 !ruby/object:Gem::Requirement
|
69
68
|
none: false
|
70
69
|
requirements:
|
@@ -75,10 +74,10 @@ dependencies:
|
|
75
74
|
- 0
|
76
75
|
version: "0"
|
77
76
|
requirement: *id004
|
78
|
-
type: :development
|
79
77
|
name: rake
|
80
|
-
- !ruby/object:Gem::Dependency
|
81
78
|
prerelease: false
|
79
|
+
type: :development
|
80
|
+
- !ruby/object:Gem::Dependency
|
82
81
|
version_requirements: &id005 !ruby/object:Gem::Requirement
|
83
82
|
none: false
|
84
83
|
requirements:
|
@@ -89,10 +88,10 @@ dependencies:
|
|
89
88
|
- 0
|
90
89
|
version: "0"
|
91
90
|
requirement: *id005
|
92
|
-
type: :development
|
93
91
|
name: sinatra
|
94
|
-
- !ruby/object:Gem::Dependency
|
95
92
|
prerelease: false
|
93
|
+
type: :development
|
94
|
+
- !ruby/object:Gem::Dependency
|
96
95
|
version_requirements: &id006 !ruby/object:Gem::Requirement
|
97
96
|
none: false
|
98
97
|
requirements:
|
@@ -103,10 +102,10 @@ dependencies:
|
|
103
102
|
- 0
|
104
103
|
version: "0"
|
105
104
|
requirement: *id006
|
106
|
-
type: :development
|
107
105
|
name: rbench
|
108
|
-
- !ruby/object:Gem::Dependency
|
109
106
|
prerelease: false
|
107
|
+
type: :development
|
108
|
+
- !ruby/object:Gem::Dependency
|
110
109
|
version_requirements: &id007 !ruby/object:Gem::Requirement
|
111
110
|
none: false
|
112
111
|
requirements:
|
@@ -119,8 +118,9 @@ dependencies:
|
|
119
118
|
- 11
|
120
119
|
version: 0.0.11
|
121
120
|
requirement: *id007
|
122
|
-
type: :development
|
123
121
|
name: tumbler
|
122
|
+
prerelease: false
|
123
|
+
type: :development
|
124
124
|
description: A kick-ass HTTP router for use in Rack & Sinatra
|
125
125
|
email: joshbuddy@gmail.com
|
126
126
|
executables: []
|