grape-middleware-logger 0.1.2 → 1.0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e9616608e69e843ba20b98bda30778c2f4792186
4
- data.tar.gz: 75817806ea070bb0dcaa427ee7a2fb3b5a80756a
3
+ metadata.gz: 4547077b8d2d510b968f5929a6a5a363dd923c96
4
+ data.tar.gz: d0ef665c52d56e8381b258e3dea232c20e53bd6c
5
5
  SHA512:
6
- metadata.gz: c652ab2e7596af5d282579c981711e92d348f6f43e18c4c107605b5bf03d8dffd31b049a90785377c8ef41cf4da292e278ab436fbc4ddf9db0ee2248d7687338
7
- data.tar.gz: 2a02914324c3475a7e26f1e2b398adc1254dfd67edcba4c39fca01801e6a82d1190768877bd0252bc0ff3d0d55237b4ee8824c1c63235439fe627bb207576612
6
+ metadata.gz: 3fe36c90107dfd40ed7b52c145a68646c0ccfbc5b5833cdc16c6318f13016def891f4935f7b4e4bde2ef93fad89fb469c4f89e1e79a1e901ddec3cc817e3bf74
7
+ data.tar.gz: 9e158043f094a7c41eb3e7721d25c6487f0f1538587b5508150d9a920d85dc7743c30481348977ff51b99f4db206d66662c2f93e77efd21cc43b3cc5729e4f54
data/.gitignore CHANGED
@@ -13,3 +13,5 @@
13
13
  *.a
14
14
  mkmf.log
15
15
  *.gem
16
+ .ruby-version
17
+ .ruby-gemset
data/README.md CHANGED
@@ -1,36 +1,48 @@
1
1
  # Grape::Middleware::Logger
2
+ [![Code Climate](https://codeclimate.com/github/ridiculous/grape-middleware-logger/badges/gpa.svg)](https://codeclimate.com/github/ridiculous/grape-middleware-logger) [![Gem Version](https://badge.fury.io/rb/grape-middleware-logger.svg)](http://badge.fury.io/rb/grape-middleware-logger)
2
3
 
3
- Works if you're running directly off Grape master. Otherwise, you'll have to wait for the release of Grape v0.12.0
4
+ Simple logger for Grape apps. Logs request path, parameters, status and time taken. Also logs exceptions and error responses (thrown by `error!`).
4
5
 
5
6
  ## Installation
6
7
 
7
8
  Add this line to your application's Gemfile:
8
9
 
9
10
  ```ruby
11
+ gem 'grape', '>= 0.12.0'
10
12
  gem 'grape-middleware-logger'
11
13
  ```
12
14
 
13
- And then execute:
14
-
15
- $ bundle
15
+ ## Usage
16
+ ```ruby
17
+ class API < Grape::API
18
+ use Grape::Middleware::Logger
19
+ end
20
+ ```
21
+ Using Grape with Rails or want to customize the logging? You can provide a `logger` option, which just has to respond to `.info(msg)`. Example Rails logging and parameter sanitization:
22
+ ```ruby
23
+ use Grape::Middleware::Logger, {
24
+ logger: Rails.logger,
25
+ filter: ActionDispatch::Http::ParameterFilter.new(Rails.application.config.filter_parameters)
26
+ }
27
+ ```
16
28
 
17
- Or install it yourself as:
29
+ The `filter` option can be any object that responds to `.filter(params_hash)`
18
30
 
19
- $ gem install grape-middleware-logger
31
+ ## Example output
32
+ Get
33
+ ```
34
+ Started GET "/v1/reports/101"
35
+ Parameters: {"id"=>"101"}
36
+ Completed 200 in 6.29ms
37
+ ```
38
+ Error
39
+ ```
40
+ Started GET "/v1/reports/101"
41
+ Parameters: {"id"=>"101"}
42
+ Error: {:error=>"undefined something something bad", :detail=>"Whoops"}
43
+ Completed 422 in 6.29ms
44
+ ```
20
45
 
21
- ## Usage
22
-
23
- class API < Grape::API
24
- use Grape::Middleware::Logger
25
- end
26
-
27
- Using Grape with Rails? Add consistent logging and param filtering with
28
-
29
- use Grape::Middleware::Logger, {
30
- logger: Rails.logger,
31
- filter: ActionDispatch::Http::ParameterFilter.new(Rails.application.config.filter_parameters)
32
- }
33
-
34
46
  ## Credits
35
47
 
36
48
  Big thanks to jadent's question/answer on [stackoverflow](http://stackoverflow.com/questions/25048163/grape-using-error-and-grapemiddleware-after-callback)
@@ -9,8 +9,8 @@ Gem::Specification.new do |spec|
9
9
  spec.platform = Gem::Platform::RUBY
10
10
  spec.authors = ['Ryan Buckley']
11
11
  spec.email = ['arebuckley@gmail.com']
12
- spec.summary = %q{Logging middleware for Grape apps}
13
- spec.description = %q{Logging middleware for Grape apps, similar to what Rails offers}
12
+ spec.summary = %q{A logger for the Grape framework}
13
+ spec.description = %q{Logging middleware for the Grape framework, similar to what Rails offers}
14
14
  spec.homepage = ''
15
15
  spec.license = 'MIT'
16
16
 
@@ -19,9 +19,9 @@ Gem::Specification.new do |spec|
19
19
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
20
  spec.require_paths = ['lib']
21
21
 
22
- spec.add_dependency 'grape'
22
+ spec.add_dependency 'grape', '>= 0.12', '< 1'
23
23
 
24
24
  spec.add_development_dependency 'bundler', '~> 1.7'
25
25
  spec.add_development_dependency 'rake', '~> 10.0'
26
- spec.add_development_dependency 'rspec', '>= 3.0'
26
+ spec.add_development_dependency 'rspec', '>= 3.2', '< 4'
27
27
  end
@@ -1,5 +1,5 @@
1
1
  require 'logger'
2
- require 'grape/middleware/globals'
2
+ require 'grape'
3
3
 
4
4
  # avoid superclass mismatch when version file gets loaded first
5
5
  Grape::Middleware.send :remove_const, :Logger if defined? Grape::Middleware::Logger
@@ -9,21 +9,32 @@ module Grape
9
9
 
10
10
  def before
11
11
  start_time
12
- super
12
+ super # sets env['grape.*']
13
13
  logger.info ''
14
14
  logger.info %Q(Started #{env['grape.request'].request_method} "#{env['grape.request'].path}")
15
15
  logger.info %Q( Parameters: #{parameters})
16
16
  end
17
17
 
18
+ # @note Error and exception handling are required for the +after+ hooks
19
+ # Exceptions are logged as a 500 status and re-raised
20
+ # Other "errors" are caught, logged and re-thrown
18
21
  def call!(env)
19
22
  @env = env
20
23
  before
21
- error = catch(:error) { @app_response = @app.call(@env); nil }
24
+ error = catch(:error) do
25
+ begin
26
+ @app_response = @app.call(@env)
27
+ rescue => e
28
+ after_exception(e)
29
+ raise e
30
+ end
31
+ nil
32
+ end
22
33
  if error
23
34
  after_failure(error)
24
35
  throw(:error, error)
25
36
  else
26
- after(@app_response.first)
37
+ after(@app_response.status)
27
38
  end
28
39
  @app_response
29
40
  end
@@ -37,6 +48,11 @@ module Grape
37
48
  # Helpers
38
49
  #
39
50
 
51
+ def after_exception(e)
52
+ logger.info %Q( Error: #{e.message})
53
+ after(500)
54
+ end
55
+
40
56
  def after_failure(error)
41
57
  logger.info %Q( Error: #{error[:message]}) if error[:message]
42
58
  after(error[:status])
@@ -44,7 +60,7 @@ module Grape
44
60
 
45
61
  def parameters
46
62
  request_params = env['grape.request.params'].to_hash
47
- request_params.merge!(env['action_dispatch.request.request_parameters'] || {})
63
+ request_params.merge!(env['action_dispatch.request.request_parameters'] || {}) # for Rails
48
64
  if @options[:filter]
49
65
  @options[:filter].filter(request_params)
50
66
  else
@@ -1,7 +1,7 @@
1
1
  module Grape
2
2
  module Middleware
3
3
  class Logger
4
- VERSION = '0.1.2'
4
+ VERSION = '1.0.0'
5
5
  end
6
6
  end
7
7
  end
@@ -7,21 +7,19 @@ describe Grape::Middleware::Logger do
7
7
 
8
8
  subject { described_class.new(app, options) }
9
9
 
10
- let(:app_response) { [200, {}, 'Hello World'] }
10
+ let(:app_response) { Rack::Response.new 'Hello World', 200, {} }
11
+ let(:grape_request) { OpenStruct.new(request_method: 'POST', path: '/api/1.0/users', headers: {}, params: { 'id' => '101001' }) }
11
12
  let(:env) {
12
13
  {
13
- 'grape.request' => OpenStruct.new(request_method: 'POST', path: '/api/1.0/users'),
14
- 'grape.request.params' => {
15
- 'id' => '101001'
16
- },
14
+ 'grape.request' => grape_request,
15
+ 'grape.request.params' => grape_request.params,
17
16
  'action_dispatch.request.request_parameters' => {
18
17
  'name' => 'foo',
19
18
  'password' => 'access'
20
- }
19
+ },
20
+ 'rack.input' => OpenStruct.new
21
21
  }
22
22
  }
23
- # @todo remove when Grape v0.12.0 is released
24
- before(:each) { allow(subject).to receive(:before) }
25
23
 
26
24
  describe '#call!' do
27
25
  context 'when calling the app results in an error response' do
@@ -51,18 +49,6 @@ describe Grape::Middleware::Logger do
51
49
  expect(subject.call!(env)).to eq app_response
52
50
  end
53
51
  end
54
-
55
- describe 'integration' do
56
- it 'properly logs requests', pending: 'Grape v0.12.0' do
57
- expect(app).to receive(:call).with(env).and_return(app_response)
58
- expect(subject.logger).to receive(:info).with('')
59
- expect(subject.logger).to receive(:info).with(%Q(Started POST "/api/1.0/users"))
60
- expect(subject.logger).to receive(:info).with(%Q( Parameters: {"id"=>"101001", "name"=>"foo", "password"=>"[FILTERED]"}))
61
- expect(subject.logger).to receive(:info).with(/Completed 200 in \d.\d+ms/)
62
- expect(subject.logger).to receive(:info).with('')
63
- subject.call!(env)
64
- end
65
- end
66
52
  end
67
53
 
68
54
  describe '#after_failure' do
@@ -123,6 +109,19 @@ describe Grape::Middleware::Logger do
123
109
  end
124
110
  end
125
111
 
112
+ describe 'integration' do
113
+ it 'properly logs requests' do
114
+ expect(app).to receive(:call).with(env).and_return(app_response)
115
+ expect(Grape::Request).to receive(:new).and_return(grape_request)
116
+ expect(subject.logger).to receive(:info).with('')
117
+ expect(subject.logger).to receive(:info).with(%Q(Started POST "/api/1.0/users"))
118
+ expect(subject.logger).to receive(:info).with(%Q( Parameters: {"id"=>"101001", "name"=>"foo", "password"=>"[FILTERED]"}))
119
+ expect(subject.logger).to receive(:info).with(/Completed 200 in \d.\d+ms/)
120
+ expect(subject.logger).to receive(:info).with('')
121
+ subject.call!(env)
122
+ end
123
+ end
124
+
126
125
  #
127
126
  # Test class
128
127
  #
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: grape-middleware-logger
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Buckley
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-05-08 00:00:00.000000000 Z
11
+ date: 2015-07-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: grape
@@ -16,14 +16,20 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: '0.12'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '1'
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
27
  - - ">="
25
28
  - !ruby/object:Gem::Version
26
- version: '0'
29
+ version: '0.12'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '1'
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: bundler
29
35
  requirement: !ruby/object:Gem::Requirement
@@ -58,15 +64,21 @@ dependencies:
58
64
  requirements:
59
65
  - - ">="
60
66
  - !ruby/object:Gem::Version
61
- version: '3.0'
67
+ version: '3.2'
68
+ - - "<"
69
+ - !ruby/object:Gem::Version
70
+ version: '4'
62
71
  type: :development
63
72
  prerelease: false
64
73
  version_requirements: !ruby/object:Gem::Requirement
65
74
  requirements:
66
75
  - - ">="
67
76
  - !ruby/object:Gem::Version
68
- version: '3.0'
69
- description: Logging middleware for Grape apps, similar to what Rails offers
77
+ version: '3.2'
78
+ - - "<"
79
+ - !ruby/object:Gem::Version
80
+ version: '4'
81
+ description: Logging middleware for the Grape framework, similar to what Rails offers
70
82
  email:
71
83
  - arebuckley@gmail.com
72
84
  executables: []
@@ -74,8 +86,6 @@ extensions: []
74
86
  extra_rdoc_files: []
75
87
  files:
76
88
  - ".gitignore"
77
- - ".ruby-gemset"
78
- - ".ruby-version"
79
89
  - Gemfile
80
90
  - LICENSE.txt
81
91
  - README.md
@@ -108,7 +118,7 @@ rubyforge_project:
108
118
  rubygems_version: 2.4.3
109
119
  signing_key:
110
120
  specification_version: 4
111
- summary: Logging middleware for Grape apps
121
+ summary: A logger for the Grape framework
112
122
  test_files:
113
123
  - spec/lib/grape/middleware/logger_spec.rb
114
124
  - spec/spec_helper.rb
data/.ruby-gemset DELETED
@@ -1 +0,0 @@
1
- grape-middleware-logger
data/.ruby-version DELETED
@@ -1 +0,0 @@
1
- ruby-2.1.5