lib/json2xxx/core.rb in json2xxx-0.3.0 vs lib/json2xxx/core.rb in json2xxx-0.4.0

- old
+ new

@@ -1,17 +1,22 @@ -require 'spreadsheet' require 'csv' require 'tbpgr_utils' +require 'set' +require 'hashie' +class HashWrapper < ::Hashie::Mash + disable_warnings if respond_to?(:disable_warnings) +end + module Json2xxx class Core def initialize end def convert_csv(data, delimiter, force_quotes, write_header) - headers = data.first.keys + headers = get_keys(data) csv = [] CSV.generate(col_sep: delimiter, force_quotes: force_quotes) do |csv| csv << headers if write_header data.each do |hash| csv << headers.map { |column_name| @@ -20,11 +25,11 @@ end end end def convert_markdown(data) - headers = data.first.keys + headers = get_keys(data) result = [] header = '|' + headers.join('|') + '|' + "\n" + '|' + headers.map { |_header| ':--' }.join('|') + '|' data.each do |hash| columns = headers.map{ |column_name| @@ -34,11 +39,11 @@ end header + "\n" + result.to_table end def convert_backlog_wiki(data) - headers = data.first.keys + headers = get_keys(data) result = [] result << '|~' + headers.join('|') + '|h' data.each do |hash| columns = headers.map{ |column_name| @@ -47,13 +52,14 @@ result << '|~' + columns.join('|') + '|' end result.join("\n") end - def convert_excel(data) - filepath = Time.now.strftime("%Y%m%d%H%M%S") + '.xls' - headers = data.first.keys + def convert_excel(data, filepath = Time.now.strftime("%Y%m%d%H%M%S") + '.xls') + require 'spreadsheet' + headers = get_keys(data) + basename = File.basename(filepath, '.*') Spreadsheet.client_encoding = 'UTF-8' workbook = Spreadsheet::Workbook.new workbook.add_font 'MS ゴシック' worksheet = workbook.create_worksheet(name: basename) @@ -72,11 +78,11 @@ workbook.write(filepath) puts "write #{filepath}" end def convert_html(data) - headers = data.first.keys + headers = get_keys(data) result = [] result << headers data.each do |hash| columns = headers.map{ |column_name| get_json_value(hash[column_name]).gsub("\n", '') @@ -86,20 +92,32 @@ result.to_html_table end def extract(data, fields) data.map { |record| - record = Hashie::Mash.new(record) + record = HashWrapper.new(record) fields.inject({}) { |result, field| - result[field] = eval("record.#{field}") + eval_string = field[0] == "[" ? "record#{field}" : "record.#{field}" + result[field] = eval(eval_string) result } } end + def sort(data, sort_column) + data.sort_by{ |record| + record[sort_column] + } + end + + def get_keys(data) + keys = data.inject(Set.new) {|set, record| set.merge(record.keys) } + keys.to_a + end + def get_json_value(value) return '' if value.nil? - return value.to_json if value.class == Array || value.class == Hash || value.class == Hashie::Mash + return value.to_json if value.class == Array || value.class == Hash || value.class == HashWrapper return value.to_s end end end