class Switch::Json2Csv

Public Class Methods

new(dir) click to toggle source
# File lib/switch/json2csv.rb, line 3
def initialize(dir)
  @dir = dir
end

Public Instance Methods

convert(csv_file) click to toggle source
# File lib/switch/json2csv.rb, line 7
def convert(csv_file)
  files = dir_files.select{|f| File.extname(f) == '.json'}
  columns = columns_for_json(files)

  keys = get_keys_from(columns)
  columns = remove_missing_translations(keys, columns)
  columns = move_english_as_first_column(columns)

  rows = columns_to_rows(keys, columns)
  rows = add_order_column(rows)
  add_header(rows, columns)

  Switch.logger.info "Writing local file to #{csv_file}"
  write_file(rows, csv_file)

  Switch.logger.info "Successfully converted #{files.count}. File #{csv_file}"
  csv_file
end

Private Instance Methods

add_header(rows, columns) click to toggle source
# File lib/switch/json2csv.rb, line 86
def add_header(rows, columns)
  rows.unshift (columns.map { |l| l[:name] } + ["keys", "order"])
end
add_order_column(rows) click to toggle source
# File lib/switch/json2csv.rb, line 80
def add_order_column(rows)
  rows.each_with_index do |row, i|
    row.push(i + 1)
  end
end
column_for_json(file_path) click to toggle source
# File lib/switch/json2csv.rb, line 39
def column_for_json(file_path)
  data = JSON.parse(open(file_path).read)
  data = data.flatten_with_path
  data
end
columns_for_json(files) click to toggle source
# File lib/switch/json2csv.rb, line 27
def columns_for_json(files)
  columns = []

  files.each do |file_path|
    Switch.logger.info "Generating column for json file #{file_path}"
    language = File.basename(file_path, '.json')
    columns.push name: language, data: column_for_json(file_path)
  end

  columns
end
columns_to_rows(keys, columns) click to toggle source
# File lib/switch/json2csv.rb, line 72
def columns_to_rows(keys, columns)
  rows = keys.map do |key|
    row = columns.map {|lang| lang[:data][key] }
    row.push(key)
    row
  end
end
dir_files() click to toggle source
# File lib/switch/json2csv.rb, line 98
def dir_files
  dir = @dir
  unless dir.match(/\*\z/)
    dir += '/' unless dir.match(/\/\z/)
    dir += '*'
  end

  Dir[dir]
end
get_keys_from(columns) click to toggle source
# File lib/switch/json2csv.rb, line 45
def get_keys_from(columns)
  keys = []
  columns.each do |language|
    keys |= language[:data].keys
  end

  keys
end
move_english_as_first_column(columns) click to toggle source
# File lib/switch/json2csv.rb, line 68
def move_english_as_first_column(columns)
  columns.unshift columns.delete_at(columns.index { |lang| lang[:name] == 'en' })
end
remove_missing_translations(keys, columns) click to toggle source
# File lib/switch/json2csv.rb, line 54
def remove_missing_translations(keys, columns)
  columns = columns.dup
  keys.each do |key|
    columns.each do |lang|
      # e.g. 'CN_', 'ES_', etc
      pattern = Regexp.new('\A' + lang[:name].upcase + '_')
      if lang[:data][key] && lang[:data][key].match(pattern)
        lang[:data][key] = nil
      end
    end
  end
  columns
end
write_file(rows, csv_file) click to toggle source
# File lib/switch/json2csv.rb, line 90
def write_file(rows, csv_file)
  CSV.open(csv_file, "wb") do |csv|
    rows.each do |row|
      csv << row
    end
  end
end