rack-multiplexer 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 910894805740fdcc2364efa17ac0c7eb3a42fc4c
4
- data.tar.gz: 99d0b9def7d71bf7972f4b1e5c5efc7c09ef9ab4
3
+ metadata.gz: 1693a2a3b7c5e01ff4504b1050be22e70d56a476
4
+ data.tar.gz: be765bf4e45551f7888e8d445fe9046ea6209d94
5
5
  SHA512:
6
- metadata.gz: af73e022c78eb88ff1a48a5d5cbcbc784e781de813cc4388f27b4e4f8788d6186cc2e64f698a053c13a895267339fc752aed0f572187a47d63bafe025a043742
7
- data.tar.gz: b5a14ed598693b692a224718cd02b7d2911b7d309f41c710a4a2ce72f50fa1c04dacb236e245ba678d69f158ccbc4b879000ba6fb9bf1f2d59515ce65db715ac
6
+ metadata.gz: e74c42adeebd12b164e473584ccf15b3745e4706ca21bf0c2bcbadf836474d76b7ebbaa1ba483d67ca6952a6cd15ece7d0da101e5d79f14d417baadd0485a68b
7
+ data.tar.gz: 0c0e978e9bb4aff842e0353e044eafae25df42328deacccace09534b7eb6d3d7131fbf83ce0e78dd98841cf95da6cc329a32f4033dc97637f0cce4c0606951f2
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Rack::Multiplexer
2
- Provides a simple router & dispatcher for Rack applications as a Rack application.
3
- The routing process takes O(1) complexity because all routes are compiled as one Regexp.
2
+ Provides a simple router & dispatcher for Rack applications as a Rack application.
3
+ The routing algorithm has only O(1) time complexity because all routes are compiled into one Regexp.
4
4
 
5
5
  ## Installation
6
6
  ```
@@ -2,8 +2,7 @@ require "rack/multiplexer/version"
2
2
  require "rack/request"
3
3
 
4
4
  # Provides a simple router & dispatcher for Rack applications as a Rack application.
5
- # From Ruby's standpoint, the routing algorithm has only O(1) time complexity
6
- # because all routes are compiled as one Regexp.
5
+ # The routing algorithm has only O(1) time complexity because all routes are compiled into one Regexp.
7
6
  #
8
7
  # Example:
9
8
  #
@@ -17,18 +16,7 @@ require "rack/request"
17
16
  #
18
17
  module Rack
19
18
  class Multiplexer
20
- DEFAULT_NOT_FOUND_APPLICATION = ->(env) {
21
- [
22
- 404,
23
- {
24
- "Content-Type" => "text/plain",
25
- "Content-Length" => "0",
26
- },
27
- [""],
28
- ]
29
- }
30
-
31
- def initialize(not_found_application = DEFAULT_NOT_FOUND_APPLICATION, &block)
19
+ def initialize(not_found_application = default_not_found_application, &block)
32
20
  @not_found_application = not_found_application
33
21
  instance_eval(&block) if block
34
22
  end
@@ -76,7 +64,7 @@ module Rack
76
64
  404,
77
65
  {
78
66
  "Content-Type" => "text/plain",
79
- "Content-Length" => 0,
67
+ "Content-Length" => "0",
80
68
  },
81
69
  [""],
82
70
  ]
@@ -135,7 +123,7 @@ module Rack
135
123
  keys = []
136
124
  segments = []
137
125
  pattern.split("/").each do |segment|
138
- segments << segment.gsub(PLACEHOLDER_REGEXP, "([^#?/]+)")
126
+ segments << Regexp.escape(segment).gsub(PLACEHOLDER_REGEXP, "([^#?/]+)")
139
127
  if key = Regexp.last_match(1)
140
128
  keys << key
141
129
  end
@@ -1,5 +1,5 @@
1
1
  module Rack
2
2
  class Multiplexer
3
- VERSION = "0.0.3"
3
+ VERSION = "0.0.4"
4
4
  end
5
5
  end
@@ -0,0 +1,28 @@
1
+ # Benchmark script for comparison of the routing algorithm between v0.0.2 and v0.0.3.
2
+ # In my laptop environment, v0.0.3 is 17x faster than 0.0.2 with 676 routes & 100,000 tries.
3
+
4
+ $LOAD_PATH.unshift File.expand_path("../../lib", __FILE__)
5
+ require "rack/multiplexer"
6
+ require "benchmark"
7
+
8
+ multiplexer = Rack::Multiplexer.new
9
+ (?a..?z).each do |head|
10
+ (?a..?z).each do |tail|
11
+ multiplexer.get("/#{head}{tail}") do
12
+ [200, {}, ["OK"]]
13
+ end
14
+ end
15
+ end
16
+
17
+ env = {
18
+ "PATH_INFO" => "/mm",
19
+ "REQUEST_METHOD" => "GET",
20
+ }
21
+
22
+ n = 100_000
23
+ puts Benchmark::CAPTION
24
+ puts Benchmark.measure {
25
+ n.times do
26
+ multiplexer.call(env)
27
+ end
28
+ }
@@ -110,5 +110,15 @@ describe Rack::Multiplexer do
110
110
  multiplexer.call(env.merge("REQUEST_METHOD" => "HEAD", "PATH_INFO" => "/a"))[0].should == 200
111
111
  end
112
112
  end
113
+
114
+ context "with path including '.'" do
115
+ it "matches exactly" do
116
+ multiplexer = described_class.new
117
+ multiplexer.get("/a.*") {|env| [200, {}, ["ok"]] }
118
+ multiplexer.call(env.merge("REQUEST_METHOD" => "GET", "PATH_INFO" => "/a.*"))[0].should == 200
119
+ multiplexer.call(env.merge("REQUEST_METHOD" => "GET", "PATH_INFO" => "/aaa"))[0].should == 404
120
+ multiplexer.call(env.merge("REQUEST_METHOD" => "GET", "PATH_INFO" => "/abc"))[0].should == 404
121
+ end
122
+ end
113
123
  end
114
124
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-multiplexer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryo Nakamura
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-11-26 00:00:00.000000000 Z
11
+ date: 2013-11-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -110,6 +110,7 @@ files:
110
110
  - lib/rack/multiplexer.rb
111
111
  - lib/rack/multiplexer/version.rb
112
112
  - rack-multiplexer.gemspec
113
+ - scripts/benchmark.rb
113
114
  - spec/rack/multiplexer_spec.rb
114
115
  - spec/spec_helper.rb
115
116
  homepage: https://github.com/r7kamura/rack-multiplexer
@@ -139,4 +140,3 @@ summary: Provides a simple router & dispatcher for Rack.
139
140
  test_files:
140
141
  - spec/rack/multiplexer_spec.rb
141
142
  - spec/spec_helper.rb
142
- has_rdoc: