lib/async/logger.rb in async-1.15.5 vs lib/async/logger.rb in async-1.16.0

- old
+ new

@@ -16,193 +16,10 @@ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -require_relative 'terminal' +require 'event/console' -# Downstream gems often use `Logger:::LEVEL` constants, so we pull this in so they are available. That being said, the code should be fixed. -require 'logger' - module Async - class Logger - class Buffer < StringIO - def initialize(prefix = nil) - @prefix = prefix - - super() - end - - def puts(*args, prefix: @prefix) - args.each do |arg| - self.write(prefix) if prefix - - super(arg) - end - end - end - - LEVELS = {debug: 0, info: 1, warn: 2, error: 3, fatal: 4} - - LEVELS.each do |name, level| - const_set(name.to_s.upcase, level) - - define_method(name) do |subject = nil, *arguments, &block| - enabled = @subjects[subject.class] - - if enabled == true or (enabled != false and level >= @level) - self.format(subject, *arguments, &block) - end - end - - define_method("#{name}!") do - @level = level - end - end - - def initialize(output, level: 1) - @output = output - @level = level - @start = Time.now - - @terminal = Terminal.new(output) - @reset_style = @terminal.reset - @prefix_style = @terminal.color(Terminal::Colors::CYAN) - @subject_style = @terminal.color(nil, nil, Terminal::Attributes::BOLD) - @exception_title_style = @terminal.color(Terminal::Colors::RED, nil, Terminal::Attributes::BOLD) - @exception_details_style = @terminal.color(Terminal::Colors::YELLOW) - @exception_line_style = @terminal.color(Terminal::Colors::RED) - - @subjects = {} - end - - attr :level - - def level= value - if value.is_a? Symbol - @level = LEVELS[value] - else - @level = value - end - end - - def enabled?(subject) - @subjects[subject.class] == true - end - - def enable(subject) - @subjects[subject.class] = true - end - - def disable(subject) - @subjects[subject.class] = false - end - - def log(level, *arguments, &block) - unless level.is_a? Symbol - level = LEVELS[level] - end - - self.send(level, *arguments, &block) - end - - def format(subject = nil, *arguments, &block) - prefix = time_offset_prefix - indent = " " * prefix.size - - buffer = Buffer.new("#{indent}| ") - - if subject - format_subject(prefix, subject, output: buffer) - end - - arguments.each do |argument| - format_argument(argument, output: buffer) - end - - if block_given? - if block.arity.zero? - format_argument(yield, output: buffer) - else - yield(buffer, @terminal) - end - end - - @output.write buffer.string - end - - def format_argument(argument, output: @output) - if argument.is_a? Exception - format_exception(argument, output: output) - else - format_value(argument, output: output) - end - end - - def format_exception(exception, prefix = nil, pwd: Dir.pwd, output: @output) - lines = exception.message.lines.map(&:chomp) - - output.puts " #{prefix}#{@exception_title_style}#{exception.class}#{@reset_style}: #{lines.shift}" - - lines.each do |line| - output.puts " #{@exception_details_style}" + line + @reset_style - end - - exception.backtrace.each_with_index do |line, index| - path, offset, message = line.split(":") - - # Make the path a bit more readable - path.gsub!(/^#{pwd}\//, "./") - - output.puts " #{index == 0 ? "→" : " "} #{@exception_line_style}#{path}:#{offset}#{@reset_style} #{message}" - end - - if exception.cause - format_exception(exception.cause, "Caused by ", pwd: pwd, output: output) - end - end - - def format_subject(prefix, subject, output: @output) - output.puts "#{@subject_style}#{subject}#{@reset_style}", prefix: "#{@prefix_style}#{prefix}: " - end - - def format_value(value, output: @output) - string = value.to_s - - string.each_line do |line| - output.puts "#{line}" - end - end - - def time_offset_prefix - offset = Time.now - @start - minutes = (offset/60).floor - seconds = (offset - (minutes*60)) - - if minutes > 0 - "#{minutes}m#{seconds.floor}s" - else - "#{seconds.round(2)}s" - end.rjust(6) - end - end - - # The Async Logger class. - class << self - # @attr logger [Logger] the global logger instance used by `Async`. - attr :logger - - # Set the default log level based on `$DEBUG` and `$VERBOSE`. - def default_log_level - if $DEBUG - Logger::DEBUG - elsif $VERBOSE - Logger::INFO - else - Logger::WARN - end - end - end - - # Create the logger instance. - @logger = Logger.new($stderr, level: self.default_log_level) + extend Event::Console end