grape-middleware-logger 1.5.1 → 1.6.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: efcf5674de9e8fcbcce7aebfda90fa8231e35475
4
- data.tar.gz: 856cc2ebb17f174185c02103200457da79841acc
3
+ metadata.gz: 34d9661cdf4110b925306cef1ca08daa1de0984b
4
+ data.tar.gz: 30a697f95684f81f84a1ab8d99b91d90730dd3ab
5
5
  SHA512:
6
- metadata.gz: 98ad10db03c07d57c1264d06fbb3cb54ab312746998873ae1e0b3aa9c73d7e503ca2a5d252d78a5d685bc08f75819c80c8b0a2192541e53b97db083b483b6df8
7
- data.tar.gz: 0e1975f5d77664c5cfa05d73d74d45fbf4c4daab48af8c2de17eff7ca51c1744933ff3048121537cb978476cb6dfc1029202fcd982d1b957a5399243c0374ad2
6
+ metadata.gz: 0efea695b1be2caaf8bc63b104abc6a57240b7504d2a05bf5d15449b925feb96a5c2bcb02764979889e320391de53336af8ecfd5f107ded7663e3efccd1203ff
7
+ data.tar.gz: c2ab1a0ee0cb763d903b4a7b54a8f9368e8b2ab0b326a68a8d905cdfc873b9aced8239487b9abbcf2c697d7cb6289927ce33b8ac255d41570b2a9ef9fad27d67
data/.travis.yml CHANGED
@@ -1,9 +1,9 @@
1
1
  language: ruby
2
2
  rvm:
3
3
  - 1.9.3
4
- - 2.2.1
5
- - 2.2.2
6
- - 2.2.3
7
- before_install: gem install bundler -v 1.10.5
8
- script:
9
- - bin/test
4
+ - 2.1.5
5
+ - 2.2.4
6
+ - 2.3.0
7
+ before_install:
8
+ - gem install bundler -v 1.10.5
9
+ - gem install mime-types -v 2.6.2
data/README.md CHANGED
@@ -1,8 +1,15 @@
1
- # Grape::Middleware::Logger
1
+ # A logger for Grape apps
2
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)
3
3
  [![Build Status](https://travis-ci.org/ridiculous/grape-middleware-logger.svg)](https://travis-ci.org/ridiculous/grape-middleware-logger)
4
4
 
5
- Simple logger for Grape apps. Logs request path, parameters, status and time taken. Also logs exceptions and error responses (thrown by `error!`).
5
+ Logs:
6
+ * Request path
7
+ * Parameters
8
+ * Endpoint class name and handler
9
+ * Response status
10
+ * Duration of the request
11
+ * Exceptions
12
+ * Error responses from `error!`
6
13
 
7
14
  ## Installation
8
15
 
@@ -23,35 +30,30 @@ end
23
30
 
24
31
  Server requests will be logged to STDOUT by default.
25
32
 
26
- ## Custom setup
27
- Customize the logging by passing the `logger` option. Example using a CustomLogger and parameter sanitization:
28
- ```ruby
29
- use Grape::Middleware::Logger, {
30
- logger: CustomLogger.new,
31
- filter: CustomFilter.new
32
- }
33
- ```
34
- The `logger` option can be any object that responds to `.info(msg)`
35
-
36
- The `filter` option can be any object that responds to `.filter(params_hash)`
37
-
38
33
  ## Example output
39
34
  Get
40
35
  ```
41
36
  Started GET "/v1/reports/101" at 2015-12-11 15:40:51 -0800
42
- Processing by ReportsAPI#reports/:id
37
+ Processing by ReportsAPI/reports/:id
43
38
  Parameters: {"id"=>"101"}
44
39
  Completed 200 in 6.29ms
45
40
  ```
46
41
  Error
47
42
  ```
48
43
  Started POST "/v1/reports" at 2015-12-11 15:42:33 -0800
49
- Processing by ReportsAPI#reports
44
+ Processing by ReportsAPI/reports
50
45
  Parameters: {"name"=>"foo", "password"=>"[FILTERED]"}
51
46
  Error: {:error=>"undefined something something bad", :detail=>"Whoops"}
52
47
  Completed 422 in 6.29ms
53
48
  ```
54
49
 
50
+ ## Customization
51
+
52
+ The middleware logger can be customized with the following options:
53
+
54
+ * The `:logger` option can be any object that responds to `.info(String)`
55
+ * The `:filter` option can be any object that responds to `.filter(Hash)` and returns a hash.
56
+
55
57
  ## Using Rails?
56
58
  `Rails.logger` and `Rails.application.config.filter_parameters` will be used automatically as the default logger and
57
59
  param filterer, respectively.
@@ -93,7 +95,6 @@ and would love to see these two consolidated at some point.
93
95
  ## Contributing
94
96
 
95
97
  1. Fork it ( https://github.com/ridiculous/grape-middleware-logger/fork )
96
- 1. Run the test suite with `bin/test`
97
98
  2. Create your feature branch (`git checkout -b my-new-feature`)
98
99
  3. Commit your changes (`git commit -am 'Add some feature'`)
99
100
  4. Push to the branch (`git push origin my-new-feature`)
data/Rakefile CHANGED
@@ -1,3 +1,15 @@
1
1
  require 'rspec/core/rake_task'
2
- RSpec::Core::RakeTask.new(:spec)
3
- task default: :spec
2
+
3
+ RSpec::Core::RakeTask.new(:spec) do |config|
4
+ config.pattern = 'spec/lib/**/*_spec.rb'
5
+ end
6
+
7
+ RSpec::Core::RakeTask.new(:integration) do |config|
8
+ config.pattern = 'spec/integration/**/*_spec.rb'
9
+ end
10
+
11
+ RSpec::Core::RakeTask.new(:integration_rails) do |config|
12
+ config.pattern = 'spec/integration_rails/**/*_spec.rb'
13
+ end
14
+
15
+ task default: [:spec, :integration, :integration_rails]
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |spec|
4
4
  spec.name = 'grape-middleware-logger'
5
- spec.version = '1.5.1'
5
+ spec.version = '1.6.0'
6
6
  spec.platform = Gem::Platform::RUBY
7
7
  spec.authors = ['Ryan Buckley']
8
8
  spec.email = ['arebuckley@gmail.com']
@@ -19,6 +19,7 @@ Gem::Specification.new do |spec|
19
19
  spec.add_dependency 'grape', '>= 0.14', '< 1'
20
20
 
21
21
  spec.add_development_dependency 'bundler', '~> 1.7'
22
+ spec.add_development_dependency 'mime-types', '~> 2'
22
23
  spec.add_development_dependency 'rake', '~> 10.0'
23
24
  spec.add_development_dependency 'rspec', '>= 3.2', '< 4'
24
25
  end
@@ -7,7 +7,7 @@ class Grape::Middleware::Logger < Grape::Middleware::Globals
7
7
  attr_reader :logger
8
8
 
9
9
  class << self
10
- attr_accessor :logger, :filter
10
+ attr_accessor :logger, :filter, :on_parameters
11
11
 
12
12
  def default_logger
13
13
  default = Logger.new(STDOUT)
@@ -82,7 +82,12 @@ class Grape::Middleware::Logger < Grape::Middleware::Globals
82
82
 
83
83
  def parameters
84
84
  request_params = env[Grape::Env::GRAPE_REQUEST_PARAMS].to_hash
85
- request_params.merge!(env['action_dispatch.request.request_parameters'.freeze] || {}) # for Rails
85
+ formatter = Grape::Middleware::Formatter.new(app)
86
+ formatter.instance_variable_set :@env, env
87
+ # @note parses and assigns params to @env[Grape::Env::RACK_REQUEST_FORM_HASH]
88
+ formatter.before
89
+ request_params.merge! env[Grape::Env::RACK_REQUEST_FORM_HASH] if env[Grape::Env::RACK_REQUEST_FORM_HASH]
90
+ request_params.merge! env['action_dispatch.request.request_parameters'] if env['action_dispatch.request.request_parameters']
86
91
  if @options[:filter]
87
92
  @options[:filter].filter(request_params)
88
93
  else
@@ -96,8 +101,23 @@ class Grape::Middleware::Logger < Grape::Middleware::Globals
96
101
 
97
102
  def processed_by
98
103
  endpoint = env[Grape::Env::API_ENDPOINT]
99
- endpoint.options[:for].to_s << '#'.freeze << endpoint.options[:path].map { |path| path.to_s.sub(BACKSLASH, '') }.join(BACKSLASH)
104
+ result = []
105
+ if endpoint.namespace == BACKSLASH
106
+ result << ''
107
+ else
108
+ result << endpoint.namespace
109
+ end
110
+ result.concat endpoint.options[:path].map { |path| path.to_s.sub(BACKSLASH, '') }
111
+ endpoint.options[:for].to_s << result.join(BACKSLASH)
100
112
  end
101
113
  end
102
114
 
103
- require_relative 'logger/railtie' if defined?(Rails)
115
+ # @description Override formatter #before so we don't read and parse the env['rack.input'] value twice
116
+ Grape::Middleware::Formatter.send :define_method, :before do
117
+ negotiate_content_type
118
+ read_body_input unless env.key? Grape::Env::RACK_REQUEST_FORM_HASH
119
+ end
120
+
121
+ if defined?(Rails)
122
+ require_relative 'logger/railtie'
123
+ end
data/spec/factories.rb CHANGED
@@ -1,11 +1,13 @@
1
1
  FactoryGirl.define do
2
2
  class ExpectedEnv < Hash
3
- attr_accessor :grape_request, :params, :post_params, :grape_endpoint
3
+ attr_accessor :grape_request, :params, :post_params, :rails_post_params, :grape_endpoint
4
4
  end
5
5
 
6
6
  class ParamFilter
7
+ attr_accessor :list
8
+
7
9
  def filter(opts)
8
- opts.each_pair { |key, val| val[0..-1] = '[FILTERED]' if key == 'password' }
10
+ opts.each_pair { |key, val| val[0..-1] = '[FILTERED]' if list.include?(key) }
9
11
  end
10
12
  end
11
13
 
@@ -20,23 +22,27 @@ FactoryGirl.define do
20
22
  end
21
23
  end
22
24
 
23
- factory :param_filter
25
+ factory :param_filter do
26
+ list %w[password secret]
27
+ end
24
28
 
25
29
  require 'rack/rewindable_input'
26
30
 
27
31
  factory :expected_env do
28
32
  grape_request { build :grape_request }
29
- params { grape_request.params }
30
- post_params { { 'name' => 'foo', 'password' => 'access' } }
31
33
  grape_endpoint { build(:grape_endpoint) }
34
+ params { grape_request.params }
35
+ post_params { { 'secret' => 'key', 'customer' => [] } }
36
+ rails_post_params { { 'name' => 'foo', 'password' => 'access' } }
32
37
 
33
38
  initialize_with do
34
39
  new.merge(
35
40
  'REQUEST_METHOD' => 'POST',
36
41
  'PATH_INFO' => '/api/1.0/users',
37
- 'action_dispatch.request.request_parameters' => post_params,
42
+ 'action_dispatch.request.request_parameters' => rails_post_params,
38
43
  Grape::Env::GRAPE_REQUEST => grape_request,
39
44
  Grape::Env::GRAPE_REQUEST_PARAMS => params,
45
+ Grape::Env::RACK_REQUEST_FORM_HASH => post_params,
40
46
  Grape::Env::API_ENDPOINT => grape_endpoint
41
47
  )
42
48
  end
@@ -14,8 +14,8 @@ describe Grape::Middleware::Logger, type: :integration do
14
14
  it 'logs all parts of the request' do
15
15
  expect(subject.logger).to receive(:info).with ''
16
16
  expect(subject.logger).to receive(:info).with %Q(Started POST "/api/1.0/users" at #{subject.start_time})
17
- expect(subject.logger).to receive(:info).with %Q(Processing by TestAPI#users)
18
- expect(subject.logger).to receive(:info).with %Q( Parameters: {"id"=>"101001", "name"=>"foo", "password"=>"[FILTERED]"})
17
+ expect(subject.logger).to receive(:info).with %Q(Processing by TestAPI/users)
18
+ expect(subject.logger).to receive(:info).with %Q( Parameters: {"id"=>"101001", "secret"=>"[FILTERED]", "customer"=>[], "name"=>"foo", "password"=>"[FILTERED]"})
19
19
  expect(subject.logger).to receive(:info).with /Completed 200 in \d+.\d+ms/
20
20
  expect(subject.logger).to receive(:info).with ''
21
21
  subject.call!(env)
@@ -28,14 +28,14 @@ describe Grape::Middleware::Logger, type: :integration do
28
28
  let(:grape_endpoint) { build(:namespaced_endpoint) }
29
29
 
30
30
  it 'ignores the namespacing' do
31
- expect(subject.processed_by).to eq 'TestAPI#users'
31
+ expect(subject.processed_by).to eq 'TestAPI/admin/users'
32
32
  end
33
33
 
34
34
  context 'with more complex route' do
35
35
  let(:grape_endpoint) { build(:namespaced_endpoint, :complex) }
36
36
 
37
37
  it 'only escapes the first slash and leaves the rest of the untouched' do
38
- expect(subject.processed_by).to eq 'TestAPI#users/:name/profile'
38
+ expect(subject.processed_by).to eq 'TestAPI/admin/users/:name/profile'
39
39
  end
40
40
  end
41
41
  end
@@ -44,7 +44,7 @@ describe Grape::Middleware::Logger, type: :integration do
44
44
  let(:grape_endpoint) { build(:grape_endpoint, :complex) }
45
45
 
46
46
  it 'only escapes the first slash and leaves the rest of the untouched' do
47
- expect(subject.processed_by).to eq 'TestAPI#users/:name/profile'
47
+ expect(subject.processed_by).to eq 'TestAPI/users/:name/profile'
48
48
  end
49
49
  end
50
50
  end
@@ -45,8 +45,8 @@ describe Grape::Middleware::Logger, type: :rails_integration do
45
45
  it 'logs all parts of the request' do
46
46
  expect(subject.logger).to receive(:info).with ''
47
47
  expect(subject.logger).to receive(:info).with %Q(Started POST "/api/1.0/users" at #{subject.start_time})
48
- expect(subject.logger).to receive(:info).with %Q(Processing by TestAPI#users)
49
- expect(subject.logger).to receive(:info).with %Q( Parameters: {"id"=>"101001", "name"=>"foo", "password"=>"[FILTERED]"})
48
+ expect(subject.logger).to receive(:info).with %Q(Processing by TestAPI/users)
49
+ expect(subject.logger).to receive(:info).with %Q( Parameters: {"id"=>"101001", "secret"=>"key", "customer"=>[], "name"=>"foo", "password"=>"[FILTERED]"})
50
50
  expect(subject.logger).to receive(:info).with /Completed 200 in \d+.\d+ms/
51
51
  expect(subject.logger).to receive(:info).with ''
52
52
  subject.call!(env)
@@ -59,14 +59,14 @@ describe Grape::Middleware::Logger, type: :rails_integration do
59
59
  let(:grape_endpoint) { build(:namespaced_endpoint) }
60
60
 
61
61
  it 'ignores the namespacing' do
62
- expect(subject.processed_by).to eq 'TestAPI#users'
62
+ expect(subject.processed_by).to eq 'TestAPI/admin/users'
63
63
  end
64
64
 
65
65
  context 'with more complex route' do
66
66
  let(:grape_endpoint) { build(:namespaced_endpoint, :complex) }
67
67
 
68
68
  it 'only escapes the first slash and leaves the rest of the untouched' do
69
- expect(subject.processed_by).to eq 'TestAPI#users/:name/profile'
69
+ expect(subject.processed_by).to eq 'TestAPI/admin/users/:name/profile'
70
70
  end
71
71
  end
72
72
  end
@@ -75,7 +75,7 @@ describe Grape::Middleware::Logger, type: :rails_integration do
75
75
  let(:grape_endpoint) { build(:grape_endpoint, :complex) }
76
76
 
77
77
  it 'only escapes the first slash and leaves the rest of the untouched' do
78
- expect(subject.processed_by).to eq 'TestAPI#users/:name/profile'
78
+ expect(subject.processed_by).to eq 'TestAPI/users/:name/profile'
79
79
  end
80
80
  end
81
81
  end
@@ -8,7 +8,7 @@ describe Grape::Middleware::Logger do
8
8
 
9
9
  let(:app_response) { build :app_response }
10
10
  let(:grape_request) { build :grape_request }
11
- let(:env) { build(:expected_env) }
11
+ let(:env) { build :expected_env }
12
12
 
13
13
  describe '#call!' do
14
14
  context 'when calling the app results in an error response' do
@@ -82,12 +82,12 @@ describe Grape::Middleware::Logger do
82
82
 
83
83
  context 'when @options[:filter] is set' do
84
84
  it 'calls +filter+ with the raw parameters' do
85
- expect(subject.options[:filter]).to receive(:filter).with({ "id" => '101001', "name" => "foo", "password" => "access" })
85
+ expect(subject.options[:filter]).to receive(:filter).with({ "id" => '101001', "secret" => "key", "customer" => [], "name"=>"foo", "password"=>"access" })
86
86
  subject.parameters
87
87
  end
88
88
 
89
89
  it 'returns the filtered results' do
90
- expect(subject.parameters).to eq({ "id" => '101001', "name" => "foo", "password" => "[FILTERED]" })
90
+ expect(subject.parameters).to eq({ "id" => '101001', "secret" => "[FILTERED]", "customer" => [], "name"=>"foo", "password"=>"[FILTERED]" })
91
91
  end
92
92
  end
93
93
 
@@ -95,7 +95,7 @@ describe Grape::Middleware::Logger do
95
95
  let(:options) { {} }
96
96
 
97
97
  it 'returns the params extracted out of @env' do
98
- expect(subject.parameters).to eq({ "id" => '101001', "name" => "foo", "password" => "access" })
98
+ expect(subject.parameters).to eq({ "id" => '101001', "secret" => "key", "customer" => [], "name"=>"foo", "password"=>"access" })
99
99
  end
100
100
  end
101
101
  end
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: 1.5.1
4
+ version: 1.6.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-12-15 00:00:00.000000000 Z
11
+ date: 2016-04-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: grape
@@ -44,6 +44,20 @@ dependencies:
44
44
  - - "~>"
45
45
  - !ruby/object:Gem::Version
46
46
  version: '1.7'
47
+ - !ruby/object:Gem::Dependency
48
+ name: mime-types
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '2'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '2'
47
61
  - !ruby/object:Gem::Dependency
48
62
  name: rake
49
63
  requirement: !ruby/object:Gem::Requirement
@@ -81,8 +95,7 @@ dependencies:
81
95
  description: Logging middleware for the Grape framework, similar to what Rails offers
82
96
  email:
83
97
  - arebuckley@gmail.com
84
- executables:
85
- - test
98
+ executables: []
86
99
  extensions: []
87
100
  extra_rdoc_files: []
88
101
  files:
@@ -92,7 +105,6 @@ files:
92
105
  - LICENSE.txt
93
106
  - README.md
94
107
  - Rakefile
95
- - bin/test
96
108
  - grape-middleware-logger.gemspec
97
109
  - lib/grape/middleware/logger.rb
98
110
  - lib/grape/middleware/logger/railtie.rb
data/bin/test DELETED
@@ -1,3 +0,0 @@
1
- #!/bin/bash
2
- set -ev
3
- bundle exec rspec spec/lib && bundle exec rspec spec/integration && bundle exec rspec spec/integration_rails