gris 0.5.2 → 0.5.3

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: 52bcd59c303ceabf2a94e804e7ba70de117fdec6
4
- data.tar.gz: 2d2445908532e655da55c60d1417b5f2b290751e
3
+ metadata.gz: ba36f4e2e607cba06f2812fa378d65f8757f158f
4
+ data.tar.gz: a69a898390400d437e5c96d5b486835ce3e94b75
5
5
  SHA512:
6
- metadata.gz: 9efbb2afac85185af3d3e2922230a87d43122deec3dbbc0a18afd6cfc1117fb23696e3e49dc40aa35feede2c4ea5f4faf5c9928688fdf8888b587fc0aac67e00
7
- data.tar.gz: f18acc03a113e6443ebf95ec31b828cde16a3d2b4b87a03454f1001d174593ca1cdea9083e46eff0c7f5c233f6bfc75b62c26b4daa215d6c4f1fa95ba5d3b37b
6
+ metadata.gz: a99a3dbf8338aeb8a3897c468e7f800c08d83fbb7ee638f9e730634579bf04b6e42a9753f0ec3fc05b8e5f54e14457c0c084ca8413d62f9d120eae0c887401e9
7
+ data.tar.gz: 6c367e60923c73d404b0ff51238bf30c5367c35f2c75efc0443b7d79f7d8f00472555262d0c56cb25e75ded3c15b7f39c8e59d920fb8109ceeab6039d709f5b2
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- gris (0.5.2)
4
+ gris (0.5.3)
5
5
  activesupport (~> 4.2, >= 4.2.0)
6
6
  chronic (~> 0.10.0)
7
7
  dalli (~> 2.7)
@@ -18,6 +18,7 @@ require 'gris/grape_extensions/date_time_helpers'
18
18
  require 'gris/grape_extensions/error_helpers'
19
19
  require 'gris/identity'
20
20
  require 'gris/middleware/health'
21
+ require 'gris/middleware/error_handlers'
21
22
  require 'gris/output_formatters/paginated_presenter'
22
23
  require 'gris/output_formatters/presenter'
23
24
  require 'gris/output_formatters/presenter_link_helpers'
@@ -4,10 +4,13 @@ module Gris
4
4
  class Application
5
5
  include ActiveSupport::Configurable
6
6
  config_accessor :use_health_middleware
7
+ config_accessor :use_error_handlers_middleware
7
8
 
8
9
  def self.instance(config = {})
9
10
  @instance ||= Rack::Builder.new do
10
11
  use Gris::Middleware::Health unless config[:use_health_middleware] == false
12
+ use Gris::Middleware::ErrorHandlers unless config[:use_error_handlers_middleware] == false
13
+
11
14
  use Rack::Cors do
12
15
  allow do
13
16
  origins '*'
@@ -19,14 +22,7 @@ module Gris
19
22
  end
20
23
 
21
24
  def call(env)
22
- response = ApplicationEndpoint.call(env)
23
- case response[0]
24
- when 404, 500
25
- body = { code: response[0], message: response[2] }.to_json
26
- [response[0], response[1], [body]]
27
- else
28
- response
29
- end
25
+ ApplicationEndpoint.call(env)
30
26
  end
31
27
  end
32
28
  end
@@ -9,7 +9,8 @@ ActiveSupport::Dependencies.autoload_paths += relative_load_paths
9
9
 
10
10
  module <%= app_name.classify %>
11
11
  class Application < Gris::Application
12
- # config.use_health_middleware = false
12
+ config.use_error_handlers_middleware = true
13
+ config.use_health_middleware = true
13
14
 
14
15
  def self.instance(*)
15
16
  super(config)
@@ -1,8 +1,8 @@
1
1
  module Gris
2
2
  module ErrorHelpers
3
- def error!(message, status, options = nil)
4
- message = { error: message }.merge(options.is_a?(String) ? { text: options } : options) if options
5
- throw :error, message: message, status: status
3
+ def gris_error!(message, status)
4
+ response = { status: status, message: message }
5
+ throw :error, message: response, status: status
6
6
  end
7
7
 
8
8
  Grape::Endpoint.send :include, self if defined?(Grape)
@@ -0,0 +1,40 @@
1
+ module Gris
2
+ class Middleware
3
+ class ErrorHandlers
4
+ def initialize(app)
5
+ @app = app
6
+ end
7
+
8
+ def call(env)
9
+ response = @app.call env
10
+ case response[0]
11
+ when 400..500
12
+ format_error_response response
13
+ else
14
+ response
15
+ end
16
+ rescue RuntimeError => e
17
+ error = { status: 500, message: e.message }
18
+ error_response(error.to_json, 500)
19
+ rescue ::ActiveRecord::RecordNotFound => e
20
+ error = { status: 404, message: e.message }
21
+ error_response(error.to_json, 404)
22
+ end
23
+
24
+ private
25
+
26
+ def format_error_response(response)
27
+ if response[2].respond_to? :body
28
+ response
29
+ else
30
+ error = { status: response[0], message: response[2] }
31
+ error_response(error.to_json, response[0], response[1])
32
+ end
33
+ end
34
+
35
+ def error_response(message, status, headers = {})
36
+ Rack::Response.new([message], status, headers).finish
37
+ end
38
+ end
39
+ end
40
+ end
@@ -1,5 +1,5 @@
1
1
  module Gris
2
- VERSION = '0.5.2'
2
+ VERSION = '0.5.3'
3
3
 
4
4
  class Version
5
5
  class << self
@@ -72,6 +72,10 @@ describe Gris::Generators::ScaffoldGenerator do
72
72
  'ActiveSupport::Dependencies.autoload_paths += relative_load_paths'
73
73
  )
74
74
  end
75
+ it 'includes optional middleware configs' do
76
+ expect(config_application_file).to include('config.use_error_handlers_middleware = true')
77
+ expect(config_application_file).to include('config.use_health_middleware = true')
78
+ end
75
79
  end
76
80
 
77
81
  it 'generates an application endpoint' do
@@ -4,15 +4,12 @@ describe Gris::ErrorHelpers do
4
4
  before do
5
5
  @helper = SpecApiErrorHelper.new
6
6
  end
7
- context 'error with text' do
8
- it 'does not wrap a grape error without text' do
9
- @helper.error!('error', 400)
10
- expect(@helper.message).to eq(message: 'error', status: 400)
11
- expect(@helper.thrown).to eq(:error)
12
- end
13
- it 'wraps a grape error with text' do
14
- @helper.error!('error', 400, 'text')
15
- expect(@helper.message).to eq(message: { error: 'error', text: 'text' }, status: 400)
7
+
8
+ context 'gris_error!' do
9
+ it 'returns a correctly formatted error message' do
10
+ @helper.gris_error! 'error', 400
11
+ expect(@helper.message)
12
+ .to eq(message: { message: 'error', status: 400 }, status: 400)
16
13
  expect(@helper.thrown).to eq(:error)
17
14
  end
18
15
  end
@@ -8,7 +8,7 @@ describe 'application error response' do
8
8
  request = Faraday.get "http://localhost:#{app_port}/bogus"
9
9
  response = JSON.parse request.body
10
10
  expect(request.status).to eq 404
11
- expect(response['code']).to eq 404
11
+ expect(response['status']).to eq 404
12
12
  expect(response['message']).to eq ['Not Found']
13
13
  end
14
14
  end
@@ -0,0 +1,72 @@
1
+ require 'spec_helper'
2
+
3
+ describe Gris::Middleware::ErrorHandlers do
4
+ include Rack::Test::Methods
5
+ describe 'errors' do
6
+ subject { Class.new(Grape::API) }
7
+
8
+ let(:app) { subject }
9
+
10
+ let(:fake_active_record) do
11
+ module ActiveRecord
12
+ class RecordNotFound < StandardError
13
+ end
14
+ end
15
+ end
16
+
17
+ before do
18
+ subject.format :json
19
+ subject.use Gris::Middleware::ErrorHandlers
20
+
21
+ subject.get :generic_error do
22
+ fail 'api error'
23
+ end
24
+
25
+ subject.get :gris_error do
26
+ gris_error! 'Forbidden', 401
27
+ end
28
+
29
+ subject.get :error do
30
+ error! 'Forbidden', 401
31
+ end
32
+
33
+ subject.get :activerecord_error do
34
+ fail ActiveRecord::RecordNotFound
35
+ end
36
+ end
37
+
38
+ it 'retuns a Not Found error for missing routes' do
39
+ get '/bogus'
40
+ expect(response_code).to eq 404
41
+ expect(response_body).to eq 'Not Found'
42
+ end
43
+
44
+ it 'returns a formatted message for gris_error!' do
45
+ get '/gris_error'
46
+ expect(response_code).to eq 401
47
+ expect(parsed_response_body['status']).to eq 401
48
+ expect(parsed_response_body['message']).to eq 'Forbidden'
49
+ end
50
+
51
+ it 'returns a formatted message for error!' do
52
+ get '/error'
53
+ expect(response_code).to eq 401
54
+ expect(parsed_response_body['error']).to eq 'Forbidden'
55
+ end
56
+
57
+ it 'returns a formatted message for ActiveRecord::RecordNotFound' do
58
+ fake_active_record
59
+ get '/activerecord_error'
60
+ expect(response_code).to eq 404
61
+ expect(parsed_response_body['status']).to eq 404
62
+ expect(parsed_response_body['message']).to eq 'ActiveRecord::RecordNotFound'
63
+ end
64
+
65
+ it 'returns a formatted message when an exception is raised' do
66
+ get '/generic_error'
67
+ expect(response_code).to eq 500
68
+ expect(parsed_response_body['status']).to eq 500
69
+ expect(parsed_response_body['message']).to eq 'api error'
70
+ end
71
+ end
72
+ end
@@ -6,7 +6,12 @@ require 'gris'
6
6
  require 'gris/cli'
7
7
  require 'rack/test'
8
8
  require 'fakefs/spec_helpers'
9
+ require 'gris/rspec_extensions/response_helpers'
9
10
 
10
11
  # Requires supporting ruby files with custom matchers and macros, etc,
11
12
  # in spec/support/ and its subdirectories.
12
13
  Dir['./spec/support/**/*.rb'].sort.each { |f| require f }
14
+
15
+ RSpec.configure do |config|
16
+ config.include Gris::RspecExtensions::ResponseHelpers
17
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gris
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.2
4
+ version: 0.5.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dylan Fareed
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-09-03 00:00:00.000000000 Z
11
+ date: 2015-09-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -369,6 +369,7 @@ files:
369
369
  - lib/gris/grape_extensions/date_time_helpers.rb
370
370
  - lib/gris/grape_extensions/error_helpers.rb
371
371
  - lib/gris/identity.rb
372
+ - lib/gris/middleware/error_handlers.rb
372
373
  - lib/gris/middleware/health.rb
373
374
  - lib/gris/output_formatters/paginated_presenter.rb
374
375
  - lib/gris/output_formatters/presenter.rb
@@ -390,6 +391,7 @@ files:
390
391
  - spec/grape_extensions/error_helpers_spec.rb
391
392
  - spec/identity_spec.rb
392
393
  - spec/integration/application_error_response_spec.rb
394
+ - spec/middleware/error_handlers_spec.rb
393
395
  - spec/output_formatters/presenter_link_helpers_spec.rb
394
396
  - spec/secrets_spec.rb
395
397
  - spec/spec_helper.rb
@@ -436,6 +438,7 @@ test_files:
436
438
  - spec/grape_extensions/error_helpers_spec.rb
437
439
  - spec/identity_spec.rb
438
440
  - spec/integration/application_error_response_spec.rb
441
+ - spec/middleware/error_handlers_spec.rb
439
442
  - spec/output_formatters/presenter_link_helpers_spec.rb
440
443
  - spec/secrets_spec.rb
441
444
  - spec/spec_helper.rb