class DLDInternet::Formatters::Basic

Basic formatter

Attributes

columns[R]
format[R]
is_a_hash[R]
object[R]
options[R]
title[R]
widths[R]

Public Class Methods

new(obj, format, options) click to toggle source
# File lib/dldinternet/formatters/basic.rb, line 21
def initialize(obj, format, options)
  @options = options
  @object = obj
  @format = format
  @title  = options[:title] || nil
  @is_a_hash = @object.is_a?(Hash)
  @columns = options[:columns] || nil
  if @columns
    @columns = Hashie::Mash.new(Hash[@columns.split(/\s*,\s*/).map{ |c| [c, nil]}])
    @columns.dup.map{ |h,v|
      submap!(h, v)
    }
    @object = columnize_item(@object)
  end
  # unless @columns.nil?
  #   @object = columnize_item(@object)
  # end
end

Public Instance Methods

format_it(item=nil) click to toggle source
# File lib/dldinternet/formatters/basic.rb, line 64
def format_it(item=nil)
  item ||=
      if @is_a_hash
        if @columns.nil?
          object
        else
          hsh = {}
          object.each do |key,val|
            hsh[key] = val  if @columns.keys.include?(key)
          end
          hsh
        end
      else
        object
      end

  format_item item
end
header_it(item=nil) click to toggle source
# File lib/dldinternet/formatters/basic.rb, line 40
def header_it(item=nil)
  item ||=
      if @is_a_hash
        if @columns.nil?
          object.keys
        else
          @columns.keys
        end
      else
        object.to_s
      end
  item = if item.is_a?(Hash)
    if @columns.nil?
      item.keys
    else
      @columns.keys
    end
  else
    item
  end

  format_item item, true
end
table_widths() click to toggle source

:reek: DuplicateMethodCall {enabled: false}

# File lib/dldinternet/formatters/basic.rb, line 104
def table_widths
  if object.is_a?(Array) && object.size > 0 && object[0].is_a?(Hash)
    tws = nil
    object.each do |obj|
      fmt = self.class.new(obj, format, options)
      tws ||= fmt.widths
      fmt.widths.each { |c,w|
        if tws[c] < w
          tws[c] = w
        end
      }
    end
    @widths = tws
  else
    widths
  end
end
widths=(w) click to toggle source

:reek: DuplicateMethodCall {enabled: false}

# File lib/dldinternet/formatters/basic.rb, line 99
def widths=(w)
  @widths = w
end

Private Instance Methods

column(text, options = {}) click to toggle source
# File lib/dldinternet/formatters/basic.rb, line 314
def column(text, options = {})
  text
end
columnize_item(item) click to toggle source
# File lib/dldinternet/formatters/basic.rb, line 249
def columnize_item(item)
  return item if @columns.nil?
  if item.is_a?(Array)
    itm = item.map { |obj|
      columnize_item(obj)
    }
  else
    itm = {} # ::Hashie::Mash.new
    @columns.map {|k, _|
      itm[k] = item[k]
    }
  end
  itm
end
format_item(item, header=false) click to toggle source
# File lib/dldinternet/formatters/basic.rb, line 124
def format_item(item, header=false)
  fmt = format.to_s.downcase
  # if /json|yaml|csv/.match?(fmt)
  #   item = if @columns.nil?
           #   item
           # else
  item = object_item(item, header)
  case fmt
  when 'json'
    JSON.pretty_generate(item)
  when 'yaml'
    item.to_yaml
  when 'csv'
    columns = if @columns.nil?
                if item.is_a?(Array)
                  if item[0].is_a?(Array)
                    # [2017-10-06 Christo] Assume first row is headings?
                    item[0] # raise StandardError, "Cannot find column headings"
                  elsif item[0].is_a?(Hash)
                    item[0].keys
                  else
                    # [2017-10-06 Christo] Assume first row is headings?
                    item
                  end
                elsif item.is_a?(Hash)
                  item.keys
                else
                  item
                end
              else
                @columns.keys.map{ |k| subkeys(k) }
              end
    nitm = if item.is_a?(Array)
            item.map { |itm|
              if itm.is_a?(Array)
                itm
              elsif itm.is_a?(Hash)
                itm.values.map{|v| v.nil? ? '' : v}
              else
                [itm]
              end
            }
          elsif item.is_a?(Hash)
            itm.values.map{|v| v.nil? ? '' : v}
          else
            [itm]
           end
    nitm.unshift(columns)
    header_row = true
    nitm.map! { |row|
      o = CSV::Row.new(columns,row,header_row)
      header_row = false
      o
    }
    csv = CSV::Table.new(nitm).to_csv
  when 'none'
    # columnize_item(item).to_s
    item
  else
    if item.is_a?(Array) # header ||
      if widths.is_a?(Hash)
        if @columns.nil?
          wdths = widths.map { |c,w| w }
        else
          wdths = widths.map { |c,w| w if @columns.include?(c) }.select{ |w| !w.nil? }
        end
      end
      i = -1
      nitm = item.map{ |c|
        i += 1
        w  = wdths[i]
        sprintf("%-#{w}s", c.to_s)
      }
      nitm.join(" ")
    elsif item.is_a?(Hash)
      nitm = item.map do |key, val|
        if @columns.nil? || @columns.keys.include?(key) #&& @columns[key].nil?)
          sprintf("%-#{widths[key]}s", subcolumn(key, val))
          # sprintf("%-#{widths[key]}s", val.to_s)
        # elsif !key.index('.').nil?
        #   sprintf("%-#{widths[key]}s", subcolumn(key, val))
        end
      end
      nitm = nitm.select{|s| !s.nil?}.join(" ")
      nitm
    else
      item.to_s
    end
  end
end
map_item(item) click to toggle source
# File lib/dldinternet/formatters/basic.rb, line 232
def map_item(item)
  itm  = columnize_item(item)
  mitm = itm.map do |key, val|
    k, v = [subkeys(key), subcolumn(key, val)]
    v.nil? ? nil : [k, v]
    # if @columns.keys.include?(key)
    # if @columns[key].nil?
    #   [key,val]
    # else
    #   raise "What now"
    # end
    # end
  end
  mitm = mitm.select {|e| !e.nil?} #&& !e[1].nil? }
  Hash[mitm]
end
obj_width(obj) click to toggle source
# File lib/dldinternet/formatters/basic.rb, line 308
def obj_width(obj)
  obj.each do |key, val|
    set_width(key, @columns.nil? ? val : subvalues(key, val, obj))
  end
end
object_item(item, header=false) click to toggle source
# File lib/dldinternet/formatters/basic.rb, line 215
def object_item(item, header=false)
  unless @columns.nil? || header
    item = if item.is_a?(Array)
             nitm = item.map do |itm|
               map_item(itm)
             end
             nitm
           elsif item.is_a?(Hash)
             map_item(item)
           else
             item
           end
    # end
  end
  item
end
set_width(idx, val) click to toggle source
# File lib/dldinternet/formatters/basic.rb, line 302
def set_width(idx, val)
  vlen         = val.to_s.length
  wid          = @widths[idx] || 0
  @widths[idx] = vlen if wid < vlen
end
simple_value(fv) click to toggle source
# File lib/dldinternet/formatters/basic.rb, line 370
def simple_value(fv)
  if fv.is_a?(Hash)
    fv.to_hash
  elsif fv.is_a?(Array)
    fv.map{ |v| simple_value(v) }
  elsif fv.is_a?(String)
    fv
  else
    raise "Not catering for #{fv.class.name}"
  end
end
subcolumn(key, val, sub=nil) click to toggle source
# File lib/dldinternet/formatters/basic.rb, line 318
def subcolumn(key, val, sub=nil)
  if @columns.nil?
    column(val.to_s)
  else
    sub ||= @columns
    if sub[key]
      if sub[key].is_a?(Hash)
        vals = subvalues(key, val, sub)
        if vals.is_a?(Array)
          vals.flatten!
          # vals = vals[0] if vals.size == 1
        end
        column(vals.to_s)
      else
        column(val.to_s) if sub.has_key?(key)# && sub[key].nil?
      end
    else
      column(val.to_s)  if sub.has_key?(key) # && sub[key].nil?)
    end
  end
end
subkeys(key, sub=nil) click to toggle source
# File lib/dldinternet/formatters/basic.rb, line 382
def subkeys(key, sub=nil)
  sub ||= @columns
  if sub && sub[key]
    if sub[key].is_a?(Hash)
      keys = sub[key].map { |k,v|
        key+'.'+subkeys(k, v ? v : {})
      }
      if keys.is_a?(Array)
        keys = keys.flatten
      end
      keys.join('.')
    else
      [key,subkeys(key, sub[key])].flatten if sub.has_key?(key)
    end
  else
    key.to_s
  end
end
submap!(col, val, sub=nil) click to toggle source
# File lib/dldinternet/formatters/basic.rb, line 264
def submap!(col, val, sub=nil)
  sub ||= @columns
  m = col.match(/^([^.]+)\.(.*)$/)
  if m
    val = sub[m[1]]
    val ||= {} # Hashie::Mash.new
    submap!(m[2], val, val)
    sub[m[1]] = val
    sub.delete(col)
  else
    if val
      val[col] = nil
    else
      sub[col] = val
    end
  end
end
subvalues(key, val, sub) click to toggle source
# File lib/dldinternet/formatters/basic.rb, line 340
def subvalues(key, val, sub)
  sk = sub[key]
  if sk.is_a?(Hash)
    sk.keys.map {|k|
      case val.class.name
      when /Hash$/
        val[k]
      when /Array$/
        val.map {|v|
          subvalues(k, v[k], sub[key])
        }
      else
        raise "Not catering for #{val.class.name}"
      end
    }
  elsif sk.is_a?(Array)
    fsk = sk.map {|v|
      h = @columns.nil? ? v : @columns[key]
      fv = h ? h.keys.map { |k|
        subvalues(k, v[k], v)
      } : v
      fv = simple_value(fv)
      fv
    }.flatten
    fsk
  else
    val
  end
end
widths_array() click to toggle source
# File lib/dldinternet/formatters/basic.rb, line 286
def widths_array
  @object.each do |val|
    widths_hash(val)
  end
end
widths_hash(item=nil) click to toggle source
# File lib/dldinternet/formatters/basic.rb, line 292
def widths_hash(item=nil)
  item ||= @object
  item.each do |key, _|
    klen         = (@columns.nil? ? key : subkeys(key, @columns)).to_s.length
    wid          = @widths[key]
    @widths[key] = klen if !wid || wid < klen
  end
  obj_width(item)
end
widths_object() click to toggle source
# File lib/dldinternet/formatters/basic.rb, line 282
def widths_object
  set_width(0, @object)
end