Module: CovLoupe::Formatters

Defined in:
lib/cov_loupe/formatters/formatters.rb,
lib/cov_loupe/formatters/source_formatter.rb

Defined Under Namespace

Classes: SourceFormatter

Constant Summary collapse

FORMATTERS =

Registry of format lambdas. Each lambda receives the object to format and an ascii_mode keyword.

{
  table:         ->(obj, **) { obj },
  json:          ->(obj, ascii_mode:) {
    require 'json'
    ascii_mode ? JSON.generate(obj, ascii_only: true) : obj.to_json
  },
  pretty_json:   ->(obj, ascii_mode:) {
    require 'json'
    ascii_mode ? JSON.pretty_generate(obj, ascii_only: true) : JSON.pretty_generate(obj)
  },
  yaml:          ->(obj, ascii_mode:) {
    require 'yaml'
    yaml = obj.to_yaml
    ascii_mode ? OutputChars.convert(yaml, :ascii) : yaml
  },
  amazing_print: ->(obj, ascii_mode:) {
    require 'amazing_print'
    result = obj.ai
    ascii_mode ? OutputChars.convert(result, :ascii) : result
  },
  inspect:       ->(obj, ascii_mode:) {
    result = obj.inspect
    ascii_mode ? OutputChars.convert(result, :ascii) : result
  },
  puts:          ->(obj, ascii_mode:) {
    sio = StringIO.new
    sio.puts(obj)
    result = sio.string
    ascii_mode ? OutputChars.convert(result, :ascii) : result
  },
  pretty_print:  ->(obj, ascii_mode:) {
    require 'pp'
    sio = StringIO.new
    PP.pp(obj, sio)
    result = sio.string
    ascii_mode ? OutputChars.convert(result, :ascii) : result
  },
}.freeze

Class Method Summary collapse

Class Method Details

.format(obj, format, output_chars: :default) ⇒ String

Formats an object using the specified format.

Parameters:

  • obj (Object)

    The object to format

  • format (Symbol)

    Format type (:table, :json, :pretty_json, :yaml, :amazing_print, :inspect, :puts, :pretty_print)

  • output_chars (Symbol) (defaults to: :default)

    Output character mode (:default, :fancy, :ascii)

Returns:

  • (String)

    Formatted output



65
66
67
68
69
70
71
72
73
74
# File 'lib/cov_loupe/formatters/formatters.rb', line 65

def self.format(obj, format, output_chars: :default)
  formatter = FORMATTERS.fetch(format) { raise ArgumentError, "Unknown format: #{format}" }

  ascii_mode = OutputChars.ascii_mode?(output_chars)
  formatter.call(obj, ascii_mode: ascii_mode)
rescue LoadError => e
  gem_name = e.message[/-- (\S+)/, 1] || 'required gem'
  raise LoadError, "The #{format} format requires the '#{gem_name}' gem. " \
                   "Install it with: gem install #{gem_name}"
end