Class: Async::Logger

Inherits:
Object
  • Object
show all
Defined in:
lib/async/logger.rb

Defined Under Namespace

Classes: Buffer

Constant Summary collapse

LEVELS =
{debug: 0, info: 1, warn: 2, error: 3, fatal: 4}

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(output, level: 1) ⇒ Logger

Returns a new instance of Logger.



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/async/logger.rb', line 62

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

Instance Attribute Details

#levelObject

Returns the value of attribute level.



78
79
80
# File 'lib/async/logger.rb', line 78

def level
  @level
end

Instance Method Details

#disable(subject) ⇒ Object



96
97
98
# File 'lib/async/logger.rb', line 96

def disable(subject)
  @subjects[subject.class] = false
end

#enable(subject) ⇒ Object



92
93
94
# File 'lib/async/logger.rb', line 92

def enable(subject)
  @subjects[subject.class] = true
end

#enabled?(subject) ⇒ Boolean

Returns:

  • (Boolean)


88
89
90
# File 'lib/async/logger.rb', line 88

def enabled?(subject)
  @subjects[subject.class] == true
end

#format(subject = nil, *arguments, &block) ⇒ Object



108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# File 'lib/async/logger.rb', line 108

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

#format_argument(argument, output: @output) ⇒ Object



133
134
135
136
137
138
139
# File 'lib/async/logger.rb', line 133

def format_argument(argument, output: @output)
  if argument.is_a? Exception
    format_exception(argument, output: output)
  else
    format_value(argument, output: output)
  end
end

#format_exception(exception, prefix = nil, pwd: Dir.pwd, output: @output) ⇒ Object



141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
# File 'lib/async/logger.rb', line 141

def format_exception(exception, prefix = nil, pwd: Dir.pwd, output: @output)
  lines = exception.message.lines.map{|line| line.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

#format_subject(prefix, subject, output: @output) ⇒ Object



164
165
166
# File 'lib/async/logger.rb', line 164

def format_subject(prefix, subject, output: @output)
  output.puts "#{@subject_style}#{subject}#{@reset_style}", prefix: "#{@prefix_style}#{prefix}: "
end

#format_value(value, output: @output) ⇒ Object



168
169
170
171
172
173
174
# File 'lib/async/logger.rb', line 168

def format_value(value, output: @output)
  string = value.to_s
  
  string.each_line do |line|
    output.puts "#{line}"
  end
end

#log(level, *arguments, &block) ⇒ Object



100
101
102
103
104
105
106
# File 'lib/async/logger.rb', line 100

def log(level, *arguments, &block)
  unless level.is_a? Symbol
    level = LEVELS[level]
  end
  
  self.send(level, *arguments, &block)
end

#time_offset_prefixObject



176
177
178
179
180
181
182
183
184
185
186
# File 'lib/async/logger.rb', line 176

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