andyjeffries-journey 1.0.0 → 1.0.0.20111022124133

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/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: