lib/nanoc/cli/error_handler.rb in nanoc-3.6.7 vs lib/nanoc/cli/error_handler.rb in nanoc-3.6.8

- old
+ new

@@ -7,25 +7,25 @@ # @api private class ErrorHandler # @option params [Nanoc::CLI::Command, nil] command The command that is # currently being executed, or nil if there is none - def initialize(params={}) + def initialize(params = {}) @command = params[:command] end # Enables error handling in the given block. # # @option params [Nanoc::CLI::Command, nil] command The command that is # currently being executed, or nil if there is none # # @return [void] - def self.handle_while(params={}, &block) + def self.handle_while(params = {}, &block) if @disabled yield else - self.new(params).handle_while(&block) + new(params).handle_while(&block) end end # Disables error handling. This is used by the test cases to prevent error # from being handled by the CLI while tests are running. @@ -50,44 +50,44 @@ # @return [void] # # @api private def handle_while(&block) # Set exit handler - [ 'INT', 'TERM' ].each do |signal| + %w( INT TERM ).each do |signal| Signal.trap(signal) do puts exit!(0) end end begin Signal.trap('USR1') do - puts "Caught USR1; dumping a stack trace" + puts 'Caught USR1; dumping a stack trace' puts caller.map { |i| " #{i}" }.join("\n") end rescue ArgumentError end # Run yield rescue Nanoc::Errors::GenericTrivial => e $stderr.puts "Error: #{e.message}" exit(1) - rescue Interrupt => e + rescue Interrupt exit(1) rescue StandardError, ScriptError => e - self.print_error(e) + print_error(e) exit(1) end # Prints the given error to stderr. Includes message, possible resolution # (see {#resolution_for}), compilation stack, backtrace, etc. # # @param [Error] error The error that should be described # # @return [void] def self.print_error(error) - self.new.print_error(error) + new.print_error(error) end # Prints the given error to stderr. Includes message, possible resolution # (see {#resolution_for}), compilation stack, backtrace, etc. # @@ -115,19 +115,19 @@ # # @return [void] def write_compact_error(error, stream) # Header stream.puts - stream.puts "Captain! We’ve been hit!" + stream.puts 'Captain! We’ve been hit!' # Sections - self.write_error_message( stream, error) - self.write_compilation_stack(stream, error) - self.write_stack_trace( stream, error) + write_error_message(stream, error) + write_compilation_stack(stream, error) + write_stack_trace(stream, error) # Issue link - self.write_issue_link(stream) + write_issue_link(stream) end # Writes a verbose representation of the error on the given stream. # # @param [Error] error The error that should be described @@ -140,19 +140,19 @@ def write_verbose_error(error, stream) # Header stream.puts "Crashlog created at #{Time.now}" # Sections - self.write_error_message( stream, error, :verbose => true) - self.write_compilation_stack( stream, error, :verbose => true) - self.write_stack_trace( stream, error, :verbose => true) - self.write_version_information(stream, :verbose => true) - self.write_system_information( stream, :verbose => true) - self.write_installed_gems( stream, :verbose => true) - self.write_environment( stream, :verbose => true) - self.write_gemfile_lock( stream, :verbose => true) - self.write_load_paths( stream, :verbose => true) + write_error_message(stream, error, :verbose => true) + write_compilation_stack(stream, error, :verbose => true) + write_stack_trace(stream, error, :verbose => true) + write_version_information(stream, :verbose => true) + write_system_information(stream, :verbose => true) + write_installed_gems(stream, :verbose => true) + write_environment(stream, :verbose => true) + write_gemfile_lock(stream, :verbose => true) + write_load_paths(stream, :verbose => true) end protected # @return [Boolean] true if debug output is enabled, false if not @@ -236,11 +236,11 @@ gem_name = GEM_NAMES[matches[2]] # Build message if gem_name if self.using_bundler? - "Make sure the gem is added to Gemfile and run `bundle install`." + 'Make sure the gem is added to Gemfile and run `bundle install`.' else "Install the '#{gem_name}' gem using `gem install #{gem_name}`." end end when RuntimeError @@ -256,100 +256,100 @@ def using_bundler? defined?(Bundler) && Bundler::SharedHelpers.in_bundle? end - def write_section_header(stream, title, params={}) + def write_section_header(stream, title, params = {}) stream.puts if params[:verbose] stream.puts '===== ' + title.upcase + ':' else stream.puts "\e[1m\e[31m" + title + ':' + "\e[0m" end stream.puts end - def write_error_message(stream, error, params={}) - self.write_section_header(stream, 'Message', params) + def write_error_message(stream, error, params = {}) + write_section_header(stream, 'Message', params) stream.puts "#{error.class}: #{error.message}" - resolution = self.resolution_for(error) + resolution = resolution_for(error) stream.puts "#{resolution}" if resolution end - def write_compilation_stack(stream, error, params={}) - self.write_section_header(stream, 'Compilation stack', params) + def write_compilation_stack(stream, error, params = {}) + write_section_header(stream, 'Compilation stack', params) - if self.stack.empty? - stream.puts " (empty)" + if stack.empty? + stream.puts ' (empty)' else - self.stack.reverse.each do |obj| + stack.reverse.each do |obj| if obj.is_a?(Nanoc::ItemRep) stream.puts " - [item] #{obj.item.identifier} (rep #{obj.name})" else # layout stream.puts " - [layout] #{obj.identifier}" end end end end - def write_stack_trace(stream, error, params={}) - self.write_section_header(stream, 'Stack trace', params) + def write_stack_trace(stream, error, params = {}) + is_verbose = params.fetch(:verbose, false) - count = params[:verbose] ? -1 : 10 + write_section_header(stream, 'Stack trace', params) + + count = is_verbose ? -1 : 10 error.backtrace[0...count].each_with_index do |item, index| stream.puts " #{index}. #{item}" end - if error.backtrace.size > count + if !is_verbose && error.backtrace.size > count stream.puts " ... #{error.backtrace.size - count} more lines omitted. See full crash log for details." end end - def write_issue_link(stream, params={}) + def write_issue_link(stream, params = {}) stream.puts - stream.puts "If you believe this is a bug in nanoc, please do report it at" - stream.puts "-> https://github.com/nanoc/nanoc/issues/new <-" + stream.puts 'If you believe this is a bug in nanoc, please do report it at' + stream.puts '-> https://github.com/nanoc/nanoc/issues/new <-' stream.puts - stream.puts "A detailed crash log has been written to ./crash.log." + stream.puts 'A detailed crash log has been written to ./crash.log.' end - def write_version_information(stream, params={}) - self.write_section_header(stream, 'Version information', params) + def write_version_information(stream, params = {}) + write_section_header(stream, 'Version information', params) stream.puts Nanoc.version_information end - def write_system_information(stream, params={}) - begin - uname = `uname -a` - self.write_section_header(stream, 'System information', params) - stream.puts uname - rescue Errno::ENOENT - end + def write_system_information(stream, params = {}) + uname = `uname -a` + write_section_header(stream, 'System information', params) + stream.puts uname + rescue Errno::ENOENT end - def write_installed_gems(stream, params={}) - self.write_section_header(stream, 'Installed gems', params) - self.gems_and_versions.each do |g| + def write_installed_gems(stream, params = {}) + write_section_header(stream, 'Installed gems', params) + gems_and_versions.each do |g| stream.puts " #{g.first} #{g.last.join(', ')}" end end - def write_environment(stream, params={}) - self.write_section_header(stream, 'Environment', params) + def write_environment(stream, params = {}) + write_section_header(stream, 'Environment', params) ENV.sort.each do |e| stream.puts "#{e.first} => #{e.last.inspect}" end end - def write_gemfile_lock(stream, params={}) + def write_gemfile_lock(stream, params = {}) if File.exist?('Gemfile.lock') - self.write_section_header(stream, 'Gemfile.lock', params) + write_section_header(stream, 'Gemfile.lock', params) stream.puts File.read('Gemfile.lock') end end - def write_load_paths(stream, params={}) - self.write_section_header(stream, 'Load paths', params) + def write_load_paths(stream, params = {}) + write_section_header(stream, 'Load paths', params) $LOAD_PATH.each_with_index do |i, index| stream.puts " #{index}. #{i}" end end