padrino-core 0.12.3 → 0.12.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b0c4e1103a6097258ff654c266fbc979a4115409
4
- data.tar.gz: be1ce195a701fc3a868069bdfee1847d87bfedfe
3
+ metadata.gz: f87c42ee6dafccf2f672e07adc52c3bb79102e09
4
+ data.tar.gz: b25c8da4bc6a104c7a688b7a62e69b17aeb5ad50
5
5
  SHA512:
6
- metadata.gz: 08c3823803340970a7c3e5138e0705439a7db34880f075de1f886725ac44792d1cba96f7c396aadb4f2fa7e153313dda9611468721a66d71bc80c4a9c4e31630
7
- data.tar.gz: cf6e3a2954d7541a981318094e9600d266a593189852b3028a91d3c9316b03a39b2719087e231eac55f800ca65be5f9a7d455d55b9f2083f0ddbf462df1ccd8b
6
+ metadata.gz: fb6c04b20312a6fd49a9a75343a1fc75fb19a2a359e0321ba4dd67132c7e15d83e063a41f0125b34570476344fc327cd9bbb51b089761764487152404f369fc4
7
+ data.tar.gz: 57ca2a537531341e765ba190ed9be1b1a6510846d1964bef9f65a734cfc73fcbcee0ea1071bef87e0d680c1e5b422f8dd2bd8547a6f77b030d0395416a7ca240
@@ -65,7 +65,6 @@ module Padrino
65
65
  reset_router!
66
66
  Padrino.require_dependencies(settings.app_file, :force => true)
67
67
  require_dependencies
68
- default_filters
69
68
  default_routes
70
69
  default_errors
71
70
  I18n.reload! if defined?(I18n)
@@ -149,7 +148,7 @@ module Padrino
149
148
  'controllers.rb',
150
149
  'helpers/**/*.rb',
151
150
  'helpers.rb',
152
- ].map { |file| Dir.glob(File.join(settings.root, file)) }.flatten
151
+ ].flat_map{ |file| Dir.glob(File.join(settings.root, file)) }
153
152
  end
154
153
 
155
154
  ##
@@ -42,7 +42,6 @@ module Padrino
42
42
  def setup_application!
43
43
  return if @_configured
44
44
  require_dependencies
45
- default_filters
46
45
  default_routes
47
46
  default_errors
48
47
  setup_locale
@@ -109,16 +108,6 @@ module Padrino
109
108
  setup_application!
110
109
  end
111
110
 
112
- ##
113
- # This filter it's used for know the format of the request, and
114
- # automatically set the content type.
115
- #
116
- def default_filters
117
- before do
118
- response['Content-Type'] = 'text/html;charset=utf-8' unless @_content_type
119
- end
120
- end
121
-
122
111
  ##
123
112
  # We need to add almost __sinatra__ images.
124
113
  #
@@ -1,6 +1,6 @@
1
1
  begin
2
2
  require 'active_support/core_ext/object/deep_dup' # AS 4.1
3
- rescue LoadError => ex
3
+ rescue LoadError
4
4
  require 'active_support/core_ext/hash/deep_dup' # AS >= 3.1
5
5
  end
6
6
 
@@ -99,8 +99,8 @@ module Padrino
99
99
  type = allowed_params[key]
100
100
  next if value.kind_of?(Array) && type
101
101
  case
102
- when type.kind_of?(Hash)
103
- if key == key.pluralize
102
+ when type.kind_of?(Hash) && value.kind_of?(Hash)
103
+ if key == key.pluralize && value.values.first.kind_of?(Hash)
104
104
  value.each do |array_index,array_value|
105
105
  value[array_index] = filter_params!(array_value, type)
106
106
  end
@@ -367,6 +367,21 @@ module Padrino
367
367
  end
368
368
  end
369
369
 
370
+ ##
371
+ # Processes the existing path and prepends the 'parent' parameters onto the route
372
+ # Used for calculating path in route method.
373
+ #
374
+ def process_path_for_parent_params(path, parent_params)
375
+ parent_prefix = parent_params.flatten.compact.uniq.map do |param|
376
+ map = (param.respond_to?(:map) && param.map ? param.map : param.to_s)
377
+ part = "#{map}/:#{param.to_s.singularize}_id/"
378
+ part = "(#{part})" if param.respond_to?(:optional) && param.optional?
379
+ part
380
+ end
381
+
382
+ [parent_prefix, path].flatten.join("")
383
+ end
384
+
370
385
  private
371
386
 
372
387
  CONTROLLER_OPTIONS = [ :parent, :provides, :use_format, :cache, :expires, :map, :conditions, :accepts, :params ].freeze
@@ -517,7 +532,10 @@ module Padrino
517
532
  end
518
533
 
519
534
  # Add Sinatra conditions.
520
- options.each{ |option, args| route.respond_to?(option) ? route.send(option, *args) : send(option, *args) }
535
+ options.each do |option, _args|
536
+ option = :provides_format if option == :provides
537
+ route.respond_to?(option) ? route.send(option, *_args) : send(option, *_args)
538
+ end
521
539
  conditions, @conditions = @conditions, []
522
540
  route.custom_conditions.concat(conditions)
523
541
 
@@ -576,8 +594,8 @@ module Padrino
576
594
 
577
595
  options.delete(:accepts) if options[:accepts].nil?
578
596
 
579
- if @_use_format or format_params = options[:provides]
580
- process_path_for_provides(path, format_params)
597
+ if @_use_format || options[:provides]
598
+ process_path_for_provides(path)
581
599
  # options[:add_match_with] ||= {}
582
600
  # options[:add_match_with][:format] = /[^\.]+/
583
601
  end
@@ -636,26 +654,11 @@ module Padrino
636
654
  end.join("/"))
637
655
  end
638
656
 
639
- ##
640
- # Processes the existing path and prepends the 'parent' parameters onto the route
641
- # Used for calculating path in route method.
642
- #
643
- def process_path_for_parent_params(path, parent_params)
644
- parent_prefix = parent_params.flatten.compact.uniq.map do |param|
645
- map = (param.respond_to?(:map) && param.map ? param.map : param.to_s)
646
- part = "#{map}/:#{param.to_s.singularize}_id/"
647
- part = "(#{part})" if param.respond_to?(:optional) && param.optional?
648
- part
649
- end
650
-
651
- [parent_prefix, path].flatten.join("")
652
- end
653
-
654
657
  ##
655
658
  # Processes the existing path and appends the 'format' suffix onto the route.
656
659
  # Used for calculating path in route method.
657
660
  #
658
- def process_path_for_provides(path, format_params)
661
+ def process_path_for_provides(path)
659
662
  path << "(.:format)" unless path[-10, 10] == '(.:format)'
660
663
  end
661
664
 
@@ -688,6 +691,10 @@ module Padrino
688
691
  #
689
692
  def provides(*types)
690
693
  @_use_format = true
694
+ provides_format(*types)
695
+ end
696
+
697
+ def provides_format(*types)
691
698
  mime_types = types.map{ |type| mime_type(CONTENT_TYPE_ALIASES[type] || type) }
692
699
  condition do
693
700
  return provides_format?(types, params[:format].to_sym) if params[:format]
@@ -843,11 +850,11 @@ module Padrino
843
850
  #
844
851
  # Method for deliver static files.
845
852
  #
846
- def static!
853
+ def static!(options = {})
847
854
  if path = static_file?(request.path_info)
848
855
  env['sinatra.static_file'] = path
849
856
  cache_control(*settings.static_cache_control) if settings.static_cache_control?
850
- send_file(path, :disposition => nil)
857
+ send_file(path, options)
851
858
  end
852
859
  end
853
860
 
@@ -178,4 +178,24 @@ class HttpRouter
178
178
  #{"end" unless route.match_partially}"
179
179
  end
180
180
  end
181
+
182
+ class Node::FreeRegex
183
+ def to_code
184
+ id = root.next_counter
185
+ "whole_path#{id} = \"/\#{request.joined_path}\"
186
+ if match = #{matcher.inspect}.match(whole_path#{id}) and match[0].size == whole_path#{id}.size
187
+ request.extra_env['router.regex_match'] = match
188
+ old_path = request.path
189
+ request.path = ['']
190
+ " << (use_named_captures? ?
191
+ "match.names.size.times{|i| request.params << match[i + 1]} if match.respond_to?(:names) && match.names" : "") << "
192
+ #{super}
193
+ request.path = old_path
194
+ request.extra_env.delete('router.regex_match')
195
+ " << (use_named_captures? ?
196
+ "request.params.slice!(-match.names.size, match.names.size)" : ""
197
+ ) << "
198
+ end"
199
+ end
200
+ end
181
201
  end
@@ -3,7 +3,11 @@ module Padrino
3
3
  attr_reader :block
4
4
 
5
5
  def initialize(mode, scoped_controller, options, args, &block)
6
- @mode, @scoped_controller, @options, @args, @block = mode, scoped_controller, options, args, block
6
+ @mode = mode
7
+ @scoped_controller = scoped_controller
8
+ @options = options
9
+ @args = args
10
+ @block = block
7
11
  end
8
12
 
9
13
  def apply?(request)
@@ -27,7 +31,8 @@ module Padrino
27
31
  end
28
32
 
29
33
  def match_with_arguments?(request)
30
- route, path = request.route_obj, request.path_info
34
+ route = request.route_obj
35
+ path = request.path_info
31
36
  @args.any? do |argument|
32
37
  if argument.instance_of?(Symbol)
33
38
  next unless route
@@ -130,10 +130,10 @@ module Padrino
130
130
  #
131
131
  def require_dependencies(*paths)
132
132
  options = paths.extract_options!.merge( :cyclic => true )
133
- files = paths.flatten.map{ |path| Dir.glob(path).sort_by{ |filename| filename.count('/') } }.flatten.uniq
133
+ files = paths.flatten.flat_map{ |path| Dir.glob(path).sort_by{ |filename| filename.count('/') } }.uniq
134
134
 
135
135
  until files.empty?
136
- error, fatal, loaded = nil, nil, nil
136
+ error = fatal = loaded = nil
137
137
 
138
138
  files.dup.each do |file|
139
139
  begin
@@ -1,3 +1,5 @@
1
+ require 'delegate'
2
+
1
3
  module Padrino
2
4
  ##
3
5
  # Represents a particular mounted Padrino application.
@@ -12,6 +14,55 @@ module Padrino
12
14
  class MounterException < RuntimeError
13
15
  end
14
16
 
17
+ class ApplicationWrapper < SimpleDelegator
18
+ attr_accessor :uri_root
19
+ attr_writer :public_folder
20
+
21
+ def initialize(app, options = {})
22
+ @options = options
23
+ super(app)
24
+ end
25
+
26
+ def dependencies
27
+ @__dependencies ||= Dir["#{root}/**/*.rb"]
28
+ end
29
+
30
+ def prerequisite
31
+ @__prerequisite ||= []
32
+ end
33
+
34
+ def app_file
35
+ return @__app_file if @__app_file
36
+ obj = __getobj__
37
+ @__app_file = obj.respond_to?(:app_file) ? obj.app_file : @options[:app_file]
38
+ end
39
+
40
+ def root
41
+ return @__root if @__root
42
+ obj = __getobj__
43
+ @__root = obj.respond_to?(:root) ? obj.root : File.expand_path("#{app_file}/../")
44
+ end
45
+
46
+ def public_folder
47
+ return @public_folder if @public_folder
48
+ obj = __getobj__
49
+ @public_folder = obj.respond_to?(:public_folder) ? obj.public_folder : ""
50
+ end
51
+
52
+ def app_name
53
+ @__app_name ||= @options[:app_name] || __getobj__.to_s.underscore.to_sym
54
+ end
55
+
56
+ def setup_application!
57
+ @configured ||=
58
+ begin
59
+ $LOAD_PATH.concat(prerequisite)
60
+ Padrino.require_dependencies(dependencies, :force => true)
61
+ true
62
+ end
63
+ end
64
+ end
65
+
15
66
  attr_accessor :name, :uri_root, :app_file, :app_class, :app_root, :app_obj, :app_host, :cascade
16
67
 
17
68
  ##
@@ -32,12 +83,19 @@ module Padrino
32
83
  @app_file = options[:app_file] || locate_app_file
33
84
  @app_obj = options[:app_obj] || app_constant || locate_app_object
34
85
  ensure_app_file! || ensure_app_object!
86
+ @app_obj = ApplicationWrapper.new(@app_obj, options) unless padrino_application?
35
87
  @app_root = options[:app_root] || (@app_obj.respond_to?(:root) && @app_obj.root || File.dirname(@app_file))
36
88
  @uri_root = "/"
37
89
  @cascade = options[:cascade] ? true == options[:cascade] ? DEFAULT_CASCADE.dup : Array(options[:cascade]) : []
38
90
  Padrino::Reloader.exclude_constants << @app_class
39
91
  end
40
92
 
93
+ def padrino_application?
94
+ @app_obj.ancestors.include?(Padrino::Application)
95
+ rescue NameError
96
+ false
97
+ end
98
+
41
99
  ##
42
100
  # Registers the mounted application onto Padrino.
43
101
  #
@@ -82,14 +140,20 @@ module Padrino
82
140
  # @app.map_onto(router)
83
141
  #
84
142
  def map_onto(router)
85
- app_data, app_obj = self, @app_obj
86
- app_obj.set :uri_root, app_data.uri_root
87
- app_obj.set :app_name, app_data.app_obj.app_name.to_s
88
- app_obj.set :app_file, app_data.app_file unless ::File.exist?(app_obj.app_file)
89
- app_obj.set :root, app_data.app_root unless app_data.app_root.blank?
90
- app_obj.set :public_folder, Padrino.root('public', app_data.uri_root) unless File.exist?(app_obj.public_folder)
91
- app_obj.set :static, File.exist?(app_obj.public_folder) if app_obj.nil?
92
- app_obj.set :cascade, app_data.cascade
143
+ app_data = self
144
+ app_obj = @app_obj
145
+ if padrino_application?
146
+ app_obj.set :uri_root, app_data.uri_root
147
+ app_obj.set :app_name, app_data.app_obj.app_name.to_s
148
+ app_obj.set :app_file, app_data.app_file unless ::File.exist?(app_obj.app_file)
149
+ app_obj.set :root, app_data.app_root unless app_data.app_root.blank?
150
+ app_obj.set :public_folder, Padrino.root('public', app_data.uri_root) unless File.exist?(app_obj.public_folder)
151
+ app_obj.set :static, File.exist?(app_obj.public_folder) if app_obj.nil?
152
+ app_obj.set :cascade, app_data.cascade
153
+ else
154
+ app_obj.uri_root = app_data.uri_root
155
+ app_obj.public_folder = Padrino.root('public', app_data.uri_root) unless ::File.exist?(app_obj.public_folder)
156
+ end
93
157
  app_obj.setup_application! # Initializes the app here with above settings.
94
158
  router.map(:to => app_obj, :path => app_data.uri_root, :host => app_data.app_host)
95
159
  end
@@ -269,6 +269,7 @@ module Padrino
269
269
  def object_sources(target)
270
270
  sources = Set.new
271
271
  target.methods.each do |method_name|
272
+ next unless method_name.kind_of?(Symbol)
272
273
  method_object = target.method(method_name)
273
274
  if method_object.owner == (target.class == Class ? target.singleton_class : target.class)
274
275
  sources << method_object.source_location.first
@@ -289,7 +290,10 @@ module Padrino
289
290
  # Return the apps that allow reloading.
290
291
  #
291
292
  def reloadable_apps
292
- Padrino.mounted_apps.select{ |app| app.app_obj.respond_to?(:reload) && app.app_obj.reload? }
293
+ Padrino.mounted_apps.select do |app|
294
+ next unless app.app_file.start_with?(Padrino.root)
295
+ app.app_obj.respond_to?(:reload) && app.app_obj.reload?
296
+ end
293
297
  end
294
298
 
295
299
  ##
@@ -103,7 +103,7 @@ module Padrino
103
103
  # Parses an array of server options.
104
104
  #
105
105
  def self.parse_server_options(options)
106
- parsed_server_options = Array(options).map{ |option| option.split('=', 2) }.flatten
106
+ parsed_server_options = Array(options).flat_map{ |option| option.split('=', 2) }
107
107
  Hash[*parsed_server_options].symbolize_keys
108
108
  end
109
109
 
@@ -6,7 +6,7 @@
6
6
  #
7
7
  module Padrino
8
8
  # The version constant for the current version of Padrino.
9
- VERSION = '0.12.3' unless defined?(Padrino::VERSION)
9
+ VERSION = '0.12.4' unless defined?(Padrino::VERSION)
10
10
 
11
11
  #
12
12
  # The current Padrino version.
@@ -0,0 +1,7 @@
1
+ module DemoProject
2
+ class API
3
+ def self.call(_)
4
+ [200, {}, ["api app"]]
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,3 @@
1
+ module DemoProject
2
+ APILib = Class.new
3
+ end
@@ -0,0 +1,7 @@
1
+ module DemoProject
2
+ class App < Padrino::Application
3
+ get :index do
4
+ "padrino app"
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,15 @@
1
+
2
+ class RackApp
3
+ def self.call(_)
4
+ [200, {}, ["hello rack app"]]
5
+ end
6
+ end
7
+
8
+ RackApp2 = lambda{|_| [200, {}, ["hello rack app2"]] }
9
+
10
+ class SinatraApp < Sinatra::Base
11
+ set :public_folder, File.dirname(__FILE__)
12
+ get "/" do
13
+ "hello sinatra app"
14
+ end
15
+ end
@@ -0,0 +1 @@
1
+ hello static file
@@ -0,0 +1,6 @@
1
+
2
+ module ReloadableApp
3
+ class External < Padrino::Application
4
+ set :reload, true
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+
2
+ ReloadableApp::External.controller :base do
3
+ get :index do
4
+ "Hello External App"
5
+ end
6
+ end
@@ -0,0 +1,10 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../external/app/app')
2
+
3
+ module ReloadableApp
4
+ class Main < Padrino::Application
5
+ set :reload, true
6
+ get :index do
7
+ "hey"
8
+ end
9
+ end
10
+ end
data/test/test_core.rb CHANGED
@@ -29,11 +29,6 @@ describe "Core" do
29
29
  assert_equal Encoding.default_internal, Encoding::UTF_8
30
30
  end
31
31
 
32
- it 'should have load paths' do
33
- skip
34
- assert_equal [Padrino.root('lib'), Padrino.root('models'), Padrino.root('shared')], Padrino.load_paths
35
- end
36
-
37
32
  it 'should raise application error if I instantiate a new padrino application without mounted apps' do
38
33
  text = capture_io { Padrino.application }
39
34
  assert_match /No apps are mounted/, text.to_s
data/test/test_mounter.rb CHANGED
@@ -253,5 +253,37 @@ describe "Mounter" do
253
253
  assert_equal AppGem::App, mounter.app_obj
254
254
  assert_equal Padrino.root('public'), mounter.app_obj.public_folder
255
255
  end
256
+
257
+ it 'should support the Rack Application' do
258
+ path = File.expand_path(File.dirname(__FILE__) + '/fixtures/apps/rack_apps')
259
+ require path
260
+ Padrino.mount('rack_app', :app_class => 'RackApp', :app_file => path).to('/rack_app')
261
+ Padrino.mount('rack_app2', :app_class => 'RackApp2', :app_file => path).to('/rack_app2')
262
+ Padrino.mount('sinatra_app', :app_class => 'SinatraApp', :app_file => path).to('/sinatra_app')
263
+ app = Padrino.application
264
+ res = Rack::MockRequest.new(app).get("/rack_app")
265
+ assert_equal "hello rack app", res.body
266
+ res = Rack::MockRequest.new(app).get("/rack_app2")
267
+ assert_equal "hello rack app2", res.body
268
+ res = Rack::MockRequest.new(app).get("/sinatra_app")
269
+ assert_equal "hello sinatra app", res.body
270
+ res = Rack::MockRequest.new(app).get("/sinatra_app/static.html")
271
+ assert_equal "hello static file\n", res.body
272
+ end
273
+
274
+ it 'should support the Rack Application inside padrino project' do
275
+ path = File.expand_path(File.dirname(__FILE__) + '/fixtures/apps/demo_project/app')
276
+ api_path = File.expand_path(File.dirname(__FILE__) + '/fixtures/apps/demo_project/api/app')
277
+ require path
278
+ require api_path
279
+ Padrino.mount('api_app', :app_class => 'DemoProject::API', :app_file => api_path).to('/api')
280
+ Padrino.mount('main_app', :app_class => 'DemoProject::App').to('/')
281
+ app = Padrino.application
282
+ res = Rack::MockRequest.new(app).get("/")
283
+ assert_equal "padrino app", res.body
284
+ res = Rack::MockRequest.new(app).get("/api/hey")
285
+ assert_equal "api app", res.body
286
+ assert defined?(DemoProject::APILib)
287
+ end
256
288
  end
257
289
  end
@@ -156,4 +156,28 @@ describe "Padrino::ParamsProtection" do
156
156
  post '/family?names[]=Jack&names[]=Kim&names[]=Teri'
157
157
  assert_equal({"names" => %w[Jack Kim Teri]}, result)
158
158
  end
159
+
160
+ it 'should tolerate weird inflections' do
161
+ result = nil
162
+ mock_app do
163
+ post :i, :params => [ :gotta => [ :what ] ] do
164
+ result = params
165
+ ''
166
+ end
167
+ end
168
+ post '/i?gotta[what]=go&gotta[who]=self'
169
+ assert_equal({"gotta" => {"what" => "go"}}, result)
170
+ end
171
+
172
+ it 'should drop the key if the data type does not match route configuration' do
173
+ result = nil
174
+ mock_app do
175
+ post :i, :params => [ :gotta => [ :what ] ] do
176
+ result = params
177
+ ''
178
+ end
179
+ end
180
+ post '/i?gotta=go'
181
+ assert_equal({}, result)
182
+ end
159
183
  end
@@ -43,8 +43,8 @@ describe "ComplexReloader" do
43
43
 
44
44
  new_phrase = "The magick number is: #{rand(2**255)}!"
45
45
  buffer = File.read(Complex1Demo.app_file)
46
- new_buffer = buffer.gsub(/The magick number is: \d+!/, new_phrase)
47
- new_buffer.gsub!(/get\(:destroy\)/, 'get(:destroy, :with => :id)')
46
+ new_buffer = buffer.sub(/The magick number is: \d+!/, new_phrase)
47
+ new_buffer.sub!(/get\(:destroy\)/, 'get(:destroy, :with => :id)')
48
48
  begin
49
49
  File.open(Complex1Demo.app_file, "w") { |f| f.write(new_buffer) }
50
50
  Time.stub(:now, Time.now + 2) { get "/complex_2_demo" }
@@ -0,0 +1,21 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/helper')
2
+ require File.expand_path(File.dirname(__FILE__) + '/fixtures/reloadable_apps/main/app')
3
+
4
+ describe "ExternalReloader" do
5
+ describe "for external app" do
6
+ before do
7
+ Padrino.clear!
8
+ Padrino.mount("ReloadableApp::External").to("/reloadable/external")
9
+ Padrino.mount("ReloadableApp::Main").to("/reloadable")
10
+ Padrino.load!
11
+ end
12
+
13
+ it "should avoid reloading the file if its path is not started with Padrino.root" do
14
+ @app = Padrino.application
15
+ Padrino.stub(:root, File.expand_path(File.dirname(__FILE__) + '/fixtures/reloadable_apps/main')) do
16
+ get "/reloadable/external/base"
17
+ end
18
+ assert_equal "Hello External App", body
19
+ end
20
+ end
21
+ end
@@ -61,7 +61,7 @@ describe "SimpleReloader" do
61
61
  assert ok?
62
62
  new_phrase = "The magick number is: #{rand(2**255)}!"
63
63
  buffer = File.read(SimpleDemo.app_file)
64
- new_buffer = buffer.gsub(/The magick number is: \d+!/, new_phrase)
64
+ new_buffer = buffer.sub(/The magick number is: \d+!/, new_phrase)
65
65
  begin
66
66
  File.open(SimpleDemo.app_file, "w") { |f| f.write(new_buffer) }
67
67
  Time.stub(:now, Time.now + 2) { get "/" }
@@ -79,7 +79,7 @@ describe "SimpleReloader" do
79
79
  get "/rand"
80
80
  assert ok?
81
81
  last_body = body
82
- assert_equal 2, @app.filters[:before].size # one is ours the other is default_filter for content type
82
+ assert_equal 1, @app.filters[:before].size
83
83
  assert_equal 1, @app.errors.size
84
84
  assert_equal 2, @app.filters[:after].size # app + content-type + padrino-flash
85
85
  assert_equal 0, @app.middleware.size
@@ -89,7 +89,7 @@ describe "SimpleReloader" do
89
89
  @app.reload!
90
90
  get "/rand"
91
91
  refute_equal last_body, body
92
- assert_equal 2, @app.filters[:before].size # one is ours the other is default_filter for content type
92
+ assert_equal 1, @app.filters[:before].size
93
93
  assert_equal 1, @app.errors.size
94
94
  assert_equal 2, @app.filters[:after].size
95
95
  assert_equal 0, @app.middleware.size
@@ -46,16 +46,6 @@ describe "SystemReloader" do
46
46
  end
47
47
  end
48
48
 
49
- it 'should tamper with LOAD_PATH' do
50
- skip
51
- SystemDemo.load_paths.each do |lib_dir|
52
- assert_includes $LOAD_PATH, lib_dir
53
- end
54
- Padrino.send(:default_load_paths).each do |lib_dir|
55
- assert_includes $LOAD_PATH, lib_dir
56
- end
57
- end
58
-
59
49
  it 'should not fail horribly on reload event with non-padrino apps' do
60
50
  Padrino.mount("kiq").to("/")
61
51
  Padrino.reload!
data/test/test_routing.rb CHANGED
@@ -30,6 +30,22 @@ describe "Routing" do
30
30
  assert_equal headers['Cache-Control'], 'public, must-revalidate, max-age=300'
31
31
  end # static max_age
32
32
 
33
+ it 'should render static files with custom status via options' do
34
+ mock_app do
35
+ set :static, true
36
+ set :public_folder, File.dirname(__FILE__)
37
+
38
+ post '/*' do
39
+ static!(:status => params[:status])
40
+ end
41
+ end
42
+
43
+ post "/#{File.basename(__FILE__)}?status=422"
44
+ assert_equal response.status, 422
45
+ assert_equal File.size(__FILE__).to_s, response['Content-Length']
46
+ assert response.headers.include?('Last-Modified')
47
+ end
48
+
33
49
  it 'should ignore trailing delimiters for basic route' do
34
50
  mock_app do
35
51
  get("/foo"){ "okey" }
@@ -1824,8 +1840,6 @@ describe "Routing" do
1824
1840
  end
1825
1841
 
1826
1842
  it 'should reset provides for routes that did not use it' do
1827
- skip
1828
- #FIXME
1829
1843
  mock_app do
1830
1844
  get('/foo', :provides => :js){}
1831
1845
  get('/bar'){}
@@ -2124,4 +2138,30 @@ describe "Routing" do
2124
2138
  get '/users//'
2125
2139
  assert_equal 404, status
2126
2140
  end
2141
+
2142
+ it "should support splat params" do
2143
+ # This test will be fixed with the new router
2144
+ skip
2145
+ mock_app do
2146
+ get "/say/*/to/*" do
2147
+ params[:splat].inspect
2148
+ end
2149
+ end
2150
+ get "/say/hello/to/world"
2151
+ assert_equal ["hello", "world"], body
2152
+ end
2153
+
2154
+ it "should match correctly paths even if the free regex route exists" do
2155
+ mock_app do
2156
+ get %r{/b/(?<aa>\w+)/(?<bb>\w+)} do
2157
+ "free regex"
2158
+ end
2159
+
2160
+ put '/b/:b/:c', :csrf_protection => false do
2161
+ params.inspect
2162
+ end
2163
+ end
2164
+ put "/b/x/y"
2165
+ assert_equal '{"b"=>"x", "c"=>"y"}', body
2166
+ end
2127
2167
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: padrino-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.12.3
4
+ version: 0.12.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Padrino Team
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2014-08-13 00:00:00.000000000 Z
14
+ date: 2014-10-19 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: padrino-support
@@ -19,14 +19,14 @@ dependencies:
19
19
  requirements:
20
20
  - - '='
21
21
  - !ruby/object:Gem::Version
22
- version: 0.12.3
22
+ version: 0.12.4
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
27
  - - '='
28
28
  - !ruby/object:Gem::Version
29
- version: 0.12.3
29
+ version: 0.12.4
30
30
  - !ruby/object:Gem::Dependency
31
31
  name: sinatra
32
32
  requirement: !ruby/object:Gem::Requirement
@@ -153,6 +153,9 @@ files:
153
153
  - test/fixtures/apps/complex.rb
154
154
  - test/fixtures/apps/demo_app.rb
155
155
  - test/fixtures/apps/demo_demo.rb
156
+ - test/fixtures/apps/demo_project/api/app.rb
157
+ - test/fixtures/apps/demo_project/api/lib/api_lib.rb
158
+ - test/fixtures/apps/demo_project/app.rb
156
159
  - test/fixtures/apps/helpers/class_methods_helpers.rb
157
160
  - test/fixtures/apps/helpers/instance_methods_helpers.rb
158
161
  - test/fixtures/apps/helpers/support.rb
@@ -162,7 +165,9 @@ files:
162
165
  - test/fixtures/apps/lib/myklass/mysubklass.rb
163
166
  - test/fixtures/apps/models/child.rb
164
167
  - test/fixtures/apps/models/parent.rb
168
+ - test/fixtures/apps/rack_apps.rb
165
169
  - test/fixtures/apps/simple.rb
170
+ - test/fixtures/apps/static.html
166
171
  - test/fixtures/apps/static.rb
167
172
  - test/fixtures/apps/system.rb
168
173
  - test/fixtures/apps/system_class_methods_demo.rb
@@ -174,6 +179,9 @@ files:
174
179
  - test/fixtures/dependencies/circular/f.rb
175
180
  - test/fixtures/dependencies/circular/g.rb
176
181
  - test/fixtures/dependencies/d.rb
182
+ - test/fixtures/reloadable_apps/external/app/app.rb
183
+ - test/fixtures/reloadable_apps/external/app/controllers/base.rb
184
+ - test/fixtures/reloadable_apps/main/app.rb
177
185
  - test/helper.rb
178
186
  - test/test_application.rb
179
187
  - test/test_core.rb
@@ -186,6 +194,7 @@ files:
186
194
  - test/test_mounter.rb
187
195
  - test/test_params_protection.rb
188
196
  - test/test_reloader_complex.rb
197
+ - test/test_reloader_external.rb
189
198
  - test/test_reloader_simple.rb
190
199
  - test/test_reloader_system.rb
191
200
  - test/test_restful_routing.rb
@@ -225,6 +234,9 @@ test_files:
225
234
  - test/fixtures/apps/complex.rb
226
235
  - test/fixtures/apps/demo_app.rb
227
236
  - test/fixtures/apps/demo_demo.rb
237
+ - test/fixtures/apps/demo_project/api/app.rb
238
+ - test/fixtures/apps/demo_project/api/lib/api_lib.rb
239
+ - test/fixtures/apps/demo_project/app.rb
228
240
  - test/fixtures/apps/helpers/class_methods_helpers.rb
229
241
  - test/fixtures/apps/helpers/instance_methods_helpers.rb
230
242
  - test/fixtures/apps/helpers/support.rb
@@ -234,7 +246,9 @@ test_files:
234
246
  - test/fixtures/apps/lib/myklass/mysubklass.rb
235
247
  - test/fixtures/apps/models/child.rb
236
248
  - test/fixtures/apps/models/parent.rb
249
+ - test/fixtures/apps/rack_apps.rb
237
250
  - test/fixtures/apps/simple.rb
251
+ - test/fixtures/apps/static.html
238
252
  - test/fixtures/apps/static.rb
239
253
  - test/fixtures/apps/system.rb
240
254
  - test/fixtures/apps/system_class_methods_demo.rb
@@ -246,6 +260,9 @@ test_files:
246
260
  - test/fixtures/dependencies/circular/f.rb
247
261
  - test/fixtures/dependencies/circular/g.rb
248
262
  - test/fixtures/dependencies/d.rb
263
+ - test/fixtures/reloadable_apps/external/app/app.rb
264
+ - test/fixtures/reloadable_apps/external/app/controllers/base.rb
265
+ - test/fixtures/reloadable_apps/main/app.rb
249
266
  - test/helper.rb
250
267
  - test/test_application.rb
251
268
  - test/test_core.rb
@@ -258,6 +275,7 @@ test_files:
258
275
  - test/test_mounter.rb
259
276
  - test/test_params_protection.rb
260
277
  - test/test_reloader_complex.rb
278
+ - test/test_reloader_external.rb
261
279
  - test/test_reloader_simple.rb
262
280
  - test/test_reloader_system.rb
263
281
  - test/test_restful_routing.rb