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 +4 -4
- data/.gitignore +2 -0
- data/README.md +31 -19
- data/grape-middleware-logger.gemspec +4 -4
- data/lib/grape/middleware/logger.rb +21 -5
- data/lib/grape/middleware/logger/version.rb +1 -1
- data/spec/lib/grape/middleware/logger_spec.rb +19 -20
- metadata +20 -10
- data/.ruby-gemset +0 -1
- data/.ruby-version +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4547077b8d2d510b968f5929a6a5a363dd923c96
|
4
|
+
data.tar.gz: d0ef665c52d56e8381b258e3dea232c20e53bd6c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3fe36c90107dfd40ed7b52c145a68646c0ccfbc5b5833cdc16c6318f13016def891f4935f7b4e4bde2ef93fad89fb469c4f89e1e79a1e901ddec3cc817e3bf74
|
7
|
+
data.tar.gz: 9e158043f094a7c41eb3e7721d25c6487f0f1538587b5508150d9a920d85dc7743c30481348977ff51b99f4db206d66662c2f93e77efd21cc43b3cc5729e4f54
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -1,36 +1,48 @@
|
|
1
1
|
# Grape::Middleware::Logger
|
2
|
+
[](https://codeclimate.com/github/ridiculous/grape-middleware-logger) [](http://badge.fury.io/rb/grape-middleware-logger)
|
2
3
|
|
3
|
-
|
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
|
-
|
14
|
-
|
15
|
-
|
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
|
-
|
29
|
+
The `filter` option can be any object that responds to `.filter(params_hash)`
|
18
30
|
|
19
|
-
|
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{
|
13
|
-
spec.description = %q{Logging middleware for Grape
|
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.
|
26
|
+
spec.add_development_dependency 'rspec', '>= 3.2', '< 4'
|
27
27
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'logger'
|
2
|
-
require 'grape
|
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)
|
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.
|
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
|
@@ -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) {
|
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' =>
|
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.
|
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-
|
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.
|
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.
|
69
|
-
|
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:
|
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
|