http_router 0.9.7 → 0.10.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.
@@ -24,8 +24,6 @@ class HttpRouter
24
24
  DoubleCompileError = Class.new(RuntimeError)
25
25
  # Raised an invalid request value is used
26
26
  InvalidRequestValueError = Class.new(RuntimeError)
27
- # Raised when there are extra parameters passed in to #url
28
- TooManyParametersException = Class.new(RuntimeError)
29
27
 
30
28
  # Creates a new HttpRouter.
31
29
  # Can be called with either <tt>HttpRouter.new(proc{|env| ... }, { .. options .. })</tt> or with the first argument omitted.
@@ -104,7 +102,8 @@ class HttpRouter
104
102
  # Returns the route object.
105
103
  def options(path, opts = {}, &app); add_with_request_method(path, :options, opts, &app); end
106
104
 
107
- # Performs recoginition without actually calling the application.
105
+ # Performs recoginition without actually calling the application and returns an array of all
106
+ # matching routes or nil if no match was found.
108
107
  def recognize(env)
109
108
  call(env, false)
110
109
  end
@@ -116,14 +115,10 @@ class HttpRouter
116
115
  rack_request = ::Rack::Request.new(env)
117
116
  request = Request.new(rack_request.path_info, rack_request, perform_call)
118
117
  response = catch(:success) { @root[request] }
119
- if response
120
- response
121
- elsif response.nil?
122
- no_response(env, perform_call)
123
- elsif perform_call
124
- @default_app.call(env)
118
+ if perform_call
119
+ response or no_response(env)
125
120
  else
126
- nil
121
+ request.matches.empty? ? nil : request.matches
127
122
  end
128
123
  end
129
124
 
@@ -207,25 +202,17 @@ class HttpRouter
207
202
  env['PATH_INFO'] = ''
208
203
  end
209
204
 
210
- def no_response(env, perform_call = true)
205
+ def no_response(env)
211
206
  supported_methods = @known_methods.select do |m|
212
207
  next if m == env['REQUEST_METHOD']
213
208
  test_env = ::Rack::Request.new(env.clone)
214
209
  test_env.env['REQUEST_METHOD'] = m
215
210
  test_env.env['_HTTP_ROUTER_405_TESTING_ACCEPTANCE'] = true
216
211
  test_request = Request.new(test_env.path_info, test_env, 405)
217
- catch(:success) { @root[test_request] }
212
+ @root[test_request]
213
+ !test_request.matches.empty?
218
214
  end
219
- supported_methods.empty? ? (perform_call ? @default_app.call(env) : nil) : [405, {'Allow' => supported_methods.sort.join(", ")}, []]
220
- end
221
-
222
- def to_s
223
- "#<HttpRouter:0x#{object_id.to_s(16)} number of routes (#{routes.size}) ignore_trailing_slash? (#{ignore_trailing_slash?}) redirect_trailing_slash? (#{redirect_trailing_slash?}) known_methods (#{known_methods.to_a.join(', ')})>"
224
- end
225
-
226
- def inspect
227
- head = to_s
228
- "#{to_s}\n#{'=' * head.size}\n#{@root.inspect}"
215
+ supported_methods.empty? ? @default_app.call(env) : [405, {'Allow' => supported_methods.sort.join(", ")}, []]
229
216
  end
230
217
 
231
218
  private
@@ -64,27 +64,6 @@ class HttpRouter
64
64
  false
65
65
  end
66
66
 
67
- def inspect
68
- ins = "#{' ' * depth}#{inspect_label}"
69
- body = inspect_matchers_body
70
- unless body =~ /^\s*$/
71
- ins << "\n" << body
72
- end
73
- ins
74
- end
75
-
76
- def inspect_label
77
- "#{self.class.name.split("::").last} (#{@matchers.size} matchers)"
78
- end
79
-
80
- def inspect_matchers_body
81
- @matchers.map{ |m| m.inspect}.join("\n")
82
- end
83
-
84
- def depth
85
- @parent.send(:depth) + 1
86
- end
87
-
88
67
  private
89
68
  def inject_root_methods(code = nil, &blk)
90
69
  code ? root.methods_module.module_eval(code) : root.methods_module.module_eval(&blk)
@@ -14,16 +14,6 @@ class HttpRouter
14
14
  other.class == self.class
15
15
  end
16
16
 
17
- def inspect_matchers_body
18
- @map.map { |key, values|
19
- ins = "#{' ' * depth}when #{key.inspect}:\n"
20
- ins << values.map{|v| v.inspect}.join("\n") }.join("\n")
21
- end
22
-
23
- def inspect_label
24
- "#{self.class.name}"
25
- end
26
-
27
17
  def to_code
28
18
  lookup_ivar = inject_root_ivar(@map)
29
19
  method_prefix = "lookup_#{root.next_counter} "
@@ -42,7 +42,7 @@ class HttpRouter
42
42
  response = @router.process_destination_path(#{path_ivar}, env)
43
43
  router.pass_on_response(response) ? throw(:pass) : throw(:success, response)
44
44
  else
45
- throw :success, Response.new(request, #{path_ivar})
45
+ request.matched_route(Response.new(request, #{path_ivar}))
46
46
  end
47
47
  #{"end" unless route.match_partially?}
48
48
  end
@@ -53,10 +53,6 @@ class HttpRouter
53
53
  other == self
54
54
  end
55
55
 
56
- def inspect_label
57
- "Path: #{original_path.inspect} for route #{route.named || 'unnamed route'} to #{route.dest.inspect}"
58
- end
59
-
60
56
  private
61
57
  def raw_url(args, options)
62
58
  raise InvalidRouteException
@@ -36,10 +36,6 @@ class HttpRouter
36
36
  code << "\n #{super}\nend"
37
37
  end
38
38
 
39
- def inspect_label
40
- "#{self.class.name.split("::").last} #{opts.inspect} (#{@matchers.size} matchers)"
41
- end
42
-
43
39
  private
44
40
  def to_code_condition(k, v)
45
41
  case v
@@ -28,14 +28,6 @@ class HttpRouter
28
28
  name
29
29
  end
30
30
 
31
- def depth
32
- 0
33
- end
34
-
35
- def inspect_label
36
- "Root (#{@matchers.size} matchers)"
37
- end
38
-
39
31
  private
40
32
  def compile
41
33
  root.extend(root.methods_module)
@@ -1,6 +1,7 @@
1
1
  class HttpRouter
2
2
  class Request
3
3
  attr_accessor :path, :params, :rack_request, :extra_env, :continue, :passed_with
4
+ attr_reader :matches
4
5
  alias_method :rack, :rack_request
5
6
  def initialize(path, rack_request, perform_call)
6
7
  @rack_request, @perform_call = rack_request, perform_call
@@ -9,12 +10,17 @@ class HttpRouter
9
10
  @path.push('') if path[-1] == ?/
10
11
  @extra_env = {}
11
12
  @params = []
13
+ @matches = []
12
14
  end
13
15
 
14
16
  def joined_path
15
17
  @path * '/'
16
18
  end
17
19
 
20
+ def matched_route(response)
21
+ @matches << response
22
+ end
23
+
18
24
  def perform_call
19
25
  @perform_call == true
20
26
  end
@@ -1,4 +1,4 @@
1
1
  # encoding: utf-8
2
2
  class HttpRouter #:nodoc
3
- VERSION = '0.9.7'
3
+ VERSION = '0.10.0'
4
4
  end
@@ -30,8 +30,22 @@ class TestMisc < MiniTest::Unit::TestCase
30
30
  def test_redirect_trailing_slash
31
31
  r = HttpRouter.new(:redirect_trailing_slash => true) { add('/hi').to(:test) }
32
32
  response = r.recognize(Rack::MockRequest.env_for('/hi/'))
33
- assert 304, response[0]
34
- assert "/hi", response[1]["Location"]
33
+ assert_equal nil, response
34
+ end
35
+
36
+ def test_multi_recognize
37
+ r1, r2, r3, r4 = router {
38
+ add('/hi/there')
39
+ add('/:var/:var2')
40
+ add('/hi/:var2')
41
+ add('/:var1/there')
42
+ }
43
+ response = router.recognize(Rack::MockRequest.env_for('/hi/there'))
44
+ assert_equal [r1, r2, r3, r4], response.map{|resp| resp.path.route}
45
+ response = router.recognize(Rack::MockRequest.env_for('/hi/var'))
46
+ assert_equal [r2, r3], response.map{|resp| resp.path.route}
47
+ response = router.recognize(Rack::MockRequest.env_for('/you/there'))
48
+ assert_equal [r2, r4], response.map{|resp| resp.path.route}
35
49
  end
36
50
 
37
51
  def test_multi_name_gen
@@ -50,7 +64,7 @@ class TestMisc < MiniTest::Unit::TestCase
50
64
  assert_equal '/test/var', r.url(:route, "var")
51
65
  end
52
66
 
53
- def test_too_many_params
67
+ def test_regex_generation
54
68
  r = HttpRouter.new
55
69
  r.add(%r|/test/.*|, :path_for_generation => '/test/:variable').name(:route).default_destination
56
70
  assert_equal '/test/var', r.url(:route, "var")
@@ -58,12 +72,6 @@ class TestMisc < MiniTest::Unit::TestCase
58
72
  assert_raises(HttpRouter::InvalidRouteException) { r.url(:route) }
59
73
  end
60
74
 
61
- def test_too_many_args
62
- r = HttpRouter.new
63
- r.add('/').name(:route).default_destination
64
- assert_raises(HttpRouter::TooManyParametersException) { r.url(:route, "hi") }
65
- end
66
-
67
75
  def test_public_interface
68
76
  methods = HttpRouter.public_instance_methods.map(&:to_sym)
69
77
  assert methods.include?(:url_mount)
@@ -78,14 +86,4 @@ class TestMisc < MiniTest::Unit::TestCase
78
86
  assert methods.include?(:rewrite_partial_path_info)
79
87
  assert methods.include?(:rewrite_path_info)
80
88
  end
81
-
82
- def test_to_s_and_inspect
83
- router = HttpRouter.new
84
- router.add('/').to(:test)
85
- router.add('/test').to(:test2)
86
- router.post('/test').to(:test3)
87
- assert router.to_s.match(/^#<HttpRouter:0x[0-9a-f]+ number of routes \(3\) ignore_trailing_slash\? \(true\) redirect_trailing_slash\? \(false\) known_methods \(POST\)>$/)
88
- assert router.inspect.match(/^#<HttpRouter:0x[0-9a-f]+ number of routes \(3\) ignore_trailing_slash\? \(true\) redirect_trailing_slash\? \(false\) known_methods \(POST\)>/)
89
- assert router.inspect.match(/Path: "\/test" for route unnamed route to :test3/)
90
- end
91
89
  end
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: 53
4
+ hash: 55
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 9
9
- - 7
10
- version: 0.9.7
8
+ - 10
9
+ - 0
10
+ version: 0.10.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Joshua Hull
@@ -15,13 +15,12 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-08-09 00:00:00 -07:00
18
+ date: 2011-08-01 00:00:00 -07:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
- name: rack
23
22
  prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
23
+ version_requirements: &id001 !ruby/object:Gem::Requirement
25
24
  none: false
26
25
  requirements:
27
26
  - - ">="
@@ -32,12 +31,12 @@ dependencies:
32
31
  - 0
33
32
  - 0
34
33
  version: 1.0.0
34
+ requirement: *id001
35
+ name: rack
35
36
  type: :runtime
36
- version_requirements: *id001
37
37
  - !ruby/object:Gem::Dependency
38
- name: url_mount
39
38
  prerelease: false
40
- requirement: &id002 !ruby/object:Gem::Requirement
39
+ version_requirements: &id002 !ruby/object:Gem::Requirement
41
40
  none: false
42
41
  requirements:
43
42
  - - ~>
@@ -48,12 +47,12 @@ dependencies:
48
47
  - 2
49
48
  - 1
50
49
  version: 0.2.1
50
+ requirement: *id002
51
+ name: url_mount
51
52
  type: :runtime
52
- version_requirements: *id002
53
53
  - !ruby/object:Gem::Dependency
54
- name: minitest
55
54
  prerelease: false
56
- requirement: &id003 !ruby/object:Gem::Requirement
55
+ version_requirements: &id003 !ruby/object:Gem::Requirement
57
56
  none: false
58
57
  requirements:
59
58
  - - ~>
@@ -64,12 +63,12 @@ dependencies:
64
63
  - 0
65
64
  - 0
66
65
  version: 2.0.0
66
+ requirement: *id003
67
+ name: minitest
67
68
  type: :development
68
- version_requirements: *id003
69
69
  - !ruby/object:Gem::Dependency
70
- name: code_stats
71
70
  prerelease: false
72
- requirement: &id004 !ruby/object:Gem::Requirement
71
+ version_requirements: &id004 !ruby/object:Gem::Requirement
73
72
  none: false
74
73
  requirements:
75
74
  - - ">="
@@ -78,12 +77,12 @@ dependencies:
78
77
  segments:
79
78
  - 0
80
79
  version: "0"
80
+ requirement: *id004
81
+ name: code_stats
81
82
  type: :development
82
- version_requirements: *id004
83
83
  - !ruby/object:Gem::Dependency
84
- name: rake
85
84
  prerelease: false
86
- requirement: &id005 !ruby/object:Gem::Requirement
85
+ version_requirements: &id005 !ruby/object:Gem::Requirement
87
86
  none: false
88
87
  requirements:
89
88
  - - ~>
@@ -94,12 +93,12 @@ dependencies:
94
93
  - 8
95
94
  - 7
96
95
  version: 0.8.7
96
+ requirement: *id005
97
+ name: rake
97
98
  type: :development
98
- version_requirements: *id005
99
99
  - !ruby/object:Gem::Dependency
100
- name: rbench
101
100
  prerelease: false
102
- requirement: &id006 !ruby/object:Gem::Requirement
101
+ version_requirements: &id006 !ruby/object:Gem::Requirement
103
102
  none: false
104
103
  requirements:
105
104
  - - ">="
@@ -108,12 +107,12 @@ dependencies:
108
107
  segments:
109
108
  - 0
110
109
  version: "0"
110
+ requirement: *id006
111
+ name: rbench
111
112
  type: :development
112
- version_requirements: *id006
113
113
  - !ruby/object:Gem::Dependency
114
- name: json
115
114
  prerelease: false
116
- requirement: &id007 !ruby/object:Gem::Requirement
115
+ version_requirements: &id007 !ruby/object:Gem::Requirement
117
116
  none: false
118
117
  requirements:
119
118
  - - ">="
@@ -122,12 +121,12 @@ dependencies:
122
121
  segments:
123
122
  - 0
124
123
  version: "0"
124
+ requirement: *id007
125
+ name: json
125
126
  type: :development
126
- version_requirements: *id007
127
127
  - !ruby/object:Gem::Dependency
128
- name: phocus
129
128
  prerelease: false
130
- requirement: &id008 !ruby/object:Gem::Requirement
129
+ version_requirements: &id008 !ruby/object:Gem::Requirement
131
130
  none: false
132
131
  requirements:
133
132
  - - ">="
@@ -136,12 +135,12 @@ dependencies:
136
135
  segments:
137
136
  - 0
138
137
  version: "0"
138
+ requirement: *id008
139
+ name: phocus
139
140
  type: :development
140
- version_requirements: *id008
141
141
  - !ruby/object:Gem::Dependency
142
- name: bundler
143
142
  prerelease: false
144
- requirement: &id009 !ruby/object:Gem::Requirement
143
+ version_requirements: &id009 !ruby/object:Gem::Requirement
145
144
  none: false
146
145
  requirements:
147
146
  - - ~>
@@ -152,12 +151,12 @@ dependencies:
152
151
  - 0
153
152
  - 0
154
153
  version: 1.0.0
154
+ requirement: *id009
155
+ name: bundler
155
156
  type: :development
156
- version_requirements: *id009
157
157
  - !ruby/object:Gem::Dependency
158
- name: thin
159
158
  prerelease: false
160
- requirement: &id010 !ruby/object:Gem::Requirement
159
+ version_requirements: &id010 !ruby/object:Gem::Requirement
161
160
  none: false
162
161
  requirements:
163
162
  - - "="
@@ -168,8 +167,9 @@ dependencies:
168
167
  - 2
169
168
  - 8
170
169
  version: 1.2.8
170
+ requirement: *id010
171
+ name: thin
171
172
  type: :development
172
- version_requirements: *id010
173
173
  description: This library allows you to recognize and build URLs in a Rack application.
174
174
  email: joshbuddy@gmail.com
175
175
  executables: []