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
2013-02-27 22:24:31 +00:00
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
2013-02-27 22:24:31 +00:00
2012-01-21 02:08:13 +00:00
Rails . logger = Capybara :: RailsLogInspection . logger
2013-02-27 22:24:31 +00:00
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