module Babaloa

Constants

VERSION

Public Class Methods

configuration() click to toggle source
# File lib/babaloa/config.rb, line 7
def configuration
  @configuration ||= Configuration.new
end
configure() { |configuration| ... } click to toggle source
# File lib/babaloa/config.rb, line 3
def configure
  yield(configuration)
end
except_by(header, **options) click to toggle source
# File lib/babaloa.rb, line 78
def except_by(header, **options)
  except = options[:except] || configuration.define(options[:name], :except) || configuration.default[:except]
  return header unless except

  if except.is_a?(Array)
    header.reject! {|k| except.include?(k) }
  elsif is_s?(except)
    header.reject! {|k| k == except.to_sym }
  else
    raise BabaloaError, "except option must be Array, Symbol, String."
  end

  header
end
only_by(header, **options) click to toggle source
# File lib/babaloa.rb, line 63
def only_by(header, **options)
  only   = options[:only] || configuration.define(options[:name], :only) || configuration.default[:only]
  return header unless only

  if only.is_a?(Array)
    header.select! {|k| only.include?(k) }
  elsif is_s?(only)
    header.select! {|k| k == only.to_sym }
  else
    raise BabaloaError, "only option must be Array, Symbol, String."
  end

  header
end
order_by(data, header, **options) click to toggle source
# File lib/babaloa.rb, line 39
def order_by(data, header, **options)
  sort = options[:sort] || configuration.define(options[:name], :sort) || configuration.default[:sort]
  return data unless sort

  conv = proc {|h, k|
    v = h[k] || h[k.to_s] || h[k.to_sym]
    v.is_a?(String) && v =~ /^\d+$/ ? v.to_i : v
  }

  if sort.is_a?(Hash)
    k, v = sort.first
    k = header.index(k.to_sym) if data.first.is_a?(Array)
    data.sort_by! {|col| conv.(col, k) }
    data.reverse! if v == :desc
  elsif is_s?(sort)
    sort = header.index(sort.to_sym) if data.first.is_a?(Array)
    data.sort_by! {|col| conv.(col, sort) }
  else
    raise BabaloaError, "sort option must be Hash, Symbol, String."
  end

  data
end
to_csv(data, h = true, **options) click to toggle source
# File lib/babaloa.rb, line 9
def to_csv(data, h = true, **options)
  raise BabaloaError, "data must be Array" unless data.is_a?(Array)
  raise BabaloaError, "content must be Array or Hash" unless data.empty? || data.first.is_a?(Array) || data.first.is_a?(Hash)

  if h && !data.empty?
    if data.first.is_a?(Hash)
      header = data.first.keys.map(&:to_sym)
      header = only_by(header, **options)
      header = except_by(header, **options)
    else
      header = data.first.map(&:to_sym)
      data = data.drop(1)
    end

    data = order_by(data, header, **options)
  end

  CSV.generate do |csv|
    csv << transrate_by(header.dup, **options) if h && header
    data.each{|res|
      if res.is_a?(Hash)
        raise BabaloaError, "Header required if content is Hash" unless h
        csv << header.map {|k| res[k] || res[k.to_s] }
      else
        csv << res
      end
    }
  end
end
transrate_by(header, **options) click to toggle source
# File lib/babaloa.rb, line 93
def transrate_by(header, **options)
  t = options[:t] || configuration.define(options[:name], :t) || configuration.default[:t]
  return header unless t

  if t.is_a?(Hash)
    header.map! {|k| t[k] || t[k.to_s] || k }.compact!
  else
    raise BabaloaError, "t option must be Hash"
  end

  header
end

Private Class Methods

is_s?(val) click to toggle source
# File lib/babaloa.rb, line 108
def is_s?(val)
  val.is_a?(Symbol) || val.is_a?(String)
end