request_exception_handler 0.4 → 0.5.0

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 161f65acac0facbace5cd9ca6c97b5505d6eb37f
4
+ data.tar.gz: 1cc3a96669b70eb6b2b78cb7f946674ca4eed339
5
+ SHA512:
6
+ metadata.gz: 8f4cb1cac97ae79f15d49a7eaaab3773a432b01363ec4192fdb19c53a01845d65aff075063d271c17bc60baed6c1468f207924c73719f19860a52d8e6a5a6b7b
7
+ data.tar.gz: 068f53859e8c7d8f058f4337712dc36d1eebbde96d92aee7cffda6ef87fc504b9ef27f74d4c2c99182bc00578924ef703ccd99501f756fae576aa0329ef822fc
data/LICENSE CHANGED
@@ -186,7 +186,7 @@
186
186
  same "printed page" as the copyright notice for easier
187
187
  identification within third-party archives.
188
188
 
189
- Copyright (c) 2009 Karol Bucek
189
+ Copyright (c) 2014 Karol Bucek
190
190
 
191
191
  Licensed under the Apache License, Version 2.0 (the "License");
192
192
  you may not use this file except in compliance with the License.
data/README.md CHANGED
@@ -1,71 +1,81 @@
1
1
  # RequestExceptionHandler
2
2
 
3
3
  Rails is not capable of calling your exception handlers when an error occurs
4
- during the parsing of request parameters (e.g. in case of invalid XML body).
4
+ during the parsing of request parameters (e.g. in case of invalid JSON body).
5
5
 
6
- This will hopefully change someday, but until then I have created this biutiful
7
- monkey-patch for request parameter parsing to allow more flexibility when
6
+ This will hopefully change someday, but until then I have created this delicate
7
+ monkey-patch for the request parameter parser to allow more flexibility when
8
8
  an invalid request body is received.
9
9
 
10
- Tested on 3.0, 3.1 and 3.2 it should still work on Rails 2.3 and 2.2.3 as well.
10
+ Tested on 4.x and 3.x but it should still work on Rails 2.3 and 2.2.3 as well.
11
11
 
12
+ [![Build Status][0]](http://travis-ci.org/#!/kares/request_exception_handler)
12
13
 
13
14
  ## Install
14
15
 
15
16
  gem 'request_exception_handler'
16
17
 
17
- or as a plain-old rails plugin :
18
+ ~~or as a plain-old (obsolete) rails plugin~~ :
18
19
 
19
20
  script/plugin install git://github.com/kares/request_exception_handler.git
20
21
 
21
22
  ## Example
22
23
 
23
24
  The code hooks into parameter parsing and allows a request to be constructed
24
- even if the params can not be parsed from the submitted raw content. A before
25
- filter is installed that checks for a request exception and re-raises it thus
26
- it seems to Rails that the exception comes from the application code and is
27
- processed as all other "business" exceptions.
28
- you might skip this filter and install your own to handle such cases (it's good
29
- to make sure the filter gets to the beginning of the chain) :
25
+ even if the parsing of the submitted raw content fails (JSON/XML backend raises
26
+ a parse error). A before filter is installed that checks for a request exception
27
+ and re-raises, it thus it seems to Rails that the exception comes from the
28
+ application code and is processed as all other "business" exceptions.
30
29
 
31
- class MyController < ApplicationController
30
+ One might skip this "request-exception" filter (e.g. per action - the usual way)
31
+ and install another to handle such cases (it's good to make sure the filter gets
32
+ at the beginning of the chain) :
32
33
 
33
- skip_before_filter :check_request_exception # filter the plugin installed
34
+ ```ruby
35
+ class MyController < ApplicationController
34
36
 
35
- # custom before filter use request_exception to detect occured errors
36
- prepend_before_filter :return_409_on_json_errors
37
+ skip_before_filter :check_request_exception # filter the plugin installed
37
38
 
38
- private
39
-
40
- def return_409_on_json_errors
41
- if re = request_exception && re.is_a?(ActiveSupport::JSON::ParseError)
42
- head 409
43
- else
44
- head 500
45
- end
46
- end
39
+ # custom before filter use request_exception to detect occured errors
40
+ prepend_before_filter :return_409_on_json_errors
47
41
 
42
+ private
43
+ def return_409_on_json_errors
44
+ if e = request_exception && e.is_a?(ActiveSupport::JSON::ParseError)
45
+ head 409
46
+ else
47
+ head 500
48
48
  end
49
+ end
50
+
51
+ end
52
+ ```
49
53
 
50
54
  Another option of how to modify the returned 500 status is to use exception
51
55
  handlers the same way you're (hopefully) using them for your own exceptions :
52
56
 
53
- class ApplicationController < ActionController::Base
57
+ ```ruby
58
+ class ApplicationController < ActionController::Base
54
59
 
55
- rescue_from 'REXML::ParseException' do |exception|
56
- render :text => exception.to_s, :status => 422
57
- end
60
+ rescue_from 'REXML::ParseException' do |exception|
61
+ render :text => exception.to_s, :status => 422
62
+ end
58
63
 
59
- end
64
+ end
65
+ ```
60
66
 
61
67
  If you're not using REXML as a parsing backend the exception might vary, e.g.
62
68
  for Nokogiri the rescue block would look something like :
63
69
 
64
- rescue_from 'Nokogiri::XML::SyntaxError' do |exception|
65
- render :text => exception.to_s, :status => 422
66
- end
70
+ ```ruby
71
+ rescue_from 'Nokogiri::XML::SyntaxError' do |exception|
72
+ render :text => exception.to_s, :status => 422
73
+ end
74
+ ```
67
75
 
68
76
  ## Copyright
69
77
 
70
- Copyright (c) 2009-2012 [Karol Bucek](https://github.com/kares).
71
- See LICENSE (http://www.apache.org/licenses/LICENSE-2.0) for details.
78
+ Copyright (c) 2014 [Karol Bucek](https://github.com/kares).
79
+ See LICENSE (http://www.apache.org/licenses/LICENSE-2.0) for details.
80
+
81
+ [0]: https://secure.travis-ci.org/kares/request_exception_handler.png
@@ -3,31 +3,35 @@
3
3
  module RequestExceptionHandler
4
4
 
5
5
  THREAD_LOCAL_NAME = :_request_exception
6
-
6
+
7
7
  @@parse_request_parameters_exception_handler = lambda do |request, exception|
8
- Thread.current[THREAD_LOCAL_NAME] = exception
8
+ RequestExceptionHandler.store_request_exception(exception)
9
9
  request_body = request.respond_to?(:body) ? request.body : request.raw_post
10
10
 
11
11
  logger = RequestExceptionHandler.logger
12
- if logger.info?
12
+ if logger.debug?
13
13
  content_log = request_body
14
14
  if request_body.is_a?(StringIO)
15
15
  pos = request_body.pos
16
16
  content_log = request_body.read
17
17
  end
18
- logger.info "#{exception.class.name} occurred while parsing request parameters." +
19
- "\nContents:\n#{content_log}\n"
18
+ logger.debug "#{exception.class.name} occurred while parsing request parameters." <<
19
+ "\nContents:\n#{content_log}\n"
20
20
  request_body.pos = pos if pos
21
+ elsif logger.info?
22
+ logger.info "#{exception.class.name} occurred while parsing request parameters."
21
23
  end
22
-
23
- content_type = if request.respond_to?(:content_type_with_parameters)
24
- request.send :content_type_with_parameters # AbstractRequest
25
- else # rack request
26
- request.respond_to?(:content_mime_type) ? request.content_mime_type : request.content_type
24
+
25
+ content_type = if request.respond_to?(:content_mime_type)
26
+ request.content_mime_type
27
+ elsif request.respond_to?(:content_type_with_parameters)
28
+ request.send :content_type_with_parameters # (legacy) ActionController::AbstractRequest
29
+ else
30
+ request.content_type
27
31
  end
28
32
  { "body" => request_body, "content_type" => content_type, "content_length" => request.content_length }
29
33
  end
30
-
34
+
31
35
  begin
32
36
  mattr_accessor :parse_request_parameters_exception_handler
33
37
  rescue NoMethodError => e
@@ -35,34 +39,62 @@ module RequestExceptionHandler
35
39
  raise e
36
40
  end
37
41
 
38
- # Resets the current +request_exception+ (to nil).
39
- def self.reset_request_exception
40
- Thread.current[THREAD_LOCAL_NAME] = nil
41
- end
42
+ @@parse_request_parameters_exception_logger = nil
42
43
 
43
44
  # Retrieves the Rails logger.
44
45
  def self.logger
45
- defined?(Rails.logger) ? Rails.logger :
46
- defined?(RAILS_DEFAULT_LOGGER) ? RAILS_DEFAULT_LOGGER :
47
- Logger.new($stderr)
46
+ @@parse_request_parameters_exception_logger ||=
47
+ defined?(Rails.logger) ? Rails.logger :
48
+ defined?(RAILS_DEFAULT_LOGGER) ? RAILS_DEFAULT_LOGGER :
49
+ Logger.new(STDERR)
48
50
  end
49
-
51
+
50
52
  def self.included(base)
51
53
  base.prepend_before_filter :check_request_exception
52
54
  end
53
55
 
54
- # Checks and raises a +request_exception+ (gets prepended as a before filter).
55
- def check_request_exception
56
- e = request_exception
57
- raise e if e && e.is_a?(Exception)
56
+ # Resets the current +request_exception+ (to nil).
57
+ def self.reset_request_exception
58
+ store_request_exception nil
59
+ end
60
+
61
+ if defined? Thread.current.thread_variables
62
+
63
+ # Resets the current +request_exception+ (to nil).
64
+ def self.store_request_exception(exception)
65
+ Thread.current.thread_variable_set THREAD_LOCAL_NAME, exception
66
+ end
67
+
68
+ # Retrieves and keeps track of the current request exception if any.
69
+ def request_exception
70
+ return @_request_exception if defined? @_request_exception
71
+ @_request_exception = Thread.current.thread_variable_get(THREAD_LOCAL_NAME)
72
+ RequestExceptionHandler.reset_request_exception
73
+ @_request_exception
74
+ end
75
+
76
+ else
77
+
78
+ # Resets the current +request_exception+ (to nil).
79
+ def self.store_request_exception(exception)
80
+ Thread.current[THREAD_LOCAL_NAME] = exception
81
+ end
82
+
83
+ # Retrieves and keeps track of the current request exception if any.
84
+ def request_exception
85
+ return @_request_exception if defined? @_request_exception
86
+ @_request_exception = Thread.current[THREAD_LOCAL_NAME]
87
+ RequestExceptionHandler.reset_request_exception
88
+ @_request_exception
89
+ end
90
+
58
91
  end
59
92
 
60
- # Retrieves and keeps track of the current request exception if any.
61
- def request_exception
62
- return @_request_exception if defined? @_request_exception
63
- @_request_exception = Thread.current[THREAD_LOCAL_NAME]
64
- RequestExceptionHandler.reset_request_exception
65
- @_request_exception
93
+ # Checks and raises a +request_exception+ (gets prepended as a before filter).
94
+ def check_request_exception
95
+ if e = request_exception
96
+ raise e if e.is_a?(Exception)
97
+ end
66
98
  end
67
99
 
68
100
  end
@@ -70,11 +102,36 @@ end
70
102
  require 'action_controller/base'
71
103
  ActionController::Base.send :include, RequestExceptionHandler
72
104
 
73
- # NOTE: Rails monkey patching follows :
105
+ # NOTE: Rails "parameters-parser" monkey patching follows :
106
+
107
+ if defined? ActionDispatch::ParamsParser::ParseError # Rails 4.x
108
+
109
+ class ActionDispatch::ParamsParser
110
+
111
+ alias_method 'parse_formatted_parameters_without_exception_handler', 'parse_formatted_parameters'
112
+
113
+ def parse_formatted_parameters_with_exception_handler(env)
114
+ begin
115
+ out = parse_formatted_parameters_without_exception_handler(env)
116
+ RequestExceptionHandler.reset_request_exception # make sure it's nil
117
+ out
118
+ rescue ParseError => e
119
+ e = e.original_exception
120
+ handler = RequestExceptionHandler.parse_request_parameters_exception_handler
121
+ handler ? handler.call(ActionDispatch::Request.new(env), e) : raise
122
+ rescue => e # all Exception-s get wrapped into ParseError ... but just in case
123
+ handler = RequestExceptionHandler.parse_request_parameters_exception_handler
124
+ handler ? handler.call(ActionDispatch::Request.new(env), e) : raise
125
+ end
126
+ end
127
+
128
+ alias_method 'parse_formatted_parameters', 'parse_formatted_parameters_with_exception_handler'
129
+
130
+ end
74
131
 
75
- if defined? ActionDispatch::ParamsParser # Rails 3.x
132
+ elsif defined? ActionDispatch::ParamsParser # Rails 3.x
76
133
 
77
- ActionDispatch::ParamsParser.class_eval do
134
+ class ActionDispatch::ParamsParser
78
135
 
79
136
  def parse_formatted_parameters_with_exception_handler(env)
80
137
  begin
@@ -87,13 +144,13 @@ if defined? ActionDispatch::ParamsParser # Rails 3.x
87
144
  end
88
145
  end
89
146
 
90
- alias_method_chain :parse_formatted_parameters, :exception_handler
147
+ alias_method_chain 'parse_formatted_parameters', 'exception_handler'
91
148
 
92
149
  end
93
150
 
94
151
  elsif defined? ActionController::ParamsParser # Rails 2.3.x
95
152
 
96
- ActionController::ParamsParser.class_eval do
153
+ class ActionController::ParamsParser
97
154
 
98
155
  def parse_formatted_parameters_with_exception_handler(env)
99
156
  begin
@@ -106,7 +163,7 @@ elsif defined? ActionController::ParamsParser # Rails 2.3.x
106
163
  end
107
164
  end
108
165
 
109
- alias_method_chain :parse_formatted_parameters, :exception_handler
166
+ alias_method_chain 'parse_formatted_parameters', 'exception_handler'
110
167
 
111
168
  end
112
169
 
@@ -0,0 +1,62 @@
1
+ # mock require 'active_support/testing/autorun'
2
+ $LOADED_FEATURES << 'active_support/testing/autorun.rb'
3
+ require 'test-unit'
4
+ ##
5
+
6
+ # mock require 'active_support/test_case'
7
+ $LOADED_FEATURES << 'active_support/test_case.rb'
8
+
9
+ require 'active_support/testing/tagged_logging'
10
+ require 'active_support/testing/setup_and_teardown' # ?
11
+ require 'active_support/testing/assertions'
12
+ require 'active_support/testing/deprecation'
13
+ #require 'active_support/testing/pending'
14
+ #require 'active_support/testing/declarative'
15
+ #require 'active_support/testing/isolation'
16
+ require 'active_support/testing/constant_lookup'
17
+ require 'active_support/core_ext/kernel/reporting'
18
+ require 'active_support/deprecation'
19
+
20
+ #begin
21
+ # silence_warnings { require 'mocha/setup' }
22
+ #rescue LoadError
23
+ #end
24
+
25
+ module ActiveSupport
26
+ class TestCase < Test::Unit::TestCase
27
+ #Assertion = Test::Unit::Assertions
28
+
29
+ @@tags = {}
30
+ def self.for_tag(tag)
31
+ yield if @@tags[tag]
32
+ end
33
+
34
+ include ActiveSupport::Testing::TaggedLogging
35
+ include ActiveSupport::Testing::SetupAndTeardown
36
+ include ActiveSupport::Testing::Assertions
37
+ include ActiveSupport::Testing::Deprecation
38
+ #include ActiveSupport::Testing::Pending
39
+ #extend ActiveSupport::Testing::Declarative
40
+
41
+ # Fails if the block raises an exception.
42
+ #
43
+ # assert_nothing_raised do
44
+ # ...
45
+ # end
46
+ #def assert_nothing_raised(*args)
47
+ # yield
48
+ #end
49
+ end
50
+ end
51
+
52
+ ##
53
+
54
+ #require "test/unit/active_support"
55
+ #require "test/unit/notify"
56
+ #require "test/unit/rr"
57
+
58
+ # due ActionDispatch::Integration
59
+ $LOADED_FEATURES << 'minitest/unit.rb'
60
+ module MiniTest
61
+ Assertions = Test::Unit::Assertions
62
+ end
@@ -1,28 +1,15 @@
1
1
  require File.expand_path('test_helper', File.dirname(__FILE__))
2
2
 
3
- #
4
- # NOTE: due to the test_helper.rb argument parsing this test might
5
- # be run with different versions of Rails e.g. :
6
- #
7
- # ruby request_exception_handler_test.rb RAILS_VERSION=2.1.2
8
- #
9
-
10
3
  class TestController < ActionController::Base
11
4
 
12
- def parse
13
- head :ok
14
- end
5
+ def parse; head :ok end
15
6
 
16
- def parse_with_check_request_exception_skipped
17
- head :ok
18
- end
7
+ def parse_with_check_request_exception_skipped; head :ok end
19
8
 
20
9
  skip_before_filter :check_request_exception, :only =>
21
10
  [ :parse_with_check_request_exception_skipped, :parse_with_check_request_exception_replaced ]
22
11
 
23
- def parse_with_check_request_exception_replaced
24
- head :ok
25
- end
12
+ def parse_with_check_request_exception_replaced; head :ok end
26
13
 
27
14
  before_filter :return_501_on_request_exception, :only => [ :parse_with_check_request_exception_replaced ]
28
15
 
@@ -38,9 +25,7 @@ class TestWithRexmlRescueController < ActionController::Base
38
25
  render :text => exception.class.name, :status => 405
39
26
  end
40
27
 
41
- def index
42
- head :ok
43
- end
28
+ def index; head :ok end
44
29
 
45
30
  end
46
31
 
@@ -50,21 +35,19 @@ class TestWithNokogiriRescueController < ActionController::Base
50
35
  render :text => exception.class.name, :status => 505
51
36
  end
52
37
 
53
- def index
54
- head :ok
55
- end
38
+ def index; head :ok end
56
39
 
57
40
  end
58
41
 
59
- if Rails.version < '3.0.0'
60
- ActionController::Routing::Routes.draw do |map|
61
- map.connect '/parse_with_rexml_rescue_block',
62
- :controller => 'test_with_rexml_rescue', :action => 'index'
63
- map.connect '/parse_with_nokogiri_rescue_block',
64
- :controller => 'test_with_nokogiri_rescue', :action => 'index'
65
- map.connect '/:action', :controller => "test"
42
+ if Rails::VERSION::MAJOR >= 4
43
+ RequestExceptionHandlerTest::Application.routes.draw do
44
+ post "/parse_with_rexml_rescue_block", :to => 'test_with_rexml_rescue#index'
45
+ post "/parse_with_nokogiri_rescue_block", :to => 'test_with_nokogiri_rescue#index'
46
+ post '/parse' => "test#parse"
47
+ post '/parse_with_check_request_exception_skipped', :to => "test#parse_with_check_request_exception_skipped"
48
+ post '/parse_with_check_request_exception_replaced', :to => "test#parse_with_check_request_exception_replaced"
66
49
  end
67
- else
50
+ elsif Rails::VERSION::MAJOR >= 3
68
51
  RequestExceptionHandlerTest::Application.routes.draw do
69
52
  match "/parse_with_rexml_rescue_block", :to => 'test_with_rexml_rescue#index'
70
53
  match "/parse_with_nokogiri_rescue_block", :to => 'test_with_nokogiri_rescue#index'
@@ -72,9 +55,17 @@ else
72
55
  match '/parse_with_check_request_exception_skipped', :to => "test#parse_with_check_request_exception_skipped"
73
56
  match '/parse_with_check_request_exception_replaced', :to => "test#parse_with_check_request_exception_replaced"
74
57
  end
58
+ else
59
+ ActionController::Routing::Routes.draw do |map|
60
+ map.connect '/parse_with_rexml_rescue_block',
61
+ :controller => 'test_with_rexml_rescue', :action => 'index'
62
+ map.connect '/parse_with_nokogiri_rescue_block',
63
+ :controller => 'test_with_nokogiri_rescue', :action => 'index'
64
+ map.connect '/:action', :controller => "test"
65
+ end
75
66
  end
76
67
 
77
- class RequestExceptionHandlerJsonTest < ActionController::IntegrationTest
68
+ class RequestExceptionHandlerJsonTest < IntegrationTest
78
69
 
79
70
  def test_parse_valid_json
80
71
  post "/parse", '{"cicinbrus": {"name": "Ferko"}}', 'CONTENT_TYPE' => 'application/json'
@@ -94,18 +85,18 @@ class RequestExceptionHandlerJsonTest < ActionController::IntegrationTest
94
85
 
95
86
  private
96
87
 
97
- def assert_json_parse_exception(error)
98
- if ActiveSupport::JSON.respond_to?(:parse_error) # 2.3.5
99
- parse_error_class = ActiveSupport::JSON.parse_error
100
- assert_instance_of parse_error_class, error
101
- else
102
- assert_instance_of ActiveSupport::JSON::ParseError, error
103
- end
88
+ def assert_json_parse_exception(error)
89
+ if ActiveSupport::JSON.respond_to?(:parse_error) # 2.3.5
90
+ parse_error_class = ActiveSupport::JSON.parse_error
91
+ assert_instance_of parse_error_class, error
92
+ else
93
+ assert_instance_of ActiveSupport::JSON::ParseError, error
104
94
  end
95
+ end
105
96
 
106
97
  end
107
98
 
108
- class RequestExceptionHandlerXmlTest < ActionController::IntegrationTest
99
+ class RequestExceptionHandlerXmlTest < IntegrationTest
109
100
 
110
101
  def test_parse_valid_xml
111
102
  post "/parse", "<cicinbrus> <name>Ferko</name> </cicinbrus>", 'CONTENT_TYPE' => 'application/xml'
@@ -167,35 +158,34 @@ class RequestExceptionHandlerXmlTest < ActionController::IntegrationTest
167
158
  assert_response 405
168
159
  end
169
160
 
170
- if Rails.version >= '2.3'
171
-
172
- def test_on_parse_error_custom_rescue_handler_gets_called_for_nokogiri
173
- nokogiri =
174
- begin
175
- require 'nokogiri'
176
- rescue LoadError
177
- :nil
178
- end
179
- if nokogiri != :nil
180
- backend = ActiveSupport::XmlMini.backend
181
- begin
182
- ActiveSupport::XmlMini.backend = 'Nokogiri'
183
- post "/parse_with_nokogiri_rescue_block", "<cicinbrus> <name>Ferko</name>", 'CONTENT_TYPE' => 'application/xml'
184
- assert_response 505
185
- ensure
186
- ActiveSupport::XmlMini.backend = backend
187
- end
188
- else
189
- puts "nokogiri not available - test skipped !"
190
- end
191
- end
192
-
161
+ begin
162
+ require 'nokogiri'
163
+ NOKOGIRI = true
164
+ rescue LoadError
165
+ NOKOGIRI = false
193
166
  end
194
167
 
195
- private
168
+ def test_on_parse_error_custom_rescue_handler_gets_called_for_nokogiri
169
+ return skip('nokogiri not available - test skipped !') unless NOKOGIRI
196
170
 
197
- def assert_xml_parse_exception(error)
198
- assert_instance_of REXML::ParseException, error
171
+ backend = ActiveSupport::XmlMini.backend
172
+ begin
173
+ ActiveSupport::XmlMini.backend = 'Nokogiri'
174
+ post "/parse_with_nokogiri_rescue_block", "<cicinbrus> <name>Ferko</name>", 'CONTENT_TYPE' => 'application/xml'
175
+ assert_response 505
176
+ ensure
177
+ ActiveSupport::XmlMini.backend = backend
199
178
  end
179
+ end if Rails.version >= '2.3'
180
+
181
+ private
182
+
183
+ def skip(message = nil)
184
+ super
185
+ end
186
+
187
+ def assert_xml_parse_exception(error)
188
+ assert_instance_of REXML::ParseException, error
189
+ end
200
190
 
201
191
  end
@@ -1,62 +1,90 @@
1
1
  require 'rubygems'
2
- gem 'test-unit' rescue nil
3
- require 'test/unit'
2
+ require 'bundler/setup' rescue nil
4
3
 
5
4
  # enable testing with different version of rails via argv :
6
- # ruby request_exception_handler_test.rb RAILS_VERSION=2.2.2
7
-
5
+ # ruby request_exception_handler_test.rb RAILS_VERSION=2.3.18
8
6
  version =
9
7
  if ARGV.find { |opt| /RAILS_VERSION=([\d\.]+)/ =~ opt }
10
8
  $~[1]
11
9
  else
12
- # rake test RAILS_VERSION=2.3.5
13
- ENV['RAILS_VERSION']
10
+ ENV['RAILS_VERSION'] # rake test RAILS_VERSION=3.2.18
14
11
  end
15
12
 
16
13
  if version
17
14
  RAILS_VERSION = version
18
- gem 'activesupport', "= #{RAILS_VERSION}"
19
- #gem 'activerecord', "= #{RAILS_VERSION}"
20
- gem 'actionpack', "= #{RAILS_VERSION}"
21
- #gem 'actionmailer', "= #{RAILS_VERSION}"
22
- gem 'rails', "= #{RAILS_VERSION}"
15
+ gem 'activesupport', "#{RAILS_VERSION}"
16
+ gem 'actionpack', "#{RAILS_VERSION}"
17
+ gem 'rails', "#{RAILS_VERSION}"
23
18
  else
24
19
  gem 'activesupport'
25
- #gem 'activerecord'
26
20
  gem 'actionpack'
27
- #gem 'actionmailer'
28
21
  gem 'rails'
22
+ end unless defined? Bundler
23
+
24
+ require 'rails/version'
25
+ puts "emulating Rails.version = #{Rails::VERSION::STRING}"
26
+
27
+ if Rails::VERSION::MAJOR < 4
28
+ gem 'test-unit' rescue nil
29
+ begin
30
+ require 'test/unit'
31
+ rescue LoadError
32
+ gem 'minitest'
33
+ require 'minitest/unit'
34
+ MiniTest::Unit.autorun
35
+ end
36
+ else
37
+ gem 'minitest'
29
38
  end
30
39
 
40
+ begin
41
+ require 'iconv'
42
+ rescue LoadError
43
+ begin
44
+ require 'active_support/inflector'
45
+ rescue LoadError
46
+ $LOADED_FEATURES << 'iconv.rb'
47
+ require 'active_support/inflector'
48
+ end
49
+ end if Rails::VERSION::MAJOR < 3
31
50
  require 'active_support'
32
51
  require 'active_support/test_case'
33
52
  require 'action_controller'
34
53
  require 'action_controller/test_case'
35
54
 
36
- require 'rails/version'
37
- puts "emulating Rails.version = #{Rails::VERSION::STRING}"
38
-
39
55
  require 'action_controller/integration' if Rails::VERSION::MAJOR < 3
40
56
  require 'action_controller/session_management' if Rails::VERSION::MAJOR < 3
41
57
  require 'action_dispatch' if Rails::VERSION::MAJOR >= 3
42
58
  require 'action_dispatch/routing' if Rails::VERSION::MAJOR >= 3
43
59
 
60
+ begin
61
+ require 'action_dispatch/testing/integration'
62
+ IntegrationTest = ActionDispatch::IntegrationTest
63
+ rescue LoadError
64
+ IntegrationTest = ActionController::IntegrationTest
65
+ end
66
+
44
67
  if Rails::VERSION::MAJOR >= 3
45
68
  ActiveSupport::Deprecation.behavior = :stderr
46
69
  else
47
70
  ActiveSupport::Deprecation.debug = true
48
71
  end
49
72
 
50
- if Rails::VERSION::MAJOR >= 3
73
+ if Rails::VERSION::MAJOR >= 4
51
74
  require 'rails'
52
75
  # a minimal require 'rails/all' :
53
- require "action_controller/railtie"
54
- require "rails/test_unit/railtie"
76
+ require 'action_controller/railtie'
77
+ require 'rails/test_help'
78
+ elsif Rails::VERSION::MAJOR >= 3
79
+ require 'rails'
80
+ # a minimal require 'rails/all' :
81
+ require 'action_controller/railtie'
82
+ require 'rails/test_unit/railtie'
55
83
  require 'rails/test_help'
56
84
  else
57
85
  module Rails
58
86
  class << self
59
-
87
+
60
88
  def initialized?
61
89
  @initialized || false
62
90
  end
@@ -100,7 +128,7 @@ else
100
128
  def public_path=(path)
101
129
  @@public_path = path
102
130
  end
103
-
131
+
104
132
  end
105
133
  end
106
134
  end
@@ -109,7 +137,7 @@ silence_warnings { RAILS_ROOT = File.expand_path( File.dirname(__FILE__) ) }
109
137
 
110
138
  # Make double-sure the RAILS_ENV is set to test,
111
139
  # so fixtures are loaded to the right database
112
- silence_warnings { RAILS_ENV = "test" }
140
+ silence_warnings { RAILS_ENV = 'test' }
113
141
 
114
142
  Rails.backtrace_cleaner.remove_silencers! if Rails.backtrace_cleaner
115
143
 
@@ -130,25 +158,35 @@ if ActionController::Base.respond_to? :session_options # Rails 2.x
130
158
  ActionController::Base.session_options[:secret] = 'x' * 30
131
159
 
132
160
  else # since Rails 3.0.0 :
133
-
161
+
134
162
  module RequestExceptionHandlerTest
135
- class Application < Rails::Application
136
- config.secret_token = 'x' * 30
163
+
164
+ class Application < Rails::Application; end
165
+
166
+ Application.configure do
167
+ if config.respond_to?(:secret_key_base=)
168
+ config.secret_key_base = 'x' * 30
169
+ else
170
+ config.secret_token = 'x' * 30
171
+ end
172
+ config.cache_classes = true if config.respond_to?(:cache_classes=)
173
+ config.eager_load = false if config.respond_to?(:eager_load=)
174
+ config.action_controller.allow_forgery_protection = false
175
+ config.active_support.deprecation = :stderr
137
176
  end
138
- end
139
-
140
- # Initialize the rails application
141
- RequestExceptionHandlerTest::Application.initialize!
142
177
 
143
- end
178
+ # Since 4.0 only DEFAULT_PARSERS = { Mime::JSON => :json } is setup by default
179
+ unless ActionDispatch::ParamsParser::DEFAULT_PARSERS[ Mime::XML ]
180
+ ActionDispatch::ParamsParser::DEFAULT_PARSERS[ Mime::XML ] = Proc.new do
181
+ |raw_post| ( Hash.from_xml(raw_post) || {} ).with_indifferent_access
182
+ end
183
+ end if defined? ActionDispatch::ParamsParser::DEFAULT_PARSERS
144
184
 
145
- ActiveSupport::TestCase.class_eval do
185
+ Application.initialize!
146
186
 
147
- def setup_fixtures
148
- return nil # Rails 3 load hooks !
149
187
  end
150
-
188
+
151
189
  end
152
190
 
153
- $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '../lib')
191
+ $LOAD_PATH.unshift File.expand_path('../lib', File.dirname(__FILE__))
154
192
  require 'request_exception_handler'
metadata CHANGED
@@ -1,99 +1,84 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: request_exception_handler
3
- version: !ruby/object:Gem::Version
4
- prerelease:
5
- version: "0.4"
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.5.0
6
5
  platform: ruby
7
- authors:
8
- - Karol Bucek
6
+ authors:
7
+ - Karol Bucek
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
-
13
- date: 2012-11-15 00:00:00 Z
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
16
- name: actionpack
17
- version_requirements: &id001 !ruby/object:Gem::Requirement
18
- none: false
19
- requirements:
20
- - - ">="
21
- - !ruby/object:Gem::Version
22
- version: "2.1"
23
- requirement: *id001
24
- prerelease: false
25
- type: :runtime
26
- - !ruby/object:Gem::Dependency
27
- name: rake
28
- version_requirements: &id002 !ruby/object:Gem::Requirement
29
- none: false
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: "0"
34
- requirement: *id002
35
- prerelease: false
36
- type: :development
37
- - !ruby/object:Gem::Dependency
38
- name: test-unit
39
- version_requirements: &id003 !ruby/object:Gem::Requirement
40
- none: false
41
- requirements:
42
- - - ">="
43
- - !ruby/object:Gem::Version
44
- version: "2.4"
45
- requirement: *id003
46
- prerelease: false
47
- type: :development
48
- description: a rails hook that allows one to handle request parameter parsing exceptions (invalid XML, JSON) with a rescue block
49
- email:
50
- - self@kares.org
11
+ date: 2014-06-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: actionpack
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '2.1'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '2.1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 10.3.2
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 10.3.2
41
+ description: rails hook that allows one to handle request parameter parsing exceptions
42
+ (e.g. invalid JSON) with a rescue block
43
+ email:
44
+ - self@kares.org
51
45
  executables: []
52
-
53
46
  extensions: []
54
-
55
- extra_rdoc_files:
56
- - README.md
57
- files:
58
- - lib/request_exception_handler.rb
59
- - LICENSE
60
- - README.md
61
- - Rakefile
62
- - test/test_helper.rb
63
- - test/request_exception_handler_test.rb
47
+ extra_rdoc_files:
48
+ - README.md
49
+ files:
50
+ - LICENSE
51
+ - README.md
52
+ - Rakefile
53
+ - lib/request_exception_handler.rb
54
+ - test/_test-unit-rails4.rb
55
+ - test/request_exception_handler_test.rb
56
+ - test/test_helper.rb
64
57
  homepage: http://github.com/kares/request_exception_handler
65
- licenses: []
66
-
58
+ licenses:
59
+ - Apache-2.0
60
+ metadata: {}
67
61
  post_install_message:
68
62
  rdoc_options: []
69
-
70
- require_paths:
71
- - lib
72
- required_ruby_version: !ruby/object:Gem::Requirement
73
- none: false
74
- requirements:
75
- - - ">="
76
- - !ruby/object:Gem::Version
77
- hash: 2
78
- segments:
79
- - 0
80
- version: "0"
81
- required_rubygems_version: !ruby/object:Gem::Requirement
82
- none: false
83
- requirements:
84
- - - ">="
85
- - !ruby/object:Gem::Version
86
- hash: 2
87
- segments:
88
- - 0
89
- version: "0"
63
+ require_paths:
64
+ - lib
65
+ required_ruby_version: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ required_rubygems_version: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
90
75
  requirements: []
91
-
92
76
  rubyforge_project: "[none]"
93
- rubygems_version: 1.8.24
77
+ rubygems_version: 2.2.2
94
78
  signing_key:
95
- specification_version: 3
96
- summary: handler for all request (parsing) related exceptions
97
- test_files:
98
- - test/test_helper.rb
99
- - test/request_exception_handler_test.rb
79
+ specification_version: 4
80
+ summary: a handler for all request (parsing) related exceptions
81
+ test_files:
82
+ - test/test_helper.rb
83
+ - test/_test-unit-rails4.rb
84
+ - test/request_exception_handler_test.rb