Class: Csvtool::Application::UseCases::RunCsvSplit

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

Defined Under Namespace

Classes: Result

Instance Method Summary collapse

Constructor Details

#initialize(header_reader: Infrastructure::CSV::HeaderReader.new, csv_splitter: Infrastructure::CSV::CsvSplitter.new, csv_split_manifest_writer: Infrastructure::Output::CsvSplitManifestWriter.new) ⇒ RunCsvSplit

Returns a new instance of RunCsvSplit.



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

def initialize(
  header_reader: Infrastructure::CSV::HeaderReader.new,
  csv_splitter: Infrastructure::CSV::CsvSplitter.new,
  csv_split_manifest_writer: Infrastructure::Output::CsvSplitManifestWriter.new
)
  @header_reader = header_reader
  @csv_splitter = csv_splitter
  @csv_split_manifest_writer = csv_split_manifest_writer
end

Instance Method Details

#call(session:) ⇒ Object



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/csvtool/application/use_cases/run_csv_split.rb', line 43

def call(session:)
  source = session.source
  output_directory = session.options.output_directory || File.dirname(source.path)
  file_prefix = session.options.file_prefix || File.basename(source.path, ".*")
  FileUtils.mkdir_p(output_directory)

  stats = @csv_splitter.call(
    file_path: source.path,
    col_sep: source.separator,
    headers_present: source.headers_present,
    chunk_size: session.options.chunk_size,
    output_directory: output_directory,
    file_prefix: file_prefix,
    overwrite_existing: session.options.overwrite_existing
  )
  manifest_path = maybe_write_manifest(
    session: session,
    output_directory: output_directory,
    file_prefix: file_prefix,
    stats: stats
  )
  success(stats.merge(output_directory: output_directory, file_prefix: file_prefix, manifest_path: manifest_path))
rescue Infrastructure::CSV::CsvSplitter::OutputFileExistsError => e
  failure(:output_file_exists, path: e.path)
rescue CSV::MalformedCSVError
  failure(:could_not_parse_csv)
rescue Errno::EACCES, Errno::ENOENT => e
  failure(:cannot_write_output_file, path: output_directory, error_class: e.class)
end

#read_headers(file_path:, col_sep:, headers_present:) ⇒ Object



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

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

  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