padrino-core 0.9.13 → 0.9.14
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/bin/padrino +1 -0
- data/lib/padrino-core/application/mounter.rb +65 -23
- data/lib/padrino-core/application.rb +5 -1
- data/lib/padrino-core/cli/console.rb +2 -2
- data/lib/padrino-core/cli/rake.rb +27 -19
- data/lib/padrino-core/reloader.rb +1 -1
- data/lib/padrino-core/version.rb +1 -1
- data/test/fixtures/apps/complex.rb +1 -1
- data/test/test_application.rb +5 -2
- data/test/test_mounter.rb +54 -3
- metadata +8 -8
data/bin/padrino
CHANGED
@@ -15,12 +15,12 @@ module Padrino
|
|
15
15
|
attr_accessor :name, :uri_root, :app_file, :app_class, :app_root, :app_obj, :app_host
|
16
16
|
|
17
17
|
def initialize(name, options={})
|
18
|
-
@name = name.underscore
|
19
|
-
@app_class = options[:app_class] || name.
|
18
|
+
@name = name.to_s.underscore
|
19
|
+
@app_class = options[:app_class] || @name.camelize
|
20
20
|
@app_file = options[:app_file] || locate_app_file
|
21
|
-
|
21
|
+
@app_obj = options[:app_obj] || app_constant || locate_app_object
|
22
|
+
ensure_app_file! || ensure_app_object!
|
22
23
|
@app_root = options[:app_root] || File.dirname(@app_file)
|
23
|
-
@app_obj = self.app_object
|
24
24
|
@uri_root = "/"
|
25
25
|
end
|
26
26
|
|
@@ -67,20 +67,47 @@ module Padrino
|
|
67
67
|
app_obj.set :public, Padrino.root('public', app_data.uri_root)
|
68
68
|
app_obj.set :static, File.exist?(app_obj.public)
|
69
69
|
app_obj.setup_application! # We need to initialize here the app.
|
70
|
-
router.map(:
|
70
|
+
router.map(:to => app_obj, :path => app_data.uri_root, :host => app_data.app_host)
|
71
71
|
end
|
72
72
|
|
73
|
+
###
|
74
|
+
# Returns the route objects for the mounted application
|
75
|
+
#
|
76
|
+
def routes
|
77
|
+
app_obj.routes
|
78
|
+
end
|
79
|
+
|
80
|
+
###
|
81
|
+
# Returns the basic route information for each named route
|
82
|
+
#
|
83
|
+
#
|
84
|
+
def named_routes
|
85
|
+
app_obj.routes.map { |route|
|
86
|
+
name_array = "(#{route.named.to_s.split("_").map { |piece| %Q[:#{piece}] }.join(", ")})"
|
87
|
+
request_method = route.as_options[:conditions][:request_method][0]
|
88
|
+
full_path = File.join(self.uri_root, route.path)
|
89
|
+
next if route.named.blank? || request_method == 'HEAD'
|
90
|
+
OpenStruct.new(:verb => request_method, :identifier => route.named, :name => name_array, :path => full_path)
|
91
|
+
}.compact
|
92
|
+
end
|
93
|
+
|
94
|
+
##
|
95
|
+
# Makes two Mounters equal if they have the same name and uri_root
|
96
|
+
#
|
97
|
+
def ==(other)
|
98
|
+
other.is_a?(Mounter) && self.app_class == other.app_class && self.uri_root == other.uri_root
|
99
|
+
end
|
100
|
+
|
101
|
+
protected
|
102
|
+
|
73
103
|
##
|
74
|
-
#
|
75
|
-
#
|
76
|
-
def
|
77
|
-
begin
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
Padrino.require_dependencies(app_file)
|
82
|
-
app_class.constantize
|
83
|
-
end
|
104
|
+
# Locates and requires the file to load the app constant
|
105
|
+
#
|
106
|
+
def locate_app_object
|
107
|
+
@_app_object ||= begin
|
108
|
+
ensure_app_file!
|
109
|
+
Padrino.require_dependencies(app_file)
|
110
|
+
app_constant
|
84
111
|
end
|
85
112
|
end
|
86
113
|
|
@@ -89,18 +116,34 @@ module Padrino
|
|
89
116
|
#
|
90
117
|
def locate_app_file
|
91
118
|
candidates = []
|
92
|
-
candidates <<
|
119
|
+
candidates << app_constant.app_file if app_constant.respond_to?(:app_file) && File.exist?(app_constant.app_file.to_s)
|
93
120
|
candidates << Padrino.first_caller if File.identical?(Padrino.first_caller.to_s, Padrino.called_from.to_s)
|
94
121
|
candidates << Padrino.mounted_root(name, "app.rb")
|
95
122
|
candidates << Padrino.root("app", "app.rb")
|
96
123
|
candidates.find { |candidate| File.exist?(candidate) }
|
97
124
|
end
|
98
|
-
|
125
|
+
|
99
126
|
##
|
100
|
-
#
|
127
|
+
# Returns the class object for the app if defined, nil otherwise
|
101
128
|
#
|
102
|
-
def
|
103
|
-
|
129
|
+
def app_constant
|
130
|
+
app_class.constantize if Object.const_defined?(app_class)
|
131
|
+
end
|
132
|
+
|
133
|
+
###
|
134
|
+
# Raises an exception unless app_file is located properly
|
135
|
+
#
|
136
|
+
def ensure_app_file!
|
137
|
+
message = "Unable to locate source file for app '#{name}', try with :app_file => '/path/app.rb'"
|
138
|
+
raise MounterException, message unless @app_file
|
139
|
+
end
|
140
|
+
|
141
|
+
###
|
142
|
+
# Raises an exception unless app_obj is defined properly
|
143
|
+
#
|
144
|
+
def ensure_app_object!
|
145
|
+
message = "Unable to locate app for '#{name}', try with :app_class => 'MyAppClass'"
|
146
|
+
raise MounterException, message unless @app_obj
|
104
147
|
end
|
105
148
|
end
|
106
149
|
|
@@ -125,8 +168,7 @@ module Padrino
|
|
125
168
|
# Inserts a Mounter object into the mounted applications (avoids duplicates)
|
126
169
|
#
|
127
170
|
def insert_mounted_app(mounter)
|
128
|
-
|
129
|
-
Padrino.mounted_apps << mounter
|
171
|
+
Padrino.mounted_apps.push(mounter) unless Padrino.mounted_apps.include?(mounter)
|
130
172
|
end
|
131
173
|
|
132
174
|
##
|
@@ -138,7 +180,7 @@ module Padrino
|
|
138
180
|
# Padrino.mount_core(:app_file => "/path/to/file", :app_class => "Blog")
|
139
181
|
#
|
140
182
|
def mount_core(*args)
|
141
|
-
# TODO Remove this in 0.9.
|
183
|
+
# TODO Remove this in 0.9.14 or pre 1.0
|
142
184
|
warn "DEPRECATION! #{Padrino.first_caller}: Padrino.mount_core has been deprecated.\nUse Padrino.mount('AppName').to('/') instead"
|
143
185
|
options = args.extract_options!
|
144
186
|
app_class = args.size > 0 ? args.first.to_s.camelize : nil
|
@@ -23,29 +23,37 @@ Dir["lib/tasks/**/*.rake"].
|
|
23
23
|
# setting up the required environment for Padrino
|
24
24
|
task :environment do
|
25
25
|
Padrino.mounted_apps.each do |app|
|
26
|
-
app.
|
26
|
+
app.app_obj.setup_application!
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
|
-
|
30
|
+
# lists all routes of a given app
|
31
|
+
def list_app_routes(app, args)
|
32
|
+
app_routes = app.named_routes
|
33
|
+
app_routes.reject! { |r| r.identifier.to_s !~ /#{args.query}/ } if args.query.present?
|
34
|
+
app_routes.map! { |r| [r.verb, r.name, r.path] }
|
35
|
+
return if app_routes.empty?
|
36
|
+
shell.say "\nApplication: #{app.app_class}", :yellow
|
37
|
+
app_routes.unshift(["REQUEST", "URL", "PATH"])
|
38
|
+
max_col_1 = app_routes.max { |a, b| a[0].size <=> b[0].size }[0].size
|
39
|
+
max_col_2 = app_routes.max { |a, b| a[1].size <=> b[1].size }[1].size
|
40
|
+
app_routes.each_with_index do |row, i|
|
41
|
+
message = [row[1].ljust(max_col_2+2), row[0].center(max_col_1+2), row[2]]
|
42
|
+
shell.say(" " + message.join(" "), i==0 ? :bold : nil)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
desc "Displays a listing of the named routes within a project, optionally only those matched by [query]"
|
31
47
|
task :routes, :query, :needs => :environment do |t, args|
|
32
48
|
Padrino.mounted_apps.each do |app|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
end
|
43
|
-
app_routes.unshift(["REQUEST", "URL", "PATH"])
|
44
|
-
max_col_1 = app_routes.max { |a, b| a[0].size <=> b[0].size }[0].size
|
45
|
-
max_col_2 = app_routes.max { |a, b| a[1].size <=> b[1].size }[1].size
|
46
|
-
app_routes.each_with_index do |row, i|
|
47
|
-
message = [row[1].ljust(max_col_2+2), row[0].center(max_col_1+2), row[2]]
|
48
|
-
shell.say(" " + message.join(" "), i==0 ? :bold : nil)
|
49
|
-
end
|
49
|
+
list_app_routes(app, args)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
desc "Displays a listing of the named routes a given app [app]"
|
54
|
+
namespace :routes do
|
55
|
+
task :app, :app, :needs => :environment do |t, args|
|
56
|
+
app = Padrino.mounted_apps.find { |app| app.app_class == args.app }
|
57
|
+
list_app_routes(app, args) if app
|
50
58
|
end
|
51
59
|
end
|
@@ -84,7 +84,7 @@ module Padrino
|
|
84
84
|
# If the file is related to their app (i.e. a controller/mailer/helper)
|
85
85
|
if app = Padrino.mounted_apps.find { |a| file =~ /^#{File.dirname(a.app_file)}/ }
|
86
86
|
# We need to reload their own app
|
87
|
-
app.
|
87
|
+
app.app_obj.reload!
|
88
88
|
# App reloading will also perform safe_load of itself so we can go next
|
89
89
|
if File.identical?(app.app_file, file)
|
90
90
|
MTIMES[file] = mtime # This prevent a loop
|
data/lib/padrino-core/version.rb
CHANGED
data/test/test_application.rb
CHANGED
@@ -3,6 +3,10 @@ require File.expand_path(File.dirname(__FILE__) + '/helper')
|
|
3
3
|
class PadrinoTestApp < Padrino::Application; end
|
4
4
|
|
5
5
|
class TestApplication < Test::Unit::TestCase
|
6
|
+
def setup
|
7
|
+
Padrino.mounted_apps.clear
|
8
|
+
end
|
9
|
+
|
6
10
|
def teardown
|
7
11
|
remove_views
|
8
12
|
end
|
@@ -29,7 +33,7 @@ class TestApplication < Test::Unit::TestCase
|
|
29
33
|
assert !PadrinoTestApp.flash
|
30
34
|
end
|
31
35
|
|
32
|
-
#compare to: test_routing: allow global provides
|
36
|
+
# compare to: test_routing: allow global provides
|
33
37
|
should "set content_type to :html if none can be determined" do
|
34
38
|
mock_app do
|
35
39
|
provides :xml
|
@@ -46,6 +50,5 @@ class TestApplication < Test::Unit::TestCase
|
|
46
50
|
get '/bar', {}, { 'HTTP_ACCEPT' => 'application/xml' }
|
47
51
|
assert_equal "Foo in html", body
|
48
52
|
end
|
49
|
-
|
50
53
|
end
|
51
54
|
end
|
data/test/test_mounter.rb
CHANGED
@@ -39,7 +39,7 @@ class TestMounter < Test::Unit::TestCase
|
|
39
39
|
assert_equal ["an_app"], Padrino.mounted_apps.collect(&:name)
|
40
40
|
end
|
41
41
|
|
42
|
-
should 'mount a
|
42
|
+
should 'mount a primary app to root uri' do
|
43
43
|
mounter = Padrino.mount("test", :app_file => __FILE__).to("/")
|
44
44
|
assert_equal "test", mounter.name
|
45
45
|
assert_equal "Test", mounter.app_class
|
@@ -49,7 +49,7 @@ class TestMounter < Test::Unit::TestCase
|
|
49
49
|
assert_equal File.dirname(mounter.app_file), mounter.app_root
|
50
50
|
end
|
51
51
|
|
52
|
-
should 'mount a
|
52
|
+
should 'mount a primary app to sub_uri' do
|
53
53
|
mounter = Padrino.mount("test", :app_file => __FILE__).to('/me')
|
54
54
|
assert_equal "test", mounter.name
|
55
55
|
assert_equal "Test", mounter.app_class
|
@@ -59,6 +59,16 @@ class TestMounter < Test::Unit::TestCase
|
|
59
59
|
assert_equal File.dirname(mounter.app_file), mounter.app_root
|
60
60
|
end
|
61
61
|
|
62
|
+
should "raise error when app has no located file" do
|
63
|
+
assert_raise(Padrino::Mounter::MounterException) { Padrino.mount("tester_app").to('/test') }
|
64
|
+
assert_equal 0, Padrino.mounted_apps.size
|
65
|
+
end
|
66
|
+
|
67
|
+
should "raise error when app has no located object" do
|
68
|
+
assert_raise(Padrino::Mounter::MounterException) { Padrino.mount("tester_app", :app_file => "/path/to/file.rb").to('/test') }
|
69
|
+
assert_equal 0, Padrino.mounted_apps.size
|
70
|
+
end
|
71
|
+
|
62
72
|
should 'mount multiple apps' do
|
63
73
|
class ::OneApp < Padrino::Application; end
|
64
74
|
class ::TwoApp < Padrino::Application; end
|
@@ -84,6 +94,47 @@ class TestMounter < Test::Unit::TestCase
|
|
84
94
|
assert_equal Padrino.root("test", "app.rb"), Padrino.mounted_root("test", "app.rb")
|
85
95
|
end
|
86
96
|
|
97
|
+
should "be able to access routes data for mounted apps" do
|
98
|
+
class ::OneApp < Padrino::Application
|
99
|
+
get("/test") { "test" }
|
100
|
+
get(:index, :provides => [:js, :json]) { "index" }
|
101
|
+
controllers :posts do
|
102
|
+
get(:index) { "index" }
|
103
|
+
get(:new, :provides => :js) { "new" }
|
104
|
+
get(:show, :provides => [:js, :html], :with => :id) { "show" }
|
105
|
+
post(:create, :provides => :js, :with => :id) { "create" }
|
106
|
+
end
|
107
|
+
end
|
108
|
+
class ::TwoApp < Padrino::Application
|
109
|
+
controllers :users do
|
110
|
+
get(:index) { "users" }
|
111
|
+
get(:new) { "users new" }
|
112
|
+
post(:create) { "users create" }
|
113
|
+
put(:update) { "users update" }
|
114
|
+
delete(:destroy) { "users delete" }
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
Padrino.mount("one_app").to("/")
|
119
|
+
Padrino.mount("two_app").to("/two_app")
|
120
|
+
|
121
|
+
assert_equal 11, Padrino.mounted_apps[0].routes.size
|
122
|
+
assert_equal 7, Padrino.mounted_apps[1].routes.size
|
123
|
+
assert_equal 5, Padrino.mounted_apps[0].named_routes.size
|
124
|
+
assert_equal 5, Padrino.mounted_apps[1].named_routes.size
|
125
|
+
|
126
|
+
first_route = Padrino.mounted_apps[0].named_routes[3]
|
127
|
+
assert_equal "posts_show", first_route.identifier.to_s
|
128
|
+
assert_equal "(:posts, :show)", first_route.name
|
129
|
+
assert_equal "GET", first_route.verb
|
130
|
+
assert_equal "/posts/show/:id(.:format)", first_route.path
|
131
|
+
another_route = Padrino.mounted_apps[1].named_routes[2]
|
132
|
+
assert_equal "users_create", another_route.identifier.to_s
|
133
|
+
assert_equal "(:users, :create)", another_route.name
|
134
|
+
assert_equal "POST", another_route.verb
|
135
|
+
assert_equal "/two_app/users/create", another_route.path
|
136
|
+
end
|
137
|
+
|
87
138
|
should 'correctly instantiate a new padrino application' do
|
88
139
|
mock_app do
|
89
140
|
get("/demo_1"){ "Im Demo 1" }
|
@@ -96,4 +147,4 @@ class TestMounter < Test::Unit::TestCase
|
|
96
147
|
assert_equal "Im Demo 2", body
|
97
148
|
end
|
98
149
|
end
|
99
|
-
end
|
150
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: padrino-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 39
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 9
|
9
|
-
-
|
10
|
-
version: 0.9.
|
9
|
+
- 14
|
10
|
+
version: 0.9.14
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Padrino Team
|
@@ -18,7 +18,7 @@ autorequire:
|
|
18
18
|
bindir: bin
|
19
19
|
cert_chain: []
|
20
20
|
|
21
|
-
date: 2010-06-
|
21
|
+
date: 2010-06-30 00:00:00 -07:00
|
22
22
|
default_executable: padrino
|
23
23
|
dependencies:
|
24
24
|
- !ruby/object:Gem::Dependency
|
@@ -43,12 +43,12 @@ dependencies:
|
|
43
43
|
requirements:
|
44
44
|
- - ">="
|
45
45
|
- !ruby/object:Gem::Version
|
46
|
-
hash:
|
46
|
+
hash: 19
|
47
47
|
segments:
|
48
48
|
- 0
|
49
|
-
-
|
50
|
-
-
|
51
|
-
version: 0.
|
49
|
+
- 3
|
50
|
+
- 0
|
51
|
+
version: 0.3.0
|
52
52
|
type: :runtime
|
53
53
|
name: http_router
|
54
54
|
prerelease: false
|