capybara-rails-log-inspection/lib/capybara/rails-log-inspection.rb

99 lines
2.8 KiB
Ruby
Raw Permalink Normal View History

2012-01-21 02:08:13 +00:00
require 'term/ansicolor'
module Capybara
module RailsLogInspection
class << self
def logger_target
@logger_target ||= StringIO.new
end
def logger(level = nil)
2013-02-28 13:10:35 +00:00
logger = Logger.new(logger_target)
logger.level = level || default_log_level
logger
2012-01-21 02:08:13 +00:00
end
2012-01-21 18:02:11 +00:00
attr_writer :backtrace_clean_patterns, :default_log_level, :rack_log_level, :filter_request_starts
2012-01-21 02:08:13 +00:00
def default_log_level
2012-01-21 18:02:11 +00:00
Logger::INFO
2012-01-21 02:08:13 +00:00
end
def rack_log_level
Logger::WARN
end
2012-01-21 18:02:11 +00:00
def filter_request_starts
@filter_request_starts ||= true
end
def clean_rack_output(lines)
2012-01-23 14:51:48 +00:00
lines.reject { |line| line.strip.empty? || (filter_request_starts && line[%r{^Started }]) }
2012-01-21 18:02:11 +00:00
end
2012-01-21 02:08:13 +00:00
def backtrace_clean_patterns
@backtrace_clean_patterns ||= [ %r{/gems/}, %r{/ruby/1} ]
end
def clean_backtrace(exception)
2012-01-21 18:02:11 +00:00
exception.backtrace.collect(&:strip).reject { |line| line.empty? || backtrace_clean_patterns.any? { |pattern| line[pattern] } }
2012-01-21 02:08:13 +00:00
end
def add_backtrace(exception)
2012-01-25 16:22:33 +00:00
clean_backtrace(exception).each { |line| logger_target << " #{line.strip}\n" }
2012-01-21 02:08:13 +00:00
end
def output_line(line, target = $stderr)
target.print(Term::ANSIColor.red, line, Term::ANSIColor.reset)
target.flush
end
2012-01-21 02:08:13 +00:00
end
def reset_logs
Capybara::RailsLogInspection.logger_target.rewind
Capybara::RailsLogInspection.logger_target.truncate(0)
end
def output_logs(target = $stderr)
Capybara::RailsLogInspection.logger_target.rewind
2012-01-21 18:02:11 +00:00
lines = Capybara::RailsLogInspection.logger_target.read.lines
Capybara::RailsLogInspection.clean_rack_output(lines).each do |line|
2013-02-28 13:10:35 +00:00
Capybara::RailsLogInspection.output_line(line, target)
2012-01-21 18:02:11 +00:00
end
2012-01-21 02:08:13 +00:00
reset_logs
end
end
end
2012-01-21 02:08:13 +00:00
Rails.logger = Capybara::RailsLogInspection.logger
class LogInspectionSubscriber < ActiveSupport::LogSubscriber
def process_action(event)
if event.payload[:exception]
Capybara::RailsLogInspection.output_line "Processing #{event.payload[:method]} #{event.payload[:controller]}##{event.payload[:action]} as #{event.payload[:format]}\n"
Capybara::RailsLogInspection.output_line " #{event.payload[:exception].first}: #{event.payload[:exception].last}\n"
end
end
end
LogInspectionSubscriber.attach_to :action_controller
2012-01-21 02:08:13 +00:00
Capybara.server do |app, port|
require 'rack/handler/webrick'
responder = lambda { |request, response|
class << response
def set_error(ex, backtrace = false)
Capybara::RailsLogInspection.add_backtrace(ex)
end
end
}
Rack::Handler::WEBrick.run(app, :Port => port, :AccessLog => [], :Logger => Capybara::RailsLogInspection.logger(Capybara::RailsLogInspection.rack_log_level), :RequestCallback => responder)
end