class TableImporter::CopyAndPaste

Attributes

remove_nil_values[RW]

Public Class Methods

new(data) click to toggle source
# File lib/table_importer/copy_and_paste.rb, line 7
def initialize(data)
  @data = assign_data(data[:content])
  @column_separator, @record_separator = assign_separators(data[:column_separator], data[:record_separator])
  @headers, @headers_present = assign_headers(data[:headers_present])
  @mapping = data[:user_headers]
  @compulsory_headers = data[:compulsory_headers]
  @delete_empty_columns = @data.length < 50000
  @remove_nil_values = data[:remove_nil_values] == true
end

Public Instance Methods

assign_data(content) click to toggle source
# File lib/table_importer/copy_and_paste.rb, line 17
def assign_data(content)
  raise TableImporter::EmptyFileImportError.new if content.blank? || content[0..100].gsub(/[^A-Za-z0-9]/, '').blank?
  content.gsub!(/\r\n|\r/, "\n")
  return content
end
assign_headers(headers_present) click to toggle source
# File lib/table_importer/copy_and_paste.rb, line 46
def assign_headers(headers_present)
  headers = headers_present ? get_first_line : get_headers
  return headers, headers_present
end
assign_separators(col_sep, rec_sep) click to toggle source
# File lib/table_importer/copy_and_paste.rb, line 23
def assign_separators(col_sep, rec_sep)
  col_sep = SEPARATORS[col_sep.to_sym] if !col_sep.nil?
  rec_sep = SEPARATORS[rec_sep.to_sym] if !rec_sep.nil?
  col_sep, rec_sep = data_conforms_pattern(col_sep, rec_sep)
end
convert_headers(provided_headers, mapped_headers, headers_present) click to toggle source
# File lib/table_importer/copy_and_paste.rb, line 102
def convert_headers(provided_headers, mapped_headers, headers_present)
  new_headers = headers_present ? provided_headers : default_headers
  new_headers = default_headers(new_headers.count)
  mapped_headers.each do |key, value|
    if value.to_i.to_s == value
      new_headers[value.to_i] = key.to_sym
    end
  end
  new_headers
end
data_conforms_pattern(col_sep, rec_sep) click to toggle source
# File lib/table_importer/copy_and_paste.rb, line 29
def data_conforms_pattern(col_sep, rec_sep)
  # Check to see if data is of bcc style
  first_item = @data.split("\n")[1]
  if first_item.present? && first_item.match(/\S@\S/) && !first_item.match(/;|,|\s/)
    rec_sep ||= "\n"
    col_sep ||= " "
  end
  first_item = @data.split(",").first
  if first_item.present? && first_item.match(/\S@\S/)
    if first_item.match(/<(\S+@\S+)/)
      rec_sep ||= ">, "
      col_sep ||= " <"
    end
  end
  return col_sep, rec_sep
end
get_chunks(chunk_size) click to toggle source
# File lib/table_importer/copy_and_paste.rb, line 96
def get_chunks(chunk_size)
  @headers = convert_headers(get_first_line, @mapping.present? ? @mapping : @headers, @headers_present)
  lines = get_lines(0, -1).in_groups_of(chunk_size, false)
  clean_chunks(lines, @compulsory_headers)
end
get_column_separator(first_line = @data) click to toggle source
# File lib/table_importer/copy_and_paste.rb, line 113
def get_column_separator(first_line = @data)
  return @column_separator if !@column_separator.nil? && @column_separator.length > 0
  separators = get_sep_count(first_line)
  separators.reject!{ |sep| sep.keys[0] == @record_separator} if @record_separator != nil
  @column_separator = sort_separators(separators)
end
get_first_line() click to toggle source
# File lib/table_importer/copy_and_paste.rb, line 51
def get_first_line
  @data.split(get_record_separator).first.split(get_column_separator).map(&:to_sym)
end
get_headers() click to toggle source
# File lib/table_importer/copy_and_paste.rb, line 59
def get_headers
  return @headers if @headers.present?
  default_headers(100)
end
get_lines(start_point, number_of_lines) click to toggle source
# File lib/table_importer/copy_and_paste.rb, line 77
def get_lines(start_point, number_of_lines)
  number_of_lines = number_of_lines - 1 if number_of_lines != -1 # -1 means return all lines.
  mapped_lines = []
  get_column_separator
  @data.split(get_record_separator).each do |line|
    split_line = line.split(@column_separator)
    split_line = remove_whitespace(split_line)
    mapped_lines << Hash[@headers.zip split_line]
  end
  mapped_lines[start_point..(start_point+number_of_lines)]
end
get_preview_lines(start_point = @headers_present ? 1 : 0, end_point = 10) click to toggle source
# File lib/table_importer/copy_and_paste.rb, line 64
def get_preview_lines(start_point = @headers_present ? 1 : 0, end_point = 10)
  begin
    lines = clean_chunks([get_lines(start_point, end_point)], {}, @delete_empty_columns)[0][:lines]
    if lines.first.nil?
      get_preview_lines(start_point+10, end_point+10)
    else
      lines[0..7]
    end
  rescue StandardError
    raise TableImporter::EmptyStringImportError.new
  end
end
get_record_separator(first_line = @data) click to toggle source
# File lib/table_importer/copy_and_paste.rb, line 120
def get_record_separator(first_line = @data)
  return @record_separator if !@record_separator.nil? && @record_separator.length > 0
  separators = get_sep_count(first_line)
  separators.reject!{ |sep| sep.keys[0] == get_column_separator}
  @record_separator = sort_separators(separators)
end
get_type() click to toggle source
# File lib/table_importer/copy_and_paste.rb, line 55
def get_type
  "copy_and_paste"
end
remove_whitespace(column) click to toggle source
# File lib/table_importer/copy_and_paste.rb, line 89
def remove_whitespace(column)
  column.each do |column_item|
    column_item.strip!
  end
  column
end