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 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