http_router 0.1.2 → 0.1.3
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/.gitignore +0 -1
- data/README.rdoc +2 -0
- data/VERSION +1 -1
- data/benchmarks/gen2.rb +57 -0
- data/benchmarks/generation_bm.rb +73 -0
- data/benchmarks/rack_mount.rb +76 -0
- data/benchmarks/rack_recognition_bm.rb +50 -0
- data/benchmarks/rec2.rb +62 -0
- data/benchmarks/recognition_bm.rb +41 -0
- data/examples/glob.ru +11 -0
- data/examples/simple.ru +8 -0
- data/examples/simple_with_mapper.ru +15 -0
- data/examples/variable.ru +9 -0
- data/examples/variable_with_regex.ru +10 -0
- data/lib/ext/rack/rack_mapper.rb +11 -8
- data/lib/http_router/node.rb +14 -8
- data/lib/http_router.rb +4 -0
- metadata +14 -3
data/.gitignore
CHANGED
data/README.rdoc
CHANGED
@@ -20,6 +20,8 @@ This is very new code. Lots of stuff probably doesn't work right. I will likely
|
|
20
20
|
|
21
21
|
== Usage
|
22
22
|
|
23
|
+
Please see the examples directory for a bunch of awesome rackup file examples, with tonnes of commentary.
|
24
|
+
|
23
25
|
=== <tt>HttpRouter.new</tt>
|
24
26
|
|
25
27
|
Takes the following options:
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.3
|
data/benchmarks/gen2.rb
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rbench'
|
3
|
+
#require 'lib/usher'
|
4
|
+
require 'lib/http_router'
|
5
|
+
|
6
|
+
u = HttpRouter.new
|
7
|
+
u.add('/simple') .name(:simple).compile
|
8
|
+
u.add('/simple/:variable') .name(:one_variable).compile
|
9
|
+
u.add('/simple/:var1/:var2/:var3') .name(:three_variables).compile
|
10
|
+
u.add('/simple/:v1/:v2/:v3/:v4/:v5/:v6/:v7/:v8') .name(:eight_variables).compile
|
11
|
+
u.add('/with_condition/:cond1/:cond2').matching(:cond1 => /^\d+$/, :cond2 => /^[a-z]+$/) .name(:two_conditions).compile
|
12
|
+
|
13
|
+
TIMES = 50_000
|
14
|
+
|
15
|
+
RBench.run(TIMES) do
|
16
|
+
|
17
|
+
group "named" do
|
18
|
+
report "simple" do
|
19
|
+
u.url(:simple)
|
20
|
+
end
|
21
|
+
|
22
|
+
report "one variable (through array)" do
|
23
|
+
u.url(:one_variable, 'variable')
|
24
|
+
end
|
25
|
+
|
26
|
+
report "one variable (through hash)" do
|
27
|
+
u.url(:one_variable, :variable => 'variable')
|
28
|
+
end
|
29
|
+
|
30
|
+
report "three variable (through array)" do
|
31
|
+
u.url(:three_variables, 'var1', 'var2', 'var3')
|
32
|
+
end
|
33
|
+
|
34
|
+
report "three variable (through hash)" do
|
35
|
+
u.url(:three_variables, :var1 => 'var1', :var2 => 'var2', :var3 => 'var3')
|
36
|
+
end
|
37
|
+
|
38
|
+
report "eight variable (through array)" do
|
39
|
+
u.url(:eight_variables, 'var1', 'var2', 'var3', 'var4', 'var5', 'var6', 'var7', 'var8')
|
40
|
+
end
|
41
|
+
|
42
|
+
report "eight variable (through hash)" do
|
43
|
+
u.url(:eight_variables, :v1 => 'var1', :v2 => 'var2', :v3 => 'var3', :v4 => 'var4', :v5 => 'var5', :v6 => 'var6', :v7 => 'var7', :v8 => 'var8')
|
44
|
+
end
|
45
|
+
|
46
|
+
report "three variable + three extras" do
|
47
|
+
u.url(:three_variables, :var1 => 'var1', :var2 => 'var2', :var3 => 'var3', :var4 => 'var4', :var5 => 'var5', :var6 => 'var6')
|
48
|
+
end
|
49
|
+
|
50
|
+
report "three variable + five extras" do
|
51
|
+
u.url(:three_variables, :var1 => 'var1', :var2 => 'var2', :var3 => 'var3', :var4 => 'var4', :var5 => 'var5', :var6 => 'var6', :var7 => 'var7', :var8 => 'var8')
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
puts `ps -o rss= -p #{Process.pid}`.to_i
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rbench'
|
3
|
+
#require 'lib/usher'
|
4
|
+
require 'usher'
|
5
|
+
|
6
|
+
u = Usher.new(:generator => Usher::Util::Generators::URL.new)
|
7
|
+
u.add_route('/simple') .name(:simple)
|
8
|
+
u.add_route('/simple/:variable') .name(:one_variable)
|
9
|
+
u.add_route('/simple/:var1/:var2/:var3') .name(:three_variables)
|
10
|
+
u.add_route('/simple/:v1/:v2/:v3/:v4/:v5/:v6/:v7/:v8') .name(:eight_variables)
|
11
|
+
u.add_route('/with_condition/:cond1/:cond2', :requirements => {:cond1 => /^\d+$/, :cond2 => /^[a-z]+$/}) .name(:two_conditions)
|
12
|
+
u.add_route('/with_condition/{:cond1,^\d+$}/{:cond2,^[a-z]+$}') .name(:two_implicit_conditions)
|
13
|
+
#u.add_route('/blog/:page', :default_values => {:page => 1}) .name(:default_value)
|
14
|
+
#u.add_route('/blog', :default_values => {:page => 1}) .name(:default_value_not_as_variable)
|
15
|
+
#
|
16
|
+
TIMES = 50_000
|
17
|
+
|
18
|
+
RBench.run(TIMES) do
|
19
|
+
|
20
|
+
group "named" do
|
21
|
+
report "simple" do
|
22
|
+
u.generator.generate(:simple)
|
23
|
+
end
|
24
|
+
|
25
|
+
report "one variable (through array)" do
|
26
|
+
u.generator.generate(:one_variable, 'variable')
|
27
|
+
end
|
28
|
+
|
29
|
+
report "one variable (through hash)" do
|
30
|
+
u.generator.generate(:one_variable, :variable => 'variable')
|
31
|
+
end
|
32
|
+
|
33
|
+
report "three variable (through array)" do
|
34
|
+
u.generator.generate(:three_variables, ['var1', 'var2', 'var3'])
|
35
|
+
end
|
36
|
+
|
37
|
+
report "three variable (through hash)" do
|
38
|
+
u.generator.generate(:three_variables, :var1 => 'var1', :var2 => 'var2', :var3 => 'var3')
|
39
|
+
end
|
40
|
+
|
41
|
+
report "eight variable (through array)" do
|
42
|
+
u.generator.generate(:eight_variables, ['var1', 'var2', 'var3', 'var4', 'var5', 'var6', 'var7', 'var8'])
|
43
|
+
end
|
44
|
+
|
45
|
+
report "eight variable (through hash)" do
|
46
|
+
u.generator.generate(:eight_variables, :v1 => 'var1', :v2 => 'var2', :v3 => 'var3', :v4 => 'var4', :v5 => 'var5', :v6 => 'var6', :v7 => 'var7', :v8 => 'var8')
|
47
|
+
end
|
48
|
+
|
49
|
+
report "three variable + three extras" do
|
50
|
+
u.generator.generate(:three_variables, :var1 => 'var1', :var2 => 'var2', :var3 => 'var3', :var4 => 'var4', :var5 => 'var5', :var6 => 'var6')
|
51
|
+
end
|
52
|
+
|
53
|
+
report "three variable + five extras" do
|
54
|
+
u.generator.generate(:three_variables, :var1 => 'var1', :var2 => 'var2', :var3 => 'var3', :var4 => 'var4', :var5 => 'var5', :var6 => 'var6', :var7 => 'var7', :var8 => 'var8')
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
#group "defaults" do
|
60
|
+
# report "default variable" do
|
61
|
+
# u.generator.generate(:default_value)
|
62
|
+
# end
|
63
|
+
#
|
64
|
+
# report "default variable not represented in path" do
|
65
|
+
# u.generator.generate(:default_value_not_as_variable)
|
66
|
+
# end
|
67
|
+
#
|
68
|
+
#
|
69
|
+
#end
|
70
|
+
|
71
|
+
|
72
|
+
end
|
73
|
+
puts `ps -o rss= -p #{Process.pid}`.to_i
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rbench'
|
3
|
+
require 'rack'
|
4
|
+
require 'rack/mount'
|
5
|
+
require '../usher/lib/usher'
|
6
|
+
require 'lib/http_router'
|
7
|
+
|
8
|
+
set = Rack::Mount::RouteSet.new do |set|
|
9
|
+
set.add_route(proc{|env| [200, {'Content-type'=>'text/html'}, []]}, {:path => '/simple'}, {}, :simple)
|
10
|
+
set.add_route(proc{|env| [200, {'Content-type'=>'text/html'}, []]}, {:path => '/simple/again'}, {}, :again)
|
11
|
+
set.add_route(proc{|env| [200, {'Content-type'=>'text/html'}, []]}, {:path => '/dynamic/:variable'}, {}, :variable)
|
12
|
+
end
|
13
|
+
|
14
|
+
u = Usher::Interface.for(:rack)
|
15
|
+
u.add('/simple').to(proc{|env| [200, {'Content-type'=>'text/html'}, []]})
|
16
|
+
u.add('/simple/again').to(proc{|env| [200, {'Content-type'=>'text/html'}, []]})
|
17
|
+
u.add('/dynamic/anything').to(proc{|env| [200, {'Content-type'=>'text/html'}, []]})
|
18
|
+
|
19
|
+
hr = HttpRouter.new
|
20
|
+
hr.add('/simple').to(proc{|env| [200, {'Content-type'=>'text/html'}, []]})
|
21
|
+
hr.add('/simple/again').to(proc{|env| [200, {'Content-type'=>'text/html'}, []]})
|
22
|
+
hr.add('/dynamic/anything').to(proc{|env| [200, {'Content-type'=>'text/html'}, []]})
|
23
|
+
|
24
|
+
TIMES = 50_000
|
25
|
+
|
26
|
+
simple_env = Rack::MockRequest.env_for('/simple')
|
27
|
+
simple2_env = Rack::MockRequest.env_for('/simple/again')
|
28
|
+
simple_and_dynamic_env = Rack::MockRequest.env_for('/dynamic/anything')
|
29
|
+
|
30
|
+
RBench.run(TIMES) do
|
31
|
+
|
32
|
+
report "2 levels, static" do
|
33
|
+
set.url(simple_env, :simple)
|
34
|
+
end
|
35
|
+
|
36
|
+
report "4 levels, static" do
|
37
|
+
set.url(simple_env, :again)
|
38
|
+
end
|
39
|
+
|
40
|
+
report "4 levels, 1 dynamic" do
|
41
|
+
set.url(simple_env, :variable, {:variable => 'onemore'})
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
RBench.run(TIMES) do
|
47
|
+
|
48
|
+
report "2 levels, static" do
|
49
|
+
set.url(simple_env, :simple)
|
50
|
+
end
|
51
|
+
|
52
|
+
report "4 levels, static" do
|
53
|
+
set.url(simple_env, :again)
|
54
|
+
end
|
55
|
+
|
56
|
+
report "4 levels, 1 dynamic" do
|
57
|
+
set.url(simple_env, :variable, {:variable => 'onemore'})
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
RBench.run(TIMES) do
|
63
|
+
|
64
|
+
report "2 levels, static" do
|
65
|
+
set.url(simple_env, :simple)
|
66
|
+
end
|
67
|
+
|
68
|
+
report "4 levels, static" do
|
69
|
+
set.url(simple_env, :again)
|
70
|
+
end
|
71
|
+
|
72
|
+
report "4 levels, 1 dynamic" do
|
73
|
+
set.url(simple_env, :variable, {:variable => 'onemore'})
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rbench'
|
3
|
+
require '../usher/lib/usher'
|
4
|
+
|
5
|
+
u = Usher::Interface.for(:rack)
|
6
|
+
u.add('/simple').to(proc{|env| [200, {'Content-type'=>'text/html'}, []]})
|
7
|
+
u.add('/simple/again').to(proc{|env| [200, {'Content-type'=>'text/html'}, []]})
|
8
|
+
u.add('/simple/again/and/again').to(proc{|env| [200, {'Content-type'=>'text/html'}, []]})
|
9
|
+
u.add('/dynamic/:variable').to(proc{|env| [200, {'Content-type'=>'text/html'}, []]})
|
10
|
+
u.add('/rails/:controller/:action/:id').to(proc{|env| [200, {'Content-type'=>'text/html'}, []]})
|
11
|
+
u.add('/greedy/{!greed,.*}').to(proc{|env| [200, {'Content-type'=>'text/html'}, []]})
|
12
|
+
|
13
|
+
TIMES = 50_000
|
14
|
+
|
15
|
+
simple_env = Rack::MockRequest.env_for('/simple')
|
16
|
+
simple2_env = Rack::MockRequest.env_for('/simple/again')
|
17
|
+
simple3_env = Rack::MockRequest.env_for('/simple/again/and/again')
|
18
|
+
simple_and_dynamic_env = Rack::MockRequest.env_for('/dynamic/anything')
|
19
|
+
simple_and_dynamic_env1 = Rack::MockRequest.env_for('/rails/controller/action/id')
|
20
|
+
simple_and_dynamic_env2 = Rack::MockRequest.env_for('/greedy/controller/action/id')
|
21
|
+
|
22
|
+
RBench.run(TIMES) do
|
23
|
+
|
24
|
+
report "2 levels, static" do
|
25
|
+
u.call(simple_env).first == 200 or raise
|
26
|
+
end
|
27
|
+
|
28
|
+
report "4 levels, static" do
|
29
|
+
u.call(simple2_env).first == 200 or raise
|
30
|
+
end
|
31
|
+
|
32
|
+
report "8 levels, static" do
|
33
|
+
u.call(simple3_env).first == 200 or raise
|
34
|
+
end
|
35
|
+
|
36
|
+
report "4 levels, 1 dynamic" do
|
37
|
+
u.call(simple_and_dynamic_env).first == 200 or raise
|
38
|
+
end
|
39
|
+
|
40
|
+
report "8 levels, 3 dynamic" do
|
41
|
+
u.call(simple_and_dynamic_env1).first == 200 or raise
|
42
|
+
end
|
43
|
+
|
44
|
+
report "4 levels, 1 greedy" do
|
45
|
+
u.call(simple_and_dynamic_env2).first == 200 or raise
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
puts `ps -o rss= -p #{Process.pid}`.to_i
|
data/benchmarks/rec2.rb
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rbench'
|
3
|
+
require 'lib/http_router'
|
4
|
+
|
5
|
+
u = HttpRouter.new
|
6
|
+
u.add('/simple').to {|env| [200, {'Content-type'=>'text/html'}, []]}
|
7
|
+
u.add('/simple/again').compile.to {|env| [200, {'Content-type'=>'text/html'}, []]}
|
8
|
+
u.add('/simple/again/and/again').compile.to {|env| [200, {'Content-type'=>'text/html'}, []]}
|
9
|
+
u.add('/dynamic/:variable').compile.to {|env| [200, {'Content-type'=>'text/html'}, []]}
|
10
|
+
u.add('/rails/:controller/:action/:id').compile.to {|env| [200, {'Content-type'=>'text/html'}, []]}
|
11
|
+
u.add('/greedy/:greed').matching(:greed => /.*/).compile.to {|env| [200, {'Content-type'=>'text/html'}, []]}
|
12
|
+
#u.add('/greedy/hey.:greed.html').to {|env| [200, {'Content-type'=>'text/html'}, []]}
|
13
|
+
|
14
|
+
#puts Benchmark.measure {
|
15
|
+
# ('aa'..'nn').each do |first|
|
16
|
+
# ('a'..'n').each do |second|
|
17
|
+
# u.add("/#{first}/#{second}").compile
|
18
|
+
# end
|
19
|
+
# end
|
20
|
+
#
|
21
|
+
# puts "u.routes.size: #{u.routes.size}"
|
22
|
+
#}
|
23
|
+
#
|
24
|
+
TIMES = 50_000
|
25
|
+
|
26
|
+
simple_env = Rack::MockRequest.env_for('/simple')
|
27
|
+
simple2_env = Rack::MockRequest.env_for('/simple/again')
|
28
|
+
simple3_env = Rack::MockRequest.env_for('/simple/again/and/again')
|
29
|
+
simple_and_dynamic_env = Rack::MockRequest.env_for('/dynamic/anything')
|
30
|
+
simple_and_dynamic_env1 = Rack::MockRequest.env_for('/rails/controller/action/id')
|
31
|
+
simple_and_dynamic_env2 = Rack::MockRequest.env_for('/greedy/controller/action/id')
|
32
|
+
simple_and_dynamic_env3 = Rack::MockRequest.env_for('/greedy/hey.hello.html')
|
33
|
+
|
34
|
+
RBench.run(TIMES) do
|
35
|
+
|
36
|
+
report "2 levels, static" do
|
37
|
+
u.call(simple_env).first == 200 or raise
|
38
|
+
end
|
39
|
+
|
40
|
+
report "4 levels, static" do
|
41
|
+
u.call(simple2_env).first == 200 or raise
|
42
|
+
end
|
43
|
+
|
44
|
+
report "8 levels, static" do
|
45
|
+
u.call(simple3_env).first == 200 or raise
|
46
|
+
end
|
47
|
+
|
48
|
+
report "4 levels, 1 dynamic" do
|
49
|
+
u.call(simple_and_dynamic_env).first == 200 or raise
|
50
|
+
end
|
51
|
+
|
52
|
+
report "8 levels, 3 dynamic" do
|
53
|
+
u.call(simple_and_dynamic_env1).first == 200 or raise
|
54
|
+
end
|
55
|
+
|
56
|
+
report "4 levels, 1 greedy" do
|
57
|
+
u.call(simple_and_dynamic_env2).first == 200 or raise
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
puts `ps -o rss= -p #{Process.pid}`.to_i
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rbench'
|
3
|
+
require 'usher'
|
4
|
+
|
5
|
+
u = Usher.new(:generator => Usher::Util::Generators::URL.new)
|
6
|
+
u.add_route('/simple')
|
7
|
+
u.add_route('/simple/again')
|
8
|
+
u.add_route('/simple/again/and/again')
|
9
|
+
u.add_route('/dynamic/:variable')
|
10
|
+
u.add_route('/rails/:controller/:action/:id')
|
11
|
+
u.add_route('/greedy/{!greed,.*}')
|
12
|
+
|
13
|
+
TIMES = 50_000
|
14
|
+
|
15
|
+
RBench.run(TIMES) do
|
16
|
+
|
17
|
+
report "2 levels, static" do
|
18
|
+
u.recognize_path('/simple')
|
19
|
+
end
|
20
|
+
|
21
|
+
report "4 levels, static" do
|
22
|
+
u.recognize_path('/simple/again')
|
23
|
+
end
|
24
|
+
|
25
|
+
report "8 levels, static" do
|
26
|
+
u.recognize_path('/simple/again/and/again')
|
27
|
+
end
|
28
|
+
|
29
|
+
report "4 levels, 1 dynamic" do
|
30
|
+
u.recognize_path('/dynamic/anything')
|
31
|
+
end
|
32
|
+
|
33
|
+
report "8 levels, 3 dynamic" do
|
34
|
+
u.recognize_path('/rails/controller/action/id')
|
35
|
+
end
|
36
|
+
|
37
|
+
report "4 levels, 1 greedy" do
|
38
|
+
u.recognize_path('/greedy/controller/action/id')
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
data/examples/glob.ru
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'http_router'
|
2
|
+
|
3
|
+
run HttpRouter.new {
|
4
|
+
get('/*glob').to { |env| [200, {'Content-type' => 'text/plain'}, ["My glob is\n#{env['router.params'][:glob].map{|v| " * #{v}\n"}.join}"]]}
|
5
|
+
}
|
6
|
+
|
7
|
+
# crapbook-pro:~ joshua$ curl http://127.0.0.1:3000/123/345/123
|
8
|
+
# My glob is
|
9
|
+
# * 123
|
10
|
+
# * 345
|
11
|
+
# * 123
|
data/examples/simple.ru
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'http_router'
|
2
|
+
HttpRouter.override_rack_mapper!
|
3
|
+
|
4
|
+
map('/get/:id') { |env|
|
5
|
+
[200, {'Content-type' => 'text/plain'}, ["My id is #{env['router.params'][:id]}\n"]]
|
6
|
+
}
|
7
|
+
|
8
|
+
post('/get/:id') { |env|
|
9
|
+
[200, {'Content-type' => 'text/plain'}, ["My id is #{env['router.params'][:id]} and you posted!\n"]]
|
10
|
+
}
|
11
|
+
|
12
|
+
# crapbook-pro:~ joshua$ curl http://127.0.0.1:3000/get/123
|
13
|
+
# My id is 123
|
14
|
+
# crapbook-pro:~ joshua$ curl -X POST http://127.0.0.1:3000/get/123
|
15
|
+
# My id is 123 and you posted!
|
@@ -0,0 +1,9 @@
|
|
1
|
+
require 'http_router'
|
2
|
+
|
3
|
+
run HttpRouter.new {
|
4
|
+
get('/:variable').to { |env| [200, {'Content-type' => 'text/plain'}, ["my variables are\n#{env['router.params'].inspect}\n"]]}
|
5
|
+
}
|
6
|
+
|
7
|
+
# crapbook-pro:~ joshua$ curl http://127.0.0.1:3000/heyguys
|
8
|
+
# my variables are
|
9
|
+
# {:variable=>"heyguys"}
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require 'http_router'
|
2
|
+
|
3
|
+
run HttpRouter.new {
|
4
|
+
get('/get/:id').matching(:id => /\d+/).to { |env| [200, {'Content-type' => 'text/plain'}, ["id is #{Integer(env['router.params'][:id]) * 2} * 2\n"]]}
|
5
|
+
}
|
6
|
+
|
7
|
+
# crapbook-pro:~ joshua$ curl http://127.0.0.1:3000/get/123
|
8
|
+
# id is 246 * 2
|
9
|
+
# crapbook-pro:~ joshua$ curl http://127.0.0.1:3000/get/asd
|
10
|
+
# Not Found
|
data/lib/ext/rack/rack_mapper.rb
CHANGED
@@ -2,17 +2,20 @@
|
|
2
2
|
# As well, add convenience methods for the request methods.
|
3
3
|
class Rack::Builder
|
4
4
|
def initialize(&block)
|
5
|
-
@router = HttpRouter.new
|
6
5
|
super
|
7
6
|
end
|
8
7
|
|
8
|
+
def router
|
9
|
+
@router ||= HttpRouter.new
|
10
|
+
end
|
11
|
+
|
9
12
|
# Maps a path to a block.
|
10
13
|
# @param path [String] Path to map to.
|
11
14
|
# @param options [Hash] Options for added path.
|
12
15
|
# @see HttpRouter#add
|
13
16
|
def map(path, options = nil, &block)
|
14
|
-
|
15
|
-
@ins <<
|
17
|
+
router.add(path).with_options(options).to(&block)
|
18
|
+
@ins << router unless @ins.last == router
|
16
19
|
end
|
17
20
|
|
18
21
|
# Maps a path with request methods `HEAD` and `GET` to a block.
|
@@ -20,7 +23,7 @@ class Rack::Builder
|
|
20
23
|
# @param options [Hash] Options for added path.
|
21
24
|
# @see HttpRouter#add
|
22
25
|
def get(path, options = nil, &block)
|
23
|
-
|
26
|
+
router.get(path).with_options(options).to(&block)
|
24
27
|
end
|
25
28
|
|
26
29
|
# Maps a path with request methods `POST` to a block.
|
@@ -28,7 +31,7 @@ class Rack::Builder
|
|
28
31
|
# @param options [Hash] Options for added path.
|
29
32
|
# @see HttpRouter#add
|
30
33
|
def post(path, options = nil, &block)
|
31
|
-
|
34
|
+
router.post(path).with_options(options).to(&block)
|
32
35
|
end
|
33
36
|
|
34
37
|
# Maps a path with request methods `PUT` to a block.
|
@@ -36,7 +39,7 @@ class Rack::Builder
|
|
36
39
|
# @param options [Hash] Options for added path.
|
37
40
|
# @see HttpRouter#add
|
38
41
|
def put(path, options = nil, &block)
|
39
|
-
|
42
|
+
router.put(path).with_options(options).to(&block)
|
40
43
|
end
|
41
44
|
|
42
45
|
# Maps a path with request methods `DELETE` to a block.
|
@@ -44,7 +47,7 @@ class Rack::Builder
|
|
44
47
|
# @param options [Hash] Options for added path.
|
45
48
|
# @see HttpRouter#add
|
46
49
|
def delete(path, options = nil, &block)
|
47
|
-
|
50
|
+
router.delete(path).with_options(options).to(&block)
|
48
51
|
end
|
49
52
|
|
50
53
|
# Maps a path with request methods `HEAD` to a block.
|
@@ -52,6 +55,6 @@ class Rack::Builder
|
|
52
55
|
# @param options [Hash] Options for added path.
|
53
56
|
# @see HttpRouter#add
|
54
57
|
def head(path, options = nil, &block)
|
55
|
-
|
58
|
+
router.head(path).with_options(options).to(&block)
|
56
59
|
end
|
57
60
|
end
|
data/lib/http_router/node.rb
CHANGED
@@ -17,19 +17,14 @@ class HttpRouter
|
|
17
17
|
def add(val)
|
18
18
|
if val.is_a?(Variable)
|
19
19
|
if val.matches_with
|
20
|
-
|
21
|
-
create_linear
|
22
|
-
@linear << [val, new_node]
|
23
|
-
new_node
|
20
|
+
add_to_linear(val)
|
24
21
|
else
|
25
22
|
@catchall ||= router.node
|
26
23
|
@catchall.variable = val
|
27
24
|
@catchall
|
28
25
|
end
|
29
26
|
elsif val.is_a?(Regexp)
|
30
|
-
|
31
|
-
@linear << [val, router.node]
|
32
|
-
@linear.last.last
|
27
|
+
add_to_linear(val)
|
33
28
|
else
|
34
29
|
create_lookup
|
35
30
|
@lookup[val] ||= router.node
|
@@ -49,7 +44,18 @@ class HttpRouter
|
|
49
44
|
[self]
|
50
45
|
end
|
51
46
|
end
|
52
|
-
|
47
|
+
|
48
|
+
def add_to_linear(val)
|
49
|
+
create_linear
|
50
|
+
if @linear.assoc(val)
|
51
|
+
@linear.assoc(val).last
|
52
|
+
else
|
53
|
+
new_node = router.node
|
54
|
+
@linear << [val, new_node]
|
55
|
+
new_node
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
53
59
|
def add_arbitrary(procs)
|
54
60
|
target = self
|
55
61
|
if procs && !procs.empty?
|
data/lib/http_router.rb
CHANGED
@@ -21,6 +21,10 @@ class HttpRouter
|
|
21
21
|
|
22
22
|
attr_reader :named_routes, :routes, :root
|
23
23
|
|
24
|
+
def self.override_rack_mapper!
|
25
|
+
require File.join('ext', 'rack', 'rack_mapper')
|
26
|
+
end
|
27
|
+
|
24
28
|
def initialize(options = nil, &block)
|
25
29
|
@default_app = options && options[:default_app] || proc{|env| ::Rack::Response.new("Not Found", 404).finish }
|
26
30
|
@ignore_trailing_slash = options && options.key?(:ignore_trailing_slash) ? options[:ignore_trailing_slash] : true
|
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: 29
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.1.
|
9
|
+
- 3
|
10
|
+
version: 0.1.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Joshua Hull
|
@@ -47,6 +47,17 @@ files:
|
|
47
47
|
- README.rdoc
|
48
48
|
- Rakefile
|
49
49
|
- VERSION
|
50
|
+
- benchmarks/gen2.rb
|
51
|
+
- benchmarks/generation_bm.rb
|
52
|
+
- benchmarks/rack_mount.rb
|
53
|
+
- benchmarks/rack_recognition_bm.rb
|
54
|
+
- benchmarks/rec2.rb
|
55
|
+
- benchmarks/recognition_bm.rb
|
56
|
+
- examples/glob.ru
|
57
|
+
- examples/simple.ru
|
58
|
+
- examples/simple_with_mapper.ru
|
59
|
+
- examples/variable.ru
|
60
|
+
- examples/variable_with_regex.ru
|
50
61
|
- http_router.gemspec
|
51
62
|
- lib/ext/rack/rack_mapper.rb
|
52
63
|
- lib/ext/rack/uri_escape.rb
|