andyjeffries-journey 1.0.0 → 1.0.0.20111022124133

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.rdoc CHANGED
@@ -1,6 +1,5 @@
1
- === 1.0.0 / 2011-03-08
2
-
3
- * 1 major enhancement
4
-
5
- * Birthday!
1
+ Mon Jan 23 17:07:53 2012 Aaron Patterson <aaron@tenderlovemaking.com>
6
2
 
3
+ * Added symbol? and literal? predicate methods to the ast nodes for
4
+ easier AST traversal.
5
+ * Made the dummy node a real class.
data/Gemfile CHANGED
@@ -5,7 +5,10 @@
5
5
  source :gemcutter
6
6
 
7
7
 
8
- gem "minitest", "~>2.5", :group => [:development, :test]
9
- gem "hoe", "~>2.10", :group => [:development, :test]
8
+ gem "minitest", "~>2.3", :group => [:development, :test]
9
+ gem "racc", ">=1.4.6", :group => [:development, :test]
10
+ gem "rdoc", "~>3.11", :group => [:development, :test]
11
+ gem "json", ">=0", :group => [:development, :test]
12
+ gem "hoe", "~>2.12", :group => [:development, :test]
10
13
 
11
14
  # vim: syntax=ruby
data/Manifest.txt CHANGED
@@ -1,4 +1,6 @@
1
1
  .autotest
2
+ .gemtest
3
+ .travis.yml
2
4
  CHANGELOG.rdoc
3
5
  Gemfile
4
6
  Manifest.txt
data/README.rdoc CHANGED
@@ -1,6 +1,6 @@
1
1
  = Journey
2
2
 
3
- * http://github.com/tenderlove/journey
3
+ * http://github.com/rails/journey
4
4
 
5
5
  == DESCRIPTION:
6
6
 
data/Rakefile CHANGED
@@ -16,6 +16,7 @@ Hoe.spec 'andyjeffries-journey' do
16
16
  self.extra_rdoc_files = FileList['*.rdoc']
17
17
  self.extra_dev_deps += [
18
18
  ["racc", ">= 1.4.6"],
19
+ ["rdoc", "~> 3.11"],
19
20
  ["json"],
20
21
  ]
21
22
  end
data/journey.gemspec CHANGED
@@ -2,15 +2,15 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = "andyjeffries-journey"
5
- s.version = "1.0.0.20111022124133"
5
+ s.version = "1.0.0.20120112115843"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Aaron Patterson", "Andy Jeffries"]
9
- s.date = "2011-10-22"
9
+ s.date = "2012-01-24"
10
10
  s.description = "Journey is a router. It routes requests."
11
11
  s.email = ["aaron@tenderlovemaking.com"]
12
12
  s.extra_rdoc_files = ["Manifest.txt", "CHANGELOG.rdoc", "README.rdoc"]
13
- s.files = [".autotest", "CHANGELOG.rdoc", "Gemfile", "Manifest.txt", "README.rdoc", "Rakefile", "journey.gemspec", "lib/journey.rb", "lib/journey/backwards.rb", "lib/journey/core-ext/hash.rb", "lib/journey/formatter.rb", "lib/journey/gtg/builder.rb", "lib/journey/gtg/simulator.rb", "lib/journey/gtg/transition_table.rb", "lib/journey/nfa/builder.rb", "lib/journey/nfa/dot.rb", "lib/journey/nfa/simulator.rb", "lib/journey/nfa/transition_table.rb", "lib/journey/nodes/node.rb", "lib/journey/parser.rb", "lib/journey/parser.y", "lib/journey/parser_extras.rb", "lib/journey/path/pattern.rb", "lib/journey/route.rb", "lib/journey/router.rb", "lib/journey/router/strexp.rb", "lib/journey/router/utils.rb", "lib/journey/routes.rb", "lib/journey/scanner.rb", "lib/journey/visitors.rb", "lib/journey/visualizer/d3.min.js", "lib/journey/visualizer/fsm.css", "lib/journey/visualizer/fsm.js", "lib/journey/visualizer/index.html.erb", "lib/journey/visualizer/reset.css", "test/gtg/test_builder.rb", "test/gtg/test_transition_table.rb", "test/helper.rb", "test/nfa/test_simulator.rb", "test/nfa/test_transition_table.rb", "test/nodes/test_symbol.rb", "test/path/test_pattern.rb", "test/route/definition/test_parser.rb", "test/route/definition/test_scanner.rb", "test/router/test_strexp.rb", "test/router/test_utils.rb", "test/test_route.rb", "test/test_router.rb", "test/test_routes.rb", ".gemtest"]
13
+ s.files = [".autotest", ".gemtest", ".travis.yml", "CHANGELOG.rdoc", "Gemfile", "Manifest.txt", "README.rdoc", "Rakefile", "journey.gemspec", "lib/journey.rb", "lib/journey/backwards.rb", "lib/journey/core-ext/hash.rb", "lib/journey/formatter.rb", "lib/journey/gtg/builder.rb", "lib/journey/gtg/simulator.rb", "lib/journey/gtg/transition_table.rb", "lib/journey/nfa/builder.rb", "lib/journey/nfa/dot.rb", "lib/journey/nfa/simulator.rb", "lib/journey/nfa/transition_table.rb", "lib/journey/nodes/node.rb", "lib/journey/parser.rb", "lib/journey/parser.y", "lib/journey/parser_extras.rb", "lib/journey/path/pattern.rb", "lib/journey/route.rb", "lib/journey/router.rb", "lib/journey/router/strexp.rb", "lib/journey/router/utils.rb", "lib/journey/routes.rb", "lib/journey/scanner.rb", "lib/journey/visitors.rb", "lib/journey/visualizer/d3.min.js", "lib/journey/visualizer/fsm.css", "lib/journey/visualizer/fsm.js", "lib/journey/visualizer/index.html.erb", "lib/journey/visualizer/reset.css", "test/gtg/test_builder.rb", "test/gtg/test_transition_table.rb", "test/helper.rb", "test/nfa/test_simulator.rb", "test/nfa/test_transition_table.rb", "test/nodes/test_symbol.rb", "test/path/test_pattern.rb", "test/route/definition/test_parser.rb", "test/route/definition/test_scanner.rb", "test/router/test_strexp.rb", "test/router/test_utils.rb", "test/test_route.rb", "test/test_router.rb", "test/test_routes.rb"]
14
14
  s.homepage = "http://github.com/tenderlove/journey"
15
15
  s.rdoc_options = ["--main", "README.rdoc"]
16
16
  s.require_paths = ["lib"]
@@ -23,20 +23,23 @@ Gem::Specification.new do |s|
23
23
  s.specification_version = 3
24
24
 
25
25
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
26
- s.add_development_dependency(%q<minitest>, ["~> 2.6"])
27
26
  s.add_development_dependency(%q<racc>, [">= 1.4.6"])
27
+ s.add_development_dependency(%q<rdoc>, ["~> 3.11"])
28
28
  s.add_development_dependency(%q<json>, [">= 0"])
29
29
  s.add_development_dependency(%q<hoe>, ["~> 2.12"])
30
+ s.add_development_dependency(%q<rdoc>, ["~> 3.10"])
30
31
  else
31
- s.add_dependency(%q<minitest>, ["~> 2.6"])
32
32
  s.add_dependency(%q<racc>, [">= 1.4.6"])
33
+ s.add_dependency(%q<rdoc>, ["~> 3.11"])
33
34
  s.add_dependency(%q<json>, [">= 0"])
34
35
  s.add_dependency(%q<hoe>, ["~> 2.12"])
36
+ s.add_dependency(%q<rdoc>, ["~> 3.10"])
35
37
  end
36
38
  else
37
- s.add_dependency(%q<minitest>, ["~> 2.6"])
38
39
  s.add_dependency(%q<racc>, [">= 1.4.6"])
40
+ s.add_dependency(%q<rdoc>, ["~> 3.11"])
39
41
  s.add_dependency(%q<json>, [">= 0"])
40
42
  s.add_dependency(%q<hoe>, ["~> 2.12"])
43
+ s.add_dependency(%q<rdoc>, ["~> 3.10"])
41
44
  end
42
45
  end
@@ -3,7 +3,7 @@ require 'journey/gtg/transition_table'
3
3
  module Journey
4
4
  module GTG
5
5
  class Builder
6
- DUMMY = Nodes::Literal.new Object.new # :nodoc:
6
+ DUMMY = Nodes::Dummy.new # :nodoc:
7
7
 
8
8
  attr_reader :root, :ast, :endpoints
9
9
 
@@ -10,8 +10,8 @@ module Journey
10
10
  def initialize
11
11
  @regexp_states = Hash.new { |h,k| h[k] = {} }
12
12
  @string_states = Hash.new { |h,k| h[k] = {} }
13
- @accepting = {}
14
- @memos = Hash.new { |h,k| h[k] = [] }
13
+ @accepting = {}
14
+ @memos = Hash.new { |h,k| h[k] = [] }
15
15
  end
16
16
 
17
17
  def add_accepting state
@@ -109,7 +109,7 @@ module Journey
109
109
  end
110
110
 
111
111
  def alphabet
112
- inverted.values.map(&:keys).flatten.compact.uniq
112
+ inverted.values.map(&:keys).flatten.compact.uniq.sort_by { |x| x.to_s }
113
113
  end
114
114
 
115
115
  ###
@@ -35,13 +35,29 @@ module Journey
35
35
  def type
36
36
  raise NotImplementedError
37
37
  end
38
+
39
+ def symbol?; false; end
40
+ def literal?; false; end
38
41
  end
39
42
 
40
43
  class Terminal < Node
41
44
  alias :symbol :left
42
45
  end
43
46
 
44
- %w{ Symbol Slash Literal Dot }.each do |t|
47
+ class Literal < Terminal
48
+ def literal?; true; end
49
+ def type; :LITERAL; end
50
+ end
51
+
52
+ class Dummy < Literal
53
+ def initialize x = Object.new
54
+ super
55
+ end
56
+
57
+ def literal?; false; end
58
+ end
59
+
60
+ %w{ Symbol Slash Dot }.each do |t|
45
61
  class_eval %{
46
62
  class #{t} < Terminal
47
63
  def type; :#{t.upcase}; end
@@ -62,6 +78,8 @@ module Journey
62
78
  def default_regexp?
63
79
  regexp == DEFAULT_EXP
64
80
  end
81
+
82
+ def symbol?; true; end
65
83
  end
66
84
 
67
85
  class Unary < Node
@@ -103,8 +103,7 @@ module Journey
103
103
  return @separator_re unless @matchers.key? node
104
104
 
105
105
  re = @matchers[node]
106
- # FIXME: is the question mark needed?
107
- "(#{re}?)"
106
+ "(#{re})"
108
107
  end
109
108
 
110
109
  def visit_GROUP node
@@ -121,7 +120,8 @@ module Journey
121
120
  end
122
121
 
123
122
  def visit_STAR node
124
- "(.+)"
123
+ re = @matchers[node.left.to_sym] || '.+'
124
+ "(#{re})"
125
125
  end
126
126
  end
127
127
 
@@ -172,11 +172,11 @@ module Journey
172
172
  to_regexp.source
173
173
  end
174
174
 
175
- private
176
175
  def to_regexp
177
176
  @re ||= regexp_visitor.new(@separators, @requirements).accept spec
178
177
  end
179
178
 
179
+ private
180
180
  def regexp_visitor
181
181
  @anchored ? AnchoredRegexp : UnanchoredRegexp
182
182
  end
data/lib/journey/route.rb CHANGED
@@ -5,6 +5,8 @@ module Journey
5
5
  attr_reader :constraints
6
6
  alias :conditions :constraints
7
7
 
8
+ attr_accessor :precedence
9
+
8
10
  ##
9
11
  # +path+ is a path constraint.
10
12
  # +constraints+ is a hash of constraints to be applied to this route.
@@ -23,6 +25,7 @@ module Journey
23
25
  @required_parts = nil
24
26
  @parts = nil
25
27
  @decorated_ast = nil
28
+ @precedence = 0
26
29
  end
27
30
 
28
31
  def ast
@@ -29,6 +29,14 @@ module Journey
29
29
  env['REQUEST_METHOD']
30
30
  end
31
31
 
32
+ def path_info
33
+ env['PATH_INFO']
34
+ end
35
+
36
+ def ip
37
+ env['REMOTE_ADDR']
38
+ end
39
+
32
40
  def [](k); env[k]; end
33
41
  end
34
42
 
@@ -115,18 +123,17 @@ module Journey
115
123
  end
116
124
 
117
125
  def find_routes env
118
- addr = env['REMOTE_ADDR']
119
- req = request_class.new env
126
+ req = request_class.new env
120
127
 
121
- routes = filter_routes(env['PATH_INFO']) + custom_routes.find_all { |r|
122
- r.path.match(env['PATH_INFO'])
128
+ routes = filter_routes(req.path_info) + custom_routes.find_all { |r|
129
+ r.path.match(req.path_info)
123
130
  }
124
131
 
125
- routes.find_all { |r|
132
+ routes.sort_by(&:precedence).find_all { |r|
126
133
  r.constraints.all? { |k,v| v === req.send(k) } &&
127
- r.verb === env['REQUEST_METHOD']
128
- }.reject { |r| addr && !(r.ip === addr) }.map { |r|
129
- match_data = r.path.match(env['PATH_INFO'])
134
+ r.verb === req.request_method
135
+ }.reject { |r| req.ip && !(r.ip === req.ip) }.map { |r|
136
+ match_data = r.path.match(req.path_info)
130
137
  match_names = match_data.names.map { |n| n.to_sym }
131
138
  match_values = match_data.captures.map { |v| v && Utils.unescape_uri(v) }
132
139
  info = Hash[match_names.zip(match_values).find_all { |_,y| y }]
@@ -58,6 +58,7 @@ module Journey
58
58
  def add_route app, path, conditions, defaults, name = nil
59
59
  route = Route.new(name, app, path, conditions, defaults)
60
60
 
61
+ route.precedence = routes.length
61
62
  routes << route
62
63
  named_routes[name] = route if name && !named_routes[name]
63
64
  clear_cache!
@@ -88,7 +88,8 @@ module Journey
88
88
  if consumed == options
89
89
  nil
90
90
  else
91
- visit node.left
91
+ route = visit node.left
92
+ route.include?("\0") ? nil : route
92
93
  end
93
94
  end
94
95
 
@@ -107,8 +108,7 @@ module Journey
107
108
  def visit_SYMBOL node
108
109
  key = node.to_sym
109
110
 
110
- if options.key? key
111
- value = options[key]
111
+ if value = options[key]
112
112
  consumed[key] = value
113
113
  Router::Utils.escape_path(value)
114
114
  else
@@ -53,7 +53,7 @@ module Journey
53
53
 
54
54
  def test_alphabet
55
55
  table = tt 'a|:a'
56
- assert_equal ['a', /[^\.\/\?]+/], table.alphabet
56
+ assert_equal [/[^\.\/\?]+/, 'a'], table.alphabet
57
57
 
58
58
  table = tt 'a|a'
59
59
  assert_equal ['a'], table.alphabet
@@ -5,16 +5,16 @@ module Journey
5
5
  class TestPattern < MiniTest::Unit::TestCase
6
6
  x = /.+/
7
7
  {
8
- '/:controller(/:action)' => %r{\A/(#{x}?)(?:/([^/.?]+))?\Z},
9
- '/:controller/foo' => %r{\A/(#{x}?)/foo\Z},
10
- '/:controller/:action' => %r{\A/(#{x}?)/([^/.?]+)\Z},
11
- '/:controller' => %r{\A/(#{x}?)\Z},
12
- '/:controller(/:action(/:id))' => %r{\A/(#{x}?)(?:/([^/.?]+)(?:/([^/.?]+))?)?\Z},
13
- '/:controller/:action.xml' => %r{\A/(#{x}?)/([^/.?]+)\.xml\Z},
14
- '/:controller.:format' => %r{\A/(#{x}?)\.([^/.?]+)\Z},
15
- '/:controller(.:format)' => %r{\A/(#{x}?)(?:\.([^/.?]+))?\Z},
16
- '/:controller/*foo' => %r{\A/(#{x}?)/(.+)\Z},
17
- '/:controller/*foo/bar' => %r{\A/(#{x}?)/(.+)/bar\Z},
8
+ '/:controller(/:action)' => %r{\A/(#{x})(?:/([^/.?]+))?\Z},
9
+ '/:controller/foo' => %r{\A/(#{x})/foo\Z},
10
+ '/:controller/:action' => %r{\A/(#{x})/([^/.?]+)\Z},
11
+ '/:controller' => %r{\A/(#{x})\Z},
12
+ '/:controller(/:action(/:id))' => %r{\A/(#{x})(?:/([^/.?]+)(?:/([^/.?]+))?)?\Z},
13
+ '/:controller/:action.xml' => %r{\A/(#{x})/([^/.?]+)\.xml\Z},
14
+ '/:controller.:format' => %r{\A/(#{x})\.([^/.?]+)\Z},
15
+ '/:controller(.:format)' => %r{\A/(#{x})(?:\.([^/.?]+))?\Z},
16
+ '/:controller/*foo' => %r{\A/(#{x})/(.+)\Z},
17
+ '/:controller/*foo/bar' => %r{\A/(#{x})/(.+)/bar\Z},
18
18
  }.each do |path, expected|
19
19
  define_method(:"test_to_regexp_#{path}") do
20
20
  strexp = Router::Strexp.new(
@@ -23,21 +23,21 @@ module Journey
23
23
  ["/", ".", "?"]
24
24
  )
25
25
  path = Pattern.new strexp
26
- assert_equal(expected, path.send(:to_regexp))
26
+ assert_equal(expected, path.to_regexp)
27
27
  end
28
28
  end
29
29
 
30
30
  {
31
- '/:controller(/:action)' => %r{\A/(#{x}?)(?:/([^/.?]+))?},
32
- '/:controller/foo' => %r{\A/(#{x}?)/foo},
33
- '/:controller/:action' => %r{\A/(#{x}?)/([^/.?]+)},
34
- '/:controller' => %r{\A/(#{x}?)},
35
- '/:controller(/:action(/:id))' => %r{\A/(#{x}?)(?:/([^/.?]+)(?:/([^/.?]+))?)?},
36
- '/:controller/:action.xml' => %r{\A/(#{x}?)/([^/.?]+)\.xml},
37
- '/:controller.:format' => %r{\A/(#{x}?)\.([^/.?]+)},
38
- '/:controller(.:format)' => %r{\A/(#{x}?)(?:\.([^/.?]+))?},
39
- '/:controller/*foo' => %r{\A/(#{x}?)/(.+)},
40
- '/:controller/*foo/bar' => %r{\A/(#{x}?)/(.+)/bar},
31
+ '/:controller(/:action)' => %r{\A/(#{x})(?:/([^/.?]+))?},
32
+ '/:controller/foo' => %r{\A/(#{x})/foo},
33
+ '/:controller/:action' => %r{\A/(#{x})/([^/.?]+)},
34
+ '/:controller' => %r{\A/(#{x})},
35
+ '/:controller(/:action(/:id))' => %r{\A/(#{x})(?:/([^/.?]+)(?:/([^/.?]+))?)?},
36
+ '/:controller/:action.xml' => %r{\A/(#{x})/([^/.?]+)\.xml},
37
+ '/:controller.:format' => %r{\A/(#{x})\.([^/.?]+)},
38
+ '/:controller(.:format)' => %r{\A/(#{x})(?:\.([^/.?]+))?},
39
+ '/:controller/*foo' => %r{\A/(#{x})/(.+)},
40
+ '/:controller/*foo/bar' => %r{\A/(#{x})/(.+)/bar},
41
41
  }.each do |path, expected|
42
42
  define_method(:"test_to_non_anchored_regexp_#{path}") do
43
43
  strexp = Router::Strexp.new(
@@ -47,7 +47,7 @@ module Journey
47
47
  false
48
48
  )
49
49
  path = Pattern.new strexp
50
- assert_equal(expected, path.send(:to_regexp))
50
+ assert_equal(expected, path.to_regexp)
51
51
  end
52
52
  end
53
53
 
@@ -101,6 +101,17 @@ module Journey
101
101
  end
102
102
  end
103
103
 
104
+ def test_to_regexp_match_non_optional
105
+ strexp = Router::Strexp.new(
106
+ '/:name',
107
+ { :name => /\d+/ },
108
+ ["/", ".", "?"]
109
+ )
110
+ path = Pattern.new strexp
111
+ assert_match('/123', path)
112
+ refute_match('/', path)
113
+ end
114
+
104
115
  def test_to_regexp_with_group
105
116
  strexp = Router::Strexp.new(
106
117
  '/page/:name',
@@ -157,6 +168,17 @@ module Journey
157
168
  assert_equal %w{ tender 10 }, match.captures
158
169
  end
159
170
 
171
+ def test_star_with_custom_re
172
+ z = /\d+/
173
+ strexp = Router::Strexp.new(
174
+ '/page/*foo',
175
+ { :foo => z },
176
+ ["/", ".", "?"]
177
+ )
178
+ path = Pattern.new strexp
179
+ assert_equal(%r{\A/page/(#{z})\Z}, path.to_regexp)
180
+ end
181
+
160
182
  def test_insensitive_regexp_with_group
161
183
  strexp = Router::Strexp.new(
162
184
  '/page/:name/aaron',
@@ -180,7 +202,7 @@ module Journey
180
202
  def test_to_regexp_defaults
181
203
  path = Pattern.new '/:controller(/:action(/:id))'
182
204
  expected = %r{\A/([^/.?]+)(?:/([^/.?]+)(?:/([^/.?]+))?)?\Z}
183
- assert_equal expected, path.send(:to_regexp)
205
+ assert_equal expected, path.to_regexp
184
206
  end
185
207
 
186
208
  def test_failed_match
data/test/test_route.rb CHANGED
@@ -74,6 +74,20 @@ module Journey
74
74
  assert_equal '/page/10', route.format({ :id => 10 })
75
75
  end
76
76
 
77
+ def test_extras_are_not_included_if_optional_with_parameter
78
+ path = Path::Pattern.new '(/sections/:section)/pages/:id'
79
+ route = Route.new("name", nil, path, { }, { :action => 'show' })
80
+
81
+ assert_equal '/pages/10', route.format({:id => 10})
82
+ end
83
+
84
+ def test_extras_are_not_included_if_optional_parameter_is_nil
85
+ path = Path::Pattern.new '(/sections/:section)/pages/:id'
86
+ route = Route.new("name", nil, path, { }, { :action => 'show' })
87
+
88
+ assert_equal '/pages/10', route.format({:id => 10, :section => nil})
89
+ end
90
+
77
91
  def test_score
78
92
  path = Path::Pattern.new "/page/:id(/:action)(.:format)"
79
93
  specific = Route.new "name", nil, path, {}, {:controller=>"pages", :action=>"show"}
data/test/test_router.rb CHANGED
@@ -26,6 +26,10 @@ module Journey
26
26
  self.called = true
27
27
  'world'
28
28
  end
29
+
30
+ def path_info; env['PATH_INFO']; end
31
+ def request_method; env['REQUEST_METHOD']; end
32
+ def ip; env['REMOTE_ADDR']; end
29
33
  end
30
34
 
31
35
  def test_dashes
@@ -85,6 +89,49 @@ module Journey
85
89
  assert_equal env.env, klass.env
86
90
  end
87
91
 
92
+ class CustomPathRequest < Router::NullReq
93
+ def path_info
94
+ env['custom.path_info']
95
+ end
96
+ end
97
+
98
+ def test_request_class_overrides_path_info
99
+ router = Router.new(routes, {:request_class => CustomPathRequest })
100
+
101
+ exp = Router::Strexp.new '/bar', {}, ['/.?']
102
+ path = Path::Pattern.new exp
103
+
104
+ routes.add_route nil, path, {}, {}, {}
105
+
106
+ env = rails_env 'PATH_INFO' => '/foo', 'custom.path_info' => '/bar'
107
+
108
+ recognized = false
109
+ router.recognize(env) do |r, _, params|
110
+ recognized = true
111
+ end
112
+
113
+ assert recognized, "route should have been recognized"
114
+ end
115
+
116
+ def test_regexp_first_precedence
117
+ add_routes @router, [
118
+ Router::Strexp.new("/whois/:domain", {:domain => /\w+\.[\w\.]+/}, ['/', '.', '?']),
119
+ Router::Strexp.new("/whois/:id(.:format)", {}, ['/', '.', '?'])
120
+ ]
121
+
122
+ env = rails_env 'PATH_INFO' => '/whois/example.com'
123
+
124
+ list = []
125
+ @router.recognize(env) do |r, _, params|
126
+ list << r
127
+ end
128
+ assert_equal 2, list.length
129
+
130
+ r = list.first
131
+
132
+ assert_equal '/whois/:domain', r.path.spec.to_s
133
+ end
134
+
88
135
  def test_required_parts_verified_are_anchored
89
136
  add_routes @router, [
90
137
  Router::Strexp.new("/foo/:id", { :id => /\d/ }, ['/', '.', '?'], false)
data/test/test_routes.rb CHANGED
@@ -34,5 +34,18 @@ module Journey
34
34
  routes.add_route nil, path, {}, {}, {}
35
35
  refute_equal sim, routes.simulator
36
36
  end
37
+
38
+ def test_first_name_wins
39
+ #def add_route app, path, conditions, defaults, name = nil
40
+ routes = Routes.new
41
+
42
+ one = Path::Pattern.new '/hello'
43
+ two = Path::Pattern.new '/aaron'
44
+
45
+ routes.add_route nil, one, {}, {}, 'aaron'
46
+ routes.add_route nil, two, {}, {}, 'aaron'
47
+
48
+ assert_equal '/hello', routes.named_routes['aaron'].path.spec.to_s
49
+ end
37
50
  end
38
51
  end
metadata CHANGED
@@ -1,30 +1,31 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: andyjeffries-journey
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.0.20111022124133
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
8
8
  - Aaron Patterson
9
+ - Andy Jeffries
9
10
  autorequire:
10
11
  bindir: bin
11
12
  cert_chain: []
12
- date: 2012-01-23 00:00:00.000000000Z
13
+ date: 2011-10-22 00:00:00.000000000Z
13
14
  dependencies:
14
15
  - !ruby/object:Gem::Dependency
15
16
  name: minitest
16
- requirement: &70141541897200 !ruby/object:Gem::Requirement
17
+ requirement: &70099054425280 !ruby/object:Gem::Requirement
17
18
  none: false
18
19
  requirements:
19
20
  - - ~>
20
21
  - !ruby/object:Gem::Version
21
- version: '2.10'
22
+ version: '2.6'
22
23
  type: :development
23
24
  prerelease: false
24
- version_requirements: *70141541897200
25
+ version_requirements: *70099054425280
25
26
  - !ruby/object:Gem::Dependency
26
27
  name: racc
27
- requirement: &70141541896340 !ruby/object:Gem::Requirement
28
+ requirement: &70099054424560 !ruby/object:Gem::Requirement
28
29
  none: false
29
30
  requirements:
30
31
  - - ! '>='
@@ -32,10 +33,10 @@ dependencies:
32
33
  version: 1.4.6
33
34
  type: :development
34
35
  prerelease: false
35
- version_requirements: *70141541896340
36
+ version_requirements: *70099054424560
36
37
  - !ruby/object:Gem::Dependency
37
38
  name: json
38
- requirement: &70141541895820 !ruby/object:Gem::Requirement
39
+ requirement: &70099054423700 !ruby/object:Gem::Requirement
39
40
  none: false
40
41
  requirements:
41
42
  - - ! '>='
@@ -43,21 +44,10 @@ dependencies:
43
44
  version: '0'
44
45
  type: :development
45
46
  prerelease: false
46
- version_requirements: *70141541895820
47
- - !ruby/object:Gem::Dependency
48
- name: rdoc
49
- requirement: &70141541895120 !ruby/object:Gem::Requirement
50
- none: false
51
- requirements:
52
- - - ~>
53
- - !ruby/object:Gem::Version
54
- version: '3.10'
55
- type: :development
56
- prerelease: false
57
- version_requirements: *70141541895120
47
+ version_requirements: *70099054423700
58
48
  - !ruby/object:Gem::Dependency
59
49
  name: hoe
60
- requirement: &70141541894340 !ruby/object:Gem::Requirement
50
+ requirement: &70099054423180 !ruby/object:Gem::Requirement
61
51
  none: false
62
52
  requirements:
63
53
  - - ~>
@@ -65,7 +55,7 @@ dependencies:
65
55
  version: '2.12'
66
56
  type: :development
67
57
  prerelease: false
68
- version_requirements: *70141541894340
58
+ version_requirements: *70099054423180
69
59
  description: Journey is a router. It routes requests.
70
60
  email:
71
61
  - aaron@tenderlovemaking.com
@@ -140,9 +130,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
140
130
  - - ! '>='
141
131
  - !ruby/object:Gem::Version
142
132
  version: '0'
143
- segments:
144
- - 0
145
- hash: 3858943851392941251
146
133
  required_rubygems_version: !ruby/object:Gem::Requirement
147
134
  none: false
148
135
  requirements:
@@ -150,7 +137,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
150
137
  - !ruby/object:Gem::Version
151
138
  version: '0'
152
139
  requirements: []
153
- rubyforge_project: andyjeffries-journey
140
+ rubyforge_project: journey
154
141
  rubygems_version: 1.8.10
155
142
  signing_key:
156
143
  specification_version: 3
@@ -169,3 +156,4 @@ test_files:
169
156
  - test/test_route.rb
170
157
  - test/test_router.rb
171
158
  - test/test_routes.rb
159
+ has_rdoc: