usher 0.5.7 → 0.5.8
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION.yml +2 -2
- data/lib/usher/interface/rails2_2_interface.rb +1 -1
- data/lib/usher/interface/rails2_3_interface.rb +1 -1
- data/lib/usher/node.rb +1 -1
- data/lib/usher/route/variable.rb +1 -1
- data/lib/usher/util/graph.rb +21 -0
- data/lib/usher/util/parser.rb +12 -2
- data/lib/usher/util.rb +1 -0
- data/lib/usher.rb +1 -1
- data/spec/private/recognize_spec.rb +133 -114
- metadata +3 -2
data/VERSION.yml
CHANGED
@@ -12,7 +12,7 @@ class Usher
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def reset!
|
15
|
-
@usher ||= Usher.new(:generator => Usher::Util::Generators::URL.new)
|
15
|
+
@usher ||= Usher.new(:generator => Usher::Util::Generators::URL.new, :request_methods => [:protocol, :domain, :port, :query_string, :remote_ip, :user_agent, :referer, :method, :subdomains])
|
16
16
|
@module ||= Module.new
|
17
17
|
@module.instance_methods.each do |selector|
|
18
18
|
@module.class_eval { remove_method selector }
|
@@ -72,7 +72,7 @@ class Usher
|
|
72
72
|
end
|
73
73
|
|
74
74
|
def reset!
|
75
|
-
@router = Usher.new(:generator => Usher::Util::Generators::URL.new)
|
75
|
+
@router = Usher.new(:generator => Usher::Util::Generators::URL.new, :request_methods => [:protocol, :domain, :port, :query_string, :remote_ip, :user_agent, :referer, :method, :subdomains])
|
76
76
|
@configuration_files = []
|
77
77
|
@module ||= Module.new
|
78
78
|
@controller_route_added = false
|
data/lib/usher/node.rb
CHANGED
@@ -173,7 +173,7 @@ class Usher
|
|
173
173
|
|
174
174
|
def set_path_with_destination(path, destination = path)
|
175
175
|
node = path.parts.inject(self){ |node, key| process_path_part(node, key) }
|
176
|
-
node = process_request_parts(node, request_methods_for_path(path))
|
176
|
+
node = process_request_parts(node, request_methods_for_path(path)) if request_methods
|
177
177
|
|
178
178
|
while node.request_method_type
|
179
179
|
node = (node.request[nil] ||= Node.new(node, Route::RequestMethod.new(node.request_method_type, nil)))
|
data/lib/usher/route/variable.rb
CHANGED
@@ -2,7 +2,7 @@ class Usher
|
|
2
2
|
class Route
|
3
3
|
class Variable
|
4
4
|
attr_reader :type, :name, :validator, :regex_matcher
|
5
|
-
attr_accessor :look_ahead, :default_value
|
5
|
+
attr_accessor :look_ahead, :default_value, :look_ahead_priority
|
6
6
|
|
7
7
|
def initialize(name, regex_matcher = nil, validator = nil)
|
8
8
|
@name = name.to_s.to_sym
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class Usher
|
2
|
+
module Util
|
3
|
+
class Graph
|
4
|
+
|
5
|
+
attr_reader :router
|
6
|
+
|
7
|
+
def initialize(router)
|
8
|
+
@router = router
|
9
|
+
end
|
10
|
+
|
11
|
+
def draw(output)
|
12
|
+
File.open(output, 'w') do |f|
|
13
|
+
f.puts "digraph {"
|
14
|
+
f.puts %|node[label="node"]|
|
15
|
+
f.puts "}"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/usher/util/parser.rb
CHANGED
@@ -44,9 +44,19 @@ class Usher
|
|
44
44
|
part.default_value = default_values[part.name] if part.is_a?(Usher::Route::Variable) && default_values && default_values[part.name]
|
45
45
|
case part
|
46
46
|
when Usher::Route::Variable::Glob
|
47
|
-
part.look_ahead
|
47
|
+
if part.look_ahead && !part.look_ahead_priority
|
48
|
+
part.look_ahead = nil
|
49
|
+
part.look_ahead_priority = true
|
50
|
+
else
|
51
|
+
part.look_ahead = path[index + 1, path.size].find{|p| !p.is_a?(Usher::Route::Variable) && !router.delimiter_chars.include?(p[0])} || nil
|
52
|
+
end
|
48
53
|
when Usher::Route::Variable
|
49
|
-
part.look_ahead
|
54
|
+
if part.look_ahead && !part.look_ahead_priority
|
55
|
+
part.look_ahead = nil
|
56
|
+
part.look_ahead_priority = true
|
57
|
+
else
|
58
|
+
part.look_ahead = path[index + 1, path.size].find{|p| router.delimiter_chars.include?(p[0])} || router.delimiters.first
|
59
|
+
end
|
50
60
|
end
|
51
61
|
end
|
52
62
|
end
|
data/lib/usher/util.rb
CHANGED
data/lib/usher.rb
CHANGED
@@ -53,7 +53,7 @@ class Usher
|
|
53
53
|
self.generator = options && options.delete(:generator)
|
54
54
|
self.delimiters = options && options.delete(:delimiters) || ['/', '.']
|
55
55
|
self.valid_regex = options && options.delete(:valid_regex) || '[0-9A-Za-z\$\-_\+!\*\',]+'
|
56
|
-
self.request_methods = options && options.delete(:request_methods)
|
56
|
+
self.request_methods = options && options.delete(:request_methods)
|
57
57
|
reset!
|
58
58
|
end
|
59
59
|
|
@@ -1,8 +1,6 @@
|
|
1
1
|
require File.expand_path(File.join(File.dirname(__FILE__), "..", "spec_helper"))
|
2
2
|
require "usher"
|
3
3
|
|
4
|
-
route_set = Usher.new
|
5
|
-
|
6
4
|
def build_request(opts)
|
7
5
|
request = mock "Request"
|
8
6
|
opts.each do |k,v|
|
@@ -14,228 +12,249 @@ end
|
|
14
12
|
describe "Usher route recognition" do
|
15
13
|
|
16
14
|
before(:each) do
|
17
|
-
route_set.
|
15
|
+
@route_set = Usher.new(:request_methods => [:protocol, :domain, :port, :query_string, :remote_ip, :user_agent, :referer, :method, :subdomains])
|
18
16
|
end
|
19
17
|
|
20
18
|
describe 'request conditions' do
|
21
19
|
|
22
20
|
it "should recognize a specific domain name" do
|
23
|
-
target_route = route_set.add_route('/sample', :controller => 'sample', :action => 'action', :conditions => {:protocol => 'http'})
|
24
|
-
route_set.add_route('/sample', :controller => 'sample', :action => 'action2', :conditions => {:protocol => 'https'})
|
25
|
-
route_set.recognize(build_request({:method => 'get', :path => '/sample', :protocol => 'http'})).path.route.should == target_route
|
21
|
+
target_route = @route_set.add_route('/sample', :controller => 'sample', :action => 'action', :conditions => {:protocol => 'http'})
|
22
|
+
@route_set.add_route('/sample', :controller => 'sample', :action => 'action2', :conditions => {:protocol => 'https'})
|
23
|
+
@route_set.recognize(build_request({:method => 'get', :path => '/sample', :protocol => 'http'})).path.route.should == target_route
|
26
24
|
end
|
27
25
|
|
28
26
|
it "should recognize a regex domain name" do
|
29
|
-
target_route = route_set.add_route('/sample', :controller => 'sample', :action => 'action', :conditions => {:domain => /^admin.*$/})
|
30
|
-
route_set.add_route('/sample', :controller => 'sample', :action => 'action2', :conditions => {:domain => 'www.host.com'})
|
31
|
-
route_set.recognize(build_request({:method => 'get', :path => '/sample', :domain => 'admin.host.com'})).path.route.should == target_route
|
27
|
+
target_route = @route_set.add_route('/sample', :controller => 'sample', :action => 'action', :conditions => {:domain => /^admin.*$/})
|
28
|
+
@route_set.add_route('/sample', :controller => 'sample', :action => 'action2', :conditions => {:domain => 'www.host.com'})
|
29
|
+
@route_set.recognize(build_request({:method => 'get', :path => '/sample', :domain => 'admin.host.com'})).path.route.should == target_route
|
32
30
|
end
|
33
31
|
|
34
32
|
it "should recognize a specific route when several http-style restrictions are used" do
|
35
|
-
target_route_http_admin_generic = route_set.add_route('/sample', :conditions => {:domain => 'admin.spec.com'})
|
36
|
-
target_route_http_admin = route_set.add_route('/sample', :conditions => {:protocol => 'http', :domain => 'admin.spec.com'})
|
37
|
-
target_route_http_www = route_set.add_route('/sample', :conditions => {:protocol => 'http', :domain => 'www.spec.com'})
|
38
|
-
target_route_https_msie = route_set.add_route('/sample', :conditions => {:protocol => 'https', :domain => 'admin.spec.com', :user_agent => 'MSIE 6.0'})
|
39
|
-
target_route_https_admin = route_set.add_route('/sample', :conditions => {:protocol => 'https', :domain => 'admin.spec.com'})
|
40
|
-
route_set.recognize(build_request({:method => 'get', :path => '/sample', :protocol => 'http', :domain => 'admin.spec.com', :user_agent => nil})).path.route.should == target_route_http_admin
|
41
|
-
route_set.recognize(build_request({:method => 'get', :path => '/sample', :protocol => 'http', :domain => 'www.spec.com', :user_agent => nil})).path.route.should == target_route_http_www
|
42
|
-
route_set.recognize(build_request({:method => 'get', :path => '/sample', :protocol => 'https', :domain => 'admin.spec.com', :user_agent => 'MSIE 6.0'})).path.route.should == target_route_https_msie
|
43
|
-
route_set.recognize(build_request({:method => 'get', :path => '/sample', :protocol => 'https', :domain => 'admin.spec.com', :user_agent => nil})).path.route.should == target_route_https_admin
|
44
|
-
route_set.recognize(build_request({:method => 'put', :path => '/sample', :protocol => 'wacky', :domain => 'admin.spec.com', :user_agent => nil})).path.route.should == target_route_http_admin_generic
|
33
|
+
target_route_http_admin_generic = @route_set.add_route('/sample', :conditions => {:domain => 'admin.spec.com'})
|
34
|
+
target_route_http_admin = @route_set.add_route('/sample', :conditions => {:protocol => 'http', :domain => 'admin.spec.com'})
|
35
|
+
target_route_http_www = @route_set.add_route('/sample', :conditions => {:protocol => 'http', :domain => 'www.spec.com'})
|
36
|
+
target_route_https_msie = @route_set.add_route('/sample', :conditions => {:protocol => 'https', :domain => 'admin.spec.com', :user_agent => 'MSIE 6.0'})
|
37
|
+
target_route_https_admin = @route_set.add_route('/sample', :conditions => {:protocol => 'https', :domain => 'admin.spec.com'})
|
38
|
+
@route_set.recognize(build_request({:method => 'get', :path => '/sample', :protocol => 'http', :domain => 'admin.spec.com', :user_agent => nil})).path.route.should == target_route_http_admin
|
39
|
+
@route_set.recognize(build_request({:method => 'get', :path => '/sample', :protocol => 'http', :domain => 'www.spec.com', :user_agent => nil})).path.route.should == target_route_http_www
|
40
|
+
@route_set.recognize(build_request({:method => 'get', :path => '/sample', :protocol => 'https', :domain => 'admin.spec.com', :user_agent => 'MSIE 6.0'})).path.route.should == target_route_https_msie
|
41
|
+
@route_set.recognize(build_request({:method => 'get', :path => '/sample', :protocol => 'https', :domain => 'admin.spec.com', :user_agent => nil})).path.route.should == target_route_https_admin
|
42
|
+
@route_set.recognize(build_request({:method => 'put', :path => '/sample', :protocol => 'wacky', :domain => 'admin.spec.com', :user_agent => nil})).path.route.should == target_route_http_admin_generic
|
45
43
|
|
46
44
|
end
|
47
45
|
|
48
46
|
it "should correctly fix that tree if conditionals are used later" do
|
49
|
-
noop_route = route_set.add_route('/noop', :controller => 'products', :action => 'noop')
|
50
|
-
product_show_route = route_set.add_route('/products/show/:id', :id => /\d+/, :conditions => {:method => 'get'})
|
51
|
-
route_set.recognize(build_request({:method => 'get', :path => '/noop', :domain => 'admin.host.com'})).path.route.should == noop_route
|
52
|
-
route_set.recognize(build_request({:method => 'get', :path => '/products/show/123', :domain => 'admin.host.com'})).path.route.should == product_show_route
|
47
|
+
noop_route = @route_set.add_route('/noop', :controller => 'products', :action => 'noop')
|
48
|
+
product_show_route = @route_set.add_route('/products/show/:id', :id => /\d+/, :conditions => {:method => 'get'})
|
49
|
+
@route_set.recognize(build_request({:method => 'get', :path => '/noop', :domain => 'admin.host.com'})).path.route.should == noop_route
|
50
|
+
@route_set.recognize(build_request({:method => 'get', :path => '/products/show/123', :domain => 'admin.host.com'})).path.route.should == product_show_route
|
53
51
|
end
|
54
52
|
|
55
53
|
it "should use conditionals that are boolean" do
|
56
54
|
# hijacking user_agent
|
57
|
-
insecure_product_show_route = route_set.add_route('/products/show/:id', :id => /\d+/, :conditions => {:user_agent => false, :method => 'get'})
|
58
|
-
secure_product_show_route = route_set.add_route('/products/show/:id', :id => /\d+/, :conditions => {:user_agent => true, :method => 'get'})
|
55
|
+
insecure_product_show_route = @route_set.add_route('/products/show/:id', :id => /\d+/, :conditions => {:user_agent => false, :method => 'get'})
|
56
|
+
secure_product_show_route = @route_set.add_route('/products/show/:id', :id => /\d+/, :conditions => {:user_agent => true, :method => 'get'})
|
59
57
|
|
60
|
-
secure_product_show_route.should == route_set.recognize(build_request({:method => 'get', :path => '/products/show/123', :domain => 'admin.host.com', :user_agent => true})).path.route
|
61
|
-
insecure_product_show_route.should == route_set.recognize(build_request({:method => 'get', :path => '/products/show/123', :domain => 'admin.host.com', :user_agent => false})).path.route
|
58
|
+
secure_product_show_route.should == @route_set.recognize(build_request({:method => 'get', :path => '/products/show/123', :domain => 'admin.host.com', :user_agent => true})).path.route
|
59
|
+
insecure_product_show_route.should == @route_set.recognize(build_request({:method => 'get', :path => '/products/show/123', :domain => 'admin.host.com', :user_agent => false})).path.route
|
62
60
|
end
|
63
61
|
|
64
62
|
it "should use conditionals that are arrays" do
|
65
63
|
# hijacking user_agent
|
66
|
-
www_product_show_route = route_set.add_route('/products/show/:id', :id => /\d+/, :conditions => {:subdomains => ['www'], :method => 'get'})
|
67
|
-
admin_product_show_route = route_set.add_route('/products/show/:id', :id => /\d+/, :conditions => {:subdomains => ['admin'], :method => 'get'})
|
64
|
+
www_product_show_route = @route_set.add_route('/products/show/:id', :id => /\d+/, :conditions => {:subdomains => ['www'], :method => 'get'})
|
65
|
+
admin_product_show_route = @route_set.add_route('/products/show/:id', :id => /\d+/, :conditions => {:subdomains => ['admin'], :method => 'get'})
|
68
66
|
|
69
|
-
admin_product_show_route.should == route_set.recognize(build_request({:method => 'get', :path => '/products/show/123', :subdomains => ['admin'], :user_agent => true})).path.route
|
70
|
-
www_product_show_route.should == route_set.recognize(build_request({:method => 'get', :path => '/products/show/123', :subdomains => ['www'], :user_agent => false})).path.route
|
67
|
+
admin_product_show_route.should == @route_set.recognize(build_request({:method => 'get', :path => '/products/show/123', :subdomains => ['admin'], :user_agent => true})).path.route
|
68
|
+
www_product_show_route.should == @route_set.recognize(build_request({:method => 'get', :path => '/products/show/123', :subdomains => ['www'], :user_agent => false})).path.route
|
71
69
|
end
|
72
70
|
end
|
73
71
|
|
74
72
|
it "should recognize a format-style variable" do
|
75
|
-
target_route = route_set.add_route('/sample.:format', :controller => 'sample', :action => 'action')
|
76
|
-
route_set.recognize(build_request({:method => 'get', :path => '/sample.html', :domain => 'admin.host.com'})).should == Usher::Node::Response.new(target_route.paths.first, [[:format , 'html']], nil, "/sample.html")
|
73
|
+
target_route = @route_set.add_route('/sample.:format', :controller => 'sample', :action => 'action')
|
74
|
+
@route_set.recognize(build_request({:method => 'get', :path => '/sample.html', :domain => 'admin.host.com'})).should == Usher::Node::Response.new(target_route.paths.first, [[:format , 'html']], nil, "/sample.html")
|
77
75
|
end
|
78
76
|
|
79
77
|
it "should recognize a glob-style variable" do
|
80
|
-
target_route = route_set.add_route('/sample/*format', :controller => 'sample', :action => 'action')
|
81
|
-
route_set.recognize(build_request({:method => 'get', :path => '/sample/html/json/apple'})).params.should == [[:format, ['html', 'json', 'apple']]]
|
78
|
+
target_route = @route_set.add_route('/sample/*format', :controller => 'sample', :action => 'action')
|
79
|
+
@route_set.recognize(build_request({:method => 'get', :path => '/sample/html/json/apple'})).params.should == [[:format, ['html', 'json', 'apple']]]
|
82
80
|
end
|
83
81
|
|
84
82
|
it "should recgonize only a glob-style variable" do
|
85
|
-
target_route = route_set.add_route('/*format')
|
86
|
-
response = route_set.recognize(build_request({:method => 'get', :path => '/sample/html/json/apple'}))
|
83
|
+
target_route = @route_set.add_route('/*format')
|
84
|
+
response = @route_set.recognize(build_request({:method => 'get', :path => '/sample/html/json/apple'}))
|
87
85
|
response.params.should == [[:format, ['sample', 'html', 'json', 'apple']]]
|
88
86
|
response.path.route.should == target_route
|
89
87
|
end
|
90
88
|
|
91
89
|
it "should recgonize a regex static part" do
|
92
|
-
target_route = route_set.add_route('/test/part/{one|two}')
|
93
|
-
route_set.recognize(build_request({:method => 'get', :path => '/test/part/one'})).path.route.should == target_route
|
94
|
-
route_set.recognize(build_request({:method => 'get', :path => '/test/part/two'})).path.route.should == target_route
|
95
|
-
route_set.recognize(build_request({:method => 'get', :path => '/test/part/three'})).should == nil
|
90
|
+
target_route = @route_set.add_route('/test/part/{one|two}')
|
91
|
+
@route_set.recognize(build_request({:method => 'get', :path => '/test/part/one'})).path.route.should == target_route
|
92
|
+
@route_set.recognize(build_request({:method => 'get', :path => '/test/part/two'})).path.route.should == target_route
|
93
|
+
@route_set.recognize(build_request({:method => 'get', :path => '/test/part/three'})).should == nil
|
96
94
|
end
|
97
95
|
|
98
96
|
it "shouldn't accept a nil variable" do
|
99
|
-
target_route = route_set.add_route('/:one')
|
100
|
-
route_set.recognize(build_request({:method => 'get', :path => '/one'})).path.route.should == target_route
|
101
|
-
route_set.recognize(build_request({:method => 'get', :path => '/'})).should == nil
|
97
|
+
target_route = @route_set.add_route('/:one')
|
98
|
+
@route_set.recognize(build_request({:method => 'get', :path => '/one'})).path.route.should == target_route
|
99
|
+
@route_set.recognize(build_request({:method => 'get', :path => '/'})).should == nil
|
102
100
|
end
|
103
101
|
|
104
102
|
it "should recgonize a regex static part containing {}'s" do
|
105
|
-
target_route = route_set.add_route('/test/part/{^o{2,3}$}')
|
106
|
-
route_set.recognize(build_request({:method => 'get', :path => '/test/part/oo'})).path.route.should == target_route
|
107
|
-
route_set.recognize(build_request({:method => 'get', :path => '/test/part/ooo'})).path.route.should == target_route
|
108
|
-
route_set.recognize(build_request({:method => 'get', :path => '/test/part/oooo'})).should == nil
|
103
|
+
target_route = @route_set.add_route('/test/part/{^o{2,3}$}')
|
104
|
+
@route_set.recognize(build_request({:method => 'get', :path => '/test/part/oo'})).path.route.should == target_route
|
105
|
+
@route_set.recognize(build_request({:method => 'get', :path => '/test/part/ooo'})).path.route.should == target_route
|
106
|
+
@route_set.recognize(build_request({:method => 'get', :path => '/test/part/oooo'})).should == nil
|
109
107
|
end
|
110
108
|
|
111
109
|
it "should recgonize a regex single variable" do
|
112
|
-
target_route = route_set.add_route('/test/part/{:test,hello|again}')
|
113
|
-
route_set.recognize(build_request({:method => 'get', :path => '/test/part/hello'})).path.route.should == target_route
|
114
|
-
route_set.recognize(build_request({:method => 'get', :path => '/test/part/hello'})).params.should == [[:test, 'hello']]
|
115
|
-
route_set.recognize(build_request({:method => 'get', :path => '/test/part/again'})).path.route.should == target_route
|
116
|
-
route_set.recognize(build_request({:method => 'get', :path => '/test/part/again'})).params.should == [[:test, 'again']]
|
117
|
-
route_set.recognize(build_request({:method => 'get', :path => '/test/part/world'})).should == nil
|
110
|
+
target_route = @route_set.add_route('/test/part/{:test,hello|again}')
|
111
|
+
@route_set.recognize(build_request({:method => 'get', :path => '/test/part/hello'})).path.route.should == target_route
|
112
|
+
@route_set.recognize(build_request({:method => 'get', :path => '/test/part/hello'})).params.should == [[:test, 'hello']]
|
113
|
+
@route_set.recognize(build_request({:method => 'get', :path => '/test/part/again'})).path.route.should == target_route
|
114
|
+
@route_set.recognize(build_request({:method => 'get', :path => '/test/part/again'})).params.should == [[:test, 'again']]
|
115
|
+
@route_set.recognize(build_request({:method => 'get', :path => '/test/part/world'})).should == nil
|
118
116
|
end
|
119
117
|
|
120
118
|
it "should recgonize a regex glob variable" do
|
121
|
-
target_route = route_set.add_route('/test/part/{*test,^(hello|again|\d+)$}')
|
122
|
-
route_set.recognize(build_request({:method => 'get', :path => '/test/part/hello/again/123/hello/again'})).path.route.should == target_route
|
123
|
-
route_set.recognize(build_request({:method => 'get', :path => '/test/part/hello/again/123/hello/again'})).params.should == [[:test, ['hello', 'again', '123', 'hello', 'again']]]
|
124
|
-
route_set.recognize(build_request({:method => 'get', :path => '/test/part/hello/agaim/123/hello/again'})).should == nil
|
119
|
+
target_route = @route_set.add_route('/test/part/{*test,^(hello|again|\d+)$}')
|
120
|
+
@route_set.recognize(build_request({:method => 'get', :path => '/test/part/hello/again/123/hello/again'})).path.route.should == target_route
|
121
|
+
@route_set.recognize(build_request({:method => 'get', :path => '/test/part/hello/again/123/hello/again'})).params.should == [[:test, ['hello', 'again', '123', 'hello', 'again']]]
|
122
|
+
@route_set.recognize(build_request({:method => 'get', :path => '/test/part/hello/agaim/123/hello/again'})).should == nil
|
125
123
|
end
|
126
124
|
|
127
125
|
it "should recgonize a regex glob variable terminated by a static part" do
|
128
|
-
target_route = route_set.add_route('/test/part/{*test,^(hello|again|\d+)$}/onemore')
|
129
|
-
route_set.recognize(build_request({:method => 'get', :path => '/test/part/hello/again/123/hello/again/onemore'})).path.route.should == target_route
|
130
|
-
route_set.recognize(build_request({:method => 'get', :path => '/test/part/hello/again/123/hello/again/onemore'})).params.should == [[:test, ['hello', 'again', '123', 'hello', 'again']]]
|
126
|
+
target_route = @route_set.add_route('/test/part/{*test,^(hello|again|\d+)$}/onemore')
|
127
|
+
@route_set.recognize(build_request({:method => 'get', :path => '/test/part/hello/again/123/hello/again/onemore'})).path.route.should == target_route
|
128
|
+
@route_set.recognize(build_request({:method => 'get', :path => '/test/part/hello/again/123/hello/again/onemore'})).params.should == [[:test, ['hello', 'again', '123', 'hello', 'again']]]
|
131
129
|
end
|
132
130
|
|
133
131
|
it "should recgonize a regex glob variable terminated by a single regex variable" do
|
134
|
-
target_route = route_set.add_route('/test/part/{*test,^(hello|again|\d+)$}/{:party,onemore}')
|
135
|
-
route_set.recognize(build_request({:method => 'get', :path => '/test/part/hello/again/123/hello/again/onemore'})).path.route.should == target_route
|
136
|
-
route_set.recognize(build_request({:method => 'get', :path => '/test/part/hello/again/123/hello/again/onemore'})).params.should == [[:test, ['hello', 'again', '123', 'hello', 'again']], [:party, 'onemore']]
|
132
|
+
target_route = @route_set.add_route('/test/part/{*test,^(hello|again|\d+)$}/{:party,onemore}')
|
133
|
+
@route_set.recognize(build_request({:method => 'get', :path => '/test/part/hello/again/123/hello/again/onemore'})).path.route.should == target_route
|
134
|
+
@route_set.recognize(build_request({:method => 'get', :path => '/test/part/hello/again/123/hello/again/onemore'})).params.should == [[:test, ['hello', 'again', '123', 'hello', 'again']], [:party, 'onemore']]
|
137
135
|
end
|
138
136
|
|
139
137
|
it "should recgonize a greedy regex single variable" do
|
140
|
-
target_route = route_set.add_route('/test/part/{!test,one/more/time}')
|
141
|
-
route_set.recognize(build_request({:method => 'get', :path => '/test/part/one/more/time'})).path.route.should == target_route
|
142
|
-
route_set.recognize(build_request({:method => 'get', :path => '/test/part/one/more/time'})).params.should == [[:test, 'one/more/time']]
|
138
|
+
target_route = @route_set.add_route('/test/part/{!test,one/more/time}')
|
139
|
+
@route_set.recognize(build_request({:method => 'get', :path => '/test/part/one/more/time'})).path.route.should == target_route
|
140
|
+
@route_set.recognize(build_request({:method => 'get', :path => '/test/part/one/more/time'})).params.should == [[:test, 'one/more/time']]
|
143
141
|
end
|
144
142
|
|
145
143
|
it "should recgonize a greedy regex that matches across / and not" do
|
146
|
-
target_route = route_set.add_route('/test/part/{!test,one/more|one}')
|
147
|
-
route_set.recognize(build_request({:method => 'get', :path => '/test/part/one/more'})).path.route.should == target_route
|
148
|
-
route_set.recognize(build_request({:method => 'get', :path => '/test/part/one/more'})).params.should == [[:test, 'one/more']]
|
149
|
-
route_set.recognize(build_request({:method => 'get', :path => '/test/part/one'})).path.route.should == target_route
|
150
|
-
route_set.recognize(build_request({:method => 'get', :path => '/test/part/one'})).params.should == [[:test, 'one']]
|
144
|
+
target_route = @route_set.add_route('/test/part/{!test,one/more|one}')
|
145
|
+
@route_set.recognize(build_request({:method => 'get', :path => '/test/part/one/more'})).path.route.should == target_route
|
146
|
+
@route_set.recognize(build_request({:method => 'get', :path => '/test/part/one/more'})).params.should == [[:test, 'one/more']]
|
147
|
+
@route_set.recognize(build_request({:method => 'get', :path => '/test/part/one'})).path.route.should == target_route
|
148
|
+
@route_set.recognize(build_request({:method => 'get', :path => '/test/part/one'})).params.should == [[:test, 'one']]
|
151
149
|
end
|
152
150
|
|
153
151
|
it "should recgonize a greedy regex single variable with static parts after" do
|
154
|
-
target_route = route_set.add_route('/test/part/{!test,one/more/time}/help')
|
155
|
-
route_set.recognize(build_request({:method => 'get', :path => '/test/part/one/more/time/help'})).path.route.should == target_route
|
156
|
-
route_set.recognize(build_request({:method => 'get', :path => '/test/part/one/more/time/help'})).params.should == [[:test, 'one/more/time']]
|
152
|
+
target_route = @route_set.add_route('/test/part/{!test,one/more/time}/help')
|
153
|
+
@route_set.recognize(build_request({:method => 'get', :path => '/test/part/one/more/time/help'})).path.route.should == target_route
|
154
|
+
@route_set.recognize(build_request({:method => 'get', :path => '/test/part/one/more/time/help'})).params.should == [[:test, 'one/more/time']]
|
157
155
|
end
|
158
156
|
|
159
157
|
it "should recgonize two glob-style variables separated by a static part" do
|
160
|
-
target_route = route_set.add_route('/*format/innovate/*onemore')
|
161
|
-
response = route_set.recognize(build_request({:method => 'get', :path => '/sample/html/innovate/apple'}))
|
158
|
+
target_route = @route_set.add_route('/*format/innovate/*onemore')
|
159
|
+
response = @route_set.recognize(build_request({:method => 'get', :path => '/sample/html/innovate/apple'}))
|
162
160
|
response.params.should == [[:format, ['sample', 'html']], [:onemore, ['apple']]]
|
163
161
|
response.path.route.should == target_route
|
164
162
|
end
|
165
163
|
|
166
164
|
it "should recgonize only a glob-style variable with a condition" do
|
167
|
-
target_route = route_set.add_route('/*format', :conditions => {:domain => 'test-domain'})
|
168
|
-
response = route_set.recognize(build_request({:method => 'get', :path => '/sample/html/json/apple', :domain => 'test-domain'}))
|
165
|
+
target_route = @route_set.add_route('/*format', :conditions => {:domain => 'test-domain'})
|
166
|
+
response = @route_set.recognize(build_request({:method => 'get', :path => '/sample/html/json/apple', :domain => 'test-domain'}))
|
169
167
|
response.params.should == [[:format, ['sample', 'html', 'json', 'apple']]]
|
170
168
|
response.path.route.should == target_route
|
171
169
|
end
|
172
170
|
|
173
171
|
it "should recognize a format-style literal" do
|
174
|
-
target_route = route_set.add_route('/:action.html', :controller => 'sample', :action => 'action')
|
175
|
-
route_set.recognize(build_request({:method => 'get', :path => '/sample.html', :domain => 'admin.host.com'})).should == Usher::Node::Response.new(target_route.paths.first, [[:action , 'sample']], nil, "/sample.html")
|
172
|
+
target_route = @route_set.add_route('/:action.html', :controller => 'sample', :action => 'action')
|
173
|
+
@route_set.recognize(build_request({:method => 'get', :path => '/sample.html', :domain => 'admin.host.com'})).should == Usher::Node::Response.new(target_route.paths.first, [[:action , 'sample']], nil, "/sample.html")
|
176
174
|
end
|
177
175
|
|
178
176
|
it "should recognize a format-style variable along side another variable" do
|
179
|
-
target_route = route_set.add_route('/:action.:format', :controller => 'sample', :action => 'action')
|
180
|
-
route_set.recognize(build_request({:method => 'get', :path => '/sample.html', :domain => 'admin.host.com'})).should == Usher::Node::Response.new(target_route.paths.first, [[:action , 'sample'], [:format, 'html']], nil, '/sample.html')
|
177
|
+
target_route = @route_set.add_route('/:action.:format', :controller => 'sample', :action => 'action')
|
178
|
+
@route_set.recognize(build_request({:method => 'get', :path => '/sample.html', :domain => 'admin.host.com'})).should == Usher::Node::Response.new(target_route.paths.first, [[:action , 'sample'], [:format, 'html']], nil, '/sample.html')
|
181
179
|
end
|
182
180
|
|
183
181
|
it "should use a requirement (proc) on incoming variables" do
|
184
|
-
route_set.add_route('/:controller/:action/:id', :id => proc{|v| Integer(v)})
|
185
|
-
proc {route_set.recognize(build_request({:method => 'get', :path => '/products/show/123', :domain => 'admin.host.com'}))}.should_not raise_error(Usher::ValidationException)
|
186
|
-
proc {route_set.recognize(build_request({:method => 'get', :path => '/products/show/123asd', :domain => 'admin.host.com'}))}.should raise_error(Usher::ValidationException)
|
182
|
+
@route_set.add_route('/:controller/:action/:id', :id => proc{|v| Integer(v)})
|
183
|
+
proc {@route_set.recognize(build_request({:method => 'get', :path => '/products/show/123', :domain => 'admin.host.com'}))}.should_not raise_error(Usher::ValidationException)
|
184
|
+
proc {@route_set.recognize(build_request({:method => 'get', :path => '/products/show/123asd', :domain => 'admin.host.com'}))}.should raise_error(Usher::ValidationException)
|
187
185
|
end
|
188
186
|
|
189
187
|
it "shouldn't care about mildly weird characters in the URL" do
|
190
|
-
route = route_set.add_route('/!asd,qwe/hjk$qwe/:id')
|
191
|
-
route_set.recognize(build_request({:method => 'get', :path => '/!asd,qwe/hjk$qwe/09AZaz$-_+!*\'', :domain => 'admin.host.com'})).params.rassoc('09AZaz$-_+!*\'').first.should == :id
|
188
|
+
route = @route_set.add_route('/!asd,qwe/hjk$qwe/:id')
|
189
|
+
@route_set.recognize(build_request({:method => 'get', :path => '/!asd,qwe/hjk$qwe/09AZaz$-_+!*\'', :domain => 'admin.host.com'})).params.rassoc('09AZaz$-_+!*\'').first.should == :id
|
192
190
|
end
|
193
191
|
|
194
192
|
it "shouldn't care about non-primary delimiters in the path" do
|
195
|
-
route = route_set.add_route('/testing/:id/testing2/:id2/:id3')
|
196
|
-
route_set.recognize(build_request({:method => 'get', :path => '/testing/asd.qwe/testing2/poi.zxc/oiu.asd'})).params.should == [[:id, 'asd.qwe'], [:id2, 'poi.zxc'], [:id3, 'oiu.asd']]
|
193
|
+
route = @route_set.add_route('/testing/:id/testing2/:id2/:id3')
|
194
|
+
@route_set.recognize(build_request({:method => 'get', :path => '/testing/asd.qwe/testing2/poi.zxc/oiu.asd'})).params.should == [[:id, 'asd.qwe'], [:id2, 'poi.zxc'], [:id3, 'oiu.asd']]
|
195
|
+
end
|
196
|
+
|
197
|
+
it "should pick the path when there are mutliple conflicting delimiters" do
|
198
|
+
@route_set.add_route('/:id1(.:format)')
|
199
|
+
@route_set.add_route('/:id1/one(.:format)')
|
200
|
+
@route_set.add_route('/:id1/one/:id2(.:format)')
|
201
|
+
|
202
|
+
@route_set.recognize(build_request({:path => '/id1'})).params.should == [[:id1, 'id1']]
|
203
|
+
@route_set.recognize(build_request({:path => '/id1.html'})).params.should == [[:id1, 'id1'], [:format, 'html']]
|
204
|
+
@route_set.recognize(build_request({:path => '/id1/one'})).params.should == [[:id1, 'id1']]
|
205
|
+
@route_set.recognize(build_request({:path => '/id1/one.html'})).params.should == [[:id1, 'id1'], [:format, 'html']]
|
206
|
+
@route_set.recognize(build_request({:path => '/id1/one/id2'})).params.should == [[:id1, 'id1'], [:id2, 'id2']]
|
207
|
+
@route_set.recognize(build_request({:path => '/id1/one/id2.html'})).params.should == [[:id1, 'id1'], [:id2, 'id2'], [:format, 'html']]
|
197
208
|
end
|
198
209
|
|
199
210
|
it "should recognize a path with an optional compontnet" do
|
200
|
-
route_set.add_route("/:name(/:surname)", :conditions => {:method => 'get'})
|
201
|
-
result = route_set.recognize(build_request({:method => 'get', :path => '/homer'}))
|
211
|
+
@route_set.add_route("/:name(/:surname)", :conditions => {:method => 'get'})
|
212
|
+
result = @route_set.recognize(build_request({:method => 'get', :path => '/homer'}))
|
202
213
|
result.params.should == [[:name, "homer"]]
|
203
|
-
result = route_set.recognize(build_request({:method => 'get', :path => "/homer/simpson"}))
|
214
|
+
result = @route_set.recognize(build_request({:method => 'get', :path => "/homer/simpson"}))
|
204
215
|
result.params.should == [[:name, "homer"],[:surname, "simpson"]]
|
205
216
|
end
|
206
217
|
|
207
218
|
it "should should raise if malformed variables are used" do
|
208
|
-
route_set.add_route('/products/show/:id', :id => /\d+/, :conditions => {:method => 'get'})
|
209
|
-
proc {route_set.recognize(build_request({:method => 'get', :path => '/products/show/qweasd', :domain => 'admin.host.com'}))}.should raise_error
|
219
|
+
@route_set.add_route('/products/show/:id', :id => /\d+/, :conditions => {:method => 'get'})
|
220
|
+
proc {@route_set.recognize(build_request({:method => 'get', :path => '/products/show/qweasd', :domain => 'admin.host.com'}))}.should raise_error
|
210
221
|
end
|
211
222
|
|
212
223
|
it "should recognize multiple optional parts" do
|
213
|
-
target_route = route_set.add_route('/test(/this)(/too)')
|
214
|
-
route_set.recognize_path('/test').path.route.should == target_route
|
215
|
-
route_set.recognize_path('/test/this').path.route.should == target_route
|
216
|
-
route_set.recognize_path('/test/too').path.route.should == target_route
|
217
|
-
route_set.recognize_path('/test/this/too').path.route.should == target_route
|
224
|
+
target_route = @route_set.add_route('/test(/this)(/too)')
|
225
|
+
@route_set.recognize_path('/test').path.route.should == target_route
|
226
|
+
@route_set.recognize_path('/test/this').path.route.should == target_route
|
227
|
+
@route_set.recognize_path('/test/too').path.route.should == target_route
|
228
|
+
@route_set.recognize_path('/test/this/too').path.route.should == target_route
|
218
229
|
end
|
219
230
|
|
231
|
+
it "should match between two routes where one is more specific from request conditions" do
|
232
|
+
route_with_post = @route_set.add_route("/foo", :conditions => {:method => 'post'})
|
233
|
+
route = @route_set.add_route("/foo")
|
234
|
+
|
235
|
+
@route_set.recognize(build_request({:method => 'post', :path => '/foo'})).path.route.should == route_with_post
|
236
|
+
@route_set.recognize(build_request({:method => 'get', :path => '/foo'})).path.route.should == route
|
237
|
+
end
|
238
|
+
|
220
239
|
describe "partial recognition" do
|
221
240
|
it "should partially match a route" do
|
222
|
-
route = route_set.add_route("/foo")
|
241
|
+
route = @route_set.add_route("/foo")
|
223
242
|
route.match_partially!
|
224
|
-
route_set.recognize(build_request(:method => "get", :path => "/foo/bar")).should == Usher::Node::Response.new(route.paths.first, [], "/bar", '/foo')
|
243
|
+
@route_set.recognize(build_request(:method => "get", :path => "/foo/bar")).should == Usher::Node::Response.new(route.paths.first, [], "/bar", '/foo')
|
225
244
|
end
|
226
245
|
|
227
246
|
it "should partially match a route and use request conditions" do
|
228
|
-
route = route_set.add_route("/foo", :conditions => {:method => 'get'})
|
247
|
+
route = @route_set.add_route("/foo", :conditions => {:method => 'get'})
|
229
248
|
route.match_partially!
|
230
249
|
|
231
|
-
route_set.recognize(build_request({:method => 'get', :path => '/foo/bar'})).path.route.should == route
|
232
|
-
route_set.recognize(build_request({:method => 'post', :path => '/foo/bar'})).should.nil?
|
250
|
+
@route_set.recognize(build_request({:method => 'get', :path => '/foo/bar'})).path.route.should == route
|
251
|
+
@route_set.recognize(build_request({:method => 'post', :path => '/foo/bar'})).should.nil?
|
233
252
|
end
|
234
253
|
|
235
254
|
it "should not match partially when a route is not set as partially matched" do
|
236
|
-
route = route_set.add_route("/foo", :foo => :bar)
|
237
|
-
route_set.recognize(build_request(:path => "/foo")).path.route.should == route
|
238
|
-
route_set.recognize(build_request(:path => "/foo/bar")).should be_nil
|
255
|
+
route = @route_set.add_route("/foo", :foo => :bar)
|
256
|
+
@route_set.recognize(build_request(:path => "/foo")).path.route.should == route
|
257
|
+
@route_set.recognize(build_request(:path => "/foo/bar")).should be_nil
|
239
258
|
end
|
240
259
|
|
241
260
|
|
@@ -243,28 +262,28 @@ describe "Usher route recognition" do
|
|
243
262
|
|
244
263
|
describe "dup safety" do
|
245
264
|
before do
|
246
|
-
route_set.add_route("/foo", :foo => "foo")
|
247
|
-
@r2 = route_set.dup
|
265
|
+
@route_set.add_route("/foo", :foo => "foo")
|
266
|
+
@r2 = @route_set.dup
|
248
267
|
end
|
249
268
|
|
250
269
|
it "should provide a different object" do
|
251
|
-
route_set.should_not eql(@r2)
|
270
|
+
@route_set.should_not eql(@r2)
|
252
271
|
end
|
253
272
|
|
254
273
|
it "should recognize the originals routes in the dup" do
|
255
|
-
route_set.recognize( build_request(:path => "/foo")).path.route.destination.should == {:foo =>"foo"}
|
274
|
+
@route_set.recognize( build_request(:path => "/foo")).path.route.destination.should == {:foo =>"foo"}
|
256
275
|
@r2.recognize( build_request(:path => "/foo")).path.route.destination.should == {:foo =>"foo"}
|
257
276
|
end
|
258
277
|
|
259
278
|
it "should not add routes added to the dup to the original" do
|
260
279
|
@r2.add_route("/bar", :bar => "bar")
|
261
280
|
@r2.recognize( build_request(:path => "/bar")).path.route.destination.should == {:bar => "bar"}
|
262
|
-
route_set.recognize( build_request(:path => "/bar")).should == nil
|
281
|
+
@route_set.recognize( build_request(:path => "/bar")).should == nil
|
263
282
|
end
|
264
283
|
|
265
284
|
it "should not delete routes added to the dup to the original" do
|
266
285
|
@r2.delete_route("/foo")
|
267
|
-
route_set.recognize( build_request(:path => "/foo")).path.route.destination.should == {:foo => "foo"}
|
286
|
+
@route_set.recognize( build_request(:path => "/foo")).path.route.destination.should == {:foo => "foo"}
|
268
287
|
@r2.recognize( build_request(:path => "/foo")).should == nil
|
269
288
|
end
|
270
289
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: usher
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joshua Hull
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-09
|
12
|
+
date: 2009-10-09 00:00:00 -04:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -59,6 +59,7 @@ files:
|
|
59
59
|
- lib/usher/splitter.rb
|
60
60
|
- lib/usher/util.rb
|
61
61
|
- lib/usher/util/generate.rb
|
62
|
+
- lib/usher/util/graph.rb
|
62
63
|
- lib/usher/util/parser.rb
|
63
64
|
- lib/usher/util/rack-mixins.rb
|
64
65
|
- rails/init.rb
|