http_router 0.8.0 → 0.8.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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, allow_partial, blk, param_names)
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 usuable?(other)
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(pos)
17
- indented_code pos, "
18
- #{"if r#{pos}.path_finished?" unless @allow_partial}
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(pos.next)}
20
+ #{super}
23
21
  end
24
22
  }
25
- router.nodes.at(#{node_position})[r#{pos.next}, #{@param_names.nil? || @param_names.empty? ? '{}' : "Hash[#{@param_names.inspect}.zip(r#{pos.next}.params)]"}]
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 usuable?(other)
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(pos)
17
- indented_code pos, "
18
- #{"if r#{pos}.path_finished?" unless @allow_partial}
19
- r0.passed_with = catch(:pass) do
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(pos)
11
- indented_code pos, "
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
- r#{pos.next} = r#{pos}.dup
15
- r#{pos.next}.extra_env['router.regex_match'] = match
16
- r#{pos.next}.path = ['']
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| r#{pos.next}.params << match[i + 1]} if match.respond_to?(:names) && match.names" : "") << "
19
- #{super(pos.next)}
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 usuable?(other)
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 usuable?(other)
4
+ def usable?(other)
5
5
  other.class == self.class
6
6
  end
7
7
 
8
- def to_code(pos)
9
- indented_code pos, "
10
- r#{pos.next} = r#{pos}.dup
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
- r#{pos.next}.params[-1] << URI.unescape(remaining_parts.shift)
15
- r#{pos.next}.path = remaining_parts
16
- #{super(pos.next)}
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(pos)
5
- indented_code pos, "
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
- r#{pos.next} = r#{pos}.dup\n" <<
9
- @capturing_indicies.map { |c| "r#{pos.next}.params << URI.unescape(match[#{c}].split(/\\//))\n" }.join << "
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
- r#{pos.next}.path = remaining_path.split('/')
12
- #{super(pos.next)}
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 usuable?(other)
13
+ def usable?(other)
14
14
  other.class == self.class
15
15
  end
16
16
 
17
- def to_code(pos)
18
- code = "case r#{pos}.path.first\n"
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
- r#{pos.next} = r#{pos}.dup
22
- r#{pos.next}.path.shift
23
- #{@map[k].map{|n| n.to_code(pos.next)} * "\n"}"
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 usuable?(other)
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(pos)
17
- indented_code pos, "
18
- if match = #{@matcher.inspect}.match(r#{pos}.path.first) and match.begin(0).zero?
19
- r#{pos.next} = r#{pos}.dup
20
- r#{pos.next}.path.shift\n" <<
21
- @splitting_indicies.map { |s| "r#{pos.next}.params << URI.unescape(match[#{s}]).split(/\\//)\n" }.join <<
22
- @capturing_indicies.map { |c| "r#{pos.next}.params << URI.unescape(match[#{c}])\n" }.join << "
23
- #{super(pos.next)}
24
- end"
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 usuable?(other)
12
+ def usable?(other)
13
13
  other.class == self.class && other.opts == opts
14
14
  end
15
15
 
16
- def to_code(pos)
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} === r#{pos}.rack_request.#{k}"}.join(' or ')})"
21
- else "#{v.inspect} === r#{pos}.rack_request.#{k.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(pos)
5
- indented_code(pos, "
6
- whole_path = r#{pos}.joined_path
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
- r#{pos.next} = r#{pos}.dup\n" <<
9
- (@splitting_indicies || []).map { |s| "r#{pos.next}.params << URI.unescape(match[#{s}]).split(/\\//)\n" }.join <<
10
- @capturing_indicies.map { |c| "r#{pos.next}.params << URI.unescape(match[#{c}])\n" }.join << "
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
- r#{pos.next}.path = remaining_path.split('/')
13
- #{node_to_code(pos.next)}
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 usuable?(other)
4
+ def usable?(other)
5
5
  other.class == self.class
6
6
  end
7
7
 
8
- def to_code(pos)
9
- indented_code(pos, "
10
- unless r#{pos}.path_finished?
11
- r#{pos.next} = r#{pos}.dup
12
- r#{pos.next}.params << URI.unescape(r#{pos.next}.path.shift)
13
- #{super(pos.next)}
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
@@ -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 [](r0)\n#{to_code(0)}\nnil\nend", __FILE__, __LINE__
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(pos)
80
- @matchers.map{ |m| m.to_code(pos) }.join("\n") << "\n"
79
+ def to_code
80
+ @matchers.map{ |m| "# #{m.class}\n" << m.to_code }.join("\n") << "\n"
81
81
  end
82
82
 
83
- def indented_code(pos, code)
84
- lines = code.
85
- strip.
86
- split(/\n/).
87
- select{|l| !l.strip.size.zero?}
88
- indent_size = lines.first[/ */].size
89
- lines.map! {|l| "#{' ' * pos.next}#{l[indent_size, l.size]}"}
90
- "\n" << lines.join("\n") << "\n"
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
@@ -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
@@ -1,4 +1,4 @@
1
1
  # encoding: utf-8
2
2
  class HttpRouter #:nodoc
3
- VERSION = '0.8.0'
3
+ VERSION = '0.8.1'
4
4
  end
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
- segments:
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
- version_requirements: &id001 !ruby/object:Gem::Requirement
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
- name: rack
26
+ version_requirements: *id001
37
27
  - !ruby/object:Gem::Dependency
38
- version_requirements: &id002 !ruby/object:Gem::Requirement
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
- name: url_mount
37
+ version_requirements: *id002
53
38
  - !ruby/object:Gem::Dependency
54
- version_requirements: &id003 !ruby/object:Gem::Requirement
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
- name: minitest
48
+ version_requirements: *id003
69
49
  - !ruby/object:Gem::Dependency
70
- version_requirements: &id004 !ruby/object:Gem::Requirement
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
- name: code_stats
59
+ version_requirements: *id004
83
60
  - !ruby/object:Gem::Dependency
84
- version_requirements: &id005 !ruby/object:Gem::Requirement
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
- name: rake
70
+ version_requirements: *id005
99
71
  - !ruby/object:Gem::Dependency
100
- version_requirements: &id006 !ruby/object:Gem::Requirement
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
- name: rbench
81
+ version_requirements: *id006
113
82
  - !ruby/object:Gem::Dependency
114
- version_requirements: &id007 !ruby/object:Gem::Requirement
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
- name: phocus
92
+ version_requirements: *id007
127
93
  - !ruby/object:Gem::Dependency
128
- version_requirements: &id008 !ruby/object:Gem::Requirement
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
- name: bundler
103
+ version_requirements: *id008
143
104
  - !ruby/object:Gem::Dependency
144
- version_requirements: &id009 !ruby/object:Gem::Requirement
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
- name: thin
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