http_router 0.8.0 → 0.8.1
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/lib/http_router/node/arbitrary.rb +9 -10
- data/lib/http_router/node/destination.rb +7 -8
- data/lib/http_router/node/free_regex.rb +15 -11
- data/lib/http_router/node/glob.rb +10 -10
- data/lib/http_router/node/glob_regex.rb +8 -7
- data/lib/http_router/node/lookup.rb +10 -10
- data/lib/http_router/node/regex.rb +13 -12
- data/lib/http_router/node/request.rb +6 -7
- data/lib/http_router/node/spanning_regex.rb +12 -9
- data/lib/http_router/node/variable.rb +7 -8
- data/lib/http_router/node.rb +23 -23
- data/lib/http_router/request.rb +0 -8
- data/lib/http_router/version.rb +1 -1
- data/lib/http_router.rb +1 -1
- metadata +37 -87
@@ -3,26 +3,25 @@ class HttpRouter
|
|
3
3
|
class Arbitrary < Node
|
4
4
|
attr_reader :allow_partial, :blk, :param_names
|
5
5
|
|
6
|
-
def initialize(router,
|
6
|
+
def initialize(router, parent, sallow_partial, blk, param_names)
|
7
7
|
@allow_partial, @blk, @param_names = allow_partial, blk, param_names
|
8
8
|
@node_position = router.register_node(blk)
|
9
|
-
super(router)
|
9
|
+
super(router, parent)
|
10
10
|
end
|
11
11
|
|
12
|
-
def
|
12
|
+
def usable?(other)
|
13
13
|
other.class == self.class && other.allow_partial == allow_partial && other.blk == blk && other.param_names == param_names
|
14
14
|
end
|
15
15
|
|
16
|
-
def to_code
|
17
|
-
|
18
|
-
|
19
|
-
r#{pos.next} = r#{pos}.dup
|
20
|
-
r#{pos.next}.continue = proc { |state|
|
16
|
+
def to_code
|
17
|
+
"#{"if request.path_finished?" unless @allow_partial}
|
18
|
+
request.continue = proc { |state|
|
21
19
|
if state
|
22
|
-
#{super
|
20
|
+
#{super}
|
23
21
|
end
|
24
22
|
}
|
25
|
-
router.nodes.at(#{node_position})[
|
23
|
+
router.nodes.at(#{node_position})[request, #{@param_names.nil? || @param_names.empty? ? '{}' : "Hash[#{@param_names.inspect}.zip(request.params)]"}]
|
24
|
+
request.continue = nil
|
26
25
|
#{"end" unless @allow_partial}"
|
27
26
|
end
|
28
27
|
end
|
@@ -3,21 +3,20 @@ class HttpRouter
|
|
3
3
|
class Destination < Node
|
4
4
|
attr_reader :blk, :allow_partial, :param_names
|
5
5
|
|
6
|
-
def initialize(router, blk, allow_partial)
|
6
|
+
def initialize(router, parent, blk, allow_partial)
|
7
7
|
@blk, @allow_partial = blk, allow_partial
|
8
8
|
@node_position = router.register_node(blk)
|
9
|
-
super(router)
|
9
|
+
super(router, parent)
|
10
10
|
end
|
11
11
|
|
12
|
-
def
|
12
|
+
def usable?(other)
|
13
13
|
other.class == self.class && other.allow_partial == allow_partial && other.blk == blk
|
14
14
|
end
|
15
15
|
|
16
|
-
def to_code
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
router.nodes.at(#{node_position})[r#{pos}, #{@param_names.nil? || @param_names.empty? ? 'nil' : "Hash[#{@param_names.inspect}.zip(r#{pos.next}.params)]"}]
|
16
|
+
def to_code
|
17
|
+
"#{"if request.path_finished?" unless @allow_partial}
|
18
|
+
request.passed_with = catch(:pass) do
|
19
|
+
router.nodes.at(#{node_position})[request, #{@param_names.nil? || @param_names.empty? ? 'nil' : "Hash[#{@param_names.inspect}.zip(request.params)]"}]
|
21
20
|
end
|
22
21
|
#{"end" unless @allow_partial}"
|
23
22
|
end
|
@@ -2,25 +2,29 @@ class HttpRouter
|
|
2
2
|
class Node
|
3
3
|
class FreeRegex < Node
|
4
4
|
attr_reader :matcher
|
5
|
-
def initialize(router, matcher)
|
5
|
+
def initialize(router, parent, matcher)
|
6
6
|
@matcher = matcher
|
7
|
-
super(router)
|
7
|
+
super(router, parent)
|
8
8
|
end
|
9
9
|
|
10
|
-
def to_code
|
11
|
-
|
12
|
-
whole_path = \"/\#{r#{pos}.joined_path}\"
|
10
|
+
def to_code
|
11
|
+
"whole_path = \"/\#{request.joined_path}\"
|
13
12
|
if match = #{matcher.inspect}.match(whole_path) and match[0].size == whole_path.size
|
14
|
-
|
15
|
-
|
16
|
-
|
13
|
+
request.extra_env['router.regex_match'] = match
|
14
|
+
old_path = request.path
|
15
|
+
request.path = ['']
|
17
16
|
" << (//.respond_to?(:names) ?
|
18
|
-
"match.names.size.times{|i|
|
19
|
-
#{super
|
17
|
+
"match.names.size.times{|i| request.params << match[i + 1]} if match.respond_to?(:names) && match.names" : "") << "
|
18
|
+
#{super}
|
19
|
+
request.path = old_path
|
20
|
+
request.extra_env.delete('router.regex_match')
|
21
|
+
" << (//.respond_to?(:names) ?
|
22
|
+
"params.slice!(-match.names.size, match.names.size)" : ""
|
23
|
+
) << "
|
20
24
|
end"
|
21
25
|
end
|
22
26
|
|
23
|
-
def
|
27
|
+
def usable?(other)
|
24
28
|
other.class == self.class && other.matcher == matcher
|
25
29
|
end
|
26
30
|
end
|
@@ -1,20 +1,20 @@
|
|
1
1
|
class HttpRouter
|
2
2
|
class Node
|
3
3
|
class Glob < Node
|
4
|
-
def
|
4
|
+
def usable?(other)
|
5
5
|
other.class == self.class
|
6
6
|
end
|
7
7
|
|
8
|
-
def to_code
|
9
|
-
|
10
|
-
|
11
|
-
r#{pos.next}.params << []
|
12
|
-
remaining_parts = r#{pos.next}.path.dup
|
8
|
+
def to_code
|
9
|
+
"request.params << (globbed_params#{depth} = [])
|
10
|
+
remaining_parts = request.path.dup
|
13
11
|
until remaining_parts.empty?
|
14
|
-
|
15
|
-
|
16
|
-
#{super
|
17
|
-
end
|
12
|
+
globbed_params#{depth} << URI.unescape(remaining_parts.shift)
|
13
|
+
request.path = remaining_parts
|
14
|
+
#{super}
|
15
|
+
end
|
16
|
+
request.path[0,0] = request.params.pop
|
17
|
+
"
|
18
18
|
end
|
19
19
|
end
|
20
20
|
end
|
@@ -1,15 +1,16 @@
|
|
1
1
|
class HttpRouter
|
2
2
|
class Node
|
3
3
|
class GlobRegex < SpanningRegex
|
4
|
-
def to_code
|
5
|
-
|
6
|
-
whole_path = r#{pos}.joined_path
|
4
|
+
def to_code
|
5
|
+
"whole_path = request.joined_path
|
7
6
|
if match = #{@matcher.inspect}.match(whole_path) and match.begin(0).zero?
|
8
|
-
|
9
|
-
@capturing_indicies.map { |c| "
|
7
|
+
original_path = request.path.dup\n" <<
|
8
|
+
@capturing_indicies.map { |c| "request.params << URI.unescape(match[#{c}].split(/\\//))\n" }.join << "
|
10
9
|
remaining_path = whole_path[match[0].size + (whole_path[match[0].size] == ?/ ? 1 : 0), whole_path.size]
|
11
|
-
|
12
|
-
#{super
|
10
|
+
request.path = remaining_path.split('/')
|
11
|
+
#{super}
|
12
|
+
request.path = original_path
|
13
|
+
#{@capturing_indicies.size == 1 ? "request.params.pop" : "request.params.slice!(#{-@capturing_indicies.size}, #{@capturing_indicies.size})"}
|
13
14
|
end
|
14
15
|
"
|
15
16
|
end
|
@@ -1,29 +1,29 @@
|
|
1
1
|
class HttpRouter
|
2
2
|
class Node
|
3
3
|
class Lookup < Node
|
4
|
-
def initialize(router)
|
4
|
+
def initialize(router, parent)
|
5
5
|
@map = {}
|
6
|
-
super(router)
|
6
|
+
super(router, parent)
|
7
7
|
end
|
8
8
|
|
9
9
|
def add(part)
|
10
|
-
Node.new(@router, @map[part] ||= [])
|
10
|
+
Node.new(@router, self, @map[part] ||= [])
|
11
11
|
end
|
12
12
|
|
13
|
-
def
|
13
|
+
def usable?(other)
|
14
14
|
other.class == self.class
|
15
15
|
end
|
16
16
|
|
17
|
-
def to_code
|
18
|
-
code = "
|
17
|
+
def to_code
|
18
|
+
code = "\ncase request.path.first\n"
|
19
19
|
@map.keys.each do |k|
|
20
20
|
code << "when #{k.inspect}\n
|
21
|
-
|
22
|
-
|
23
|
-
|
21
|
+
part#{depth} = request.path.shift
|
22
|
+
#{@map[k].map{|n| n.to_code} * "\n"}
|
23
|
+
request.path.unshift part#{depth}
|
24
|
+
"
|
24
25
|
end
|
25
26
|
code << "\nend"
|
26
|
-
indented_code pos, code
|
27
27
|
end
|
28
28
|
end
|
29
29
|
end
|
@@ -4,24 +4,25 @@ class HttpRouter
|
|
4
4
|
alias_method :node_to_code, :to_code
|
5
5
|
attr_reader :matcher, :splitting_indicies, :capturing_indicies
|
6
6
|
|
7
|
-
def initialize(router, matcher, capturing_indicies, splitting_indicies = nil)
|
7
|
+
def initialize(router, parent, matcher, capturing_indicies, splitting_indicies = nil)
|
8
8
|
@matcher, @capturing_indicies, @splitting_indicies = matcher, capturing_indicies, splitting_indicies
|
9
|
-
super(router)
|
9
|
+
super(router, parent)
|
10
10
|
end
|
11
11
|
|
12
|
-
def
|
12
|
+
def usable?(other)
|
13
13
|
other.class == self.class && other.matcher == matcher && other.splitting_indicies == splitting_indicies && other.capturing_indicies == capturing_indicies
|
14
14
|
end
|
15
15
|
|
16
|
-
def to_code
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
16
|
+
def to_code
|
17
|
+
params_size = @splitting_indicies.size + @capturing_indicies.size
|
18
|
+
"if match = #{@matcher.inspect}.match(request.path.first) and match.begin(0).zero?
|
19
|
+
part = request.path.shift\n" <<
|
20
|
+
@splitting_indicies.map { |s| "request.params << URI.unescape(match[#{s}]).split(/\\//)\n" }.join <<
|
21
|
+
@capturing_indicies.map { |c| "request.params << URI.unescape(match[#{c}])\n" }.join << "
|
22
|
+
#{super}
|
23
|
+
request.path.unshift part
|
24
|
+
#{params_size == 1 ? "request.params.pop" : "request.params.slice!(#{-params_size}, #{params_size})"}
|
25
|
+
end"
|
25
26
|
end
|
26
27
|
end
|
27
28
|
end
|
@@ -3,26 +3,25 @@ class HttpRouter
|
|
3
3
|
class Request < Node
|
4
4
|
attr_reader :request_method, :opts
|
5
5
|
|
6
|
-
def initialize(router, opts)
|
6
|
+
def initialize(router, parent, opts)
|
7
7
|
@opts = opts
|
8
8
|
Array(@opts[:request_method]).each { |m| router.known_methods << m } if @opts.key?(:request_method)
|
9
|
-
super(router)
|
9
|
+
super(router, parent)
|
10
10
|
end
|
11
11
|
|
12
|
-
def
|
12
|
+
def usable?(other)
|
13
13
|
other.class == self.class && other.opts == opts
|
14
14
|
end
|
15
15
|
|
16
|
-
def to_code
|
16
|
+
def to_code
|
17
17
|
code = "if "
|
18
18
|
code << @opts.map do |k,v|
|
19
19
|
case v
|
20
|
-
when Array then "(#{v.map{|vv| "#{vv.inspect} ===
|
21
|
-
else "#{v.inspect} ===
|
20
|
+
when Array then "(#{v.map{|vv| "#{vv.inspect} === request.rack_request.#{k}"}.join(' or ')})"
|
21
|
+
else "#{v.inspect} === request.rack_request.#{k.inspect}"
|
22
22
|
end
|
23
23
|
end * ' and '
|
24
24
|
code << "\n #{super}\nend"
|
25
|
-
indented_code pos, code
|
26
25
|
end
|
27
26
|
end
|
28
27
|
end
|
@@ -1,18 +1,21 @@
|
|
1
1
|
class HttpRouter
|
2
2
|
class Node
|
3
3
|
class SpanningRegex < Regex
|
4
|
-
def to_code
|
5
|
-
|
6
|
-
|
4
|
+
def to_code
|
5
|
+
params_count = (@splitting_indicies || []).size + @capturing_indicies.size
|
6
|
+
"whole_path = request.joined_path
|
7
7
|
if match = #{@matcher.inspect}.match(whole_path) and match.begin(0).zero?
|
8
|
-
|
9
|
-
|
10
|
-
@
|
8
|
+
original_path#{depth} = request.path.dup
|
9
|
+
" <<
|
10
|
+
(@splitting_indicies || []).map { |s| "request.params << URI.unescape(match[#{s}]).split(/\\//)\n" }.join <<
|
11
|
+
@capturing_indicies.map { |c| "request.params << URI.unescape(match[#{c}])\n" }.join << "
|
11
12
|
remaining_path = whole_path[match[0].size + (whole_path[match[0].size] == ?/ ? 1 : 0), whole_path.size]
|
12
|
-
|
13
|
-
#{node_to_code
|
13
|
+
request.path = remaining_path.split('/')
|
14
|
+
#{node_to_code}
|
15
|
+
request.path = original_path#{depth}
|
16
|
+
request.params.slice!(#{-params_count.size}, #{params_count})
|
14
17
|
end
|
15
|
-
"
|
18
|
+
"
|
16
19
|
end
|
17
20
|
end
|
18
21
|
end
|
@@ -1,17 +1,16 @@
|
|
1
1
|
class HttpRouter
|
2
2
|
class Node
|
3
3
|
class Variable < Node
|
4
|
-
def
|
4
|
+
def usable?(other)
|
5
5
|
other.class == self.class
|
6
6
|
end
|
7
7
|
|
8
|
-
def to_code
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
end")
|
8
|
+
def to_code
|
9
|
+
"unless request.path_finished?
|
10
|
+
request.params << URI.unescape(request.path.shift)
|
11
|
+
#{super}
|
12
|
+
request.path.unshift URI.escape(request.params.pop)
|
13
|
+
end"
|
15
14
|
end
|
16
15
|
end
|
17
16
|
end
|
data/lib/http_router/node.rb
CHANGED
@@ -11,46 +11,46 @@ class HttpRouter
|
|
11
11
|
autoload :Lookup, 'http_router/node/lookup'
|
12
12
|
autoload :Destination, 'http_router/node/destination'
|
13
13
|
|
14
|
-
attr_reader :priority, :router, :node_position
|
14
|
+
attr_reader :priority, :router, :node_position, :parent
|
15
15
|
|
16
|
-
def initialize(router, matchers = [])
|
17
|
-
@router, @matchers = router, matchers
|
16
|
+
def initialize(router, parent, matchers = [])
|
17
|
+
@router, @parent, @matchers = router, parent, matchers
|
18
18
|
end
|
19
19
|
|
20
20
|
def add_variable
|
21
|
-
add(Variable.new(@router))
|
21
|
+
add(Variable.new(@router, self))
|
22
22
|
end
|
23
23
|
|
24
24
|
def add_glob
|
25
|
-
add(Glob.new(@router))
|
25
|
+
add(Glob.new(@router, self))
|
26
26
|
end
|
27
27
|
|
28
28
|
def add_request(opts)
|
29
|
-
add(Request.new(@router, opts))
|
29
|
+
add(Request.new(@router, self, opts))
|
30
30
|
end
|
31
31
|
|
32
32
|
def add_arbitrary(blk, allow_partial, param_names)
|
33
|
-
add(Arbitrary.new(@router, allow_partial, blk, param_names))
|
33
|
+
add(Arbitrary.new(@router, self, allow_partial, blk, param_names))
|
34
34
|
end
|
35
35
|
|
36
36
|
def add_match(regexp, matching_indicies = [0], splitting_indicies = nil)
|
37
|
-
add(Regex.new(@router, regexp, matching_indicies, splitting_indicies))
|
37
|
+
add(Regex.new(@router, self, regexp, matching_indicies, splitting_indicies))
|
38
38
|
end
|
39
39
|
|
40
40
|
def add_spanning_match(regexp, matching_indicies = [0], splitting_indicies = nil)
|
41
|
-
add(SpanningRegex.new(@router, regexp, matching_indicies, splitting_indicies))
|
41
|
+
add(SpanningRegex.new(@router, self, regexp, matching_indicies, splitting_indicies))
|
42
42
|
end
|
43
43
|
|
44
44
|
def add_free_match(regexp)
|
45
|
-
add(FreeRegex.new(@router, regexp))
|
45
|
+
add(FreeRegex.new(@router, self, regexp))
|
46
46
|
end
|
47
47
|
|
48
48
|
def add_destination(blk, partial)
|
49
|
-
add(Destination.new(@router, blk, partial))
|
49
|
+
add(Destination.new(@router, self, blk, partial))
|
50
50
|
end
|
51
51
|
|
52
52
|
def add_lookup(part)
|
53
|
-
add(Lookup.new(@router)).add(part)
|
53
|
+
add(Lookup.new(@router, self)).add(part)
|
54
54
|
end
|
55
55
|
|
56
56
|
def usable?(other)
|
@@ -67,7 +67,7 @@ class HttpRouter
|
|
67
67
|
end
|
68
68
|
|
69
69
|
def compile
|
70
|
-
instance_eval "def [](
|
70
|
+
instance_eval "def [](request)\n#{to_code}\nnil\nend", __FILE__, __LINE__
|
71
71
|
end
|
72
72
|
|
73
73
|
private
|
@@ -76,18 +76,18 @@ class HttpRouter
|
|
76
76
|
@matchers.last
|
77
77
|
end
|
78
78
|
|
79
|
-
def to_code
|
80
|
-
@matchers.map{ |m| m.to_code
|
79
|
+
def to_code
|
80
|
+
@matchers.map{ |m| "# #{m.class}\n" << m.to_code }.join("\n") << "\n"
|
81
81
|
end
|
82
82
|
|
83
|
-
def
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
83
|
+
def depth
|
84
|
+
p = @parent
|
85
|
+
d = 0
|
86
|
+
until p.nil?
|
87
|
+
d += 1
|
88
|
+
p = p.parent
|
89
|
+
end
|
90
|
+
d
|
91
91
|
end
|
92
92
|
end
|
93
93
|
end
|
data/lib/http_router/request.rb
CHANGED
@@ -27,14 +27,6 @@ class HttpRouter
|
|
27
27
|
"request path, #{path.inspect}"
|
28
28
|
end
|
29
29
|
|
30
|
-
def dup
|
31
|
-
dup_obj = super
|
32
|
-
dup_obj.path = path.dup
|
33
|
-
dup_obj.params = params.dup
|
34
|
-
dup_obj.extra_env = extra_env.dup
|
35
|
-
dup_obj
|
36
|
-
end
|
37
|
-
|
38
30
|
def path_finished?
|
39
31
|
@path.size == 0 or @path.size == 1 && @path.first == ''
|
40
32
|
end
|
data/lib/http_router/version.rb
CHANGED
data/lib/http_router.rb
CHANGED
@@ -138,7 +138,7 @@ class HttpRouter
|
|
138
138
|
|
139
139
|
# Resets the router to a clean state.
|
140
140
|
def reset!
|
141
|
-
@routes, @named_routes, @root = [], {}, Node.new(self)
|
141
|
+
@routes, @named_routes, @root = [], {}, Node.new(self, nil)
|
142
142
|
@default_app = Proc.new{ |env| ::Rack::Response.new("Your request couldn't be found", 404).finish }
|
143
143
|
end
|
144
144
|
|
metadata
CHANGED
@@ -1,13 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: http_router
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash: 63
|
5
4
|
prerelease:
|
6
|
-
|
7
|
-
- 0
|
8
|
-
- 8
|
9
|
-
- 0
|
10
|
-
version: 0.8.0
|
5
|
+
version: 0.8.1
|
11
6
|
platform: ruby
|
12
7
|
authors:
|
13
8
|
- Joshua Hull
|
@@ -19,143 +14,104 @@ date: 2011-06-01 00:00:00 -04:00
|
|
19
14
|
default_executable:
|
20
15
|
dependencies:
|
21
16
|
- !ruby/object:Gem::Dependency
|
22
|
-
|
17
|
+
name: rack
|
18
|
+
prerelease: false
|
19
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
23
20
|
none: false
|
24
21
|
requirements:
|
25
22
|
- - ">="
|
26
23
|
- !ruby/object:Gem::Version
|
27
|
-
hash: 23
|
28
|
-
segments:
|
29
|
-
- 1
|
30
|
-
- 0
|
31
|
-
- 0
|
32
24
|
version: 1.0.0
|
33
|
-
requirement: *id001
|
34
|
-
prerelease: false
|
35
25
|
type: :runtime
|
36
|
-
|
26
|
+
version_requirements: *id001
|
37
27
|
- !ruby/object:Gem::Dependency
|
38
|
-
|
28
|
+
name: url_mount
|
29
|
+
prerelease: false
|
30
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
39
31
|
none: false
|
40
32
|
requirements:
|
41
33
|
- - ~>
|
42
34
|
- !ruby/object:Gem::Version
|
43
|
-
hash: 21
|
44
|
-
segments:
|
45
|
-
- 0
|
46
|
-
- 2
|
47
|
-
- 1
|
48
35
|
version: 0.2.1
|
49
|
-
requirement: *id002
|
50
|
-
prerelease: false
|
51
36
|
type: :runtime
|
52
|
-
|
37
|
+
version_requirements: *id002
|
53
38
|
- !ruby/object:Gem::Dependency
|
54
|
-
|
39
|
+
name: minitest
|
40
|
+
prerelease: false
|
41
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
55
42
|
none: false
|
56
43
|
requirements:
|
57
44
|
- - ~>
|
58
45
|
- !ruby/object:Gem::Version
|
59
|
-
hash: 15
|
60
|
-
segments:
|
61
|
-
- 2
|
62
|
-
- 0
|
63
|
-
- 0
|
64
46
|
version: 2.0.0
|
65
|
-
requirement: *id003
|
66
|
-
prerelease: false
|
67
47
|
type: :development
|
68
|
-
|
48
|
+
version_requirements: *id003
|
69
49
|
- !ruby/object:Gem::Dependency
|
70
|
-
|
50
|
+
name: code_stats
|
51
|
+
prerelease: false
|
52
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
71
53
|
none: false
|
72
54
|
requirements:
|
73
55
|
- - ">="
|
74
56
|
- !ruby/object:Gem::Version
|
75
|
-
hash: 3
|
76
|
-
segments:
|
77
|
-
- 0
|
78
57
|
version: "0"
|
79
|
-
requirement: *id004
|
80
|
-
prerelease: false
|
81
58
|
type: :development
|
82
|
-
|
59
|
+
version_requirements: *id004
|
83
60
|
- !ruby/object:Gem::Dependency
|
84
|
-
|
61
|
+
name: rake
|
62
|
+
prerelease: false
|
63
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
85
64
|
none: false
|
86
65
|
requirements:
|
87
66
|
- - ~>
|
88
67
|
- !ruby/object:Gem::Version
|
89
|
-
hash: 49
|
90
|
-
segments:
|
91
|
-
- 0
|
92
|
-
- 8
|
93
|
-
- 7
|
94
68
|
version: 0.8.7
|
95
|
-
requirement: *id005
|
96
|
-
prerelease: false
|
97
69
|
type: :development
|
98
|
-
|
70
|
+
version_requirements: *id005
|
99
71
|
- !ruby/object:Gem::Dependency
|
100
|
-
|
72
|
+
name: rbench
|
73
|
+
prerelease: false
|
74
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
101
75
|
none: false
|
102
76
|
requirements:
|
103
77
|
- - ">="
|
104
78
|
- !ruby/object:Gem::Version
|
105
|
-
hash: 3
|
106
|
-
segments:
|
107
|
-
- 0
|
108
79
|
version: "0"
|
109
|
-
requirement: *id006
|
110
|
-
prerelease: false
|
111
80
|
type: :development
|
112
|
-
|
81
|
+
version_requirements: *id006
|
113
82
|
- !ruby/object:Gem::Dependency
|
114
|
-
|
83
|
+
name: phocus
|
84
|
+
prerelease: false
|
85
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
115
86
|
none: false
|
116
87
|
requirements:
|
117
88
|
- - ">="
|
118
89
|
- !ruby/object:Gem::Version
|
119
|
-
hash: 3
|
120
|
-
segments:
|
121
|
-
- 0
|
122
90
|
version: "0"
|
123
|
-
requirement: *id007
|
124
|
-
prerelease: false
|
125
91
|
type: :development
|
126
|
-
|
92
|
+
version_requirements: *id007
|
127
93
|
- !ruby/object:Gem::Dependency
|
128
|
-
|
94
|
+
name: bundler
|
95
|
+
prerelease: false
|
96
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
129
97
|
none: false
|
130
98
|
requirements:
|
131
99
|
- - ~>
|
132
100
|
- !ruby/object:Gem::Version
|
133
|
-
hash: 23
|
134
|
-
segments:
|
135
|
-
- 1
|
136
|
-
- 0
|
137
|
-
- 0
|
138
101
|
version: 1.0.0
|
139
|
-
requirement: *id008
|
140
|
-
prerelease: false
|
141
102
|
type: :development
|
142
|
-
|
103
|
+
version_requirements: *id008
|
143
104
|
- !ruby/object:Gem::Dependency
|
144
|
-
|
105
|
+
name: thin
|
106
|
+
prerelease: false
|
107
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
145
108
|
none: false
|
146
109
|
requirements:
|
147
110
|
- - "="
|
148
111
|
- !ruby/object:Gem::Version
|
149
|
-
hash: 15
|
150
|
-
segments:
|
151
|
-
- 1
|
152
|
-
- 2
|
153
|
-
- 8
|
154
112
|
version: 1.2.8
|
155
|
-
requirement: *id009
|
156
|
-
prerelease: false
|
157
113
|
type: :development
|
158
|
-
|
114
|
+
version_requirements: *id009
|
159
115
|
description: This library allows you to recognize and build URLs in a Rack application.
|
160
116
|
email: joshbuddy@gmail.com
|
161
117
|
executables: []
|
@@ -239,18 +195,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
239
195
|
requirements:
|
240
196
|
- - ">="
|
241
197
|
- !ruby/object:Gem::Version
|
242
|
-
hash: 3
|
243
|
-
segments:
|
244
|
-
- 0
|
245
198
|
version: "0"
|
246
199
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
247
200
|
none: false
|
248
201
|
requirements:
|
249
202
|
- - ">="
|
250
203
|
- !ruby/object:Gem::Version
|
251
|
-
hash: 3
|
252
|
-
segments:
|
253
|
-
- 0
|
254
204
|
version: "0"
|
255
205
|
requirements: []
|
256
206
|
|