lib/squib/import/data_frame.rb in squib-0.18.0 vs lib/squib/import/data_frame.rb in squib-0.19.0a
- old
+ new
@@ -1,108 +1,108 @@
-# encoding: UTF-8
-
-require 'json'
-require 'forwardable'
-
-module Squib
- class DataFrame
- include Enumerable
-
- def initialize(hash = {}, def_columns = true)
- @hash = hash
- columns.each { |col| def_column(col) } if def_columns
- end
-
- def each(&block)
- @hash.each(&block)
- end
-
- def [](i)
- @hash[i]
- end
-
- def []=(col, v)
- @hash[col] = v
- def_column(col)
- return v
- end
-
- def columns
- @hash.keys
- end
-
- def ncolumns
- @hash.keys.size
- end
-
- def col?(col)
- @hash.key? col
- end
-
- def row(i)
- @hash.inject(Hash.new) { |ret, (name, arr)| ret[name] = arr[i]; ret }
- end
-
- def nrows
- @hash.inject(0) { |max, (_n, col)| col.size > max ? col.size : max }
- end
-
- def to_json
- @hash.to_json
- end
-
- def to_pretty_json
- JSON.pretty_generate(@hash)
- end
-
- def to_h
- @hash
- end
-
- def to_pretty_text
- max_col = columns.inject(0) { |max, c | c.length > max ? c.length : max }
- top = " ╭#{'-' * 36}╮\n"
- bottom = " ╰#{'-' * 36}╯\n"
- str = ''
- 0.upto(nrows - 1) do | i |
- str += (' ' * max_col) + top
- row(i).each do |col, data|
- str += "#{col.rjust(max_col)} #{wrap_n_pad(data, max_col)}"
- end
- str += (' ' * max_col) + bottom
- end
- return str
- end
-
- private
-
- def snake_case(str)
- str.to_s.
- strip.
- gsub(/\s+/,'_').
- gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
- gsub(/([a-z]+)([A-Z])/,'\1_\2').
- downcase.
- to_sym
- end
-
- def wrap_n_pad(str, max_col)
- new_str = str.to_s + ' ' # handle nil & empty strings
- new_str = new_str.
- scan(/.{1,34}/). # break down
- map { |s| (' ' * max_col) + " | " + s.ljust(34) }.
- join(" |\n").
- lstrip # initially no whitespace next to key
- return new_str + " |\n"
- end
-
- def def_column(col)
- raise "Column #{col} - does not exist" unless @hash.key? col
- method_name = snake_case(col)
- return if self.class.method_defined?(method_name) #warn people? or skip?
- define_singleton_method method_name do
- @hash[col]
- end
- end
-
- end
-end
+# encoding: UTF-8
+
+require 'json'
+require 'forwardable'
+
+module Squib
+ class DataFrame
+ include Enumerable
+
+ def initialize(hash = {}, def_columns = true)
+ @hash = hash
+ columns.each { |col| def_column(col) } if def_columns
+ end
+
+ def each(&block)
+ @hash.each(&block)
+ end
+
+ def [](i)
+ @hash[i]
+ end
+
+ def []=(col, v)
+ @hash[col] = v
+ def_column(col)
+ return v
+ end
+
+ def columns
+ @hash.keys
+ end
+
+ def ncolumns
+ @hash.keys.size
+ end
+
+ def col?(col)
+ @hash.key? col
+ end
+
+ def row(i)
+ @hash.inject(Hash.new) { |ret, (name, arr)| ret[name] = arr[i]; ret }
+ end
+
+ def nrows
+ @hash.inject(0) { |max, (_n, col)| col.size > max ? col.size : max }
+ end
+
+ def to_json
+ @hash.to_json
+ end
+
+ def to_pretty_json
+ JSON.pretty_generate(@hash)
+ end
+
+ def to_h
+ @hash
+ end
+
+ def to_pretty_text
+ max_col = columns.inject(0) { |max, c | c.length > max ? c.length : max }
+ top = " ╭#{'-' * 36}╮\n"
+ bottom = " ╰#{'-' * 36}╯\n"
+ str = ''
+ 0.upto(nrows - 1) do | i |
+ str += (' ' * max_col) + top
+ row(i).each do |col, data|
+ str += "#{col.rjust(max_col)} #{wrap_n_pad(data, max_col)}"
+ end
+ str += (' ' * max_col) + bottom
+ end
+ return str
+ end
+
+ private
+
+ def snake_case(str)
+ str.to_s.
+ strip.
+ gsub(/\s+/,'_').
+ gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
+ gsub(/([a-z]+)([A-Z])/,'\1_\2').
+ downcase.
+ to_sym
+ end
+
+ def wrap_n_pad(str, max_col)
+ new_str = str.to_s + ' ' # handle nil & empty strings
+ new_str = new_str.
+ scan(/.{1,34}/). # break down
+ map { |s| (' ' * max_col) + " | " + s.ljust(34) }.
+ join(" |\n").
+ lstrip # initially no whitespace next to key
+ return new_str + " |\n"
+ end
+
+ def def_column(col)
+ raise "Column #{col} - does not exist" unless @hash.key? col
+ method_name = snake_case(col)
+ return if self.class.method_defined?(method_name) #warn people? or skip?
+ define_singleton_method method_name do
+ @hash[col]
+ end
+ end
+
+ end
+end