mirror of
https://github.com/github/rails.git
synced 2026-04-26 03:00:59 -04:00
Added custom regexps to ASTs that have literal nodes on either side of
symbol nodes. Fixes #4585
This commit is contained in:
@@ -367,7 +367,26 @@ module ActionDispatch
|
||||
SEPARATORS,
|
||||
anchor)
|
||||
|
||||
Journey::Path::Pattern.new(strexp)
|
||||
pattern = Journey::Path::Pattern.new(strexp)
|
||||
|
||||
builder = Journey::GTG::Builder.new pattern.spec
|
||||
|
||||
# Get all the symbol nodes followed by literals that are not the
|
||||
# dummy node.
|
||||
symbols = pattern.spec.grep(Journey::Nodes::Symbol).find_all { |n|
|
||||
builder.followpos(n).first.literal?
|
||||
}
|
||||
|
||||
# Get all the symbol nodes preceded by literals.
|
||||
symbols.concat pattern.spec.find_all(&:literal?).map { |n|
|
||||
builder.followpos(n).first
|
||||
}.find_all(&:symbol?)
|
||||
|
||||
symbols.each { |x|
|
||||
x.regexp = /(?:#{Regexp.union(x.regexp, '-')})+/
|
||||
}
|
||||
|
||||
pattern
|
||||
end
|
||||
private :build_path
|
||||
|
||||
|
||||
@@ -93,6 +93,68 @@ class LegacyRouteSetTests < Test::Unit::TestCase
|
||||
@rs.call(params)[2].join
|
||||
end
|
||||
|
||||
def test_symbols_with_dashes
|
||||
rs.draw do
|
||||
match '/:artist/:song-omg', :to => lambda { |env|
|
||||
resp = JSON.dump env[ActionDispatch::Routing::RouteSet::PARAMETERS_KEY]
|
||||
[200, {}, [resp]]
|
||||
}
|
||||
end
|
||||
|
||||
hash = JSON.load get(URI('http://example.org/journey/faithfully-omg'))
|
||||
assert_equal({"artist"=>"journey", "song"=>"faithfully"}, hash)
|
||||
end
|
||||
|
||||
def test_id_with_dash
|
||||
rs.draw do
|
||||
match '/journey/:id', :to => lambda { |env|
|
||||
resp = JSON.dump env[ActionDispatch::Routing::RouteSet::PARAMETERS_KEY]
|
||||
[200, {}, [resp]]
|
||||
}
|
||||
end
|
||||
|
||||
hash = JSON.load get(URI('http://example.org/journey/faithfully-omg'))
|
||||
assert_equal({"id"=>"faithfully-omg"}, hash)
|
||||
end
|
||||
|
||||
def test_dash_with_custom_regexp
|
||||
rs.draw do
|
||||
match '/:artist/:song-omg', :constraints => { :song => /\d+/ }, :to => lambda { |env|
|
||||
resp = JSON.dump env[ActionDispatch::Routing::RouteSet::PARAMETERS_KEY]
|
||||
[200, {}, [resp]]
|
||||
}
|
||||
end
|
||||
|
||||
hash = JSON.load get(URI('http://example.org/journey/123-omg'))
|
||||
assert_equal({"artist"=>"journey", "song"=>"123"}, hash)
|
||||
assert_equal 'Not Found', get(URI('http://example.org/journey/faithfully-omg'))
|
||||
end
|
||||
|
||||
def test_pre_dash
|
||||
rs.draw do
|
||||
match '/:artist/omg-:song', :to => lambda { |env|
|
||||
resp = JSON.dump env[ActionDispatch::Routing::RouteSet::PARAMETERS_KEY]
|
||||
[200, {}, [resp]]
|
||||
}
|
||||
end
|
||||
|
||||
hash = JSON.load get(URI('http://example.org/journey/omg-faithfully'))
|
||||
assert_equal({"artist"=>"journey", "song"=>"faithfully"}, hash)
|
||||
end
|
||||
|
||||
def test_pre_dash_with_custom_regexp
|
||||
rs.draw do
|
||||
match '/:artist/omg-:song', :constraints => { :song => /\d+/ }, :to => lambda { |env|
|
||||
resp = JSON.dump env[ActionDispatch::Routing::RouteSet::PARAMETERS_KEY]
|
||||
[200, {}, [resp]]
|
||||
}
|
||||
end
|
||||
|
||||
hash = JSON.load get(URI('http://example.org/journey/omg-123'))
|
||||
assert_equal({"artist"=>"journey", "song"=>"123"}, hash)
|
||||
assert_equal 'Not Found', get(URI('http://example.org/journey/omg-faithfully'))
|
||||
end
|
||||
|
||||
def test_regexp_precidence
|
||||
@rs.draw do
|
||||
match '/whois/:domain', :constraints => {
|
||||
|
||||
Reference in New Issue
Block a user