class MultiFileProcessor

MultiFileProcessor processes files in a folder moving to the various states inprogress, done or failed.

Constants

DEFAULT_DONE_EXT
DEFAULT_FAILED_EXT
DEFAULT_INPROGRESS_EXT

Attributes

file_pattern[R]
options[R]

Public Class Methods

new(file_pattern, options = {}) click to toggle source
# File lib/multi-file-processor.rb, line 16
def initialize(file_pattern, options = {})
  @file_pattern = file_pattern
  @options = options
end

Public Instance Methods

done_ext() click to toggle source
# File lib/multi-file-processor.rb, line 69
def done_ext
  options[:done_ext] || DEFAULT_DONE_EXT
end
each() { |inprogress_file| ... } click to toggle source
# File lib/multi-file-processor.rb, line 21
def each
  while (inprogress_file = next_inprogress_file)
    begin
      yield inprogress_file
      move_inprogress_file_to_done(inprogress_file)
    rescue FailedException
      move_inprogress_file_to_failed(inprogress_file)
    end
  end
end
failed!() click to toggle source
# File lib/multi-file-processor.rb, line 61
def failed!
  raise FailedException, 'file processing failed'
end
failed_ext() click to toggle source
# File lib/multi-file-processor.rb, line 73
def failed_ext
  options[:failed_ext] || DEFAULT_FAILED_EXT
end
inprogress_ext() click to toggle source
# File lib/multi-file-processor.rb, line 65
def inprogress_ext
  options[:inprogress_ext] || DEFAULT_INPROGRESS_EXT
end
move_inprogress_file_to_done(inprogress_file) click to toggle source

rubocop:enable Lint/SuppressedException

# File lib/multi-file-processor.rb, line 45
def move_inprogress_file_to_done(inprogress_file)
  move_inprogress_file_to_ext(inprogress_file, done_ext)
end
move_inprogress_file_to_failed(inprogress_file) click to toggle source
# File lib/multi-file-processor.rb, line 49
def move_inprogress_file_to_failed(inprogress_file)
  move_inprogress_file_to_ext(inprogress_file, failed_ext)
end
next_inprogress_file() click to toggle source

rubocop:disable Lint/SuppressedException

# File lib/multi-file-processor.rb, line 33
def next_inprogress_file
  while (file = next_file)
    begin
      inprogress_file = "#{file}.#{inprogress_ext}"
      FileUtils.mv(file, inprogress_file)
      return inprogress_file
    rescue Errno::ENOENT
    end
  end
end
reset_files!() click to toggle source
# File lib/multi-file-processor.rb, line 53
def reset_files!
  ext_reg = Regexp.new("\\.(#{inprogress_ext}|#{done_ext}|#{failed_ext})$")
  Dir.glob("#{file_pattern}.{#{inprogress_ext},#{done_ext},#{failed_ext}}").each do |file|
    original_file = file.sub(ext_reg, '')
    FileUtils.mv(file, original_file)
  end
end

Protected Instance Methods

next_file() click to toggle source
# File lib/multi-file-processor.rb, line 79
def next_file
  files = all_files
  return files.sample if options[:sample]

  files.sort! if options[:sort]
  files = files.sort_by { |file| File.mtime(file) } if options[:sort_by_mtime]
  files.first
end

Private Instance Methods

all_files() click to toggle source
# File lib/multi-file-processor.rb, line 90
def all_files
  Dir.glob(file_pattern)
end
move_inprogress_file_to_ext(inprogress_file, ext) click to toggle source
# File lib/multi-file-processor.rb, line 94
def move_inprogress_file_to_ext(inprogress_file, ext)
  new_file = inprogress_file.sub(/#{inprogress_ext}$/, ext)
  FileUtils.mv(inprogress_file, new_file)
end