Class: CsvStreamer

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/csv_streamer.rb

Constant Summary collapse

BYTE_ARRAY_UTF_BOM =
[0xff, 0xfe].collect{|byte| byte.chr}.join
UTF_16_LE_ICONV =
Iconv.new('UTF-16LE', 'UTF-8')
COLUMN_SEPARATOR =
"\t"
ROW_SEPARATOR =
"\n"

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(model_class, ids, csv_sequence = nil, per_page = 1000, filter_mappings = {}, &block) ⇒ CsvStreamer

Returns a new instance of CsvStreamer.



11
12
13
14
15
16
17
18
# File 'lib/csv_streamer.rb', line 11

def initialize(model_class,ids,csv_sequence = nil, per_page = 1000, filter_mappings = {}, &block)
  @ids = ids
  @model_class = model_class
  @csv_sequence = csv_sequence || self.class.csv_sequence(@model_class)
  @per_page = per_page
  @filter_mappings = filter_mappings
  @block = block
end

Instance Attribute Details

#csv_sequenceObject (readonly)

Returns the value of attribute csv_sequence.



10
11
12
# File 'lib/csv_streamer.rb', line 10

def csv_sequence
  @csv_sequence
end

Class Method Details

.csv_sequence(model_class) ⇒ Object



20
21
22
# File 'lib/csv_streamer.rb', line 20

def self.csv_sequence(model_class)
  model_class.properties.collect {|p| p.name} - [:id]
end

Instance Method Details

#each {|BYTE_ARRAY_UTF_BOM| ... } ⇒ Object

Yields:



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/csv_streamer.rb', line 28

def each
  elements_count = @ids.size
  page_counter = 0
  yield BYTE_ARRAY_UTF_BOM
  yield to_csv(@csv_sequence)
  while (page_counter * @per_page <= elements_count)  do
    elements = @model_class.all(:id=>@ids[page_counter*@per_page,@per_page])
    elements.each do |element|
      element = @block.call(element) unless @block.nil?
      csv = to_csv(@csv_sequence.collect do |field|
          fieldval = element.send(field)
          if @filter_mappings.has_key?(field)
            filterblock = eval "Proc.new {#{@filter_mappings[field]}}"
            fieldval = filterblock.call(fieldval)
          end
          fieldval
        end)
      yield StringIO.new(csv).read
    end
    page_counter = page_counter + 1
  end
end

#to_csv(array) ⇒ Object



24
25
26
# File 'lib/csv_streamer.rb', line 24

def to_csv(array)
  UTF_16_LE_ICONV.iconv(array.join(COLUMN_SEPARATOR) + ROW_SEPARATOR)
end