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