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