Class: ActiveExport::Csv

Inherits:
Base
  • Object
show all
Defined in:
lib/active_export/csv.rb

Instance Attribute Summary

Attributes inherited from Base

#config, #eval_methods, #label_keys, #label_prefix, #namespace, #options, #source, #source_name

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Base

build_label_keys_and_eval_methods, #build_label_keys_and_eval_methods!, #convert, #default_scope, #initialize, #key_name, translate, #translate

Constructor Details

This class inherits a constructor from ActiveExport::Base

Class Method Details

.export(data, source, namespace, options = {}) ⇒ String

Generate Csv String

Parameters:

  • data (Array, ActiveRecord::Relation)
  • source (Symbol, String)
  • namespace (Symobl, String)
  • options (Hash) (defaults to: {})

    ({})

Options Hash (options):

  • :eval_methods (Array)
  • :label_keys (Array)
  • :label_prefix (String)
  • :csv_options (Hash) — default: see http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV.html

Returns:

  • (String)

    Csv String



19
20
21
# File 'lib/active_export/csv.rb', line 19

def self.export(data, source, namespace, options = {})
  new(source, namespace, options).export(data)
end

.export_file(data, source, namespace, filename, options = {}) ⇒ Object

Generate Csv File

Parameters:

  • data (Array, ActiveRecord::Relation)
  • source (Symbol, String)

    YAML File alias name (see ActiveExport::Configuration#sources)

  • namespace (Symbol, String)

    YAML File namespace

  • filename (String, Filepath)

    Csv File name

  • options (Hash) (defaults to: {})

    ({}) (see .export)



29
30
31
# File 'lib/active_export/csv.rb', line 29

def self.export_file(data, source, namespace, filename, options = {})
  new(source, namespace, options).export_file(data, filename)
end

Instance Method Details

#csv_optionsObject (protected)



81
82
83
# File 'lib/active_export/csv.rb', line 81

def csv_options
  self.config.default_csv_options.merge( self.options[:csv_options] || {} )
end

#export(data) ⇒ Object



33
34
35
36
37
38
# File 'lib/active_export/csv.rb', line 33

def export(data)
  CSV.generate(csv_options) do |csv|
    csv << generate_header if header?
    export_data(data, csv)
  end
end

#export_data(data, exporter) ⇒ Object

Export data to exporter

Parameters:

  • data (Array, ActiveRecord::Relation)

    Export target data

  • exporter (CSV, Array, String)

    CSV class or Array class, or String class (should support ‘<<’ accessor)



53
54
55
56
57
58
59
60
61
# File 'lib/active_export/csv.rb', line 53

def export_data(data, exporter)
  if data.respond_to?(:find_in_batches) && data.respond_to?(:orders) && data.orders.blank? && data.respond_to?(:taken) && data.taken.blank?
    data.find_in_batches(find_in_batches_options) do |group|
      group.each{|f| exporter << generate_value(f) }
    end
  else
    data.each{|f| exporter << generate_value(f) }
  end
end

#export_file(data, filename) ⇒ Object



40
41
42
43
44
45
46
47
48
# File 'lib/active_export/csv.rb', line 40

def export_file(data, filename)
  File.atomic_write(filename) do |file|
    CSV.open(file, "wb", csv_options) do |csv|
      csv << generate_header if header?
      export_data(data, csv)
    end
  end
  filename
end

#find_in_batches_optionsObject (protected)



77
78
79
# File 'lib/active_export/csv.rb', line 77

def find_in_batches_options
  self.config.default_find_in_batches_options.merge( self.options[:find_in_batches_options] || {} )
end

#generate_headerObject (protected)



64
65
66
67
68
# File 'lib/active_export/csv.rb', line 64

def generate_header
  self.label_keys.inject([]) {|result, key|
    result << translate(key_name(key))
  }
end

#generate_value(row) ⇒ Object (protected)



70
71
72
73
74
75
# File 'lib/active_export/csv.rb', line 70

def generate_value(row)
  self.eval_methods.inject([]){|result, f|
    v = row.send(:eval, f) rescue nil
    result << convert(v)
  }
end

#header?Boolean (protected)

Returns:

  • (Boolean)


85
86
87
# File 'lib/active_export/csv.rb', line 85

def header?
  { header: true }.merge(self.options)[:header]
end