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.
- data/lib/http_router.rb +9 -22
- data/lib/http_router/node.rb +0 -21
- data/lib/http_router/node/lookup.rb +0 -10
- data/lib/http_router/node/path.rb +1 -5
- data/lib/http_router/node/request.rb +0 -4
- data/lib/http_router/node/root.rb +0 -8
- data/lib/http_router/request.rb +6 -0
- data/lib/http_router/version.rb +1 -1
- data/test/test_misc.rb +17 -19
- metadata +35 -35
data/lib/http_router.rb
CHANGED
@@ -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
|
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
|
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
|
-
|
212
|
+
@root[test_request]
|
213
|
+
!test_request.matches.empty?
|
218
214
|
end
|
219
|
-
supported_methods.empty? ?
|
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
|
data/lib/http_router/node.rb
CHANGED
@@ -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
|
-
|
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
|
data/lib/http_router/request.rb
CHANGED
@@ -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
|
data/lib/http_router/version.rb
CHANGED
data/test/test_misc.rb
CHANGED
@@ -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
|
-
|
34
|
-
|
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
|
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:
|
4
|
+
hash: 55
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
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-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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: []
|