Class: Csvtool::Application::UseCases::RunExtraction

Inherits:
Object
  • Object
show all
Defined in:
lib/csvtool/application/use_cases/run_extraction.rb

Defined Under Namespace

Classes: Result

Instance Method Summary collapse

Constructor Details

#initialize(header_reader: Infrastructure::CSV::HeaderReader.new, value_streamer: Infrastructure::CSV::ValueStreamer.new, preview_builder: nil, csv_file_writer: nil) ⇒ RunExtraction

Returns a new instance of RunExtraction.



19
20
21
22
23
24
25
26
27
28
29
# File 'lib/csvtool/application/use_cases/run_extraction.rb', line 19

def initialize(
  header_reader: Infrastructure::CSV::HeaderReader.new,
  value_streamer: Infrastructure::CSV::ValueStreamer.new,
  preview_builder: nil,
  csv_file_writer: nil
)
  @header_reader = header_reader
  @value_streamer = value_streamer
  @preview_builder = preview_builder || Services::PreviewBuilder.new(value_streamer: value_streamer)
  @csv_file_writer = csv_file_writer || Infrastructure::Output::CsvFileWriter.new(value_streamer: @value_streamer)
end

Instance Method Details

#extract(session:, on_value: nil) ⇒ Object



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/csvtool/application/use_cases/run_extraction.rb', line 59

def extract(session:, on_value: nil)
  if session.output_destination.file?
    @csv_file_writer.call(
      output_path: session.output_destination.path,
      file_path: session.source.path,
      column_name: session.column_selection.name,
      col_sep: session.source.separator.value,
      skip_blanks: session.options.skip_blanks?
    )
    success(output_path: session.output_destination.path)
  else
    @value_streamer.each(
      file_path: session.source.path,
      column_name: session.column_selection.name,
      col_sep: session.source.separator.value,
      skip_blanks: session.options.skip_blanks?
    ) { |value| on_value.call(value) if on_value }
    success({})
  end
rescue CSV::MalformedCSVError
  failure(:could_not_parse_csv)
rescue Errno::EACCES, Errno::ENOENT => e
  if session.output_destination.file?
    failure(:cannot_write_output_file, path: session.output_destination.path, error_class: e.class)
  else
    failure(:cannot_read_file, path: session.source.path)
  end
end

#preview(session:) ⇒ Object



44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/csvtool/application/use_cases/run_extraction.rb', line 44

def preview(session:)
  preview_values = @preview_builder.call(
    file_path: session.source.path,
    column_name: session.column_selection.name,
    col_sep: session.source.separator.value,
    skip_blanks: session.options.skip_blanks?,
    limit: session.options.preview_limit
  )
  success(preview_values: preview_values)
rescue CSV::MalformedCSVError
  failure(:could_not_parse_csv)
rescue Errno::EACCES
  failure(:cannot_read_file, path: session.source.path)
end

#read_headers(file_path:, col_sep:) ⇒ Object



31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/csvtool/application/use_cases/run_extraction.rb', line 31

def read_headers(file_path:, col_sep:)
  return failure(:file_not_found, path: file_path) unless File.file?(file_path)

  headers = @header_reader.call(file_path: file_path, col_sep: col_sep)
  return failure(:no_headers) if headers.empty?

  success(headers: headers)
rescue CSV::MalformedCSVError
  failure(:could_not_parse_csv)
rescue Errno::EACCES
  failure(:cannot_read_file, path: file_path)
end