padrino-core 0.9.22 → 0.9.23

Sign up to get free protection for your applications and to get access to all the features.
@@ -132,6 +132,7 @@ module Padrino
132
132
  set :reload, true if development?
133
133
  set :logging, false
134
134
  set :padrino_logging, true
135
+ set :method_override, true
135
136
  set :sessions, false
136
137
  set :public, Proc.new { Padrino.root('public', self.uri_root) }
137
138
  # Padrino specific
@@ -170,8 +170,8 @@ module Padrino
170
170
 
171
171
  # Resolve view path and options
172
172
  options.reverse_merge!(DEFAULT_RENDERING_OPTIONS)
173
- view_path = options.delete(:views) || settings.views || settings.views || "./views"
174
- target_extension = File.extname(template_path)[1..-1] || "none" # retrieves explicit template extension
173
+ view_path = options.delete(:views) || settings.views || "./views"
174
+ target_extension = File.extname(template_path)[1..-1] || "none" # explicit template extension
175
175
  template_path = template_path.chomp(".#{target_extension}")
176
176
 
177
177
  # Generate potential template candidates
@@ -181,20 +181,20 @@ module Padrino
181
181
  [template_file, template_engine] unless IGNORE_FILE_PATTERN.any? { |pattern| template_engine.to_s =~ pattern }
182
182
  end
183
183
 
184
- # Check if we have a valid content type
185
- valid_content_type = [:html, :plain].include?(content_type)
184
+ # Check if we have a simple content type
185
+ simple_content_type = [:html, :plain].include?(content_type)
186
186
 
187
187
  # Resolve final template to render
188
188
  located_template =
189
189
  templates.find { |file, e| file.to_s == "#{template_path}.#{locale}.#{content_type}" } ||
190
- templates.find { |file, e| file.to_s == "#{template_path}.#{locale}" && valid_content_type } ||
190
+ templates.find { |file, e| file.to_s == "#{template_path}.#{locale}" && simple_content_type } ||
191
191
  templates.find { |file, e| File.extname(file.to_s) == ".#{target_extension}" or e.to_s == target_extension.to_s } ||
192
192
  templates.find { |file, e| file.to_s == "#{template_path}.#{content_type}" } ||
193
- templates.find { |file, e| file.to_s == "#{template_path}" && valid_content_type } ||
194
- templates.any? && !options[:strict_format] && templates.first # If not strict, fall back to the first located template
193
+ templates.find { |file, e| file.to_s == "#{template_path}" && simple_content_type } ||
194
+ (!options[:strict_format] && templates.first) # If not strict, fall back to the first located template
195
195
 
196
+ raise TemplateNotFound, "Template '#{template_path}' not found in '#{view_path}'!" if !located_template && options[:raise_exceptions]
196
197
  settings.cache_template_file!(located_template, rendering_options) unless settings.reload_templates?
197
- raise TemplateNotFound, "Template path '#{template_path}' could not be located in '#{view_path}'!" if !located_template && options[:raise_exceptions]
198
198
  located_template
199
199
  end
200
200
 
@@ -246,9 +246,8 @@ module Padrino
246
246
  # ==== Examples
247
247
  #
248
248
  # url(:show, :id => 1)
249
+ # url(:show, :name => 'test', :id => 24)
249
250
  # url(:show, 1)
250
- # url(:show, :name => :test)
251
- # url("/show/:id/:name", :id => 1, :name => foo)
252
251
  #
253
252
  def url(*args)
254
253
  params = args.extract_options! # parameters is hash at end
@@ -496,7 +495,31 @@ module Padrino
496
495
  end
497
496
 
498
497
  ##
499
- # Allow paths for the given request head or request format
498
+ # Allows routing by MIME-types specified in the URL or ACCEPT header.
499
+ #
500
+ # By default, if a non-provided mime-type is specified in a URL, the
501
+ # route will not match an thus return a 404.
502
+ #
503
+ # Setting the :treat_format_as_accept option to true allows treating
504
+ # missing mime types specified in the URL as if they were specified
505
+ # in the ACCEPT header and thus return 406.
506
+ #
507
+ # If no type is specified, the first in the provides-list will be
508
+ # returned.
509
+ #
510
+ # ==== Examples
511
+ # get "/a", :provides => [:html, :js]
512
+ # # => GET /a => :html
513
+ # # => GET /a.js => :js
514
+ # # => GET /a.xml => 404
515
+ #
516
+ # get "/b", :provides => [:html]
517
+ # # => GET /b; ACCEPT: html => html
518
+ # # => GET /b; ACCEPT: js => 406
519
+ #
520
+ # enable :treat_format_as_accept
521
+ # get "/c", :provides => [:html, :js]
522
+ # # => GET /c.xml => 406
500
523
  #
501
524
  def provides(*types)
502
525
  @_use_format = true
@@ -505,7 +528,7 @@ module Padrino
505
528
  request.path_info =~ /\.([^\.\/]+)$/
506
529
  url_format = $1.to_sym if $1
507
530
  accepts = request.accept.map { |a| a.split(";")[0].strip }
508
-
531
+
509
532
  # per rfc2616-sec14:
510
533
  # Assume */* if no ACCEPT header is given.
511
534
  if accepts.empty? || accepts.any? { |a| a == "*/*" }
@@ -532,7 +555,13 @@ module Padrino
532
555
  if !url_format && !accepts.empty? && !matched_format
533
556
  halt 406
534
557
  end
535
-
558
+
559
+ if settings.respond_to?(:treat_format_as_accept) && settings.treat_format_as_accept
560
+ if url_format && !matched_format
561
+ halt 406
562
+ end
563
+ end
564
+
536
565
  if matched_format
537
566
  @_content_type = url_format || accept_format || :html
538
567
  content_type(@_content_type, :charset => 'utf-8')
@@ -551,9 +580,14 @@ module Padrino
551
580
  #
552
581
  # url(:show, :id => 1)
553
582
  # url(:show, :name => :test)
554
- # url("/show/:id/:name", :id => 1, :name => foo)
583
+ # url(:show, 1)
584
+ # url("/foo")
555
585
  #
556
586
  def url(*args)
587
+ # Delegate to Sinatra 1.2 for simple url("/foo")
588
+ # http://www.sinatrarb.com/intro#Generating%20URLs
589
+ return super if args.first.is_a?(String) && !args[1].is_a?(Hash)
590
+ # Delegate to Padrino named route url generation
557
591
  self.class.url(*args)
558
592
  end
559
593
  alias :url_for :url
@@ -5,7 +5,7 @@
5
5
  # without include full padrino core.
6
6
  #
7
7
  module Padrino
8
- VERSION = '0.9.22' unless defined?(Padrino::VERSION)
8
+ VERSION = '0.9.23' unless defined?(Padrino::VERSION)
9
9
  ##
10
10
  # Return the current Padrino version
11
11
  #
data/padrino-core.gemspec CHANGED
@@ -17,9 +17,9 @@ Gem::Specification.new do |s|
17
17
  s.files = %w(.document .gitignore LICENSE README.rdoc Rakefile padrino-core.gemspec) + Dir.glob("{bin,lib,test}/**/*")
18
18
  s.rdoc_options = ["--charset=UTF-8"]
19
19
  s.require_path = "lib"
20
- s.add_dependency("sinatra", "~> 1.1.0")
20
+ s.add_dependency("sinatra", "~> 1.2.0")
21
21
  s.add_dependency("http_router", "~> 0.5.4")
22
22
  s.add_dependency("thor", ">=0.14.3")
23
23
  s.add_dependency("activesupport", ">= 3.0.0")
24
24
  s.add_dependency("tzinfo")
25
- end
25
+ end
data/test/test_routing.rb CHANGED
@@ -4,6 +4,11 @@ class FooError < RuntimeError; end
4
4
 
5
5
 
6
6
  class TestRouting < Test::Unit::TestCase
7
+ should 'use padrinos url method' do
8
+ mock_app { }
9
+ assert_equal @app.method(:url).owner, Padrino::Routing::ClassMethods
10
+ end
11
+
7
12
  should 'ignore trailing delimiters for basic route' do
8
13
  mock_app do
9
14
  get("/foo"){ "okey" }
@@ -20,16 +25,33 @@ class TestRouting < Test::Unit::TestCase
20
25
  end
21
26
 
22
27
  should 'fail with unrecognized route exception when not found' do
23
- unrecognized_app = mock_app do
28
+ mock_app do
24
29
  get(:index){ "okey" }
25
30
  end
26
- assert_nothing_raised { get unrecognized_app.url_for(:index) }
31
+ assert_nothing_raised { get @app.url_for(:index) }
27
32
  assert_equal "okey", body
28
33
  assert_raises(Padrino::Routing::UnrecognizedException) {
29
- get unrecognized_app.url_for(:fake)
34
+ get @app.url_for(:fake)
30
35
  }
31
36
  end
32
37
 
38
+ should_eventually 'generate a url using route string with params' do
39
+ mock_app do
40
+ get("/show/:id/:name"){ "okey" }
41
+ end
42
+
43
+ assert_equal "/show/1/foo", @app.url_for("/show/:id/:name", :id => 1, :name => "foo")
44
+ end
45
+
46
+ should 'work correctly with sinatra redirects' do
47
+ mock_app do
48
+ get(:index){ redirect url(:index) }
49
+ end
50
+
51
+ get "/"
52
+ assert_equal "http://example.org/", headers['Location']
53
+ end
54
+
33
55
  should 'accept regexp routes' do
34
56
  mock_app do
35
57
  get(%r{/fob|/baz}) { "regexp" }
@@ -170,6 +192,29 @@ class TestRouting < Test::Unit::TestCase
170
192
  assert_equal 404, status
171
193
  end
172
194
 
195
+ should 'use padrino url method' do
196
+ mock_app do
197
+ end
198
+
199
+ assert_equal @app.method(:url).owner, Padrino::Routing::ClassMethods
200
+ end
201
+
202
+ should 'work correctly with sinatra redirects' do
203
+ mock_app do
204
+ get(:index) { redirect url(:index) }
205
+ get(:google) { redirect "http://google.com" }
206
+ get("/foo") { redirect "/bar" }
207
+ get("/bar") { "Bar" }
208
+ end
209
+
210
+ get "/"
211
+ assert_equal "http://example.org/", headers['Location']
212
+ get "/google"
213
+ assert_equal "http://google.com", headers['Location']
214
+ get "/foo"
215
+ assert_equal "http://example.org/bar", headers['Location']
216
+ end
217
+
173
218
  should "return 406 on Accept-Headers it does not provide" do
174
219
  mock_app do
175
220
  get(:a, :provides => [:html, :js]){ content_type }
@@ -178,16 +223,35 @@ class TestRouting < Test::Unit::TestCase
178
223
  get "/a", {}, {"HTTP_ACCEPT" => "application/yaml"}
179
224
  assert_equal 406, status
180
225
  end
181
-
226
+
227
+ should "return 406 on file extensions it does not provide and flag is set" do
228
+ mock_app do
229
+ enable :treat_format_as_accept
230
+ get(:a, :provides => [:html, :js]){ content_type }
231
+ end
232
+
233
+ get "/a.xml", {}, {}
234
+ assert_equal 406, status
235
+ end
236
+
237
+ should "return 404 on file extensions it does not provide and flag is not set" do
238
+ mock_app do
239
+ get(:a, :provides => [:html, :js]){ content_type }
240
+ end
241
+
242
+ get "/a.xml", {}, {}
243
+ assert_equal 404, status
244
+ end
245
+
182
246
  should "not set content_type to :html if Accept */* and html not in provides" do
183
247
  mock_app do
184
248
  get("/foo", :provides => [:json, :xml]) { content_type.to_s }
185
249
  end
186
-
250
+
187
251
  get '/foo', {}, { 'HTTP_ACCEPT' => '*/*;q=0.5' }
188
252
  assert_equal 'json', body
189
253
  end
190
-
254
+
191
255
  should "return the first content type in provides if accept header is empty" do
192
256
  mock_app do
193
257
  get(:a, :provides => [:js]){ content_type.to_s }
@@ -769,7 +833,7 @@ class TestRouting < Test::Unit::TestCase
769
833
  assert_equal 'Foo in xml', body
770
834
  get '/foo'
771
835
  assert_equal 'Foo in xml', body
772
-
836
+
773
837
  get '/bar', {}, { 'HTTP_ACCEPT' => 'application/xml' }
774
838
  assert_equal 'Bar in html', body
775
839
  end
@@ -1257,4 +1321,13 @@ class TestRouting < Test::Unit::TestCase
1257
1321
  assert_equal 500, status
1258
1322
  assert_equal 'Foo!', body
1259
1323
  end
1324
+
1325
+ should 'have MethodOverride middleware' do
1326
+ mock_app do
1327
+ put('/') { 'okay' }
1328
+ end
1329
+ post '/', {'_method'=>'PUT'}, {}
1330
+ assert_equal 200, status
1331
+ assert_equal 'okay', body
1332
+ end
1260
1333
  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: 23
4
+ hash: 21
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 9
9
- - 22
10
- version: 0.9.22
9
+ - 23
10
+ version: 0.9.23
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: 2011-03-04 00:00:00 -08:00
21
+ date: 2011-03-07 00:00:00 +01:00
22
22
  default_executable: padrino
23
23
  dependencies:
24
24
  - !ruby/object:Gem::Dependency
@@ -29,12 +29,12 @@ dependencies:
29
29
  requirements:
30
30
  - - ~>
31
31
  - !ruby/object:Gem::Version
32
- hash: 19
32
+ hash: 31
33
33
  segments:
34
34
  - 1
35
- - 1
35
+ - 2
36
36
  - 0
37
- version: 1.1.0
37
+ version: 1.2.0
38
38
  type: :runtime
39
39
  version_requirements: *id001
40
40
  - !ruby/object:Gem::Dependency
@@ -205,7 +205,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
205
205
  requirements: []
206
206
 
207
207
  rubyforge_project: padrino-core
208
- rubygems_version: 1.6.0
208
+ rubygems_version: 1.5.2
209
209
  signing_key:
210
210
  specification_version: 3
211
211
  summary: The required Padrino core gem