class ActiveAdminImport::Model

Attributes

attributes[R]
to_hash[R]

Public Class Methods

new(args = {}) click to toggle source
# File lib/active_admin_import/model.rb, line 44
def initialize(args = {})
  @new_record = true
  @attributes = {}
  assign_attributes(default_attributes.merge(args), true)
end

Protected Class Methods

define_get_method(attr_name) click to toggle source
# File lib/active_admin_import/model.rb, line 190
def define_get_method(attr_name)
  return if method_defined? "#{attr_name}="
  define_method("#{attr_name}=") { |new_value| @attributes[attr_name] = new_value }
end
define_set_method(attr_name) click to toggle source
# File lib/active_admin_import/model.rb, line 185
def define_set_method(attr_name)
  return if method_defined? attr_name
  define_method(attr_name) { attributes[attr_name] }
end

Public Instance Methods

allow_archive?() click to toggle source
# File lib/active_admin_import/model.rb, line 72
def allow_archive?
  attributes[:allow_archive].present?
end
archive?() click to toggle source
# File lib/active_admin_import/model.rb, line 88
def archive?
  file_type == CONST::ZIP_TYPE
end
assign_attributes(args = {}, new_record = false) click to toggle source
# File lib/active_admin_import/model.rb, line 50
def assign_attributes(args = {}, new_record = false)
  @attributes.merge!(args)
  @new_record = new_record
  args.keys.each do |key|
    define_methods_for(key.to_sym)
  end if args.is_a?(Hash)
end
default_attributes() click to toggle source
# File lib/active_admin_import/model.rb, line 62
def default_attributes
  {
    allow_archive: true,
    csv_headers: [],
    file: nil,
    force_encoding: 'UTF-8',
    hint: ''
  }
end
force_encoding?() click to toggle source
# File lib/active_admin_import/model.rb, line 80
def force_encoding?
  attributes[:force_encoding].present?
end
new_record?() click to toggle source
# File lib/active_admin_import/model.rb, line 76
def new_record?
  @new_record.present?
end
persisted?() click to toggle source
# File lib/active_admin_import/model.rb, line 84
def persisted?
  false
end
read_attribute_for_validation(key) click to toggle source
# File lib/active_admin_import/model.rb, line 58
def read_attribute_for_validation(key)
  @attributes[key.to_sym]
end

Protected Instance Methods

content_encode(data) click to toggle source
# File lib/active_admin_import/model.rb, line 175
def content_encode(data)
  encoding_name = if detect_encoding?
                    dynamic_encoding(data)
                  else
                    force_encoding.to_s
                  end
  data.force_encoding(encoding_name)
end
correct_content_type() click to toggle source
# File lib/active_admin_import/model.rb, line 126
def correct_content_type
  return if file.blank? ||
      file.is_a?(Tempfile) ||
      (csv_allowed_types.include? file_type)
  errors.add(:file, I18n.t('active_admin_import.file_format_error'))
end
csv_allowed_types() click to toggle source
# File lib/active_admin_import/model.rb, line 122
def csv_allowed_types
  CONST::CSV_TYPES
end
define_methods_for(attr_name) click to toggle source
# File lib/active_admin_import/model.rb, line 146
def define_methods_for(attr_name)
  # generate methods for instance object by attributes
  singleton_class.class_eval do
    define_set_method(attr_name)
    define_get_method(attr_name)
  end
end
detect_encoding?() click to toggle source
# File lib/active_admin_import/model.rb, line 167
def detect_encoding?
  force_encoding == :auto
end
dynamic_encoding(data) click to toggle source
# File lib/active_admin_import/model.rb, line 171
def dynamic_encoding(data)
  CharDet.detect(data)['encoding']
end
encode(data) click to toggle source
# File lib/active_admin_import/model.rb, line 154
def encode(data)
  data = content_encode(data) if force_encoding?
  data = data.encode(
    'UTF-8',
    invalid: :replace, undef: :replace, universal_newline: true
  )
  begin
    data.sub("\xEF\xBB\xBF", '') # bom
  rescue StandardError => _
    data
  end
end
encode_file() click to toggle source
# File lib/active_admin_import/model.rb, line 104
def encode_file
  data = File.read(file_path)
  return if data.empty?

  File.open(file_path, 'w') do |f|
    f.write(encode(data))
  end
end
file_contents_present() click to toggle source
# File lib/active_admin_import/model.rb, line 133
def file_contents_present
  return unless File.zero?(file_path)
  errors.add(:file, I18n.t('active_admin_import.file_empty_error'))
end
file_path() click to toggle source
# File lib/active_admin_import/model.rb, line 96
def file_path
  if file.is_a? ActionDispatch::Http::UploadedFile
    file.tempfile.path
  else
    file.path
  end
end
file_type() click to toggle source
# File lib/active_admin_import/model.rb, line 138
def file_type
  if file.is_a? ActionDispatch::Http::UploadedFile
    file.content_type.chomp
  else
    ''
  end
end
unzip_file() click to toggle source
# File lib/active_admin_import/model.rb, line 113
def unzip_file
  Zip::File.open(file_path) do |zip_file|
    self.file = Tempfile.new(CONST::TMP_FILE, binmode: true)
    data = zip_file.entries.select(&:file?).first.get_input_stream.read
    file << data
    file.close
  end
end