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