diff --git a/Gemfile b/Gemfile index edb43b1..1d30cc8 100644 --- a/Gemfile +++ b/Gemfile @@ -28,5 +28,4 @@ group :development do gem 'rubocop-thread_safety' gem 'ruby-lsp-rails' gem 'turbo-rails' - gem 'web-console' end diff --git a/Gemfile.lock b/Gemfile.lock index e3eaf1a..3771f71 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -79,7 +79,6 @@ GEM ast (2.4.2) base64 (0.2.0) bigdecimal (3.1.8) - bindex (0.8.1) bootsnap (1.18.3) msgpack (~> 1.2) builder (3.2.4) @@ -291,11 +290,6 @@ GEM tzinfo (2.0.6) concurrent-ruby (~> 1.0) unicode-display_width (2.5.0) - web-console (4.2.1) - actionview (>= 6.0.0) - activemodel (>= 6.0.0) - bindex (>= 0.4.0) - railties (>= 6.0.0) webrick (1.8.1) websocket-driver (0.7.6) websocket-extensions (>= 0.1.0) @@ -336,7 +330,6 @@ DEPENDENCIES stimulus-rails tailwindcss-rails turbo-rails - web-console RUBY VERSION ruby 3.1.2p20 diff --git a/lib/formatters/ansi_formatter.rb b/lib/formatters/ansi_formatter.rb index 3557732..b1f9a82 100644 --- a/lib/formatters/ansi_formatter.rb +++ b/lib/formatters/ansi_formatter.rb @@ -5,14 +5,16 @@ require 'io/console' require 'amazing_print' require 'json' +# wraps meanwhile takes care of ansi colors class AnsiFormatter < SemanticLogger::Formatters::Color include AnsiColors - ANSI_DEBUG = TEXT_GRAY_400 - ANSI_INFO = TEXT_GRAY_100 - ANSI_WARN = BG_YELLOW + TEXT_BLACK - ANSI_ERROR = BG_RED + TEXT_BLACK - ANSI_FATAL = DARK_BG_RED + TEXT_BLACK + ANSI_DEBUG = CLEAR + TEXT_GRAY_400 + ANSI_INFO = CLEAR + TEXT_GRAY_100 + ANSI_WARN = CLEAR + BG_YELLOW + TEXT_BLACK + ANSI_ERROR = CLEAR + BG_RED + TEXT_WHITE + ANSI_FATAL = CLEAR + BG_MAGENTA + BOLD + TEXT_WHITE + NAME_MAX_SIZE = 20 def initialize super(color_map: ColorMap.new( @@ -24,12 +26,6 @@ class AnsiFormatter < SemanticLogger::Formatters::Color )) end - def message - return unless log.message - - colorize(log.message, color_map[log.level]) - end - def call(log, logger) self.log = log self.logger = logger @@ -37,15 +33,43 @@ class AnsiFormatter < SemanticLogger::Formatters::Color wrap_level(level, message, payload, exception) end + def origin + origin = log.name.truncate(NAME_MAX_SIZE).center(NAME_MAX_SIZE) + colorize(origin, AnsiColors::TEXT_CYAN) + end + + def message + return unless log.message + + colorize(log.message) + end + + def exception + return unless log.exception + + clazz = "#{log.exception.class}\n" + message = log.exception.message.chomp('') + backtrace = clean_backtrace(log.exception.backtrace) + + "#{colorize(clazz, ANSI_FATAL)}#{colorize(message, ANSI_ERROR)}#{backtrace}" + end + private - def colorize(text, color) - "#{color}#{text}#{color_map.clear}" + def clean_backtrace(backtrace) + root_path = Rails.root.to_s + backtrace = backtrace.select { |line| line.starts_with?(root_path) } + backtrace = backtrace.map { |line| line.delete_prefix("#{root_path}/") } + backtrace.compact.join("\n") + end + + def colorize(text, tint = color) + "#{tint}#{text}#{AnsiColors::CLEAR}" end def wrap_level(level, *items) - prefix = " #{colorize('>', color)} " - continuation = " #{colorize('#', color)} " + prefix = "#{origin} #{colorize('>')} " + continuation = "#{origin} #{colorize('#')} " items.map do |item| AnsiWrapper.wrap(item, 100, prefix, continuation) end.compact.join("\n") # FIXME: previously was: join(' ') diff --git a/lib/formatters/ansi_wrapper.rb b/lib/formatters/ansi_wrapper.rb index 586436f..3c7ce64 100644 --- a/lib/formatters/ansi_wrapper.rb +++ b/lib/formatters/ansi_wrapper.rb @@ -5,14 +5,14 @@ class AnsiWrapper ANSI_RESET = "\e[0m".freeze def self.wrap(text, length, prefix = '', continuation = prefix) - if prefix.length != continuation.length - raise "continuation <#{continuation}> should have the same length as prefix <#{prefix}>" + if visible_length(prefix) != visible_length(continuation) + raise "continuation <#{continuation.inspect}> should have the same length as prefix <#{prefix.inspect}>" end return unless text text = text.gsub("\t", ' ' * TAB_TO_SPACES) - lines = split_text_to_lines(text, length - prefix.length) + lines = split_text_to_lines(text, length - visible_length(prefix)) lines = inject_continuation_and_ansi_colors_to_lines(lines, prefix, continuation) lines.join("\n") end