http_router 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -1,2 +1 @@
1
- benchmarks
2
1
  pkg
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.2
1
+ 0.1.3
@@ -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
@@ -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
@@ -0,0 +1,8 @@
1
+ require 'http_router'
2
+
3
+ run HttpRouter.new {
4
+ get('/hi').to { |env| [200, {'Content-type' => 'text/plain'}, ["hi!\n"]]}
5
+ }
6
+
7
+ # crapbook-pro:~ joshua$ curl http://127.0.0.1:3000/hi
8
+ # hi!
@@ -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
@@ -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
- @router.add(path).with_options(options).to(&block)
15
- @ins << @router unless @ins.last == @router
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
- @router.get(path).with_options(options).to(&block)
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
- @router.post(path).with_options(options).to(&block)
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
- @router.put(path).with_options(options).to(&block)
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
- @router.delete(path).with_options(options).to(&block)
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
- @router.head(path).with_options(options).to(&block)
58
+ router.head(path).with_options(options).to(&block)
56
59
  end
57
60
  end
@@ -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
- new_node = router.node
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
- create_linear
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: 31
4
+ hash: 29
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 2
10
- version: 0.1.2
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