force_format 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +15 -2
- data/lib/force_format/controller_access.rb +13 -5
- data/lib/force_format/version.rb +1 -1
- data/spec/base_spec.rb +47 -0
- data/spec/spec_helper.rb +3 -0
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2fe49634705c6855feceebc92a404d1387131592
|
4
|
+
data.tar.gz: 4612743defc0c159744ff61c0446a9f9a597a192
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9e8dd46441bd10e71348585584b5a06f75b2785755a7d83872b2c804b1c7fffb3132e23fb0025c992c15b3ef2bd2d9aa5a0f19051483da453dfd7adc53609704
|
7
|
+
data.tar.gz: f09a265a3532b543204e86e62100a6bb757b417c8260807a8540bee041722f17ba9f292edb75abb29ed74286e6a454cfead4cbe6239591dc43ee59657f56aea0
|
data/README.md
CHANGED
@@ -28,6 +28,8 @@ Or install it yourself as:
|
|
28
28
|
|
29
29
|
## Usage
|
30
30
|
|
31
|
+
#### Basics
|
32
|
+
|
31
33
|
Include the ```force_format_filter``` method in your controllers.
|
32
34
|
The important param is the ```:for => [:my, :formats]```.
|
33
35
|
With that given array of fomat types you can define the formats the
|
@@ -47,6 +49,8 @@ and ```:unless => ...``` parameters like the Rails filters.
|
|
47
49
|
If you want to skip the filter in inherited controllers, use the ```skip_force_format_filter``` method.
|
48
50
|
It accepts the same parameters the ```force_format_filter``` methods except ```:for => ...```.
|
49
51
|
|
52
|
+
#### And more options...
|
53
|
+
|
50
54
|
Maybe you want to define the formats more granular, for example different per action.
|
51
55
|
To accomplish this, pass an hash with action names and required formats. Add a *:default* key with formats
|
52
56
|
for actions that are not specified directly.
|
@@ -66,6 +70,8 @@ for actions that are not specified directly.
|
|
66
70
|
end
|
67
71
|
|
68
72
|
|
73
|
+
#### Exceptions
|
74
|
+
|
69
75
|
By default ```force_format``` raises an ```ActionController::RoutingError```
|
70
76
|
if a requested format matches none of the attributes specified via ```:for => ...```.
|
71
77
|
It should be easy to rescue from this exception, for example in your ```application_controller.rb```:
|
@@ -79,13 +85,20 @@ It should be easy to rescue from this exception, for example in your ```applicat
|
|
79
85
|
# handle it
|
80
86
|
end
|
81
87
|
end
|
88
|
+
|
82
89
|
|
90
|
+
You can pass an custom exception lambda to the ```force_format_filter``` method for a better error handling.
|
91
|
+
|
92
|
+
class PagesController < ApplicationController
|
93
|
+
force_format_filter :for => :html, :exception => lambda { |msg| raise(MyApp::AwesomeException.new(msg)) }
|
94
|
+
end
|
83
95
|
|
96
|
+
NOTE: Call the method ```force_format_filter``` only once per controller!
|
97
|
+
If you call it multiple times, the last one would be used.
|
84
98
|
|
85
99
|
## TODO
|
86
100
|
1. More tests
|
87
|
-
|
88
|
-
4. Custom exception
|
101
|
+
2. More robust params checking
|
89
102
|
|
90
103
|
|
91
104
|
## Contributing
|
@@ -4,12 +4,13 @@ module ControllerAccess
|
|
4
4
|
extend ActiveSupport::Concern
|
5
5
|
FORCE_FORMAT_TYPES = [:html, :js, :json, :pdf, :csv, :zip, :xml]
|
6
6
|
FORCE_FORMAT_DEFAULT_TYPES = [:html]
|
7
|
+
FORCE_FORMAT_EXCEPTION = lambda { |o| raise(ActionController::RoutingError, o) }
|
7
8
|
|
8
9
|
module ClassMethods
|
9
10
|
include ForceFormat::Errors
|
10
11
|
|
11
12
|
def force_format_filter(opts={})
|
12
|
-
send(:before_filter, :force_format_filter_method, opts.slice(:only, :except, :if, :unless, :for))
|
13
|
+
send(:before_filter, :force_format_filter_method, opts.slice(:only, :except, :if, :unless, :for, :exception))
|
13
14
|
end
|
14
15
|
|
15
16
|
def skip_force_format_filter(opts={})
|
@@ -21,19 +22,22 @@ module ControllerAccess
|
|
21
22
|
private
|
22
23
|
|
23
24
|
def force_format_filter_method
|
24
|
-
force_formats =
|
25
|
+
force_formats = force_format_extract_formats
|
25
26
|
return unless force_formats
|
26
27
|
unsupported = force_formats - FORCE_FORMAT_TYPES
|
27
28
|
raise UnsupportedFormatsError.new("There is no support for #{unsupported} format") if unsupported.any?
|
28
29
|
format = request.format
|
29
30
|
unless force_formats.include?(format.try(:to_sym))
|
30
|
-
|
31
|
+
force_format_extract_exception.call("Format '#{format}' not supported for #{request.path.inspect}")
|
31
32
|
end
|
32
33
|
end
|
33
34
|
|
34
|
-
def
|
35
|
+
def force_format_load_filter_chain
|
35
36
|
filter = self._process_action_callbacks.find { |f| f.filter == :force_format_filter_method }
|
36
|
-
|
37
|
+
end
|
38
|
+
|
39
|
+
def force_format_extract_formats
|
40
|
+
force_formats = force_format_load_filter_chain.options[:for]
|
37
41
|
|
38
42
|
if force_formats.is_a? (Array || Symbol)
|
39
43
|
[*force_formats]
|
@@ -48,4 +52,8 @@ module ControllerAccess
|
|
48
52
|
end
|
49
53
|
end
|
50
54
|
|
55
|
+
def force_format_extract_exception
|
56
|
+
force_format_load_filter_chain.options[:exception] || FORCE_FORMAT_EXCEPTION
|
57
|
+
end
|
58
|
+
|
51
59
|
end
|
data/lib/force_format/version.rb
CHANGED
data/spec/base_spec.rb
CHANGED
@@ -341,4 +341,51 @@ describe PagesController, :type => :controller do
|
|
341
341
|
end
|
342
342
|
|
343
343
|
|
344
|
+
context "force_format_filter is used with unsupported format" do
|
345
|
+
|
346
|
+
controller do
|
347
|
+
send "force_format_filter", :for => {:index => :what}
|
348
|
+
|
349
|
+
def index
|
350
|
+
render "with_js"
|
351
|
+
end
|
352
|
+
end
|
353
|
+
|
354
|
+
it "should respond with RoutingError for html" do
|
355
|
+
expect { get "index", :format => :html }.to raise_error(UnsupportedFormatsError)
|
356
|
+
end
|
357
|
+
|
358
|
+
end
|
359
|
+
|
360
|
+
context "force_format_filter is used with unsupported format" do
|
361
|
+
|
362
|
+
controller do
|
363
|
+
send "force_format_filter", :for => {:index => :what}
|
364
|
+
|
365
|
+
def index
|
366
|
+
render "with_js"
|
367
|
+
end
|
368
|
+
end
|
369
|
+
|
370
|
+
it "should respond with RoutingError for html" do
|
371
|
+
expect { get "index", :format => :html }.to raise_error(UnsupportedFormatsError)
|
372
|
+
end
|
373
|
+
|
374
|
+
end
|
375
|
+
|
376
|
+
context "force_format_filter is used with a custom exception" do
|
377
|
+
|
378
|
+
controller do
|
379
|
+
send "force_format_filter", :for => [:js], :exception => lambda { |o| raise(ActiveRecord::RecordNotFound, o) }
|
380
|
+
|
381
|
+
def index
|
382
|
+
render "with_js"
|
383
|
+
end
|
384
|
+
end
|
385
|
+
|
386
|
+
it "should respond with RoutingError for html" do
|
387
|
+
expect { get "index", :format => :html }.to raise_error(ActiveRecord::RecordNotFound)
|
388
|
+
end
|
389
|
+
|
390
|
+
end
|
344
391
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -6,6 +6,9 @@ require 'rspec/rails'
|
|
6
6
|
require 'rspec/autorun'
|
7
7
|
require 'force_format'
|
8
8
|
require 'pry'
|
9
|
+
require_relative '../lib/force_format/errors'
|
10
|
+
|
11
|
+
include ForceFormat::Errors
|
9
12
|
|
10
13
|
RSpec.configure do |config|
|
11
14
|
config.treat_symbols_as_metadata_keys_with_true_values = true
|