use railtie
This commit is contained in:
parent
9a0326ff09
commit
b2491299ed
1
Gemfile
1
Gemfile
|
@ -6,4 +6,5 @@ gemspec
|
|||
group :test do
|
||||
gem 'rake'
|
||||
gem "factory_girl", "~> 4.0"
|
||||
gem "rails", "~> 4.2"
|
||||
end
|
||||
|
|
|
@ -6,11 +6,20 @@ class Grape::Middleware::Logger < Grape::Middleware::Globals
|
|||
|
||||
attr_reader :logger
|
||||
|
||||
class << self
|
||||
attr_accessor :logger, :filter
|
||||
|
||||
def default_logger
|
||||
default = Logger.new(STDOUT)
|
||||
default.formatter = ->(*args) { args.last.to_s << "\n".freeze }
|
||||
default
|
||||
end
|
||||
end
|
||||
|
||||
def initialize(_, options = {})
|
||||
super
|
||||
@logger = options[:logger]
|
||||
@logger ||= Rails.logger if defined?(Rails) && Rails.logger.present?
|
||||
@logger ||= default_logger
|
||||
@options[:filter] ||= self.class.filter
|
||||
@logger = options[:logger] || self.class.logger || self.class.default_logger
|
||||
end
|
||||
|
||||
def before
|
||||
|
@ -94,10 +103,6 @@ class Grape::Middleware::Logger < Grape::Middleware::Globals
|
|||
endpoint = env[Grape::Env::API_ENDPOINT]
|
||||
endpoint.options[:for].to_s << '#'.freeze << endpoint.options[:path].map { |path| path.to_s.sub(BACKSLASH, '') }.join(BACKSLASH)
|
||||
end
|
||||
|
||||
def default_logger
|
||||
default = Logger.new(STDOUT)
|
||||
default.formatter = ->(*args) { args.last.to_s << "\n".freeze }
|
||||
default
|
||||
end
|
||||
end
|
||||
|
||||
require_relative 'logger/railtie' if defined?(Rails)
|
||||
|
|
|
@ -0,0 +1,6 @@
|
|||
class Grape::Middleware::Logger::Railtie < Rails::Railtie
|
||||
initializer 'grape.middleware.logger' do
|
||||
Grape::Middleware::Logger.logger = ::Rails.application.config.logger
|
||||
Grape::Middleware::Logger.filter = ::ActionDispatch::Http::ParameterFilter.new(::Rails.application.config.filter_parameters)
|
||||
end
|
||||
end
|
|
@ -1,5 +1,4 @@
|
|||
require 'spec_helper'
|
||||
require 'grape/middleware/logger'
|
||||
|
||||
describe Grape::Middleware::Logger, type: :integration do
|
||||
let(:app) { build :app }
|
||||
|
@ -49,4 +48,5 @@ describe Grape::Middleware::Logger, type: :integration do
|
|||
end
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
|
|
@ -0,0 +1,82 @@
|
|||
require 'rails_helper'
|
||||
|
||||
describe Grape::Middleware::Logger, type: :rails_integration do
|
||||
let(:app) { build :app }
|
||||
let(:options) { {} }
|
||||
|
||||
subject { described_class.new(app, options) }
|
||||
|
||||
let(:app_response) { build :app_response }
|
||||
let(:grape_request) { build :grape_request }
|
||||
let(:grape_endpoint) { build(:grape_endpoint) }
|
||||
let(:env) { build(:expected_env, grape_endpoint: grape_endpoint) }
|
||||
|
||||
describe '#logger' do
|
||||
context 'when @options[:logger] is nil' do
|
||||
context 'when Rails.application.config.logger is defined' do
|
||||
it 'uses the Rails logger' do
|
||||
expect(subject.logger).to be_present
|
||||
expect(subject.logger).to be Rails.application.config.logger
|
||||
expect(subject.logger.formatter).to be_nil
|
||||
end
|
||||
end
|
||||
|
||||
context 'when the class logger is nil' do
|
||||
before { described_class.logger = nil }
|
||||
|
||||
it 'uses the default logger' do
|
||||
expect(subject.logger).to be_present
|
||||
expect(subject.logger).to_not be Rails.application.config.logger
|
||||
expect(subject.logger).to be_a(Logger)
|
||||
expect(subject.logger.formatter.call('foo')).to eq "foo\n"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'when @options[:logger] is set' do
|
||||
let(:options) { { logger: Object.new } }
|
||||
|
||||
it 'returns the logger object' do
|
||||
expect(subject.logger).to eq options[:logger]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
it 'logs all parts of the request' do
|
||||
expect(subject.logger).to receive(:info).with ''
|
||||
expect(subject.logger).to receive(:info).with %Q(Started POST "/api/1.0/users" at #{subject.start_time})
|
||||
expect(subject.logger).to receive(:info).with %Q(Processing by TestAPI#users)
|
||||
expect(subject.logger).to receive(:info).with %Q( Parameters: {"id"=>"101001", "name"=>"foo", "password"=>"[FILTERED]"})
|
||||
expect(subject.logger).to receive(:info).with /Completed 200 in \d.\d+ms/
|
||||
expect(subject.logger).to receive(:info).with ''
|
||||
subject.call!(env)
|
||||
end
|
||||
|
||||
describe 'the "processing by" section' do
|
||||
before { subject.call!(env) }
|
||||
|
||||
context 'namespacing' do
|
||||
let(:grape_endpoint) { build(:namespaced_endpoint) }
|
||||
|
||||
it 'ignores the namespacing' do
|
||||
expect(subject.processed_by).to eq 'TestAPI#users'
|
||||
end
|
||||
|
||||
context 'with more complex route' do
|
||||
let(:grape_endpoint) { build(:namespaced_endpoint, :complex) }
|
||||
|
||||
it 'only escapes the first slash and leaves the rest of the untouched' do
|
||||
expect(subject.processed_by).to eq 'TestAPI#users/:name/profile'
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'with more complex route' do
|
||||
let(:grape_endpoint) { build(:grape_endpoint, :complex) }
|
||||
|
||||
it 'only escapes the first slash and leaves the rest of the untouched' do
|
||||
expect(subject.processed_by).to eq 'TestAPI#users/:name/profile'
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -99,52 +99,4 @@ describe Grape::Middleware::Logger do
|
|||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe '#logger' do
|
||||
context 'when @options[:logger] is nil' do
|
||||
let(:options) { {} }
|
||||
|
||||
context 'when Rails is defined' do
|
||||
before do
|
||||
module Rails
|
||||
class << self
|
||||
attr_accessor :logger
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
it 'defaults to the the standard Logger' do
|
||||
expect(subject.logger).to be_a(Logger)
|
||||
end
|
||||
|
||||
it 'logs each message in the correct format' do
|
||||
expect(subject.logger.formatter.call('foo')).to eq "foo\n"
|
||||
end
|
||||
|
||||
context 'when Rails.logger is defined' do
|
||||
before do
|
||||
Rails.logger = double('rails_logger')
|
||||
end
|
||||
|
||||
it 'sets @logger to Rails.logger' do
|
||||
expect(subject.logger).to be Rails.logger
|
||||
end
|
||||
|
||||
after do
|
||||
Rails.logger = nil
|
||||
end
|
||||
end
|
||||
|
||||
after do
|
||||
Object.send :remove_const, :Rails
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'when @options[:logger] is set' do
|
||||
it 'returns the logger object' do
|
||||
expect(subject.logger).to eq options[:logger]
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
require 'rails'
|
||||
|
||||
class MyRailsApp < Rails::Application
|
||||
RailsLogger = Class.new Logger
|
||||
config.logger = RailsLogger.new(Tempfile.new '')
|
||||
config.filter_parameters += [:password]
|
||||
end
|
||||
|
||||
require 'spec_helper'
|
||||
Grape::Middleware::Logger::Railtie.run_initializers
|
Loading…
Reference in New Issue