padrino-routing 0.2.9 → 0.4.5
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/Rakefile +1 -1
- data/VERSION +1 -1
- data/lib/padrino-routing.rb +18 -10
- data/lib/padrino-routing/controller_ext.rb +3 -4
- data/padrino-routing.gemspec +2 -2
- data/test/fixtures/routing_app/app.rb +12 -4
- data/test/helper.rb +4 -1
- data/test/test_padrino_routing.rb +31 -5
- metadata +2 -2
data/Rakefile
CHANGED
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.
|
|
1
|
+
0.4.5
|
data/lib/padrino-routing.rb
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
# require 'padrino-core/support_lite'
|
|
2
1
|
Dir[File.dirname(__FILE__) + '/padrino-routing/**/*.rb'].each {|file| require file }
|
|
3
2
|
|
|
4
3
|
module Padrino
|
|
5
|
-
class RouteNotFound < RuntimeError;
|
|
4
|
+
class RouteNotFound < RuntimeError; end
|
|
5
|
+
class InvalidNameSpace < RuntimeError; end
|
|
6
6
|
|
|
7
7
|
module Routing
|
|
8
8
|
def self.registered(app)
|
|
@@ -26,10 +26,14 @@ module Padrino
|
|
|
26
26
|
# Used to define namespaced route configurations in order to group similar routes
|
|
27
27
|
# Class evals the routes but with the namespace assigned which will append to each route
|
|
28
28
|
# namespace(:admin) { get(:show) { "..." } }
|
|
29
|
-
def namespace(
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
29
|
+
def namespace(*args, &block)
|
|
30
|
+
if namespace = args.find { |ns| !ns.kind_of?(Symbol) }
|
|
31
|
+
raise InvalidNameSpace, "The name space #{namespace.inspect} must be a symbol"
|
|
32
|
+
else
|
|
33
|
+
original, @_namespaces = @_namespaces, args
|
|
34
|
+
self.class_eval(&block)
|
|
35
|
+
@_namespaces = original
|
|
36
|
+
end
|
|
33
37
|
end
|
|
34
38
|
|
|
35
39
|
# Hijacking route method in Sinatra to replace a route alias (i.e :account) with the full url string mapping
|
|
@@ -37,16 +41,20 @@ module Padrino
|
|
|
37
41
|
# If the path is not a symbol, nothing is changed and the original route method is invoked
|
|
38
42
|
def route(verb, path, options={}, &block)
|
|
39
43
|
if path.kind_of?(Symbol)
|
|
40
|
-
route_name = [@
|
|
44
|
+
route_name = [@_namespaces, path].flatten.compact
|
|
41
45
|
if mapped_url = options.delete(:map) # constructing named route
|
|
42
46
|
map(*route_name).to(mapped_url)
|
|
43
47
|
path = mapped_url
|
|
44
48
|
else # referencing prior named route
|
|
45
|
-
route_name.unshift(self.app_name.to_sym)
|
|
46
|
-
|
|
49
|
+
path = named_paths[route_name.dup.unshift(self.app_name.to_sym)]
|
|
50
|
+
end
|
|
51
|
+
# If here we don't have a path we autobuild them
|
|
52
|
+
unless path
|
|
53
|
+
mapped_url = "/" + route_name.join("/")
|
|
54
|
+
map(*route_name).to(mapped_url)
|
|
55
|
+
path = mapped_url
|
|
47
56
|
end
|
|
48
57
|
end
|
|
49
|
-
raise RouteNotFound.new("Route alias #{route_name.inspect} is not mapped to a url") unless path
|
|
50
58
|
super verb, path, options, &block
|
|
51
59
|
end
|
|
52
60
|
end
|
|
@@ -3,10 +3,9 @@ if defined?(Padrino::Application) # Extends padrino application if being used
|
|
|
3
3
|
module ControllerNamespacing
|
|
4
4
|
# Makes the routes defined in the block and in the Modules given
|
|
5
5
|
# in `extensions` available to the application
|
|
6
|
-
def controllers_with_namespaces(*
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
namespace(namespace.first) { instance_eval(&block) } if block_given?
|
|
6
|
+
def controllers_with_namespaces(*args, &block)
|
|
7
|
+
return controllers_without_namespaces(*args, &block) unless args.all? { |a| a.kind_of?(Symbol) }
|
|
8
|
+
namespace(*args) { instance_eval(&block) } if block_given?
|
|
10
9
|
end
|
|
11
10
|
|
|
12
11
|
# Makes the routing urls defined in this block and in the Modules given
|
data/padrino-routing.gemspec
CHANGED
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
|
|
6
6
|
Gem::Specification.new do |s|
|
|
7
7
|
s.name = %q{padrino-routing}
|
|
8
|
-
s.version = "0.
|
|
8
|
+
s.version = "0.4.5"
|
|
9
9
|
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
|
11
11
|
s.authors = ["Padrino Team", "Nathan Esquenazi", "Davide D'Agostino", "Arthur Chiu"]
|
|
12
|
-
s.date = %q{
|
|
12
|
+
s.date = %q{2010-01-06}
|
|
13
13
|
s.description = %q{Enhances padrino with a named route mapping system allowing for advanced routes}
|
|
14
14
|
s.email = %q{nesquena@gmail.com}
|
|
15
15
|
s.extra_rdoc_files = [
|
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
require 'sinatra/base'
|
|
2
|
-
require 'haml'
|
|
3
|
-
require 'padrino-routing'
|
|
4
|
-
|
|
5
1
|
class RoutingDemo < Sinatra::Base
|
|
6
2
|
register Padrino::Routing
|
|
7
3
|
|
|
@@ -31,6 +27,18 @@ class RoutingDemo < Sinatra::Base
|
|
|
31
27
|
end
|
|
32
28
|
end
|
|
33
29
|
|
|
30
|
+
namespace :autogenerated, :accounts do
|
|
31
|
+
get :index do
|
|
32
|
+
url_for(:autogenerated, :accounts, :index)
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
namespace :autogenerated, :accounts do
|
|
37
|
+
get :with_mapping, :map => "/autogenerated/accounts/with/mapping" do
|
|
38
|
+
url_for(:autogenerated, :accounts, :with_mapping)
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
34
42
|
get :account do
|
|
35
43
|
"<h1>the account url for #{params[:name]} and id #{params[:id]}</h1>"
|
|
36
44
|
end
|
data/test/helper.rb
CHANGED
|
@@ -4,10 +4,13 @@ require 'shoulda'
|
|
|
4
4
|
require 'mocha'
|
|
5
5
|
require 'rack/test'
|
|
6
6
|
require 'webrat'
|
|
7
|
+
require 'padrino-core'
|
|
8
|
+
require 'padrino-helpers'
|
|
7
9
|
|
|
8
10
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
|
9
11
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
|
10
|
-
|
|
12
|
+
|
|
13
|
+
require 'padrino-routing'
|
|
11
14
|
|
|
12
15
|
class Test::Unit::TestCase
|
|
13
16
|
include Rack::Test::Methods
|
|
@@ -12,32 +12,38 @@ class TestPadrinoRouting < Test::Unit::TestCase
|
|
|
12
12
|
demo.class.map(:admin, :demo).to('/admin/demo/:name')
|
|
13
13
|
assert_equal '/admin/demo/john', demo.url_for(:admin, :demo, :name => 'john')
|
|
14
14
|
end
|
|
15
|
+
|
|
15
16
|
should "support finding known urls ignoring blank extra param" do
|
|
16
17
|
demo = app.new
|
|
17
18
|
demo.class.map(:admin, :demo).to('/admin/demo')
|
|
18
19
|
assert_equal '/admin/demo', demo.url_for(:admin, :demo, :foo => '')
|
|
19
20
|
end
|
|
21
|
+
|
|
20
22
|
should "support calling to_param on an object which supports the call" do
|
|
21
23
|
obj = stub(:to_param => '25', :to_s => "<Fake>")
|
|
22
24
|
demo = app.new
|
|
23
25
|
demo.class.map(:admin, :demo).to('/admin/demo/:foo')
|
|
24
26
|
assert_equal '/admin/demo/25', demo.url_for(:admin, :demo, :foo => obj)
|
|
25
27
|
end
|
|
28
|
+
|
|
26
29
|
should "support finding known urls with named param ignoring blank extra param" do
|
|
27
30
|
demo = app.new
|
|
28
31
|
demo.class.map(:admin, :demo).to('/admin/demo/:name')
|
|
29
32
|
assert_equal '/admin/demo/john', demo.url_for(:admin, :demo, :name => 'john', :foo => ' ')
|
|
30
33
|
end
|
|
34
|
+
|
|
31
35
|
should "support finding known urls with one extra param" do
|
|
32
36
|
demo = app.new
|
|
33
37
|
demo.class.map(:admin, :demo).to('/admin/demo/:name')
|
|
34
38
|
assert_equal '/admin/demo/john?foo=bar', demo.url_for(:admin, :demo, :name => 'john', :foo => 'bar')
|
|
35
39
|
end
|
|
40
|
+
|
|
36
41
|
should "support finding known urls with extra params" do
|
|
37
42
|
demo = app.new
|
|
38
43
|
demo.class.map(:demo).to('/demo/:name')
|
|
39
44
|
assert_equal '/demo/john?bar=foo&foo=bar', demo.url_for(:demo, :name => 'john', :foo => 'bar', :bar => 'foo')
|
|
40
45
|
end
|
|
46
|
+
|
|
41
47
|
should "support finding known urls with multiple named params with extra params" do
|
|
42
48
|
demo = app.new
|
|
43
49
|
demo.class.map(:demo).to('/demo/:name/id/:id')
|
|
@@ -52,11 +58,13 @@ class TestPadrinoRouting < Test::Unit::TestCase
|
|
|
52
58
|
assert_have_selector :p, :class => 'account_url', :content => '/the/accounts/foobar/path/10/end'
|
|
53
59
|
assert_have_selector :p, :class => 'accounts_index', :content => '/the/accounts/index'
|
|
54
60
|
end
|
|
61
|
+
|
|
55
62
|
should "display admin route links" do
|
|
56
63
|
assert_have_selector :p, :class => 'admin_url', :content => '/admin/25/show'
|
|
57
64
|
assert_have_selector :p, :class => 'admin_url2', :content => '/admin/10/update/test'
|
|
58
65
|
assert_have_selector :p, :class => 'admin_url3', :content => '/admin/12/destroy'
|
|
59
66
|
end
|
|
67
|
+
|
|
60
68
|
should "support app namespaces" do
|
|
61
69
|
assert_have_selector :p, :class => 'app_accounts_index', :content => '/the/accounts/index'
|
|
62
70
|
assert_have_selector :p, :class => 'app_admin_url', :content => '/admin/25/show'
|
|
@@ -71,6 +79,7 @@ class TestPadrinoRouting < Test::Unit::TestCase
|
|
|
71
79
|
assert_equal "/demo", demo.class.named_paths[[:routing_demo, :demo]]
|
|
72
80
|
assert_equal "/demo", demo.url_for(:demo)
|
|
73
81
|
end
|
|
82
|
+
|
|
74
83
|
should "support changing uri root with mount" do
|
|
75
84
|
demo = app.new
|
|
76
85
|
demo.class.stubs(:uri_root).returns("/blog")
|
|
@@ -85,27 +94,44 @@ class TestPadrinoRouting < Test::Unit::TestCase
|
|
|
85
94
|
assert_nothing_raised { app.new.url_for(:accounts) }
|
|
86
95
|
assert_nothing_raised { app.new.url_for(:routing_demo, :admin, :show, :id => 5) }
|
|
87
96
|
end
|
|
97
|
+
|
|
88
98
|
should "properly raise not found exception" do
|
|
89
99
|
assert_raises(Padrino::RouteNotFound) { visit '/failed_route' }
|
|
90
100
|
assert_raises(Padrino::RouteNotFound) { app.new.url_for(:admin, :fake) }
|
|
91
101
|
end
|
|
92
|
-
|
|
93
|
-
|
|
102
|
+
|
|
103
|
+
should "properly autogenerate routes" do
|
|
104
|
+
assert_nothing_raised { app.get(:fake) do; end }
|
|
94
105
|
end
|
|
106
|
+
|
|
95
107
|
should "properly work when alias is used in proper route definition" do
|
|
96
108
|
assert_nothing_raised { app.get(:accounts) do; end }
|
|
97
109
|
end
|
|
98
110
|
end
|
|
99
111
|
|
|
112
|
+
context 'for autogenerated routed' do
|
|
113
|
+
setup { visit '/autogenerated/accounts/index' }
|
|
114
|
+
should "return proper content" do
|
|
115
|
+
assert_equal '/autogenerated/accounts/index', response_body
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
context 'for autogenerated routed with mapping' do
|
|
120
|
+
setup { visit '/autogenerated/accounts/with/mapping' }
|
|
121
|
+
should "return proper content" do
|
|
122
|
+
assert_equal '/autogenerated/accounts/with/mapping', response_body
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
100
126
|
context 'for no namespaced account route' do
|
|
101
|
-
setup { visit '/the/accounts/demo/path/5/end'}
|
|
127
|
+
setup { visit '/the/accounts/demo/path/5/end' }
|
|
102
128
|
should "return proper account text" do
|
|
103
129
|
assert_have_selector :h1, :content => "the account url for demo and id 5"
|
|
104
130
|
end
|
|
105
131
|
end
|
|
106
132
|
|
|
107
133
|
context 'for no namespaced accounts index route' do
|
|
108
|
-
setup { visit '/the/accounts/index/'}
|
|
134
|
+
setup { visit '/the/accounts/index/' }
|
|
109
135
|
should "return proper account text" do
|
|
110
136
|
assert_have_selector :h1, :content => "the accounts index"
|
|
111
137
|
end
|
|
@@ -131,4 +157,4 @@ class TestPadrinoRouting < Test::Unit::TestCase
|
|
|
131
157
|
assert_have_selector :p, :content => "destroy admin with id 60"
|
|
132
158
|
end
|
|
133
159
|
end
|
|
134
|
-
end
|
|
160
|
+
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: padrino-routing
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.4.5
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Padrino Team
|
|
@@ -12,7 +12,7 @@ autorequire:
|
|
|
12
12
|
bindir: bin
|
|
13
13
|
cert_chain: []
|
|
14
14
|
|
|
15
|
-
date:
|
|
15
|
+
date: 2010-01-06 00:00:00 +01:00
|
|
16
16
|
default_executable:
|
|
17
17
|
dependencies:
|
|
18
18
|
- !ruby/object:Gem::Dependency
|