Class: Darlingtonia::Importer

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Defined in:
lib/darlingtonia/importer.rb

Overview

The chief entry point for bulk import of records. ‘Importer` accepts a Parser on initialization and iterates through its Parser#records, importing each using a given RecordImporter.

Examples:

Importing in bulk from a CSV file

parser = Darlingtonia::Parser.for(file: File.new('path/to/import.csv'))

Darlingtonia::Importer.new(parser: parser).import if parser.validate

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(parser:, record_importer: RecordImporter.new, info_stream: Darlingtonia.config.default_info_stream, error_stream: Darlingtonia.config.default_error_stream) ⇒ Importer

Returns a new instance of Importer.

Parameters:

  • parser (Parser)

    The parser to use as the source for import records.

  • record_importer (RecordImporter) (defaults to: RecordImporter.new)

    An object to handle import of each record



34
35
36
37
38
39
# File 'lib/darlingtonia/importer.rb', line 34

def initialize(parser:, record_importer: RecordImporter.new, info_stream: Darlingtonia.config.default_info_stream, error_stream: Darlingtonia.config.default_error_stream)
  self.parser          = parser
  self.record_importer = record_importer
  @info_stream = info_stream
  @error_stream = error_stream
end

Instance Attribute Details

#parserParser

Returns:



22
23
24
# File 'lib/darlingtonia/importer.rb', line 22

def parser
  @parser
end

#record_importerRecordImporter

Returns:



22
# File 'lib/darlingtonia/importer.rb', line 22

attr_accessor :parser, :record_importer

Instance Method Details

#importvoid

This method returns an undefined value.

Import each record in #records.



51
52
53
54
55
56
57
58
59
# File 'lib/darlingtonia/importer.rb', line 51

def import
  no_records_message && return unless records.count.positive?
  start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
  @info_stream << "event: start_import, batch_id: #{record_importer.batch_id}, expecting to import #{records.count} records."
  records.each { |record| record_importer.import(record: record) }
  end_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
  elapsed_time = end_time - start_time
  @info_stream << "event: finish_import, batch_id: #{record_importer.batch_id}, successful_record_count: #{record_importer.success_count}, failed_record_count: #{record_importer.failure_count}, elapsed_time: #{elapsed_time}, elapsed_time_per_record: #{elapsed_time / records.count}"
end

#no_records_messageObject

Do not attempt to run an import if there are no records. Instead, just write to the log.



42
43
44
45
# File 'lib/darlingtonia/importer.rb', line 42

def no_records_message
  @info_stream << "event: empty_import, batch_id: #{record_importer.batch_id}"
  @error_stream << "event: empty_import, batch_id: #{record_importer.batch_id}"
end

#recordsObject

See Also:



27
# File 'lib/darlingtonia/importer.rb', line 27

def_delegator :parser, :records, :records