Module: TestBench::Bootstrap::Output

Extended by:
Output
Included in:
Output
Defined in:
lib/test_bench/bootstrap.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#indentationObject



300
301
302
# File 'lib/test_bench/bootstrap.rb', line 300

def indentation
  @indentation ||= 0
end

Instance Method Details

#deviceObject



305
306
307
# File 'lib/test_bench/bootstrap.rb', line 305

def device
  @device ||= Defaults.output_device
end

#error(error) ⇒ Object



202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
# File 'lib/test_bench/bootstrap.rb', line 202

def error(error)
  omit_backtrace_pattern = Defaults.omit_backtrace_pattern

  omitting = false

  write("\e[1mTraceback\e[22m (most recent call last):", sgr_code: 0x31)

  rjust_length = error.backtrace.length.to_s.length

  reverse_backtrace = error.backtrace[1..-1].reverse

  reverse_backtrace.each_with_index do |frame, index|
    frame = frame.dup
    frame.chomp!

    previous_frame = frame

    file, _ = frame.split(':', 2)

    line = ' ' * rjust_length

    index_text = index.to_s
    index_range = (-index_text.length..-1)

    if Path.match?(omit_backtrace_pattern, file)
      if omitting
        next
      else
        omitting = true

        line[index_range] = '?' * index_text.length
        line += ": *omitted*"

        write(line, sgr_codes: [0x2, 0x3, 0x31], tab_indent: true)
      end
    else
      omitting = false

      line[index_range] = index_text
      line += ": #{frame}"

      write(line, sgr_code: 0x31, tab_indent: true)
    end
  end

  if error.message.empty?
    if error.instance_of?(RuntimeError)
      write("#{error.backtrace[0]}: \e[1;4munhandled exception\e[24;22m", sgr_code: 0x31)
      return
    end

    error.message = error.class
  end

  write("#{error.backtrace[0]}: \e[1m#{error} (\e[4m#{error.class}\e[24m)\e[22m", sgr_code: 0x31)
end

#indent(text, device: nil, sgr_code: nil, sgr_codes: nil, tab_indent: nil, &block) ⇒ Object



263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
# File 'lib/test_bench/bootstrap.rb', line 263

def indent(text, device: nil, sgr_code: nil, sgr_codes: nil, tab_indent: nil, &block)
  unless text.nil?
    sgr_codes ||= []
    unless sgr_code.nil?
      sgr_codes << sgr_code
    end

    unless sgr_codes.empty?
      sgr_codes.map! do |sgr_code|
        sgr_code.to_s(16)
      end

      text = "\e[#{sgr_codes.join(';')}m#{text}\e[0m"
    end

    text = "#{"\t" if tab_indent}#{'  ' * indentation}#{text}\n"

    raw_write(text, device)
  end

  return if block.nil?

  self.indentation += 1 unless text.nil?

  begin
    block.()
  ensure
    self.indentation -= 1 unless text.nil?
  end
end

#newlineObject



259
260
261
# File 'lib/test_bench/bootstrap.rb', line 259

def newline
  write('')
end

#raw_write(text, device = nil) ⇒ Object



294
295
296
297
298
# File 'lib/test_bench/bootstrap.rb', line 294

def raw_write(text, device=nil)
  device ||= self.device

  device.write(text)
end

#write(text, device: nil, sgr_code: nil, sgr_codes: nil, tab_indent: nil) ⇒ Object



198
199
200
# File 'lib/test_bench/bootstrap.rb', line 198

def write(text, device: nil, sgr_code: nil, sgr_codes: nil, tab_indent: nil)
  indent(text, device: device, sgr_code: sgr_code, sgr_codes: sgr_codes, tab_indent: tab_indent)
end