rack-multiplexer 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +4 -5
- data/lib/rack/multiplexer/version.rb +1 -1
- data/lib/rack/multiplexer.rb +47 -5
- data/spec/rack/multiplexer_spec.rb +1 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 910894805740fdcc2364efa17ac0c7eb3a42fc4c
|
4
|
+
data.tar.gz: 99d0b9def7d71bf7972f4b1e5c5efc7c09ef9ab4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: af73e022c78eb88ff1a48a5d5cbcbc784e781de813cc4388f27b4e4f8788d6186cc2e64f698a053c13a895267339fc752aed0f572187a47d63bafe025a043742
|
7
|
+
data.tar.gz: b5a14ed598693b692a224718cd02b7d2911b7d309f41c710a4a2ce72f50fa1c04dacb236e245ba678d69f158ccbc4b879000ba6fb9bf1f2d59515ce65db715ac
|
data/README.md
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
# Rack::Multiplexer
|
2
|
-
Provides a simple router & dispatcher for Rack applications.
|
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.
|
3
4
|
|
4
5
|
## Installation
|
5
6
|
```
|
@@ -16,10 +17,8 @@ require "rack-multiplexer"
|
|
16
17
|
multiplexer = Rack::Multiplexer.new
|
17
18
|
multiplexer.get("/a", ->(env) { [200, {}, ["a"]] })
|
18
19
|
multiplexer.get("/b", ->(env) { [200, {}, ["b"]] })
|
19
|
-
multiplexer.
|
20
|
-
multiplexer.
|
21
|
-
multiplexer.delete("/e", ->(env) { [200, {}, ["c"]] })
|
22
|
-
multiplexer.get("/f/:g", ->(env) { [200, {}, [env["rack.request.query_hash"]["g"]]] })
|
20
|
+
multiplexer.put("/c", ->(env) { [200, {}, ["c"]] })
|
21
|
+
multiplexer.get("/d/:e", ->(env) { [200, {}, [env["rack.request.query_hash"]["e"]]] })
|
23
22
|
|
24
23
|
run multiplexer
|
25
24
|
```
|
data/lib/rack/multiplexer.rb
CHANGED
@@ -1,6 +1,20 @@
|
|
1
1
|
require "rack/multiplexer/version"
|
2
2
|
require "rack/request"
|
3
3
|
|
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.
|
7
|
+
#
|
8
|
+
# Example:
|
9
|
+
#
|
10
|
+
# # config.ru
|
11
|
+
# multiplexer = Rack::Multiplexer.new
|
12
|
+
# multiplexer.get("/a", ->(env) { [200, {}, ["a"]] })
|
13
|
+
# multiplexer.get("/b", ->(env) { [200, {}, ["b"]] })
|
14
|
+
# multiplexer.put("/c", ->(env) { [200, {}, ["c"]] })
|
15
|
+
# multiplexer.get("/d/:e", ->(env) { [200, {}, [env["rack.request.query_hash"]["e"]]] })
|
16
|
+
# run multiplexer
|
17
|
+
#
|
4
18
|
module Rack
|
5
19
|
class Multiplexer
|
6
20
|
DEFAULT_NOT_FOUND_APPLICATION = ->(env) {
|
@@ -22,8 +36,8 @@ module Rack
|
|
22
36
|
def call(env)
|
23
37
|
path = env["PATH_INFO"]
|
24
38
|
(
|
25
|
-
routes[env["REQUEST_METHOD"]].find
|
26
|
-
routes["ANY"].find
|
39
|
+
routes[env["REQUEST_METHOD"]].find(path) ||
|
40
|
+
routes["ANY"].find(path) ||
|
27
41
|
@not_found_application
|
28
42
|
).call(env)
|
29
43
|
end
|
@@ -52,9 +66,8 @@ module Rack
|
|
52
66
|
routes[method] << Route.new(pattern, application)
|
53
67
|
end
|
54
68
|
|
55
|
-
# @routes are indexed by method.
|
56
69
|
def routes
|
57
|
-
@routes ||= Hash.new {|hash, key| hash[key] =
|
70
|
+
@routes ||= Hash.new {|hash, key| hash[key] = Routes.new }
|
58
71
|
end
|
59
72
|
|
60
73
|
def default_not_found_application
|
@@ -70,9 +83,38 @@ module Rack
|
|
70
83
|
}
|
71
84
|
end
|
72
85
|
|
86
|
+
class Routes
|
87
|
+
def initialize
|
88
|
+
@routes = []
|
89
|
+
end
|
90
|
+
|
91
|
+
def find(path)
|
92
|
+
if regexp === path
|
93
|
+
@routes.size.times do |i|
|
94
|
+
return @routes[i] if Regexp.last_match("_#{i}")
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def <<(route)
|
100
|
+
@routes << route
|
101
|
+
end
|
102
|
+
|
103
|
+
private
|
104
|
+
|
105
|
+
def regexp
|
106
|
+
@regexp ||= begin
|
107
|
+
regexps = @routes.map.with_index {|route, index| /(?<_#{index}>#{route.regexp})/ }
|
108
|
+
/\A#{Regexp.union(regexps)}\z/
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
73
113
|
class Route
|
74
114
|
PLACEHOLDER_REGEXP = /:(\w+)/
|
75
115
|
|
116
|
+
attr_reader :regexp
|
117
|
+
|
76
118
|
def initialize(pattern, application)
|
77
119
|
@application = application
|
78
120
|
@regexp, @keys = compile(pattern)
|
@@ -98,7 +140,7 @@ module Rack
|
|
98
140
|
keys << key
|
99
141
|
end
|
100
142
|
end
|
101
|
-
return Regexp.new(
|
143
|
+
return Regexp.new(segments.join(?/)), keys
|
102
144
|
end
|
103
145
|
end
|
104
146
|
end
|
@@ -74,6 +74,7 @@ describe Rack::Multiplexer do
|
|
74
74
|
it "delegates with rack.request.query_hash" do
|
75
75
|
multiplexer = described_class.new
|
76
76
|
multiplexer.get("/:any", application)
|
77
|
+
multiplexer.get("/a", application)
|
77
78
|
multiplexer.call(env.merge("REQUEST_METHOD" => "GET", "PATH_INFO" => "/a"))[2][0].should == "/a?any=a&"
|
78
79
|
end
|
79
80
|
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.
|
4
|
+
version: 0.0.3
|
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
|
+
date: 2013-11-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rack
|