padrino-core 0.12.0 → 0.12.1
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.
- checksums.yaml +4 -4
- data/lib/padrino-core.rb +4 -4
- data/lib/padrino-core/application.rb +6 -195
- data/lib/padrino-core/application/application_setup.rb +199 -0
- data/lib/padrino-core/application/routing.rb +66 -25
- data/lib/padrino-core/cli/base.rb +8 -5
- data/lib/padrino-core/cli/rake.rb +12 -9
- data/lib/padrino-core/loader.rb +1 -1
- data/lib/padrino-core/logger.rb +25 -0
- data/lib/padrino-core/mounter.rb +8 -3
- data/lib/padrino-core/reloader.rb +2 -2
- data/lib/padrino-core/server.rb +50 -17
- data/lib/padrino-core/version.rb +1 -1
- data/padrino-core.gemspec +2 -10
- data/test/fixtures/apps/demo_app.rb +7 -0
- data/test/fixtures/apps/demo_demo.rb +7 -0
- data/test/helper.rb +6 -37
- data/test/test_application.rb +12 -13
- data/test/test_core.rb +12 -13
- data/test/test_csrf_protection.rb +49 -23
- data/test/test_dependencies.rb +7 -7
- data/test/test_filters.rb +41 -17
- data/test/test_flash.rb +24 -24
- data/test/test_locale.rb +1 -1
- data/test/test_logger.rb +39 -27
- data/test/test_mounter.rb +34 -20
- data/test/test_reloader_complex.rb +5 -6
- data/test/test_reloader_simple.rb +23 -20
- data/test/test_reloader_system.rb +10 -7
- data/test/test_restful_routing.rb +1 -1
- data/test/test_router.rb +7 -7
- data/test/test_routing.rb +177 -141
- metadata +14 -53
- data/lib/padrino-core/application/rendering.rb +0 -325
- data/lib/padrino-core/application/rendering/extensions/erubis.rb +0 -68
- data/lib/padrino-core/application/rendering/extensions/haml.rb +0 -29
- data/lib/padrino-core/application/rendering/extensions/slim.rb +0 -21
- data/lib/padrino-core/locale/cs.yml +0 -33
- data/lib/padrino-core/locale/da.yml +0 -33
- data/lib/padrino-core/locale/de.yml +0 -33
- data/lib/padrino-core/locale/en.yml +0 -33
- data/lib/padrino-core/locale/es.yml +0 -33
- data/lib/padrino-core/locale/fr.yml +0 -33
- data/lib/padrino-core/locale/hu.yml +0 -33
- data/lib/padrino-core/locale/it.yml +0 -39
- data/lib/padrino-core/locale/ja.yml +0 -33
- data/lib/padrino-core/locale/lv.yml +0 -33
- data/lib/padrino-core/locale/nl.yml +0 -33
- data/lib/padrino-core/locale/no.yml +0 -33
- data/lib/padrino-core/locale/pl.yml +0 -33
- data/lib/padrino-core/locale/pt_br.yml +0 -39
- data/lib/padrino-core/locale/ro.yml +0 -33
- data/lib/padrino-core/locale/ru.yml +0 -34
- data/lib/padrino-core/locale/sv.yml +0 -33
- data/lib/padrino-core/locale/tr.yml +0 -33
- data/lib/padrino-core/locale/uk.yml +0 -33
- data/lib/padrino-core/locale/zh_cn.yml +0 -33
- data/lib/padrino-core/locale/zh_tw.yml +0 -33
- data/lib/padrino-core/support_lite.rb +0 -259
- data/test/fixtures/apps/.components +0 -6
- data/test/fixtures/apps/.gitignore +0 -7
- data/test/fixtures/apps/render.rb +0 -13
- data/test/fixtures/apps/views/blog/post.erb +0 -1
- data/test/fixtures/layouts/layout.erb +0 -1
- data/test/mini_shoulda.rb +0 -45
- data/test/test_rendering.rb +0 -606
- data/test/test_rendering_extensions.rb +0 -14
- data/test/test_support_lite.rb +0 -56
data/test/helper.rb
CHANGED
@@ -2,21 +2,21 @@ ENV['RACK_ENV'] = 'test'
|
|
2
2
|
PADRINO_ROOT = File.dirname(__FILE__) unless defined?(PADRINO_ROOT)
|
3
3
|
|
4
4
|
require File.expand_path('../../../load_paths', __FILE__)
|
5
|
-
require
|
5
|
+
require 'minitest/autorun'
|
6
|
+
require 'minitest/pride'
|
7
|
+
require 'i18n'
|
8
|
+
require 'padrino-support'
|
6
9
|
require 'padrino-core'
|
7
10
|
require 'json'
|
11
|
+
require 'builder'
|
8
12
|
require 'rack/test'
|
9
13
|
require 'rack'
|
14
|
+
require 'yaml'
|
10
15
|
|
11
16
|
# Rubies < 1.9 don't handle hashes in the properly order so to prevent
|
12
17
|
# this issue for now we remove extra values from mimetypes.
|
13
18
|
Rack::Mime::MIME_TYPES.delete(".xsl") # In this way application/xml respond only to .xml
|
14
19
|
|
15
|
-
class Sinatra::Base
|
16
|
-
# Allow assertions in request context
|
17
|
-
include MiniTest::Assertions
|
18
|
-
end
|
19
|
-
|
20
20
|
class MiniTest::Spec
|
21
21
|
include Rack::Test::Methods
|
22
22
|
|
@@ -49,35 +49,4 @@ class MiniTest::Spec
|
|
49
49
|
end
|
50
50
|
|
51
51
|
alias :response :last_response
|
52
|
-
|
53
|
-
def create_template(name, content, options={})
|
54
|
-
FileUtils.mkdir_p(File.dirname(__FILE__) + "/views")
|
55
|
-
FileUtils.mkdir_p(File.dirname(__FILE__) + "/views/layouts")
|
56
|
-
path = "/views/#{name}"
|
57
|
-
path += ".#{options.delete(:locale)}" if options[:locale].present?
|
58
|
-
path += ".#{options[:format]}" if options[:format].present?
|
59
|
-
path += ".erb" unless options[:format].to_s =~ /erb|slim|haml|rss|atom/
|
60
|
-
path += ".builder" if options[:format].to_s =~ /rss|atom/
|
61
|
-
file = File.dirname(__FILE__) + path
|
62
|
-
File.open(file, 'w') { |io| io.write content }
|
63
|
-
file
|
64
|
-
end
|
65
|
-
alias :create_view :create_template
|
66
|
-
alias :create_layout :create_template
|
67
|
-
|
68
|
-
def remove_views
|
69
|
-
FileUtils.rm_rf(File.dirname(__FILE__) + "/views")
|
70
|
-
end
|
71
|
-
|
72
|
-
def with_template(name, content, options={})
|
73
|
-
# Build a temp layout
|
74
|
-
template = create_template(name, content, options)
|
75
|
-
yield
|
76
|
-
ensure
|
77
|
-
# Remove temp layout
|
78
|
-
File.unlink(template) rescue nil
|
79
|
-
remove_views
|
80
|
-
end
|
81
|
-
alias :with_view :with_template
|
82
|
-
alias :with_layout :with_template
|
83
52
|
end
|
data/test/test_application.rb
CHANGED
@@ -7,11 +7,10 @@ class PadrinoTestApp2 < Padrino::Application; end
|
|
7
7
|
|
8
8
|
describe "Application" do
|
9
9
|
before { Padrino.clear! }
|
10
|
-
after { remove_views }
|
11
10
|
|
12
|
-
|
11
|
+
describe 'for application functionality' do
|
13
12
|
|
14
|
-
should
|
13
|
+
it 'should check default options' do
|
15
14
|
assert File.identical?(__FILE__, PadrinoPristine.app_file)
|
16
15
|
assert_equal :padrino_pristine, PadrinoPristine.app_name
|
17
16
|
assert_equal :test, PadrinoPristine.environment
|
@@ -25,7 +24,7 @@ describe "Application" do
|
|
25
24
|
assert !Padrino.configure_apps
|
26
25
|
end
|
27
26
|
|
28
|
-
should
|
27
|
+
it 'should check padrino specific options' do
|
29
28
|
assert !PadrinoPristine.instance_variable_get(:@_configured)
|
30
29
|
PadrinoPristine.send(:setup_application!)
|
31
30
|
assert_equal :padrino_pristine, PadrinoPristine.app_name
|
@@ -34,7 +33,7 @@ describe "Application" do
|
|
34
33
|
assert !PadrinoPristine.reload?
|
35
34
|
end
|
36
35
|
|
37
|
-
should
|
36
|
+
it 'should set global project settings' do
|
38
37
|
Padrino.configure_apps { enable :sessions; set :foo, "bar" }
|
39
38
|
PadrinoTestApp.send(:default_configuration!)
|
40
39
|
PadrinoTestApp2.send(:default_configuration!)
|
@@ -43,7 +42,7 @@ describe "Application" do
|
|
43
42
|
assert_equal PadrinoTestApp.session_secret, PadrinoTestApp2.session_secret
|
44
43
|
end
|
45
44
|
|
46
|
-
should
|
45
|
+
it 'should be able to configure_apps multiple times' do
|
47
46
|
Padrino.configure_apps { set :foo1, "bar" }
|
48
47
|
Padrino.configure_apps { set :foo1, "bam" }
|
49
48
|
Padrino.configure_apps { set :foo2, "baz" }
|
@@ -52,7 +51,7 @@ describe "Application" do
|
|
52
51
|
assert_equal "baz", PadrinoTestApp.settings.foo2, "should have foo2 assigned to baz"
|
53
52
|
end
|
54
53
|
|
55
|
-
should
|
54
|
+
it 'should have shared sessions accessible in project' do
|
56
55
|
Padrino.configure_apps { enable :sessions; set :session_secret, 'secret' }
|
57
56
|
Padrino.mount("PadrinoTestApp").to("/write")
|
58
57
|
Padrino.mount("PadrinoTestApp2").to("/read")
|
@@ -67,7 +66,7 @@ describe "Application" do
|
|
67
66
|
end
|
68
67
|
|
69
68
|
# compare to: test_routing: allow global provides
|
70
|
-
should
|
69
|
+
it 'should set content_type to nil if none can be determined' do
|
71
70
|
mock_app do
|
72
71
|
provides :xml
|
73
72
|
|
@@ -84,25 +83,25 @@ describe "Application" do
|
|
84
83
|
assert_equal "Foo in nil", body
|
85
84
|
end
|
86
85
|
|
87
|
-
should
|
86
|
+
it 'should resolve views and layouts paths' do
|
88
87
|
assert_equal Padrino.root('views')+'/users/index', PadrinoPristine.view_path('users/index')
|
89
88
|
assert_equal Padrino.root('views')+'/layouts/app', PadrinoPristine.layout_path(:app)
|
90
89
|
end
|
91
90
|
|
92
|
-
|
93
|
-
|
91
|
+
describe "errors" do
|
92
|
+
it 'should have not mapped errors on development' do
|
94
93
|
mock_app { get('/'){ 'HI' } }
|
95
94
|
get "/"
|
96
95
|
assert @app.errors.empty?
|
97
96
|
end
|
98
97
|
|
99
|
-
should
|
98
|
+
it 'should have mapped errors on production' do
|
100
99
|
mock_app { set :environment, :production; get('/'){ 'HI' } }
|
101
100
|
get "/"
|
102
101
|
assert_equal 1, @app.errors.size
|
103
102
|
end
|
104
103
|
|
105
|
-
should
|
104
|
+
it 'should overide errors' do
|
106
105
|
mock_app do
|
107
106
|
set :environment, :production
|
108
107
|
get('/'){ raise }
|
data/test/test_core.rb
CHANGED
@@ -5,9 +5,8 @@ describe "Core" do
|
|
5
5
|
Padrino.clear!
|
6
6
|
end
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
should 'check some global methods' do
|
8
|
+
describe 'for core functionality' do
|
9
|
+
it 'should check some global methods' do
|
11
10
|
assert_respond_to Padrino, :root
|
12
11
|
assert_respond_to Padrino, :env
|
13
12
|
assert_respond_to Padrino, :application
|
@@ -18,28 +17,28 @@ describe "Core" do
|
|
18
17
|
assert_respond_to Padrino, :configure_apps
|
19
18
|
end
|
20
19
|
|
21
|
-
|
22
|
-
should 'validate global helpers' do
|
20
|
+
it 'should validate global helpers' do
|
23
21
|
assert_equal :test, Padrino.env
|
24
22
|
assert_match /\/test/, Padrino.root
|
25
|
-
|
23
|
+
refute_nil Padrino.version
|
26
24
|
end
|
27
25
|
|
28
|
-
should
|
26
|
+
it 'should set correct utf-8 encoding' do
|
29
27
|
Padrino.set_encoding
|
30
28
|
assert_equal Encoding.default_external, Encoding::UTF_8
|
31
29
|
assert_equal Encoding.default_internal, Encoding::UTF_8
|
32
30
|
end
|
33
31
|
|
34
|
-
should
|
32
|
+
it 'should have load paths' do
|
35
33
|
assert_equal [Padrino.root('lib'), Padrino.root('models'), Padrino.root('shared')], Padrino.load_paths
|
36
34
|
end
|
37
35
|
|
38
|
-
should
|
39
|
-
|
36
|
+
it 'should raise application error if I instantiate a new padrino application without mounted apps' do
|
37
|
+
text = capture_io { Padrino.application }
|
38
|
+
assert_match /No apps are mounted/, text.to_s
|
40
39
|
end
|
41
40
|
|
42
|
-
should
|
41
|
+
it 'should check before/after padrino load hooks' do
|
43
42
|
Padrino.before_load { @_foo = 1 }
|
44
43
|
Padrino.after_load { @_foo += 1 }
|
45
44
|
Padrino.load!
|
@@ -48,7 +47,7 @@ describe "Core" do
|
|
48
47
|
assert_equal 2, @_foo
|
49
48
|
end
|
50
49
|
|
51
|
-
should
|
50
|
+
it 'should add middlewares in front if specified' do
|
52
51
|
test = Class.new {
|
53
52
|
def initialize(app)
|
54
53
|
@app = app
|
@@ -70,7 +69,7 @@ describe "Core" do
|
|
70
69
|
assert_equal "yes", res["Middleware-Called"]
|
71
70
|
end
|
72
71
|
|
73
|
-
should
|
72
|
+
it 'should properly set default options' do
|
74
73
|
mock_app do
|
75
74
|
default :foo, :bar
|
76
75
|
default :zoo, :baz
|
@@ -2,10 +2,9 @@ require File.expand_path(File.dirname(__FILE__) + '/helper')
|
|
2
2
|
|
3
3
|
describe "Application" do
|
4
4
|
before { Padrino.clear! }
|
5
|
-
after { remove_views }
|
6
5
|
|
7
|
-
|
8
|
-
|
6
|
+
describe 'CSRF protection' do
|
7
|
+
describe "with CSRF protection on" do
|
9
8
|
before do
|
10
9
|
mock_app do
|
11
10
|
enable :sessions
|
@@ -14,23 +13,23 @@ describe "Application" do
|
|
14
13
|
end
|
15
14
|
end
|
16
15
|
|
17
|
-
should
|
16
|
+
it 'should not allow requests without tokens' do
|
18
17
|
post "/"
|
19
18
|
assert_equal 403, status
|
20
19
|
end
|
21
20
|
|
22
|
-
should
|
21
|
+
it 'should allow requests with correct tokens' do
|
23
22
|
post "/", {"authenticity_token" => "a"}, 'rack.session' => {:csrf => "a"}
|
24
23
|
assert_equal 200, status
|
25
24
|
end
|
26
25
|
|
27
|
-
should
|
26
|
+
it 'should not allow requests with incorrect tokens' do
|
28
27
|
post "/", {"authenticity_token" => "a"}, 'rack.session' => {:csrf => "b"}
|
29
28
|
assert_equal 403, status
|
30
29
|
end
|
31
30
|
end
|
32
31
|
|
33
|
-
|
32
|
+
describe "without CSRF protection on" do
|
34
33
|
before do
|
35
34
|
mock_app do
|
36
35
|
enable :sessions
|
@@ -39,45 +38,46 @@ describe "Application" do
|
|
39
38
|
end
|
40
39
|
end
|
41
40
|
|
42
|
-
should
|
41
|
+
it 'should allows requests without tokens' do
|
43
42
|
post "/"
|
44
43
|
assert_equal 200, status
|
45
44
|
end
|
46
45
|
|
47
|
-
should
|
46
|
+
it 'should allow requests with correct tokens' do
|
48
47
|
post "/", {"authenticity_token" => "a"}, 'rack.session' => {:csrf => "a"}
|
49
48
|
assert_equal 200, status
|
50
49
|
end
|
51
50
|
|
52
|
-
should
|
51
|
+
it 'should allow requests with incorrect tokens' do
|
53
52
|
post "/", {"authenticity_token" => "a"}, 'rack.session' => {:csrf => "b"}
|
54
53
|
assert_equal 200, status
|
55
54
|
end
|
56
55
|
end
|
57
56
|
|
58
|
-
|
57
|
+
describe "with optional CSRF protection" do
|
59
58
|
before do
|
60
59
|
mock_app do
|
61
60
|
enable :sessions
|
62
61
|
enable :protect_from_csrf
|
63
|
-
|
62
|
+
enable :allow_disabled_csrf
|
64
63
|
post('/on') { 'HI' }
|
65
64
|
post('/off', :csrf_protection => false) { 'HI' }
|
66
65
|
end
|
67
66
|
end
|
68
67
|
|
69
|
-
should
|
68
|
+
it 'should allow access to routes with csrf_protection off' do
|
70
69
|
post "/off"
|
71
70
|
assert_equal 200, status
|
72
71
|
end
|
73
72
|
|
74
|
-
should
|
73
|
+
it 'should not allow access to routes with csrf_protection on' do
|
75
74
|
post "/on"
|
76
75
|
assert_equal 403, status
|
76
|
+
assert_equal 'Forbidden', body
|
77
77
|
end
|
78
78
|
end
|
79
79
|
|
80
|
-
|
80
|
+
describe "with :except option that is using Proc" do
|
81
81
|
before do
|
82
82
|
mock_app do
|
83
83
|
enable :sessions
|
@@ -88,7 +88,7 @@ describe "Application" do
|
|
88
88
|
end
|
89
89
|
end
|
90
90
|
|
91
|
-
should
|
91
|
+
it 'should allow ignoring CSRF protection on specific routes' do
|
92
92
|
post "/"
|
93
93
|
assert_equal 200, status
|
94
94
|
post "/foo"
|
@@ -98,7 +98,7 @@ describe "Application" do
|
|
98
98
|
end
|
99
99
|
end
|
100
100
|
|
101
|
-
|
101
|
+
describe "with :except option that is using String and Regexp" do
|
102
102
|
before do
|
103
103
|
mock_app do
|
104
104
|
enable :sessions
|
@@ -109,7 +109,7 @@ describe "Application" do
|
|
109
109
|
end
|
110
110
|
end
|
111
111
|
|
112
|
-
should
|
112
|
+
it 'should allow ignoring CSRF protection on specific routes' do
|
113
113
|
post "/a"
|
114
114
|
assert_equal 200, status
|
115
115
|
post "/abc"
|
@@ -119,22 +119,28 @@ describe "Application" do
|
|
119
119
|
end
|
120
120
|
end
|
121
121
|
|
122
|
-
|
122
|
+
describe "with custom protection options" do
|
123
123
|
before do
|
124
124
|
mock_app do
|
125
125
|
enable :sessions
|
126
|
-
set :protect_from_csrf, :authenticity_param => 'foobar'
|
126
|
+
set :protect_from_csrf, :authenticity_param => 'foobar', :message => 'sucker!'
|
127
127
|
post("/a") { "a" }
|
128
128
|
end
|
129
129
|
end
|
130
130
|
|
131
|
-
should
|
131
|
+
it 'should allow configuring protection options' do
|
132
132
|
post "/a", {"foobar" => "a"}, 'rack.session' => {:csrf => "a"}
|
133
133
|
assert_equal 200, status
|
134
134
|
end
|
135
|
+
|
136
|
+
it 'should allow configuring message' do
|
137
|
+
post "/a"
|
138
|
+
assert_equal 403, status
|
139
|
+
assert_equal 'sucker!', body
|
140
|
+
end
|
135
141
|
end
|
136
142
|
|
137
|
-
|
143
|
+
describe "with middleware" do
|
138
144
|
before do
|
139
145
|
class Middleware < Sinatra::Base
|
140
146
|
post("/middleware") { "Hello, middleware" }
|
@@ -148,7 +154,7 @@ describe "Application" do
|
|
148
154
|
end
|
149
155
|
end
|
150
156
|
|
151
|
-
should
|
157
|
+
it 'should allow ignoring CSRF protection on specific routes of middleware' do
|
152
158
|
post "/"
|
153
159
|
assert_equal 200, status
|
154
160
|
post "/middleware"
|
@@ -157,5 +163,25 @@ describe "Application" do
|
|
157
163
|
assert_equal 403, status
|
158
164
|
end
|
159
165
|
end
|
166
|
+
|
167
|
+
describe "with standard report layout" do
|
168
|
+
before do
|
169
|
+
mock_app do
|
170
|
+
enable :sessions
|
171
|
+
set :protect_from_csrf, :message => 'sucker!'
|
172
|
+
enable :report_csrf_failure
|
173
|
+
post("/a") { "a" }
|
174
|
+
error 403 do
|
175
|
+
halt 406, 'please, do not hack'
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
it 'should allow configuring protection options' do
|
181
|
+
post "/a"
|
182
|
+
assert_equal 406, status
|
183
|
+
assert_equal 'please, do not hack', body
|
184
|
+
end
|
185
|
+
end
|
160
186
|
end
|
161
187
|
end
|
data/test/test_dependencies.rb
CHANGED
@@ -1,20 +1,20 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/helper')
|
2
2
|
|
3
3
|
describe "Dependencies" do
|
4
|
-
|
5
|
-
|
4
|
+
describe 'when we require a dependency that have another dependency' do
|
5
|
+
before do
|
6
6
|
@log_level = Padrino::Logger::Config[:test]
|
7
7
|
@io = StringIO.new
|
8
8
|
Padrino::Logger::Config[:test] = { :log_level => :error, :stream => @io }
|
9
9
|
Padrino::Logger.setup!
|
10
10
|
end
|
11
11
|
|
12
|
-
|
12
|
+
after do
|
13
13
|
Padrino::Logger::Config[:test] = @log_level
|
14
14
|
Padrino::Logger.setup!
|
15
15
|
end
|
16
16
|
|
17
|
-
should
|
17
|
+
it 'should raise an error without reloading it twice' do
|
18
18
|
capture_io do
|
19
19
|
assert_raises(RuntimeError) do
|
20
20
|
Padrino.require_dependencies(
|
@@ -26,10 +26,10 @@ describe "Dependencies" do
|
|
26
26
|
end
|
27
27
|
end
|
28
28
|
assert_equal 1, D
|
29
|
-
assert_match /RuntimeError
|
29
|
+
assert_match /RuntimeError - SomeThing/, @io.string
|
30
30
|
end
|
31
31
|
|
32
|
-
should
|
32
|
+
it 'should resolve dependency problems' do
|
33
33
|
capture_io do
|
34
34
|
Padrino.require_dependencies(
|
35
35
|
Padrino.root("fixtures/dependencies/a.rb"),
|
@@ -42,7 +42,7 @@ describe "Dependencies" do
|
|
42
42
|
assert_equal "", @io.string
|
43
43
|
end
|
44
44
|
|
45
|
-
should
|
45
|
+
it 'should remove partially loaded constants' do
|
46
46
|
capture_io do
|
47
47
|
Padrino.require_dependencies(
|
48
48
|
Padrino.root("fixtures/dependencies/circular/e.rb"),
|