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 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: []