http_router 0.2.5 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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)
@@ -18,7 +18,7 @@ end unless Rack::Utils.respond_to?(:uri_escape!)
18
18
 
19
19
  module Rack::Utils
20
20
  def uri_unescape(s)
21
- gsub(/((?:%[0-9a-fA-F]{2})+)/n){
21
+ s.to_s.gsub(/((?:%[0-9a-fA-F]{2})+)/n){
22
22
  [$1.delete('%')].pack('H*')
23
23
  }
24
24
  end
@@ -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
- if request_options.key?(method) #we care about the method
102
- unless current_node.request_method
103
- current_node.request_method = method
104
- end
105
- case RequestNode::RequestMethods.index(method) <=> RequestNode::RequestMethods.index(current_node.request_method)
106
- when 0 #use this node
107
- if request_options[method].is_a?(Regexp)
108
- new_node = router.request_node
109
- current_nodes[current_node_index] = new_node
110
- current_node.create_linear
111
- current_node.linear << [request_options[method], new_node]
112
- elsif request_options[method].is_a?(Array)
113
- current_node.create_lookup
114
- current_nodes[current_node_index] = request_options[method].map{|val| current_node.lookup[val] ||= router.request_node}
115
- else
116
- current_node.create_lookup
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
- else
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 << tester.consume(match, dupped_parts)
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 << @catchall.variable.consume(nil, parts)
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
@@ -1,4 +1,4 @@
1
1
  # encoding: utf-8
2
2
  class HttpRouter #:nodoc
3
- VERSION = '0.2.5'
3
+ VERSION = '0.3.0'
4
4
  end
@@ -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: 29
4
+ hash: 19
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 2
9
- - 5
10
- version: 0.2.5
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 00:00:00 -04:00
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: []